[
  {
    "path": ".gitignore",
    "content": "*.userprefs\nscatterer/obj\nscatterer/bin\nscatterer/bin/Release/Assembly-CSharp-firstpass.dll\nscatterer/bin/Release/Assembly-CSharp.dll\nscatterer/bin/Release/Mono.Cecil.dll\nscatterer/bin/Release/Mono.Security.dll\nscatterer/bin/Release/mscorlib.dll\nscatterer/bin/Release/System.Core.dll\nscatterer/bin/Release/System.dll\nscatterer/bin/Release/System.Xml.dll\nscatterer/bin/Release/TDx.TDxInput.dll\nscatterer/bin/Release/TrackIRUnity.dll\nscatterer/bin/Release/UnityEngine.dll\nscatterer/Shaders/scattererShaders/Library"
  },
  {
    "path": "Readme.md",
    "content": "Scatterer\n---------------------------------------------------------------------------------\n\nAtmospheric scattering graphical effects for Kerbal Space Program.\n\nThis project contains the plugin source which is under the following license:\n\n GNU GENERAL PUBLIC LICENSE Version 3\n \nThis repo does not contain shaders for versions higher than 0.0772 and they are not necessary to compile/load the plugin. Shaders are loaded dynamically from asset bundles and can be replaced by custom shaders.\n\nCopyright (c) 2015-2022 Ghassen Lahmar"
  },
  {
    "path": "license.md",
    "content": " Copyright (c) 2015-2022 Ghassen Lahmar\n \n You may use, distribute and copy Scatterer under the terms of GNU General\n Public License version 3, which is displayed below.\n \n -------------------------------------------------------------------------\n\n                      GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n\t\t\t\t\t \n/*\n* Proland: a procedural landscape rendering library.\n* Website : http://proland.inrialpes.fr/\n* Copyright (c) 2008-2015 INRIA - LJK (CNRS - Grenoble University)\n* All rights reserved.\n* Redistribution and use in source and binary forms, with or without \n* modification, are permitted provided that the following conditions are met:\n* \n* 1. Redistributions of source code must retain the above copyright notice, \n* this list of conditions and the following disclaimer.\n* \n* 2. Redistributions in binary form must reproduce the above copyright notice, \n* this list of conditions and the following disclaimer in the documentation \n* and/or other materials provided with the distribution.\n* \n* 3. Neither the name of the copyright holder nor the names of its contributors \n* may be used to endorse or promote products derived from this software without \n* specific prior written permission.\n* \n* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \n* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \n* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n* OF THE POSSIBILITY OF SUCH DAMAGE.\n*\n*/\n/*\n* Proland is distributed under the Berkeley Software Distribution 3 Licence. \n* For any assistance, feedback and enquiries about training programs, you can check out the \n* contact page on our website : \n* http://proland.inrialpes.fr/\n*/\n/*\n* Main authors: Eric Bruneton, Antoine Begault, Guillaume Piolat.\n*/\n\n\n\n/*\n* Proland-To-Unity\n* Website: https://github.com/Scrawk/Proland-To-Unity\n*/\n/*\n* BSD 3-Clause License\n* \n* Copyright (c) 2022, Justin\n* All rights reserved.\n* \n* Redistribution and use in source and binary forms, with or without\n* modification, are permitted provided that the following conditions are met:\n* \n* 1. Redistributions of source code must retain the above copyright notice, this\n*    list of conditions and the following disclaimer.\n* \n* 2. Redistributions in binary form must reproduce the above copyright notice,\n*    this list of conditions and the following disclaimer in the documentation\n*    and/or other materials provided with the distribution.\n* \n* 3. Neither the name of the copyright holder nor the names of its\n*    contributors may be used to endorse or promote products derived from\n*    this software without specific prior written permission.\n* \n* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n\n\n/*\n* Intel Corporation - Outdoor Light Scattering Sample\n* Website:https://github.com/GameTechDev/OutdoorLightScattering\n*/\n/*\n* \n* Apache License\n*  Version 2.0, January 2004\n* \n*  http://www.apache.org/licenses/ \n* \n* TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION \n* \n* 1. Definitions.\n* \n* \"License\" shall mean the terms and conditions for use, reproduction, and \n* distribution as defined by Sections 1 through 9 of this document. \n* \n* \"Licensor\" shall mean the copyright owner or entity authorized by the copyright \n* owner that is granting the License. \n* \n* \"Legal Entity\" shall mean the union of the acting entity and all other entities \n* that control, are controlled by, or are under common control with that entity. \n* For the purposes of this definition, \"control\" means (i) the power, direct or \n* indirect, to cause the direction or management of such entity, whether by \n* contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the \n* outstanding shares, or (iii) beneficial ownership of such entity. \n* \n* \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising \n* permissions granted by this License. \n* \n* \"Source\" form shall mean the preferred form for making modifications, including \n* but not limited to software source code, documentation source, and configuration \n* files. \n* \n* \"Object\" form shall mean any form resulting from mechanical transformation or \n* translation of a Source form, including but not limited to compiled object code, \n* generated documentation, and conversions to other media types. \n* \n* \"Work\" shall mean the work of authorship, whether in Source or Object form, made \n* available under the License, as indicated by a copyright notice that is included \n* in or attached to the work (an example is provided in the Appendix below). \n* \n* \"Derivative Works\" shall mean any work, whether in Source or Object form, that \n* is based on (or derived from) the Work and for which the editorial revisions, \n* annotations, elaborations, or other modifications represent, as a whole, an \n* original work of authorship. For the purposes of this License, Derivative Works \n* shall not include works that remain separable from, or merely link (or bind by \n* name) to the interfaces of, the Work and Derivative Works thereof. \n* \n* \"Contribution\" shall mean any work of authorship, including the original version \n* of the Work and any modifications or additions to that Work or Derivative Works \n* thereof, that is intentionally submitted to Licensor for inclusion in the Work \n* by the copyright owner or by an individual or Legal Entity authorized to submit \n* on behalf of the copyright owner. For the purposes of this definition, \n* \"submitted\" means any form of electronic, verbal, or written communication sent \n* to the Licensor or its representatives, including but not limited to \n* communication on electronic mailing lists, source code control systems, and \n* issue tracking systems that are managed by, or on behalf of, the Licensor for \n* the purpose of discussing and improving the Work, but excluding communication \n* that is conspicuously marked or otherwise designated in writing by the copyright \n* owner as \"Not a Contribution.\" \n* \n* \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf \n* of whom a Contribution has been received by Licensor and subsequently \n* incorporated within the Work. \n* \n* 2. Grant of Copyright License. Subject to the terms and conditions of this \n* License, each Contributor hereby grants to You a perpetual, worldwide, \n* non-exclusive, no-charge, royalty-free, irrevocable copyright license to \n* reproduce, prepare Derivative Works of, publicly display, publicly perform, \n* sublicense, and distribute the Work and such Derivative Works in Source or \n* Object form. \n* \n* 3. Grant of Patent License. Subject to the terms and conditions of this License, \n* each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, \n* no-charge, royalty-free, irrevocable (except as stated in this section) patent \n* license to make, have made, use, offer to sell, sell, import, and otherwise \n* transfer the Work, where such license applies only to those patent claims \n* licensable by such Contributor that are necessarily infringed by their \n* Contribution(s) alone or by combination of their Contribution(s) with the Work \n* to which such Contribution(s) was submitted. If You institute patent litigation \n* against any entity (including a cross-claim or counterclaim in a lawsuit) \n* alleging that the Work or a Contribution incorporated within the Work \n* constitutes direct or contributory patent infringement, then any patent licenses \n* granted to You under this License for that Work shall terminate as of the date \n* such litigation is filed. \n* \n* 4. Redistribution. You may reproduce and distribute copies of the Work or \n* Derivative Works thereof in any medium, with or without modifications, and in \n* Source or Object form, provided that You meet the following conditions: \n*   You must give any other recipients of the Work or Derivative Works a copy of \n*   this License; and \n* \n* \n*   You must cause any modified files to carry prominent notices stating that You \n*   changed the files; and \n* \n* \n*   You must retain, in the Source form of any Derivative Works that You \n*   distribute, all copyright, patent, trademark, and attribution notices from the \n*   Source form of the Work, excluding those notices that do not pertain to any \n*   part of the Derivative Works; and \n* \n* \n*   If the Work includes a \"NOTICE\" text file as part of its distribution, then \n*   any Derivative Works that You distribute must include a readable copy of the \n*   attribution notices contained within such NOTICE file, excluding those notices \n*   that do not pertain to any part of the Derivative Works, in at least one of \n*   the following places: within a NOTICE text file distributed as part of the \n*   Derivative Works; within the Source form or documentation, if provided along \n*   with the Derivative Works; or, within a display generated by the Derivative \n*   Works, if and wherever such third-party notices normally appear. The contents \n*   of the NOTICE file are for informational purposes only and do not modify the \n*   License. You may add Your own attribution notices within Derivative Works that \n*   You distribute, alongside or as an addendum to the NOTICE text from the Work, \n*   provided that such additional attribution notices cannot be construed as \n*   modifying the License.\n* You may add Your own copyright statement to Your modifications and may provide \n* additional or different license terms and conditions for use, reproduction, or \n* distribution of Your modifications, or for any such Derivative Works as a whole, \n* provided Your use, reproduction, and distribution of the Work otherwise complies \n* with the conditions stated in this License. \n* \n* 5. Submission of Contributions. Unless You explicitly state otherwise, any \n* Contribution intentionally submitted for inclusion in the Work by You to the \n* Licensor shall be under the terms and conditions of this License, without any \n* additional terms or conditions. Notwithstanding the above, nothing herein shall \n* supersede or modify the terms of any separate license agreement you may have \n* executed with Licensor regarding such Contributions. \n* \n* 6. Trademarks. This License does not grant permission to use the trade names, \n* trademarks, service marks, or product names of the Licensor, except as required \n* for reasonable and customary use in describing the origin of the Work and \n* reproducing the content of the NOTICE file. \n* \n* 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in \n* writing, Licensor provides the Work (and each Contributor provides its \n* Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY \n* KIND, either express or implied, including, without limitation, any warranties \n* or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A \n* PARTICULAR PURPOSE. You are solely responsible for determining the \n* appropriateness of using or redistributing the Work and assume any risks \n* associated with Your exercise of permissions under this License. \n* \n* 8. Limitation of Liability. In no event and under no legal theory, whether in \n* tort (including negligence), contract, or otherwise, unless required by \n* applicable law (such as deliberate and grossly negligent acts) or agreed to in \n* writing, shall any Contributor be liable to You for damages, including any \n* direct, indirect, special, incidental, or consequential damages of any character \n* arising as a result of this License or out of the use or inability to use the \n* Work (including but not limited to damages for loss of goodwill, work stoppage, \n* computer failure or malfunction, or any and all other commercial damages or \n* losses), even if such Contributor has been advised of the possibility of such \n* damages. \n* \n* 9. Accepting Warranty or Additional Liability. While redistributing the Work or \n* Derivative Works thereof, You may choose to offer, and charge a fee for, \n* acceptance of support, warranty, indemnity, or other liability obligations \n* and/or rights consistent with this License. However, in accepting such \n* obligations, You may act only on Your own behalf and on Your sole \n* responsibility, not on behalf of any other Contributor, and only if You agree to \n* indemnify, defend, and hold each Contributor harmless for any liability incurred \n* by, or claims asserted against, such Contributor by reason of your accepting any \n* such warranty or additional liability. \n* \n* END OF TERMS AND CONDITIONS \n* \n* APPENDIX: How to apply the Apache License to your work \n* \n* To apply the Apache License to your work, attach the following boilerplate \n* notice, with the fields enclosed by brackets \"[]\" replaced with your own \n* identifying information. (Don't include the brackets!) The text should be \n* enclosed in the appropriate comment syntax for the file format. We also \n* recommend that a file or class name and description of purpose be included on \n* the same \"printed page\" as the copyright notice for easier identification within \n* third-party archives. \n* \n* Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, \n* Version 2.0 (the \"License\"); you may not use this file except in compliance with \n* the License. You may obtain a copy of the License at \n* http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or \n* agreed to in writing, software distributed under the License is distributed on \n* an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express \n* or implied. See the License for the specific language governing permissions and \n* limitations under the License.\n*/"
  },
  {
    "path": "scatterer/CelestialBodySortableByDistance.cs",
    "content": "using System;\nusing System.Collections.Generic;\nnamespace scatterer\n{\n\tpublic class celestialBodySortableByDistance : IEquatable<celestialBodySortableByDistance> , IComparable<celestialBodySortableByDistance>\n\t{\n\n\tpublic CelestialBody CelestialBody { get; set; }\n\t\n\tpublic float Distance { get; set; }\n\n\tpublic bool usesScatterer { get; set; }\n\tpublic int scattererIndex { get; set; }\n\t\n\tpublic override string ToString()\n\t{\n\t\t\treturn \"dist: \" + Distance + \"   CelestialBodyName: \" + CelestialBody.name;\n\t}\n\t\n\t\tpublic override bool Equals(object obj)\n\t{\n\t\tif (obj == null) return false;\n\t\t\tcelestialBodySortableByDistance objAsCelestialBodySortableByDistance = obj as celestialBodySortableByDistance;\n\t\t\tif (objAsCelestialBodySortableByDistance == null) return false;\n\t\t\telse return Equals(objAsCelestialBodySortableByDistance);\n\t}\n\n\tpublic int SortByNameAscending(string name1, string name2)\n\t{\n\t\t\n\t\treturn name1.CompareTo(name2);\n\t}\n\t\n\t// Default comparer for Part type.\n\t\tpublic int CompareTo(celestialBodySortableByDistance comparecelestialBodySortableByDistance)\n\t{\n\t\t// A null value means that this object is greater.\n\t\t\tif (comparecelestialBodySortableByDistance == null)\n\t\t\treturn 1;\n\t\t\n\t\telse\n\t\t\t\treturn this.Distance.CompareTo(comparecelestialBodySortableByDistance.Distance);\n\t}\n\t\n\tpublic override int GetHashCode()\n\t{\n\t\treturn (int)Distance;\n\t}\n\n\t\tpublic bool Equals(celestialBodySortableByDistance other)\n\t{\n\t\tif (other == null) return false;\n\t\treturn (this.Distance.Equals(other.Distance));\n\t}\n\t// Should also override == and != operators.\n\t\n\t}\n}"
  },
  {
    "path": "scatterer/DataSerialization/ConfigPoint.cs",
    "content": "using System;\r\nusing UnityEngine;\r\nnamespace Scatterer\r\n{\r\n\tpublic class ConfigPoint\r\n\t{\r\n\t\t[Persistent] public float altitude;\r\n\r\n\t\t[Persistent] public float skyExposure;\r\n\t\t[Persistent] public float skyAlpha;\r\n\t\t[Persistent] public float skyExtinctionTint;\r\n\r\n\t\t[Persistent] public float scatteringExposure;\r\n\t\t[Persistent] public float extinctionThickness;\r\n\r\n\t\t[Persistent] public float postProcessAlpha;\r\n\t\t[Persistent] public float postProcessDepth;\r\n\t\t[Persistent] public float extinctionTint;\r\n\r\n\t\tpublic ConfigPoint(float inAltitude,float inSkyAlpha,float inSkyExposure,float inPostProcessAlpha,\r\n\t\t                   float inPostProcessDepth,float inPostProcessExposure,\r\n\t\t                   float inSkyExtinctionTint, float in_Post_Extinction_Tint,\r\n\t\t                   float inExtinctionThickness)\r\n\t\t{\r\n\t\t\taltitude=inAltitude;\r\n\t\t\tskyAlpha=inSkyAlpha;\r\n\t\t\tskyExposure=inSkyExposure;\r\n\t\t\tpostProcessAlpha=inPostProcessAlpha;\r\n\t\t\tpostProcessDepth=inPostProcessDepth;\r\n\t\t\tscatteringExposure=inPostProcessExposure;\r\n\t\t\tskyExtinctionTint=inSkyExtinctionTint;\r\n\t\t\textinctionTint = in_Post_Extinction_Tint;\r\n\t\t\textinctionThickness = inExtinctionThickness;\r\n\t\t}\r\n\r\n\t\tpublic void getValuesFrom(ConfigPoint inConfigPoint)\r\n\t\t{\r\n\t\t\tskyAlpha=inConfigPoint.skyAlpha;\r\n\t\t\tskyExposure=inConfigPoint.skyExposure;\r\n\t\t\tpostProcessAlpha=inConfigPoint.postProcessAlpha;\r\n\t\t\tpostProcessDepth=inConfigPoint.postProcessDepth;\r\n\t\t\tscatteringExposure=inConfigPoint.scatteringExposure;\r\n\t\t\tskyExtinctionTint=inConfigPoint.skyExtinctionTint;\r\n\t\t\textinctionTint = inConfigPoint.extinctionTint;\r\n\t\t\textinctionThickness = inConfigPoint.extinctionThickness;\r\n\t\t}\r\n\r\n\t\tpublic void interpolateValuesFrom(ConfigPoint inConfigPoint1, ConfigPoint inConfigPoint2, float x)\r\n\t\t{\r\n\t\t\tskyAlpha=Mathf.Lerp(inConfigPoint1.skyAlpha, inConfigPoint2.skyAlpha ,x);\r\n\t\t\tskyExposure=Mathf.Lerp(inConfigPoint1.skyExposure, inConfigPoint2.skyExposure ,x);\r\n\t\t\tpostProcessAlpha=Mathf.Lerp(inConfigPoint1.postProcessAlpha, inConfigPoint2.postProcessAlpha ,x);\r\n\t\t\tpostProcessDepth=Mathf.Lerp(inConfigPoint1.postProcessDepth, inConfigPoint2.postProcessDepth ,x);\r\n\t\t\tscatteringExposure=Mathf.Lerp(inConfigPoint1.scatteringExposure, inConfigPoint2.scatteringExposure ,x);\r\n\t\t\tskyExtinctionTint=Mathf.Lerp(inConfigPoint1.skyExtinctionTint, inConfigPoint2.skyExtinctionTint ,x);\r\n\t\t\textinctionTint = Mathf.Lerp(inConfigPoint1.extinctionTint, inConfigPoint2.extinctionTint ,x);\r\n\t\t\textinctionThickness = Mathf.Lerp(inConfigPoint1.extinctionThickness, inConfigPoint2.extinctionThickness ,x);\r\n\t\t}\r\n\r\n\t\tpublic ConfigPoint()\r\n\t\t{\r\n\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/DataSerialization/ConfigReader.cs",
    "content": "using System.Collections;\r\nusing System.Collections.Generic;\r\nusing KSP;\r\nusing KSP.IO;\r\nusing UnityEngine;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class ConfigReader\r\n\t{\r\n\t\t[Persistent]\r\n\t\tpublic List <ScattererCelestialBody> scattererCelestialBodies = new List <ScattererCelestialBody> {};\r\n\r\n\t\t[Persistent]\r\n\t\tpublic List<PlanetShineLightSource> celestialLightSourcesData=new List<PlanetShineLightSource> {};\r\n\r\n\t\tpublic ConfigNode[] sunflareConfigs;\r\n\t\tpublic UrlDir.UrlConfig[] baseConfigs,atmoConfigs,oceanConfigs;\r\n\r\n\t\tpublic void loadConfigs ()\r\n\t\t{\r\n\t\t\tbaseConfigs = GameDatabase.Instance.GetConfigs (\"Scatterer_config\"); //only used for displaying filepath\r\n\r\n\t\t\tConfigNode[] confNodes = GameDatabase.Instance.GetConfigNodes (\"Scatterer_planetsList\");\r\n\t\t\tif (confNodes.Length == 0) {\r\n\t\t\t\tUtils.LogError (\"No planetsList file found, check your install\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif (confNodes.Length > 1) {\r\n\t\t\t\tUtils.LogError (\"Multiple planetsList files detected, check your install\");\r\n\t\t\t}\r\n\r\n\t\t\tConfigNode.LoadObjectFromConfig (this, confNodes [0]);\r\n\r\n\t\t\tatmoConfigs = GameDatabase.Instance.GetConfigs (\"Scatterer_atmosphere\");\r\n\t\t\toceanConfigs = GameDatabase.Instance.GetConfigs (\"Scatterer_ocean\");\r\n\t\t\tsunflareConfigs = GameDatabase.Instance.GetConfigNodes (\"Scatterer_sunflare\");\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/DataSerialization/MainSettingsReadWrite.cs",
    "content": "using System.Collections;\r\nusing System.Collections.Generic;\r\nusing KSP;\r\nusing KSP.IO;\r\nusing UnityEngine;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class MainSettingsReadWrite\r\n\t{\r\n\t\t[Persistent]\r\n\t\tpublic bool autosavePlanetSettingsOnSceneChange=false;\r\n\t\t\r\n\t\t[Persistent]\r\n\t\tpublic bool disableAmbientLight=true;\r\n\t\t\r\n\t\t[Persistent]\r\n\t\tpublic bool integrateWithEVEClouds=true;\r\n\r\n//\t\t[Persistent]\r\n//\t\tpublic bool integrateEVECloudsGodrays=true;\r\n\t\t\r\n\t\t[Persistent]\r\n\t\tpublic bool overrideNearClipPlane=false;\r\n\t\t\r\n\t\t[Persistent]\r\n\t\tpublic float nearClipPlane=0.5f;\r\n\t\t\r\n\t\t[Persistent]\r\n\t\tpublic bool useOceanShaders = true;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic bool oceanFoam = true;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic bool oceanTransparencyAndRefractions = true;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic bool shadowsOnOcean = true;\r\n\t\t\r\n\t\t[Persistent]\r\n\t\tpublic bool oceanSkyReflections = true;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic bool oceanCaustics = true;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic bool oceanLightRays = false;\r\n\t\t\r\n\t\t[Persistent]\r\n\t\tpublic bool oceanCraftWaveInteractions = true;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic bool oceanCraftWaveInteractionsOverrideWaterCrashTolerance = true;\r\n\t\t\r\n\t\t[Persistent]\r\n\t\tpublic float buoyancyCrashToleranceMultOverride=1.2f * 3f;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic bool oceanCraftWaveInteractionsOverrideDrag = true;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic bool oceanCraftWaveInteractionsOverrideRecoveryVelocity = true;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic float waterMaxRecoveryVelocity = 5f;\r\n\t\t\r\n\t\t[Persistent]\r\n\t\tpublic bool oceanPixelLights = false;\r\n\t\t\r\n\t\t[Persistent]\r\n\t\tpublic bool fullLensFlareReplacement = true;\r\n\t\t\r\n\t\t[Persistent]\r\n\t\tpublic bool sunlightExtinction = true;\r\n\t\t\r\n\t\t[Persistent]\r\n\t\tpublic bool underwaterLightDimming = true;\r\n\t\t\r\n\t\t[Persistent]\r\n\t\tpublic bool showMenuOnStart = true;\r\n\t\t\r\n\t\t[Persistent]\r\n\t\tpublic bool useEclipses = true;\r\n\t\t\r\n\t\t[Persistent]\r\n\t\tpublic bool useRingShadows = true;\r\n\t\t\r\n\t\t//[Persistent]\r\n\t\tpublic bool usePlanetShine = false;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic bool d3d11ShadowFix = true;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic bool useLegacyTerrainGodrays = false;\r\n\r\n\t\t//[Persistent]\r\n\t\tpublic bool mergeDepthPrePass = false;\r\n\r\n\t\t//[Persistent]\r\n\t\tpublic bool quarterResScattering = true;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic bool useSubpixelMorphologicalAntialiasing = true;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic int smaaQuality = 0;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic bool useTemporalAntiAliasing = true;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic float taaStationaryBlending = 0.90f;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic float taaMotionBlending = 0.55f;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic float taaJitterSpread = 0.9f;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic float taaSharpness = 0.25f;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic int disableTaaBelowFrameRateThreshold = 26;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic bool terrainShadows = false;\r\n\r\n\t\t//0 - None, 1 - Bruneton, 2 - Uncharted, 3 - Hable but disabled\r\n\t\t[Persistent]\r\n\t\tpublic int scatteringTonemapper = 2;\r\n\r\n\t\t/*\r\n\t\t[Persistent]\r\n\t\tpublic float hableToeStrength;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic float hableToeLength;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic float hableShoulderStrength;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic float hableShoulderLength;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic float hableShoulderAngle;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic float hableGamma;\r\n\t\t*/\r\n\r\n\t\t[Persistent]\r\n\t\tpublic float unifiedCamShadowsDistance=50000f;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic float unifiedCamShadowNormalBiasOverride=0.4f;\r\n\t\t\r\n\t\t[Persistent]\r\n\t\tpublic float unifiedCamShadowBiasOverride=0.125f;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic int unifiedCamShadowResolutionOverride=0;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic Vector3 unifiedCamShadowCascadeSplitsOverride=Vector3.zero;\r\n\t\t\r\n\t\t[Persistent]\r\n\t\tpublic float dualCamShadowsDistance=50000f;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic float dualCamShadowNormalBiasOverride=0.4f;\r\n\t\t\r\n\t\t[Persistent]\r\n\t\tpublic float dualCamShadowBiasOverride=0.125f;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic int dualCamShadowResolutionOverride=0;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic Vector3 dualCamShadowCascadeSplitsOverride=Vector3.zero;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic bool useDithering = true;\r\n\t\t\r\n\t\t[Persistent]\r\n\t\tpublic int m_fourierGridSize = 64;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic int oceanMeshResolution = 8;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic bool useLowResolutionAtmosphere = false;\r\n\r\n\t\tpublic void loadMainSettings ()\r\n\t\t{\r\n\t\t\tUrlDir.UrlConfig[] baseConfigs = GameDatabase.Instance.GetConfigs (\"Scatterer_config\");\r\n\t\t\tif (baseConfigs.Length == 0)\r\n\t\t\t{\r\n\t\t\t\tUtils.LogError (\"No config file found, check your install\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif (baseConfigs.Length > 1)\r\n\t\t\t{\r\n\t\t\t\tUtils.LogError (\"Multiple config files detected, check your install\");\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tConfigNode.LoadObjectFromConfig (this, (baseConfigs [0]).config);\r\n\t\t}\r\n\t\t\r\n\t\tpublic void saveMainSettingsIfChanged()\r\n\t\t{\r\n\t\t\tUrlDir.UrlConfig[] baseConfigs = GameDatabase.Instance.GetConfigs (\"Scatterer_config\");\r\n\t\t\t\r\n\t\t\tif (baseConfigs.Length == 0)\r\n\t\t\t{\r\n\t\t\t\tUtils.LogDebug (\"No config file found, check your install\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif (baseConfigs.Length > 1)\r\n\t\t\t{\r\n\t\t\t\tUtils.LogDebug (\"Multiple config files detected, check your install\");\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tMainSettingsReadWrite OldConfig = new MainSettingsReadWrite ();\r\n\t\t\tConfigNode.LoadObjectFromConfig (OldConfig, (baseConfigs [0]).config);\r\n\t\t\t\r\n\t\t\tbool configChanged =\r\n\t\t\t\t(OldConfig.autosavePlanetSettingsOnSceneChange != autosavePlanetSettingsOnSceneChange ||\r\n\t\t\t\t OldConfig.disableAmbientLight != disableAmbientLight ||\r\n\t\t\t\t OldConfig.integrateWithEVEClouds != integrateWithEVEClouds ||\r\n//\t\t\t\t OldConfig.integrateEVECloudsGodrays != integrateEVECloudsGodrays ||\r\n\t\t\t\t OldConfig.overrideNearClipPlane != overrideNearClipPlane ||\r\n\t\t\t\t OldConfig.nearClipPlane != nearClipPlane ||\r\n\t\t\t\t OldConfig.useOceanShaders != useOceanShaders ||\r\n\t\t\t\t OldConfig.oceanFoam != oceanFoam ||\r\n\t\t\t\t OldConfig.oceanTransparencyAndRefractions != oceanTransparencyAndRefractions ||\r\n\r\n\t\t\t\t OldConfig.shadowsOnOcean != shadowsOnOcean ||\r\n\t\t\t\t OldConfig.oceanSkyReflections != oceanSkyReflections ||\r\n\t\t\t\t OldConfig.oceanCaustics != oceanCaustics ||\r\n\t\t\t\t OldConfig.oceanLightRays != oceanLightRays ||\r\n\r\n\t\t\t\t OldConfig.oceanCraftWaveInteractions != oceanCraftWaveInteractions ||\r\n\t\t\t\t OldConfig.oceanCraftWaveInteractionsOverrideWaterCrashTolerance != oceanCraftWaveInteractionsOverrideWaterCrashTolerance || \r\n\t\t\t\t OldConfig.buoyancyCrashToleranceMultOverride != buoyancyCrashToleranceMultOverride || \r\n\t\t\t\t OldConfig.oceanCraftWaveInteractionsOverrideDrag != oceanCraftWaveInteractionsOverrideDrag || \r\n\t\t\t\t OldConfig.oceanCraftWaveInteractionsOverrideRecoveryVelocity != oceanCraftWaveInteractionsOverrideRecoveryVelocity || \r\n\t\t\t\t OldConfig.waterMaxRecoveryVelocity != waterMaxRecoveryVelocity || \r\n\r\n\t\t\t\t OldConfig.oceanPixelLights != oceanPixelLights ||\r\n\t\t\t\t OldConfig.fullLensFlareReplacement != fullLensFlareReplacement ||\r\n\t\t\t\t OldConfig.sunlightExtinction != sunlightExtinction ||\r\n\t\t\t\t OldConfig.underwaterLightDimming != underwaterLightDimming ||\r\n\t\t\t\t OldConfig.showMenuOnStart != showMenuOnStart ||\r\n\t\t\t\t OldConfig.useEclipses != useEclipses ||\r\n\t\t\t\t OldConfig.useRingShadows != useRingShadows ||\r\n\t\t\t\t OldConfig.d3d11ShadowFix != d3d11ShadowFix ||\r\n\t\t\t\t OldConfig.useLegacyTerrainGodrays != useLegacyTerrainGodrays ||\r\n\t\t\t\t //OldConfig.mergeDepthPrePass != mergeDepthPrePass ||\r\n\t\t\t\t OldConfig.quarterResScattering != quarterResScattering ||\r\n\t\t\t\t \r\n\t\t\t\t OldConfig.useSubpixelMorphologicalAntialiasing != useSubpixelMorphologicalAntialiasing ||\r\n\t\t\t\t OldConfig.smaaQuality != smaaQuality ||\r\n\t\t\t\t \r\n\t\t\t\t OldConfig.useTemporalAntiAliasing  != useTemporalAntiAliasing ||\r\n\t\t\t\t OldConfig.taaStationaryBlending != taaStationaryBlending ||\r\n\t\t\t\t OldConfig.taaMotionBlending != taaMotionBlending ||\r\n\t\t\t\t OldConfig.taaJitterSpread != taaJitterSpread ||\r\n\t\t\t\t OldConfig.taaSharpness != taaSharpness ||\r\n\t\t\t\t OldConfig.disableTaaBelowFrameRateThreshold != disableTaaBelowFrameRateThreshold ||\r\n\r\n\t\t\t\t OldConfig.terrainShadows != terrainShadows ||\r\n\t\t\t\t OldConfig.scatteringTonemapper != scatteringTonemapper ||\r\n\r\n\t\t\t\t /*\r\n\t\t\t\t OldConfig.hableToeStrength != hableToeStrength ||\r\n\t\t\t\t OldConfig.hableToeLength != hableToeLength ||\r\n\t\t\t\t OldConfig.hableShoulderStrength != hableShoulderStrength ||\r\n\t\t\t\t OldConfig.hableShoulderLength != hableShoulderLength ||\r\n\t\t\t\t OldConfig.hableShoulderAngle != hableShoulderAngle ||\r\n\t\t\t\t OldConfig.hableGamma != hableGamma ||\r\n\t\t\t\t */\r\n\r\n\t\t\t\t OldConfig.useDithering != useDithering ||\r\n\r\n\t\t\t\t OldConfig.unifiedCamShadowsDistance != unifiedCamShadowsDistance ||\r\n\t\t\t\t OldConfig.unifiedCamShadowNormalBiasOverride != unifiedCamShadowNormalBiasOverride ||\r\n\t\t\t\t OldConfig.unifiedCamShadowBiasOverride != unifiedCamShadowBiasOverride ||\r\n\t\t\t\t OldConfig.unifiedCamShadowCascadeSplitsOverride != unifiedCamShadowCascadeSplitsOverride ||\r\n\t\t\t\t OldConfig.unifiedCamShadowResolutionOverride != unifiedCamShadowResolutionOverride ||\r\n\r\n\t\t\t\t OldConfig.dualCamShadowsDistance != dualCamShadowsDistance ||\r\n\t\t\t\t OldConfig.dualCamShadowNormalBiasOverride != dualCamShadowNormalBiasOverride ||\r\n\t\t\t\t OldConfig.dualCamShadowBiasOverride != dualCamShadowBiasOverride ||\r\n\t\t\t\t OldConfig.dualCamShadowCascadeSplitsOverride != dualCamShadowCascadeSplitsOverride ||\r\n\t\t\t\t OldConfig.dualCamShadowResolutionOverride != dualCamShadowResolutionOverride ||\r\n\r\n\t\t\t\t OldConfig.m_fourierGridSize != m_fourierGridSize ||\r\n\t\t\t\t OldConfig.oceanMeshResolution != oceanMeshResolution) ||\r\n\r\n\t\t\t\t OldConfig.useLowResolutionAtmosphere != useLowResolutionAtmosphere;\r\n\t\t\t\r\n\t\t\tif (configChanged)\r\n\t\t\t{\r\n\t\t\t\tUtils.LogDebug(\"Main config changed\");\r\n\t\t\t\t\r\n\t\t\t\tbaseConfigs [0].config = ConfigNode.CreateConfigFromObject (this);\r\n\t\t\t\tbaseConfigs [0].config.name = \"Scatterer_config\";\r\n\t\t\t\tUtils.LogDebug (\"Saving settings to: \" + baseConfigs [0].parent.url+\".cfg\");\r\n\t\t\t\tbaseConfigs [0].parent.SaveConfigs ();\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tUtils.LogDebug(\"No changes to main config, skipping saving.\");\r\n\t\t\t}\r\n\r\n\t\t}\r\n\t}\r\n}"
  },
  {
    "path": "scatterer/DataSerialization/PlanetshineSource.cs",
    "content": "using System;\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class AtmoPlanetShineSource\r\n\t{\r\n\t\t[Persistent] public string bodyName;\r\n\t\t[Persistent] public Vector3 color;\r\n\t\t[Persistent] public float intensity;\r\n\t\t[Persistent] public bool isSun;\r\n\t\tpublic CelestialBody body;\r\n\t}\r\n\r\n\tpublic class PlanetShineLightSource\r\n\t{\r\n\t\t[Persistent] public string bodyName;\r\n\t\t[Persistent] public Vector3 color;\r\n\t\t[Persistent] public float intensity;\r\n\t\t[Persistent] public bool isSun;\r\n\t\t[Persistent] public string mainSunCelestialBody;\r\n\t\t[Persistent] public float localRange;\r\n\t\t[Persistent] public float scaledRange;\r\n\t\t[Persistent] public float fadeRadius;\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/DataSerialization/PluginDataReadWrite.cs",
    "content": "using System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing KSP;\r\nusing KSP.IO;\r\nusing UnityEngine;\r\n\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class PluginDataReadWrite\r\n\t{\r\n\t\t[Persistent]\r\n\t\tpublic string guiModifierKey1String=KeyCode.LeftAlt.ToString();\r\n\t\t\r\n\t\t[Persistent]\r\n\t\tpublic string guiModifierKey2String=KeyCode.RightAlt.ToString();\r\n\t\t\r\n\t\t[Persistent]\r\n\t\tpublic string guiKey1String=KeyCode.F10.ToString();\r\n\t\t\r\n\t\t[Persistent]\r\n\t\tpublic string guiKey2String=KeyCode.F11.ToString();\r\n\t\t\r\n\t\t[Persistent]\r\n\t\tpublic int scrollSectionHeight = 500;\r\n\t\t\r\n\t\t[Persistent]\r\n\t\tpublic Vector2 inGameWindowLocation=Vector2.zero;\r\n\t\t\r\n\t\tpublic KeyCode guiKey1, guiKey2, guiModifierKey1, guiModifierKey2 ;\r\n\t\t\r\n\t\tpublic void loadPluginData ()\r\n\t\t{\r\n\t\t\ttry\r\n\t\t\t{\r\n\t\t\t\tConfigNode confNode = ConfigNode.Load (Utils.PluginPath + \"/config/PluginData/pluginData.cfg\");\r\n\t\t\t\tConfigNode.LoadObjectFromConfig (this, confNode);\r\n\r\n\t\t\t\tguiKey1 = (KeyCode)Enum.Parse(typeof(KeyCode), guiKey1String);\r\n\t\t\t\tguiKey2 = (KeyCode)Enum.Parse(typeof(KeyCode), guiKey2String);\r\n\t\t\t\t\r\n\t\t\t\tguiModifierKey1 = (KeyCode)Enum.Parse(typeof(KeyCode), guiModifierKey1String);\r\n\t\t\t\tguiModifierKey2 = (KeyCode)Enum.Parse(typeof(KeyCode), guiModifierKey2String);\r\n\t\t\t}\r\n\t\t\tcatch (Exception stupid)\r\n\t\t\t{\r\n\t\t\t\tUtils.LogError(\"Couldn't load pluginData \"+stupid.ToString());\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tpublic void savePluginData ()\r\n\t\t{\r\n\t\t\ttry\r\n\t\t\t{\r\n\t\t\t\tvar dir = Utils.PluginPath + \"/config/PluginData\";\r\n\t\t\t\tif (!System.IO.Directory.Exists(dir)) System.IO.Directory.CreateDirectory(dir);\r\n\r\n\t\t\t\tConfigNode cnTemp = ConfigNode.CreateConfigFromObject (this);\r\n\t\t\t\tcnTemp.Save (dir + \"/pluginData.cfg\");\r\n\t\t\t}\r\n\t\t\tcatch (Exception stupid)\r\n\t\t\t{\r\n\t\t\t\tUtils.LogError(\"Couldn't save pluginData \"+stupid.ToString());\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}"
  },
  {
    "path": "scatterer/DataSerialization/QualityPresetsLoader.cs",
    "content": "using System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.IO;\r\nusing System.Reflection;\r\nusing System.Runtime;\r\nusing KSP;\r\nusing KSP.IO;\r\nusing UnityEngine;\r\n\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class QualityPresetsLoader\r\n\t{\r\n\t\tpublic static String[] GetPresetsList()\r\n\t\t{\r\n\t\t\tList<String> presetStrings = new List<String> ();\r\n\r\n\t\t\tUrlDir.UrlConfig[] presetsList = GameDatabase.Instance.GetConfigs (\"Scatterer_quality_preset\");\r\n\r\n\t\t\tforeach (UrlDir.UrlConfig _url in presetsList)\r\n\t\t\t{\r\n\t\t\t\tConfigNode[] configNodeArray = _url.config.GetNodes(\"Quality_preset\");\r\n\t\t\t\t\r\n\t\t\t\tforeach(ConfigNode _cn in configNodeArray)\r\n\t\t\t\t{\r\n\t\t\t\t\tif (_cn.HasValue(\"name\"))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tpresetStrings.Add(_cn.GetValue(\"name\"));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn presetStrings.ToArray();\r\n\t\t}\r\n\r\n\t\tpublic static void LoadPresetIntoMainSettings(MainSettingsReadWrite settings, string presetName)\r\n\t\t{\r\n\t\t\tList<String> presetStrings = new List<String> ();\r\n\t\t\t\r\n\t\t\tUrlDir.UrlConfig[] presetsList = GameDatabase.Instance.GetConfigs (\"Scatterer_quality_preset\");\r\n\t\t\t\r\n\t\t\tforeach (UrlDir.UrlConfig _url in presetsList)\r\n\t\t\t{\r\n\t\t\t\tConfigNode[] configNodeArray = _url.config.GetNodes(\"Quality_preset\");\r\n\t\t\t\t\r\n\t\t\t\tforeach(ConfigNode _cn in configNodeArray)\r\n\t\t\t\t{\r\n\t\t\t\t\tif (_cn.HasValue(\"name\") && (_cn.GetValue(\"name\") == presetName))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tLoadConfigNodeIntoMainSettings(settings, _cn);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate static void LoadConfigNodeIntoMainSettings(MainSettingsReadWrite settings, ConfigNode cn)\r\n\t\t{\r\n\t\t\tMainSettingsReadWrite tempMainSettings = new MainSettingsReadWrite();\r\n\t\t\tType targetType = tempMainSettings.GetType ();\r\n\r\n\t\t\tConfigNode.LoadObjectFromConfig (tempMainSettings, cn);\r\n\r\n\t\t\tforeach (FieldInfo fi in targetType.GetFields())\r\n\t\t\t{\r\n\t\t\t\tif (cn.HasValue(fi.Name))\r\n\t\t\t\t{\r\n\t\t\t\t\tfi.SetValue(settings, fi.GetValue(tempMainSettings));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic static string FindPresetOfCurrentSettings(MainSettingsReadWrite settings)\r\n\t\t{\t\r\n\t\t\tUrlDir.UrlConfig[] presetsList = GameDatabase.Instance.GetConfigs (\"Scatterer_quality_preset\");\r\n\t\t\t\r\n\t\t\tforeach (UrlDir.UrlConfig _url in presetsList)\r\n\t\t\t{\r\n\t\t\t\tConfigNode[] configNodeArray = _url.config.GetNodes(\"Quality_preset\");\r\n\t\t\t\t\r\n\t\t\t\tforeach(ConfigNode _cn in configNodeArray)\r\n\t\t\t\t{\r\n\t\t\t\t\tif (_cn.HasValue(\"name\"))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif (PresetMatchesCurrentSettings(settings,_cn))\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\treturn _cn.GetValue(\"name\");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn (\"No preset - custom settings\");\r\n\t\t}\r\n\r\n\r\n\t\tprivate static bool PresetMatchesCurrentSettings(MainSettingsReadWrite settings, ConfigNode cn)\r\n\t\t{\r\n\t\t\tMainSettingsReadWrite tempMainSettings = new MainSettingsReadWrite();\r\n\t\t\tType targetType = tempMainSettings.GetType ();\r\n\t\t\t\r\n\t\t\tConfigNode.LoadObjectFromConfig (tempMainSettings, cn);\r\n\t\t\tbool match = true;\r\n\t\t\tbool compared = false;\r\n\r\n\t\t\tforeach (FieldInfo fi in targetType.GetFields())\r\n\t\t\t{\r\n\t\t\t\tif (cn.HasValue(fi.Name))\r\n\t\t\t\t{\r\n\t\t\t\t\tif (!CompareFields(fi, settings, tempMainSettings))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcompared = true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn match && compared;\r\n\t\t}\r\n\r\n\t\tprivate static bool CompareFields(FieldInfo fi, MainSettingsReadWrite settings1, MainSettingsReadWrite settings2)\r\n\t\t{\r\n\t\t\tif (fi.FieldType == typeof(float))\r\n\t\t\t{\r\n\t\t\t\treturn ((float)(fi.GetValue (settings1)) == (float)(fi.GetValue (settings2)));\r\n\t\t\t}\r\n\t\t\telse if (fi.FieldType == typeof(int))\r\n\t\t\t{\r\n\t\t\t\treturn ((int)(fi.GetValue (settings1)) == (int)(fi.GetValue (settings2)));\r\n\t\t\t}\r\n\t\t\telse if (fi.FieldType == typeof(bool))\r\n\t\t\t{\r\n\t\t\t\treturn ((bool)(fi.GetValue (settings1)) == (bool)(fi.GetValue (settings2)));\r\n\t\t\t}\r\n\t\t\telse if (fi.FieldType == typeof(Vector3))\r\n\t\t\t{\r\n\t\t\t\treturn ((Vector3)(fi.GetValue (settings1)) == (Vector3)(fi.GetValue (settings2)));\r\n\t\t\t}\r\n\r\n\t\t\tUtils.LogError(\"Unhandled preset type? \"+fi.FieldType.ToString());\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/DataSerialization/ScattererCelestialBody.cs",
    "content": "using System;\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class ScattererCelestialBody\r\n\t{\r\n\t\t[Persistent] public string celestialBodyName;\r\n\t\t[Persistent] public string transformName;\r\n\t\t[Persistent] public float loadDistance;\r\n\t\t[Persistent] public float unloadDistance;\r\n\t\t[Persistent] public bool hasOcean;\r\n\t\t[Persistent] public bool usesCloudIntegration;\r\n\t\t[Persistent] public bool cloudIntegrationUsesScattererSunColors = false;\r\n\t\t[Persistent] public bool flatScaledSpaceModel;\r\n\r\n\t\t[Persistent] public string mainSunCelestialBody;\r\n\t\t[Persistent] public bool sunsUseIntensityCurves = false;\r\n\t\t[Persistent] public Color sunColor = Color.white;\r\n\t\t[Persistent] public List<string> eclipseCasters=new List<string> {};\r\n\r\n\t\t[Persistent] public List<SecondarySunConfig> secondarySuns=new List<SecondarySunConfig> {};\r\n\r\n\t\t[Persistent] public List<AtmoPlanetShineSource> planetshineSources=new List<AtmoPlanetShineSource> {};\r\n\t\t\t\r\n\t\tpublic CelestialBody celestialBody;\r\n\t\tpublic Transform transform;\r\n\t\tpublic bool isFound = false;\r\n\t\tpublic bool active;\r\n\t\tpublic ProlandManager prolandManager;\r\n\t\t\r\n\t\tpublic ScattererCelestialBody ()\r\n\t\t{\r\n\t\t\t\r\n\t\t}\r\n\t}\r\n\r\n\tpublic class SecondarySunConfig\r\n\t{\r\n\t\t[Persistent] public string celestialBodyName;\r\n\t\t[Persistent] public Color sunColor = Color.white;\r\n\t\t//[Persistent] public List<string> eclipseCasters=new List<string> {};\t//maybe don't do this at the start? or at all, especially since we will half-ass it by not being able to eclipse light on terrain anyway\r\n\t}\r\n\r\n\tpublic class SecondarySun\r\n\t{\r\n\t\tpublic SecondarySunConfig config;\r\n\t\tpublic CelestialBody celestialBody;\r\n\t\tpublic Light sunLight = null;\r\n\t\tpublic Light scaledSunLight = null;\r\n\t\t//public List<CelestialBody> eclipseCasters=new List<CelestialBody> {};\r\n\r\n\t\tpublic SecondarySun (SecondarySunConfig inConfig, CelestialBody body)\r\n\t\t{\r\n\t\t\tconfig = inConfig;\r\n\t\t\tcelestialBody = body;\r\n\t\t}\r\n\r\n\t\tpublic static SecondarySun FindSecondarySun (SecondarySunConfig inConfig)\r\n\t\t{\r\n\t\t\tvar celestialBody = FlightGlobals.Bodies.SingleOrDefault (_cb => _cb.GetName () == inConfig.celestialBodyName);\r\n\t\t\tif (celestialBody == null)\r\n\t\t\t{\r\n\t\t\t\tUtils.LogError (\"Secondary sun \" + inConfig.celestialBodyName + \" not found, will be unavailable for atmo/ocean effects\");\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tSecondarySun secondarySun = new SecondarySun(inConfig, celestialBody);\r\n\t\t\t\treturn secondarySun;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/Effects/AntiAliasing/GenericAntiAliasing.cs",
    "content": "using UnityEngine;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic abstract class GenericAntiAliasing  : MonoBehaviour\r\n\t{\r\n\t\tpublic GenericAntiAliasing ()\r\n\t\t{\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/Effects/AntiAliasing/SubpixelMorphologicalAntialiasing.cs",
    "content": "using System;\r\nusing UnityEngine;\r\nusing UnityEngine.Rendering;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class SubpixelMorphologicalAntialiasing : GenericAntiAliasing\r\n\t{\r\n\t\tCamera targetCamera;\r\n\t\tCommandBuffer SMAACommandBuffer;\r\n\t\tMaterial SMAAMaterial;\r\n\r\n\t\tenum Pass { EdgeDetection = 0, BlendWeights = 3, NeighborhoodBlending = 6 }\r\n\t\tpublic enum Quality { DepthMode = 0, Medium = 1, High = 2 }\r\n\r\n\t\tprivate static CameraEvent SMAACameraEvent = CameraEvent.AfterForwardAlpha; // BeforeImageEffects doesn't work well\r\n\r\n\t\tQuality quality;\r\n\r\n\t\tpublic void forceDepthBuffermode()\r\n\t\t{\r\n\t\t\tquality = Quality.DepthMode;\r\n\t\t\tinitialized = false;\r\n\t\t}\r\n\r\n\t\tint flipRenderTargetNameID, flopRenderTargetNameID;\r\n\r\n\t\tstatic Texture2D areaTex, searchTex;\r\n\t\tbool initialized = false;\r\n\t\tbool hdrEnabled = false;\r\n\r\n        public Quality QualityUsed { get => quality; }\r\n\r\n        public void Awake()\r\n\t\t{\r\n\t\t\ttargetCamera = GetComponent<Camera> ();\r\n\t\t\t\r\n\t\t\ttargetCamera.forceIntoRenderTexture = true;\r\n\r\n\t\t\thdrEnabled = targetCamera.allowHDR;\r\n\r\n\t\t\t// surely there are better names for these?  They're both temporaries\r\n\t\t\tflipRenderTargetNameID = Shader.PropertyToID(\"_SMAA_Flip\");\r\n\t\t\tflopRenderTargetNameID = Shader.PropertyToID(\"_SMAA_Flop\");\r\n\r\n\t\t\tSMAAMaterial = new Material(ShaderReplacer.Instance.LoadedShaders[(\"Scatterer/SubpixelMorphologicalAntialiasing\")]);\r\n\r\n\t\t\tif (areaTex == null)\r\n\t\t\t\tareaTex = (Texture2D) ShaderReplacer.Instance.LoadedTextures [\"AreaTex\"];\r\n\t\t\tif (searchTex == null)\r\n\t\t\t\tsearchTex = (Texture2D)ShaderReplacer.Instance.LoadedTextures [\"SearchTex\"];\r\n\r\n\t\t\tSMAAMaterial.SetTexture(\"_AreaTex\"  , areaTex);\r\n\t\t\tSMAAMaterial.SetTexture(\"_SearchTex\", searchTex);\r\n\r\n\t\t\tquality = (Quality)((Int32) Mathf.Clamp( (float) Scatterer.Instance.mainSettings.smaaQuality,1f,2f));\t//limit to 1 and 2, 1 and 2 are image-based. 0 is depth-based and would make performance worse by having to run for each camera's depth\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//only use depth mode when we force it for the IVA camera\r\n\r\n            SMAACommandBuffer = new CommandBuffer ();\r\n            SMAACommandBuffer.name = $\"Scatterer SMAA CommandBuffer for {targetCamera.name}\";\r\n        }\r\n\r\n        static readonly int MainTextureProperty = Shader.PropertyToID(\"_MainTexture\");\r\n        static readonly int BlendTexproperty = Shader.PropertyToID(\"_BlendTex\");\r\n\r\n        public void OnPreCull()\r\n\t\t{\r\n\t\t\tif (!initialized || targetCamera.allowHDR != hdrEnabled)\r\n\t\t\t{\r\n\t\t\t\tSMAACommandBuffer.Clear ();\r\n\r\n\t\t\t\thdrEnabled = targetCamera.allowHDR;\r\n\t\t\t\tvar colorFormat = hdrEnabled ? RenderTextureFormat.DefaultHDR : RenderTextureFormat.ARGB32;\r\n\r\n\t\t\t\tSMAACommandBuffer.GetTemporaryRT(flipRenderTargetNameID, -1, -1, 0, FilterMode.Bilinear, colorFormat);\r\n\t\t\t\t// TODO: how do we make sure to match the previous settings?  Do we need to use RenderTextureDescriptor?\r\n\t\t\t\t//flip.anisoLevel = 1;\r\n\t\t\t\t//flip.antiAliasing = 1;\r\n\t\t\t\t//flip.volumeDepth = 0;\r\n\t\t\t\t//flip.useMipMap = false;\r\n\t\t\t\t//flip.autoGenerateMips = false;\r\n\t\t\t\t//flip.wrapMode = TextureWrapMode.Clamp;\r\n\t\t\t\t//flip.filterMode = FilterMode.Bilinear;\r\n\r\n\t\t\t\tSMAACommandBuffer.GetTemporaryRT(flopRenderTargetNameID, -1, -1, 0, FilterMode.Bilinear, colorFormat);\r\n\r\n\t\t\t\tSMAACommandBuffer.SetRenderTarget (flopRenderTargetNameID);\r\n\t\t\t\tSMAACommandBuffer.ClearRenderTarget (false, true, Color.clear);\r\n\t\t\t\r\n\t\t\t\tSMAACommandBuffer.SetRenderTarget (flipRenderTargetNameID);\r\n\t\t\t\tSMAACommandBuffer.ClearRenderTarget (false, true, Color.clear);\r\n\t\t\t\r\n\t\t\t\tSMAACommandBuffer.SetGlobalTexture (MainTextureProperty, BuiltinRenderTextureType.CameraTarget);\r\n\r\n\t\t\t\tSMAACommandBuffer.Blit (null, flipRenderTargetNameID, SMAAMaterial, (int)Pass.EdgeDetection + (int)quality);\t\t//screen to flip with edge detection\r\n\t\t\t\r\n\t\t\t\tSMAACommandBuffer.SetGlobalTexture (MainTextureProperty, flipRenderTargetNameID);\r\n\t\t\t\tSMAACommandBuffer.Blit (null, flopRenderTargetNameID, SMAAMaterial, (int)Pass.BlendWeights + (int)quality);\t\t//flip to flop with blendweights\r\n\t\t\t\tSMAACommandBuffer.SetGlobalTexture (BlendTexproperty, flopRenderTargetNameID);\r\n\t\t\t\tSMAACommandBuffer.SetGlobalTexture (MainTextureProperty, BuiltinRenderTextureType.CameraTarget);\r\n\t\t\t\tSMAACommandBuffer.Blit (null, flipRenderTargetNameID, SMAAMaterial, (int)Pass.NeighborhoodBlending);\t\t\t\t//neighborhood blending to flip\r\n\t\t\t\tSMAACommandBuffer.Blit (flipRenderTargetNameID, BuiltinRenderTextureType.CameraTarget);\t\t\t\t\t\t\t//blit back to screen\r\n\t\t\t\r\n\t\t\t\ttargetCamera.AddCommandBuffer (SMAACameraEvent, SMAACommandBuffer);\r\n\t\t\t\tinitialized = true;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tpublic void OnDestroy()\r\n\t\t{\r\n\t\t\tSMAAMaterial = null;\r\n\r\n\t\t\tif (SMAACommandBuffer !=null)\r\n\t\t\t{\r\n\t\t\t\ttargetCamera.RemoveCommandBuffer (SMAACameraEvent, SMAACommandBuffer);\r\n\t\t\t\tSMAACommandBuffer.Clear();\r\n\t\t\t\tSMAACommandBuffer.Release();\r\n\t\t\t\tSMAACommandBuffer = null;\r\n\t\t\t\tinitialized = false;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "scatterer/Effects/AntiAliasing/TemporalAntiAliasing.cs",
    "content": "using UnityEngine;\nusing UnityEngine.Rendering;\nusing UnityEngine.XR;\n\nnamespace Scatterer\n{\n\t// Temporal anti-aliasing from Unity post-processing stack V2\n\t// Modified to not blur the ocean, removed dependency on other postprocessing classes I don't need here so we can initialize and make everything work by just adding this to a camera\n\t// Generating motion vectors for the ocean is both expensive and unnecessary so we should just not apply TAA on the ocean, otherwise it would just blur it without proper motion vectors\n\tpublic class TemporalAntiAliasing : GenericAntiAliasing\n\t{\n\t\tpublic float jitterSpread = 0.9f;\t\t\t\t//The diameter (in texels) inside which jitter samples are spread. Smaller values result in crisper but more aliased output, while larger values result in more stable, but blurrier, output. Range(0.1f, 1f)\n\t\tpublic float sharpness = 0.25f;\t\t\t\t\t//Controls the amount of sharpening applied to the color buffer. High values may introduce dark-border artifacts. Range(0f, 3f)\n\t\tpublic float stationaryBlending = 0.90f;\t\t//The blend coefficient for a stationary fragment. Controls the percentage of history sample blended into the final color. Range(0f, 0.99f)\n\t\tpublic float motionBlending = 0.55f;\t\t\t//The blend coefficient for a fragment with significant motion. Controls the percentage of history sample blended into the final color. Range(0f, 0.99f)\n\n\t\tpublic Vector2 jitter { get; private set; }\t\t// The current jitter amount\n\t\tpublic int sampleIndex { get; private set; }\t// The current sample index\n\t\t\n\t\tenum Pass {SolverDilate, SolverNoDilate}\n\t\t\n\t\treadonly RenderTargetIdentifier[] m_Mrt = new RenderTargetIdentifier[2];\n\t\tbool m_ResetHistory = true;\n\t\tbool hdrEnabled = false;\n\t\t\n\t\tconst int k_SampleCount = 8;\n\t\t\n\t\t// Ping-pong between two history textures as we can't read & write the same target in the same pass\n\t\tconst int eyesCount = 2; const int historyTexturesCount = 2;\n\t\tRenderTexture[][] historyTextures = new RenderTexture[eyesCount][];\n\n\t\tint[] m_HistoryPingPong = new int [eyesCount];\n\n\t\tCamera targetCamera;\n\t\tCommandBuffer temporalAACommandBuffer;\n\t\tMaterial temporalAAMaterial;\n\n\t\tDepthTextureMode originalDepthTextureMode;\n\t\tpublic bool checkOceanDepth = false;\n\t\tpublic bool jitterTransparencies = false;\n\t\tpublic bool resetMotionVectors = true;\n\n        private static int jitterProperty = Shader.PropertyToID(\"_Jitter\");\n        private static int keepPreviousMotionVectorsProperty = Shader.PropertyToID(\"TAA_KeepPreviousMotionVectors\");\n\n        private static CameraEvent TAACameraEvent = CameraEvent.AfterForwardAlpha;  // BeforeImageEffects doesn't work well\n\n\t\tbool firstFrame = true;\n\n\t\tpublic void Awake()\n\t\t{\n\t\t\ttargetCamera = GetComponent<Camera>();\n\t\t\toriginalDepthTextureMode = targetCamera.depthTextureMode;\n\t\t\ttargetCamera.depthTextureMode = DepthTextureMode.Depth | DepthTextureMode.MotionVectors;\n\t\t\ttargetCamera.forceIntoRenderTexture = true;\n\n\t\t\ttemporalAAMaterial = new Material(ShaderReplacer.Instance.LoadedShaders[(\"Scatterer/TemporalAntialiasing\")]);\n\t\t\tUtils.EnableOrDisableShaderKeywords(temporalAAMaterial, \"CUSTOM_OCEAN_ON\", \"CUSTOM_OCEAN_OFF\", false);\n\n\t\t\tjitterSpread = Scatterer.Instance.mainSettings.taaJitterSpread;\n\t\t\tsharpness = Scatterer.Instance.mainSettings.taaSharpness;\n\t\t\tstationaryBlending = Scatterer.Instance.mainSettings.taaStationaryBlending;\n\t\t\tmotionBlending = Scatterer.Instance.mainSettings.taaMotionBlending;\n\n\t\t\tconst float kMotionAmplification = 100f * 60f;\n\t\t\ttemporalAAMaterial.SetFloat(\"_Sharpness\", sharpness);\n\t\t\ttemporalAAMaterial.SetVector(\"_FinalBlendParameters\", new Vector4(stationaryBlending, motionBlending, kMotionAmplification, 0f));\n\n\t\t\ttemporalAACommandBuffer = new CommandBuffer();\n\t\t\ttemporalAACommandBuffer.name = $\"Scatterer TAA CommandBuffer for {targetCamera.name}\";\n\t}\n\n\t\tinternal DepthTextureMode GetCameraFlags()\n\t\t{\n\t\t\treturn DepthTextureMode.Depth | DepthTextureMode.MotionVectors;\n        }\n        \n        internal void ResetHistory()\n        {\n            m_ResetHistory = true;\n        }\n        \n        Vector2 GenerateRandomOffset()\n        {\n            // The variance between 0 and the actual halton sequence values reveals noticeable instability\n            // in Unity's shadow maps, so we avoid index 0.\n            var offset = new Vector2(\n                HaltonSeq.Get((sampleIndex & 1023) + 1, 2) - 0.5f,\n                HaltonSeq.Get((sampleIndex & 1023) + 1, 3) - 0.5f\n                );\n            \n            if (++sampleIndex >= k_SampleCount)\n                sampleIndex = 0;\n            \n            return offset;\n        }\n\n\t\tprivate static class RuntimeUtilities\n\t\t{\n\t\t/// Gets a jittered perspective projection matrix for a given camera.\n\t\tpublic static Matrix4x4 GetJitteredPerspectiveProjectionMatrix(Camera camera, Vector2 offset)\n\t\t{\n\t\t\tfloat near = camera.nearClipPlane;\n\t\t\tfloat far = camera.farClipPlane;\n\t\t\t\n\t\t\tfloat vertical = Mathf.Tan(0.5f * Mathf.Deg2Rad * camera.fieldOfView) * near;\n\t\t\tfloat horizontal = vertical * camera.aspect;\n\t\t\t\n\t\t\toffset.x *= horizontal / (0.5f * camera.pixelWidth);\n\t\t\toffset.y *= vertical / (0.5f * camera.pixelHeight);\n\t\t\t\n\t\t\tvar matrix = camera.projectionMatrix;\n\t\t\t\n\t\t\tmatrix[0, 2] += offset.x / horizontal;\n\t\t\tmatrix[1, 2] += offset.y / vertical;\n\t\t\t\n\t\t\treturn matrix;\n\t\t}\n\t\t\n\t\t\tpublic static Matrix4x4 GetJitteredOrthographicProjectionMatrix(Camera camera, Vector2 offset)\n\t\t\t{\n\t\t\t\tfloat vertical = camera.orthographicSize;\n\t\t\t\tfloat horizontal = vertical * camera.aspect;\n\n\t\t\t\toffset.x *= horizontal / (0.5f * camera.pixelWidth);\n\t\t\t\toffset.y *= vertical / (0.5f * camera.pixelHeight);\n\n\t\t\t\tfloat left = offset.x - horizontal;\n\t\t\t\tfloat right = offset.x + horizontal;\n\t\t\t\tfloat top = offset.y + vertical;\n\t\t\t\tfloat bottom = offset.y - vertical;\n\n\t\t\t\treturn Matrix4x4.Ortho(left, right, bottom, top, camera.nearClipPlane, camera.farClipPlane);\n\t\t\t}\n\n\t\t\tpublic static Matrix4x4 GenerateJitteredProjectionMatrixFromOriginal(int screenWidth, int screenHeight, Matrix4x4 origProj, Vector2 jitter)\n\t\t\t{\n\t\t\t\tvar planes = origProj.decomposeProjection;\n\n\t\t\t\tfloat vertFov = Mathf.Abs(planes.top) + Mathf.Abs(planes.bottom);\n\t\t\t\tfloat horizFov = Mathf.Abs(planes.left) + Mathf.Abs(planes.right);\n\n\t\t\t\tvar planeJitter = new Vector2(jitter.x * horizFov / screenWidth,\n\t\t\t\t\tjitter.y * vertFov / screenHeight);\n\n\t\t\t\tplanes.left += planeJitter.x;\n\t\t\t\tplanes.right += planeJitter.x;\n\t\t\t\tplanes.top += planeJitter.y;\n\t\t\t\tplanes.bottom += planeJitter.y;\n\n\t\t\t\tvar jitteredMatrix = Matrix4x4.Frustum(planes);\n\n\t\t\t\treturn jitteredMatrix;\n\t\t\t}\n\t\t}\n\t\t\n\t\t/// Generates a jittered projection matrix for a given camera.\n\t\tpublic Matrix4x4 GetJitteredProjectionMatrix(Camera camera)\n\t\t{\n\t\t\tMatrix4x4 cameraProj;\n\t\t\tjitter = GenerateRandomOffset();\n\t\t\tjitter *= jitterSpread;\n\n\t\t\tcameraProj = camera.orthographic\n\t\t\t\t? RuntimeUtilities.GetJitteredOrthographicProjectionMatrix(camera, jitter)\n\t\t\t\t: RuntimeUtilities.GetJitteredPerspectiveProjectionMatrix(camera, jitter);\n\n\t\t\tjitter = new Vector2(jitter.x / camera.pixelWidth, jitter.y / camera.pixelHeight);\n\t\t\treturn cameraProj;\n\t\t}\n\t\t\n\t\t\n\t\t/// Prepares the jittered and non jittered projection matrices\n\t\tpublic void ConfigureJitteredProjectionMatrix(Camera camera)\n\t\t{\n\t\t\t// camera.nonJitteredProjectionMatrix = camera.projectionMatrix; // should this be here?  it's in the stock postprocess code\n\t\t\tcamera.projectionMatrix = GetJitteredProjectionMatrix(camera);\n\t\t\tcamera.useJitteredProjectionMatrixForTransparentRendering = jitterTransparencies;\n\t\t}\n\n\t\tpublic void ConfigureStereoJitteredProjectionMatrices(Camera camera)\n\t\t{\n            jitter = GenerateRandomOffset();\n            jitter *= jitterSpread;\n\n\t\t\t// see PostProcessRenderContext.camera set property\n\t\t\tint screenWidth, screenHeight;\n\t\t\tif (camera.stereoEnabled)\n\t\t\t{\n\t\t\t\tscreenWidth = XRSettings.eyeTextureWidth;\n\t\t\t\tscreenHeight = XRSettings.eyeTextureHeight;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tscreenWidth = camera.pixelWidth;\n\t\t\t\tscreenHeight = camera.pixelHeight;\n\t\t\t}\n\n            for (var eye = Camera.StereoscopicEye.Left; eye <= Camera.StereoscopicEye.Right; eye++)\n            {\n                // This saves off the device generated projection matrices as non-jittered\n                camera.CopyStereoDeviceProjectionMatrixToNonJittered(eye);\n                var originalProj = camera.GetStereoNonJitteredProjectionMatrix(eye);\n\n                // Currently no support for custom jitter func, as VR devices would need to provide\n                // original projection matrix as input along with jitter\n                var jitteredMatrix = RuntimeUtilities.GenerateJitteredProjectionMatrixFromOriginal(screenWidth, screenHeight, originalProj, jitter);\n                camera.SetStereoProjectionMatrix(eye, jitteredMatrix);\n            }\n\n            // jitter has to be scaled for the actual eye texture size, not just the intermediate texture size\n            // which could be double-wide in certain stereo rendering scenarios\n            jitter = new Vector2(jitter.x / screenWidth, jitter.y / screenHeight);\n            camera.useJitteredProjectionMatrixForTransparentRendering = jitterTransparencies;\n\t\t}\n\t\t\n\t\tRenderTexture CheckHistory(int id, CommandBuffer cmd, int activeEye)\n\t\t{\t\n\t\t\tif (historyTextures[activeEye] == null)\n\t\t\t\thistoryTextures[activeEye] = new RenderTexture[historyTexturesCount];\n\n\t\t\tif (hdrEnabled != targetCamera.allowHDR)\n\t\t\t\tResetHistory();\n\n\t\t\tvar historyRT = historyTextures[activeEye][id];\n\t\t\t\n\t\t\tif (m_ResetHistory || historyRT == null || !historyRT.IsCreated())\n\t\t\t{\n\t\t\t\tRenderTexture.ReleaseTemporary(historyRT);\n\n\t\t\t\tint width, height;\n\t\t\t\t\n\t\t\t\tif (targetCamera.activeTexture)\n\t\t\t\t{\n\t\t\t\t\twidth = targetCamera.activeTexture.width;\n\t\t\t\t\theight = targetCamera.activeTexture.height;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\twidth = Screen.width;\n\t\t\t\t\theight = Screen.height;\n\t\t\t\t}\n\n\t\t\t\thdrEnabled = targetCamera.allowHDR;\n\n\t\t\t\thistoryRT = RenderTexture.GetTemporary (width, height, 0, hdrEnabled ? RenderTextureFormat.DefaultHDR : RenderTextureFormat.ARGB32);\n\t\t\t\thistoryRT.name = \"Temporal Anti-aliasing History id #\" + id;\n\t\t\t\t\n\t\t\t\thistoryRT.filterMode = FilterMode.Bilinear;\n\t\t\t\thistoryTextures[activeEye][id] = historyRT;\n\n\t\t\t\tcmd.Blit(BuiltinRenderTextureType.CameraTarget, historyRT);\n\t\t\t}\n\t\t\t\n\t\t\treturn historyTextures[activeEye][id];\n\t\t}\n\t\t\n\t\t//adapted from the original render() method\n\t\tpublic void OnPreCull()\n\t\t{\n\t\t\tbool screenShotModeEnabled = GameSettings.TAKE_SCREENSHOT.GetKeyDown(false);\n\n\t\t\tfloat currentFps = 1.0f / Time.deltaTime;\n\t\t\tbool aboveFpsThreshold = currentFps >= Scatterer.Instance.mainSettings.disableTaaBelowFrameRateThreshold\n\t\t\t\t|| !Scatterer.Instance.mainSettings.useSubpixelMorphologicalAntialiasing;\n\n\t\t\tif (!screenShotModeEnabled && aboveFpsThreshold)\n\t\t\t{ \n\t\t\t\ttemporalAACommandBuffer.Clear();\n\n\t\t\t\tint activeEye = targetCamera.stereoActiveEye == Camera.MonoOrStereoscopicEye.Right ? 1 : 0;\n\n\t\t\t\tint pingPongIndex = m_HistoryPingPong[activeEye];\n\t\t\t\tRenderTexture historyRead = CheckHistory(++pingPongIndex % 2, temporalAACommandBuffer, activeEye);\n\t\t\t\tRenderTexture historyWrite = CheckHistory(++pingPongIndex % 2, temporalAACommandBuffer, activeEye);\n\t\t\t\tm_HistoryPingPong[activeEye] = ++pingPongIndex % 2;\n\n\t\t\t\tif (firstFrame)\n                {\n\t\t\t\t\ttemporalAACommandBuffer.Blit(BuiltinRenderTextureType.CameraTarget, historyWrite);\n\t\t\t\t}\n\t\t\t\telse\n                {\n\t\t\t\t\tConfigureJitteredProjectionMatrix(targetCamera);\n\n\t\t\t\t\t//TODO: move to shader properties\n\t\t\t\t\tif (checkOceanDepth)\n\t\t\t\t\t\tUtils.EnableOrDisableShaderKeywords(temporalAAMaterial, \"CUSTOM_OCEAN_ON\", \"CUSTOM_OCEAN_OFF\", Scatterer.Instance.scattererCelestialBodiesManager.isCustomOceanEnabledOnScattererPlanet);\n\n\t\t\t\t\ttemporalAAMaterial.SetTexture(ShaderProperties._HistoryTex_PROPERTY, historyRead);\n\n\t\t\t\t\tint pass = (int)Pass.SolverDilate;\n\n\t\t\t\t\ttemporalAACommandBuffer.SetGlobalTexture(ShaderProperties._ScreenColor_PROPERTY, BuiltinRenderTextureType.CameraTarget);\n\t\t\t\t\ttemporalAACommandBuffer.Blit(null, historyWrite, temporalAAMaterial, pass);\n\n\t\t\t\t\ttemporalAACommandBuffer.Blit(historyWrite, BuiltinRenderTextureType.CameraTarget);\n\t\t\t\t}\n\n\t\t\t\ttargetCamera.AddCommandBuffer (TAACameraEvent, temporalAACommandBuffer);\n\n\t\t\t\tm_ResetHistory = false;\n\t\t\t\tfirstFrame = false;\n\n\t\t\t\tif (resetMotionVectors)\n\t\t\t\t{\n\t\t\t\t\tShader.SetGlobalInt(keepPreviousMotionVectorsProperty, 0);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n                    Shader.SetGlobalInt(keepPreviousMotionVectorsProperty, 1);\n                }\n\t\t\t}\n\t\t\telse\n            {\n\t\t\t\tfirstFrame = true;\n\t\t\t}\n\t\t}\n\n\t\tpublic void OnPostRender()\n\t\t{\n\t\t\tResetProjection();\n\t\t\ttargetCamera.RemoveCommandBuffer (TAACameraEvent, temporalAACommandBuffer);\n\t\t}\n\n\t\t// This is needed otherwise transparencies jitter\n\t\tpublic void ResetProjection()\n        {\n\t\t\ttargetCamera.ResetProjectionMatrix();\n\t\t\ttargetCamera.nonJitteredProjectionMatrix = targetCamera.projectionMatrix;\n\t\t}\n\n\t\tpublic void OnDestroy()\n\t\t{\n\t\t\tif (temporalAACommandBuffer != null)\n\t\t\t\ttargetCamera.RemoveCommandBuffer (TAACameraEvent, temporalAACommandBuffer);\n\n\t\t\ttargetCamera.depthTextureMode = originalDepthTextureMode;\n\n\t\t\tif (historyTextures != null)\n\t\t\t{\n\t\t\t\tfor (int i = 0; i < historyTextures.Length; i++)\n\t\t\t\t{\n\t\t\t\t\tif (historyTextures[i] == null)\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tfor (int j = 0; j < historyTextures[i].Length; j++)\n\t\t\t\t\t{\n\t\t\t\t\t\tRenderTexture.ReleaseTemporary(historyTextures[i][j]);\n\t\t\t\t\t\thistoryTextures[i][j] = null;\n\t\t\t\t\t}\n\t\t\t\t\thistoryTextures[i] = null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsampleIndex = 0;\n\t\t\tm_HistoryPingPong[0] = 0;\n\t\t\tm_HistoryPingPong[1] = 1;\n\n\t\t\tResetHistory();\n\n\t\t\ttargetCamera.ResetProjectionMatrix();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "scatterer/Effects/AntiAliasing/Utils/HaltonSeq.cs",
    "content": "namespace Scatterer\r\n{\r\n\t/// Halton sequence utility from unity post-processing stack V2\r\n\tpublic static class HaltonSeq\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// Gets a value from the Halton sequence for a given index and radix.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"index\">The sequence index</param>\r\n\t\t/// <param name=\"radix\">The sequence base</param>\r\n\t\t/// <returns>A number from the Halton sequence between 0 and 1.</returns>\r\n\t\tpublic static float Get(int index, int radix)\r\n\t\t{\r\n\t\t\tfloat result = 0f;\r\n\t\t\tfloat fraction = 1f / (float)radix;\r\n\t\t\t\r\n\t\t\twhile (index > 0)\r\n\t\t\t{\r\n\t\t\t\tresult += (float)(index % radix) * fraction;\r\n\t\t\t\t\r\n\t\t\t\tindex /= radix;\r\n\t\t\t\tfraction /= (float)radix;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\treturn result;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "scatterer/Effects/PlanetShine/PlanetShineLight.cs",
    "content": "using System;\r\nusing UnityEngine;\r\nnamespace Scatterer\r\n{\r\n\tpublic class PlanetShineLight : MonoBehaviour\r\n\t{\r\n\t\tpublic GameObject scaledLight, localLight;\r\n\t\tpublic bool isSun;\r\n\t\tpublic CelestialBody source, sunCelestialBody;\r\n\r\n\t\tpublic void updateLight()\r\n\t\t{\r\n\t\t\tscaledLight.gameObject.transform.position=ScaledSpace.LocalToScaledSpace(source.transform.position);\t\t\t\t\t\t\r\n\t\t\tlocalLight.gameObject.transform.position=(source.transform.position);\r\n\r\n\t\t\tif (!isSun)\r\n\t\t\t{\r\n\t\t\t\tlocalLight.gameObject.transform.LookAt(sunCelestialBody.transform.position);\r\n\t\t\t\tscaledLight.gameObject.transform.LookAt (ScaledSpace.LocalToScaledSpace (sunCelestialBody.transform.position));\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void OnDestroy()\r\n\t\t{\r\n\t\t\tUnityEngine.Object.Destroy (scaledLight);\r\n\t\t\tUnityEngine.Object.Destroy (localLight);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/Effects/PlanetShine/PlanetshineManager.cs",
    "content": "using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing UnityEngine;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class PlanetshineManager\r\n\t{\r\n\t\tList<PlanetShineLight> celestialLightSources=new List<PlanetShineLight> {};\r\n\t\tCubemap planetShineCookieCubeMap;\r\n\r\n\t\tpublic PlanetshineManager ()\r\n\t\t{\r\n\t\t\t//load planetshine \"cookie\" cubemap\r\n\t\t\tplanetShineCookieCubeMap = new Cubemap (512, TextureFormat.ARGB32, true);\r\n\t\t\tTexture2D[] cubeMapFaces = new Texture2D[6];\r\n\t\t\tfor (int i = 0; i < 6; i++) {\r\n\t\t\t\tcubeMapFaces [i] = new Texture2D (512, 512);\r\n\t\t\t}\r\n\t\t\tcubeMapFaces [0].LoadImage (System.IO.File.ReadAllBytes (String.Format (\"{0}/{1}\", Utils.PluginPath + \"/planetShineCubemap\", \"_NegativeX.png\")));\r\n\t\t\tcubeMapFaces [1].LoadImage (System.IO.File.ReadAllBytes (String.Format (\"{0}/{1}\", Utils.PluginPath + \"/planetShineCubemap\", \"_PositiveX.png\")));\r\n\t\t\tcubeMapFaces [2].LoadImage (System.IO.File.ReadAllBytes (String.Format (\"{0}/{1}\", Utils.PluginPath + \"/planetShineCubemap\", \"_NegativeY.png\")));\r\n\t\t\tcubeMapFaces [3].LoadImage (System.IO.File.ReadAllBytes (String.Format (\"{0}/{1}\", Utils.PluginPath + \"/planetShineCubemap\", \"_PositiveY.png\")));\r\n\t\t\tcubeMapFaces [4].LoadImage (System.IO.File.ReadAllBytes (String.Format (\"{0}/{1}\", Utils.PluginPath + \"/planetShineCubemap\", \"_NegativeZ.png\")));\r\n\t\t\tcubeMapFaces [5].LoadImage (System.IO.File.ReadAllBytes (String.Format (\"{0}/{1}\", Utils.PluginPath + \"/planetShineCubemap\", \"_PositiveZ.png\")));\r\n\t\t\tplanetShineCookieCubeMap.SetPixels (cubeMapFaces [0].GetPixels (), CubemapFace.NegativeX);\r\n\t\t\tplanetShineCookieCubeMap.SetPixels (cubeMapFaces [1].GetPixels (), CubemapFace.PositiveX);\r\n\t\t\tplanetShineCookieCubeMap.SetPixels (cubeMapFaces [2].GetPixels (), CubemapFace.NegativeY);\r\n\t\t\tplanetShineCookieCubeMap.SetPixels (cubeMapFaces [3].GetPixels (), CubemapFace.PositiveY);\r\n\t\t\tplanetShineCookieCubeMap.SetPixels (cubeMapFaces [4].GetPixels (), CubemapFace.NegativeZ);\r\n\t\t\tplanetShineCookieCubeMap.SetPixels (cubeMapFaces [5].GetPixels (), CubemapFace.PositiveZ);\r\n\t\t\tplanetShineCookieCubeMap.Apply ();\r\n\t\t\t\r\n\t\t\t\r\n\t\t\tforeach (PlanetShineLightSource _aSource in Scatterer.Instance.planetsConfigsReader.celestialLightSourcesData)\r\n\t\t\t{\r\n\t\t\t\tvar celBody = FlightGlobals.Bodies.SingleOrDefault (_cb => _cb.bodyName == _aSource.bodyName);\r\n\t\t\t\tif (celBody)\r\n\t\t\t\t{\r\n\t\t\t\t\tPlanetShineLight aPsLight = new PlanetShineLight ();\r\n\t\t\t\t\taPsLight.isSun = _aSource.isSun;\r\n\t\t\t\t\taPsLight.source = celBody;\r\n\t\t\t\t\tif (!_aSource.isSun)\r\n\t\t\t\t\t\taPsLight.sunCelestialBody = FlightGlobals.Bodies.SingleOrDefault (_cb => _cb.GetName () == _aSource.mainSunCelestialBody);\r\n\t\t\t\t\t// GameObject ScaledPlanetShineLight = (UnityEngine.GameObject)Instantiate (Scatterer.Instance.scaledSpaceSunLight.gameObject);\r\n\t\t\t\t\t// GameObject LocalPlanetShineLight = (UnityEngine.GameObject)Instantiate (Scatterer.Instance.scaledSpaceSunLight.gameObject);\r\n\r\n\t\t\t\t\t//TODO: fix this if I ever come back to it\r\n\t\t\t\t\tGameObject ScaledPlanetShineLight = new GameObject();\r\n\t\t\t\t\tGameObject LocalPlanetShineLight = new GameObject();\r\n\t\t\t\t\tScaledPlanetShineLight.GetComponent<Light> ().type = LightType.Point;\r\n\t\t\t\t\tif (!_aSource.isSun)\r\n\t\t\t\t\t\tScaledPlanetShineLight.GetComponent<Light> ().cookie = planetShineCookieCubeMap;\r\n\t\t\t\t\t//ScaledPlanetShineLight.GetComponent<Light>().range=1E9f;\r\n\t\t\t\t\tScaledPlanetShineLight.GetComponent<Light> ().range = _aSource.scaledRange;\r\n\t\t\t\t\tScaledPlanetShineLight.GetComponent<Light> ().color = new Color (_aSource.color.x, _aSource.color.y, _aSource.color.z);\r\n\t\t\t\t\tScaledPlanetShineLight.name = celBody.name + \"PlanetShineLight(ScaledSpace)\";\r\n\t\t\t\t\tLocalPlanetShineLight.GetComponent<Light> ().type = LightType.Point;\r\n\t\t\t\t\tif (!_aSource.isSun)\r\n\t\t\t\t\t\tLocalPlanetShineLight.GetComponent<Light> ().cookie = planetShineCookieCubeMap;\r\n\t\t\t\t\t//LocalPlanetShineLight.GetComponent<Light>().range=1E9f;\r\n\t\t\t\t\tLocalPlanetShineLight.GetComponent<Light> ().range = _aSource.scaledRange * ScaledSpace.ScaleFactor;\r\n\t\t\t\t\tLocalPlanetShineLight.GetComponent<Light> ().color = new Color (_aSource.color.x, _aSource.color.y, _aSource.color.z);\r\n\t\t\t\t\tLocalPlanetShineLight.GetComponent<Light> ().cullingMask = 557591;\r\n\t\t\t\t\tLocalPlanetShineLight.GetComponent<Light> ().shadows = LightShadows.Soft;\r\n\t\t\t\t\tLocalPlanetShineLight.GetComponent<Light> ().shadowCustomResolution = 2048;\r\n\t\t\t\t\tLocalPlanetShineLight.name = celBody.name + \"PlanetShineLight(LocalSpace)\";\r\n\t\t\t\t\taPsLight.scaledLight = ScaledPlanetShineLight;\r\n\t\t\t\t\taPsLight.localLight = LocalPlanetShineLight;\r\n\t\t\t\t\tcelestialLightSources.Add (aPsLight);\r\n\t\t\t\t\tUtils.LogDebug (\"Added celestialLightSource \" + aPsLight.source.name);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void UpdatePlanetshine ()\r\n\t\t{\r\n\t\t\tforeach (PlanetShineLight _aLight in celestialLightSources)\r\n\t\t\t{\r\n\t\t\t\t_aLight.updateLight();\r\n\t\t\t\t\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void Cleanup()\r\n\t\t{\r\n\t\t\tforeach (PlanetShineLight _aLight in celestialLightSources)\r\n\t\t\t{\r\n\t\t\t\t_aLight.OnDestroy();\r\n\t\t\t\tUnityEngine.Object.Destroy(_aLight);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/Effects/Proland/Atmosphere/Godrays/LegacyGodraysRenderer.cs",
    "content": "using UnityEngine;\nusing UnityEngine.Rendering;\nusing System.Collections.Generic;\nusing System;\n\nnamespace Scatterer\n{\n\tpublic class LegacyGodraysRenderer : MonoBehaviour\n\t{\n\t\tSkyNode parentSkyNode;\n\t\tCamera targetCamera;\n\t\tLight targetLight;\n\n\t\tComputeBuffer inverseShadowMatricesBuffer;\n\t\tComputeShader inverseShadowMatricesComputeShader;\n\n\t\tCommandBuffer shadowVolumeCB;\n\t\tMaterial volumeDepthMaterial;\n\t\tGameObject volumeDepthGO;\n\t\tpublic RenderTexture volumeDepthTexture;\n\n//\t\tGameObject cloudShadowGO;\n//\t\tMeshRenderer cloudShadowMR;\n//\t\tDictionary<ShadowMapPass, List<CommandBuffer>> shadowRenderCommandBuffers = new Dictionary<ShadowMapPass, List<CommandBuffer>> ();\n//\t\tList<Tuple<EVEClouds2d,Material>> cloudsShadowsMaterials = new List<Tuple<EVEClouds2d, Material>>();\n//\t\tRenderTexture cloudShadowMap;\n//\t\tCommandBuffer clearShadowMapCB;\n\n\t\tbool commandBufferAdded = false;\n\t\t\n\t\tpublic LegacyGodraysRenderer ()\n\t\t{\n\n\t\t}\n\n\t\tpublic bool Init(Light inputLight, SkyNode inputParentSkyNode)\n\t\t{\n\t\t\tif (!SystemInfo.supportsComputeShaders)\n\t\t\t{\n\t\t\t\tUtils.LogError(\"Compute shaders not supported, godrays can't be added\");\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (ShaderReplacer.Instance.LoadedComputeShaders.ContainsKey (\"ComputeInverseShadowMatrices\"))\n\t\t\t{\n\t\t\t\tinverseShadowMatricesComputeShader = ShaderReplacer.Instance.LoadedComputeShaders [\"ComputeInverseShadowMatrices\"];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tUtils.LogError(\"Godrays inverse shadow matrices compute shader can't be found, godrays can't be added\");\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (ShaderReplacer.Instance.LoadedShaders.ContainsKey (\"Scatterer/VolumeDepth\"))\n\t\t\t{\n\t\t\t\tvolumeDepthMaterial = new Material(ShaderReplacer.Instance.LoadedShaders [\"Scatterer/VolumeDepth\"]);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tUtils.LogError(\"Godrays depth shader can't be found, godrays can't be added\");\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (!inputLight)\n\t\t\t{\n\t\t\t\tUtils.LogError(\"Godrays light is null, godrays can't be added\");\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\ttargetLight = inputLight;\n\t\t\tparentSkyNode = inputParentSkyNode;\n\n\t\t\tUtils.EnableOrDisableShaderKeywords (volumeDepthMaterial, \"OCEAN_INTERSECT_ANALYTICAL\", \"OCEAN_INTERSECT_OFF\", parentSkyNode.prolandManager.hasOcean && Scatterer.Instance.mainSettings.useOceanShaders);\n\t\t\tvolumeDepthMaterial.SetFloat (\"Rt\", parentSkyNode.Rt);\n\t\t\tvolumeDepthMaterial.SetFloat (\"Rg\", parentSkyNode.Rg);\n\t\t\tUtils.EnableOrDisableShaderKeywords(volumeDepthMaterial, \"CLOUDSMAP_ON\", \"CLOUDSMAP_OFF\", false);\n\t\t\t//Utils.EnableOrDisableShaderKeywords(volumeDepthMaterial, \"DOWNSCALE_DEPTH_ON\", \"DOWNSCALE_DEPTH_OFF\", Scatterer.Instance.mainSettings.quarterResScattering);\n\t\t\tUtils.EnableOrDisableShaderKeywords(volumeDepthMaterial, \"DOWNSCALE_DEPTH_ON\", \"DOWNSCALE_DEPTH_OFF\", false);\n\n\n\t\t\tvolumeDepthGO = new GameObject (\"GodraysVolumeDepth \"+inputParentSkyNode.prolandManager.parentCelestialBody.name);\n\t\t\tvolumeDepthMaterial.renderQueue = 2999; //for debugging only\n\t\t\tvolumeDepthGO.layer = 15;\n\n\t\t\tMeshFilter _mf = volumeDepthGO.AddComponent<MeshFilter> ();\n\t\t\t_mf.mesh.Clear ();\t\t\t\n\t\t\t_mf.mesh = MeshFactory.MakePlane32BitIndexFormat (512, 512, MeshFactory.PLANE.XY, false, false); //fixed with 32bit indices\n\t\t\t\t//_mf.mesh = MeshFactory.MakePlane16BitIndexFormat (256, 256, MeshFactory.PLANE.XY, false, false); //Definitely need to subdivide more here and in the tesselation check edge length and culling\t\t\t\n\t\t\t_mf.mesh.bounds = new Bounds (Vector4.zero, new Vector3 (1e18f, 1e18f, 1e18f)); //apparently mathf.Infinity is bad, remember this\n\t\t\t\n\t\t\tMeshRenderer _mr = volumeDepthGO.AddComponent<MeshRenderer> ();\n\t\t\t_mr.material = volumeDepthMaterial;\n\t\t\t_mr.receiveShadows = false;\n\t\t\t_mr.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;\n\t\t\t_mr.enabled = false;\n\n\t\t\t//disabled quarter res because I haven't fixed it for the sky and probably the perf hit from finding nearest depth in sky shader isn't worth it\n//\t\t\tif (Scatterer.Instance.mainSettings.quarterResScattering)\n//\t\t\t\tvolumeDepthTexture = new RenderTexture (Screen.width / 2, Screen.height / 2, 0, RenderTextureFormat.RHalf);\n//\t\t\telse\n\t\t\t\tvolumeDepthTexture = new RenderTexture (Screen.width, Screen.height, 0, RenderTextureFormat.RHalf); //seems to work if we divide the contents by 100, to keep under half's 65000 limit\n\n\t\t\tvolumeDepthTexture.useMipMap = false;\n\t\t\tvolumeDepthTexture.antiAliasing = 1;\n\t\t\tvolumeDepthTexture.filterMode = FilterMode.Point;\n\t\t\tvolumeDepthTexture.Create ();\n\n//\t\t\tif (Scatterer.Instance.mainSettings.integrateEVECloudsGodrays)\n//\t\t\t{\n//\t\t\t\tInitCloudShadowCommandBuffers ();\n//\t\t\t}\n\n\t\t\t//world to shadow matrices aren't exposed in the C# api so we can't compute the shadow to world matrices from them\n\t\t\t//since they are exposed in shaders we use a compute shader to do it\n\t\t\tinverseShadowMatricesBuffer = new ComputeBuffer (4, 16 * sizeof(float));\n\n            shadowVolumeCB = new CommandBuffer();\n            shadowVolumeCB.name = \"Scatterer legacy godrays CommandBuffer\";\n            shadowVolumeCB.SetComputeBufferParam (inverseShadowMatricesComputeShader, 0, \"resultBuffer\", inverseShadowMatricesBuffer);\n            shadowVolumeCB.DispatchCompute(inverseShadowMatricesComputeShader, 0, 4, 1, 1);\n\n\t\t\tshadowVolumeCB.SetRenderTarget(volumeDepthTexture);\n\t\t\t//shadowVolumeCB.ClearRenderTarget(false, true, Color.black, 1f); //do this after rendering\n\t\t\tshadowVolumeCB.SetShadowSamplingMode (ShadowMapCopy.RenderTexture, ShadowSamplingMode.RawDepth);\n\n\t\t\tshadowVolumeCB.DrawRenderer (_mr, volumeDepthMaterial);\n\n\t\t\ttargetCamera = gameObject.GetComponent<Camera> ();\n\n\t\t\treturn true;\n\t\t}\n\n//\t\tvoid InitCloudShadowCommandBuffers ()\n//\t\t{\n//\t\t\tif (Scatterer.Instance.eveReflectionHandler.EVEClouds2dDictionary.ContainsKey (parentSkyNode.prolandManager.parentCelestialBody.name))\n//\t\t\t{\n//\t\t\t\tforeach (EVEClouds2d clouds2d in Scatterer.Instance.eveReflectionHandler.EVEClouds2dDictionary [parentSkyNode.prolandManager.parentCelestialBody.name])\n//\t\t\t\t{\n//\t\t\t\t\tif (clouds2d.CloudShadowMaterial != null)\n//\t\t\t\t\t{\n//\t\t\t\t\t\tMaterial cloudShadowDepthMaterial = new Material (ShaderReplacer.Instance.LoadedShaders [\"Scatterer-EVE/CloudShadowMap\"]);\n//\t\t\t\t\t\tcloudShadowDepthMaterial.CopyKeywordsFrom (clouds2d.CloudShadowMaterial);\n//\t\t\t\t\t\tif (cloudShadowGO == null)\n//\t\t\t\t\t\t{\n//\t\t\t\t\t\t\tcloudShadowGO = GameObject.CreatePrimitive (PrimitiveType.Sphere);\n//\t\t\t\t\t\t\tGameObject.Destroy (cloudShadowGO.GetComponent<Collider> ());\n//\t\t\t\t\t\t\tMeshFilter cloudShadowMF = cloudShadowGO.GetComponent<MeshFilter> ();\n//\t\t\t\t\t\t\tcloudShadowMF.mesh.Clear ();\n//\t\t\t\t\t\t\tcloudShadowMF.mesh = IcoSphere.CreateIcoSphereMesh ();\n//\t\t\t\t\t\t\tcloudShadowMR = cloudShadowGO.GetComponent<MeshRenderer> ();\n//\t\t\t\t\t\t\tcloudShadowGO.transform.parent = parentSkyNode.prolandManager.parentCelestialBody.transform;\n//\t\t\t\t\t\t\tcloudShadowMR.receiveShadows = false;\n//\t\t\t\t\t\t\tcloudShadowMR.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;\n//\t\t\t\t\t\t\tcloudShadowMR.enabled = false;\n//\n//\t\t\t\t\t\t\tcloudShadowMap = new RenderTexture (2048, 2048, 0, RenderTextureFormat.RHalf); //replace size after\n//\t\t\t\t\t\t\tcloudShadowMap.useMipMap = false;\n//\t\t\t\t\t\t\tcloudShadowMap.antiAliasing = 1;\n//\t\t\t\t\t\t\tcloudShadowMap.filterMode = FilterMode.Point;\n//\t\t\t\t\t\t\tcloudShadowMap.Create ();\n//\n//\t\t\t\t\t\t\tclearShadowMapCB = new CommandBuffer();\n//\t\t\t\t\t\t\tclearShadowMapCB.SetRenderTarget(cloudShadowMap);\n//\t\t\t\t\t\t\tclearShadowMapCB.ClearRenderTarget(false,true,Color.black);\n//\n//\t\t\t\t\t\t\tshadowRenderCommandBuffers[ShadowMapPass.DirectionalCascade0] = new List<CommandBuffer>();\n//\t\t\t\t\t\t\tshadowRenderCommandBuffers[ShadowMapPass.DirectionalCascade0].Add(clearShadowMapCB);\n//\n//\t\t\t\t\t\t\tUtils.EnableOrDisableShaderKeywords(volumeDepthMaterial, \"CLOUDSMAP_ON\", \"CLOUDSMAP_OFF\", true);\n//\t\t\t\t\t\t\tvolumeDepthMaterial.SetTexture(\"cloudShadowMap\", cloudShadowMap);\n//\t\t\t\t\t\t}\n//\t\t\t\t\t\tRenderObjectInCustomCascade (targetLight, cloudShadowMap, cloudShadowMR, cloudShadowDepthMaterial, ShadowMapPass.DirectionalCascade0, 0f, 0f, 0.5f, 0.5f);\n//\t\t\t\t\t\tRenderObjectInCustomCascade (targetLight, cloudShadowMap, cloudShadowMR, cloudShadowDepthMaterial, ShadowMapPass.DirectionalCascade1, 0.5f, 0f, 0.5f, 0.5f);\n//\t\t\t\t\t\tRenderObjectInCustomCascade (targetLight, cloudShadowMap, cloudShadowMR, cloudShadowDepthMaterial, ShadowMapPass.DirectionalCascade2, 0f, 0.5f, 0.5f, 0.5f);\n//\t\t\t\t\t\tRenderObjectInCustomCascade (targetLight, cloudShadowMap, cloudShadowMR, cloudShadowDepthMaterial, ShadowMapPass.DirectionalCascade3, 0.5f, 0.5f, 0.5f, 0.5f);\n//\n//\t\t\t\t\t\tcloudsShadowsMaterials.Add (new Tuple<EVEClouds2d, Material> (clouds2d, cloudShadowDepthMaterial));\n//\t\t\t\t\t}\n//\t\t\t\t}\n//\t\t\t}\n//\t\t}\n\t\t\n//\t\tvoid RenderObjectInCustomCascade(Light targetLight, RenderTexture rt, MeshRenderer mr, Material mat , ShadowMapPass passMask, float startX, float startY, float width, float height)\n//\t\t{\n//\t\t\tCommandBuffer cloudShadowDepthCB = new CommandBuffer();\n//\t\t\tRect cascadeRect = new Rect ((int)(startX * rt.width), (int)(startY * rt.height), (int)(width * rt.width), (int)(height * rt.height));\n//\n//\t\t\tcloudShadowDepthCB.SetRenderTarget(rt);\n//\t\t\tcloudShadowDepthCB.EnableScissorRect(cascadeRect);\n//\t\t\tcloudShadowDepthCB.SetViewport(cascadeRect);\n//\t\t\tcloudShadowDepthCB.DrawRenderer(mr, mat);\n//\t\t\tcloudShadowDepthCB.DisableScissorRect();\n//\n//\t\t\tif (shadowRenderCommandBuffers.ContainsKey (passMask))\n//\t\t\t{\n//\t\t\t\tshadowRenderCommandBuffers[passMask].Add(cloudShadowDepthCB);\n//\t\t\t}\n//\t\t\telse\n//\t\t\t{\n//\t\t\t\tshadowRenderCommandBuffers[passMask] = new List<CommandBuffer>();\n//\t\t\t\tshadowRenderCommandBuffers[passMask].Add(cloudShadowDepthCB);\n//\t\t\t}\n//\t\t}\n\n\t\tpublic void EnableRenderingForFrame()\n\t\t{\n\t\t\tif (!commandBufferAdded)\n\t\t\t{\n\t\t\t\tShadowMapCopier.RequestShadowMapCopy(targetLight);\n\n\t\t\t\ttargetCamera.AddCommandBuffer (CameraEvent.BeforeForwardOpaque, shadowVolumeCB);\n\n//\t\t\t\tforeach (ShadowMapPass pass in shadowRenderCommandBuffers.Keys)\n//\t\t\t\t{\n//\t\t\t\t\tforeach (CommandBuffer cb in shadowRenderCommandBuffers[pass])\n//\t\t\t\t\t{\n//\t\t\t\t\t\ttargetLight.AddCommandBuffer (LightEvent.AfterShadowMapPass, cb, pass);\n//\t\t\t\t\t}\n//\t\t\t\t}\n\n\t\t\t\tcommandBufferAdded = true;\n\t\t\t}\n\t\t}\n\n\t\tpublic void RenderingDone()\n\t\t{\n\t\t\tif (commandBufferAdded && targetCamera.stereoActiveEye != Camera.MonoOrStereoscopicEye.Left)\n\t\t\t{\n\t\t\t\ttargetCamera.RemoveCommandBuffer (CameraEvent.BeforeForwardOpaque, shadowVolumeCB);\n\n//\t\t\t\tforeach (ShadowMapPass pass in shadowRenderCommandBuffers.Keys) {\n//\t\t\t\t\tforeach (CommandBuffer cb in shadowRenderCommandBuffers[pass]) {\n//\t\t\t\t\t\ttargetLight.RemoveCommandBuffer (LightEvent.AfterShadowMapPass, cb);\n//\t\t\t\t\t}\n//\t\t\t\t}\n\n\t\t\t\tRenderTexture rt=RenderTexture.active;\n\t\t\t\tRenderTexture.active= volumeDepthTexture;\n\t\t\t\tGL.Clear(false,true,Color.black, 1f);\n\t\t\t\tRenderTexture.active=rt;\n\n\t\t\t\tcommandBufferAdded = false;\n\t\t\t}\n\n\t\t}\n\n\t\tvoid OnPreCull()\n\t\t{\n\t\t\tif (parentSkyNode && !parentSkyNode.inScaledSpace)\n\t\t\t{\n\t\t\t\tEnableRenderingForFrame();\n\n\t\t\t\tvolumeDepthMaterial.SetMatrix(ShaderProperties.CameraToWorld_PROPERTY, targetCamera.cameraToWorldMatrix);\n\t\t\t\tvolumeDepthMaterial.SetTexture(ShaderProperties._ShadowMapTextureCopyScatterer_PROPERTY, ShadowMapCopy.RenderTexture);\n\t\t\t\tvolumeDepthMaterial.SetBuffer(\"inverseShadowMatricesBuffer\", inverseShadowMatricesBuffer);\n\n\t\t\t\t//Calculate light's bounding Box englobing camera's frustum up to the shadows distance\n\t\t\t\t//The idea is to create a \"projector\" from the light's PoV, which is essentially a bounding box cover the whole range from near clip plance to the shadows, so we can project into the scene\n\t\t\t\tVector3 lightDirForward = targetLight.transform.forward.normalized;\n\t\t\t\tVector3 lightDirRight = targetLight.transform.right.normalized;\n\t\t\t\tVector3 lightDirUp = targetLight.transform.up.normalized;\n\t\t\t\t\n\t\t\t\tVector3[] frustumCornersNear = new Vector3[4];\n\t\t\t\tVector3[] frustumCornersFar = new Vector3[4];\n\t\t\t\t\n\t\t\t\t//the corners appear to be in camera Space even though the documentation says in world Space\n\t\t\t\ttargetCamera.CalculateFrustumCorners(new Rect(0, 0, 1, 1), targetCamera.nearClipPlane, Camera.MonoOrStereoscopicEye.Mono, frustumCornersNear);\n\t\t\t\ttargetCamera.CalculateFrustumCorners(new Rect(0, 0, 1, 1), QualitySettings.shadowDistance, Camera.MonoOrStereoscopicEye.Mono, frustumCornersFar);\n\n\t\t\t\t//Kopernicus lights have the same position as their suns, so they are impossibly far, replace their position with something closer to get a useable matrix\n\t\t\t\tMatrix4x4 worldToLocalMatrix = parentSkyNode.prolandManager.mainSunLight.transform.worldToLocalMatrix;\n\t\t\t\tworldToLocalMatrix.m03 = Scatterer.Instance.nearCamera.transform.position.x;\n\t\t\t\tworldToLocalMatrix.m13 = Scatterer.Instance.nearCamera.transform.position.y;\n\t\t\t\tworldToLocalMatrix.m23 = Scatterer.Instance.nearCamera.transform.position.z;\n\n\n\t\t\t\t//now, calculate the corners positions in light Space\n\t\t\t\tList<Vector3> frustumCornersInLightSpace = new List<Vector3>();\n\t\t\t\t\n\t\t\t\tforeach(Vector3 corner in frustumCornersNear)\n\t\t\t\t{\n\t\t\t\t\tfrustumCornersInLightSpace.Add(worldToLocalMatrix.MultiplyPoint(targetCamera.transform.localToWorldMatrix.MultiplyPoint(corner)));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tforeach(Vector3 corner in frustumCornersFar)\n\t\t\t\t{\n\t\t\t\t\tfrustumCornersInLightSpace.Add(worldToLocalMatrix.MultiplyPoint(targetCamera.transform.localToWorldMatrix.MultiplyPoint(corner)));\n\t\t\t\t}\n\n\t\t\t\tBounds bounds = GeometryUtility.CalculateBounds(frustumCornersInLightSpace.ToArray(), Matrix4x4.identity);\n\t\t\t\t\n\t\t\t\t//Create an orthogonal projection matrix from the bounding box\n\t\t\t\tMatrix4x4 shadowProjectionMatrix = Matrix4x4.Ortho(\n\t\t\t\t\tbounds.center.x-bounds.extents.x,\n\t\t\t\t\tbounds.center.x+bounds.extents.x,\n\t\t\t\t\t\n\t\t\t\t\tbounds.center.y-bounds.extents.y,\n\t\t\t\t\tbounds.center.y+bounds.extents.y,\n\t\t\t\t\t\n\t\t\t\t\tbounds.center.z-bounds.extents.z,\n\t\t\t\t\tbounds.center.z+bounds.extents.z);\n\t\t\t\t\n\t\t\t\tshadowProjectionMatrix = GL.GetGPUProjectionMatrix(shadowProjectionMatrix, false);\n\n\t\t\t\t//Transformation from world into our \"shadow space\" matrix\n\t\t\t\tMatrix4x4 VP = shadowProjectionMatrix * worldToLocalMatrix;\n\t\t\t\t\n\t\t\t\t//And inverse transformation from \"shadow space\" into world used to create our mesh\n\t\t\t\tMatrix4x4 lightToWorld = VP.inverse;\n\n\t\t\t\tvolumeDepthMaterial.SetMatrix(ShaderProperties.lightToWorld_PROPERTY, lightToWorld);\n\t\t\t\tvolumeDepthMaterial.SetVector(ShaderProperties.lightDirection_PROPERTY, targetLight.transform.forward);\n\n\t\t\t\tvolumeDepthMaterial.SetVector (ShaderProperties._planetPos_PROPERTY, parentSkyNode.parentLocalTransform.position);\n\n//\t\t\t\tforeach(Tuple<EVEClouds2d, Material> tuple in cloudsShadowsMaterials)\n//\t\t\t\t{\n//\t\t\t\t\ttuple.Item2.CopyPropertiesFromMaterial(tuple.Item1.CloudShadowMaterial);\n//\t\t\t\t\ttuple.Item2.SetVector(ShaderProperties.lightDirection_PROPERTY, targetLight.transform.forward);\n//\t\t\t\t\ttuple.Item2.SetFloat(ShaderProperties._godrayCloudThreshold_PROPERTY, parentSkyNode.godrayCloudAlphaThreshold);\n//\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpublic void OnPostRender()\n\t\t{\n\t\t\tif (parentSkyNode)\n\t\t\t{\n\t\t\t\tRenderingDone ();\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic void OnDestroy()\n\t\t{\n\t\t\tRenderingDone ();\n\n\t\t\tif (inverseShadowMatricesBuffer != null)\n\t\t\t{\n\t\t\t\tinverseShadowMatricesBuffer.Dispose();\n\t\t\t}\n\n\t\t\tif (volumeDepthTexture)\n\t\t\t{\n\t\t\t\tvolumeDepthTexture.Release();\n\t\t\t}\n\n\t\t\tif (volumeDepthGO)\n\t\t\t{\n\t\t\t\tDestroyImmediate(volumeDepthGO);\n\t\t\t}\n\n//\t\t\tif (cloudShadowGO)\n//\t\t\t{\n//\t\t\t\tDestroyImmediate(cloudShadowGO);\n//\t\t\t}\n\t\t}\n\t}\n}\n\n"
  },
  {
    "path": "scatterer/Effects/Proland/Atmosphere/Preprocessing/AtmoPreprocessor.cs",
    "content": "﻿/*\r\n * Proland: a procedural landscape rendering library.\r\n * Copyright (c) 2008-2011 INRIA\r\n *\r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n *\r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n *\r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n *\r\n * Proland is distributed under a dual-license scheme.\r\n * You can obtain a specific license from Inria: proland-licensing@inria.fr.\r\n *\r\n * Authors: Eric Bruneton, Antoine Begault, Guillaume Piolat.\r\n * Modified and ported to Unity by Justin Hawkins 2014\r\n * Modified and adapted for use with Kerbal Space Program by Ghassen Lahmar 2015-2022\r\n *\r\n */\r\n\r\nusing UnityEngine;\r\nusing System.IO;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Runtime.InteropServices;\r\nusing System.Collections;\r\nusing System.Diagnostics;\r\n\r\nnamespace Scatterer \r\n{\r\n\t[KSPAddon(KSPAddon.Startup.Instantly, true)]\r\n\tpublic class AtmoPreprocessor : MonoBehaviour\r\n\t{\r\n\t\tprivate static AtmoPreprocessor instance;\r\n\r\n\t\tpublic void Awake()\r\n        {\r\n\t\t\tif (instance == null)\r\n\t\t\t{\r\n\t\t\t\tinstance = this;\r\n\t\t\t\tinstance.InitMaterials();\r\n\t\t\t\tUtils.LogDebug(\"AtmoPreprocessor instance created\");\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tthrow new UnityException(\"Attempted double instance!\");\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic static AtmoPreprocessor Instance\r\n\t\t{\r\n\t\t\tget \r\n\t\t\t{\r\n\t\t\t\treturn instance;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void Start()\r\n\t\t{\r\n\t\t\tDontDestroyOnLoad(this);\r\n\t\t}\r\n\r\n\t\tprivate static bool atmoGenerationRunning = false;\r\n\r\n\t\tpublic static Vector4 ScatteringLutDimensionsDefault { get => Scatterer.Instance.mainSettings.useLowResolutionAtmosphere ? scatteringLutDimensionsPreview : scatteringLutDimensionsDefault; }\r\n\r\n        const int READ = 0; const int WRITE = 1;\r\n\r\n\t\tfloat Rg = 60000.0f;\r\n\t\tfloat Rt = 71500.603f;\r\n\r\n\t\t//Dimensions of the tables\r\n\t\tconst int TRANSMITTANCE_W = 512;\r\n\t\tconst int TRANSMITTANCE_H = 128;\r\n\t\tconst int SKY_W = 64;\r\n\t\tconst int SKY_H = 16;\r\n\r\n\t\tprivate static Vector4 scatteringLutDimensionsDefault = new Vector4(32f, 128f, 32f, 16f);   //the one from yusov, double the current one so should be 16 megs in half precision\r\n\t\tpublic static Vector4 scatteringLutDimensionsPreview = new Vector4(16f, 64f, 16f, 2f);      //fast preview version, 32x smaller\r\n\r\n        private static int xTilesDefault = 32, yTilesDefault = 64;\r\n\t\tprivate static int xTilesPreview = 32, yTilesPreview = 16;\r\n\r\n\t\tVector4 scatteringLutDimensions = ScatteringLutDimensionsDefault;\r\n\t\tint xTiles = xTilesDefault, yTiles = yTilesDefault;\r\n\r\n\t\tfloat AVERAGE_GROUND_REFLECTANCE = 0.1f;\r\n\t\tVector4 BETA_R = new Vector4(5.8e-3f, 1.35e-2f, 3.31e-2f, 0.0f);\r\n\t\tVector4 BETA_MSca = new Vector4(4e-3f, 4e-3f, 4e-3f, 0.0f);\r\n\t\t\r\n\t\tfloat MIE_G = 0.8f;\r\n\t\t\r\n\t\tfloat HR = 8000.0f;\r\n\t\tfloat HM = 1200.0f;\r\n\r\n\t\tVector3 ozoneAbsorption = new Vector3(0.0000003426f, 0.0000008298f, 0.000000036f);\r\n\t\tfloat ozoneHeight =  25000f;\r\n\t\tfloat ozoneFalloff = 15000f;\r\n\r\n\t\tRenderTexture ozoneTransmittanceRT;\r\n\t\tRenderTexture deltaET, deltaSRT, deltaSMT, deltaJT;\r\n\t\tpublic RenderTexture[] irradianceT, inscatterT;\r\n\r\n\t\tMaterial transmittanceMaterial, ozoneTransmittanceMaterial, irradianceNMaterial, irradiance1Material, inscatter1Material,\r\n\t\t\tinscatterNMaterial, inscatterSMaterial, copyInscatter1Material, copyInscatterNMaterial, copyIrradianceMaterial, atlasMaterial;\r\n\r\n\t\tint scatteringOrders = 4; //min is 2 unless you skip that step\r\n\t\tbool multipleScattering = true;\r\n\t\tbool useOzone = false;\r\n\r\n\t\t// Process in chunks and return if we spend more time than this\r\n\t\t// Otherwise windows thinks the GPU crashed on slower hardware\r\n\t\t// https://en.wikipedia.org/wiki/Timeout_Detection_and_Recovery\r\n\t\tlong generationMsThreshold = 1000;\r\n\r\n\t\tprivate void InitMaterials()\r\n\t\t{\r\n\t\t\ttransmittanceMaterial = new Material(ShaderReplacer.Instance.LoadedShaders[(\"Scatterer/Preprocessing/Transmittance\")]);\r\n\t\t\tozoneTransmittanceMaterial = new Material(ShaderReplacer.Instance.LoadedShaders[(\"Scatterer/Preprocessing/OzoneTransmittance\")]);\r\n\t\t\tirradianceNMaterial = new Material(ShaderReplacer.Instance.LoadedShaders[(\"Scatterer/Preprocessing/IrradianceN\")]);\r\n\t\t\tirradiance1Material = new Material(ShaderReplacer.Instance.LoadedShaders[(\"Scatterer/Preprocessing/Irradiance1\")]);\r\n\t\t\tinscatter1Material = new Material(ShaderReplacer.Instance.LoadedShaders[(\"Scatterer/Preprocessing/Inscatter1\")]);\r\n\t\t\tinscatterNMaterial = new Material(ShaderReplacer.Instance.LoadedShaders[(\"Scatterer/Preprocessing/InscatterN\")]);\r\n\t\t\tinscatterSMaterial = new Material(ShaderReplacer.Instance.LoadedShaders[(\"Scatterer/Preprocessing/InscatterS\")]);\r\n\t\t\tcopyInscatter1Material = new Material(ShaderReplacer.Instance.LoadedShaders[(\"Scatterer/Preprocessing/CopyInscatter1\")]);\r\n\t\t\tcopyInscatterNMaterial = new Material(ShaderReplacer.Instance.LoadedShaders[(\"Scatterer/Preprocessing/CopyInscatterN\")]);\r\n\t\t\tcopyIrradianceMaterial = new Material(ShaderReplacer.Instance.LoadedShaders[(\"Scatterer/Preprocessing/CopyIrradiance\")]);\r\n\t\t\tatlasMaterial = new Material(ShaderReplacer.Instance.LoadedShaders[(\"Scatterer/Preprocessing/Atlas\")]);\r\n\t\t}\r\n\t\t\r\n\t\tpublic static float CalculateRt(float inRg, float inHR, float inHM, Vector3 in_betaR, Vector3 in_BETA_MSca, bool useOzone, float ozoneHeight, float ozoneFalloff)\r\n\t\t{\r\n\t\t\tfloat RtHR  =  - 1000f * inHR * Mathf.Log(0.0000001f / in_betaR.magnitude);\r\n\t\t\tfloat RtHM  =  - 1000f * inHM * Mathf.Log(0.0000001f / in_BETA_MSca.magnitude);\r\n\r\n\t\t\tfloat maxHeight = Mathf.Max(RtHR, RtHM);\r\n\t\t\t\r\n\t\t\tif (useOzone) maxHeight = Mathf.Max(maxHeight, 1000f * (ozoneHeight + ozoneFalloff));\r\n\r\n\t\t\treturn inRg + maxHeight;\r\n\t\t}\r\n\r\n\t\tpublic static void DeleteCache()\r\n\t\t{\r\n\t\t\tstring cachePath = Utils.GameDataPath + \"/ScattererAtmosphereCache/PluginData\";\r\n\t\t\tDirectory.Delete(cachePath, true);\r\n\t\t}\r\n\r\n\t\t[StructLayout(LayoutKind.Sequential)]\r\n\t\tstruct AtmoHashData\r\n\t\t{\r\n\t\t\tpublic float Rg;\r\n\t\t\tpublic float Rt;\r\n\t\t\tpublic float AVERAGE_GROUND_REFLECTANCE;\r\n\t\t\tpublic Vector4 BETA_R;\r\n\t\t\tpublic Vector4 BETA_MSca;\r\n\t\t\tpublic Vector4 ScatteringLutDimensions;\r\n\r\n\t\t\tpublic float MIE_G;\r\n\t\t\tpublic float HR;\r\n\t\t\tpublic float HM;\r\n\r\n\t\t\tpublic Vector3 ozoneAbsorption;\r\n\t\t\tpublic float ozoneHeight;\r\n\t\t\tpublic float ozoneFalloff;\r\n\t\t\tpublic bool useOzone;\r\n\t\t\tpublic bool useMultipleScattering;\r\n\r\n\t\t\tpublic AtmoHashData(float rg, float rt, float averageGroundReflectance, Vector4 betaR, Vector4 betaMSca, Vector4 scatteringLutDimensions, float mieG, float hr,float hm,Vector3 ozoneAbsorption,float ozoneHeight,float ozoneFalloff,bool useOzone,bool useMultipleScattering)\r\n\t\t\t{\r\n\t\t\t\tRg = rg;\r\n\t\t\t\tRt = rt;\r\n\t\t\t\tAVERAGE_GROUND_REFLECTANCE = averageGroundReflectance;\r\n\t\t\t\tBETA_R = betaR;\r\n\t\t\t\tBETA_MSca = betaMSca;\r\n\t\t\t\tScatteringLutDimensions = scatteringLutDimensions;\r\n\t\t\t\tMIE_G = mieG;\r\n\t\t\t\tHR = hr;\r\n\t\t\t\tHM = hm;\r\n\t\t\t\tthis.ozoneAbsorption = ozoneAbsorption;\r\n\t\t\t\tthis.ozoneHeight = ozoneHeight;\r\n\t\t\t\tthis.ozoneFalloff = ozoneFalloff;\r\n\t\t\t\tthis.useOzone = useOzone;\r\n\t\t\t\tthis.useMultipleScattering = useMultipleScattering;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic static string GetAtmoHash(float inRG, float inRT, Vector4 inBETA_R, Vector4 inBETA_MSca, float inMIE_G, float inHR, float inHM, float inAverageGroundRreflectance, bool inMultiple, Vector4 inPRECOMPUTED_SCTR_LUT_DIM, bool inUseOzone, Vector4 inOzoneAbsorption, float inOzoneHeight, float inOzoneFalloff)\r\n\t\t{\r\n\r\n\t\t\tAtmoHashData atmoHashData = new AtmoHashData(\r\n\t\t\t\tinRG,\r\n\t\t\t\tinRT,\r\n\t\t\t\tinAverageGroundRreflectance,\r\n\t\t\t\tinBETA_R,\r\n\t\t\t\tinBETA_MSca,\r\n\t\t\t\tinPRECOMPUTED_SCTR_LUT_DIM,\r\n\t\t\t\tinMIE_G,\r\n\t\t\t\tinHR,\r\n\t\t\t\tinHM,\r\n\t\t\t\tinUseOzone ? inOzoneAbsorption : Vector4.zero,\r\n\t\t\t\tinUseOzone ? inOzoneHeight  : 0f,\r\n\t\t\t\tinUseOzone ? inOzoneFalloff : 0f,\r\n\t\t\t\tinUseOzone,\r\n\t\t\t\tinMultiple\r\n\t\t\t);\r\n\r\n\t\t\tHash128 result = new Hash128();\r\n\t\t\tHashUtilities.ComputeHash128(ref atmoHashData, ref result);\r\n\r\n\t\t\treturn result.ToString();\r\n\t\t}\r\n\r\n\t\tpublic static void Generate(float inRG, float inRT, Vector4 inBETA_R, Vector4 inBETA_MSca, float inMIE_G, float inHR, float inHM, float inGRref, bool inMultiple, Vector4 inScatteringLutDimensions, bool previewMode, string assetPath, bool inUseOzone, Vector4 inOzoneAbsorption, float inOzoneHeight, float inOzoneFalloff, string bodyName)\r\n\t\t{\r\n\t\t\tif (!atmoGenerationRunning)\r\n\t\t\t{\r\n\t\t\t\tUtils.LogInfo(\"Generating new atmosphere for \"+bodyName);\r\n\t\t\t\tinstance.StartCoroutine(instance.GenerateAndSaveAtmoCoroutine(inRG, inRT, inBETA_R, inBETA_MSca, inMIE_G, inHR, inHM, inGRref, inMultiple, inScatteringLutDimensions, previewMode, assetPath, inUseOzone, inOzoneAbsorption, inOzoneHeight, inOzoneFalloff));\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tIEnumerator GenerateAndSaveAtmoCoroutine(float inRG, float inRT, Vector4 inBETA_R, Vector4 inBETA_MSca, float inMIE_G, float inHR, float inHM, float inGRref, bool inMultiple, Vector4 inScatteringLutDimensions, bool previewMode, string assetPath, bool inUseOzone, Vector4 inOzoneAbsorption, float inOzoneHeight, float inOzoneFalloff)\r\n\t\t{\r\n\t\t\tatmoGenerationRunning = true;\r\n\r\n\t\t\t//Rescale to a fixed radius which we know never causes issues\r\n\t\t\tfloat referenceRadius = 1000000f;\r\n\t\t\tfloat scaleFactor = referenceRadius / inRG;\r\n\r\n\t\t\tRg = referenceRadius;\r\n\t\t\tRt = inRT * scaleFactor;\r\n\r\n\t\t\tHR = inHR * 1000f * scaleFactor;\r\n\t\t\tHM = inHM * 1000f * scaleFactor;\r\n\r\n\t\t\tBETA_R = inBETA_R * 0.001f / scaleFactor;\r\n\t\t\tBETA_MSca = inBETA_MSca * 0.001f / scaleFactor;\r\n\r\n\t\t\tMIE_G = inMIE_G;\r\n\t\t\tif (inMultiple)\r\n\t\t\t\tMIE_G = Mathf.Min (MIE_G, 0.86f); //values of mie_G > 0.86 seem to break multiple scattering for some weird reason\r\n\r\n\t\t\tAVERAGE_GROUND_REFLECTANCE = inGRref;\r\n\t\t\tmultipleScattering = inMultiple;\r\n\t\t\tscatteringLutDimensions = inScatteringLutDimensions;\r\n\r\n\t\t\tuseOzone = inUseOzone;\r\n\t\t\tozoneAbsorption = inOzoneAbsorption * 0.001f / scaleFactor;\r\n\t\t\tif (!useOzone) ozoneAbsorption = Vector4.zero;\r\n\t\t\tozoneHeight = inOzoneHeight * 1000f * scaleFactor;\r\n\t\t\tozoneFalloff = inOzoneFalloff * 1000f* scaleFactor;\r\n\r\n\t\t\tif (previewMode || Scatterer.Instance.mainSettings.useLowResolutionAtmosphere)\r\n            {\r\n\t\t\t\txTiles = xTilesPreview; yTiles = yTilesPreview;\r\n            }\r\n\t\t\telse\r\n            {\r\n\t\t\t\txTiles = xTilesDefault; yTiles = yTilesDefault;\r\n\t\t\t}\r\n\r\n\t\t\tirradianceT = new RenderTexture[2];\r\n\t\t\tinscatterT = new RenderTexture[2];\r\n\t\t\t\r\n\t\t\tozoneTransmittanceRT = new RenderTexture(TRANSMITTANCE_W, TRANSMITTANCE_H, 0, RenderTextureFormat.ARGBFloat);\r\n\t\t\tozoneTransmittanceRT.wrapMode = TextureWrapMode.Clamp;\r\n\t\t\tozoneTransmittanceRT.filterMode = FilterMode.Bilinear;\r\n\t\t\tozoneTransmittanceRT.Create();\r\n\t\t\t\r\n\t\t\tirradianceT[0] = new RenderTexture(SKY_W, SKY_H, 0, RenderTextureFormat.ARGBFloat);\r\n\t\t\tirradianceT[0].wrapMode = TextureWrapMode.Clamp;\r\n\t\t\tirradianceT[0].filterMode = FilterMode.Bilinear;\r\n\t\t\tirradianceT[0].Create();\r\n\t\t\t\r\n\t\t\tirradianceT[1] = new RenderTexture(SKY_W, SKY_H, 0, RenderTextureFormat.ARGBFloat);\r\n\t\t\tirradianceT[1].wrapMode = TextureWrapMode.Clamp;\r\n\t\t\tirradianceT[1].filterMode = FilterMode.Bilinear;\r\n\t\t\tirradianceT[1].Create();\r\n\r\n\t\t\tdeltaET = new RenderTexture(SKY_W, SKY_H, 0, RenderTextureFormat.ARGBFloat);\r\n\t\t\tdeltaET.Create();\r\n\r\n\t\t\tinscatterT[0] = new RenderTexture((int)(scatteringLutDimensions.x * scatteringLutDimensions.y), (int)(scatteringLutDimensions.z * scatteringLutDimensions.w), 0, RenderTextureFormat.ARGBFloat);\r\n\t\t\tinscatterT[0].wrapMode = TextureWrapMode.Clamp;\r\n\t\t\tinscatterT[0].filterMode = FilterMode.Bilinear;\r\n\t\t\tinscatterT[0].Create();\r\n\r\n\t\t\tinscatterT[1] = new RenderTexture((int)(scatteringLutDimensions.x * scatteringLutDimensions.y), (int)(scatteringLutDimensions.z * scatteringLutDimensions.w), 0, RenderTextureFormat.ARGBFloat);\r\n\t\t\tinscatterT[1].wrapMode = TextureWrapMode.Clamp;\r\n\t\t\tinscatterT[1].filterMode = FilterMode.Bilinear;\r\n\t\t\tinscatterT[1].Create();\r\n\r\n\t\t\tdeltaSRT = new RenderTexture((int)(scatteringLutDimensions.x * scatteringLutDimensions.y), (int)(scatteringLutDimensions.z * scatteringLutDimensions.w), 0, RenderTextureFormat.ARGBFloat);\r\n\t\t\tdeltaSRT.wrapMode = TextureWrapMode.Clamp;\r\n\t\t\tdeltaSRT.filterMode = FilterMode.Bilinear;\r\n\t\t\tdeltaSRT.Create();\r\n\r\n\t\t\tdeltaSMT = new RenderTexture((int)(scatteringLutDimensions.x * scatteringLutDimensions.y), (int)(scatteringLutDimensions.z * scatteringLutDimensions.w), 0, RenderTextureFormat.ARGBFloat);\r\n\t\t\tdeltaSMT.wrapMode = TextureWrapMode.Clamp;\r\n\t\t\tdeltaSMT.filterMode = FilterMode.Bilinear;\r\n\t\t\tdeltaSMT.Create();\r\n\r\n\t\t\tdeltaJT = new RenderTexture((int)(scatteringLutDimensions.x * scatteringLutDimensions.y), (int)(scatteringLutDimensions.z * scatteringLutDimensions.w), 0, RenderTextureFormat.ARGBFloat);\r\n\t\t\tdeltaJT.wrapMode = TextureWrapMode.Clamp;\r\n\t\t\tdeltaJT.filterMode = FilterMode.Bilinear;\r\n\t\t\tdeltaJT.Create();\r\n\r\n\t\t\tSetParameters(ozoneTransmittanceMaterial);\r\n\t\t\tSetParameters(transmittanceMaterial);\r\n\t\t\tSetParameters(irradianceNMaterial);\r\n\t\t\tSetParameters(irradiance1Material);\r\n\t\t\tSetParameters(inscatter1Material);\r\n\t\t\tSetParameters(inscatterNMaterial);\r\n\t\t\tSetParameters(inscatterSMaterial);\r\n\t\t\tSetParameters(copyInscatter1Material);\r\n\t\t\tSetParameters(copyInscatterNMaterial);\r\n\t\t\tSetParameters(copyIrradianceMaterial);\r\n\r\n\t\t\tRTUtility.ClearColor(irradianceT);\r\n\r\n\t\t\tyield return Preprocess(assetPath);\r\n\r\n\t\t\tReleaseTextures();\r\n\r\n\t\t\tatmoGenerationRunning = false;\r\n\t\t}\r\n\r\n\t\tvoid SetParameters(Material mat)\r\n\t\t{\r\n\t\t\tmat.SetFloat(\"Rg\", Rg);\r\n\t\t\tmat.SetFloat(\"Rt\", Rt);\r\n\t\t\tmat.SetInt(\"TRANSMITTANCE_W\", TRANSMITTANCE_W);\r\n\t\t\tmat.SetInt(\"TRANSMITTANCE_H\", TRANSMITTANCE_H);\r\n\t\t\tmat.SetInt(\"SKY_W\", SKY_W);\r\n\t\t\tmat.SetInt(\"SKY_H\", SKY_H);\r\n\t\t\tmat.SetFloat(\"AVERAGE_GROUND_REFLECTANCE\", AVERAGE_GROUND_REFLECTANCE);\r\n\t\t\tmat.SetFloat(\"HR\", HR);\r\n\t\t\tmat.SetFloat(\"HM\", HM);\r\n\t\t\tmat.SetVector(\"betaR\", BETA_R);\r\n\t\t\tmat.SetVector(\"betaMSca\", BETA_MSca);\r\n\t\t\tmat.SetVector(\"betaMEx\", BETA_MSca / 0.9f);\r\n\t\t\tmat.SetFloat(\"mieG\", Mathf.Clamp(MIE_G, 0.0f, 0.99f));\r\n\t\t\tmat.SetFloat (\"Sun_intensity\", 10f);\r\n\t\t\tmat.SetVector(\"PRECOMPUTED_SCTR_LUT_DIM\", scatteringLutDimensions);\r\n\t\t\tmat.SetVector (\"tiles\", new Vector2 (xTiles, yTiles));\r\n\t\t\tmat.SetFloat(\"ozoneHeight\", ozoneHeight);\r\n\t\t\tmat.SetFloat(\"ozoneFalloff\", ozoneFalloff);\r\n\t\t\tmat.SetVector(\"ozoneAbsorption\", new Vector4(ozoneAbsorption.x, ozoneAbsorption.y, ozoneAbsorption.z, 0.0f));\r\n\t\t}\r\n\r\n\t\t\r\n\t\tIEnumerator Preprocess(string assetPath)\r\n        {\r\n\t\t\tStopwatch stopwatch = new Stopwatch();\r\n\t\t\tstopwatch.Start();\r\n\r\n\t\t\tComputeTransmittance();\r\n\t\t\tComputeIrradiance();\r\n\t\t\tyield return ComputeInscatter1(stopwatch);\r\n\t\t\tCopyIrradiance();\r\n\t\t\tyield return CopyInscatter1(stopwatch);\r\n\r\n\t\t\tfor (int scatteringOrder = 2; scatteringOrder <= (multipleScattering ? scatteringOrders : 2); scatteringOrder++)\r\n\t\t\t{\r\n\t\t\t\tyield return ComputeInscatterS(2, stopwatch); // is this a mistake? should it be scatteringOrder instead of 2?\r\n\t\t\t\tComputeIrradianceN(2);\r\n\t\t\t\tyield return ComputeInscatterN(stopwatch);\r\n\t\t\t\tCopyIrradianceK1();\r\n\r\n\t\t\t\tif (multipleScattering)\r\n\t\t\t\t{\r\n\t\t\t\t\tyield return CopyInscatterN(stopwatch);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (!Directory.Exists(assetPath))\r\n\t\t\t\tDirectory.CreateDirectory(assetPath);\r\n\r\n\t\t\tvar atmosphereAtlas = PackTextures(new RenderTexture[] { inscatterT[READ], irradianceT[READ], ozoneTransmittanceRT });\r\n\t\t\tSaveAsHalf(atmosphereAtlas, assetPath + \"/atlas\");\r\n\r\n\t\t\tatmosphereAtlas.Release();\r\n\r\n\t\t\tUtils.LogInfo(\"Atmo generation successful\");\r\n        }\r\n\r\n\t\tprivate RenderTexture PackTextures(RenderTexture[] textures)\r\n\t\t{\r\n\t\t\t// Just do the simplest packing possible, top-left to bottom-left\r\n\t\t\tint width = textures.Max(texture => texture.width);\r\n\t\t\tint height = textures.Sum(texture => texture.height);\r\n\r\n\t\t\tRenderTexture rt = new RenderTexture(width, height, 0, RenderTextureFormat.ARGBFloat, 0);\r\n\t\t\trt.wrapMode = TextureWrapMode.Clamp;\r\n\t\t\trt.Create();\r\n\r\n\t\t\tatlasMaterial.SetInt(\"targetWidth\", width);\r\n\t\t\tatlasMaterial.SetInt(\"targetHeight\", height);\r\n\r\n\t\t\tint currentHeight = 0;\r\n\r\n\t\t\tfor (int i = 0; i < textures.Length; i++)\r\n\t\t\t{\r\n\t\t\t\tvar texture = textures[i];\r\n\r\n\t\t\t\tatlasMaterial.SetTexture(\"inputTexture\", texture);\r\n\t\t\t\tatlasMaterial.SetInt(\"width\", texture.width);\r\n\t\t\t\tatlasMaterial.SetInt(\"height\", texture.height);\r\n\r\n\t\t\t\tatlasMaterial.SetInt(\"horizontalOffset\", 0);\r\n\t\t\t\tatlasMaterial.SetInt(\"verticalOffset\", currentHeight);\r\n\r\n\t\t\t\tGraphics.Blit(null, rt, atlasMaterial);\r\n\r\n\t\t\t\tcurrentHeight += texture.height;\r\n\t\t\t}\r\n\r\n\t\t\treturn rt;\r\n\t\t}\r\n\r\n\t\tpublic static List<Vector4> GetPackedTexturesScaleAndOffsets(List<Vector2> dimensions, Vector2 atlasDimensions)\r\n\t\t{\r\n\t\t\tvar result = new List<Vector4>();\r\n\t\t\tfloat currentHeight = 0;\r\n\r\n\t\t\tforeach(Vector2 dimension in dimensions)\r\n            {\r\n\t\t\t\tVector2 currentScale = new Vector2(dimension.x / atlasDimensions.x, dimension.y / atlasDimensions.y);\r\n\t\t\t\tVector2 currentOffset = new Vector2(0f, currentHeight /  atlasDimensions.y);\r\n\r\n\t\t\t\tresult.Add(new Vector4(currentScale.x, currentScale.y, currentOffset.x, currentOffset.y));\r\n\r\n\t\t\t\tcurrentHeight += dimension.y;\r\n\t\t\t}\r\n\r\n\t\t\treturn result;\r\n\t\t}\r\n\r\n\t\tIEnumerator CopyInscatterN(Stopwatch stopwatch)\r\n        {\r\n\t\t\t// adds deltaS into inscatter texture S(line 11 in algorithm 4.1)\r\n\t\t\tyield return ProcessInTiles(stopwatch, (int i, int j) =>\r\n            {\r\n                copyInscatterNMaterial.SetVector(\"currentTile\", new Vector2(i, j));\r\n\r\n                copyInscatterNMaterial.SetTexture(\"deltaSRead\", deltaSRT);\r\n                copyInscatterNMaterial.SetTexture(\"inscatterRead\", inscatterT[READ]);\r\n\r\n                Graphics.Blit(null, inscatterT[WRITE], copyInscatterNMaterial, 0);\r\n            });\r\n\r\n            RTUtility.Swap(inscatterT);\r\n        }\r\n\r\n        private void CopyIrradianceK1()\r\n        {\r\n\t\t\t// adds deltaE into irradiance texture E (line 10 in algorithm 4.1)\r\n\t\t\tcopyIrradianceMaterial.SetFloat(\"k\", 1.0f);\r\n            copyIrradianceMaterial.SetTexture(\"deltaERead\", deltaET);\r\n            copyIrradianceMaterial.SetTexture(\"irradianceRead\", irradianceT[READ]);\r\n\r\n            Graphics.Blit(null, irradianceT[WRITE], copyIrradianceMaterial);\r\n\r\n            RTUtility.Swap(irradianceT);\r\n        }\r\n\r\n        IEnumerator ComputeInscatterN(Stopwatch stopwatch)\r\n\t\t{\r\n\t\t\t// computes deltaS (line 9 in algorithm 4.1)\r\n\t\t\tyield return ProcessInTiles(stopwatch, (int i, int j) =>\r\n            {\r\n                inscatterNMaterial.SetVector(\"currentTile\", new Vector2(i, j));\r\n\r\n                inscatterNMaterial.SetTexture(\"transmittanceRead\", ozoneTransmittanceRT);\r\n                inscatterNMaterial.SetTexture(\"deltaJRead\", deltaJT);\r\n                inscatterNMaterial.SetTexture(\"deltaJReadSampler\", deltaJT);\r\n\r\n                Graphics.Blit(null, deltaSRT, inscatterNMaterial, 0);\r\n            });\r\n        }\r\n\r\n        IEnumerator ComputeInscatterS(int scatteringOrder, Stopwatch stopwatch)\r\n        {\r\n\t\t\tyield return ProcessInTiles(stopwatch, (int i, int j) =>\r\n            {\r\n\t\t\t\tinscatterSMaterial.SetVector(\"currentTile\", new Vector2(i, j));\r\n\r\n                inscatterSMaterial.SetInt(\"first\", (scatteringOrder == 2) ? 1 : 0);\r\n                inscatterSMaterial.SetTexture(\"transmittanceRead\", ozoneTransmittanceRT);\r\n                inscatterSMaterial.SetTexture(\"deltaERead\", deltaET);\r\n                inscatterSMaterial.SetTexture(\"deltaSRRead\", deltaSRT);\r\n                inscatterSMaterial.SetTexture(\"deltaSMRead\", deltaSMT);\r\n\r\n                inscatterSMaterial.SetTexture(\"deltaSRReadSampler\", deltaSRT);\r\n                inscatterSMaterial.SetTexture(\"deltaSMReadSampler\", deltaSMT);\r\n\r\n                Graphics.Blit(null, deltaJT, inscatterSMaterial, 0);\r\n            });\r\n        }\r\n\r\n        private void ComputeIrradianceN(int scatteringOrder)\r\n        {\r\n\t\t\t// computes deltaE (line 8 in algorithm 4.1)\r\n\t\t\tirradianceNMaterial.SetInt(\"first\", (scatteringOrder == 2) ? 1 : 0);\r\n            irradianceNMaterial.SetTexture(\"deltaSRRead\", deltaSRT);\r\n            irradianceNMaterial.SetTexture(\"deltaSMRead\", deltaSMT);\r\n\r\n            irradianceNMaterial.SetTexture(\"deltaSRReadSampler\", deltaSRT);\r\n            irradianceNMaterial.SetTexture(\"deltaSMReadSampler\", deltaSMT);\r\n\r\n            Graphics.Blit(null, deltaET, irradianceNMaterial);\r\n        }\r\n\r\n        IEnumerator CopyInscatter1(Stopwatch stopwatch)\r\n\t\t{\r\n\t\t\t// copies deltaS into inscatter texture S (line 5 in algorithm 4.1)\r\n\t\t\tyield return ProcessInTiles(stopwatch, (int i, int j) =>\r\n            {\r\n                copyInscatter1Material.SetVector(\"currentTile\", new Vector2(i, j));\r\n\r\n                copyInscatter1Material.SetTexture(\"deltaSRRead\", deltaSRT);\r\n                copyInscatter1Material.SetTexture(\"deltaSMRead\", deltaSMT);\r\n\r\n                Graphics.Blit(null, inscatterT[WRITE], copyInscatter1Material, 0);\r\n            });\r\n\r\n            RTUtility.Swap(inscatterT);\r\n        }\r\n\r\n        private void CopyIrradiance()\r\n        {\r\n            copyIrradianceMaterial.SetFloat(\"k\", 0.0f);\r\n            copyIrradianceMaterial.SetTexture(\"deltaERead\", deltaET);\r\n            copyIrradianceMaterial.SetTexture(\"irradianceRead\", irradianceT[READ]);\r\n\r\n            Graphics.Blit(null, irradianceT[WRITE], copyIrradianceMaterial, 0);\r\n            RTUtility.Swap(irradianceT);\r\n        }\r\n\r\n        IEnumerator ComputeInscatter1(Stopwatch stopwatch)\r\n        {\r\n\t\t\t// computes single scattering texture deltaS (line 3 in algorithm 4.1)\r\n\t\t\t// Rayleigh and Mie separated in deltaSR + deltaSM\r\n\t\t\tinscatter1Material.SetTexture(\"transmittanceRead\", ozoneTransmittanceRT);\r\n\r\n\t\t\tyield return ProcessInTiles(stopwatch, (int i, int j) =>\r\n\t\t\t{\r\n\t\t\t\tinscatter1Material.SetVector(\"currentTile\", new Vector2(i, j));\r\n\t\t\t\tGraphics.Blit(null, deltaSRT, inscatter1Material, 0); // rayleigh pass\r\n\t\t\t\tGraphics.Blit(null, deltaSMT, inscatter1Material, 1); // mie pass\r\n\t\t\t});\r\n\t\t}\r\n\r\n        private void ComputeIrradiance()\r\n        {\r\n            // computes irradiance texture deltaE (line 2 in algorithm 4.1)\r\n            irradiance1Material.SetTexture(\"transmittanceRead\", ozoneTransmittanceRT);\r\n            Graphics.Blit(null, deltaET, irradiance1Material);\r\n        }\r\n\r\n        private void ComputeTransmittance()\r\n        {\r\n            Graphics.Blit(null, ozoneTransmittanceRT, ozoneTransmittanceMaterial);\r\n        }\r\n\r\n        //Process in tiles because older GPUs (series 7xx and integrated hd 3xxx) crash when rendering the full res\r\n        IEnumerator ProcessInTiles(Stopwatch stopwatch, Action<int, int> process)\r\n\t\t{\r\n\t\t\tfor (int i = 0; i < xTiles; i++)\r\n\t\t\t{\r\n\t\t\t\tfor (int j = 0; j < yTiles; j++)\r\n\t\t\t\t{\r\n\t\t\t\t\tprocess(i, j);\r\n\t\t\t\t}\r\n\t\t\t\tif (stopwatch.ElapsedMilliseconds > generationMsThreshold) { yield return new WaitForFixedUpdate(); stopwatch.Restart(); }\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void OnDestroy()\r\n        {\r\n\t\t\tReleaseTextures();\r\n\t\t}\r\n\r\n\t\tvoid ReleaseTextures()\r\n\t\t{\r\n\t\t\tozoneTransmittanceRT.Release();\r\n\t\t\tirradianceT[0].Release();\r\n\t\t\tirradianceT[1].Release();\r\n\t\t\tinscatterT[0].Release();\r\n\t\t\tinscatterT[1].Release();\r\n\t\t\tdeltaET.Release();\r\n\t\t\tdeltaSRT.Release();\r\n\t\t\tdeltaSMT.Release();\r\n\t\t\tdeltaJT.Release();\r\n\t\t}\r\n\r\n\t\tvoid SaveAsHalf(RenderTexture rtex, string fileName)\r\n\t\t{\r\n\t\t\tTexture2D temp = new Texture2D(rtex.width, rtex.height, TextureFormat.RGBAHalf, false, false);\r\n\t\t\t\r\n\t\t\tRenderTexture.active = rtex;\r\n\t\t\ttemp.ReadPixels (new Rect (0, 0, rtex.width, rtex.height), 0, 0);\r\n\t\t\ttemp.Apply ();\r\n\t\t\t\r\n\t\t\tbyte[] byteArray = temp.GetRawTextureData();\r\n\t\t\tSystem.IO.File.WriteAllBytes(fileName + \".half\", byteArray);\r\n\t\t}\r\n\t}\r\n}"
  },
  {
    "path": "scatterer/Effects/Proland/Atmosphere/SkyNode.cs",
    "content": "using UnityEngine;\r\nusing System;\r\nusing System.IO;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\nusing KSP.IO;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class SkyNode: MonoBehaviour\r\n\t{\r\n\t\t[Persistent] protected string name;\r\n\r\n\t\tpublic float Rg;\t//The radius of the planet\r\n\t\tpublic float Rt;\t//Radius of the atmosphere, calculated automatically from HR and HM and the scattering factors\r\n\t\t[Persistent] public float atmosphereStartRadiusScale = 1f;\r\n\t\t[Persistent] public float HR = 8.0f;\t//Half heights for the atmosphere air density (HR) and particle density (HM), this is the height in km that half the particles are found below\r\n\t\t[Persistent] public float HM = 1.2f;\r\n\t\t[Persistent] public Vector3 m_betaR = new Vector3 (5.8e-3f, 1.35e-2f, 3.31e-2f);\r\n\t\t[Persistent] public Vector3 BETA_MSca = new Vector3 (4e-3f, 4e-3f, 4e-3f); //scatter coefficient for mie\r\n\t\t[Persistent] public float m_mieG = 0.85f; //Asymmetry factor for the mie phase function, a higher number means more light is scattered in the forward direction\r\n\r\n\t\t[Persistent] public Vector3 ozoneAbsorption = new Vector3(0.0003426f, 0.0008298f, 0.000036f); // From Physically Based Sky, Atmosphere & Cloud Rendering in Frostbite (2016), these look better than other coefficients I found in the literature\r\n\t\t[Persistent] public float ozoneHeight = 25f;    // Ozone density is highest at ozoneHeight(km) and decreases linearly away from that altitude until ozoneFalloff(km), as per Bruneton (2017)\r\n\t\t[Persistent] public float ozoneFalloff = 15f;   // profile from http://www.kln.ac.lk/science/Chemistry/Teaching_Resources/\r\n\t\t[Persistent] public bool useOzone = false;\r\n\r\n\t\t[Persistent] public float averageGroundReflectance = 0.1f;\r\n\t\t[Persistent] public bool multipleScattering = true;\r\n\t\tpublic bool previewMode = false;\r\n\r\n\t\tpublic float mainMenuScaleFactor = 1f;\r\n\r\n\t\t[Persistent] public float godrayStrength = 0.8f;\r\n\t\t[Persistent] public float flattenScaledSpaceMesh = 0f;\r\n\t\t[Persistent] public float rimBlend = 20f;\r\n\t\t[Persistent] public float rimpower = 600f;\r\n\t\t[Persistent] public float specR = 0f;\r\n\t\t[Persistent] public float specG = 0f;\r\n\t\t[Persistent] public float specB = 0f;\r\n\t\t[Persistent] public float shininess = 0f;\r\n\r\n\t\t[Persistent] public float noonSunlightExtinctionStrength = 1f;\r\n\r\n\t\t[Persistent] public float cloudColorMultiplier=3f;\r\n\t\t[Persistent] public float cloudScatteringMultiplier=0.2f;\r\n\t\t[Persistent] public float cloudSkyIrradianceMultiplier=0.05f;\r\n\t\t[Persistent] public float volumetricsColorMultiplier = 1f;\r\n\t\t[Persistent] public bool EVEIntegration_preserveCloudColors = false;\r\n//\t\t[Persistent] public float godrayCloudAlphaThreshold = 0.25f;\r\n\r\n\t\t[Persistent] public List < ConfigPoint > configPoints = new List < ConfigPoint > ();\r\n\r\n\t\t[Persistent] public bool adjustScaledTexture = false;\r\n\r\n\t\t[Persistent] public float scaledLandBrightnessAdjust = 1f;\r\n\t\t[Persistent] public float scaledLandContrastAdjust   = 1f;\r\n\t\t[Persistent] public float scaledLandSaturationAdjust = 1f;\r\n\t\t\t\t\r\n\t\t[Persistent] public float scaledOceanBrightnessAdjust = 1f;\r\n\t\t[Persistent] public float scaledOceanContrastAdjust   = 1f;\r\n\t\t[Persistent] public float scaledOceanSaturationAdjust = 1f;\r\n\r\n\t\t//Texture2D m_inscatter, m_irradiance, m_ozoneTransmittance = Texture2D.whiteTexture;\r\n\r\n\t\tTexture2D atmosphereAtlas; // Combine all the lookup tables to save texture slots on Mac\r\n\t\tVector2 atlasDimensions;\r\n\t\tList<Vector4> atlasScaleAndOffsets = new List<Vector4> { Vector4.zero, Vector4.zero, Vector4.zero, Vector4.zero};\r\n\r\n\t\t//Dimensions of the tables\r\n\t\tconst int TRANSMITTANCE_W = 512;\r\n\t\tconst int TRANSMITTANCE_H = 128;\r\n\t\tVector2 transmittanceTableDimensions = new Vector2(TRANSMITTANCE_W, TRANSMITTANCE_H);\r\n\t\tconst int SKY_W = 64;\r\n\t\tconst int SKY_H = 16;\r\n\r\n\t\tVector4 scatteringLutDimensions = AtmoPreprocessor.ScatteringLutDimensionsDefault;\r\n\r\n\t\tstring celestialBodyName;\r\n\t\tpublic Transform parentScaledTransform, parentLocalTransform;\r\n\r\n\t\tpublic ProlandManager prolandManager;\r\n\t\tpublic UrlDir.UrlConfig configUrl;\r\n\t\tpublic bool isConfigModuleManagerPatch = true;\r\n\t\t\r\n\t\tpublic bool usesCloudIntegration = true;\r\n\t\t\r\n\t\tpublic float altitude;\r\n\t\tpublic float percentage;\r\n\t\tpublic int currentConfigPoint;\r\n\t\tpublic ConfigPoint interpolatedSettings= new ConfigPoint();\r\n\t\tpublic bool inScaledSpace = true, simulateOceanInteraction=false;\r\n\r\n\t\tVector3 sunPosRelPlanet=Vector3.zero;\r\n\t\tMatrix4x4 castersMatrix1=Matrix4x4.zero;\r\n\t\tMatrix4x4 castersMatrix2=Matrix4x4.zero;\r\n\r\n\t\tSkySphereContainer skySphere;\r\n\t\tGameObject stockSkyGameObject;\r\n\t\tMeshRenderer stockScaledPlanetMeshRenderer;\r\n\t\tMesh originalScaledMesh, tweakedScaledmesh;\r\n\t\tpublic ScaledScatteringContainer scaledScatteringContainer;\r\n\t\tpublic Material localScatteringMaterial, skyMaterial, scaledScatteringMaterial, sunflareExtinctionMaterial, scaledEclipseMaterial;\r\n\t\tpublic GenericLocalAtmosphereContainer localScatteringContainer;\r\n\t\tpublic LegacyGodraysRenderer legacyGodraysRenderer;\r\n\t\tpublic bool postprocessingEnabled = true;\r\n\r\n\t\tGameObject ringObject;\r\n\t\tfloat ringInnerRadius, ringOuterRadius;\r\n\t\tTexture2D ringTexture;\r\n\t\tbool hasRingObjectAndShadowActivated = false;\r\n\t\r\n\t\tbool skyNodeInitiated = false;\r\n\t\tbool precomputedAtmoLoaded = false;\r\n\t\tbool atmosphereShadersInitiated = false;\r\n\t\tpublic bool useEclipses = false;\r\n\r\n\t\tTexture2D originalPlanetTexture;\r\n\t\tRenderTexture adjustedPlanetTexture;\r\n\r\n\t\tpublic void Init ()\r\n\t\t{\r\n\t\t\tInitOrRequestPrecomputedAtmo ();\r\n\r\n\t\t\tskyMaterial = new Material (ShaderReplacer.Instance.LoadedShaders[(\"Scatterer/SkySphere\")]);\r\n\t\t\tscaledScatteringMaterial = new Material (ShaderReplacer.Instance.LoadedShaders[(\"Scatterer/ScaledPlanetScattering\")]);\r\n\t\t\tlocalScatteringMaterial = new Material (ShaderReplacer.Instance.LoadedShaders[(\"Scatterer/DepthBufferScattering\")]);\r\n\r\n\t\t\tskyMaterial.SetOverrideTag (\"IgnoreProjector\", \"True\");\r\n\t\t\tscaledScatteringMaterial.SetOverrideTag (\"IgnoreProjector\", \"True\");\r\n\t\t\tlocalScatteringMaterial.SetOverrideTag (\"IgnoreProjector\", \"True\");\r\n\r\n\t\t\tuseEclipses = Scatterer.Instance.mainSettings.useEclipses && (prolandManager.eclipseCasters.Count > 0) && HighLogic.LoadedScene != GameScenes.MAINMENU ; //disable bugged eclipses on main menu\r\n\t\t\tUtils.EnableOrDisableShaderKeywords (localScatteringMaterial, \"ECLIPSES_ON\", \"ECLIPSES_OFF\", useEclipses);\r\n\t\t\tUtils.EnableOrDisableShaderKeywords (localScatteringMaterial, \"DISABLE_UNDERWATER_ON\", \"DISABLE_UNDERWATER_OFF\", prolandManager.hasOcean);\t\t\t\r\n\r\n\t\t\tif (Scatterer.Instance.mainSettings.useLegacyTerrainGodrays && Scatterer.Instance.unifiedCameraMode && prolandManager.parentCelestialBody.pqsController\r\n\t\t\t\t&& Scatterer.Instance.mainSettings.terrainShadows && (Scatterer.Instance.mainSettings.unifiedCamShadowResolutionOverride != 0))\r\n\t\t\t{\r\n\t\t\t\tlegacyGodraysRenderer = (LegacyGodraysRenderer)Utils.getEarliestLocalCamera().gameObject.AddComponent(typeof(LegacyGodraysRenderer));\r\n\t\t\t\tif (!legacyGodraysRenderer.Init(prolandManager.mainSunLight, this))\r\n\t\t\t\t{\r\n\t\t\t\t\tComponent.Destroy(legacyGodraysRenderer);\r\n\t\t\t\t\tlegacyGodraysRenderer = null;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (Scatterer.Instance.mainSettings.useRingShadows)\r\n\t\t\t{\r\n\t\t\t\tInitKopernicusRings ();\r\n\t\t\t}\r\n\r\n\t\t\tTweakScaledMesh ();\r\n\r\n\t\t\tif (prolandManager.parentCelestialBody.pqsController)\r\n\t\t\t{\r\n\t\t\t\tprolandManager.parentCelestialBody.pqsController.isActive = false; \t//sometimes the PQS is forgotten as \"active\" if a ship is loaded directly around another body, this would mess with the mod\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//this sets it to false, if it's really active it will be set to active automatically. EVE mod seems also to have a fix for this\r\n\t\t\t}\r\n\r\n\t\t\tif ((HighLogic.LoadedScene != GameScenes.MAINMENU) && (HighLogic.LoadedScene != GameScenes.TRACKSTATION)) // &&useLocalScattering\r\n\t\t\t{\r\n\t\t\t\t\tlocalScatteringContainer = new ScreenSpaceScatteringContainer(localScatteringMaterial, parentLocalTransform, Rt, prolandManager, Scatterer.Instance.mainSettings.quarterResScattering && !legacyGodraysRenderer);\r\n\t\t\t}\r\n\r\n\t\t\tif (Scatterer.Instance.mainSettings.fullLensFlareReplacement)\r\n\t\t\t{\r\n\t\t\t\tsunflareExtinctionMaterial = new Material (ShaderReplacer.Instance.LoadedShaders [\"Scatterer/sunFlareExtinction\"]);\r\n\t\t\t\tInitUniforms(sunflareExtinctionMaterial);\r\n\r\n\t\t\t\tif (hasRingObjectAndShadowActivated)\r\n\t\t\t\t{\r\n\t\t\t\t\tsunflareExtinctionMaterial.SetFloat (ShaderProperties.ringInnerRadius_PROPERTY, ringInnerRadius);\r\n\t\t\t\t\tsunflareExtinctionMaterial.SetFloat (ShaderProperties.ringOuterRadius_PROPERTY, ringOuterRadius);\r\n\t\t\t\t\tsunflareExtinctionMaterial.SetVector (ShaderProperties.ringNormal_PROPERTY, ringObject.transform.up);\r\n\t\t\t\t\tsunflareExtinctionMaterial.SetTexture (ShaderProperties.ringTexture_PROPERTY, ringTexture);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tUtils.EnableOrDisableShaderKeywords (sunflareExtinctionMaterial, \"DISABLE_UNDERWATER_ON\", \"DISABLE_UNDERWATER_OFF\", prolandManager.hasOcean);\r\n\t\t\t}\r\n\r\n\t\t\tif (useEclipses || hasRingObjectAndShadowActivated)\r\n\t\t\t{\r\n\t\t\t\tscaledEclipseMaterial = new Material (ShaderReplacer.Instance.LoadedShaders [(\"Scatterer/ScaledPlanetEclipse\")]);\r\n\t\t\t\tscaledEclipseMaterial.renderQueue = 2001;\r\n\t\t\t\t\r\n\t\t\t\tUtils.EnableOrDisableShaderKeywords (scaledEclipseMaterial, \"ECLIPSES_ON\", \"ECLIPSES_OFF\", useEclipses);\r\n\t\t\t\tUtils.EnableOrDisableShaderKeywords (scaledEclipseMaterial, \"RINGSHADOW_ON\", \"RINGSHADOW_OFF\", hasRingObjectAndShadowActivated);\r\n\t\t\t\t\r\n\t\t\t\tInitUniforms(scaledEclipseMaterial);\r\n\t\t\t}\r\n\r\n\t\t\tstockScaledPlanetMeshRenderer = (MeshRenderer) parentScaledTransform.GetComponent<MeshRenderer>();\r\n\r\n\t\t\tskyNodeInitiated = true;\r\n\t\t\tUtils.LogDebug(\"Skynode initiated for \"+celestialBodyName);\r\n\t\t}\r\n\r\n\t\tvoid InitSkySphere ()\r\n\t\t{\r\n\t\t\tfloat skySphereSize = (1.5f * (Rt - Rg*atmosphereStartRadiusScale) + Rg*atmosphereStartRadiusScale) / ScaledSpace.ScaleFactor;\r\n\t\t\tskySphere = new SkySphereContainer (skySphereSize, skyMaterial, parentLocalTransform, parentScaledTransform);\r\n\r\n\t\t\tif (HighLogic.LoadedScene != GameScenes.MAINMENU)\r\n\t\t\t{\r\n\t\t\t\tif (prolandManager.parentCelestialBody.pqsController != null && prolandManager.parentCelestialBody.pqsController.isActive && HighLogic.LoadedScene != GameScenes.TRACKSTATION)\r\n\t\t\t\t{\r\n\t\t\t\t\tskySphere.SwitchLocalMode ();\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tskySphere.SwitchScaledMode ();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tskyMaterial.renderQueue = 2998;\r\n\t\t\tInitUniforms (skyMaterial);\r\n\t\t}\r\n\r\n\t\tpublic void InitScaledScattering ()\r\n\t\t{\r\n\t\t\tscaledScatteringContainer = new ScaledScatteringContainer (parentScaledTransform.GetComponent<MeshFilter> ().sharedMesh, scaledScatteringMaterial, parentLocalTransform, parentScaledTransform);\r\n\r\n\t\t\tif (HighLogic.LoadedScene != GameScenes.MAINMENU)\r\n\t\t\t{\r\n\t\t\t\tif (prolandManager.parentCelestialBody.pqsController != null && prolandManager.parentCelestialBody.pqsController.isActive && HighLogic.LoadedScene != GameScenes.TRACKSTATION)\r\n\t\t\t\t{\r\n\t\t\t\t\tscaledScatteringContainer.SwitchLocalMode ();\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tscaledScatteringContainer.SwitchScaledMode ();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tscaledScatteringMaterial.renderQueue = 2997;\r\n\t\t\tInitUniforms (scaledScatteringMaterial);\r\n\t\t}\r\n\t\t\r\n\t\tpublic void OnPreRender()\r\n\t\t{\r\n\t\t\tUpdateGraphicsUniforms ();\r\n\r\n\t\t\tif (!MapView.MapIsEnabled && Scatterer.Instance.mainSettings.sunlightExtinction && precomputedAtmoLoaded)\r\n\t\t\t{\r\n\t\t\t\tUpdateLightExtinctions ();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void UpdateGraphicsUniforms()\r\n\t\t{\r\n\t\t\tif (!inScaledSpace && !MapView.MapIsEnabled && postprocessingEnabled && localScatteringContainer!=null)\r\n\t\t\t{\r\n\t\t\t\tUpdatePostProcessMaterialUniforms (localScatteringContainer.material);\r\n\t\t\t}\r\n\t\t\tif (useEclipses)\r\n\t\t\t{\r\n\t\t\t\tUpdateEclipseCasters ();\r\n\t\t\t}\r\n\t\t\tif (Scatterer.Instance.mainSettings.integrateWithEVEClouds && usesCloudIntegration)\r\n\t\t\t{\r\n\t\t\t\tUpdateEVECloudMaterials ();\r\n\t\t\t}\r\n\t\t\tif (Scatterer.Instance.sunflareManager)\r\n\t\t\t{\r\n\t\t\t\tUpdateSunflareExtinctions ();\r\n\t\t\t}\r\n\r\n\t\t\tif (scaledScatteringContainer != null)\r\n\t\t\t\tscaledScatteringContainer.MeshRenderer.enabled = stockScaledPlanetMeshRenderer.enabled;\r\n\r\n\t\t\tif (localScatteringContainer != null)\r\n\t\t\t{\r\n\t\t\t\tlocalScatteringContainer.SetInScaledSpace (inScaledSpace);\r\n\t\t\t\tlocalScatteringContainer.UpdateContainer ();\r\n\t\t\t}\r\n\r\n\t\t\tSetUniforms (skyMaterial);\r\n\t\t\tSetUniforms (scaledScatteringMaterial);\r\n\r\n\t\t\tif (sunflareExtinctionMaterial)\r\n\t\t\t\tSetUniforms (sunflareExtinctionMaterial);\r\n\r\n\t\t\tif (scaledEclipseMaterial)\r\n\t\t\t{\r\n\t\t\t\tscaledEclipseMaterial.SetVector (ShaderProperties._Sun_WorldSunDir_PROPERTY, prolandManager.getDirectionToMainSun ());\r\n\t\t\t\t\r\n\t\t\t\tscaledEclipseMaterial.SetMatrix (ShaderProperties.lightOccluders1_PROPERTY, castersMatrix1);\r\n\t\t\t\tscaledEclipseMaterial.SetMatrix (ShaderProperties.lightOccluders2_PROPERTY, castersMatrix2);\r\n\t\t\t\tscaledEclipseMaterial.SetVector (ShaderProperties.sunPosAndRadius_PROPERTY, new Vector4 (sunPosRelPlanet.x, sunPosRelPlanet.y,\r\n\t\t\t\t                                                                                         sunPosRelPlanet.z, (float)prolandManager.sunCelestialBody.Radius));\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t\r\n\t\tpublic void UpdateNode ()\r\n\t\t{\r\n\t\t\tif ((prolandManager.parentCelestialBody.pqsController != null) && !(HighLogic.LoadedScene == GameScenes.TRACKSTATION))\r\n\t\t\t{\r\n\t\t\t\tbool previousState = inScaledSpace;\r\n\r\n\t\t\t\tinScaledSpace = !prolandManager.parentCelestialBody.pqsController.isActive;\r\n\r\n\t\t\t\t//if we go from scaled to local space\r\n\t\t\t\tif (!inScaledSpace && previousState)\r\n\t\t\t\t{\r\n\t\t\t\t\tSwitchEffectsLocal();\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t//if we go from local to scaled\r\n\t\t\t\tif (inScaledSpace && !previousState)\r\n\t\t\t\t{\r\n\t\t\t\t\tSwitchEffectsScaled();\r\n\t\t\t\t}\r\n\r\n\t\t\t\t//For wave interactions, consider we are in scaledSpace only if we aren't in map view, otherwise we can be in the surface but pqsController is inactive\r\n\t\t\t\tif (!MapView.MapIsEnabled)\r\n\t\t\t\t\tsimulateOceanInteraction = prolandManager.parentCelestialBody.pqsController.isActive;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tinScaledSpace = true;\r\n\t\t\t\tsimulateOceanInteraction = false;\r\n\t\t\t}\r\n\r\n\t\t\tif (skyNodeInitiated)\r\n\t\t\t{\r\n\t\t\t\tif (!precomputedAtmoLoaded)\r\n                {\r\n\t\t\t\t\tInitOrRequestPrecomputedAtmo();\r\n                }\r\n\t\t\t\telse if (!atmosphereShadersInitiated)\r\n                {\r\n\t\t\t\t\tInitSkySphere ();\r\n\r\n\t\t\t\t\tInitPostprocessMaterialUniforms (localScatteringMaterial);\r\n\t\t\t\t\tInitScaledScattering ();\r\n\r\n\t\t\t\t\ttry {StartCoroutine(DelayedTweakStockPlanet ());}\r\n\t\t\t\t\tcatch (Exception e){Utils.LogError(\"Error when starting SkyNode::DelayedTweakStockPlanet coroutine \"+e.Message);};\r\n\r\n\t\t\t\t\tif (Scatterer.Instance.mainSettings.integrateWithEVEClouds && usesCloudIntegration)\r\n\t\t\t\t\t\tInitEVEClouds ();\r\n\r\n\t\t\t\t\tInitOceanMaterialUniforms();\r\n\r\n\t\t\t\t\tatmosphereShadersInitiated = true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tInterpolateVariables ();\r\n\r\n\t\t\t\tif (prolandManager.hasOcean && !Scatterer.Instance.mainSettings.useOceanShaders)\r\n\t\t\t\t{\r\n\t\t\t\t\tskySphere.MeshRenderer.enabled = (altitude>=0f);\r\n\t\t\t\t\tstockSkyGameObject.SetActive(altitude<0f); //re-enable stock sky meshrenderer, for compatibility with stock underwater effect\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void SwitchEffectsScaled()\r\n\t\t{\r\n\t\t\tUtils.LogInfo (\"Skynode switch effects to scaled mode: \"+prolandManager.parentCelestialBody.name);\r\n\r\n\t\t\tif (skySphere != null)\r\n\t\t\t\tskySphere.SwitchScaledMode ();\r\n\t\t\tif (scaledScatteringContainer != null)\r\n\t\t\t\tscaledScatteringContainer.SwitchScaledMode ();\r\n\t\t\tif (localScatteringContainer != null)\r\n\t\t\t\tlocalScatteringContainer.SetActivated(false);\r\n\t\t}\r\n\r\n\t\tpublic void SwitchEffectsLocal()\r\n\t\t{\r\n\t\t\tUtils.LogInfo (\"Skynode switch effects to local mode \"+prolandManager.parentCelestialBody.name);\r\n\r\n\t\t\tif (skySphere != null)\r\n\t\t\t\tskySphere.SwitchLocalMode();\r\n\t\t\tif (scaledScatteringContainer != null)\r\n\t\t\t\tscaledScatteringContainer.SwitchLocalMode ();\r\n\t\t\tif (localScatteringContainer != null)\r\n\t\t\t\tlocalScatteringContainer.SetActivated(true);\r\n\t\t}\r\n\t\t\r\n\t\tpublic void SetUniforms (Material mat)\r\n        {\r\n            mat.SetFloat(ShaderProperties._Alpha_Global_PROPERTY, interpolatedSettings.skyAlpha);\r\n            mat.SetFloat(ShaderProperties._Extinction_Tint_PROPERTY, interpolatedSettings.skyExtinctionTint);\r\n            mat.SetFloat(ShaderProperties.extinctionTint_PROPERTY, interpolatedSettings.extinctionTint); //extinctionTint for scaled+local\r\n            mat.SetFloat(ShaderProperties.extinctionThickness_PROPERTY, interpolatedSettings.extinctionThickness);\r\n\r\n            mat.SetFloat(ShaderProperties.Rg_PROPERTY, Rg * atmosphereStartRadiusScale);\r\n            mat.SetFloat(ShaderProperties.Rt_PROPERTY, Rt);\r\n\r\n            mat.SetFloat(ShaderProperties.mieG_PROPERTY, Mathf.Clamp(m_mieG, 0.0f, 0.99f));\r\n\r\n            mat.SetVector(ShaderProperties._Sun_WorldSunDir_PROPERTY, prolandManager.getDirectionToMainSun());\r\n\r\n            mat.SetFloat(ShaderProperties._SkyExposure_PROPERTY, interpolatedSettings.skyExposure);\r\n            mat.SetFloat(ShaderProperties._ScatteringExposure_PROPERTY, interpolatedSettings.scatteringExposure);\r\n\r\n\r\n            if ((prolandManager.secondarySuns.Count > 0) || Scatterer.Instance.mainSettings.usePlanetShine)\r\n            {\r\n                mat.SetMatrix(ShaderProperties.planetShineSources_PROPERTY, prolandManager.planetShineSourcesMatrix);\r\n                mat.SetMatrix(ShaderProperties.planetShineRGB_PROPERTY, prolandManager.planetShineRGBMatrix);\r\n            }\r\n\r\n            UpdateEclipseAndRingUniforms(mat);\r\n\r\n            if (legacyGodraysRenderer)\r\n            {\r\n                mat.SetFloat(ShaderProperties._godrayStrength_PROPERTY, godrayStrength);\r\n            }\r\n\r\n            mat.SetColor(ShaderProperties._sunColor_PROPERTY, prolandManager.getIntensityModulatedSunColor());\r\n        }\r\n\r\n        private void UpdateEclipseAndRingUniforms(Material mat)\r\n        {\r\n            if (useEclipses)\r\n            {\r\n                mat.SetMatrix(ShaderProperties.lightOccluders1_PROPERTY, castersMatrix1);\r\n                mat.SetMatrix(ShaderProperties.lightOccluders2_PROPERTY, castersMatrix2);\r\n                mat.SetVector(ShaderProperties.sunPosAndRadius_PROPERTY, new Vector4(sunPosRelPlanet.x, sunPosRelPlanet.y,\r\n                                                                                       sunPosRelPlanet.z, (float)prolandManager.sunCelestialBody.Radius));\r\n            }\r\n\r\n            if (hasRingObjectAndShadowActivated)\r\n            {\r\n                mat.SetVector(ShaderProperties.ringNormal_PROPERTY, ringObject.transform.up);\r\n            }\r\n        }\r\n\r\n        public void SetOceanUniforms (Material mat)\r\n\t\t{\r\n\t\t\tif (mat == null)\r\n\t\t\t\treturn;\r\n\r\n\t\t\tmat.SetFloat (ShaderProperties._ScatteringExposure_PROPERTY, interpolatedSettings.scatteringExposure);\r\n\r\n\t\t\tmat.SetFloat (ShaderProperties.Rg_PROPERTY, Rg*atmosphereStartRadiusScale);\r\n\t\t\tmat.SetFloat (ShaderProperties.Rt_PROPERTY, Rt);\r\n\t\t\tmat.SetFloat (ShaderProperties.mieG_PROPERTY, Mathf.Clamp (m_mieG, 0.0f, 0.99f));\r\n\t\t\tmat.SetVector (ShaderProperties._Sun_WorldSunDir_PROPERTY, prolandManager.getDirectionToMainSun ());\r\n\t\t\tmat.SetVector(ShaderProperties._camForward_PROPERTY, Scatterer.Instance.nearCamera.transform.forward);\r\n\r\n\t\t\tmat.SetFloat (ShaderProperties._Alpha_Global_PROPERTY, interpolatedSettings.skyAlpha);\t\t\t\r\n\t\t\tmat.SetFloat (ShaderProperties._SkyExposure_PROPERTY, interpolatedSettings.skyExposure);\r\n\r\n\t\t\tUpdatePostProcessMaterialUniforms (mat);\r\n\t\t}\r\n\t\t\r\n\r\n\t\tpublic void InitPostprocessMaterialUniforms (Material mat)\r\n        {\r\n\t\t\tif (mat == null || !precomputedAtmoLoaded)\r\n\t\t\t\treturn;\r\n\r\n\t\t\tmat.SetFloat(ShaderProperties.mieG_PROPERTY, Mathf.Clamp(m_mieG, 0.0f, 0.99f));\r\n\r\n\t\t\tmat.SetTexture(ShaderProperties.AtmosphereAtlas_PROPERTY, atmosphereAtlas);\r\n\r\n\t\t\tmat.SetVector(ShaderProperties.InscatterAtlasScaleAndOffset_PROPERTY, atlasScaleAndOffsets[0]);\r\n\t\t\tmat.SetVector(ShaderProperties.IrradianceAtlasScaleAndOffset_PROPERTY, atlasScaleAndOffsets[1]);\r\n\t\t\tmat.SetVector(ShaderProperties.TransmittanceAtlasScaleAndOffset_PROPERTY, atlasScaleAndOffsets[2]);\r\n\t\t\tmat.SetVector(ShaderProperties.AtmosphereAtlasDimensions_PROPERTY, new Vector2(atmosphereAtlas.width, atmosphereAtlas.height));\r\n\r\n\t\t\tmat.SetFloat(ShaderProperties.M_PI_PROPERTY, Mathf.PI);\r\n            mat.SetFloat(ShaderProperties.Rg_PROPERTY, Rg * atmosphereStartRadiusScale);\r\n            mat.SetFloat(ShaderProperties.Rt_PROPERTY, Rt);\r\n            mat.SetVector(ShaderProperties.PRECOMPUTED_SCTR_LUT_DIM_PROPERTY, scatteringLutDimensions);\r\n\r\n\t\t\tmat.SetFloat(ShaderProperties.TRANSMITTANCE_W_PROPERTY, TRANSMITTANCE_W);\r\n\t\t\tmat.SetFloat(ShaderProperties.TRANSMITTANCE_H_PROPERTY, TRANSMITTANCE_H);\r\n\t\t\tmat.SetFloat(ShaderProperties.SKY_W_PROPERTY, SKY_W);\r\n            mat.SetFloat(ShaderProperties.SKY_H_PROPERTY, SKY_H);\r\n\r\n            mat.SetVector(ShaderProperties.betaR_PROPERTY, m_betaR / 1000.0f / mainMenuScaleFactor);\r\n            mat.SetFloat(ShaderProperties.mieG_PROPERTY, Mathf.Clamp(m_mieG, 0.0f, 0.99f));\r\n\r\n            mat.SetVector(ShaderProperties.betaMSca_PROPERTY, BETA_MSca / 1000.0f / mainMenuScaleFactor);\r\n            mat.SetVector(ShaderProperties.betaMEx_PROPERTY, (BETA_MSca / 1000.0f / mainMenuScaleFactor) / 0.9f);\r\n\r\n            mat.SetFloat(ShaderProperties.HR_PROPERTY, HR * 1000.0f * mainMenuScaleFactor);\r\n            mat.SetFloat(ShaderProperties.HM_PROPERTY, HM * 1000.0f * mainMenuScaleFactor);\r\n\r\n\r\n            mat.SetVector(ShaderProperties.SUN_DIR_PROPERTY, prolandManager.getDirectionToMainSun());\r\n\r\n            Utils.EnableOrDisableShaderKeywords(mat, \"PLANETSHINE_ON\", \"PLANETSHINE_OFF\", (prolandManager.secondarySuns.Count > 0) || Scatterer.Instance.mainSettings.usePlanetShine);\r\n\r\n            //When using custom ocean shaders, we don't reuse the ocean mesh to render scattering separately: Instead ocean shader handles scattering internally\r\n            //When the ocean starts fading out when transitioning to orbit, ocean shader stops doing scattering, and stops writing to z-buffer\r\n            //The ocean floor vertexes are then used by the scattering shader, moving them to the surface to render scattering, this is not needed for stock ocean so disable it\r\n            Utils.EnableOrDisableShaderKeywords(mat, \"CUSTOM_OCEAN_ON\", \"CUSTOM_OCEAN_OFF\", Scatterer.Instance.mainSettings.useOceanShaders && prolandManager.hasOcean);\r\n\r\n            Utils.EnableOrDisableShaderKeywords(mat, \"DITHERING_ON\", \"DITHERING_OFF\", Scatterer.Instance.mainSettings.useDithering);\r\n\r\n            if (prolandManager.flatScaledSpaceModel && prolandManager.parentCelestialBody.pqsController)\r\n                mat.SetFloat(ShaderProperties._PlanetOpacity_PROPERTY, 0f);\r\n            else\r\n                mat.SetFloat(ShaderProperties._PlanetOpacity_PROPERTY, 1f);\r\n\r\n            mat.SetColor(ShaderProperties._sunColor_PROPERTY, prolandManager.getIntensityModulatedSunColor());\r\n            mat.SetColor(ShaderProperties.cloudSunColor_PROPERTY, prolandManager.cloudIntegrationUsesScattererSunColors ? prolandManager.getIntensityModulatedSunColor() : prolandManager.mainScaledSunLight.color * prolandManager.mainScaledSunLight.intensity);\r\n\r\n            float camerasOverlap = 0f;\r\n            if (!Scatterer.Instance.unifiedCameraMode)\r\n                camerasOverlap = Scatterer.Instance.nearCamera.farClipPlane - Scatterer.Instance.farCamera.nearClipPlane;\r\n\r\n            mat.SetFloat(ShaderProperties._ScattererCameraOverlap_PROPERTY, camerasOverlap);\r\n\r\n\t\t\tInitGodraysUniforms(mat);\r\n\r\n\t\t\tUtils.SetToneMapping(mat);\r\n\r\n            InitEclipseAndRingUniforms(mat);\r\n        }\r\n\r\n        public void UpdatePostProcessMaterialUniforms (Material mat)\r\n\t\t{\r\n\t\t\tmat.SetFloat (ShaderProperties._global_alpha_PROPERTY, interpolatedSettings.postProcessAlpha);\r\n\t\t\tmat.SetFloat (ShaderProperties._ScatteringExposure_PROPERTY, interpolatedSettings.scatteringExposure);\r\n\t\t\tmat.SetFloat (ShaderProperties._global_depth_PROPERTY, interpolatedSettings.postProcessDepth *1000000);\r\n\r\n\t\t\tif (prolandManager.flatScaledSpaceModel && prolandManager.parentCelestialBody.pqsController)\r\n\t\t\t{\r\n\t\t\t\tif (MapView.MapIsEnabled)\r\n\t\t\t\t\tmat.SetFloat (ShaderProperties._PlanetOpacity_PROPERTY, 0f);\r\n\t\t\t\telse\r\n\t\t\t\t\tmat.SetFloat (ShaderProperties._PlanetOpacity_PROPERTY, 1f - prolandManager.parentCelestialBody.pqsController.surfaceMaterial.GetFloat (ShaderProperties._PlanetOpacity_PROPERTY));\r\n\t\t\t}\r\n\r\n\t\t\tmat.SetFloat (ShaderProperties._Post_Extinction_Tint_PROPERTY, interpolatedSettings.extinctionTint);\r\n\t\t\tmat.SetFloat (ShaderProperties.extinctionThickness_PROPERTY, interpolatedSettings.extinctionThickness);\r\n\r\n\t\t\tmat.SetVector (ShaderProperties.SUN_DIR_PROPERTY, prolandManager.getDirectionToMainSun ());\r\n\t\t\tmat.SetVector (ShaderProperties._planetPos_PROPERTY, parentLocalTransform.position);\r\n\r\n\t\t\tmat.SetColor (ShaderProperties.cloudSunColor_PROPERTY, prolandManager.cloudIntegrationUsesScattererSunColors ? prolandManager.getIntensityModulatedSunColor() : prolandManager.mainScaledSunLight.color * prolandManager.mainScaledSunLight.intensity );\r\n\r\n\t\t\tif ((prolandManager.secondarySuns.Count > 0) || Scatterer.Instance.mainSettings.usePlanetShine)\r\n\t\t\t{\r\n\t\t\t\tmat.SetMatrix (ShaderProperties.planetShineSources_PROPERTY, prolandManager.planetShineSourcesMatrix);\r\n\t\t\t\tmat.SetMatrix (ShaderProperties.planetShineRGB_PROPERTY, prolandManager.planetShineRGBMatrix);\r\n\t\t\t\tmat.SetMatrix (ShaderProperties.cloudPlanetShineRGB_PROPERTY, prolandManager.cloudIntegrationUsesScattererSunColors ?  prolandManager.planetShineRGBMatrix : prolandManager.planetShineOriginalRGBMatrix );\r\n\t\t\t}\r\n\r\n\t\t\tif (legacyGodraysRenderer)\r\n\t\t\t{\r\n\t\t\t\tmat.SetFloat(ShaderProperties._godrayStrength_PROPERTY, godrayStrength);\r\n\t\t\t}\r\n\r\n\t\t\tmat.SetColor (ShaderProperties._sunColor_PROPERTY, prolandManager.getIntensityModulatedSunColor());\r\n\r\n\t\t\tUpdateEclipseAndRingUniforms(mat);\r\n\t\t}\r\n\r\n\t\tpublic void InitUniforms (Material mat)\r\n        {\r\n            if (mat == null || !precomputedAtmoLoaded)\r\n                return;\r\n\r\n            mat.SetFloat(ShaderProperties.M_PI_PROPERTY, Mathf.PI);\r\n            mat.SetFloat(ShaderProperties.mieG_PROPERTY, Mathf.Clamp(m_mieG, 0.0f, 0.99f));\r\n\r\n            mat.SetVector(ShaderProperties.betaR_PROPERTY, m_betaR / 1000.0f / mainMenuScaleFactor);\r\n\r\n\t\t\tmat.SetTexture(ShaderProperties.AtmosphereAtlas_PROPERTY, atmosphereAtlas);\r\n\r\n\t\t\tmat.SetVector(ShaderProperties.InscatterAtlasScaleAndOffset_PROPERTY, atlasScaleAndOffsets[0]);\r\n\t\t\tmat.SetVector(ShaderProperties.IrradianceAtlasScaleAndOffset_PROPERTY, atlasScaleAndOffsets[1]);\r\n\t\t\tmat.SetVector(ShaderProperties.TransmittanceAtlasScaleAndOffset_PROPERTY, atlasScaleAndOffsets[2]);\r\n\t\t\tmat.SetVector(ShaderProperties.AtmosphereAtlasDimensions_PROPERTY, atlasDimensions);\r\n\r\n\t\t\tmat.SetFloat(ShaderProperties.Rg_PROPERTY, Rg * atmosphereStartRadiusScale);\r\n            mat.SetFloat(ShaderProperties.Rt_PROPERTY, Rt);\r\n\r\n            mat.SetFloat(ShaderProperties.TRANSMITTANCE_W_PROPERTY, TRANSMITTANCE_W);\r\n            mat.SetFloat(ShaderProperties.TRANSMITTANCE_H_PROPERTY, TRANSMITTANCE_H);\r\n            mat.SetFloat(ShaderProperties.SKY_W_PROPERTY, SKY_W);\r\n            mat.SetFloat(ShaderProperties.SKY_H_PROPERTY, SKY_H);\r\n            mat.SetVector(ShaderProperties.PRECOMPUTED_SCTR_LUT_DIM_PROPERTY, scatteringLutDimensions);\r\n            mat.SetFloat(ShaderProperties.HR_PROPERTY, HR * 1000.0f * mainMenuScaleFactor);\r\n            mat.SetFloat(ShaderProperties.HM_PROPERTY, HM * 1000.0f * mainMenuScaleFactor);\r\n            mat.SetVector(ShaderProperties.betaMSca_PROPERTY, BETA_MSca / 1000.0f / mainMenuScaleFactor);\r\n            mat.SetVector(ShaderProperties.betaMEx_PROPERTY, (BETA_MSca / 1000.0f / mainMenuScaleFactor) / 0.9f);\r\n\r\n            InitEclipseAndRingUniforms(mat);\r\n\r\n            Utils.EnableOrDisableShaderKeywords(mat, \"PLANETSHINE_ON\", \"PLANETSHINE_OFF\", (prolandManager.secondarySuns.Count > 0) || Scatterer.Instance.mainSettings.usePlanetShine);\r\n            Utils.EnableOrDisableShaderKeywords(mat, \"DITHERING_ON\", \"DITHERING_OFF\", Scatterer.Instance.mainSettings.useDithering);\r\n\r\n            mat.SetFloat(ShaderProperties.flatScaledSpaceModel_PROPERTY, prolandManager.flatScaledSpaceModel ? 1f : 0f);\r\n            mat.SetColor(ShaderProperties._sunColor_PROPERTY, prolandManager.getIntensityModulatedSunColor());\r\n            mat.SetColor(ShaderProperties.cloudSunColor_PROPERTY, prolandManager.cloudIntegrationUsesScattererSunColors ? prolandManager.getIntensityModulatedSunColor() : prolandManager.mainScaledSunLight.color * prolandManager.mainScaledSunLight.intensity);\r\n\r\n            InitGodraysUniforms(mat);\r\n\r\n            Utils.SetToneMapping(mat);\r\n        }\r\n\r\n        private void InitGodraysUniforms(Material mat)\r\n        {\r\n\t\t\tif (legacyGodraysRenderer != null)\r\n            {\r\n                mat.SetTexture(ShaderProperties._godrayDepthTexture_PROPERTY, legacyGodraysRenderer.volumeDepthTexture);\r\n                mat.EnableKeyword(\"GODRAYS_LEGACY\");\r\n                mat.EnableKeyword(\"RAYMARCHED_GODRAYS_OFF\");\r\n                mat.DisableKeyword(\"GODRAYS_OFF\");\r\n\t\t\t\tmat.SetFloat(ShaderProperties.godraysSoftwareSwitch_PROPERTY, 0f);\r\n\r\n\t\t\t}\r\n            else\r\n            {\r\n                mat.EnableKeyword(\"RAYMARCHED_GODRAYS_OFF\");\r\n                mat.EnableKeyword(\"GODRAYS_OFF\");\r\n\t\t\t\tmat.SetFloat(ShaderProperties.godraysSoftwareSwitch_PROPERTY, 0f);\r\n\t\t\t}\r\n        }\r\n\r\n        private void InitEclipseAndRingUniforms(Material mat)\r\n        {\r\n            if (hasRingObjectAndShadowActivated)\r\n            {\r\n                Utils.EnableOrDisableShaderKeywords(mat, \"RINGSHADOW_ON\", \"RINGSHADOW_OFF\", true);\r\n                mat.SetFloat(\"useRingShadow\", 1f);\r\n                mat.SetFloat(ShaderProperties.ringInnerRadius_PROPERTY, ringInnerRadius);\r\n                mat.SetFloat(ShaderProperties.ringOuterRadius_PROPERTY, ringOuterRadius);\r\n                mat.SetVector(ShaderProperties.ringNormal_PROPERTY, ringObject.transform.up);\r\n                mat.SetTexture(ShaderProperties.ringTexture_PROPERTY, ringTexture);\r\n            }\r\n            else\r\n            {\r\n                Utils.EnableOrDisableShaderKeywords(mat, \"RINGSHADOW_ON\", \"RINGSHADOW_OFF\", false);\r\n                mat.SetFloat(\"useRingShadow\", 0f);\r\n            }\r\n\r\n            Utils.EnableOrDisableShaderKeywords(mat, \"ECLIPSES_ON\", \"ECLIPSES_OFF\", useEclipses);\r\n            mat.SetFloat(\"useEclipses\", useEclipses ? 1f : 0f);\r\n        }\r\n\r\n        public void TogglePostProcessing()\r\n\t\t{\r\n\t\t\tpostprocessingEnabled = !postprocessingEnabled;\r\n\t\t}\r\n\t\t\r\n\t\tvoid InitOrRequestPrecomputedAtmo ()\r\n\t\t{\r\n\t\t\tRg = (float) prolandManager.GetRadius ();\r\n\t\t\tRt = AtmoPreprocessor.CalculateRt (Rg*atmosphereStartRadiusScale, HR*mainMenuScaleFactor, HM*mainMenuScaleFactor, m_betaR/mainMenuScaleFactor, BETA_MSca/mainMenuScaleFactor, useOzone, ozoneHeight/mainMenuScaleFactor, ozoneFalloff/mainMenuScaleFactor);\r\n\r\n\t\t\t//Compute atmo hash and path\r\n\t\t\tstring cachePath = Utils.GameDataPath + \"/ScattererAtmosphereCache/PluginData\";\r\n\t\t\tfloat originalRt = AtmoPreprocessor.CalculateRt ((float) prolandManager.parentCelestialBody.Radius * atmosphereStartRadiusScale, HR, HM, m_betaR, BETA_MSca, useOzone, ozoneHeight, ozoneFalloff);\r\n\t\t\tstring atmohash = AtmoPreprocessor.GetAtmoHash((float) prolandManager.parentCelestialBody.Radius * atmosphereStartRadiusScale, originalRt, m_betaR, BETA_MSca, m_mieG, HR, HM, averageGroundReflectance, multipleScattering, scatteringLutDimensions, useOzone, ozoneAbsorption, ozoneHeight, ozoneFalloff);\r\n\t\t\tcachePath += \"/\" + atmohash;\r\n\r\n\t\t\tstring atlasPath = cachePath + \"/atlas.half\";\r\n\r\n\t\t\tif (!System.IO.File.Exists (atlasPath))\r\n\t\t\t{\r\n\t\t\t\tAtmoPreprocessor.Generate ((float) prolandManager.parentCelestialBody.Radius * atmosphereStartRadiusScale, originalRt, m_betaR, BETA_MSca, m_mieG, HR, HM, averageGroundReflectance, multipleScattering, scatteringLutDimensions, previewMode, cachePath, useOzone, ozoneAbsorption, ozoneHeight, ozoneFalloff, prolandManager.parentCelestialBody.name);\r\n\t\t\t\tprecomputedAtmoLoaded = false;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tLoadPrecomputedAtmo(atlasPath);\r\n\t\t\tprecomputedAtmoLoaded = true;\r\n\r\n\t\t\tif (atmosphereShadersInitiated)\r\n\t\t\t\tReinitAllMaterials();\r\n        }\r\n\r\n        private void LoadPrecomputedAtmo(string atlasPath)\r\n        {\r\n            var textureDimensions = new List<Vector2> {\r\n                    new Vector2(scatteringLutDimensions.x * scatteringLutDimensions.y, scatteringLutDimensions.z* scatteringLutDimensions.w),\r\n                    new Vector2(SKY_W, SKY_H),\r\n                    new Vector2(TRANSMITTANCE_W, TRANSMITTANCE_H) };\r\n\r\n            // Textures are packed in the simplest way possible, top-left to bottom-left\r\n            int atlasWidth = textureDimensions.Max(texture => (int)texture.x);\r\n            int atlasHeight = textureDimensions.Sum(texture => (int)texture.y);\r\n\r\n            atlasDimensions = new Vector2(atlasWidth, atlasHeight);\r\n\r\n            atmosphereAtlas = new Texture2D(atlasWidth, atlasHeight, TextureFormat.RGBAHalf, false);\r\n            atmosphereAtlas.wrapMode = TextureWrapMode.Clamp;\r\n            atmosphereAtlas.filterMode = FilterMode.Bilinear;\r\n            atmosphereAtlas.LoadRawTextureData(System.IO.File.ReadAllBytes(atlasPath));\r\n            atmosphereAtlas.Apply();\r\n\r\n            atlasScaleAndOffsets = AtmoPreprocessor.GetPackedTexturesScaleAndOffsets(textureDimensions, atlasDimensions);\r\n        }\r\n\r\n        public void ApplyAtmoFromUI(Vector4 inBETA_R, Vector4 inBETA_MSca, float inMIE_G, float inHR, float inHM, float inGRref, bool inMultiple, bool inFastPreviewMode, float inAtmosphereStartRadiusScale, bool inUseOzone, Vector3 inOzoneAbsorption, float inOzoneHeight, float inOzoneFalloff)\r\n\t\t{\r\n\t\t\tm_betaR = inBETA_R;\r\n\t\t\tBETA_MSca = inBETA_MSca;\r\n\t\t\tm_mieG = inMIE_G;\r\n\t\t\tHR = inHR;\r\n\t\t\tHM = inHM;\r\n\t\t\taverageGroundReflectance = inGRref;\r\n\t\t\tmultipleScattering = inMultiple;\r\n\t\t\tpreviewMode = inFastPreviewMode;\r\n\t\t\tscatteringLutDimensions = inFastPreviewMode ? AtmoPreprocessor.scatteringLutDimensionsPreview : AtmoPreprocessor.ScatteringLutDimensionsDefault ;\r\n\t\t\tatmosphereStartRadiusScale = inAtmosphereStartRadiusScale;\r\n\r\n\t\t\tozoneAbsorption = inOzoneAbsorption;\r\n\t\t\tozoneHeight = inOzoneHeight;\r\n\t\t\tozoneFalloff = inOzoneFalloff;\r\n\t\t\tuseOzone = inUseOzone;\r\n\r\n\t\t\tInitOrRequestPrecomputedAtmo ();\r\n\r\n\t\t\tfloat skySphereSize = 2 * (4 * (Rt - Rg*atmosphereStartRadiusScale) + Rg*atmosphereStartRadiusScale) / ScaledSpace.ScaleFactor;\r\n\t\t\tskySphere.Resize (skySphereSize);\r\n\t\t}\r\n\r\n\t\tvoid ReinitAllMaterials()\r\n        {\r\n            if (scaledEclipseMaterial)\r\n                InitUniforms(scaledEclipseMaterial);\r\n            if (skyMaterial)\r\n                InitUniforms(skyMaterial);\r\n            if (scaledScatteringMaterial)\r\n                InitUniforms(scaledScatteringMaterial);\r\n            if (sunflareExtinctionMaterial)\r\n                InitUniforms(sunflareExtinctionMaterial);\r\n            if (localScatteringMaterial)\r\n                InitPostprocessMaterialUniforms(localScatteringMaterial);\r\n\r\n            ReInitMaterialUniformsOnRenderTexturesLoss();\r\n\r\n            // make the clouds2d material optional\r\n            // add fields for volumetrics and raymarched volumetrics\r\n            if (Scatterer.Instance.eveReflectionHandler.EVECloudLayers.ContainsKey(celestialBodyName))\r\n            {\r\n                foreach (EVECloudLayer eveCloudLayer in Scatterer.Instance.eveReflectionHandler.EVECloudLayers[celestialBodyName])\r\n                {\r\n                    if (eveCloudLayer.Clouds2dMaterial != null)\r\n                    {\r\n                        InitUniforms(eveCloudLayer.Clouds2dMaterial);\r\n                        InitPostprocessMaterialUniforms(eveCloudLayer.Clouds2dMaterial);\r\n                    }\r\n\r\n                    if (eveCloudLayer.ParticleVolumetricsMaterial != null)\r\n                    {\r\n                        InitUniforms(eveCloudLayer.ParticleVolumetricsMaterial);\r\n                        InitPostprocessMaterialUniforms(eveCloudLayer.ParticleVolumetricsMaterial);\r\n                    }\r\n                }\r\n            }\r\n\r\n            InitOceanMaterialUniforms();\r\n        }\r\n\r\n        public void InitOceanMaterialUniforms()\r\n        {\r\n            if (prolandManager.GetOceanNode())\r\n            {\r\n                if (prolandManager.GetOceanNode().m_oceanMaterial)\r\n                {\r\n                    InitUniforms(prolandManager.GetOceanNode().m_oceanMaterial);\r\n                    InitPostprocessMaterialUniforms(prolandManager.GetOceanNode().m_oceanMaterial);\r\n                }\r\n\r\n                if (prolandManager.GetOceanNode().underwaterMaterial)\r\n                {\r\n                    InitPostprocessMaterialUniforms(prolandManager.GetOceanNode().underwaterMaterial);\r\n                }\r\n            }\r\n        }\r\n\r\n        public void OnDestroy()\r\n\t\t{\r\n\t\t\ttry {StopAllCoroutines ();}\r\n\t\t\tcatch (Exception){}\r\n\r\n\t\t\tif (Scatterer.Instance.mainSettings.autosavePlanetSettingsOnSceneChange && !isConfigModuleManagerPatch)\r\n\t\t\t{\r\n\t\t\t\tSaveToConfigNode ();\r\n\t\t\t}\r\n\r\n\t\t\tif (atmosphereAtlas)\r\n\t\t\t{\r\n\t\t\t\tUnityEngine.Object.DestroyImmediate(atmosphereAtlas);\r\n\t\t\t}\r\n\r\n\t\t\tif (skySphere != null)\r\n\t\t\t{\r\n\t\t\t\tskySphere.Cleanup ();\r\n\t\t\t}\r\n\r\n\t\t\tif (scaledScatteringContainer != null)\r\n\t\t\t{\r\n\t\t\t\tscaledScatteringContainer.Cleanup ();\r\n\t\t\t}\r\n\r\n\t\t\tif (localScatteringContainer != null)\r\n\t\t\t{\r\n\t\t\t\tlocalScatteringContainer.Cleanup();\r\n\t\t\t}\r\n\r\n\t\t\tif (legacyGodraysRenderer)\r\n\t\t\t{\r\n\t\t\t\tComponent.DestroyImmediate(legacyGodraysRenderer);\r\n\t\t\t}\r\n\r\n\t\t\t//disable eve integration scatterer flag\r\n\t\t\tif (Scatterer.Instance.mainSettings.integrateWithEVEClouds && usesCloudIntegration)\r\n\t\t\t{\r\n\t\t\t\ttry\r\n\t\t\t\t{\t\r\n\t\t\t\t\tif(Scatterer.Instance.eveReflectionHandler.EVECloudLayers.ContainsKey(celestialBodyName))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tforeach(var cloudLayer in Scatterer.Instance.eveReflectionHandler.EVECloudLayers[celestialBodyName])\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tif (cloudLayer.Clouds2dMaterial != null)\r\n                            {\r\n\t\t\t\t\t\t\t\tcloudLayer.Clouds2dMaterial.DisableKeyword(\"SCATTERER_ON\");\r\n\t\t\t\t\t\t\t\tcloudLayer.Clouds2dMaterial.EnableKeyword(\"SCATTERER_OFF\");\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tif (cloudLayer.ParticleVolumetricsMaterial != null)\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tcloudLayer.ParticleVolumetricsMaterial.DisableKeyword(\"SCATTERER_ON\");\r\n\t\t\t\t\t\t\t\tcloudLayer.ParticleVolumetricsMaterial.EnableKeyword(\"SCATTERER_OFF\");\r\n\t\t\t\t\t\t\t\tcloudLayer.ParticleVolumetricsMaterial.SetFloat(\"isUnderwater\", 0f);\r\n\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tcatch (Exception)\r\n\t\t\t\t{\r\n\t\t\t\t\t//TODO\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (originalScaledMesh && parentScaledTransform)\r\n\t\t\t{ \r\n\t\t\t\tvar mf = parentScaledTransform.GetComponent<MeshFilter> ();\r\n\t\t\t\tif (mf) mf.sharedMesh = originalScaledMesh;\r\n\t\t\t}\r\n\r\n\t\t\tRestoreStockScaledTexture ();\r\n\t\t}\r\n\r\n\t\tpublic bool LoadFromConfigNode ()\r\n\t\t{\r\n\t\t\tConfigNode cnToLoad = new ConfigNode();\r\n\t\t\tConfigNode[] configNodeArray;\r\n\t\t\tbool found = false;\r\n\r\n\t\t\tforeach (UrlDir.UrlConfig _url in Scatterer.Instance.planetsConfigsReader.atmoConfigs)\r\n\t\t\t{\r\n\t\t\t\tconfigNodeArray = _url.config.GetNodes(\"Atmo\");\r\n\t\t\t\t//if (_url.config.TryGetNode(\"Atmo\",ref cnToLoad))\r\n\r\n\t\t\t\tforeach(ConfigNode _cn in configNodeArray)\r\n\t\t\t\t{\r\n\t\t\t\t\tif (_cn.HasValue(\"name\") && _cn.GetValue(\"name\") == celestialBodyName)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcnToLoad = _cn;\r\n\t\t\t\t\t\tconfigUrl = _url;\r\n\t\t\t\t\t\tfound = true;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (found)\r\n\t\t\t{\r\n\t\t\t\tUtils.LogDebug(\" Atmosphere config found for: \"+celestialBodyName);\r\n\r\n\t\t\t\tConfigNode.LoadObjectFromConfig (this, cnToLoad);\r\n\t\t\t\r\n\t\t\t\tRg = (float) prolandManager.GetRadius ();\r\n\t\t\t\tRt = AtmoPreprocessor.CalculateRt (Rg * atmosphereStartRadiusScale, HR*mainMenuScaleFactor, HM*mainMenuScaleFactor, m_betaR/mainMenuScaleFactor, BETA_MSca/mainMenuScaleFactor, useOzone, ozoneHeight / mainMenuScaleFactor, ozoneFalloff / mainMenuScaleFactor);\r\n\r\n\t\t\t\tgodrayStrength = Mathf.Min(godrayStrength,1.0f);\r\n\r\n\t\t\t\t//compare parentConfigNode with the one on disk to determine if it's a ModuleManager Patch\r\n\t\t\t\tstring parentConfigNodePath = Utils.GameDataPath + configUrl.parent.url +\".cfg\";\r\n\t\t\t\tif (System.IO.File.Exists(parentConfigNodePath))\r\n\t\t\t\t{\r\n\t\t\t\t\tConfigNode cnParentFromFile = ConfigNode.Load(Utils.GameDataPath + configUrl.parent.url +\".cfg\");\r\n\r\n\t\t\t\t\tif (cnParentFromFile.HasNode(\"Scatterer_atmosphere\"))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tint comparisonResult = configUrl.config.ToString().CompareTo(cnParentFromFile.GetNode(\"Scatterer_atmosphere\").ToString());\r\n\t\t\t\t\t\tisConfigModuleManagerPatch = (comparisonResult != 0);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tUtils.LogError(\" Atmosphere config not found for: \"+celestialBodyName);\r\n\t\t\t\tUtils.LogDebug(\" Removing \"+celestialBodyName +\" from planets list\");\r\n\r\n\t\t\t\tScatterer.Instance.planetsConfigsReader.scattererCelestialBodies.Remove(Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies.Find(_cb => _cb.celestialBodyName == celestialBodyName));\r\n\r\n\t\t\t\tprolandManager.OnDestroy();\r\n\t\t\t\tUnityEngine.Object.Destroy (prolandManager);\r\n\t\t\t\tUnityEngine.Object.Destroy (this);\r\n\t\t\t}\r\n\r\n\t\t\treturn found;\r\n\t\t}\r\n\t\t\r\n\t\tpublic void SaveToConfigNode ()\r\n\t\t{\r\n\t\t\tConfigNode[] configNodeArray;\r\n\t\t\tbool found = false;\r\n\r\n\t\t\tconfigNodeArray = configUrl.config.GetNodes(\"Atmo\");\r\n\t\t\t\r\n\t\t\tforeach(ConfigNode _cn in configNodeArray)\r\n\t\t\t{\r\n\t\t\t\tif (_cn.HasValue(\"name\") && _cn.GetValue(\"name\") == celestialBodyName)\r\n\t\t\t\t{\r\n\t\t\t\t\tConfigNode cnTemp = ConfigNode.CreateConfigFromObject (this);\r\n\t\t\t\t\t_cn.ClearData();\r\n\t\t\t\t\tConfigNode.Merge (_cn, cnTemp);\r\n\t\t\t\t\t_cn.name=\"Atmo\";\r\n\t\t\t\t\tUtils.LogDebug(\" saving \"+celestialBodyName+\" atmo config to: \"+configUrl.parent.url);\r\n\t\t\t\t\tconfigUrl.parent.SaveConfigs ();\r\n\t\t\t\t\tfound=true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (!found)\r\n\t\t\t{\r\n\t\t\t\tUtils.LogDebug(\" couldn't find config file to save to\");\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid DisableStockSky ()\r\n\t\t{\r\n\t\t\tfor (int i = 0; i < parentScaledTransform.childCount; i++) {\r\n\t\t\t\tif (parentScaledTransform.GetChild (i).gameObject.layer == 9) {\r\n\t\t\t\t\tif (parentScaledTransform.GetChild (i).gameObject.name == \"Atmosphere\") {\r\n\t\t\t\t\t\tstockSkyGameObject = parentScaledTransform.GetChild (i).gameObject;\r\n\t\t\t\t\t\tstockSkyGameObject.SetActive (false);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\tIEnumerator DelayedTweakStockPlanet()\r\n\t\t{\r\n\t\t\tif (!stockScaledPlanetMeshRenderer.sharedMaterial.HasProperty (\"_MainTex\"))  //this property is absent on gas giants\r\n\t\t\t{\r\n\t\t\t\tDisableStockSky();\r\n\r\n\t\t\t\tif (adjustScaledTexture)\r\n\t\t\t\t\tTweakStockScaledTexture ();\r\n\t\t\t}\r\n\t\t\telse // Have to delay this until Kopernicus loads the on-demand textures and also check it's not a rendertexture (ie overridden by scatterer)\r\n\t\t\t{\r\n\t\t\t\twhile (true)\r\n\t\t\t\t{\r\n\t\t\t\t\tTexture maintex = stockScaledPlanetMeshRenderer.sharedMaterial.GetTexture(\"_MainTex\");\r\n\t\t\t\t\tif (maintex != null && maintex is Texture2D)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif (adjustScaledTexture)\r\n\t\t\t\t\t\t\tTweakStockScaledTexture ();\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tTweakStockAtmosphere ();\r\n\r\n\t\t\t\t\t\tyield return StartCoroutine(CheckOnDemandUnload());\t//once loaded, wait for it to unload and resume checking again\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tyield return new WaitForSeconds(1f);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Check if kopernicus on demand unloads the planet, then we have to start waiting for it to load it again\r\n\t\tIEnumerator CheckOnDemandUnload()\r\n\t\t{\r\n\t\t\twhile (true)\r\n\t\t\t{\r\n\t\t\t\tif (stockScaledPlanetMeshRenderer.sharedMaterial.GetTexture(\"_MainTex\") == null)\r\n\t\t\t\t{\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tyield return new WaitForSeconds(3f);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void TweakStockAtmosphere ()\t//move to utils/scaledUtils etc\r\n\t\t{\r\n\t\t\tDisableStockSky ();\r\n\t\t\tList<Material> materials = new List<Material>(stockScaledPlanetMeshRenderer.sharedMaterials);\r\n\t\t\tmaterials.RemoveAll(x => x.shader.name == \"Scatterer/ScaledPlanetEclipse\");\r\n\r\n\t\t\tif (useEclipses)\r\n\t\t\t{\r\n                var deferred = ReflectionUtils.getType(\"Deferred.Deferred\");\r\n\t\t\t\tbool deferredInstalled = deferred != null;\r\n\r\n                // Split the main pass and the additive light passes into separate materials with different renderqueues so we can inject eclipses after the first pass, and make it apply only to the main pass\r\n\t\t\t\t// But only if deferred is not installed, otherwise this breaks deferred rendering\r\n                if (parentScaledTransform.GetComponent<PlanetSecondaryLightUpdater>() == null && !deferredInstalled)\r\n\t\t\t\t{\r\n\t\t\t\t\tList<Material> materialsNoCityLights = new List<Material>(materials);\r\n\t\t\t\t\tmaterialsNoCityLights.RemoveAll(x => x.shader.name == \"EVE/PlanetCityLight\");\r\n\r\n\t\t\t\t\tMaterial planetScaledSpaceMaterial = materialsNoCityLights.ElementAt(0);\r\n\r\n\t\t\t\t\tplanetScaledSpaceMaterial.SetShaderPassEnabled(\"ForwardBase\", true);\r\n\t\t\t\t\tplanetScaledSpaceMaterial.SetShaderPassEnabled(\"ForwardAdd\", false);\r\n\r\n\t\t\t\t\tmaterials.Add(Material.Instantiate(planetScaledSpaceMaterial));\r\n\r\n\t\t\t\t\tmaterials.Last().CopyPropertiesFromMaterial(materialsNoCityLights.ElementAt(0));\r\n\t\t\t\t\tmaterials.Last().SetShaderPassEnabled(\"ForwardBase\", false);\r\n\t\t\t\t\tmaterials.Last().SetShaderPassEnabled(\"ForwardAdd\", true);\r\n\t\t\t\t\tmaterials.Last().renderQueue = 2002;\r\n\r\n\t\t\t\t\tPlanetSecondaryLightUpdater secondaryLightUpdater = parentScaledTransform.gameObject.AddComponent<PlanetSecondaryLightUpdater>();\r\n\t\t\t\t\tsecondaryLightUpdater.Init(planetScaledSpaceMaterial, materials.Last());\r\n\t\t\t\t}\r\n\r\n\t\t\t\tmaterials.Add(scaledEclipseMaterial);\r\n\t\t\t}\r\n\r\n\t\t\tstockScaledPlanetMeshRenderer.sharedMaterials = materials.ToArray ();\r\n\r\n\t\t\tforeach (Material sharedMaterial in materials)\r\n\t\t\t{\r\n\t\t\t\tsharedMaterial.SetFloat (Shader.PropertyToID (\"_rimBlend\"), rimBlend / 100f);\r\n\t\t\t\tsharedMaterial.SetFloat (Shader.PropertyToID (\"_rimPower\"), rimpower / 100f);\r\n\t\t\t\t\r\n\t\t\t\tif (sharedMaterial.shader.name == \"Terrain/Scaled Planet (RimAerial) Standard\")\r\n\t\t\t\t{\r\n\t\t\t\t\tsharedMaterial.SetColor (\"_SpecColor\", new Color (specR / 255f, specG / 255f, specB / 255f));\r\n\t\t\t\t\tif (HighLogic.LoadedScene == GameScenes.MAINMENU)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tsharedMaterial.SetFloat (\"_Shininess\", shininess / 140f); //for some reason still too strong in main menu\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tsharedMaterial.SetFloat (\"_Shininess\", shininess / 120f);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tsharedMaterial.SetColor (\"_SpecColor\", new Color (specR / 100f, specG / 100f, specB / 100f));\r\n\t\t\t\t\tsharedMaterial.SetFloat (\"_Shininess\", shininess / 100f);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (prolandManager.parentCelestialBody.pqsController != null)\r\n\t\t\t{\r\n\t\t\t\tUtils.EnableOrDisableShaderKeywords(prolandManager.parentCelestialBody.pqsController.fallbackMaterial,\"AERIAL_ON\", \"AERIAL_OFF\", false);\r\n\t\t\t\tUtils.EnableOrDisableShaderKeywords(prolandManager.parentCelestialBody.pqsController.lowQualitySurfaceMaterial,\"AERIAL_ON\", \"AERIAL_OFF\", false);\r\n\t\t\t\tUtils.EnableOrDisableShaderKeywords(prolandManager.parentCelestialBody.pqsController.mediumQualitySurfaceMaterial,\"AERIAL_ON\", \"AERIAL_OFF\", false);\r\n\t\t\t\tUtils.EnableOrDisableShaderKeywords(prolandManager.parentCelestialBody.pqsController.highQualitySurfaceMaterial,\"AERIAL_ON\", \"AERIAL_OFF\", false);\r\n\t\t\t\tUtils.EnableOrDisableShaderKeywords(prolandManager.parentCelestialBody.pqsController.ultraQualitySurfaceMaterial,\"AERIAL_ON\", \"AERIAL_OFF\", false);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void TweakStockScaledTexture () \t//move to utils/scaledUtils etc\r\n\t\t{\r\n\t\t\tif (HighLogic.LoadedScene != GameScenes.MAINMENU)\r\n\t\t\t{ \r\n\t\t\t\tList<Material> materials = new List<Material>(stockScaledPlanetMeshRenderer.sharedMaterials);\r\n\t\t\t\r\n\t\t\t\tforeach (Material sharedMaterial in materials)\r\n\t\t\t\t{\t\r\n\t\t\t\t\tif (sharedMaterial.shader.name.Contains(\"Terrain/Scaled Planet (RimAerial)\"))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif (!originalPlanetTexture)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tTexture maintex = sharedMaterial.GetTexture(\"_MainTex\");\r\n\t\t\t\t\t\t\tif (maintex is Texture2D)\r\n\t\t\t\t\t\t\t{ \r\n\t\t\t\t\t\t\t\toriginalPlanetTexture = (Texture2D)maintex;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tif (originalPlanetTexture)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tif (!adjustedPlanetTexture)\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tadjustedPlanetTexture = new RenderTexture(originalPlanetTexture.width, originalPlanetTexture.height, 0, RenderTextureFormat.ARGB32);\r\n\t\t\t\t\t\t\t\tadjustedPlanetTexture.name = \"ScattererAdjustedPlanetMap\";\r\n\t\t\t\t\t\t\t\tadjustedPlanetTexture.autoGenerateMips = true;\r\n\t\t\t\t\t\t\t\tadjustedPlanetTexture.Create();\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tMaterial imageAdjustMat = new Material (ShaderReplacer.Instance.LoadedShaders[(\"Scatterer/ScaledTextureAdjust\")]);\r\n\t\t\t\t\t\t\timageAdjustMat.SetTexture(\"inputTexture\", originalPlanetTexture);\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\timageAdjustMat.SetFloat(\"_scaledLandBrightnessAdjust\", scaledLandBrightnessAdjust);\r\n\t\t\t\t\t\t\timageAdjustMat.SetFloat(\"_scaledLandContrastAdjust\",   scaledLandContrastAdjust);\r\n\t\t\t\t\t\t\timageAdjustMat.SetFloat(\"_scaledLandSaturationAdjust\", scaledLandSaturationAdjust);\r\n\r\n\t\t\t\t\t\t\timageAdjustMat.SetFloat(\"_scaledOceanBrightnessAdjust\", scaledOceanBrightnessAdjust);\r\n\t\t\t\t\t\t\timageAdjustMat.SetFloat(\"_scaledOceanContrastAdjust\",   scaledOceanContrastAdjust);\r\n\t\t\t\t\t\t\timageAdjustMat.SetFloat(\"_scaledOceanSaturationAdjust\", scaledOceanSaturationAdjust);\r\n\r\n\t\t\t\t\t\t\tGraphics.Blit(originalPlanetTexture, adjustedPlanetTexture, imageAdjustMat);\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tsharedMaterial.SetTexture(\"_MainTex\", adjustedPlanetTexture);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void RestoreStockScaledTexture () \t//move to utils/scaledUtils etc\r\n\t\t{\r\n\t\t\tif (originalPlanetTexture && stockScaledPlanetMeshRenderer)\r\n\t\t\t{\r\n\t\t\t\tList<Material> materials = new List<Material>(stockScaledPlanetMeshRenderer.sharedMaterials);\r\n\r\n\t\t\t\tforeach (Material sharedMaterial in materials)\r\n\t\t\t\t{\t\r\n\t\t\t\t\tif (sharedMaterial.shader.name.Contains(\"Terrain/Scaled Planet (RimAerial)\"))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tsharedMaterial.SetTexture(\"_MainTex\", originalPlanetTexture);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (adjustedPlanetTexture)\r\n\t\t\t{\r\n\t\t\t\tadjustedPlanetTexture.Release();\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tpublic void TweakScaledMesh() \t//move to utils/scaledUtils etc\r\n\t\t{\r\n\t\t\tif (!originalScaledMesh)\r\n\t\t\t{\r\n\t\t\t\toriginalScaledMesh = parentScaledTransform.GetComponent<MeshFilter> ().sharedMesh;\r\n\t\t\t}\r\n\r\n\t\t\ttweakedScaledmesh = (Mesh)Instantiate (originalScaledMesh);\r\n\t\t\t\r\n\t\t\tdouble scaledRadius = prolandManager.GetRadius () / (ScaledSpace.ScaleFactor * parentScaledTransform.localScale.x);\r\n\t\t\t\r\n\t\t\tVector3[] verts = tweakedScaledmesh.vertices;\r\n\t\t\t\r\n\t\t\tfor (int i=0; i<verts.Length; i++)\r\n\t\t\t{\r\n\t\t\t\tif (verts [i].magnitude > scaledRadius)\r\n\t\t\t\t{\r\n\t\t\t\t\tverts [i] = verts [i].normalized * (Mathf.Lerp (verts [i].magnitude, (float)scaledRadius, flattenScaledSpaceMesh));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\ttweakedScaledmesh.vertices = verts;\r\n\t\t\ttweakedScaledmesh.RecalculateNormals ();\r\n\t\t\ttweakedScaledmesh.RecalculateTangents ();\r\n\t\t\ttweakedScaledmesh.RecalculateBounds ();\r\n\t\t\t\r\n\t\t\tparentScaledTransform.GetComponent<MeshFilter> ().sharedMesh = tweakedScaledmesh;\r\n\t\t}\r\n\r\n\t\tpublic void InterpolateVariables ()\r\n\t\t{\r\n\t\t\tif(!(HighLogic.LoadedScene == GameScenes.TRACKSTATION))\r\n\t\t\t{\r\n\t\t\t\taltitude = Vector3.Distance (Scatterer.Instance.nearCamera.transform.position, parentLocalTransform.position) - Rg;\r\n\t\t\t}\r\n\r\n\t\t\tif ((HighLogic.LoadedScene == GameScenes.MAINMENU) || (HighLogic.LoadedScene == GameScenes.TRACKSTATION) || MapView.MapIsEnabled)\r\n\t\t\t{\r\n\t\t\t\tinterpolatedSettings.getValuesFrom(configPoints [configPoints.Count - 1]);\r\n\t\t\t\tcurrentConfigPoint = configPoints.Count;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (altitude <= configPoints [0].altitude)\r\n\t\t\t{\r\n\t\t\t\tinterpolatedSettings.getValuesFrom(configPoints [0]);\r\n\t\t\t\tcurrentConfigPoint = 0;\t\r\n\t\t\t}\r\n\t\t\telse if (altitude > configPoints [configPoints.Count - 1].altitude) \r\n\t\t\t{\r\n\t\t\t\tinterpolatedSettings.getValuesFrom(configPoints [configPoints.Count - 1]);\r\n\t\t\t\tcurrentConfigPoint = configPoints.Count;\r\n\t\t\t}\r\n\t\t\telse \r\n\t\t\t{\r\n\t\t\t\t//TODO, replace this with binary search, implement method directly in configPoints class, which will implement a list of config points\r\n\t\t\t\tfor (int j = 1; j < configPoints.Count; j++)\r\n\t\t\t\t{\r\n\t\t\t\t\tif ((altitude > configPoints [j - 1].altitude) && (altitude <= configPoints [j].altitude))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tpercentage = (altitude - configPoints [j - 1].altitude) / (configPoints [j].altitude - configPoints [j - 1].altitude);\r\n\t\t\t\t\t\tinterpolatedSettings.interpolateValuesFrom(configPoints [j - 1], configPoints [j], percentage);\r\n\t\t\t\t\t\tcurrentConfigPoint = j;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid UpdateLightExtinctions ()\r\n\t\t{\r\n\t\t\tVector3 sunDirection = prolandManager.getDirectionToMainSun();\r\n\r\n\t\t\tVector3 extinctionPosition = (FlightGlobals.ActiveVessel ? FlightGlobals.ActiveVessel.transform.position : Scatterer.Instance.nearCamera.transform.position) - parentLocalTransform.position;\r\n\t\t\tColor extinction = AtmosphereUtils.getExtinction (extinctionPosition, sunDirection, Rt, Rg * atmosphereStartRadiusScale, HR*1000f, HM*1000f, m_betaR / 1000f, BETA_MSca / 1000f / 0.9f, useOzone, atmosphereAtlas, transmittanceTableDimensions, atlasScaleAndOffsets[2], atlasDimensions);\r\n\r\n\t\t\textinction = Color.Lerp(Color.white, extinction, interpolatedSettings.extinctionThickness);\r\n\r\n\t\t\tfloat extinctionSunsetToNoonTransition = Vector3.Dot(sunDirection, extinctionPosition.normalized);\r\n\t\t\textinctionSunsetToNoonTransition = Mathf.Clamp01( ((extinctionSunsetToNoonTransition-0.2f) / 0.8f) * (1f - noonSunlightExtinctionStrength) );\r\n\t\t\textinction = Color.Lerp(extinction, Color.white, extinctionSunsetToNoonTransition);\r\n\r\n\t\t\tScatterer.Instance.sunlightModulatorsManagerInstance.ModulateByColor (prolandManager.mainSunLight, extinction);\r\n\r\n\t\t\tforeach(SecondarySun secondarySun in prolandManager.secondarySuns)\r\n\t\t\t{\r\n\t\t\t\tif (secondarySun.sunLight)\r\n\t\t\t\t{\r\n\t\t\t\t\textinction = AtmosphereUtils.getExtinction (extinctionPosition, (secondarySun.celestialBody.GetTransform().position - prolandManager.parentCelestialBody.GetTransform().position).normalized,  Rt, Rg * atmosphereStartRadiusScale, HR*1000f, HM*1000f, m_betaR / 1000f, BETA_MSca / 1000f / 0.9f, useOzone, atmosphereAtlas, transmittanceTableDimensions, atlasScaleAndOffsets[2], atlasDimensions);\r\n\t\t\t\t\textinction = Color.Lerp(Color.white, extinction, interpolatedSettings.extinctionThickness);\t//consider getting rid of extinction thickness and tint now\r\n\t\t\t\t\tScatterer.Instance.sunlightModulatorsManagerInstance.ModulateByColor (secondarySun.sunLight, extinction);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid UpdateSunflareExtinctions ()\r\n\t\t{\r\n\t\t\tforeach (SunFlare customSunFlare in Scatterer.Instance.sunflareManager.scattererSunFlares.Values)\r\n\t\t\t{\r\n\t\t\t\tif (customSunFlare.FlareRendering)\t//not sure if it's worth it to try and add more intelligent culling here, like checking if a ray to the flare intersects the planet/atmo?\r\n\t\t\t\t{\r\n\t\t\t\t\tsunflareExtinctionMaterial.SetVector (ShaderProperties._Sun_WorldSunDir_PROPERTY, prolandManager.getDirectionToCelestialBody (customSunFlare.source).normalized);\r\n\t\t\t\t\t\r\n\t\t\t\t\tif (!MapView.MapIsEnabled)\r\n\t\t\t\t\t\tsunflareExtinctionMaterial.SetVector (ShaderProperties._Globals_WorldCameraPos_PROPERTY, Scatterer.Instance.nearCamera.transform.position - parentLocalTransform.position);\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tsunflareExtinctionMaterial.SetVector (ShaderProperties._Globals_WorldCameraPos_PROPERTY, (Vector3)ScaledSpace.ScaledToLocalSpace (Scatterer.Instance.scaledSpaceCamera.transform.position) - parentLocalTransform.position);\r\n\t\t\t\t\t\r\n\t\t\t\t\tGraphics.Blit (null, customSunFlare.extinctionTexture, sunflareExtinctionMaterial, 0);\r\n\t\t\t\t\t\r\n\t\t\t\t\tif (hasRingObjectAndShadowActivated)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tsunflareExtinctionMaterial.SetVector (ShaderProperties.ringNormal_PROPERTY, ringObject.transform.up);\r\n\t\t\t\t\t\tGraphics.Blit (null, customSunFlare.extinctionTexture, sunflareExtinctionMaterial, 1);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tvoid UpdateEclipseCasters ()\r\n\t\t{\r\n\t\t\tfloat scaleFactor = ScaledSpace.ScaleFactor;\r\n\t\t\tsunPosRelPlanet = Vector3.zero;\r\n\t\t\tsunPosRelPlanet = Vector3.Scale (ScaledSpace.LocalToScaledSpace (prolandManager.sunCelestialBody.transform.position), new Vector3 (scaleFactor, scaleFactor, scaleFactor));\r\n\t\t\tcastersMatrix1 = Matrix4x4.zero;\r\n\t\t\tcastersMatrix2 = Matrix4x4.zero;\r\n\t\t\tVector3 casterPosRelPlanet;\r\n\r\n\t\t\tfloat eclipseTerm = 1f;\r\n\r\n\t\t\tfor (int i = 0; i < Mathf.Min (4, prolandManager.eclipseCasters.Count); i++)\r\n\t\t\t{\r\n\t\t\t\tcasterPosRelPlanet = Vector3.Scale (ScaledSpace.LocalToScaledSpace (prolandManager.eclipseCasters [i].transform.position), new Vector3 (scaleFactor, scaleFactor, scaleFactor)); //wtf is this? this is doing local to scaled and back to local?\r\n\t\t\t\tcastersMatrix1.SetRow (i, new Vector4 (casterPosRelPlanet.x, casterPosRelPlanet.y, casterPosRelPlanet.z, (float)prolandManager.eclipseCasters [i].Radius));\r\n\t\t\t\teclipseTerm *= AtmosphereUtils.getEclipseShadow(Scatterer.Instance.nearCamera.transform.position, sunPosRelPlanet, casterPosRelPlanet, (float)prolandManager.eclipseCasters[i].Radius, (float)prolandManager.sunCelestialBody.Radius);\r\n\t\t\t}\r\n\t\t\tfor (int i = 4; i < Mathf.Min (8, prolandManager.eclipseCasters.Count); i++)\r\n\t\t\t{\r\n\t\t\t\tcasterPosRelPlanet = Vector3.Scale (ScaledSpace.LocalToScaledSpace (prolandManager.eclipseCasters [i].transform.position), new Vector3 (scaleFactor, scaleFactor, scaleFactor));\r\n\t\t\t\tcastersMatrix2.SetRow (i - 4, new Vector4 (casterPosRelPlanet.x, casterPosRelPlanet.y, casterPosRelPlanet.z, (float)prolandManager.eclipseCasters [i].Radius));\r\n\t\t\t\teclipseTerm *= AtmosphereUtils.getEclipseShadow(Scatterer.Instance.nearCamera.transform.position, sunPosRelPlanet, casterPosRelPlanet, (float)prolandManager.eclipseCasters[i].Radius, (float)prolandManager.sunCelestialBody.Radius);\r\n\t\t\t}\r\n\r\n\t\t\tScatterer.Instance.sunlightModulatorsManagerInstance.ModulateByAttenuation(prolandManager.mainSunLight, eclipseTerm);\r\n\t\t}\r\n\r\n\t\tvoid InitKopernicusRings ()\r\n\t\t{\r\n\t\t\tringObject = GameObject.Find (celestialBodyName + \"Ring\");\r\n\t\t\tif (ringObject) {\r\n\t\t\t\tUtils.LogDebug (\" Found ring for \" + celestialBodyName);\r\n\t\t\t\tMaterial ringMat = ringObject.GetComponent<MeshRenderer> ().material;\r\n\t\t\t\thasRingObjectAndShadowActivated = true;\r\n\t\t\t\tMonoBehaviour[] scripts = (MonoBehaviour[])ringObject.GetComponents<MonoBehaviour> ();\r\n\t\t\t\tforeach (MonoBehaviour _script in scripts) {\r\n\t\t\t\t\tif (_script.GetType ().ToString ().Contains (\"Ring\")) {\r\n\t\t\t\t\t\tconst BindingFlags flags = BindingFlags.FlattenHierarchy | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static;\r\n\t\t\t\t\t\tFieldInfo[] fields = _script.GetType ().GetFields (flags);\r\n\t\t\t\t\t\tforeach (FieldInfo fi in fields) {\r\n\t\t\t\t\t\t\t//Utils.Log(\"fi.Name \"+fi.Name+\" fi.GetType() \"+fi.GetType());\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\tringTexture = _script.GetType ().GetField (\"texture\", flags).GetValue (_script) as Texture2D;\r\n\t\t\t\t\t\t\tUtils.LogDebug (\" ring texture fetch successful\");\r\n\t\t\t\t\t\t\tUtils.LogDebug (\" ringTexture.width \" + ringTexture.width.ToString ());\r\n\t\t\t\t\t\t\tUtils.LogDebug (\" ringTexture.height \" + ringTexture.height.ToString ());\r\n\t\t\t\t\t\t\tMeshRenderer ringMR = _script.GetType ().GetField (\"ringMr\", flags).GetValue (_script) as MeshRenderer;\r\n\t\t\t\t\t\t\tUtils.LogDebug (\" ring MeshRenderer fetch successful\");\r\n\t\t\t\t\t\t\tringInnerRadius = ringMR.material.GetFloat (\"innerRadius\");\r\n\t\t\t\t\t\t\tringOuterRadius = ringMR.material.GetFloat (\"outerRadius\");\r\n\t\t\t\t\t\t\tUtils.LogDebug (\" ring innerRadius (with parent scale) \" + ringInnerRadius.ToString ());\r\n\t\t\t\t\t\t\tUtils.LogDebug (\" ring outerRadius (with parent scale) \" + ringOuterRadius.ToString ());\r\n\t\t\t\t\t\t\tint tiles = (int)_script.GetType ().GetField (\"tiles\", flags).GetValue (_script);\r\n\t\t\t\t\t\t\tif (tiles > 0) {\r\n\t\t\t\t\t\t\t\tthrow new Exception (\"Scatterer doesn't support tiled/thick Kopernicus rings (not implemented)\");\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tringInnerRadius *= ScaledSpace.ScaleFactor;\r\n\t\t\t\t\t\t\tringInnerRadius = Mathf.Max(ringInnerRadius,(float)(prolandManager.m_radius)* (1f + 10f/600000f)); //prevent inner ring radius from intersecting planet's radius because that's stupid and it breaks the shader\r\n\t\t\t\t\t\t\tringOuterRadius *= ScaledSpace.ScaleFactor;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tcatch (Exception e) {\r\n\t\t\t\t\t\t\tUtils.LogError (\"Kopernicus ring exception: \" + e.ToString ());\r\n\t\t\t\t\t\t\tUtils.LogDebug (\"Disabling ring shadows for \" + celestialBodyName);\r\n\t\t\t\t\t\t\thasRingObjectAndShadowActivated = false;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void InitEVEClouds()\r\n\t\t{\r\n\t\t\tif ((Scatterer.Instance.eveReflectionHandler.EVEInstance != null) && Scatterer.Instance.eveReflectionHandler.EVECloudLayers.ContainsKey(celestialBodyName))\r\n\t\t\t{\r\n\t\t\t\ttry\r\n\t\t\t\t{\r\n\t\t\t\t\tScatterer.Instance.eveReflectionHandler.invokeClouds2dReassign(celestialBodyName); // After the shader has been replaced by the modified scatterer shader, the properties are lost, this sets them again\r\n\r\n\t\t\t\t\tforeach (var cloudLayer in Scatterer.Instance.eveReflectionHandler.EVECloudLayers[celestialBodyName])\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif (cloudLayer.Clouds2dMaterial != null)\r\n\t\t\t\t\t\t{ \r\n\t\t\t\t\t\t\tUtils.EnableOrDisableShaderKeywords(cloudLayer.Clouds2dMaterial, \"SCATTERER_ON\", \"SCATTERER_OFF\", true);\r\n\t\t\t\t\t\t\tInitUniforms (cloudLayer.Clouds2dMaterial);\r\n\t\t\t\t\t\t\tInitPostprocessMaterialUniforms (cloudLayer.Clouds2dMaterial);\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tif (HighLogic.LoadedScene == GameScenes.MAINMENU)\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t//Wrongly defined to ON in mainmenu by EVE, causing messed up extinction calculations\r\n\t\t\t\t\t\t\t\tUtils.EnableOrDisableShaderKeywords(cloudLayer.Clouds2dMaterial, \"WORLD_SPACE_ON\", \"WORLD_SPACE_OFF\", false);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif (cloudLayer.ParticleVolumetricsMaterial != null)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tUtils.EnableOrDisableShaderKeywords(cloudLayer.ParticleVolumetricsMaterial, \"SCATTERER_ON\", \"SCATTERER_OFF\", true);\r\n\t\t\t\t\t\t\tInitUniforms(cloudLayer.ParticleVolumetricsMaterial);\r\n\t\t\t\t\t\t\tInitPostprocessMaterialUniforms(cloudLayer.ParticleVolumetricsMaterial);\r\n\t\t\t\t\t\t\tcloudLayer.ParticleVolumetricsMaterial.SetFloat(\"isUnderwater\", 0f);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif (cloudLayer.CloudShadowMaterial != null)\r\n                        {\r\n\t\t\t\t\t\t\tUtils.EnableOrDisableShaderKeywords(cloudLayer.CloudShadowMaterial, \"SCATTERER_OCEAN_ON\", \"SCATTERER_OCEAN_OFF\", Scatterer.Instance.mainSettings.useOceanShaders && prolandManager.hasOcean);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tcatch (Exception e)\r\n\t\t\t\t{\r\n\t\t\t\t\tUtils.LogError (\"Error initiating EVE Clouds on planet: \" + celestialBodyName + \" Exception returned: \" + e.ToString ());\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid UpdateEVECloudMaterials ()\r\n\t\t{\r\n\t\t\tif (Scatterer.Instance.eveReflectionHandler.EVECloudLayers.ContainsKey (celestialBodyName))\r\n\t\t\t{\r\n\t\t\t\tforeach (var cloudLayer in Scatterer.Instance.eveReflectionHandler.EVECloudLayers[celestialBodyName])\r\n\t\t\t\t{\r\n\t\t\t\t\tif (cloudLayer.Clouds2dMaterial != null)\r\n\t\t\t\t\t{ \r\n\t\t\t\t\t\tSetUniforms (cloudLayer.Clouds2dMaterial);\r\n\t\t\t\t\t\tUpdatePostProcessMaterialUniforms(cloudLayer.Clouds2dMaterial);\r\n\t\t\t\t\t\tcloudLayer.Clouds2dMaterial.SetFloat(ShaderProperties.cloudColorMultiplier_PROPERTY, cloudColorMultiplier);\r\n\t\t\t\t\t\tcloudLayer.Clouds2dMaterial.SetFloat(ShaderProperties.cloudScatteringMultiplier_PROPERTY, cloudScatteringMultiplier);\r\n\t\t\t\t\t\tcloudLayer.Clouds2dMaterial.SetFloat(ShaderProperties.cloudSkyIrradianceMultiplier_PROPERTY, cloudSkyIrradianceMultiplier);\r\n\t\t\t\t\t\tcloudLayer.Clouds2dMaterial.SetFloat(ShaderProperties.preserveCloudColors_PROPERTY, EVEIntegration_preserveCloudColors ? 1f : 0f);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (cloudLayer.ParticleVolumetricsMaterial != null)\r\n                    {\r\n\t\t\t\t\t\tSetUniforms(cloudLayer.ParticleVolumetricsMaterial);\r\n\t\t\t\t\t\tUpdatePostProcessMaterialUniforms(cloudLayer.ParticleVolumetricsMaterial);\r\n\t\t\t\t\t\tcloudLayer.ParticleVolumetricsMaterial.SetVector(ShaderProperties._PlanetWorldPos_PROPERTY, parentLocalTransform.position);\r\n\t\t\t\t\t\tcloudLayer.ParticleVolumetricsMaterial.SetFloat(ShaderProperties.cloudColorMultiplier_PROPERTY, volumetricsColorMultiplier);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void TogglePreserveCloudColors()\r\n\t\t{\r\n\t\t\tEVEIntegration_preserveCloudColors =!EVEIntegration_preserveCloudColors;\r\n\t\t}\r\n\r\n\t\tpublic void SetCelestialBodyName(string name) {\r\n\t\t\tcelestialBodyName = name;\r\n\t\t}\r\n\t\t\r\n\t\tpublic void SetParentScaledTransform(Transform parentTransform) {\r\n\t\t\tparentScaledTransform = parentTransform;\r\n\t\t}\r\n\t\t\r\n\t\tpublic void SetParentLocalTransform(Transform parentTransform) {\r\n\t\t\tparentLocalTransform = parentTransform;\r\n\t\t}\r\n\r\n\t\t//to be called on loss of rendertextures, ie alt-enter\r\n\t\tpublic void ReInitMaterialUniformsOnRenderTexturesLoss()\r\n\t\t{\r\n\t\t\tif (localScatteringContainer != null)\r\n\t\t\t{\r\n\t\t\t\tInitPostprocessMaterialUniforms (localScatteringContainer.material);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void SetUnderwater(bool value)\r\n        {\r\n\t\t\tif (localScatteringContainer != null)\r\n\t\t\t\tlocalScatteringContainer.SetUnderwater(value);\r\n\r\n\t\t\tif ((Scatterer.Instance.eveReflectionHandler.EVEInstance != null) && Scatterer.Instance.eveReflectionHandler.EVECloudLayers.ContainsKey(celestialBodyName))\r\n\t\t\t{\r\n\t\t\t\tforeach (var cloudLayer in Scatterer.Instance.eveReflectionHandler.EVECloudLayers[celestialBodyName])\r\n\t\t\t\t{\r\n\t\t\t\t\tif (cloudLayer.ParticleVolumetricsMaterial != null)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcloudLayer.ParticleVolumetricsMaterial.SetFloat(\"isUnderwater\", value ? 1f : 0f);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "scatterer/Effects/Proland/Atmosphere/Utils/AtmospherePQS.cs",
    "content": "//note: allows adding a material to PQS, not currently in use as projector works better\r\n//could be adapted for use with future grass/trees shader however\r\n\r\nusing System;\r\nusing System.Reflection;\r\nusing System.Text.RegularExpressions;\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class AtmospherePQS : PQSMod\r\n\t{\r\n\t\tMaterial atmosphereMaterial;\r\n\r\n\t\tpublic override void  OnSphereActive()\r\n\t\t{\r\n\t\t}\r\n\r\n\t\tpublic override void OnQuadCreate(PQ quad)\r\n\t\t{\r\n\t\t\tList<Material> materials = new List<Material> (quad.meshRenderer.sharedMaterials);\r\n\t\t\tmaterials.Add (atmosphereMaterial);\r\n\t\t\tquad.meshRenderer.sharedMaterials= materials.ToArray();\r\n\t\t}\r\n\r\n\t\tpublic override void OnQuadDestroy(PQ quad)\r\n\t\t{\r\n\t\t\tList<Material> materials = new List<Material> (quad.meshRenderer.sharedMaterials);\r\n\t\t\tmaterials.Remove(materials.Find(mat => mat.shader.name == \"Scatterer/AtmosphericLocalScatter\")); //probably slow\r\n\t\t\tquad.meshRenderer.sharedMaterials = materials.ToArray ();\r\n\t\t}\r\n\r\n\t\tpublic void Apply(PQS pqs)\r\n\t\t{\r\n\t\t\tif (pqs != null)\r\n\t\t\t{\r\n\t\t\t\tthis.sphere = pqs;\r\n\t\t\t\tthis.transform.parent = pqs.transform;\r\n\t\t\t\tthis.requirements = PQS.ModiferRequirements.Default;\r\n\t\t\t\tthis.modEnabled = true;\r\n\t\t\t\tthis.order = 10; //?\r\n\t\t\t\t\r\n\t\t\t\tthis.transform.localPosition = Vector3.zero;\r\n\t\t\t\tthis.transform.localRotation = Quaternion.identity;\r\n\t\t\t\tthis.transform.localScale = Vector3.one;\r\n\r\n\t\t\t\tatmosphereMaterial = new Material (ShaderReplacer.Instance.LoadedShaders[(\"Scatterer/AtmosphericLocalScatter\")]);\r\n\r\n\t\t\t\tUtils.LogDebug (\"AtmospherePQS applied\");\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void Cleanup()\r\n\t\t{\r\n\t\t\tUtils.LogDebug (\"AtmospherePQS removed\");\r\n\t\t}\r\n\t\t\r\n\t}\r\n}"
  },
  {
    "path": "scatterer/Effects/Proland/Atmosphere/Utils/AtmosphereProjectorContainer.cs",
    "content": "using System;\r\nusing UnityEngine;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class AtmosphereProjectorContainer : GenericLocalAtmosphereContainer\r\n\t{\r\n\t\tpublic Projector projector = null;\r\n\r\n\t\tpublic AtmosphereProjectorContainer (Material atmosphereMaterial, Transform parentTransform, float Rt, ProlandManager parentManager) : base (atmosphereMaterial, parentTransform, Rt, parentManager)\r\n\t\t{\r\n\t\t\tscatteringGO =  new GameObject(\"Scatterer atmosphere projector \"+atmosphereMaterial.name);\r\n\t\t\t\t\t\t\r\n\t\t\tprojector = scatteringGO.AddComponent<Projector>();\r\n\r\n\t\t\tprojector.aspectRatio = 1;\r\n\t\t\tprojector.orthographic = true;\r\n\t\t\tprojector.orthographicSize = 2*Rt;\r\n\t\t\tprojector.nearClipPlane = 1;\r\n\t\t\tprojector.farClipPlane = 4*Rt;\r\n\t\t\tprojector.ignoreLayers = ~((1<<0) | (1<<1) | (1<<4) | (1<<15) | (1<<16) | (1<<19)); //ignore all except 4 water 15 local 16 kerbals and 19 parts\r\n\r\n\t\t\tscatteringGO.layer = 15;\r\n\r\n\t\t\tscatteringGO.transform.position = parentTransform.forward * 2*Rt + parentTransform.position;\r\n\t\t\tscatteringGO.transform.forward  = parentTransform.position - scatteringGO.transform.position;\r\n\t\t\tscatteringGO.transform.parent   = parentTransform;\r\n\r\n\t\t\tprojector.material = atmosphereMaterial;\r\n\t\t\tprojector.material.CopyKeywordsFrom (atmosphereMaterial);\r\n\t\t}\r\n\r\n\t\tpublic override void UpdateContainer ()\r\n\t\t{\r\n\t\t\tbool isEnabled = !underwater && !inScaledSpace && activated;\r\n\t\t\tprojector.enabled = isEnabled;\r\n\t\t\tscatteringGO.SetActive(isEnabled);\r\n\t\t}\r\n\r\n\t\tpublic override void Cleanup ()\r\n\t\t{\r\n\t\t\tSetActivated (false);\r\n\t\t\tif(scatteringGO)\r\n\t\t\t{\r\n\t\t\t\tif(scatteringGO.transform && scatteringGO.transform.parent)\r\n\t\t\t\t{\r\n\t\t\t\t\t\tscatteringGO.transform.parent = null;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tComponent.Destroy(projector);\r\n\t\t\t\tGameObject.DestroyImmediate(scatteringGO);\r\n\t\t\t\tprojector = null;\r\n\t\t\t\tscatteringGO = null;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/Effects/Proland/Atmosphere/Utils/AtmosphereUtils.cs",
    "content": "using UnityEngine;\r\nusing System.Collections;\r\nusing System.IO;\r\n\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\n\r\nusing KSP.IO;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic static class AtmosphereUtils\r\n\t{\t\t\r\n\t\tprivate static float Limit(float r, float mu, float Rg, float Rt) \r\n\t\t{\r\n\t\t\tfloat dout = -r * mu + Mathf.Sqrt(r * r * (mu * mu - 1f) + Rt * Rt);\r\n\t\t\tfloat delta2 = r * r * (mu * mu - 1f) + (Rg) * (Rg);\r\n\t\t\t\r\n\t\t\tif (delta2 >= 0f) \r\n\t\t\t{ \r\n\t\t\t\tfloat din = -r * mu - Mathf.Sqrt(delta2); \r\n\t\t\t\tif (din >= 0f)\r\n\t\t\t\t{ \r\n\t\t\t\t\tdout = Mathf.Min(dout, din); \r\n\t\t\t\t}\r\n\t\t\t} \r\n\t\t\t\r\n\t\t\treturn dout;\r\n\t\t}\r\n\r\n\t\t// optical depth for ray (r,mu) of length d, using analytic formula\r\n\t\t// (mu=cos(view zenith angle)), intersections with ground ignored\r\n\t\t// H=height scale of exponential density function\r\n\t\tprivate static float OpticalDepth(float H, float r, float mu, float d, float Rg, float Rt)\r\n\t\t{\r\n\t\t\tfloat a = Mathf.Sqrt((0.5f/H)*r);\r\n\t\t\tVector2 a01 = a*new Vector2(mu, mu + d / r);\r\n\t\t\tVector2 a01s = new Vector2(Mathf.Sign(a01.x),Mathf.Sign(a01.y));\r\n\t\t\tVector2 a01sq = a01*a01;\r\n\t\t\tfloat x = a01s.y > a01s.x ? Mathf.Exp(a01sq.x) : 0f;\r\n\t\t\tVector2 y = a01s / (2.3193f* new Vector2(Mathf.Abs(a01.x), Mathf.Abs(a01.y)) + new Vector2(Mathf.Sqrt(1.52f*a01sq.x + 4f), Mathf.Sqrt(1.52f*a01sq.y + 4f))) * new Vector2(1f, Mathf.Exp(-d/H*(d/(2f*r)+mu)));\r\n\t\t\treturn Mathf.Sqrt((6.2831f*H)*r) * Mathf.Exp((Rg-r)/H) * (x + Vector2.Dot(y, new Vector2(1f, -1f)));\r\n\t\t}\r\n\r\n\t\tprivate static float OpticalDepthToBoundaries(float H, float r, float mu, float Rg, float Rt)\r\n\t\t{ \r\n\t\t\tfloat result = 0f;\r\n\t\t\tfloat d = Limit(r, mu, Rg, Rt); \r\n\t\t\t\r\n\t\t\tresult = OpticalDepth(H, r, mu, d, Rg, Rt);\r\n\t\t\t\r\n\t\t\treturn mu < -Mathf.Sqrt(1f - (Rg / r) * (Rg / r)) ? 1e9f : result; \r\n\t\t} \r\n\t\t\r\n\t\tprivate static Color AnalyticTransmittance(float r, float mu, float Rt, float Rg, float HR, float HM, Vector3 betaR, Vector3 betaMEx)\r\n\t\t{\r\n\t\t\tVector3 depth = betaR * OpticalDepthToBoundaries(HR, r, mu, Rg, Rt) + betaMEx * OpticalDepthToBoundaries(HM, r, mu, Rg, Rt);\r\n\t\t\tdepth.x = Mathf.Clamp (Mathf.Exp (-depth.x), 1e-36f, 1f);\r\n\t\t\tdepth.y = Mathf.Clamp (Mathf.Exp(-depth.y), 1e-36f, 1f);\r\n\t\t\tdepth.z = Mathf.Clamp (Mathf.Exp(-depth.z), 1e-36f, 1f);\r\n\t\t\treturn new Color (depth.x,depth.y,depth.z,1f);\r\n\t\t}\r\n\r\n\t\tprivate static Vector2 GetTransmittanceUV(float r, float mu, float Rt, float Rg)\r\n\t\t{\r\n\t\t\tfloat uR, uMu;\r\n\r\n\t\t\tuR = Mathf.Sqrt(Mathf.Max(0, (r - Rg)) / (Rt - Rg));\r\n\t\t\tuMu = Mathf.Atan((mu + 0.15f) / (1.0f + 0.15f) * Mathf.Tan(1.5f)) / 1.5f;\r\n\r\n\t\t\treturn new Vector2(uMu, uR);\r\n\t\t}\r\n\r\n\t\tpublic static Color getOzoneExtinction(float r, float mu, float Rt, float Rg, Texture2D atmosphereAtlas, Vector2 ozoneTextureDimensions, Vector4 textureScaleAndOffsetInAtlas, Vector2 AtmosphereAtlasDimensions)\r\n        {\r\n            Vector2 uv = GetTransmittanceUV(r, mu, Rt, Rg);\r\n            uv = remapUVToAtlas(uv, ozoneTextureDimensions, textureScaleAndOffsetInAtlas, AtmosphereAtlasDimensions);\r\n\r\n            // Unity's get pixel Bilinear doesn't work exactly like shader-based bilinear sampling\r\n            // See thread https://forum.unity.com/threads/confusion-about-texture-getpixelbinear.1236826/\r\n            // Therefore manually remap from shader-based UV to unity-style UV to be able to sample bilinear correctly here\r\n            // The equivalent transformation is just to remove a half-texel offset\r\n            // Note that I checked all the math 10 times and compared GetPixelBilinear() to what the shader tex2Dlod outputs and confirmed\r\n            // There is always a half texel offset\r\n            uv -= new Vector2(0.5f, 0.5f) / AtmosphereAtlasDimensions;\r\n\r\n            return atmosphereAtlas.GetPixelBilinear(uv.x, uv.y);\r\n        }\r\n\r\n\t\tprivate static Vector2 remapUVToAtlas(Vector2 uv, Vector2 oldTexDimensions, Vector4 textureScaleAndOffsetInAtlas, Vector2 AtmosphereAtlasDimensions)\r\n\t\t{\r\n\t\t\t// Remove half pixel offset\r\n\t\t\tuv -= new Vector2(0.5f, 0.5f) / oldTexDimensions;\r\n\r\n\t\t\t// Clamp, note the half pixel offset is taken into account on both sides\r\n\t\t\tuv.x = Mathf.Clamp(uv.x, 0f, 1f - 1.0f / oldTexDimensions.x);\r\n\t\t\tuv.y = Mathf.Clamp(uv.y, 0f, 1f - 1.0f / oldTexDimensions.y);\r\n\r\n\t\t\t// Scale, offset and add new half pixel offset\r\n\t\t\tuv = uv * new Vector2(textureScaleAndOffsetInAtlas.x, textureScaleAndOffsetInAtlas.y) +\r\n\t\t\t\tnew Vector2(textureScaleAndOffsetInAtlas.z, textureScaleAndOffsetInAtlas.w) +\r\n\t\t\t\tnew Vector2(0.5f, 0.5f) / AtmosphereAtlasDimensions;\r\n\r\n            return uv;\r\n\t\t}\r\n\r\n\t\tpublic static Color getExtinction(Vector3 camera, Vector3 viewdir, float Rt, float Rg, float HR, float HM, Vector3 betaR, Vector3 betaMEx, bool useOzone, Texture2D atmosphereAtlas, Vector2 ozoneTextureDimensions, Vector4 textureScaleAndOffsetInAtlas, Vector2 AtmosphereAtlasDimensions)\r\n\t\t{\r\n\t\t\tfloat r = camera.magnitude;\r\n\t\t\tfloat rMu = Vector3.Dot(camera, viewdir);\r\n\t\t\tfloat mu = rMu / r;\r\n\t\t\t\r\n\t\t\tfloat deltaSq = Mathf.Sqrt(rMu * rMu - r * r + Rt*Rt);\r\n\t\t\t\r\n\t\t\tfloat din = Mathf.Max(-rMu - deltaSq, 0f);\r\n\t\t\tif (din > 0f)\r\n\t\t\t{\r\n\t\t\t\tcamera += din * viewdir;\r\n\t\t\t\trMu += din;\r\n\t\t\t\tmu = rMu / Rt;\r\n\t\t\t\tr = Rt;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tColor extinction = (r > Rt) ? Color.white : AnalyticTransmittance(r, mu, Rt, Rg, HR, HM, betaR, betaMEx);\r\n\r\n\t\t\tif (useOzone && r < Rt)\r\n\t\t\t\textinction *= getOzoneExtinction(r, mu, Rt, Rg, atmosphereAtlas, ozoneTextureDimensions, textureScaleAndOffsetInAtlas, AtmosphereAtlasDimensions);\r\n\r\n\t\t\treturn extinction;\r\n\t\t}\r\n\r\n\t\tpublic static Color Hdr(Color L, float exposure) {\r\n\t\t\tL = L * exposure;\r\n\t\t\tL.r = L.r < 1.413 ? Mathf.Pow(L.r * 0.38317f, 1.0f / 2.2f) : 1.0f - Mathf.Exp(-L.r);\r\n\t\t\tL.g = L.g < 1.413 ? Mathf.Pow(L.g * 0.38317f, 1.0f / 2.2f) : 1.0f - Mathf.Exp(-L.g);\r\n\t\t\tL.b = L.b < 1.413 ? Mathf.Pow(L.b * 0.38317f, 1.0f / 2.2f) : 1.0f - Mathf.Exp(-L.b);\r\n\t\t\treturn L;\r\n\t\t}\r\n\r\n\t\tpublic static Color SimpleSkyirradiance(Vector3 worldP, Vector3 worldS, float Rt, float Rg, Color sunColor, Texture2D m_irradiance)\r\n\t\t{\r\n\t\t\tfloat r = worldP.magnitude;\r\n\t\t\tif (r < 0.9 * Rg)\r\n\t\t\t{\r\n\t\t\t\tworldP.z += Rg;\r\n\t\t\t\tr = worldP.magnitude;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tVector3 worldV = worldP.normalized; // vertical vector\r\n\t\t\tfloat muS = Vector3.Dot(worldV, worldS.normalized);\r\n\t\t\t\r\n\t\t\t// factor 2.0 : hack to increase sky contribution (numerical simulation of\r\n\t\t\t// \"precompued atmospheric scattering\" gives less luminance than in reality)\r\n\t\t\tColor skyE = 2.0f * SkyIrradiance(r, muS, Rt, Rg, sunColor, m_irradiance);\r\n\r\n\t\t\treturn skyE;\r\n\t\t}\r\n\r\n\t\t// incident sky light at given position, integrated over the hemisphere (irradiance)\r\n\t\t// r=length(x)\r\n\t\t// muS=dot(x,s) / r\r\n\t\tprivate static Color SkyIrradiance(float r, float muS, float Rt, float Rg, Color sunColor, Texture2D m_irradiance)\r\n\t\t{\t\r\n\t\t\treturn Irradiance(r, muS, Rt, Rg, m_irradiance) * sunColor;\r\n\t\t}\r\n\r\n\t\tprivate static Color Irradiance(float r, float muS, float Rt, float Rg, Texture2D m_irradiance)\r\n\t\t{\r\n\t\t\tVector2 uv = GetIrradianceUV(r, muS, Rt, Rg);\r\n\t\t\treturn m_irradiance.GetPixelBilinear(uv.x, uv.y);\r\n\t\t}\r\n\r\n\t\tprivate static Vector2 GetIrradianceUV(float r, float muS, float Rt, float Rg) \r\n\t\t{\r\n\t\t\tfloat uR = (r - Rg) / (Rt - Rg);\r\n\t\t\tfloat uMuS = (muS + 0.2f) / (1.0f + 0.2f);\r\n\t\t\treturn new Vector2(uMuS, uR);\r\n\t\t}\r\n\r\n\t\tpublic static float getEclipseShadow(Vector3 worldPos, Vector3 worldLightPos, Vector3 occluderSpherePosition, float occluderSphereRadius, float lightSourceRadius)\r\n\t\t{\r\n\t\t\tvar lightDirection = worldLightPos - worldPos;\r\n\t\t\tfloat lightDistance = lightDirection.magnitude;\r\n\t\t\tlightDirection = lightDirection / lightDistance;\r\n\r\n\t\t\t// computation of level of shadowing w  \r\n\t\t\tvar sphereDirection = occluderSpherePosition - worldPos;  //occluder planet\r\n\t\t\tfloat sphereDistance = sphereDirection.magnitude;\r\n\t\t\tsphereDirection = sphereDirection / sphereDistance;\r\n\r\n\t\t\tfloat dd = lightDistance * (Mathf.Asin(Mathf.Min(1.0f, (Vector3.Cross(lightDirection, sphereDirection)).magnitude))\r\n\t\t\t\t- Mathf.Asin(Mathf.Min(1.0f, occluderSphereRadius / sphereDistance)));\r\n\r\n\t\t\tfloat w = smoothstep(-1.0f, 1.0f, -dd / lightSourceRadius);\r\n\t\t\tw = w * smoothstep(0.0f, 0.2f, Vector3.Dot(lightDirection, sphereDirection));\r\n\r\n\t\t\treturn (1 - w);\r\n\t\t}\r\n\r\n\t\t// Reimplement because the Mathf Smoothstep doesn't match what is done in shaders\r\n\t\tpublic static float smoothstep(float a, float b, float x)\r\n\t\t{\r\n\t\t\tfloat t = Mathf.Clamp01((x - a) / (b - a));\r\n\t\t\treturn t * t * (3.0f - (2.0f * t));\r\n\t\t}\r\n\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/Effects/Proland/Atmosphere/Utils/GenericLocalAtmosphereContainer.cs",
    "content": "using System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.IO;\r\nusing System.Reflection;\r\nusing System.Runtime;\r\nusing UnityEngine;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic abstract class GenericLocalAtmosphereContainer\r\n\t{\t\r\n\t\tprotected GameObject scatteringGO = null;\r\n\t\tprotected bool inScaledSpace = true;\r\n\t\tprotected bool underwater = false;\r\n\t\tprotected bool activated = false;\r\n\t\tpublic Material material;\r\n\t\tpublic ProlandManager manager;\r\n\r\n\t\tpublic GenericLocalAtmosphereContainer (Material atmosphereMaterial, Transform parentTransform, float Rt, ProlandManager parentManager)\r\n\t\t{\r\n\t\t\tmaterial = atmosphereMaterial;\r\n\t\t\tmanager = parentManager;\r\n\t\t}\r\n\r\n\t\tpublic void SetActivated (bool pEnabled)\r\n\t\t{\r\n\t\t\tactivated = pEnabled;\r\n\t\t}\r\n\t\t\r\n\t\tpublic void SetInScaledSpace (bool pInScaledSpace)\r\n\t\t{\r\n\t\t\tinScaledSpace = pInScaledSpace;\r\n\t\t}\r\n\t\t\r\n\t\tpublic void SetUnderwater (bool pUnderwater)\r\n\t\t{\r\n\t\t\tunderwater = pUnderwater;\r\n\t\t}\r\n\t\t\r\n\t\tpublic abstract void UpdateContainer ();\r\n\r\n\t\tpublic abstract void Cleanup ();\r\n\t}\r\n}"
  },
  {
    "path": "scatterer/Effects/Proland/Atmosphere/Utils/ScaledScatteringContainer.cs",
    "content": "using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing UnityEngine;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class ScaledScatteringContainer\r\n\t{\r\n\t\tGameObject scaledScatteringGO;\r\n\t\tMeshRenderer scaledScatteringMR;\r\n\t\t\r\n\t\tpublic GameObject GameObject { get { return scaledScatteringGO; } }\r\n\t\tpublic MeshRenderer MeshRenderer { get { return scaledScatteringMR; } }\r\n\t\t\r\n\t\tTransform parentLocalTransform, parentScaledTransform;\r\n\t\t\r\n\t\tpublic ScaledScatteringContainer(Mesh planetMesh, Material material, Transform inParentLocalTransform, Transform inParentScaledTransform)\r\n\t\t{\r\n\t\t\tparentScaledTransform = inParentScaledTransform;\r\n\t\t\tparentLocalTransform = inParentLocalTransform;\r\n\r\n\t\t\tstring goName = \"Scatterer scaled atmo\";\r\n\r\n\t\t\tvar existingGoTransform = parentScaledTransform.FindChild(goName);\r\n\r\n\t\t\tif (existingGoTransform != null)\r\n            {\r\n\t\t\t\tGameObject.DestroyImmediate(existingGoTransform.gameObject);\r\n\t\t\t}\r\n\r\n\t\t\tscaledScatteringGO = new GameObject (goName);\r\n\r\n\t\t\t//if depthBufferMode + new blending etc etc\r\n\t\t\tscaledScatteringGO.AddComponent<ScaledScatteringScreenCopy> ();\r\n\t\t\t\r\n\t\t\tscaledScatteringGO.transform.SetParent (parentScaledTransform, false);\r\n\r\n\t\t\tMeshFilter skySphereMF = scaledScatteringGO.AddComponent<MeshFilter>();\r\n\t\t\tskySphereMF.mesh = (Mesh) Mesh.Instantiate (planetMesh);\r\n\t\t\t\r\n\t\t\tscaledScatteringMR = scaledScatteringGO.AddComponent<MeshRenderer>();\r\n\t\t\tscaledScatteringMR.sharedMaterial = material;\r\n\t\t\tUtils.EnableOrDisableShaderKeywords (scaledScatteringMR.sharedMaterial, \"LOCAL_MODE_ON\", \"LOCAL_MODE_OFF\", false);\r\n\r\n\t\t\tscaledScatteringMR.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;\r\n\t\t\tscaledScatteringMR.receiveShadows = false;\r\n\t\t\tscaledScatteringMR.motionVectorGenerationMode = MotionVectorGenerationMode.Camera;\r\n\t\t\tscaledScatteringMR.enabled = true;\r\n\t\t\t\r\n\t\t\tif (HighLogic.LoadedScene == GameScenes.MAINMENU)\r\n\t\t\t\tscaledScatteringGO.layer = 15;\r\n\t\t\telse\r\n\t\t\t\tscaledScatteringGO.layer = 10;\r\n\t\t}\r\n\r\n\t\tpublic void ApplyNewMesh(Mesh planetMesh)\r\n\t\t{\r\n\t\t\tMeshFilter skySphereMF = scaledScatteringGO.GetComponent<MeshFilter>();\r\n\t\t\tskySphereMF.mesh.Clear ();\r\n\t\t\tskySphereMF.mesh = (Mesh) Mesh.Instantiate (planetMesh);\r\n\t\t}\r\n\r\n\t\tpublic void SwitchLocalMode()\r\n\t\t{\r\n\t\t\tscaledScatteringGO.layer = 15;\r\n\r\n\t\t\tscaledScatteringGO.transform.localScale = parentScaledTransform.localScale * ScaledSpace.ScaleFactor;\r\n\t\t\tscaledScatteringGO.transform.localPosition = Vector3.zero;\r\n\r\n\t\t\tscaledScatteringGO.transform.SetParent(parentLocalTransform, false);\r\n\t\t\t\r\n\t\t\tUtils.EnableOrDisableShaderKeywords (scaledScatteringMR.sharedMaterial, \"LOCAL_MODE_ON\", \"LOCAL_MODE_OFF\", true);\r\n\t\t}\r\n\t\t\r\n\t\tpublic void SwitchScaledMode()\r\n\t\t{\r\n\t\t\tscaledScatteringGO.layer = 10;\r\n\r\n\t\t\tscaledScatteringGO.transform.localScale = Vector3.one;\r\n\t\t\tscaledScatteringGO.transform.localPosition = Vector3.zero;\r\n\t\t\tscaledScatteringGO.transform.localRotation = Quaternion.identity;\r\n\r\n\t\t\tscaledScatteringGO.transform.SetParent(parentScaledTransform, false);\r\n\t\t\t\r\n\t\t\tUtils.EnableOrDisableShaderKeywords (scaledScatteringMR.sharedMaterial, \"LOCAL_MODE_ON\", \"LOCAL_MODE_OFF\", false);\r\n\t\t}\r\n\t\t\r\n\t\tpublic void Cleanup()\r\n\t\t{\r\n\t\t\tif (scaledScatteringMR != null)\r\n\t\t\t{\r\n\t\t\t\tscaledScatteringMR.enabled = false;\r\n\t\t\t\tUnityEngine.Component.Destroy (scaledScatteringMR);\r\n\t\t\t}\r\n\r\n\t\t\tif (scaledScatteringGO != null)\r\n\t\t\t{\r\n\t\t\t\tscaledScatteringGO.SetActive(false);\r\n\t\t\t\tUnityEngine.Object.Destroy(scaledScatteringGO);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tpublic class ScaledScatteringScreenCopy : MonoBehaviour\r\n\t{\r\n\t\tvoid OnWillRenderObject()\r\n\t\t{\r\n\t\t\t\tCamera cam = Camera.current;\r\n\t\t\t\t\r\n\t\t\t\tif (!cam)\r\n\t\t\t\t\treturn;\r\n\r\n\t\t\t\tScreenCopyCommandBuffer.EnableScreenCopyForFrame (cam);\r\n\t\t}\r\n\t}\r\n}"
  },
  {
    "path": "scatterer/Effects/Proland/Atmosphere/Utils/ScreenSpaceScatteringContainer.cs",
    "content": "using UnityEngine;\r\nusing System.Collections;\r\nusing System.IO;\r\n\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\n\r\nusing UnityEngine.Rendering;\r\n\r\nusing KSP.IO;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class ScreenSpaceScattering : MonoBehaviour\r\n\t{\r\n\t\tpublic Material material;\r\n\t\t\r\n\t\tMeshRenderer scatteringMR;\r\n\t\tpublic bool hasOcean = false;\r\n\t\tbool quarterRes = false;\r\n\r\n\t\t//Dictionary to check if we added the ScatteringCommandBuffer to the camera\r\n\t\tprivate Dictionary<Camera,ScatteringCommandBuffer> cameraToScatteringCommandBuffer = new Dictionary<Camera,ScatteringCommandBuffer>();\r\n\t\t\r\n\t\tpublic void Init(bool inQuarterRes)\r\n\t\t{\r\n\t\t\tscatteringMR = gameObject.GetComponent<MeshRenderer>();\r\n\t\t\tmaterial.SetOverrideTag(\"IgnoreProjector\", \"True\");\r\n\t\t\tscatteringMR.sharedMaterial = new Material (ShaderReplacer.Instance.LoadedShaders[(\"Scatterer/invisible\")]);\r\n\t\t\t\r\n\t\t\tscatteringMR.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;\r\n\t\t\tscatteringMR.receiveShadows = false;\r\n\t\t\tscatteringMR.enabled = true;\r\n\r\n\t\t\tGetComponent<MeshFilter>().mesh.bounds = new Bounds (Vector4.zero, new Vector3 (Mathf.Infinity, Mathf.Infinity, Mathf.Infinity));\r\n\t\t\t\r\n\t\t\tgameObject.layer = (int) 15;\r\n\r\n\t\t\tquarterRes = inQuarterRes;\r\n\t\t}\r\n\t\t\r\n\t\tpublic void SetActive(bool active)\r\n\t\t{\r\n\t\t\tscatteringMR.enabled = active;\r\n\t\t}\r\n\r\n\t\tvoid OnWillRenderObject()\r\n\t\t{\r\n\t\t\tif (scatteringMR.enabled && material != null)\r\n\t\t\t{\r\n\t\t\t\tCamera cam = Camera.current;\r\n\t\t\t\t\r\n\t\t\t\tif (!cam)\r\n\t\t\t\t\treturn;\r\n\r\n\t\t\t\tif (!hasOcean)\r\n\t\t\t\t\tScreenCopyCommandBuffer.EnableScreenCopyForFrame (cam);\r\n\r\n\t\t\t\tif (cameraToScatteringCommandBuffer.ContainsKey (cam))\r\n\t\t\t\t{\r\n\t\t\t\t\tif (cameraToScatteringCommandBuffer[cam] != null)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcameraToScatteringCommandBuffer[cam].EnableForThisFrame();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\t//we add null to the cameras we don't want to render on so we don't do a string compare every time\r\n\t\t\t\t\tif ((cam.name == \"TRReflectionCamera\") || (cam.name==\"Reflection Probes Camera\"))\t//I think this should be this way to scattering as well but test I guess\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcameraToScatteringCommandBuffer[cam] = null;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tScatteringCommandBuffer scatteringCommandBuffer = (ScatteringCommandBuffer) cam.gameObject.AddComponent(typeof(ScatteringCommandBuffer));\r\n\t\t\t\t\t\tscatteringCommandBuffer.targetRenderer = scatteringMR;\r\n\t\t\t\t\t\tscatteringCommandBuffer.targetMaterial = material;\r\n\t\t\t\t\t\tscatteringCommandBuffer.Initialize(hasOcean, quarterRes);\r\n\t\t\t\t\t\tscatteringCommandBuffer.EnableForThisFrame();\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tcameraToScatteringCommandBuffer[cam] = scatteringCommandBuffer;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void OnDestroy()\r\n\t\t{\r\n\t\t\tforeach (var scatteringCommandBuffer in cameraToScatteringCommandBuffer.Values)\r\n\t\t\t{\r\n\t\t\t\tif (scatteringCommandBuffer)\r\n\t\t\t\t{\r\n\t\t\t\t\tComponent.DestroyImmediate(scatteringCommandBuffer);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tpublic class ScatteringCommandBuffer : MonoBehaviour\r\n\t{\r\n\t\tbool renderingEnabled = false;\r\n\t\t\r\n\t\tpublic MeshRenderer targetRenderer;\r\n\t\tpublic Material targetMaterial;\r\n\t\t\r\n\t\tprivate Camera targetCamera;\r\n\t\tprivate CommandBuffer rendererCommandBuffer, quarterResRendererCommandBuffer;\r\n\r\n\t\t// cached values; if these change we need to recreate the RTs\r\n\t\tint m_width, m_height;\r\n\t\tbool m_hdrEnabled;\r\n\t\tbool m_hasOcean;\r\n\r\n\t\t//downscaledRenderTexture0 will hold scattering.RGB in RGB channels and extinction.R in alpha, downscaledRenderTexture1 will hold extinction.GB in RG\r\n\t\tprivate RenderTexture downscaledRenderTexture0, downscaledRenderTexture1, downscaledDepthRenderTexture;\r\n\t\tprivate Material downscaleDepthMaterial, compositeScatteringMaterial;\r\n\t\t\r\n\t\tpublic void Initialize(bool inHasOcean, bool quarterRes)\r\n\t\t{\r\n\t\t\ttargetCamera = GetComponent<Camera> ();\r\n\r\n\t\t\ttargetCamera.depthTextureMode = targetCamera.depthTextureMode | DepthTextureMode.Depth;\r\n\r\n\t\t\tm_hasOcean = inHasOcean;\r\n\r\n\t\t\t//if no depth downscaling, render directly to screen\r\n\t\t\trendererCommandBuffer = new CommandBuffer();\r\n\t\t\trendererCommandBuffer.name = \"Scatterer screen-space scattering CommandBuffer\";\r\n\r\n\t\t\ttargetMaterial.SetInt(ShaderProperties._ZwriteVariable_PROPERTY, inHasOcean ? 1 : 0);\r\n\t\t\trendererCommandBuffer.SetRenderTarget(BuiltinRenderTextureType.CameraTarget);\r\n\t\t\trendererCommandBuffer.DrawRenderer(targetRenderer, targetMaterial, 0, 0); //pass 0 render to screen\r\n\r\n\t\t\tif (quarterRes)\r\n\t\t\t{\r\n\t\t\t\tquarterResRendererCommandBuffer = new CommandBuffer();\r\n\t\t\t\tquarterResRendererCommandBuffer.name = \"Scatterer 1/4 res screen-space scattering CommandBuffer\";\r\n\r\n\t\t\t\tdownscaleDepthMaterial = new Material(ShaderReplacer.Instance.LoadedShaders [(\"Scatterer/DownscaleDepth\")]);\r\n\t\t\t\tcompositeScatteringMaterial = new Material(ShaderReplacer.Instance.LoadedShaders [(\"Scatterer/CompositeDownscaledScattering\")]);\r\n\t\t\t\tUtils.EnableOrDisableShaderKeywords(compositeScatteringMaterial, \"CUSTOM_OCEAN_ON\", \"CUSTOM_OCEAN_OFF\", inHasOcean);\r\n\t\t\t\tcompositeScatteringMaterial.SetInt (ShaderProperties._ZwriteVariable_PROPERTY, inHasOcean ? 1 : 0);\r\n\t\t\t\tUtils.SetToneMapping(compositeScatteringMaterial);\r\n\r\n\t\t\t\tint width, height;\r\n\t\t\t\tGetRenderDimensions(out width, out height);\r\n\t\t\t\tSetupQuarterResCommandBuffer(width, height);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid SetupQuarterResCommandBuffer(int width, int height)\r\n\t\t{\r\n\t\t\tCreateRenderTextures(width, height);\r\n\t\t\tquarterResRendererCommandBuffer.Clear();\r\n\r\n\t\t\t//1) Downscale depth\r\n\r\n\t\t\tif (m_hasOcean)\r\n\t\t\t\tquarterResRendererCommandBuffer.Blit(null, downscaledDepthRenderTexture, downscaleDepthMaterial, 1);        //ocean depth buffer downsample\r\n\t\t\telse\r\n\t\t\t\tquarterResRendererCommandBuffer.Blit(null, downscaledDepthRenderTexture, downscaleDepthMaterial, 0);        //default depth buffer downsample\r\n\r\n\t\t\tquarterResRendererCommandBuffer.SetGlobalTexture(\"ScattererDownscaledScatteringDepth\", downscaledDepthRenderTexture);\r\n\r\n\t\t\t//2) Render 1/4 res scattering+extinction to 1 RGBA + 1 RG texture\r\n\r\n\t\t\tRenderTargetIdentifier[] downscaledRenderTextures = { new RenderTargetIdentifier(downscaledRenderTexture0), new RenderTargetIdentifier(downscaledRenderTexture1) };\r\n\t\t\tquarterResRendererCommandBuffer.SetRenderTarget(downscaledRenderTextures, downscaledRenderTexture0.depthBuffer);\r\n\t\t\tquarterResRendererCommandBuffer.ClearRenderTarget(false, true, Color.clear);\r\n\t\t\tquarterResRendererCommandBuffer.DrawRenderer(targetRenderer, targetMaterial, 0, 1); //pass 1 render to textures\r\n\r\n\t\t\tquarterResRendererCommandBuffer.SetGlobalTexture(\"DownscaledScattering0\", downscaledRenderTexture0);\r\n\t\t\tquarterResRendererCommandBuffer.SetGlobalTexture(\"DownscaledScattering1\", downscaledRenderTexture1);\r\n\r\n\t\t\t//3) Render quad to screen that reads from downscaled textures and full res depth and performs near-depth upsampling\r\n\r\n\t\t\tquarterResRendererCommandBuffer.SetRenderTarget(BuiltinRenderTextureType.CameraTarget);\r\n\t\t\tquarterResRendererCommandBuffer.DrawRenderer(targetRenderer, compositeScatteringMaterial, 0, 0);\r\n\t\t}\r\n\r\n\t\tvoid GetRenderDimensions(out int width, out int height)\r\n\t\t{\r\n\t\t\tif (targetCamera.activeTexture)\r\n\t\t\t{\r\n\t\t\t\twidth = targetCamera.activeTexture.width;\r\n\t\t\t\theight = targetCamera.activeTexture.height;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\twidth = targetCamera.pixelWidth;\r\n\t\t\t\theight = targetCamera.pixelHeight;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid CreateRenderTextures (int width, int height)\r\n\t\t{\r\n\t\t\tm_width = width;\r\n\t\t\tm_height = height;\r\n\t\t\tm_hdrEnabled = targetCamera.allowHDR;\r\n\r\n\t\t\twidth /= 2;\r\n\t\t\theight /= 2;\r\n\r\n\t\t\tif (downscaledRenderTexture0 != null) downscaledRenderTexture0.Release();\r\n\t\t\tif (downscaledRenderTexture1 != null) downscaledRenderTexture1.Release();\r\n\t\t\tif (downscaledDepthRenderTexture != null) downscaledDepthRenderTexture.Release();\r\n\r\n\t\t\tdownscaledRenderTexture0 = new RenderTexture (width, height, 0, m_hdrEnabled ? RenderTextureFormat.DefaultHDR : RenderTextureFormat.ARGB32);\r\n\t\t\tdownscaledRenderTexture0.anisoLevel = 1;\r\n\t\t\tdownscaledRenderTexture0.antiAliasing = 1;\r\n\t\t\tdownscaledRenderTexture0.volumeDepth = 0;\r\n\t\t\tdownscaledRenderTexture0.useMipMap = false;\r\n\t\t\tdownscaledRenderTexture0.autoGenerateMips = false;\r\n\t\t\tdownscaledRenderTexture0.filterMode = FilterMode.Point;\r\n\t\t\tdownscaledRenderTexture0.Create ();\r\n\r\n\t\t\tdownscaledRenderTexture1 = new RenderTexture (width, height, 0, m_hdrEnabled ? RenderTextureFormat.RGHalf : RenderTextureFormat.RG16);\r\n\t\t\tdownscaledRenderTexture1.anisoLevel = 1;\r\n\t\t\tdownscaledRenderTexture1.antiAliasing = 1;\r\n\t\t\tdownscaledRenderTexture1.volumeDepth = 0;\r\n\t\t\tdownscaledRenderTexture1.useMipMap = false;\r\n\t\t\tdownscaledRenderTexture1.autoGenerateMips = false;\r\n\t\t\tdownscaledRenderTexture1.filterMode = FilterMode.Point;\r\n\t\t\tdownscaledRenderTexture1.Create ();\r\n\r\n\t\t\tdownscaledDepthRenderTexture = new RenderTexture(width, height, 0, RenderTextureFormat.RFloat);\r\n\t\t\tdownscaledDepthRenderTexture.anisoLevel = 1;\r\n\t\t\tdownscaledDepthRenderTexture.antiAliasing = 1;\r\n\t\t\tdownscaledDepthRenderTexture.volumeDepth = 0;\r\n\t\t\tdownscaledDepthRenderTexture.useMipMap = false;\r\n\t\t\tdownscaledDepthRenderTexture.autoGenerateMips = false;\r\n\t\t\tdownscaledDepthRenderTexture.filterMode = FilterMode.Point;\r\n\t\t\tdownscaledDepthRenderTexture.Create();\r\n\t\t}\r\n\t\t\r\n\t\tpublic void EnableForThisFrame()\r\n\t\t{\r\n\t\t\tif (!renderingEnabled)\r\n\t\t\t{\r\n\t\t\t\tbool screenShotModeEnabled = GameSettings.TAKE_SCREENSHOT.GetKeyDown(false);\r\n\r\n\t\t\t\tif (quarterResRendererCommandBuffer != null && !screenShotModeEnabled)\r\n\t\t\t\t{\r\n\t\t\t\t\tint width, height;\r\n\t\t\t\t\tGetRenderDimensions(out width, out height);\r\n\r\n\t\t\t\t\tif (width != m_width || height != m_height || targetCamera.allowHDR != m_hdrEnabled)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tSetupQuarterResCommandBuffer(width, height);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\ttargetCamera.AddCommandBuffer(CameraEvent.BeforeForwardAlpha, quarterResRendererCommandBuffer);\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t\ttargetCamera.AddCommandBuffer(CameraEvent.BeforeForwardAlpha, rendererCommandBuffer);\r\n\r\n\t\t\t\trenderingEnabled = true;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tvoid OnPreRender()\r\n\t\t{\r\n\t\t\ttargetMaterial.SetMatrix(ShaderProperties.CameraToWorld_PROPERTY, targetCamera.cameraToWorldMatrix);\r\n\t\t}\r\n\r\n\t\tvoid OnPostRender()\r\n\t\t{\r\n\t\t\tif (renderingEnabled && targetCamera.stereoActiveEye != Camera.MonoOrStereoscopicEye.Left)\r\n\t\t\t{\r\n\t\t\t\ttargetCamera.RemoveCommandBuffer(CameraEvent.BeforeForwardAlpha, rendererCommandBuffer);\r\n\t\t\t\tif (quarterResRendererCommandBuffer != null) targetCamera.RemoveCommandBuffer(CameraEvent.BeforeForwardAlpha, quarterResRendererCommandBuffer);\r\n\r\n\t\t\t\trenderingEnabled = false;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tpublic void OnDestroy ()\r\n\t\t{\r\n\t\t\tif (targetCamera && rendererCommandBuffer != null)\r\n\t\t\t{\r\n\t\t\t\ttargetCamera.RemoveCommandBuffer (CameraEvent.BeforeForwardAlpha, rendererCommandBuffer);\r\n\t\t\t\trendererCommandBuffer = null;\r\n\r\n\t\t\t\tif (quarterResRendererCommandBuffer != null)\r\n                {\r\n\t\t\t\t\ttargetCamera.RemoveCommandBuffer(CameraEvent.BeforeForwardAlpha, quarterResRendererCommandBuffer);\r\n\t\t\t\t\tquarterResRendererCommandBuffer = null;\r\n\t\t\t\t}\r\n\r\n\t\t\t\trenderingEnabled = true;\r\n\r\n\t\t\t\tif (downscaledDepthRenderTexture)\r\n\t\t\t\t\tdownscaledDepthRenderTexture.Release();\r\n\r\n\t\t\t\tif (downscaledRenderTexture0)\r\n\t\t\t\t\tdownscaledRenderTexture0.Release();\r\n\r\n\t\t\t\tif (downscaledRenderTexture1)\r\n\t\t\t\t\tdownscaledRenderTexture1.Release();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tpublic class ScreenSpaceScatteringContainer : GenericLocalAtmosphereContainer\r\n\t{\r\n\t\tScreenSpaceScattering screenSpaceScattering;\r\n\r\n\t\tpublic ScreenSpaceScatteringContainer (Material atmosphereMaterial, Transform parentTransform, float Rt, ProlandManager parentManager, bool quarterRes) : base (atmosphereMaterial, parentTransform, Rt, parentManager)\r\n\t\t{\r\n\t\t\tscatteringGO = GameObject.CreatePrimitive(PrimitiveType.Quad);\r\n\t\t\tscatteringGO.name = \"Scatterer screenspace scattering \" + parentManager.parentCelestialBody.name;\r\n\t\t\tGameObject.Destroy (scatteringGO.GetComponent<Collider> ());\r\n\t\t\tscatteringGO.transform.localScale = Vector3.one;\r\n\r\n\t\t\t//for now just disable this from reflection probe because no idea how to add the effect on it, no access to depth buffer and I don't feel like the perf hit would be worth to enable it\r\n\t\t\t//this will be handled by the ocean if it is present\r\n\t\t\t//TODO: remove this after finalizing 1/4 res since now we just use commandbuffer\r\n\t\t\tif (!manager.hasOcean || !Scatterer.Instance.mainSettings.useOceanShaders)\r\n\t\t\t{\r\n\t\t\t\tDisableEffectsChecker disableEffectsChecker = scatteringGO.AddComponent<DisableEffectsChecker> ();\r\n\t\t\t\tdisableEffectsChecker.manager = this.manager;\r\n\t\t\t}\r\n\r\n\t\t\tscreenSpaceScattering = scatteringGO.AddComponent<ScreenSpaceScattering>();\r\n\r\n\t\t\tscatteringGO.transform.position = parentTransform.position;\r\n\t\t\tscatteringGO.transform.parent   = parentTransform;\r\n\t\t\t\r\n\t\t\tscreenSpaceScattering.material = atmosphereMaterial;\r\n\t\t\tscreenSpaceScattering.material.CopyKeywordsFrom (atmosphereMaterial);\r\n\r\n\t\t\tscreenSpaceScattering.hasOcean = manager.hasOcean && Scatterer.Instance.mainSettings.useOceanShaders;\r\n\t\t\tscreenSpaceScattering.Init(quarterRes);\r\n\t\t}\r\n\r\n\t\tpublic override void UpdateContainer ()\r\n\t\t{\r\n\t\t\tbool isEnabled = !underwater && !inScaledSpace && activated;\r\n\t\t\tscreenSpaceScattering.SetActive(isEnabled);\r\n\t\t\tscatteringGO.SetActive(isEnabled);\r\n\t\t}\r\n\r\n\t\tpublic override void Cleanup ()\r\n\t\t{\r\n\t\t\tSetActivated (false);\r\n\t\t\tif(scatteringGO)\r\n\t\t\t{\r\n\t\t\t\tif(scatteringGO.transform && scatteringGO.transform.parent)\r\n\t\t\t\t{\r\n\t\t\t\t\t\tscatteringGO.transform.parent = null;\r\n\t\t\t\t}\r\n\t\t\t\tComponent.DestroyImmediate(screenSpaceScattering);\r\n\t\t\t\tGameObject.DestroyImmediate(scatteringGO);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "scatterer/Effects/Proland/Atmosphere/Utils/SkySphereContainer.cs",
    "content": "using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing UnityEngine;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class SkySphereContainer\r\n\t{\r\n\t\tGameObject skySphereGO;\r\n\t\tMeshRenderer skySphereMR;\r\n\r\n\t\tpublic GameObject GameObject { get { return skySphereGO; } }\r\n\t\tpublic MeshRenderer MeshRenderer { get { return skySphereMR; } }\r\n\r\n\t\tTransform parentLocalTransform, parentScaledTransform;\r\n\r\n\t\tMeshFilter skySphereMF;\r\n\t\t\r\n\t\tpublic SkySphereContainer(float size, Material material, Transform inParentLocalTransform, Transform inParentScaledTransform)\r\n\t\t{\r\n\t\t\tskySphereGO = GameObject.CreatePrimitive(PrimitiveType.Sphere);\r\n\t\t\tGameObject.Destroy (skySphereGO.GetComponent<Collider> ());\r\n\r\n\t\t\tskySphereGO.transform.localScale = Vector3.one;\r\n\t\t\t\r\n\t\t\tskySphereMF = skySphereGO.GetComponent<MeshFilter>();\r\n\t\t\tVector3[] verts = skySphereMF.mesh.vertices;\r\n\t\t\tfor (int i = 0; i < verts.Length; i++)\r\n\t\t\t{\r\n\t\t\t\tverts[i] = verts[i].normalized * size;\r\n\t\t\t}\r\n\t\t\tskySphereMF.mesh.vertices = verts;\r\n\t\t\tskySphereMF.mesh.RecalculateBounds();\r\n\t\t\tskySphereMF.mesh.RecalculateNormals();\r\n\t\t\t\r\n\t\t\tskySphereMR = skySphereGO.GetComponent<MeshRenderer>();\r\n\t\t\tskySphereMR.sharedMaterial = material;\r\n\t\t\tUtils.EnableOrDisableShaderKeywords (skySphereMR.sharedMaterial, \"LOCAL_SKY_ON\", \"LOCAL_SKY_OFF\", false);\r\n\r\n\t\t\tskySphereMR.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;\r\n\t\t\tskySphereMR.receiveShadows = false;\r\n\t\t\tskySphereMR.motionVectorGenerationMode = MotionVectorGenerationMode.Camera;\r\n\t\t\tskySphereMR.enabled = true;\r\n\r\n\t\t\tif (HighLogic.LoadedScene == GameScenes.MAINMENU)\r\n\t\t\t\tskySphereGO.layer = 15;\r\n\t\t\telse\r\n\t\t\t\tskySphereGO.layer = 9;\r\n\r\n\t\t\tskySphereGO.transform.position = inParentScaledTransform.position;\r\n\t\t\tskySphereGO.transform.parent = inParentScaledTransform;\r\n\r\n\t\t\tparentScaledTransform = inParentScaledTransform;\r\n\t\t\tparentLocalTransform = inParentLocalTransform;\r\n\t\t}\r\n\t\t\r\n\t\tpublic void SwitchLocalMode()\r\n\t\t{\r\n\t\t\tskySphereGO.layer = 15;\r\n\r\n\t\t\tskySphereGO.transform.parent = null;\r\n\r\n\t\t\tskySphereGO.transform.position = parentLocalTransform.position;\r\n\t\t\tskySphereGO.transform.localScale = new Vector3(ScaledSpace.ScaleFactor, ScaledSpace.ScaleFactor, ScaledSpace.ScaleFactor);\r\n\t\t\tskySphereGO.transform.parent = parentLocalTransform;\r\n\r\n\t\t\tUtils.EnableOrDisableShaderKeywords (skySphereMR.sharedMaterial, \"LOCAL_SKY_ON\", \"LOCAL_SKY_OFF\", true);\r\n\r\n\t\t\tskySphereGO.AddComponent<SkySphereScreenCopy> ().Init(skySphereMR.sharedMaterial);\r\n\t\t}\r\n\t\t\r\n\t\tpublic void SwitchScaledMode()\r\n\t\t{\r\n\t\t\tskySphereGO.layer = 9;\r\n\r\n\t\t\tskySphereGO.transform.parent = null;\r\n\r\n\t\t\tskySphereGO.transform.position = parentScaledTransform.position;\r\n\t\t\tskySphereGO.transform.localScale = Vector3.one;\r\n\t\t\tskySphereGO.transform.parent = parentScaledTransform;\r\n\r\n\t\t\tUtils.EnableOrDisableShaderKeywords (skySphereMR.sharedMaterial, \"LOCAL_SKY_ON\", \"LOCAL_SKY_OFF\", false);\r\n\r\n\t\t\tvar scrCopy = skySphereGO.GetComponent<SkySphereScreenCopy> ();\r\n\r\n\t\t\tif (scrCopy)\r\n\t\t\t\tUnityEngine.Component.DestroyImmediate (scrCopy);\r\n\r\n\t\t}\r\n\r\n\t\tpublic void Resize(float size)\r\n\t\t{\t\r\n\t\t\tVector3[] verts = skySphereMF.mesh.vertices;\r\n\t\t\tfor (int i = 0; i < verts.Length; i++)\r\n\t\t\t{\r\n\t\t\t\tverts[i] = verts[i].normalized * size;\r\n\t\t\t}\r\n\t\t\tskySphereMF.mesh.vertices = verts;\r\n\t\t\tskySphereMF.mesh.RecalculateBounds();\r\n\t\t\tskySphereMF.mesh.RecalculateNormals();\r\n\t\t}\r\n\r\n\t\tpublic void Cleanup()\r\n\t\t{\r\n\t\t\tif (skySphereMR != null)\r\n\t\t\t{\r\n\t\t\t\tskySphereMR.enabled = false;\r\n\t\t\t\tUnityEngine.Component.DestroyImmediate (skySphereMR);\r\n\t\t\t}\r\n\r\n\t\t\tif (skySphereGO != null)\r\n\t\t\t{\r\n\t\t\t\tUnityEngine.Object.DestroyImmediate(skySphereGO);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tpublic class SkySphereScreenCopy : MonoBehaviour\r\n\t{\r\n\t\tMaterial material;\r\n\t\tpublic void Init(Material material)\r\n\t\t{\r\n\t\t\tthis.material = material;\r\n\t\t}\r\n\r\n\t\tvoid OnWillRenderObject()\r\n\t\t{\r\n\t\t\tCamera cam = Camera.current;\r\n\t\t\t\r\n\t\t\tif (!cam)\r\n\t\t\t\treturn;\r\n\r\n\t\t\tif (cam == Scatterer.Instance.nearCamera && !Scatterer.Instance.unifiedCameraMode)\r\n\t\t\t{\r\n\t\t\t\tmaterial.SetFloat(ShaderProperties.renderSkyOnCurrentCamera_PROPERTY, 0f);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tmaterial.SetFloat(ShaderProperties.renderSkyOnCurrentCamera_PROPERTY, 1f);\r\n\t\t\t}\r\n\r\n\t\t\tScreenCopyCommandBuffer.EnableScreenCopyForFrame (cam);\r\n\t\t}\r\n\t}\r\n}"
  },
  {
    "path": "scatterer/Effects/Proland/Ocean/Caustics/CausticsLightRaysRenderer.cs",
    "content": "using UnityEngine;\r\nusing UnityEngine.Rendering;\r\nusing System.Collections.Generic;\r\nusing System;\r\n\r\nnamespace Scatterer\r\n{\r\n\t\r\n\t// First class inits the material and OnWillRender adds a script to relevant cameras, the given script adds and removes commandbuffers before and after rendering? yes, also enables only OnWillRender and if underwater\r\n\tpublic class CausticsLightRaysRenderer : MonoBehaviour\r\n\t{\r\n\t\tpublic Material CausticsLightRaysMaterial;\r\n\t\tTexture2D causticsTexture;\r\n\t\tpublic bool isEnabled = false;\r\n\t\tpublic bool commandBufferAdded = false;\r\n\t\t\r\n\t\tpublic OceanNode oceanNode;\r\n\t\t\r\n\t\tprivate Dictionary<Camera, CausticsLightRaysCameraScript> CameraToLightRaysScript = new Dictionary<Camera, CausticsLightRaysCameraScript>();\r\n\t\t\r\n\t\tpublic CausticsLightRaysRenderer ()\r\n\t\t{\r\n\t\t}\r\n\t\t\r\n\t\t//Todo refactor and make caustics class which handles the common code of lightrays and shadowmask?\r\n\t\tpublic bool Init(string causticsTexturePath,Vector2 causticsLayer1Scale,Vector2 causticsLayer1Speed,Vector2 causticsLayer2Scale,\r\n\t\t                 Vector2 causticsLayer2Speed, float causticsMultiply, float causticsMinBrightness, float oceanRadius, float blurDepth, OceanNode oceanNodeIn, float lightRaysStrength)\r\n\t\t{\r\n\t\t\tif (string.IsNullOrEmpty (causticsTexturePath) || !System.IO.File.Exists (Utils.GameDataPath+causticsTexturePath))\r\n\t\t\t{\r\n\t\t\t\tUtils.LogInfo(\"Caustics texture \"+ Utils.GameDataPath+causticsTexturePath +\" not found, disabling caustics light rays for current planet\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tif (CausticsLightRaysMaterial == null) {\r\n\t\t\t\t\tCausticsLightRaysMaterial = new Material (ShaderReplacer.Instance.LoadedShaders [(\"Scatterer/CausticsGodraysRaymarch\")]);\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tcausticsTexture = new Texture2D (1, 1);\r\n\t\t\t\tcausticsTexture.LoadImage (System.IO.File.ReadAllBytes (Utils.GameDataPath+causticsTexturePath));\r\n\t\t\t\tcausticsTexture.wrapMode = TextureWrapMode.Repeat;\r\n\t\t\t\t\r\n\t\t\t\tCausticsLightRaysMaterial.SetTexture (\"_CausticsTexture\", causticsTexture);\r\n\t\t\t\t\r\n\t\t\t\tCausticsLightRaysMaterial.SetVector (\"layer1Scale\", causticsLayer1Scale);\r\n\t\t\t\tCausticsLightRaysMaterial.SetVector (\"layer1Speed\", causticsLayer1Speed);\r\n\t\t\t\tCausticsLightRaysMaterial.SetVector (\"layer2Scale\", causticsLayer2Scale);\r\n\t\t\t\tCausticsLightRaysMaterial.SetVector (\"layer2Speed\", causticsLayer2Speed);\r\n\t\t\t\t\r\n\t\t\t\tCausticsLightRaysMaterial.SetFloat (\"causticsMultiply\", causticsMultiply);\r\n\t\t\t\tCausticsLightRaysMaterial.SetFloat (\"causticsMinBrightness\", causticsMinBrightness);\r\n\t\t\t\tCausticsLightRaysMaterial.SetFloat (\"oceanRadius\", oceanRadius);\r\n\t\t\t\tCausticsLightRaysMaterial.SetFloat (\"causticsBlurDepth\", blurDepth);\r\n\t\t\t\tCausticsLightRaysMaterial.SetFloat (\"transparencyDepth\", oceanNodeIn.transparencyDepth);\r\n\t\t\t\tCausticsLightRaysMaterial.SetFloat (\"lightRaysStrength\", lightRaysStrength);\r\n\r\n\r\n\t\t\t\tCausticsLightRaysMaterial.EnableKeyword (\"SPHERE_PLANET\");\r\n\t\t\t\tCausticsLightRaysMaterial.DisableKeyword (\"FLAT_PLANET\"); //for testing in unity editor only, obviously, Kerbin is not flat I swear\r\n\r\n\t\t\t\toceanNode = oceanNodeIn;\r\n\t\t\t\t\r\n\t\t\t\tisEnabled = true;\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tpublic void OnWillRenderObject()\r\n\t\t{\r\n\t\t\tif (isEnabled && oceanNode.isUnderwater)\r\n\t\t\t{\r\n\t\t\t\tCamera cam = Camera.current;\r\n\t\t\t\tif (!cam || MapView.MapIsEnabled || oceanNode.prolandManager.skyNode.inScaledSpace)\r\n\t\t\t\t\treturn;\r\n\t\t\t\t\r\n\t\t\t\tif (!CameraToLightRaysScript.ContainsKey (cam))\r\n\t\t\t\t{\r\n\t\t\t\t\tif ((cam.name == \"Reflection Probes Camera\") || (cam.name == \"ScattererPartialDepthBuffer\"))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t//we add it anyway to avoid doing a string compare\r\n\t\t\t\t\t\tCameraToLightRaysScript [cam] = null;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tCameraToLightRaysScript [cam] = (CausticsLightRaysCameraScript)cam.gameObject.AddComponent (typeof(CausticsLightRaysCameraScript));\r\n\t\t\t\t\t\tCameraToLightRaysScript [cam].CausticsLightRaysMaterial = CausticsLightRaysMaterial;\r\n\t\t\t\t\t\tCameraToLightRaysScript [cam].Init (oceanNode);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tif (CameraToLightRaysScript [cam] != null)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tCameraToLightRaysScript [cam].EnableForThisFrame ();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tpublic void OnDestroy ()\r\n\t\t{\r\n\t\t\tforeach (CausticsLightRaysCameraScript script in CameraToLightRaysScript.Values)\r\n\t\t\t{\r\n\t\t\t\tif (script != null)\r\n\t\t\t\t{\r\n\t\t\t\t\tscript.CleanUp();\r\n\t\t\t\t\tComponent.Destroy(script);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic class CausticsLightRaysCameraScript : MonoBehaviour\r\n\t{\r\n\t\tpublic Material CausticsLightRaysMaterial, compositeLightRaysMaterial;\r\n\t\t\r\n\t\tCommandBuffer commandBuffer;\r\n\t\tCamera targetCamera;\r\n\t\tprivate RenderTexture targetRT, targetRT2;\r\n\t\tprivate RenderTexture downscaledDepthRT;\r\n\t\tprivate Material downscaleDepthMaterial;\r\n\t\tbool isInitialized = false;\r\n\t\tbool renderingEnabled = false;\r\n\t\tLight targetLight;\r\n\t\tprivate OceanNode oceanNode;\r\n\t\t\r\n\t\tpublic CausticsLightRaysCameraScript ()\r\n\t\t{\r\n\t\t\t\r\n\t\t}\r\n\t\t\r\n\t\tpublic void Init(OceanNode oceanNodeIn)\r\n\t\t{\r\n\t\t\ttargetCamera = GetComponent<Camera>();\r\n\t\t\t\r\n\t\t\tif (targetCamera.targetTexture)\r\n\t\t\t{\r\n\t\t\t\ttargetRT = new RenderTexture (targetCamera.targetTexture.width / 4, targetCamera.targetTexture.height / 4, 0, RenderTextureFormat.R8);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\ttargetRT = new RenderTexture (Screen.width / 4, Screen.height / 4, 0, RenderTextureFormat.R8);\r\n\t\t\t}\r\n\t\t\ttargetRT.anisoLevel = 1;\r\n\t\t\ttargetRT.antiAliasing = 1;\r\n\t\t\ttargetRT.volumeDepth = 0;\r\n\t\t\ttargetRT.useMipMap = true;\r\n\t\t\ttargetRT.autoGenerateMips = false;\r\n\t\t\ttargetRT.filterMode = FilterMode.Bilinear;\r\n\t\t\ttargetRT.Create();\r\n\r\n\t\t\ttargetRT2 = new RenderTexture (targetRT.width, targetRT.height, 0, RenderTextureFormat.R8);\r\n\t\t\ttargetRT2.anisoLevel = 1;\r\n\t\t\ttargetRT2.antiAliasing = 1;\r\n\t\t\ttargetRT2.volumeDepth = 0;\r\n\t\t\ttargetRT2.useMipMap = true;\r\n\t\t\ttargetRT2.autoGenerateMips = false;\r\n\t\t\ttargetRT2.filterMode = FilterMode.Bilinear;\r\n\t\t\ttargetRT2.Create();\r\n\t\t\t\r\n\t\t\tdownscaledDepthRT = new RenderTexture(targetRT.width, targetRT.height, 0, RenderTextureFormat.RFloat);\r\n\t\t\tdownscaledDepthRT.anisoLevel = 1;\r\n\t\t\tdownscaledDepthRT.antiAliasing = 1;\r\n\t\t\tdownscaledDepthRT.volumeDepth = 0;\r\n\t\t\tdownscaledDepthRT.useMipMap = false;\r\n\t\t\tdownscaledDepthRT.autoGenerateMips = false;\r\n\t\t\tdownscaledDepthRT.filterMode = FilterMode.Point;\r\n\t\t\tdownscaledDepthRT.Create();\t\t\t\r\n\t\t\t\r\n\t\t\tdownscaleDepthMaterial = new Material(ShaderReplacer.Instance.LoadedShaders [(\"Scatterer/DownscaleDepth\")]);\r\n\t\t\tcompositeLightRaysMaterial = new Material (ShaderReplacer.Instance.LoadedShaders [(\"Scatterer/CompositeCausticsGodrays\")]);\r\n\t\t\tcompositeLightRaysMaterial.SetTexture (\"LightRaysTexture\", targetRT);\r\n\r\n\t\t\tcompositeLightRaysMaterial.SetColor(ShaderProperties._sunColor_PROPERTY, oceanNodeIn.prolandManager.getIntensityModulatedSunColor());\r\n\t\t\tcompositeLightRaysMaterial.SetVector (\"_Underwater_Color\", oceanNodeIn.m_UnderwaterColor);\r\n\r\n            commandBuffer = new CommandBuffer();\r\n            commandBuffer.name = \"Scatterer caustics renderer CommandBuffer\";\r\n\r\n            //downscale depth to 1/16\r\n            commandBuffer.Blit(null, downscaledDepthRT, downscaleDepthMaterial, 0);\r\n            commandBuffer.SetGlobalTexture(\"ScattererDownscaledDepth\", downscaledDepthRT);\r\n            \r\n            //render\r\n            commandBuffer.Blit(null, targetRT, CausticsLightRaysMaterial);\r\n\r\n\t\t\t//bilateral blur, 2 taps seems enough\r\n\t\t\tcommandBuffer.SetGlobalVector (\"BlurDir\", new Vector2(0,1));\r\n\t\t\tcommandBuffer.SetGlobalTexture (\"TextureToBlur\", targetRT);\r\n\t\t\tcommandBuffer.Blit(null, targetRT2, downscaleDepthMaterial, 2);\r\n\r\n\t\t\tcommandBuffer.SetGlobalVector (\"BlurDir\", new Vector2(1,0));\r\n\t\t\tcommandBuffer.SetGlobalTexture (\"TextureToBlur\", targetRT2);\r\n\t\t\tcommandBuffer.Blit(null, targetRT, downscaleDepthMaterial, 2);\r\n\r\n\t\t\t//copy to screen\r\n\t\t\tcommandBuffer.Blit(null, BuiltinRenderTextureType.CameraTarget, compositeLightRaysMaterial);\r\n\r\n\t\t\ttargetLight = oceanNodeIn.prolandManager.mainSunLight;\r\n\t\t\toceanNode = oceanNodeIn;\r\n\r\n\t\t\tisInitialized = true;\r\n\t\t}\r\n\t\t\r\n\t\tpublic void EnableForThisFrame()\r\n\t\t{\r\n\t\t\tif (isInitialized)\r\n\t\t\t{\r\n\t\t\t\ttargetCamera.AddCommandBuffer(CameraEvent.AfterForwardAlpha, commandBuffer);\r\n\t\t\t\t\r\n\t\t\t\t//TODO: move this out of here\r\n\t\t\t\tfloat warpTime = (TimeWarp.CurrentRate > 1) ? (float) Planetarium.GetUniversalTime() : 0f;\r\n\t\t\t\tCausticsLightRaysMaterial.SetFloat (ShaderProperties.warpTime_PROPERTY, warpTime);\r\n\r\n\t\t\t\t// If we use sunlightExtinction, reuse already computed extinction color\r\n\t\t\t\tif (Scatterer.Instance.mainSettings.sunlightExtinction)\r\n\t\t\t\t{\r\n\t\t\t\t\tcompositeLightRaysMaterial.SetColor(ShaderProperties._sunColor_PROPERTY, oceanNode.prolandManager.getIntensityModulatedSunColor() * Scatterer.Instance.sunlightModulatorsManagerInstance.GetLastModulateColor(targetLight));\r\n\t\t\t\t}\r\n\r\n\t\t\t\trenderingEnabled = true;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tpublic void OnPostRender()\r\n\t\t{\r\n\t\t\tif (renderingEnabled && targetCamera.stereoActiveEye != Camera.MonoOrStereoscopicEye.Left)\r\n\t\t\t{\r\n\t\t\t\ttargetCamera.RemoveCommandBuffer(CameraEvent.AfterForwardAlpha, commandBuffer);\r\n\t\t\t\trenderingEnabled = false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void CleanUp()\r\n\t\t{\r\n\t\t\trenderingEnabled = false;\r\n\t\t\tif (commandBuffer != null)\r\n\t\t\t{\r\n\t\t\t\tif (targetCamera)\r\n\t\t\t\t{\r\n\t\t\t\t\ttargetCamera.RemoveCommandBuffer (CameraEvent.AfterForwardAlpha, commandBuffer);\r\n\t\t\t\t}\r\n\t\t\t\tcommandBuffer.Dispose ();\r\n\t\t\t}\r\n\r\n\t\t\ttargetRT.Release ();\r\n\t\t\ttargetRT2.Release ();\r\n\t\t\tdownscaledDepthRT.Release ();\r\n\t\t}\r\n\t}\r\n}\r\n\r\n\r\n"
  },
  {
    "path": "scatterer/Effects/Proland/Ocean/Caustics/CausticsShadowMaskModulate.cs",
    "content": "// after light's screenspace shadow mask is computed, apply caustics to it\r\n\r\nusing UnityEngine;\r\nusing UnityEngine.Rendering;\r\nusing System.Collections.Generic;\r\nusing System;\r\n\r\nnamespace Scatterer\r\n{\r\n\t//transform this to general caustics class, pass to it the light and once of the ocean's meshrenderers?\r\n\t//how to handle the lightrays? do we need to render a quad to screen? do we set it as texture which the underwaterProjector reads from?\r\n\r\n\r\n\tpublic class CausticsShadowMaskModulate : MonoBehaviour\r\n\t{\r\n\t\tprivate CommandBuffer m_Buffer;\r\n\t\tprivate Light sunLight;\r\n\t\tpublic Material CausticsShadowMaskModulateMaterial;\r\n\t\tTexture2D causticsTexture;\r\n\t\tpublic bool isEnabled = false;\r\n\t\tpublic bool commandBufferAdded = false;\r\n\t\t\r\n\t\tpublic CausticsShadowMaskModulate ()\r\n\t\t{\r\n\t\t}\r\n\r\n\t\tpublic bool Init(string causticsTexturePath,Vector2 causticsLayer1Scale,Vector2 causticsLayer1Speed,Vector2 causticsLayer2Scale,\r\n\t\t                 Vector2 causticsLayer2Speed, float causticsMultiply, float causticsMinBrightness, float oceanRadius, float blurDepth, Light inputSunlight)\r\n\t\t{\r\n\r\n\t\t\tif (string.IsNullOrEmpty (causticsTexturePath) || !System.IO.File.Exists (Utils.GameDataPath+causticsTexturePath))\r\n\t\t\t{\r\n\t\t\t\tUtils.LogInfo(\"Caustics texture \"+ Utils.GameDataPath+causticsTexturePath +\" not found, disabling caustics for current planet\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tif (!CausticsShadowMaskModulateMaterial) {\r\n\t\t\t\t\tCausticsShadowMaskModulateMaterial = new Material (ShaderReplacer.Instance.LoadedShaders [(\"Scatterer/CausticsOcclusion\")]);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcausticsTexture = new Texture2D (1, 1);\r\n\t\t\t\tcausticsTexture.LoadImage (System.IO.File.ReadAllBytes (Utils.GameDataPath+causticsTexturePath));\r\n\t\t\t\tcausticsTexture.wrapMode = TextureWrapMode.Repeat;\r\n\r\n\t\t\t\tCausticsShadowMaskModulateMaterial.SetTexture (\"_CausticsTexture\", causticsTexture);\r\n\r\n\t\t\t\tCausticsShadowMaskModulateMaterial.SetVector (\"layer1Scale\", causticsLayer1Scale);\r\n\t\t\t\tCausticsShadowMaskModulateMaterial.SetVector (\"layer1Speed\", causticsLayer1Speed);\r\n\t\t\t\tCausticsShadowMaskModulateMaterial.SetVector (\"layer2Scale\", causticsLayer2Scale);\r\n\t\t\t\tCausticsShadowMaskModulateMaterial.SetVector (\"layer2Speed\", causticsLayer2Speed);\r\n\r\n\t\t\t\tCausticsShadowMaskModulateMaterial.SetFloat (\"causticsMultiply\", causticsMultiply);\r\n\t\t\t\tCausticsShadowMaskModulateMaterial.SetFloat (\"causticsMinBrightness\", causticsMinBrightness);\r\n\t\t\t\tCausticsShadowMaskModulateMaterial.SetFloat (\"oceanRadius\", oceanRadius);\r\n\t\t\t\tCausticsShadowMaskModulateMaterial.SetFloat (\"causticsBlurDepth\", blurDepth);\r\n\r\n\t\t\t\tCausticsShadowMaskModulateMaterial.EnableKeyword (\"SPHERE_PLANET\");\r\n\t\t\t\tCausticsShadowMaskModulateMaterial.DisableKeyword (\"FLAT_PLANET\"); //for testing in unity editor only, obviously, Kerbin is not flat I swear\r\n\r\n\t\t\t\tsunLight = inputSunlight;\r\n\r\n                m_Buffer = new CommandBuffer ();\r\n                m_Buffer.name = \"Scatterer caustics shadowMask modulate CommandBuffer\";\r\n                m_Buffer.Blit (null, BuiltinRenderTextureType.CurrentActive, CausticsShadowMaskModulateMaterial);\r\n\r\n\t\t\t\tAddCommandBuffer ();\r\n\t\t\t\tisEnabled = true;\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void AddCommandBuffer()\r\n\t\t{\r\n\t\t\tsunLight.AddCommandBuffer (LightEvent.AfterScreenspaceMask, m_Buffer);\r\n\t\t\tcommandBufferAdded = true;\r\n\t\t}\r\n\t\t\r\n\t\tpublic void UpdateCaustics()\r\n\t\t{\r\n\t\t\tif (isEnabled)\r\n\t\t\t{\r\n\t\t\t\tfloat warpTime = (TimeWarp.CurrentRate > 1) ? (float) Planetarium.GetUniversalTime() : 0f;\r\n\t\t\t\tCausticsShadowMaskModulateMaterial.SetFloat (ShaderProperties.warpTime_PROPERTY, warpTime);\r\n\t\t\t}\r\n\r\n\t\t\tif (commandBufferAdded && !isEnabled)\r\n\t\t\t{\r\n\t\t\t\tRemoveCommandBuffer();\r\n\t\t\t}\r\n\t\t\telse if (!commandBufferAdded && isEnabled)\r\n\t\t\t{\r\n\t\t\t\tAddCommandBuffer();\r\n\t\t\t}\r\n\t\t}\r\n\t\t\t\t\r\n\t\tpublic void RemoveCommandBuffer ()\r\n\t\t{\r\n\t\t\tif (sunLight)\r\n\t\t\t\tsunLight.RemoveCommandBuffer (LightEvent.AfterScreenspaceMask, m_Buffer);\r\n\t\t\tcommandBufferAdded = false;\r\n\t\t}\r\n\r\n\t\tpublic void OnDestroy ()\r\n\t\t{\r\n\t\t\tRemoveCommandBuffer ();\r\n\t\t}\r\n\t}\r\n}\r\n\t\r\n\r\n"
  },
  {
    "path": "scatterer/Effects/Proland/Ocean/FourierCPU.cs",
    "content": "using UnityEngine;\r\nusing System.Collections;\r\n\r\nnamespace Scatterer\r\n{\r\n\t\r\n    public class FourierCPU\r\n    {\r\n        int m_size;\r\n        float m_fsize;\r\n        int m_passes;\r\n\t\tpublic float[] m_butterflyLookupTable = null;\r\n\r\n        public FourierCPU(int size)\r\n        {\r\n            if (!Mathf.IsPowerOfTwo(size))\r\n            {\r\n                Utils.LogDebug(\"Fourier grid size must be pow2 number, changing to nearest pow2 number\");\r\n                size = Mathf.NextPowerOfTwo(size);\r\n            }\r\n\r\n            m_size = size; //must be pow2 num\r\n            m_fsize = (float)m_size;\r\n            m_passes = (int)(Mathf.Log(m_fsize) / Mathf.Log(2.0f));\r\n        }\r\n\r\n        //Performs two FFTs on two complex numbers packed in a vector4\r\n        Vector4 FFT(Vector2 w, Vector4 input1, Vector4 input2)\r\n        {\r\n            input1.x += w.x * input2.x - w.y * input2.y;\r\n            input1.y += w.y * input2.x + w.x * input2.y;\r\n            input1.z += w.x * input2.z - w.y * input2.w;\r\n            input1.w += w.y * input2.z + w.x * input2.w;\r\n\r\n            return input1;\r\n        }\r\n\r\n        //Performs one FFT on a complex number\r\n        Vector2 FFT(Vector2 w, Vector2 input1, Vector2 input2)\r\n        {\r\n            input1.x += w.x * input2.x - w.y * input2.y;\r\n            input1.y += w.y * input2.x + w.x * input2.y;\r\n\r\n            return input1;\r\n        }\r\n\r\n        public int PeformFFT(int startIdx, Vector4[,] data0, Vector4[,] data1, Vector4[,] data2)\r\n        {\r\n            int x; int y; int i;\r\n            int idx = 0; int idx1; int bftIdx;\r\n            int X; int Y;\r\n            Vector2 w;\r\n\r\n            int j = startIdx;\r\n\r\n\r\n\r\n            for (i = 0; i < m_passes; i++, j++)\r\n            {\r\n                idx = j % 2;\r\n                idx1 = (j + 1) % 2;\r\n\r\n                for (x = 0; x < m_size; x++)\r\n                {\r\n                    for (y = 0; y < m_size; y++)\r\n                    {\r\n                        bftIdx = 4 * (x + i * m_size);\r\n\r\n                        X = (int)m_butterflyLookupTable[bftIdx + 0];\r\n                        Y = (int)m_butterflyLookupTable[bftIdx + 1];\r\n                        w.x = m_butterflyLookupTable[bftIdx + 2];\r\n                        w.y = m_butterflyLookupTable[bftIdx + 3];\r\n\r\n                        data0[idx, x + y * m_size] = FFT(w, data0[idx1, X + y * m_size], data0[idx1, Y + y * m_size]);\r\n                        data1[idx, x + y * m_size] = FFT(w, data1[idx1, X + y * m_size], data1[idx1, Y + y * m_size]);\r\n                        data2[idx, x + y * m_size] = FFT(w, data2[idx1, X + y * m_size], data2[idx1, Y + y * m_size]);\r\n                    }\r\n                }\r\n            }\r\n\r\n            for (i = 0; i < m_passes; i++, j++)\r\n            {\r\n                idx = j % 2;\r\n                idx1 = (j + 1) % 2;\r\n\r\n                for (x = 0; x < m_size; x++)\r\n                {\r\n                    for (y = 0; y < m_size; y++)\r\n                    {\r\n                        bftIdx = 4 * (y + i * m_size);\r\n\r\n                        X = (int)m_butterflyLookupTable[bftIdx + 0];\r\n                        Y = (int)m_butterflyLookupTable[bftIdx + 1];\r\n                        w.x = m_butterflyLookupTable[bftIdx + 2];\r\n                        w.y = m_butterflyLookupTable[bftIdx + 3];\r\n\r\n                        data0[idx, x + y * m_size] = FFT(w, data0[idx1, x + X * m_size], data0[idx1, x + Y * m_size]);\r\n                        data1[idx, x + y * m_size] = FFT(w, data1[idx1, x + X * m_size], data1[idx1, x + Y * m_size]);\r\n                        data2[idx, x + y * m_size] = FFT(w, data2[idx1, x + X * m_size], data2[idx1, x + Y * m_size]);\r\n\r\n                    }\r\n                }\r\n            }\r\n\r\n\r\n\t\t\treturn idx;\r\n        }\r\n\t\r\n\r\n\t\tpublic int PeformFFT(int startIdx, Vector4[,] data0, Vector4[,] data1)\r\n\t\t{\r\n\t\t\tint x; int y; int i;\r\n\t\t\tint idx = 0; int idx1; int bftIdx;\r\n\t\t\tint X; int Y;\r\n\t\t\tVector2 w;\r\n\t\t\t\r\n\t\t\tint j = startIdx;\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\tfor (i = 0; i < m_passes; i++, j++)\r\n\t\t\t{\r\n\t\t\t\tidx = j % 2;\r\n\t\t\t\tidx1 = (j + 1) % 2;\r\n\t\t\t\t\r\n\t\t\t\tfor (x = 0; x < m_size; x++)\r\n\t\t\t\t{\r\n\t\t\t\t\tfor (y = 0; y < m_size; y++)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tbftIdx = 4 * (x + i * m_size);\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tX = (int)m_butterflyLookupTable[bftIdx + 0];\r\n\t\t\t\t\t\tY = (int)m_butterflyLookupTable[bftIdx + 1];\r\n\t\t\t\t\t\tw.x = m_butterflyLookupTable[bftIdx + 2];\r\n\t\t\t\t\t\tw.y = m_butterflyLookupTable[bftIdx + 3];\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tdata0[idx, x + y * m_size] = FFT(w, data0[idx1, X + y * m_size], data0[idx1, Y + y * m_size]);\r\n\t\t\t\t\t\tdata1[idx, x + y * m_size] = FFT(w, data1[idx1, X + y * m_size], data1[idx1, Y + y * m_size]);\r\n\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tfor (i = 0; i < m_passes; i++, j++)\r\n\t\t\t{\r\n\t\t\t\tidx = j % 2;\r\n\t\t\t\tidx1 = (j + 1) % 2;\r\n\t\t\t\t\r\n\t\t\t\tfor (x = 0; x < m_size; x++)\r\n\t\t\t\t{\r\n\t\t\t\t\tfor (y = 0; y < m_size; y++)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tbftIdx = 4 * (y + i * m_size);\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tX = (int)m_butterflyLookupTable[bftIdx + 0];\r\n\t\t\t\t\t\tY = (int)m_butterflyLookupTable[bftIdx + 1];\r\n\t\t\t\t\t\tw.x = m_butterflyLookupTable[bftIdx + 2];\r\n\t\t\t\t\t\tw.y = m_butterflyLookupTable[bftIdx + 3];\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tdata0[idx, x + y * m_size] = FFT(w, data0[idx1, x + X * m_size], data0[idx1, x + Y * m_size]);\r\n\t\t\t\t\t\tdata1[idx, x + y * m_size] = FFT(w, data1[idx1, x + X * m_size], data1[idx1, x + Y * m_size]);\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t\r\n\t\t\treturn idx;\r\n\t\t}\r\n\r\n\r\n\t\tpublic int PeformFFT(int startIdx, Vector4[,] data0)\r\n\t\t{\r\n\t\t\tint x; int y; int i;\r\n\t\t\tint idx = 0; int idx1; int bftIdx;\r\n\t\t\tint X; int Y;\r\n\t\t\tVector2 w;\r\n\t\t\t\r\n\t\t\tint j = startIdx;\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\tfor (i = 0; i < m_passes; i++, j++)\r\n\t\t\t{\r\n\t\t\t\tidx = j % 2;\r\n\t\t\t\tidx1 = (j + 1) % 2;\r\n\t\t\t\t\r\n\t\t\t\tfor (x = 0; x < m_size; x++)\r\n\t\t\t\t{\r\n\t\t\t\t\tfor (y = 0; y < m_size; y++)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tbftIdx = 4 * (x + i * m_size);\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tX = (int)m_butterflyLookupTable[bftIdx + 0];\r\n\t\t\t\t\t\tY = (int)m_butterflyLookupTable[bftIdx + 1];\r\n\t\t\t\t\t\tw.x = m_butterflyLookupTable[bftIdx + 2];\r\n\t\t\t\t\t\tw.y = m_butterflyLookupTable[bftIdx + 3];\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tdata0[idx, x + y * m_size] = FFT(w, data0[idx1, X + y * m_size], data0[idx1, Y + y * m_size]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tfor (i = 0; i < m_passes; i++, j++)\r\n\t\t\t{\r\n\t\t\t\tidx = j % 2;\r\n\t\t\t\tidx1 = (j + 1) % 2;\r\n\t\t\t\t\r\n\t\t\t\tfor (x = 0; x < m_size; x++)\r\n\t\t\t\t{\r\n\t\t\t\t\tfor (y = 0; y < m_size; y++)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tbftIdx = 4 * (y + i * m_size);\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tX = (int)m_butterflyLookupTable[bftIdx + 0];\r\n\t\t\t\t\t\tY = (int)m_butterflyLookupTable[bftIdx + 1];\r\n\t\t\t\t\t\tw.x = m_butterflyLookupTable[bftIdx + 2];\r\n\t\t\t\t\t\tw.y = m_butterflyLookupTable[bftIdx + 3];\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tdata0[idx, x + y * m_size] = FFT(w, data0[idx1, x + X * m_size], data0[idx1, x + Y * m_size]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn idx;\r\n\t\t}\r\n    }\r\n}\r\n"
  },
  {
    "path": "scatterer/Effects/Proland/Ocean/FourierGPU.cs",
    "content": "using UnityEngine;\r\nusing System.Collections;\r\n\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class FourierGPU\r\n\t{\r\n\t\tconst int PASS_X_1 = 0, PASS_Y_1 = 1;\r\n\t\tconst int PASS_X_2 = 2, PASS_Y_2 = 3;\r\n\t\tconst int PASS_X_3 = 4, PASS_Y_3 = 5;\r\n\r\n\t\tint m_size;\r\n\t\tfloat m_fsize;\r\n\t\tint m_passes;\r\n\t\tTexture2D[] m_butterflyLookupTable = null;\r\n\t\tMaterial m_fourier;\r\n\r\n\t\tpublic FourierGPU(int size)\r\n\t\t{\t\r\n\t\t\tif(size > 256)\r\n\t\t\t{\r\n\t\t\t\tUtils.LogDebug(\"FourierGPU::FourierGPU - fourier grid size must not be greater than 256, changing to 256\");\r\n\t\t\t\tsize = 256;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif(!Mathf.IsPowerOfTwo(size))\r\n\t\t\t{\r\n\t\t\t\tUtils.LogDebug(\"FourierGPU::FourierGPU - fourier grid size must be pow2 number, changing to nearest pow2 number\");\r\n\t\t\t\tsize = Mathf.NextPowerOfTwo(size);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t\tShader shader = ShaderReplacer.Instance.LoadedShaders[(\"Scatterer/Fourier\")];\r\n\r\n\t\t\tif(shader == null) Utils.LogDebug(\"FourierGPU::FourierGPU - Could not find shader Math/Fourier\");\r\n\t\t\r\n\t\t\tm_fourier = new Material(shader);\r\n\r\n\t\t\tm_size = size; //must be pow2 num\r\n\t\t\tm_fsize = (float)m_size;\r\n\t\t\tm_passes = (int)(Mathf.Log(m_fsize)/Mathf.Log(2.0f));\r\n\t\t\t\r\n\t\t\tm_butterflyLookupTable = new Texture2D[m_passes];\r\n\t\t\t\r\n\t\t\tComputeButterflyLookupTable();\r\n\t\t\t\r\n\t\t\tm_fourier.SetFloat(\"_Size\", m_fsize);\r\n\t\t}\r\n\r\n\t\tint BitReverse(int i)\r\n\t\t{\r\n\t\t\tint j = i;\r\n\t\t\tint Sum = 0;\r\n\t\t\tint W = 1;\r\n\t\t\tint M = m_size / 2;\r\n\t\t\twhile(M != 0) \r\n\t\t\t{\r\n\t\t\t\tj = ((i&M) > M-1) ? 1 : 0;\r\n\t\t\t\tSum += j * W;\r\n\t\t\t\tW *= 2;\r\n\t\t\t\tM /= 2;\r\n\t\t\t}\r\n\t\t\treturn Sum;\r\n\t\t}\r\n\t\t\r\n\t\tTexture2D Make1DTex(int i)\r\n\t\t{\r\n\t\t\tTexture2D tex = new Texture2D(m_size, 1, TextureFormat.ARGB32, false, true);\r\n\t\t\ttex.filterMode = FilterMode.Point;\r\n\t\t\ttex.wrapMode = TextureWrapMode.Clamp;\r\n\t\t\treturn tex;\r\n\t\t}\r\n\r\n\t\tvoid ComputeButterflyLookupTable()\r\n\t\t{\r\n\t\t\t\r\n\t\t\tfor(int i = 0; i < m_passes; i++) \r\n\t\t\t{\r\n\t\t\t\tint nBlocks  = (int) Mathf.Pow(2, m_passes - 1 - i);\r\n\t\t\t\tint nHInputs = (int) Mathf.Pow(2, i);\r\n\t\t\t\t\r\n\t\t\t\tm_butterflyLookupTable[i] = Make1DTex(i);\r\n\t\t\t\t\r\n\t\t\t\tfor (int j = 0; j < nBlocks; j++)\r\n\t\t\t\t{\r\n\t\t\t\t\tfor (int k = 0; k < nHInputs; k++) \r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tint i1, i2, j1, j2;\r\n\t\t\t\t\t\tif (i == 0) \r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\ti1 = j * nHInputs * 2 + k;\r\n\t\t\t\t\t\t\ti2 = j * nHInputs * 2 + nHInputs + k;\r\n\t\t\t\t\t\t\tj1 = BitReverse(i1);\r\n\t\t\t\t\t\t\tj2 = BitReverse(i2);\r\n\t\t\t\t\t\t} \r\n\t\t\t\t\t\telse \r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\ti1 = j * nHInputs * 2 + k;\r\n\t\t\t\t\t\t\ti2 = j * nHInputs * 2 + nHInputs + k;\r\n\t\t\t\t\t\t\tj1 = i1;\r\n\t\t\t\t\t\t\tj2 = i2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tm_butterflyLookupTable[i].SetPixel(i1, 0, new Color( (float)j1 / 255.0f, (float)j2 / 255.0f, (float)(k*nBlocks) / 255.0f, 0));\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tm_butterflyLookupTable[i].SetPixel(i2, 0, new Color( (float)j1 / 255.0f, (float)j2 / 255.0f, (float)(k*nBlocks) / 255.0f, 1));\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tm_butterflyLookupTable[i].Apply();\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tpublic int PeformFFT(RenderTexture[] data0, RenderTexture[] data1)\r\n\t\t{\r\n\t\t\tRenderTexture[] pass0 = new RenderTexture[]{ data0[0], data1[0] };\r\n\t\t\tRenderTexture[] pass1 = new RenderTexture[]{ data0[1], data1[1] };\r\n\t\t\t\r\n\t\t\tint i;\r\n\t\t\tint idx = 0; int idx1;\r\n\t\t\tint j = 0;\r\n\t\t\t\r\n\t\t\tfor(i = 0; i < m_passes; i++, j++) \r\n\t\t\t{\r\n\t\t\t\tidx = j%2;\r\n\t\t\t\tidx1 = (j+1)%2;\r\n\t\t\t\t\r\n\t\t\t\tm_fourier.SetTexture(ShaderProperties._ButterFlyLookUp_PROPERTY, m_butterflyLookupTable[i]);\r\n\t\t\t\t\r\n\t\t\t\tm_fourier.SetTexture(ShaderProperties._ReadBuffer0_PROPERTY, data0[idx1]);\r\n\t\t\t\tm_fourier.SetTexture(ShaderProperties._ReadBuffer1_PROPERTY, data1[idx1]);\r\n\r\n\t\t\t\tif(idx == 0)\r\n\t\t\t\t\tRTUtility.MultiTargetBlit(pass0, m_fourier, PASS_X_2);\r\n\t\t\t\telse\r\n\t\t\t\t\tRTUtility.MultiTargetBlit(pass1, m_fourier, PASS_X_2);\r\n\t\t\t}\r\n\r\n\t\t\tfor(i = 0; i < m_passes; i++, j++) \r\n\t\t\t{\r\n\t\t\t\tidx = j%2;\r\n\t\t\t\tidx1 = (j+1)%2;\r\n\t\t\t\t\r\n\t\t\t\tm_fourier.SetTexture(ShaderProperties._ButterFlyLookUp_PROPERTY, m_butterflyLookupTable[i]);\r\n\t\t\t\t\r\n\t\t\t\tm_fourier.SetTexture(ShaderProperties._ReadBuffer0_PROPERTY, data0[idx1]);\r\n\t\t\t\tm_fourier.SetTexture(ShaderProperties._ReadBuffer1_PROPERTY, data1[idx1]);\r\n\r\n\t\t\t\tif(idx == 0)\r\n\t\t\t\t\tRTUtility.MultiTargetBlit(pass0, m_fourier, PASS_Y_2);\r\n\t\t\t\telse\r\n\t\t\t\t\tRTUtility.MultiTargetBlit(pass1, m_fourier, PASS_Y_2);\r\n\t\t\t}\r\n\r\n\t\t\treturn idx;\r\n\t\t}\r\n\r\n\t\tpublic int PeformFFT(RenderTexture[] data0, RenderTexture[] data1, RenderTexture[] data2)\r\n\t\t{\r\n\t\t\tRenderTexture[] pass0 = new RenderTexture[]{ data0[0], data1[0], data2[0] };\r\n\t\t\tRenderTexture[] pass1 = new RenderTexture[]{ data0[1], data1[1], data2[1] };\r\n\t\t\t\r\n\t\t\tint i;\r\n\t\t\tint idx = 0; int idx1;\r\n\t\t\tint j = 0;\r\n\t\t\t\r\n\t\t\tfor(i = 0; i < m_passes; i++, j++) \r\n\t\t\t{\r\n\t\t\t\tidx = j%2;\r\n\t\t\t\tidx1 = (j+1)%2;\r\n\t\t\t\t\r\n\t\t\t\tm_fourier.SetTexture(ShaderProperties._ButterFlyLookUp_PROPERTY, m_butterflyLookupTable[i]);\r\n\t\t\t\t\r\n\t\t\t\tm_fourier.SetTexture(ShaderProperties._ReadBuffer0_PROPERTY, data0[idx1]);\r\n\t\t\t\tm_fourier.SetTexture(ShaderProperties._ReadBuffer1_PROPERTY, data1[idx1]);\r\n\t\t\t\tm_fourier.SetTexture(\"_ReadBuffer2\", data2[idx1]);\r\n\t\t\t\t\r\n\t\t\t\tif(idx == 0)\r\n\t\t\t\t\tRTUtility.MultiTargetBlit(pass0, m_fourier, PASS_X_3);\r\n\t\t\t\telse\r\n\t\t\t\t\tRTUtility.MultiTargetBlit(pass1, m_fourier, PASS_X_3);\r\n\t\t\t}\r\n\r\n\t\t\tfor(i = 0; i < m_passes; i++, j++) \r\n\t\t\t{\r\n\t\t\t\tidx = j%2;\r\n\t\t\t\tidx1 = (j+1)%2;\r\n\t\t\t\t\r\n\t\t\t\tm_fourier.SetTexture(ShaderProperties._ButterFlyLookUp_PROPERTY, m_butterflyLookupTable[i]);\r\n\t\t\t\t\r\n\t\t\t\tm_fourier.SetTexture(ShaderProperties._ReadBuffer0_PROPERTY, data0[idx1]);\r\n\t\t\t\tm_fourier.SetTexture(ShaderProperties._ReadBuffer1_PROPERTY, data1[idx1]);\r\n\t\t\t\tm_fourier.SetTexture(\"_ReadBuffer2\", data2[idx1]);\r\n\t\t\t\t\r\n\t\t\t\tif(idx == 0)\r\n\t\t\t\t\tRTUtility.MultiTargetBlit(pass0, m_fourier, PASS_Y_3);\r\n\t\t\t\telse\r\n\t\t\t\t\tRTUtility.MultiTargetBlit(pass1, m_fourier, PASS_Y_3);\r\n\t\t\t}\r\n\r\n\t\t\treturn idx;\r\n\t\t}\r\n\r\n\t}\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "scatterer/Effects/Proland/Ocean/GPUWaveInteractionHandler.cs",
    "content": "using UnityEngine;\nusing System.Collections.Generic;\nusing System.Reflection;\nusing UnityEngine.Rendering;\n\nnamespace Scatterer\n{\n\tpublic class GPUWaveInteractionHandler\n\t{\n\t\tprivate ComputeShader findHeightsShader;\n\t\tprivate List<PartBuoyancy> partsBuoyancies = new List<PartBuoyancy>();\n\t\tprivate bool heightsRequestInProgress = false;\n\t\tprivate bool cameraHeightRequested = false;\n\t\tprivate float[] heights = { };\n\t\tprivate ComputeBuffer positionsBuffer, heightsBuffer;\n\t\tprivate int frameLatencyCounter = 1;\n\n\t\tprivate bool paused = false;\n\t\tprivate KSP.UI.Screens.AltimeterSliderButtons altimeterRecoveryButton;\n\t\tprivate bool altimeterRecoveryButtonOverriden = false;\n\t\tprivate MethodInfo recoveryButtonSetUnlockMethod;\n\t\tprivate object[] setUnlockParametersArray;\n\n\t\tprivate float maxWaveInteractionShipAltitude = 500.0f;\n\t\tprivate bool isHomeworld = false;\n\n\t\tpublic GPUWaveInteractionHandler(float inMaxWaveInteractionShipAltitude, bool inIsHomeworld)\n\t\t{\n\t\t\tmaxWaveInteractionShipAltitude = inMaxWaveInteractionShipAltitude;\n\t\t\tisHomeworld = inIsHomeworld;\n\n\t\t\tfindHeightsShader = ShaderReplacer.Instance.LoadedComputeShaders[\"FindHeights\"];\n\n\t\t\tif (Scatterer.Instance.mainSettings.oceanCraftWaveInteractionsOverrideWaterCrashTolerance)\n\t\t\t{\n\t\t\t\tPhysicsGlobals.BuoyancyCrashToleranceMult = Scatterer.Instance.mainSettings.buoyancyCrashToleranceMultOverride;\n\t\t\t}\n\n\t\t\tif (Scatterer.Instance.mainSettings.oceanCraftWaveInteractionsOverrideDrag)\n\t\t\t{\n\t\t\t\tPhysicsGlobals.BuoyancyWaterDragTimer = double.NegativeInfinity; // this is needed to avoid the excessive drag that is applied when first hitting the water and which basically kills seaplanes with the smallest waves\n\t\t\t}\n\n\t\t\tif (Scatterer.Instance.mainSettings.oceanCraftWaveInteractionsOverrideRecoveryVelocity)\n\t\t\t{\n\t\t\t\tGameEvents.onGamePause.Add(ForcePauseMenuSaving);\n\t\t\t\tGameEvents.onGameUnpause.Add(UnPause);\n\n\t\t\t\tif (inIsHomeworld)\n\t\t\t\t{\n\t\t\t\t\tKSP.UI.Screens.AltimeterSliderButtons[] sliderButtons = Resources.FindObjectsOfTypeAll<KSP.UI.Screens.AltimeterSliderButtons>();\n\t\t\t\t\tif (sliderButtons.Length > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\taltimeterRecoveryButton = sliderButtons[0];\n\n\t\t\t\t\t\tBindingFlags Flags = BindingFlags.FlattenHierarchy | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static;\n\n\t\t\t\t\t\trecoveryButtonSetUnlockMethod = altimeterRecoveryButton.GetType().GetMethod(\"setUnlock\", Flags);\n\t\t\t\t\t\tif (recoveryButtonSetUnlockMethod == null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tUtils.LogError(\"No setUnlock method found in AltimeterSliderButtons\");\n\t\t\t\t\t\t\taltimeterRecoveryButton = null;\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsetUnlockParametersArray = new object[] { 2 }; //The state for unlocking the altimeterSliderButtons\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpublic void SetMaterialProperties(Vector4 choppyness, Vector4 gridSizes, RenderTexture map0, RenderTexture map3, RenderTexture map4)\n        {\n\t\t\tfindHeightsShader.SetVector(ShaderProperties._Ocean_Choppyness_PROPERTY, choppyness);\n\t\t\tfindHeightsShader.SetVector(ShaderProperties._Ocean_GridSizes_PROPERTY, gridSizes);\n\n\t\t\tfindHeightsShader.SetTexture(0, ShaderProperties._Ocean_Map0_PROPERTY, map0);\n\t\t\tfindHeightsShader.SetTexture(0, ShaderProperties._Ocean_Map3_PROPERTY, map3);\n\t\t\tfindHeightsShader.SetTexture(0, ShaderProperties._Ocean_Map4_PROPERTY, map4);\n\t\t}\n\n\t\tpublic float UpdateInteractions(double cameraHeight, float waterHeightAtCameraPosition, Vector3 ux, Vector3 uy, Vector3 offsetVector3)\n        {\n            UpdateRecoveryButton();\n            return UpdateHeights(cameraHeight, waterHeightAtCameraPosition, ux, uy, offsetVector3);\n        }\n\n        private float UpdateHeights(double cameraHeight, float waterHeightAtCameraPosition, Vector3 ux, Vector3 uy, Vector3 offsetVector3)\n        {\n            if (!heightsRequestInProgress)\n            {\n\t\t\t\twaterHeightAtCameraPosition = ApplyWaterLevelHeights(waterHeightAtCameraPosition);\n\n                List<Vector2> positionsList = new List<Vector2>();\n                BuildPartsPositionsList(positionsList, partsBuoyancies, ux, uy, offsetVector3);\n                AddCameraPosition(positionsList, cameraHeight, new Vector2(offsetVector3.x, offsetVector3.y));\n                RequestAsyncWaterLevelHeights(positionsList);\n            }\n            else\n            {\n                frameLatencyCounter++;\n            }\n\n\t\t\treturn waterHeightAtCameraPosition;\n\t\t}\n\n        private void UpdateRecoveryButton()\n        {\n            if (Scatterer.Instance.mainSettings.oceanCraftWaveInteractionsOverrideRecoveryVelocity && !paused && FlightGlobals.ActiveVessel != null)\n            {\n                if ((altimeterRecoveryButton != null) && (FlightGlobals.ActiveVessel.altitude <= Mathf.Abs(maxWaveInteractionShipAltitude))\n                    && (FlightGlobals.ActiveVessel.IsClearToSave() == ClearToSaveStatus.CLEAR) && (FlightGlobals.ActiveVessel.situation == Vessel.Situations.SPLASHED)\n                    && (FlightGlobals.ActiveVessel.srf_velocity.sqrMagnitude < Scatterer.Instance.mainSettings.waterMaxRecoveryVelocity * Scatterer.Instance.mainSettings.waterMaxRecoveryVelocity))\n                {\n                    FlightGlobals.ActiveVessel.srf_velocity = Vector3d.zero;\n\n                    if (!altimeterRecoveryButton.led.IsOn || (altimeterRecoveryButton.led.color != KSP.UI.Screens.LED.colorIndices.green))\n                    {\n                        recoveryButtonSetUnlockMethod.Invoke(altimeterRecoveryButton, setUnlockParametersArray);\n                        altimeterRecoveryButton.StopAllCoroutines();\n                        altimeterRecoveryButtonOverriden = true;\n                    }\n                }\n                else if (altimeterRecoveryButtonOverriden)\n                {\n                    altimeterRecoveryButton.StartCoroutine(\"UnlockRecovery\", FlightGlobals.ActiveVessel);\n                    altimeterRecoveryButton.StartCoroutine(\"UnlockReturnToKSC\", FlightGlobals.ActiveVessel);\n                    altimeterRecoveryButtonOverriden = false;\n                }\n            }\n        }\n\n        void BuildPartsPositionsList(List<Vector2> positionsList, List<PartBuoyancy> partsBuoyanciesList, Vector3 ux, Vector3 uy, Vector3 offsetVector3)\n\t\t{\n\t\t\tforeach (Vessel vessel in FlightGlobals.VesselsLoaded)\n\t\t\t{\n\t\t\t\tif (vessel.altitude <= Mathf.Abs(maxWaveInteractionShipAltitude))\n\t\t\t\t{\n\t\t\t\t\tforeach (Part part in vessel.parts)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (part.partBuoyancy)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t//To be more accurate I'd need to take ceter of buoyancy and transform it to worldPos but that would add a matrix multiply for every part, which I'm not about to do\n\t\t\t\t\t\t\tVector3 relativePartPos = part.transform.position - Scatterer.Instance.nearCamera.transform.position;\n\t\t\t\t\t\t\tVector2 oceanPos = new Vector2(Vector3.Dot(relativePartPos, ux) + offsetVector3.x, Vector3.Dot(relativePartPos, uy) + offsetVector3.y);\n\t\t\t\t\t\t\tpositionsList.Add(oceanPos);\n\t\t\t\t\t\t\tpartsBuoyanciesList.Add(part.partBuoyancy);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tvoid AddCameraPosition(List<Vector2> positionsList, double cameraHeight, Vector2 cameraOceanPosition)\n\t\t{\n\t\t\tif (cameraHeight <= Mathf.Abs(maxWaveInteractionShipAltitude))\n\t\t\t{\n\t\t\t\tpositionsList.Add(cameraOceanPosition);\n\t\t\t\tcameraHeightRequested = true;\n\t\t\t}\n\t\t}\n\n\t\tfloat ApplyWaterLevelHeights(float waterHeightAtCameraPosition)\n\t\t{\n\t\t\t//partBuoyancy has no way to override the force direction (it uses -g direction directly) however, maybe do a parent addforce at position with the buoyancy effective position with the normal? will always be hacky probably\n\n\t\t\tif (cameraHeightRequested)\n\t\t\t{\n\t\t\t\twaterHeightAtCameraPosition = heights[heights.Length - 1];\n\t\t\t}\n\n\t\t\tif (partsBuoyancies!=null)\n\t\t\t{\n\t\t\t\tfor (int i = 0; i < partsBuoyancies.Count; i++)\n\t\t\t\t{\n\t\t\t\t\tif (partsBuoyancies[i] != null)\n\t\t\t\t\t{\n\t\t\t\t\t\tpartsBuoyancies[i].waterLevel = heights[i];\n\n\t\t\t\t\t\tif (Scatterer.Instance.mainSettings.oceanCraftWaveInteractionsOverrideDrag)\n\t\t\t\t\t\t{ \n\t\t\t\t\t\t\tpartsBuoyancies[i].wasSplashed = true;\t\t\t// changing these is also need so the game doesn't apply excessive drag on splashes which makes seaplanes unusable\n\t\t\t\t\t\t\tpartsBuoyancies[i].splashed = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpartsBuoyancies.Clear();\n\t\t\tcameraHeightRequested = false;\n\n\t\t\treturn waterHeightAtCameraPosition;\n\t\t}\n\n\t\tvoid RequestAsyncWaterLevelHeights(List<Vector2> positionsList)\n\t\t{\n\t\t\tint size = positionsList.Count;\n\t\t\tif (size > 0)\n\t\t\t{\n\t\t\t\tpositionsBuffer = new ComputeBuffer(size, 2 * sizeof(float));\n\t\t\t\tpositionsBuffer.SetData(positionsList);\n\t\t\t\tfindHeightsShader.SetBuffer(0, \"positions\", positionsBuffer);\n\t\t\t\theightsBuffer = new ComputeBuffer(size, sizeof(float));\n\t\t\t\tfindHeightsShader.SetBuffer(0, \"result\", heightsBuffer);\n\n\t\t\t\tfindHeightsShader.Dispatch(0, size, 1, 1); //worry about figuring out threads and groups later\n\n\t\t\t\tAsyncGPUReadback.Request(heightsBuffer, OnCompletePartHeightsReadback);\n\t\t\t\tframeLatencyCounter = 1;\n\t\t\t\theightsRequestInProgress = true;\n\t\t\t}\n\t\t}\n\n\t\tvoid OnCompletePartHeightsReadback(AsyncGPUReadbackRequest request)\n\t\t{\n\t\t\tif (request.hasError)\n\t\t\t{\n\t\t\t\tUtils.LogError(\"GPU readback error detected.\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\theights = request.GetData<float>().ToArray();\n\t\t\theightsRequestInProgress = false;\n\n\t\t\tpositionsBuffer.Dispose();\n\t\t\theightsBuffer.Dispose();\n\t\t}\n\n\t\tpublic void ForcePauseMenuSaving()\n\t\t{\n\t\t\tif (!paused && FlightGlobals.ActiveVessel != null && (FlightGlobals.ActiveVessel.altitude <= Mathf.Abs(maxWaveInteractionShipAltitude))\n\t\t\t\t&& (FlightGlobals.ActiveVessel.IsClearToSave() == ClearToSaveStatus.CLEAR) && (FlightGlobals.ActiveVessel.situation == Vessel.Situations.SPLASHED)\n\t\t\t\t&& (FlightGlobals.ActiveVessel.srf_velocity.sqrMagnitude < Scatterer.Instance.mainSettings.waterMaxRecoveryVelocity * Scatterer.Instance.mainSettings.waterMaxRecoveryVelocity))\n\t\t\t{\n\t\t\t\tUtils.LogInfo(\"Overriding pause menu recovery and save options\");\n\t\t\t\tpaused = true;\n\t\t\t\tFlightGlobals.ActiveVessel.srf_velocity = Vector3d.zero;\n\n\t\t\t\tPauseMenu.Display();\n\t\t\t}\n\t\t}\n\n\t\tpublic void UnPause()\n\t\t{\n\t\t\tpaused = false;\n\t\t}\n\n\t\tpublic void Cleanup()\n        {\n\t\t\tGameEvents.onGamePause.Remove(ForcePauseMenuSaving);\n\t\t\tGameEvents.onGameUnpause.Remove(UnPause);\n\t\t}\n\t}\n}\n\n"
  },
  {
    "path": "scatterer/Effects/Proland/Ocean/OceanCameraUpdateHook.cs",
    "content": "using UnityEngine;\r\nusing System;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class OceanCameraUpdateHook : MonoBehaviour\r\n\t{\r\n\t\tpublic OceanNode oceanNode;\r\n\r\n\t\tMatrix4x4 cameraToScreen,screenToCamera;\r\n\t\tMatrix4x4d m_oldlocalToOcean = Matrix4x4d.Identity ();\r\n\r\n\t\t// Whenever any camera will render us, call the method which updates the material with the right params\r\n\t\tpublic void OnWillRenderObject()\r\n\t\t{\r\n\t\t\tCamera cam = Camera.current;\r\n\t\t\tif (!cam || MapView.MapIsEnabled || !oceanNode.prolandManager.skyNode.simulateOceanInteraction)\r\n\t\t\t\treturn;\r\n\r\n\t\t\tupdateCameraSpecificUniforms (oceanNode.m_oceanMaterial, cam);\r\n\r\n\t\t\tif (Scatterer.Instance.mainSettings.oceanTransparencyAndRefractions && (cam == Scatterer.Instance.farCamera || cam == Scatterer.Instance.nearCamera))\r\n\t\t\t{\r\n\t\t\t\tif (Scatterer.Instance.unifiedCameraMode)\r\n\t\t\t\t{\r\n\t\t\t\t\toceanNode.m_oceanMaterial.EnableKeyword(\"REFRACTIONS_AND_TRANSPARENCY_ON\");\r\n\t\t\t\t\toceanNode.m_oceanMaterial.DisableKeyword(\"REFRACTIONS_AND_TRANSPARENCY_MERGED_DEPTH\");\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\toceanNode.m_oceanMaterial.EnableKeyword(\"REFRACTIONS_AND_TRANSPARENCY_MERGED_DEPTH\");\r\n\t\t\t\t\toceanNode.m_oceanMaterial.DisableKeyword(\"REFRACTIONS_AND_TRANSPARENCY_ON\");\r\n\t\t\t\t}\r\n\t\t\t\toceanNode.m_oceanMaterial.DisableKeyword(\"REFRACTIONS_AND_TRANSPARENCY_OFF\");\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\toceanNode.m_oceanMaterial.EnableKeyword(\"REFRACTIONS_AND_TRANSPARENCY_OFF\");\r\n\t\t\t\toceanNode.m_oceanMaterial.DisableKeyword(\"REFRACTIONS_AND_TRANSPARENCY_ON\");\r\n\t\t\t\toceanNode.m_oceanMaterial.DisableKeyword(\"REFRACTIONS_AND_TRANSPARENCY_MERGED_DEPTH\");\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void updateCameraSpecificUniforms (Material oceanMaterial, Camera inCamera)\r\n\t\t{\r\n\t\t\tcameraToScreen = GL.GetGPUProjectionMatrix (inCamera.projectionMatrix, false);\r\n\t\t\tscreenToCamera = cameraToScreen.inverse;\r\n\t\t\t\r\n\t\t\toceanNode.m_oceanMaterial.SetMatrix (ShaderProperties._Globals_CameraToScreen_PROPERTY, cameraToScreen);\r\n\t\t\toceanNode.m_oceanMaterial.SetMatrix (ShaderProperties._Globals_ScreenToCamera_PROPERTY, screenToCamera);\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t//Calculates the required data for the projected grid\r\n\t\t\t\r\n\t\t\t// compute ltoo = localToOcean transform, where ocean frame = tangent space at\r\n\t\t\t// camera projection on sphere radius in local space\r\n\t\t\t\r\n\t\t\t//move these to dedicated projected grid class?\r\n\t\t\t\r\n\t\t\tMatrix4x4 ctol1 = inCamera.cameraToWorldMatrix;\r\n\t\t\t\r\n\t\t\tMatrix4x4d cameraToWorld = new Matrix4x4d (ctol1.m00, ctol1.m01, ctol1.m02, ctol1.m03,\r\n\t\t\t                                           ctol1.m10, ctol1.m11, ctol1.m12, ctol1.m13,\r\n\t\t\t                                           ctol1.m20, ctol1.m21, ctol1.m22, ctol1.m23,\r\n\t\t\t                                           ctol1.m30, ctol1.m31, ctol1.m32, ctol1.m33);\r\n\r\n\t\t\tVector3d translation;\r\n\r\n\t\t\tif (HighLogic.LoadedScene == GameScenes.SPACECENTER)\r\n\t\t\t{\r\n\t\t\t\ttranslation = oceanNode.prolandManager.parentLocalTransform.position;\t//have to use this in space center or get the tsunami bug\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\ttranslation = oceanNode.prolandManager.parentCelestialBody.position;\t\t//more precise, especially with RSS, but breaks a bit in KSC\r\n\t\t\t}\r\n\r\n\t\t\tMatrix4x4d worldToLocal = new Matrix4x4d(1, 0, 0, -translation.x,\r\n\t\t\t                                         0, 1, 0, -translation.y,\r\n\t\t\t                                         0, 0, 1, -translation.z,\r\n\t\t\t                                         0, 0, 0, 1);\r\n\t\t\t\r\n\t\t\tMatrix4x4d camToLocal = worldToLocal * cameraToWorld;\r\n\t\t\tMatrix4x4d localToCam = camToLocal.Inverse ();\r\n\t\t\t\r\n\t\t\t// camera in local space relative to planet's origin\r\n\t\t\tVector3d2 cl = new Vector3d2 ();\r\n\t\t\tcl = camToLocal * Vector3d2.Zero ();\r\n\t\t\t\r\n\t\t\tdouble radius = oceanNode.prolandManager.GetRadius ();\r\n\t\t\t\r\n\t\t\toceanNode.uz = cl.Normalized (); // unit z vector of ocean frame, in local space\r\n\t\t\t\r\n\t\t\tif (m_oldlocalToOcean != Matrix4x4d.Identity ())\r\n\t\t\t{\r\n\t\t\t\toceanNode.ux = (new Vector3d2 (m_oldlocalToOcean.m [1, 0], m_oldlocalToOcean.m [1, 1], m_oldlocalToOcean.m [1, 2])).Cross (oceanNode.uz).Normalized ();\r\n\t\t\t}\r\n\t\t\telse \r\n\t\t\t{\r\n\t\t\t\toceanNode.ux = Vector3d2.UnitZ ().Cross (oceanNode.uz).Normalized ();\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\toceanNode.uy = oceanNode.uz.Cross (oceanNode.ux); // unit y vector\r\n\r\n\t\t\t//Wind moves in -Ux direction, which by default points north for some reason, can rotate it to any desired direction this way\r\n\r\n\t\t\toceanNode.oo = oceanNode.uz * (radius); // origin of ocean frame, in local space\r\n\t\t\t\r\n\t\t\t//local to ocean transform\r\n\t\t\t//computed from oo and ux, uy, uz should be correct\r\n\t\t\tMatrix4x4d localToOcean = new Matrix4x4d (\r\n\t\t\t\toceanNode.ux.x, oceanNode.ux.y, oceanNode.ux.z, -oceanNode.ux.Dot (oceanNode.oo),\r\n\t\t\t\toceanNode.uy.x, oceanNode.uy.y, oceanNode.uy.z, -oceanNode.uy.Dot (oceanNode.oo),\r\n\t\t\t\toceanNode.uz.x, oceanNode.uz.y, oceanNode.uz.z, -oceanNode.uz.Dot (oceanNode.oo),\r\n\t\t\t\t0.0, 0.0, 0.0, 1.0);\r\n\t\t\t\r\n\t\t\tMatrix4x4d cameraToOcean = localToOcean * camToLocal;\r\n\t\t\tMatrix4x4d worldToOcean = localToOcean * worldToLocal;\r\n\t\t\t\r\n\t\t\tVector3d2 delta = new Vector3d2 (0, 0, 0);\r\n\t\t\t\r\n\t\t\tif (m_oldlocalToOcean != Matrix4x4d.Identity ())\r\n\t\t\t{\r\n\t\t\t\tdelta = localToOcean * (m_oldlocalToOcean.Inverse () * Vector3d2.Zero ());\r\n\t\t\t\toceanNode.m_Offset += delta;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t//reset offset when bigger than 20000 to  avoid floating point issues when later casting the offset to float\r\n\t\t\tif (Mathf.Max (Mathf.Abs ((float)oceanNode.m_Offset.x), Mathf.Abs ((float)oceanNode.m_Offset.y)) > 20000f)\r\n\t\t\t{\r\n\t\t\t\toceanNode.m_Offset.x=0.0;\r\n\t\t\t\toceanNode.m_Offset.y=0.0;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tm_oldlocalToOcean = localToOcean;\r\n\t\t\t\r\n\t\t\t//\t\t\tMatrix4x4d ctos = ModifiedProjectionMatrix (inCamera); //moved to command buffer\r\n\t\t\t//\t\t\tMatrix4x4d stoc = ctos.Inverse ();\r\n\t\t\t\r\n\t\t\tVector3d2 oc = cameraToOcean * Vector3d2.Zero ();\r\n\t\t\toceanNode.height = oc.z;\t\t\t\t\t\r\n\t\t\t\r\n\t\t\toceanNode.offset = new Vector3d2 (-oceanNode.m_Offset.x, -oceanNode.m_Offset.y, oceanNode.height);\r\n\t\t\t\r\n\t\t\t//old horizon code\r\n\t\t\t//This breaks down when you tilt the camera by 90 degrees in any direction\r\n\t\t\t//I made some new horizon code down, scroll down\r\n\t\t\t\r\n\t\t\t//\t\t\tVector4d stoc_w = (stoc * Vector4d.UnitW ()).XYZ0 ();\r\n\t\t\t//\t\t\tVector4d stoc_x = (stoc * Vector4d.UnitX ()).XYZ0 ();\r\n\t\t\t//\t\t\tVector4d stoc_y = (stoc * Vector4d.UnitY ()).XYZ0 ();\r\n\t\t\t//\t\t\t\r\n\t\t\t//\t\t\tVector3d2 A0 = (cameraToOcean * stoc_w).XYZ ();  \r\n\t\t\t//\t\t\tVector3d2 dA = (cameraToOcean * stoc_x).XYZ ();\r\n\t\t\t//\t\t\tVector3d2 B = (cameraToOcean * stoc_y).XYZ ();\r\n\t\t\t//\r\n\t\t\t//\t\t\tVector3d2 horizon1, horizon2;\r\n\t\t\t//\r\n\t\t\t//\t\t\tdouble h1 = h * (h + 2.0 * radius);\r\n\t\t\t//\t\t\tdouble h2 = (h + radius) * (h + radius);\r\n\t\t\t//\t\t\tdouble alpha = B.Dot (B) * h1 - B.z * B.z * h2;\r\n\t\t\t//\r\n\t\t\t//\t\t\tdouble beta0 = (A0.Dot (B) * h1 - B.z * A0.z * h2) / alpha;\r\n\t\t\t//\t\t\tdouble beta1 = (dA.Dot (B) * h1 - B.z * dA.z * h2) / alpha;\r\n\t\t\t//\t\t\t\r\n\t\t\t//\t\t\tdouble gamma0 = (A0.Dot (A0) * h1 - A0.z * A0.z * h2) / alpha;\r\n\t\t\t//\t\t\tdouble gamma1 = (A0.Dot (dA) * h1 - A0.z * dA.z * h2) / alpha;\r\n\t\t\t//\t\t\tdouble gamma2 = (dA.Dot (dA) * h1 - dA.z * dA.z * h2) / alpha;\r\n\t\t\t//\t\t\t\r\n\t\t\t//\t\t\thorizon1 = new Vector3d2 (-beta0, -beta1, 0.0);\r\n\t\t\t//\t\t\thorizon2 = new Vector3d2 (beta0 * beta0 - gamma0, 2.0 * (beta0 * beta1 - gamma1), beta1 * beta1 - gamma2);\r\n\t\t\t\r\n\t\t\tVector3d2 sunDir = new Vector3d2 (oceanNode.prolandManager.getDirectionToMainSun ());\r\n\t\t\tVector3d2 oceanSunDir = localToOcean.ToMatrix3x3d () * sunDir;\r\n\t\t\t\r\n\t\t\toceanMaterial.SetMatrix (ShaderProperties._Globals_CameraToWorld_PROPERTY, cameraToWorld .ToMatrix4x4());\r\n\t\t\t\r\n\t\t\toceanMaterial.SetVector (ShaderProperties._Ocean_SunDir_PROPERTY, oceanSunDir.ToVector3 ());\r\n\t\t\t\r\n\t\t\toceanMaterial.SetMatrix (ShaderProperties._Ocean_CameraToOcean_PROPERTY, cameraToOcean.ToMatrix4x4 ());\r\n\t\t\toceanMaterial.SetMatrix (ShaderProperties._Ocean_OceanToCamera_PROPERTY, cameraToOcean.Inverse ().ToMatrix4x4 ());\r\n\t\t\t\r\n\t\t\t//\t\t\toceanMaterial.SetMatrix (ShaderProperties._Globals_CameraToScreen_PROPERTY, ctos.ToMatrix4x4 ());\r\n\t\t\t//\t\t\toceanMaterial.SetMatrix (ShaderProperties._Globals_ScreenToCamera_PROPERTY, stoc.ToMatrix4x4 ());\r\n\t\t\t\r\n\t\t\toceanMaterial.SetMatrix (ShaderProperties._Globals_WorldToOcean_PROPERTY, worldToOcean.ToMatrix4x4 ());\r\n\t\t\toceanMaterial.SetMatrix (ShaderProperties._Globals_OceanToWorld_PROPERTY, worldToOcean.Inverse ().ToMatrix4x4 ());\r\n\t\t\t\r\n\t\t\toceanMaterial.SetVector (ShaderProperties._Ocean_CameraPos_PROPERTY, oceanNode.offset.ToVector3 ());\r\n\t\t\t\r\n\t\t\t//horizon calculations\r\n\t\t\t//these are used to find where the horizon line is on screen\r\n\t\t\t//and \"clamp\" vertexes that are above it back to it\r\n\t\t\t//as the grid is projected on the whole screen, vertexes over the horizon need to be dealt with\r\n\t\t\t//simply passing a flag to drop fragments or moving these vertexes offscreen will cause issues\r\n\t\t\t//as the horizon line can be between two vertexes and the horizon line will appear \"pixelated\"\r\n\t\t\t//as whole chunks go missing\r\n\t\t\t\r\n\t\t\t//these need to be done here\r\n\t\t\t//1)for double precision\r\n\t\t\t//2)for speed\r\n\t\t\t\r\n\t\t\tVector3d2 sphereDir=localToCam * Vector3d2.Zero ();  //vector to center of planet\t\t\t\r\n\t\t\tdouble OHL = sphereDir.Magnitude ();         \t\t //distance to center of planet\r\n\t\t\tsphereDir = sphereDir.Normalized ();\t\t \t\t //direction to center of planet\r\n\t\t\t\r\n\t\t\tdouble rHorizon = Math.Sqrt(OHL * OHL - radius * radius);  //distance to the horizon, i.e distance to ocean sphere tangent\r\n\t\t\t\r\n\t\t\t//Theta=angle to horizon, now all that is left to do is check the viewdir against this angle in the shader\r\n\t\t\tdouble cosTheta= rHorizon / (OHL); \r\n\t\t\tdouble sinTheta= Math.Sqrt (1- cosTheta*cosTheta);\r\n\t\t\t\r\n\t\t\toceanMaterial.SetVector (ShaderProperties.sphereDir_PROPERTY, sphereDir.ToVector3 ());\r\n\t\t\toceanMaterial.SetFloat (ShaderProperties.cosTheta_PROPERTY, (float) cosTheta);\r\n\t\t\toceanMaterial.SetFloat (ShaderProperties.sinTheta_PROPERTY, (float) sinTheta);\r\n\r\n\t\t\t//planetshine properties\r\n\t\t\tif ((oceanNode.prolandManager.secondarySuns.Count > 0) || Scatterer.Instance.mainSettings.usePlanetShine)\r\n\t\t\t{\r\n\t\t\t\tMatrix4x4 planetShineSourcesMatrix=oceanNode.prolandManager.planetShineSourcesMatrix;\r\n\t\t\t\t\r\n\t\t\t\tVector3d2 oceanSunDir2;\r\n\t\t\t\tfor (int i=0;i<4;i++)\r\n\t\t\t\t{\r\n\t\t\t\t\tVector4 row = planetShineSourcesMatrix.GetRow(i);\r\n\t\t\t\t\tif (row.w != 0f)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\toceanSunDir2=localToOcean.ToMatrix3x3d () * new Vector3d2(row.x,row.y,row.z);\r\n\t\t\t\t\t\tplanetShineSourcesMatrix.SetRow(i,new Vector4((float)oceanSunDir2.x,(float)oceanSunDir2.y,(float)oceanSunDir2.z,row.w));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\toceanMaterial.SetMatrix (ShaderProperties.planetShineSources_PROPERTY, planetShineSourcesMatrix);\r\n\t\t\t\toceanMaterial.SetMatrix (ShaderProperties.planetShineRGB_PROPERTY, oceanNode.prolandManager.planetShineRGBMatrix);\r\n\t\t\t}\r\n\r\n\t\t\tMatrix4x4 worldToLightMatrix = oceanNode.prolandManager.mainSunLight.transform.worldToLocalMatrix;\r\n\t\t\tif (oceanNode.prolandManager.parentCelestialBody.transform.position.sqrMagnitude < oceanNode.prolandManager.mainSunLight.transform.position.sqrMagnitude)\r\n\t\t\t{\r\n\t\t\t\tworldToLightMatrix.m03 = oceanNode.prolandManager.parentCelestialBody.transform.position.x;\r\n\t\t\t\tworldToLightMatrix.m13 = oceanNode.prolandManager.parentCelestialBody.transform.position.y;\r\n\t\t\t\tworldToLightMatrix.m23 = oceanNode.prolandManager.parentCelestialBody.transform.position.z;\r\n\t\t\t}\r\n\r\n\t\t\tif (oceanNode.causticsShadowMaskModulator)\r\n\t\t\t{\r\n\t\t\t\toceanNode.causticsShadowMaskModulator.CausticsShadowMaskModulateMaterial.SetMatrix (ShaderProperties.CameraToWorld_PROPERTY, inCamera.cameraToWorldMatrix);\r\n\t\t\t\toceanNode.causticsShadowMaskModulator.CausticsShadowMaskModulateMaterial.SetMatrix (ShaderProperties.WorldToLight_PROPERTY, worldToLightMatrix);\r\n\t\t\t\toceanNode.causticsShadowMaskModulator.CausticsShadowMaskModulateMaterial.SetVector (ShaderProperties.PlanetOrigin_PROPERTY, oceanNode.prolandManager.parentLocalTransform.position);\r\n\t\t\t}\r\n\r\n\t\t\tif (oceanNode.causticsLightRaysRenderer)\r\n\t\t\t{\r\n\t\t\t\toceanNode.causticsLightRaysRenderer.CausticsLightRaysMaterial.SetMatrix (ShaderProperties.CameraToWorld_PROPERTY, inCamera.cameraToWorldMatrix);\r\n\t\t\t\toceanNode.causticsLightRaysRenderer.CausticsLightRaysMaterial.SetMatrix (ShaderProperties.WorldToLight_PROPERTY, worldToLightMatrix);\r\n\t\t\t\toceanNode.causticsLightRaysRenderer.CausticsLightRaysMaterial.SetVector (ShaderProperties.LightDir_PROPERTY, oceanNode.prolandManager.mainSunLight.transform.forward);\r\n\t\t\t\toceanNode.causticsLightRaysRenderer.CausticsLightRaysMaterial.SetVector (ShaderProperties.PlanetOrigin_PROPERTY, oceanNode.prolandManager.parentLocalTransform.position);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void OnDestroy()\r\n\t\t{\r\n\t\t}\r\n\t}\r\n}"
  },
  {
    "path": "scatterer/Effects/Proland/Ocean/OceanFFTcpu.cs",
    "content": "/*\r\n * Proland: a procedural landscape rendering library.\r\n * Copyright (c) 2008-2011 INRIA\r\n *\r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n *\r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n *\r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n *\r\n * Proland is distributed under a dual-license scheme.\r\n * You can obtain a specific license from Inria: proland-licensing@inria.fr.\r\n *\r\n * Authors: Eric Bruneton, Antoine Begault, Guillaume Piolat.\r\n * Modified and ported to Unity by Justin Hawkins 2014\r\n * \r\n * \r\n */\r\n\r\n\r\nusing UnityEngine;\r\nusing System;\r\nusing System.Collections;\r\nusing System.Threading;\r\n\r\n\r\n\r\nnamespace Scatterer {\r\n\t/*\r\n\t * Unused CPU FFT version, ship interaction is better done with async GPU readback so this CPU version is not needed. Kept for reference\r\n\t * Extend the base class OceanNode to provide the data need \r\n\t * to create the waves using fourier transform which can then be applied\r\n\t * to the projected grid handled by the OceanNode.\r\n\t * All the fourier transforms are performed on the CPU\r\n\t */\r\n\tpublic class OceanFFTcpu: OceanNode {\r\n\t\t\r\n\t\tWriteFloat m_writeFloat;\r\n\t\tVector2 m_varianceMax;\r\n\r\n\t\tpublic float WAVE_CM = 0.23f; // Eq 59\r\n\t\tpublic float WAVE_KM = 370.0f; // Eq 59\r\n\r\n\t\t[Persistent] public float AMP = 1.0f;\r\n\t\t\r\n\t\tMaterial m_initSpectrumMat;\r\n\t\t\r\n\t\tMaterial m_initDisplacementMat;\r\n\r\n\t\t\r\n\t\tpublic int m_ansio = 2;\r\n\t\t\r\n\r\n\t\t[Persistent] public float m_windSpeed = 5.0f;\t\t\t\t\t\t\t//A higher wind speed gives greater swell to the waves\r\n\t\t[Persistent] public float m_omega = 0.84f;\t\t\t\t\t\t\t\t//A lower number means the waves last longer and will build up larger waves\r\n\r\n\t\tpublic Vector4 m_gridSizes = new Vector4(5488, 392, 28, 2);\t\t\t\t//Size in meters (i.e. in spatial domain) of each grid\r\n\t\tpublic Vector4 m_choppyness = new Vector4(2.3f, 2.1f, 1.3f, 0.9f);\t\t//Strength of sideways displacement for each grid\r\n\t\tpublic int m_fourierGridSize = 64;\t\t\t\t\t\t\t\t\t\t//This is the fourier transform size, must pow2 number. Recommend no higher or lower than 64, 128 or 256.\r\n\r\n\t\t[Persistent] public int m_varianceSize = 4;\r\n\t\t\r\n\t\tfloat m_fsize;\r\n\t\tfloat m_maxSlopeVariance;\r\n\t\tprotected int m_idx = 0;\r\n\t\tprotected Vector4 m_spectrumOffset;\r\n\t\tprotected Vector4 m_inverseGridSizes;\r\n\t\t\r\n\t\tprotected RenderTexture m_spectrum01, m_spectrum23;\r\n\t\tprotected RenderTexture m_WTable;\r\n\t\t\r\n\t\tpublic bool rendertexturesCreated {\r\n\t\t\tget {\r\n\t\t\t\treturn (m_WTable.IsCreated());\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tRenderTexture[] m_fourierBuffer0, m_fourierBuffer1, m_fourierBuffer2;\r\n\t\tRenderTexture[] m_fourierBuffer3, m_fourierBuffer4;\r\n\t\tpublic RenderTexture m_map0, m_map1, m_map2, m_map3, m_map4;\r\n\t\t\r\n\t\t\r\n\t\tpublic Texture3D variance {\r\n\t\t\tget {\r\n\t\t\t\treturn m_variance;\r\n\t\t\t}\r\n\t\t}\r\n\t\tTexture3D m_variance;\r\n\t\t\r\n\t\tprotected FourierGPU m_fourier;\r\n\t\t\r\n\t\tpublic override float GetMaxSlopeVariance() {\r\n\t\t\treturn m_maxSlopeVariance;\r\n\t\t}\r\n\r\n\r\n\t\t//CPU wave stuff\r\n\t\tfloat FFTtimer=0;\r\n\r\n\t\tvolatile int m_bufferIdx = 0;\r\n\t\tpublic volatile bool done0=true,done1=true,done2=true,done3=true,done4=true,done5=true;\r\n\t\tpublic volatile bool done=true;\r\n\r\n\t\tint m_passes;\r\n\t\tfloat[] m_butterflyLookupTable = null;\r\n\r\n\t\t\r\n\t\tVector4[,] m_fourierBuffer0vector;\r\n\t\tVector4[,] m_fourierBuffer1vector, m_fourierBuffer2vector,m_fourierBuffer3vector,m_fourierBuffer4vector;\r\n\r\n\t\tVector4[] m_spectrum01vector, m_spectrum23vector, m_WTablevector;\r\n\r\n//\t\tvolatile Vector4[,] m_fourierBuffer0vectorResults, m_fourierBuffer3vectorResults,m_fourierBuffer4vectorResults;\r\n\t\tVector4[,] m_fourierBuffer0vectorResults, m_fourierBuffer3vectorResults,m_fourierBuffer4vectorResults;\r\n\r\n\t\tprotected FourierCPU m_CPUfourier;\r\n\r\n\r\n\t\tpublic override void Init(ProlandManager manager)\r\n\t\t{\r\n\t\t\tbase.Init(manager);\r\n\t\t\r\n\t\t\tm_initSpectrumMat = new Material(ShaderReplacer.Instance.LoadedShaders[ (\"Proland/Ocean/InitSpectrum\")]);\r\n\t\t\tm_initDisplacementMat = new Material(ShaderReplacer.Instance.LoadedShaders[ (\"Proland/Ocean/InitDisplacement\")]);\r\n\r\n\t\t\tm_fourierGridSize = Scatterer.Instance.mainSettings.m_fourierGridSize;\r\n\t\t\t\r\n\t\t\tif (m_fourierGridSize > 256) {\r\n\t\t\t\tUtils.LogDebug(\"Proland::OceanFFTcpu::Start\t- fourier grid size must not be greater than 256, changing to 256\");\r\n\t\t\t\tm_fourierGridSize = 256;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif (!Mathf.IsPowerOfTwo(m_fourierGridSize)) {\r\n\t\t\t\tUtils.LogDebug(\"Proland::OceanFFTcpu::Start\t- fourier grid size must be pow2 number, changing to nearest pow2 number\");\r\n\t\t\t\tm_fourierGridSize = Mathf.NextPowerOfTwo(m_fourierGridSize);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tm_fsize = (float) m_fourierGridSize;\r\n\t\t\tm_spectrumOffset = new Vector4(1.0f + 0.5f / m_fsize, 1.0f + 0.5f / m_fsize, 0, 0);\r\n\t\t\t\r\n\t\t\t\r\n\t\t\tfloat factor = 2.0f * Mathf.PI * m_fsize;\r\n\t\t\tm_inverseGridSizes = new Vector4(factor / m_gridSizes.x, factor / m_gridSizes.y, factor / m_gridSizes.z, factor / m_gridSizes.w);\r\n\t\t\t\r\n\t\t\t\r\n\t\t\tm_fourier = new FourierGPU(m_fourierGridSize);\r\n\t\t\t\r\n\t\t\tm_writeFloat = new WriteFloat(m_fourierGridSize, m_fourierGridSize);\r\n\r\n\r\n//#if CPUmode\r\n\t\t\tif (Scatterer.Instance.mainSettings.oceanCraftWaveInteractions)\r\n\t\t\t{\r\n\t\t\t\tm_CPUfourier = new FourierCPU (m_fourierGridSize);\r\n\t\t\t\t\r\n\t\t\t\tm_passes = (int)(Mathf.Log (m_fsize) / Mathf.Log (2.0f));\r\n\t\t\t\tComputeButterflyLookupTable ();\r\n\t\t\t\t\r\n\t\t\t\tm_CPUfourier.m_butterflyLookupTable = m_butterflyLookupTable;\r\n\t\t\t\t\r\n\t\t\t\tm_fourierBuffer0vector = new Vector4[2, m_fourierGridSize * m_fourierGridSize];\r\n\t\t\t\tm_fourierBuffer0vectorResults = new Vector4[2, m_fourierGridSize * m_fourierGridSize];\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\tm_fourierBuffer1vector = new Vector4[2, m_fourierGridSize * m_fourierGridSize];\r\n\t\t\t\tm_fourierBuffer2vector = new Vector4[2, m_fourierGridSize * m_fourierGridSize];\r\n\t\t\t\t\r\n\t\t\t\tm_fourierBuffer3vector = new Vector4[2, m_fourierGridSize * m_fourierGridSize];\r\n\t\t\t\tm_fourierBuffer4vector = new Vector4[2, m_fourierGridSize * m_fourierGridSize];\r\n\t\t\t\tm_fourierBuffer3vectorResults = new Vector4[2, m_fourierGridSize * m_fourierGridSize];\r\n\t\t\t\tm_fourierBuffer4vectorResults = new Vector4[2, m_fourierGridSize * m_fourierGridSize];\r\n\t\t\t}\r\n//#endif\t\t\t\r\n\r\n\r\n\t\t\t//Create the data needed to make the waves each frame\r\n\t\t\tCreateRenderTextures();\r\n\t\t\tGenerateWavesSpectrum();\r\n\t\t\tCreateWTable();\r\n\t\t\t\r\n\t\t\tm_initSpectrumMat.SetTexture (ShaderProperties._Spectrum01_PROPERTY, m_spectrum01);\r\n\t\t\tm_initSpectrumMat.SetTexture (ShaderProperties._Spectrum23_PROPERTY, m_spectrum23);\r\n\t\t\tm_initSpectrumMat.SetTexture (ShaderProperties._WTable_PROPERTY, m_WTable);\r\n\t\t\tm_initSpectrumMat.SetVector (ShaderProperties._Offset_PROPERTY, m_spectrumOffset);\r\n\t\t\tm_initSpectrumMat.SetVector (ShaderProperties._InverseGridSizes_PROPERTY, m_inverseGridSizes);\r\n\t\t\t\r\n\t\t\tm_initDisplacementMat.SetVector (ShaderProperties._InverseGridSizes_PROPERTY, m_inverseGridSizes);\r\n\r\n//#if CPUmode\r\n\t\t\tif (Scatterer.Instance.mainSettings.oceanCraftWaveInteractions)\r\n\t\t\t{\r\n\t\t\t\tCreateWTableForCPU ();\r\n\t\t\t}\r\n\t\t\t\r\n//#endif\r\n\t\t\t\r\n\t\t}\r\n\t\t\r\n\t\tVector2 GetSlopeVariances(Vector2 k, float A, float B, float C, float spectrumX, float spectrumY) {\r\n\t\t\tfloat w = 1.0f - Mathf.Exp(A * k.x * k.x + B * k.x * k.y + C * k.y * k.y);\r\n\t\t\treturn new Vector2((k.x * k.x) * w, (k.y * k.y) * w) * (spectrumX * spectrumX + spectrumY * spectrumY) * 2.0f;\r\n\t\t}\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// Iterate over the spectrum and find the variance.\r\n\t\t/// Use in the BRDF equations.\r\n\t\t/// </summary>\r\n\t\tVector2 ComputeVariance(float slopeVarianceDelta, float[] inSpectrum01, float[] inSpectrum23, float idxX, float idxY, float idxZ) {\r\n\t\t\tconst float SCALE = 10.0f;\r\n\t\t\t\r\n\t\t\tfloat A = Mathf.Pow(idxX / ((float) m_varianceSize - 1.0f), 4.0f) * SCALE;\r\n\t\t\tfloat C = Mathf.Pow(idxZ / ((float) m_varianceSize - 1.0f), 4.0f) * SCALE;\r\n\t\t\tfloat B = (2.0f * idxY / ((float) m_varianceSize - 1.0f) - 1.0f) * Mathf.Sqrt(A * C);\r\n\t\t\tA = -0.5f * A;\r\n\t\t\tB = -B;\r\n\t\t\tC = -0.5f * C;\r\n\t\t\t\r\n\t\t\tVector2 slopeVariances = new Vector2(slopeVarianceDelta, slopeVarianceDelta);\r\n\t\t\t\r\n\t\t\tfor (int x = 0; x < m_fourierGridSize; x++) {\r\n\t\t\t\tfor (int y = 0; y < m_fourierGridSize; y++) {\r\n\t\t\t\t\tint i = x >= m_fsize / 2.0f ? x - m_fourierGridSize : x;\r\n\t\t\t\t\tint j = y >= m_fsize / 2.0f ? y - m_fourierGridSize : y;\r\n\t\t\t\t\t\r\n\t\t\t\t\tVector2 k = new Vector2(i, j) * 2.0f * Mathf.PI;\r\n\t\t\t\t\t\r\n\t\t\t\t\tslopeVariances += GetSlopeVariances(k / m_gridSizes.x, A, B, C, inSpectrum01[(x + y * m_fourierGridSize) * 4 + 0], inSpectrum01[(x + y * m_fourierGridSize) * 4 + 1]);\r\n\t\t\t\t\tslopeVariances += GetSlopeVariances(k / m_gridSizes.y, A, B, C, inSpectrum01[(x + y * m_fourierGridSize) * 4 + 2], inSpectrum01[(x + y * m_fourierGridSize) * 4 + 3]);\r\n\t\t\t\t\tslopeVariances += GetSlopeVariances(k / m_gridSizes.z, A, B, C, inSpectrum23[(x + y * m_fourierGridSize) * 4 + 0], inSpectrum23[(x + y * m_fourierGridSize) * 4 + 1]);\r\n\t\t\t\t\tslopeVariances += GetSlopeVariances(k / m_gridSizes.w, A, B, C, inSpectrum23[(x + y * m_fourierGridSize) * 4 + 2], inSpectrum23[(x + y * m_fourierGridSize) * 4 + 3]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\treturn slopeVariances;\r\n\t\t}\r\n\t\t\r\n\t\t\r\n\t\t/*\r\n\t\t * Initializes the data to the shader that needs to \r\n\t\t * have the fourier transform applied to it this frame.\r\n\t\t */\r\n\t\tprotected virtual void InitWaveSpectrum(float t) {\r\n\t\t\t// init heights (0) and slopes (1,2)\r\n\t\t\tRenderTexture[] buffers012 = new RenderTexture[] {\r\n\t\t\t\tm_fourierBuffer0[1], m_fourierBuffer1[1], m_fourierBuffer2[1]\r\n\t\t\t};\r\n\t\t\tm_initSpectrumMat.SetFloat (ShaderProperties._T_PROPERTY, t);\r\n\t\t\t//\t\t\tRTUtility.MultiTargetBlit(buffers012, m_initSpectrumMat);\r\n\t\t\tRTUtility.MultiTargetBlit(buffers012, m_initSpectrumMat, 0);\r\n\t\t\t\r\n\t\t\t// Init displacement (3,4)\r\n\t\t\tRenderTexture[] buffers34 = new RenderTexture[] {\r\n\t\t\t\tm_fourierBuffer3[1], m_fourierBuffer4[1]\r\n\t\t\t};\r\n\t\t\tm_initDisplacementMat.SetTexture (ShaderProperties._Buffer1_PROPERTY, m_fourierBuffer1[1]);\r\n\t\t\tm_initDisplacementMat.SetTexture (ShaderProperties._Buffer2_PROPERTY, m_fourierBuffer2[1]);\r\n\t\t\t//\t\t\tRTUtility.MultiTargetBlit(buffers34, m_initDisplacementMat);\r\n\t\t\tRTUtility.MultiTargetBlit(buffers34, m_initDisplacementMat, 0);\r\n\t\t}\r\n\r\n\r\n\t\tvoid InitWaveSpectrumCPU(float time)\r\n\t\t{\r\n\t\t\tVector2 uv, st, k1, k2, k3, k4, h1, h2, h3, h4, h12, h34, n1, n2, n3, n4;\r\n\t\t\tVector4 s12, s34, s12c, s34c;\r\n\t\t\tint rx, ry;\r\n\t\t\t\r\n\t\t\t// init heights (0) and slopes (1,2)\r\n\t\t\tfor (int x = 0; x < m_fourierGridSize; x++)\r\n\t\t\t{\r\n\t\t\t\tfor (int y = 0; y < m_fourierGridSize; y++)\r\n\t\t\t\t{\r\n\t\t\t\t\tuv.x = x / m_fsize;\r\n\t\t\t\t\tuv.y = y / m_fsize;\r\n\t\t\t\t\t\r\n\t\t\t\t\tst.x = uv.x > 0.5f ? uv.x - 1.0f : uv.x;\r\n\t\t\t\t\tst.y = uv.y > 0.5f ? uv.y - 1.0f : uv.y;\r\n\t\t\t\t\t\r\n\t\t\t\t\trx = x;\r\n\t\t\t\t\try = y;\r\n\t\t\t\t\t\r\n\t\t\t\t\ts12 = m_spectrum01vector[rx + ry * m_fourierGridSize];\r\n\t\t\t\t\ts34 = m_spectrum23vector[rx + ry * m_fourierGridSize];\r\n\t\t\t\t\t\r\n\t\t\t\t\trx = (m_fourierGridSize - x) % m_fourierGridSize;\r\n\t\t\t\t\try = (m_fourierGridSize - y) % m_fourierGridSize;\r\n\t\t\t\t\t\r\n\t\t\t\t\ts12c = m_spectrum01vector[rx + ry * m_fourierGridSize];\r\n\t\t\t\t\ts34c = m_spectrum23vector[rx + ry * m_fourierGridSize];\r\n\t\t\t\t\t\r\n\t\t\t\t\tk1 = st * m_inverseGridSizes.x;\r\n\t\t\t\t\tk2 = st * m_inverseGridSizes.y;\r\n\t\t\t\t\tk3 = st * m_inverseGridSizes.z;\r\n\t\t\t\t\tk4 = st * m_inverseGridSizes.w;\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\th1 = GetSpectrum(time, m_WTablevector[x + y * m_fourierGridSize].x, s12.x, s12.y, s12c.x, s12c.y);\r\n\t\t\t\t\th2 = GetSpectrum(time, m_WTablevector[x + y * m_fourierGridSize].y, s12.z, s12.w, s12c.z, s12c.w);\r\n\t\t\t\t\th3 = GetSpectrum(time, m_WTablevector[x + y * m_fourierGridSize].z, s34.x, s34.y, s34c.x, s34c.y);\r\n\t\t\t\t\th4 = GetSpectrum(time, m_WTablevector[x + y * m_fourierGridSize].w, s34.z, s34.w, s34c.z, s34c.w);\r\n\t\t\t\t\t\r\n\t\t\t\t\t//heights\r\n\t\t\t\t\th12 = h1 + COMPLEX(h2);\r\n\t\t\t\t\th34 = h3 + COMPLEX(h4);\r\n\t\t\t\t\t\r\n\t\t\t\t\t//slopes (normals)\r\n\t\t\t\t\tn1 = COMPLEX(k1.x * h1) - k1.y * h1;\r\n\t\t\t\t\tn2 = COMPLEX(k2.x * h2) - k2.y * h2;\r\n\t\t\t\t\tn3 = COMPLEX(k3.x * h3) - k3.y * h3;\r\n\t\t\t\t\tn4 = COMPLEX(k4.x * h4) - k4.y * h4;\r\n\t\t\t\t\t\r\n\t\t\t\t\t//Heights in last two channels (h34) have been removed as I found they arent really need for the shader\r\n\t\t\t\t\t//h3 and h4 still needs to be calculated for the slope but they are no longer save and transformed by the fourier step\r\n\t\t\t\t\t//m_fourierBuffer0vector[1, x+y*m_fourierGridSize] = new Vector4(h12.x, h12.y, h34.x, h34.y); //I put this back\r\n\t\t\t\t\t\r\n\t\t\t\t\tint i = x + y * m_fourierGridSize;\r\n\t\t\t\t\t\r\n\t\t\t\t\t//                    m_fourierBuffer0vector[1, i] = h12;\r\n\t\t\t\t\tm_fourierBuffer0vector[1, i] = new Vector4(h12.x, h12.y, h34.x, h34.y);\r\n\t\t\t\t\tm_fourierBuffer1vector[1, i] = new Vector4(n1.x, n1.y, n2.x, n2.y);\r\n\t\t\t\t\tm_fourierBuffer2vector[1, i] = new Vector4(n3.x, n3.y, n4.x, n4.y);\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t// Init displacement (3,4)\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\tfloat K1 = (k1).magnitude;\r\n\t\t\t\t\tfloat K2 = (k2).magnitude;\r\n\t\t\t\t\tfloat K3 = (k3).magnitude;\r\n\t\t\t\t\tfloat K4 = (k4).magnitude;\r\n\t\t\t\t\t\r\n\t\t\t\t\tfloat IK1 = K1 == 0.0f ? 0.0f : 1.0f / K1;\r\n\t\t\t\t\tfloat IK2 = K2 == 0.0f ? 0.0f : 1.0f / K2;\r\n\t\t\t\t\tfloat IK3 = K3 == 0.0f ? 0.0f : 1.0f / K3;\r\n\t\t\t\t\tfloat IK4 = K4 == 0.0f ? 0.0f : 1.0f / K4;\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\tVector4 result = new Vector4(0f,0f,0f,0f);\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\tresult.x=m_fourierBuffer1vector[1,i].x * IK1;\r\n\t\t\t\t\tresult.y=m_fourierBuffer1vector[1,i].y * IK1;\r\n\t\t\t\t\tresult.z=m_fourierBuffer1vector[1,i].z * IK2;\r\n\t\t\t\t\tresult.w=m_fourierBuffer1vector[1,i].w * IK2;\r\n\t\t\t\t\t\r\n\t\t\t\t\tm_fourierBuffer3vector[1, i] = result;\r\n\t\t\t\t\t\r\n\t\t\t\t\tVector4 result2 = new Vector4(0f,0f,0f,0f);\r\n\t\t\t\t\tresult.x=m_fourierBuffer2vector[1,i].x * IK3;\r\n\t\t\t\t\tresult.y=m_fourierBuffer2vector[1,i].y * IK3;\r\n\t\t\t\t\tresult.z=m_fourierBuffer2vector[1,i].z * IK4;\r\n\t\t\t\t\tresult.w=m_fourierBuffer2vector[1,i].w * IK4;\r\n\t\t\t\t\t\r\n\t\t\t\t\tm_fourierBuffer4vector[1, i] = result2;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tpublic override void UpdateNode() {\r\n\t\t\t\r\n\t\t\t//\t\t\tif (!m_spectrum01.IsCreated()) {\r\n\t\t\t//\t\t\t\twaitBeforeReloadCnt++;\r\n\t\t\t//\t\t\t\tif (waitBeforeReloadCnt >= 2) {\r\n\t\t\t//\t\t\t\t\t\r\n\t\t\t//\t\t\t\t\tCreateRenderTextures();\r\n\t\t\t//\t\t\t\t\tGenerateWavesSpectrum();\r\n\t\t\t//\t\t\t\t\tCreateWTable();\r\n\t\t\t//\r\n\t\t\t//\t\t\t\t\tUtils.Log(\"Recreated OceanFFTcpu Data\");\r\n\t\t\t//\t\t\t\t\twaitBeforeReloadCnt = 0;\r\n\t\t\t//\t\t\t\t}\r\n\t\t\t//\t\t\t}\r\n\t\t\t//\r\n\t\t\t//\t\t\telse \r\n\t\t\t{\r\n\t\t\t\tfloat t;\r\n\t\t\t\tif (TimeWarp.CurrentRate > 4)\r\n\t\t\t\t{\r\n\t\t\t\t\tt = (float) Planetarium.GetUniversalTime();\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tt =\tTime.time;\r\n\t\t\t\t}\r\n\r\n//\t\t\t\tt =\tTime.realtimeSinceStartup;\r\n\r\n\t\t\t\tif (!MapView.MapIsEnabled)\r\n\t\t\t\t{\r\n\t\t\t\t\tInitWaveSpectrum(t);\r\n\t\t\t\t\r\n\t\t\t\t\t//Perform fourier transform and record what is the current index\r\n\t\t\t\t\tm_idx = m_fourier.PeformFFT(m_fourierBuffer0, m_fourierBuffer1, m_fourierBuffer2);\r\n\t\t\t\t\tm_fourier.PeformFFT(m_fourierBuffer3, m_fourierBuffer4);\r\n\r\n\t\t\t\t\tGraphics.Blit(m_fourierBuffer0[m_idx], m_map0);\r\n\t\t\t\t\tGraphics.Blit(m_fourierBuffer1[m_idx], m_map1);\r\n\t\t\t\t\tGraphics.Blit(m_fourierBuffer2[m_idx], m_map2);\r\n\t\t\t\t\tGraphics.Blit(m_fourierBuffer3[m_idx], m_map3);\r\n\t\t\t\t\tGraphics.Blit(m_fourierBuffer4[m_idx], m_map4);\r\n\r\n\t\t\t\t\tm_oceanMaterial.SetVector (ShaderProperties._Ocean_MapSize_PROPERTY, new Vector2(m_fsize, m_fsize));\r\n\t\t\t\t\tm_oceanMaterial.SetVector (ShaderProperties._Ocean_Choppyness_PROPERTY, m_choppyness);\r\n\t\t\t\t\tm_oceanMaterial.SetVector (ShaderProperties._Ocean_GridSizes_PROPERTY, m_gridSizes);\r\n\t\t\t\t\tm_oceanMaterial.SetFloat (ShaderProperties._Ocean_HeightOffset_PROPERTY, 0f);\r\n\t\t\t\t\tm_oceanMaterial.SetTexture (ShaderProperties._Ocean_Variance_PROPERTY, m_variance);\r\n\t\t\t\t\tm_oceanMaterial.SetTexture (ShaderProperties._Ocean_Map0_PROPERTY, m_map0);\r\n\t\t\t\t\tm_oceanMaterial.SetTexture (ShaderProperties._Ocean_Map1_PROPERTY, m_map1);\r\n\t\t\t\t\tm_oceanMaterial.SetTexture (ShaderProperties._Ocean_Map2_PROPERTY, m_map2);\r\n\t\t\t\t\tm_oceanMaterial.SetTexture (ShaderProperties._Ocean_Map3_PROPERTY, m_map3);\r\n\t\t\t\t\tm_oceanMaterial.SetTexture (ShaderProperties._Ocean_Map4_PROPERTY, m_map4);\r\n\t\t\t\t\tm_oceanMaterial.SetVector (ShaderProperties._VarianceMax_PROPERTY, m_varianceMax);\r\n\t\t\t\t}\r\n//#if CPUmode\r\n\r\n\t\t\t\tif (Scatterer.Instance.mainSettings.oceanCraftWaveInteractions)\r\n\t\t\t\t{\r\n\t\t\t\t\tif(!(done0&&done1&&done2&&done3&&done4&&done5))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tbase.UpdateNode();\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\tdone0 = false;\r\n\t\t\t\t\tdone1 = false;\r\n\t\t\t\t\tdone2 = false;\r\n\t\t\t\t\tdone3 = false;\r\n\t\t\t\t\tdone4 = false;\r\n\t\t\t\t\tdone5 = false;\r\n\r\n\t\t\t\t\tFFTtimer = Time.realtimeSinceStartup;\r\n\r\n\t\t\t\t\tNullable<float> time = t;\r\n\t\t\t\t\t\r\n\t\t\t\t\tThreadPool.QueueUserWorkItem(new WaitCallback(RunThreaded), time);\r\n\t\t\t\t\tCommitResults (ref m_fourierBuffer0vector, ref m_fourierBuffer0vectorResults);\r\n\t\t\t\t\tCommitResults (ref m_fourierBuffer3vector, ref m_fourierBuffer3vectorResults);\r\n\t\t\t\t\tCommitResults (ref m_fourierBuffer4vector, ref m_fourierBuffer4vectorResults);\r\n\t\t\t\t}\r\n\r\n//#endif\r\n\t\t\t\tbase.UpdateNode();\r\n\r\n\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t//Craft-wave interactions\r\n\t\t//Note: This version was a proof of concept, the final version is the GPU readback version in OceanFFTgpu, this is only kept here for reference\r\n\t\tpublic void FixedUpdate()\r\n\t\t{\r\n\t\t\tif (Scatterer.Instance.mainSettings.oceanCraftWaveInteractions)\r\n\t\t\t{\r\n\t\t\t\tforeach (Vessel vessel in FlightGlobals.VesselsLoaded)\r\n\t\t\t\t{\r\n\t\t\t\t\tforeach (Part part in vessel.parts)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif (part.partBuoyancy)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tVector3 relativePartPos = part.partBuoyancy.transform.position-Scatterer.Instance.nearCamera.transform.position;\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tfloat newheight= findHeight(new Vector3(Vector3.Dot(relativePartPos,ux.ToVector3())+offsetVector3.x,\r\n\t\t\t\t\t\t\t                                        Vector3.Dot(relativePartPos,uy.ToVector3())+offsetVector3.y,\r\n\t\t\t\t\t\t\t                                        0f),0.02f);\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tpart.partBuoyancy.waterLevel=newheight;\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tpart.partBuoyancy.wasSplashed=part.partBuoyancy.splashed;\r\n\t\t\t\t\t\t\tpart.partBuoyancy.slow=true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic override void OnDestroy()\r\n\t\t{\r\n\t\t\tbase.OnDestroy();\r\n\t\t\t\r\n\t\t\tm_map0.Release();\r\n\t\t\tm_map1.Release();\r\n\t\t\tm_map2.Release();\r\n\t\t\tm_map3.Release();\r\n\t\t\tm_map4.Release();\r\n\t\t\t\r\n\t\t\tm_spectrum01.Release();\r\n\t\t\tm_spectrum23.Release();\r\n\t\t\t\r\n\t\t\tm_WTable.Release();\r\n\t\t\t\r\n\t\t\tfor (int i = 0; i < 2; i++) {\r\n\t\t\t\tm_fourierBuffer0[i].Release();\r\n\t\t\t\tm_fourierBuffer1[i].Release();\r\n\t\t\t\tm_fourierBuffer2[i].Release();\r\n\t\t\t\tm_fourierBuffer3[i].Release();\r\n\t\t\t\tm_fourierBuffer4[i].Release();\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tprotected virtual void CreateRenderTextures() {\r\n\t\t\t\r\n\t\t\tRenderTextureFormat mapFormat = RenderTextureFormat.ARGBHalf;\r\n\t\t\tRenderTextureFormat format = RenderTextureFormat.ARGBHalf;\r\n\t\t\t\r\n\t\t\t//These texture hold the actual data use in the ocean renderer\r\n\t\t\tCreateMap(ref m_map0, mapFormat, m_ansio, true);\r\n\t\t\tCreateMap(ref m_map1, mapFormat, m_ansio, true);\r\n\t\t\tCreateMap(ref m_map2, mapFormat, m_ansio, true);\r\n\t\t\tCreateMap(ref m_map3, mapFormat, m_ansio, true);\r\n\t\t\tCreateMap(ref m_map4, mapFormat, m_ansio, true);\r\n\t\t\t\r\n\t\t\t//These textures are used to perform the fourier transform\r\n\t\t\tCreateBuffer(ref m_fourierBuffer0, format); //heights\r\n\t\t\tCreateBuffer(ref m_fourierBuffer1, format); // slopes X\r\n\t\t\tCreateBuffer(ref m_fourierBuffer2, format); // slopes Y\r\n\t\t\tCreateBuffer(ref m_fourierBuffer3, format); // displacement X\r\n\t\t\tCreateBuffer(ref m_fourierBuffer4, format); // displacement Y\r\n\t\t\t\r\n\t\t\t//These textures hold the specturm the fourier transform is performed on\r\n\t\t\tm_spectrum01 = new RenderTexture(m_fourierGridSize, m_fourierGridSize, 0, format);\r\n\t\t\tm_spectrum01.filterMode = FilterMode.Point;\r\n\t\t\tm_spectrum01.wrapMode = TextureWrapMode.Repeat;\r\n//\t\t\tm_spectrum01.enableRandomWrite = false;\r\n\t\t\tm_spectrum01.enableRandomWrite = false;\r\n\t\t\tm_spectrum01.Create();\r\n\t\t\t\r\n\t\t\tm_spectrum23 = new RenderTexture(m_fourierGridSize, m_fourierGridSize, 0, format);\r\n\t\t\tm_spectrum23.filterMode = FilterMode.Point;\r\n\t\t\tm_spectrum23.wrapMode = TextureWrapMode.Repeat;\r\n\t\t\tm_spectrum23.enableRandomWrite = false;\r\n\t\t\tm_spectrum23.Create();\r\n\t\t\t\r\n\r\n\t\t\tm_WTable = new RenderTexture(m_fourierGridSize, m_fourierGridSize, 0, format);\r\n\t\t\tm_WTable.filterMode = FilterMode.Point;\r\n\t\t\tm_WTable.wrapMode = TextureWrapMode.Clamp;\r\n\t\t\tm_WTable.enableRandomWrite = false;\r\n\t\t\tm_WTable.Create();\t\t\t\r\n\t\t\t\r\n\t\t\tm_variance = new Texture3D(m_varianceSize, m_varianceSize, m_varianceSize, TextureFormat.ARGB32, true);\r\n\t\t\t\r\n\t\t\tm_variance.wrapMode = TextureWrapMode.Clamp;\r\n\t\t\tm_variance.filterMode = FilterMode.Bilinear;\r\n\t\t\t\r\n\t\t}\r\n\t\t\r\n\t\tprotected void CreateBuffer(ref RenderTexture[] tex, RenderTextureFormat format) {\r\n\t\t\ttex = new RenderTexture[2];\r\n\t\t\t\r\n\t\t\tfor (int i = 0; i < 2; i++) {\r\n\t\t\t\ttex[i] = new RenderTexture(m_fourierGridSize, m_fourierGridSize, 0, format);\r\n\t\t\t\ttex[i].filterMode = FilterMode.Point;\r\n\t\t\t\ttex[i].wrapMode = TextureWrapMode.Clamp;\r\n\t\t\t\ttex[i].Create();\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tprotected void CreateMap(ref RenderTexture map, RenderTextureFormat format, int ansio, bool useMipMaps) {\r\n\t\t\tmap = new RenderTexture(m_fourierGridSize, m_fourierGridSize, 0, format);\r\n\t\t\tmap.filterMode = FilterMode.Trilinear;\r\n\t\t\tmap.wrapMode = TextureWrapMode.Repeat;\r\n\t\t\tmap.anisoLevel = ansio;\r\n//\t\t\tmap.useMipMap = true;\r\n\t\t\tmap.useMipMap = useMipMaps;\r\n\t\t\tmap.Create();\r\n\t\t}\r\n\t\t\r\n\t\tfloat sqr(float x) {\r\n\t\t\treturn x * x;\r\n\t\t}\r\n\t\t\r\n\t\tfloat omega(float k) {\r\n\t\t\treturn Mathf.Sqrt(9.81f * k * (1.0f + sqr(k / WAVE_KM)));\r\n\t\t} // Eq 24\r\n\t\t\r\n\t\tfloat Spectrum(float kx, float ky, bool omnispectrum) {\r\n\t\t\t//I know this is a big chunk of ugly math but dont worry to much about what it all means\r\n\t\t\t//It recreates a statistcally representative model of a wave spectrum in the frequency domain.\r\n\t\t\t\r\n\t\t\tfloat U10 = m_windSpeed;\r\n\t\t\t\r\n\t\t\t// phase speed\r\n\t\t\tfloat k = Mathf.Sqrt(kx * kx + ky * ky);\r\n\t\t\tfloat c = omega(k) / k;\r\n\t\t\t\r\n\t\t\t// spectral peak\r\n\t\t\tfloat kp = 9.81f * sqr(m_omega / U10); // after Eq 3\r\n\t\t\tfloat cp = omega(kp) / kp;\r\n\t\t\t\r\n\t\t\t// friction velocity\r\n\t\t\tfloat z0 = 3.7e-5f * sqr(U10) / 9.81f * Mathf.Pow(U10 / cp, 0.9f); // Eq 66\r\n\t\t\tfloat u_star = 0.41f * U10 / Mathf.Log(10.0f / z0); // Eq 60\r\n\t\t\t\r\n\t\t\tfloat Lpm = Mathf.Exp(-5.0f / 4.0f * sqr(kp / k)); // after Eq 3\r\n\t\t\tfloat gamma = (m_omega < 1.0f) ? 1.7f : 1.7f + 6.0f * Mathf.Log(m_omega); // after Eq 3 // log10 or log?\r\n\t\t\tfloat sigma = 0.08f * (1.0f + 4.0f / Mathf.Pow(m_omega, 3.0f)); // after Eq 3\r\n\t\t\tfloat Gamma = Mathf.Exp(-1.0f / (2.0f * sqr(sigma)) * sqr(Mathf.Sqrt(k / kp) - 1.0f));\r\n\t\t\tfloat Jp = Mathf.Pow(gamma, Gamma); // Eq 3\r\n\t\t\tfloat Fp = Lpm * Jp * Mathf.Exp(-m_omega / Mathf.Sqrt(10.0f) * (Mathf.Sqrt(k / kp) - 1.0f)); // Eq 32\r\n\t\t\tfloat alphap = 0.006f * Mathf.Sqrt(m_omega); // Eq 34\r\n\t\t\tfloat Bl = 0.5f * alphap * cp / c * Fp; // Eq 31\r\n\t\t\t\r\n\t\t\tfloat alpham = 0.01f * (u_star < WAVE_CM ? 1.0f + Mathf.Log(u_star / WAVE_CM) : 1.0f + 3.0f * Mathf.Log(u_star / WAVE_CM)); // Eq 44\r\n\t\t\tfloat Fm = Mathf.Exp(-0.25f * sqr(k / WAVE_KM - 1.0f)); // Eq 41\r\n\t\t\tfloat Bh = 0.5f * alpham * WAVE_CM / c * Fm * Lpm; // Eq 40 (fixed)\r\n\t\t\t\r\n\t\t\tBh *= Lpm; // bug fix???\r\n\t\t\t\r\n\t\t\tif (omnispectrum) return AMP * (Bl + Bh) / (k * sqr(k)); // Eq 30\r\n\t\t\t\r\n\t\t\tfloat a0 = Mathf.Log(2.0f) / 4.0f;\r\n\t\t\tfloat ap = 4.0f;\r\n\t\t\tfloat am = 0.13f * u_star / WAVE_CM; // Eq 59\r\n\t\t\tfloat Delta = (float) System.Math.Tanh(a0 + ap * Mathf.Pow(c / cp, 2.5f) + am * Mathf.Pow(WAVE_CM / c, 2.5f)); // Eq 57\r\n\t\t\t\r\n\t\t\tfloat phi = Mathf.Atan2(ky, kx);\r\n\t\t\t\r\n\t\t\tif (kx < 0.0f) return 0.0f;\r\n\t\t\t\r\n\t\t\tBl *= 2.0f;\r\n\t\t\tBh *= 2.0f;\r\n\t\t\t\r\n\t\t\t// remove waves perpendicular to wind dir\r\n\t\t\tfloat tweak = Mathf.Sqrt(Mathf.Max(kx / Mathf.Sqrt(kx * kx + ky * ky), 0.0f));\r\n\t\t\t\r\n\t\t\treturn AMP * (Bl + Bh) * (1.0f + Delta * Mathf.Cos(2.0f * phi)) / (2.0f * Mathf.PI * sqr(sqr(k))) * tweak; // Eq 67\r\n\t\t}\r\n\t\t\r\n\t\tVector2 GetSpectrumSample(float i, float j, float lengthScale, float kMin) {\r\n\t\t\tfloat dk = 2.0f * Mathf.PI / lengthScale;\r\n\t\t\tfloat kx = i * dk;\r\n\t\t\tfloat ky = j * dk;\r\n\t\t\tVector2 result = new Vector2(0.0f, 0.0f);\r\n\t\t\t\r\n\t\t\tfloat rnd = UnityEngine.Random.value;\r\n\t\t\t\r\n\t\t\tif (Mathf.Abs(kx) >= kMin || Mathf.Abs(ky) >= kMin) {\r\n\t\t\t\tfloat S = Spectrum(kx, ky, false);\r\n\t\t\t\tfloat h = Mathf.Sqrt(S / 2.0f) * dk;\r\n\t\t\t\t\r\n\t\t\t\tfloat phi = rnd * 2.0f * Mathf.PI;\r\n\t\t\t\tresult.x = h * Mathf.Cos(phi);\r\n\t\t\t\tresult.y = h * Mathf.Sin(phi);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\treturn result;\r\n\t\t}\r\n\t\t\r\n\t\tfloat GetSlopeVariance(float kx, float ky, Vector2 spectrumSample) {\r\n\t\t\tfloat kSquare = kx * kx + ky * ky;\r\n\t\t\tfloat real = spectrumSample.x;\r\n\t\t\tfloat img = spectrumSample.y;\r\n\t\t\tfloat hSquare = real * real + img * img;\r\n\t\t\treturn kSquare * hSquare * 2.0f;\r\n\t\t}\r\n\t\t\r\n\t\tvoid GenerateWavesSpectrum() {\r\n\t\t\t\r\n\t\t\t// Slope variance due to all waves, by integrating over the full spectrum.\r\n\t\t\t// Used by the BRDF rendering model\r\n\t\t\tfloat theoreticSlopeVariance = 0.0f;\r\n\t\t\tfloat k = 5e-3f;\r\n\t\t\twhile (k < 1e3f) {\r\n\t\t\t\tfloat nextK = k * 1.001f;\r\n\t\t\t\ttheoreticSlopeVariance += k * k * Spectrum(k, 0, true) * (nextK - k);\r\n\t\t\t\tk = nextK;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tfloat[] spectrum01 = new float[m_fourierGridSize * m_fourierGridSize * 4];\r\n\t\t\tfloat[] spectrum23 = new float[m_fourierGridSize * m_fourierGridSize * 4];\r\n\r\n//#if CPUmode\r\n\t\t\tif (Scatterer.Instance.mainSettings.oceanCraftWaveInteractions)\r\n\t\t\t{\r\n\t\t\t\tm_spectrum01vector = new Vector4[m_fourierGridSize * m_fourierGridSize];\r\n\t\t\t\tm_spectrum23vector = new Vector4[m_fourierGridSize * m_fourierGridSize];\r\n\t\t\t}\r\n//#endif\r\n\r\n\r\n\t\t\tint idx;\r\n\t\t\tfloat i;\r\n\t\t\tfloat j;\r\n\t\t\tfloat totalSlopeVariance = 0.0f;\r\n\t\t\tVector2 sample12XY;\r\n\t\t\tVector2 sample12ZW;\r\n\t\t\tVector2 sample34XY;\r\n\t\t\tVector2 sample34ZW;\r\n\t\t\t\r\n\t\t\tUnityEngine.Random.seed = 0;\r\n\t\t\t\r\n\t\t\tfor (int x = 0; x < m_fourierGridSize; x++) {\r\n\t\t\t\tfor (int y = 0; y < m_fourierGridSize; y++) {\r\n\t\t\t\t\tidx = x + y * m_fourierGridSize;\r\n\t\t\t\t\ti = (x >= m_fourierGridSize / 2) ? (float)(x - m_fourierGridSize) : (float) x;\r\n\t\t\t\t\tj = (y >= m_fourierGridSize / 2) ? (float)(y - m_fourierGridSize) : (float) y;\r\n\t\t\t\t\t\r\n\t\t\t\t\tsample12XY = GetSpectrumSample(i, j, m_gridSizes.x, Mathf.PI / m_gridSizes.x);\r\n\t\t\t\t\tsample12ZW = GetSpectrumSample(i, j, m_gridSizes.y, Mathf.PI * m_fsize / m_gridSizes.x);\r\n\t\t\t\t\tsample34XY = GetSpectrumSample(i, j, m_gridSizes.z, Mathf.PI * m_fsize / m_gridSizes.y);\r\n\t\t\t\t\tsample34ZW = GetSpectrumSample(i, j, m_gridSizes.w, Mathf.PI * m_fsize / m_gridSizes.z);\r\n\t\t\t\t\t\r\n\r\n//#if CPUmode\r\n\t\t\t\t\tif (Scatterer.Instance.mainSettings.oceanCraftWaveInteractions)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tm_spectrum01vector[idx].x = sample12XY.x;\r\n\t\t\t\t\t\tm_spectrum01vector[idx].y = sample12XY.y;\r\n\t\t\t\t\t\tm_spectrum01vector[idx].z = sample12ZW.x;\r\n\t\t\t\t\t\tm_spectrum01vector[idx].w = sample12ZW.y;\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tm_spectrum23vector[idx].x = sample34XY.x;\r\n\t\t\t\t\t\tm_spectrum23vector[idx].y = sample34XY.y;\r\n\t\t\t\t\t\tm_spectrum23vector[idx].z = sample34ZW.x;\r\n\t\t\t\t\t\tm_spectrum23vector[idx].w = sample34ZW.y;\r\n\t\t\t\t\t}\r\n//#endif\r\n\r\n\r\n\r\n\t\t\t\t\tspectrum01[idx * 4 + 0] = sample12XY.x;\r\n\t\t\t\t\tspectrum01[idx * 4 + 1] = sample12XY.y;\r\n\t\t\t\t\tspectrum01[idx * 4 + 2] = sample12ZW.x;\r\n\t\t\t\t\tspectrum01[idx * 4 + 3] = sample12ZW.y;\r\n\t\t\t\t\t\r\n\t\t\t\t\tspectrum23[idx * 4 + 0] = sample34XY.x;\r\n\t\t\t\t\tspectrum23[idx * 4 + 1] = sample34XY.y;\r\n\t\t\t\t\tspectrum23[idx * 4 + 2] = sample34ZW.x;\r\n\t\t\t\t\tspectrum23[idx * 4 + 3] = sample34ZW.y;\r\n\t\t\t\t\t\r\n\t\t\t\t\ti *= 2.0f * Mathf.PI;\r\n\t\t\t\t\tj *= 2.0f * Mathf.PI;\r\n\t\t\t\t\t\r\n\t\t\t\t\ttotalSlopeVariance += GetSlopeVariance(i / m_gridSizes.x, j / m_gridSizes.x, sample12XY);\r\n\t\t\t\t\ttotalSlopeVariance += GetSlopeVariance(i / m_gridSizes.y, j / m_gridSizes.y, sample12ZW);\r\n\t\t\t\t\ttotalSlopeVariance += GetSlopeVariance(i / m_gridSizes.z, j / m_gridSizes.z, sample34XY);\r\n\t\t\t\t\ttotalSlopeVariance += GetSlopeVariance(i / m_gridSizes.w, j / m_gridSizes.w, sample34ZW);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tm_writeFloat.WriteIntoRenderTexture(m_spectrum01, 4, spectrum01);\r\n\t\t\tm_writeFloat.WriteIntoRenderTexture(m_spectrum23, 4, spectrum23);\r\n\t\t\t\r\n\t\t\tfloat slopeVarianceDelta = 0.5f * (theoreticSlopeVariance - totalSlopeVariance);\r\n\t\t\r\n\t\t\tm_varianceMax = new Vector2(float.NegativeInfinity, float.NegativeInfinity);\r\n\t\t\t\r\n\t\t\tVector2[, , ] variance32bit = new Vector2[m_varianceSize, m_varianceSize, m_varianceSize];\r\n\t\t\tColor[] variance8bit = new Color[m_varianceSize * m_varianceSize * m_varianceSize];\r\n\t\r\n\t\t\tfor (int x = 0; x < m_varianceSize; x++) {\r\n\t\t\t\tfor (int y = 0; y < m_varianceSize; y++) {\r\n\t\t\t\t\tfor (int z = 0; z < m_varianceSize; z++) {\r\n\t\t\t\t\t\tvariance32bit[x, y, z] = ComputeVariance(slopeVarianceDelta, spectrum01, spectrum23, x, y, z);\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tif (variance32bit[x, y, z].x > m_varianceMax.x) m_varianceMax.x = variance32bit[x, y, z].x;\r\n\t\t\t\t\t\tif (variance32bit[x, y, z].y > m_varianceMax.y) m_varianceMax.y = variance32bit[x, y, z].y;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tfor (int x = 0; x < m_varianceSize; x++) {\r\n\t\t\t\tfor (int y = 0; y < m_varianceSize; y++) {\r\n\t\t\t\t\tfor (int z = 0; z < m_varianceSize; z++) {\r\n\t\t\t\t\t\tidx = x + y * m_varianceSize + z * m_varianceSize * m_varianceSize;\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tvariance8bit[idx] = new Color(variance32bit[x, y, z].x / m_varianceMax.x, variance32bit[x, y, z].y / m_varianceMax.y, 0.0f, 1.0f);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tm_variance.SetPixels(variance8bit);\r\n\t\t\tm_variance.Apply();\r\n\r\n\t\t\t\r\n//\t\t\tm_maxSlopeVariance = 0.0f;\r\n//\t\t\tfor (int v = 0; v < m_varianceSize * m_varianceSize * m_varianceSize; v++) {\r\n//\t\t\t\tm_maxSlopeVariance = Mathf.Max(m_maxSlopeVariance, varianceData[v]);\r\n//\t\t\t}\r\n\r\n\t\t\tm_maxSlopeVariance = 0.0f;\r\n\t\t\tfor(int v = 0; v < m_varianceSize*m_varianceSize*m_varianceSize; v++)\r\n\t\t\t{\r\n\t\t\t\tm_maxSlopeVariance = Mathf.Max(m_maxSlopeVariance, variance8bit[v].r*m_varianceMax.x);\r\n\t\t\t\tm_maxSlopeVariance = Mathf.Max(m_maxSlopeVariance, variance8bit[v].g*m_varianceMax.y);\r\n\t\t\t}\r\n\r\n\t\t\t\r\n\t\t}\r\n\t\t\r\n\t\tvoid CreateWTable() {\r\n\t\t\t//Some values need for the InitWaveSpectrum function can be precomputed\r\n\t\t\tVector2 uv, st;\r\n\t\t\tfloat k1, k2, k3, k4, w1, w2, w3, w4;\r\n\t\t\t\r\n\t\t\tfloat[] table = new float[m_fourierGridSize * m_fourierGridSize * 4];\r\n\t\t\t\r\n\t\t\tfor (int x = 0; x < m_fourierGridSize; x++) {\r\n\t\t\t\tfor (int y = 0; y < m_fourierGridSize; y++) {\r\n\t\t\t\t\tuv = new Vector2(x, y) / m_fsize;\r\n\t\t\t\t\t\r\n\t\t\t\t\tst.x = uv.x > 0.5f ? uv.x - 1.0f : uv.x;\r\n\t\t\t\t\tst.y = uv.y > 0.5f ? uv.y - 1.0f : uv.y;\r\n\t\t\t\t\t\r\n\t\t\t\t\tk1 = (st * m_inverseGridSizes.x).magnitude;\r\n\t\t\t\t\tk2 = (st * m_inverseGridSizes.y).magnitude;\r\n\t\t\t\t\tk3 = (st * m_inverseGridSizes.z).magnitude;\r\n\t\t\t\t\tk4 = (st * m_inverseGridSizes.w).magnitude;\r\n\t\t\t\t\t\r\n\t\t\t\t\tw1 = Mathf.Sqrt(9.81f * k1 * (1.0f + k1 * k1 / (WAVE_KM * WAVE_KM)));\r\n\t\t\t\t\tw2 = Mathf.Sqrt(9.81f * k2 * (1.0f + k2 * k2 / (WAVE_KM * WAVE_KM)));\r\n\t\t\t\t\tw3 = Mathf.Sqrt(9.81f * k3 * (1.0f + k3 * k3 / (WAVE_KM * WAVE_KM)));\r\n\t\t\t\t\tw4 = Mathf.Sqrt(9.81f * k4 * (1.0f + k4 * k4 / (WAVE_KM * WAVE_KM)));\r\n\t\t\t\t\t\r\n\t\t\t\t\ttable[(x + y * m_fourierGridSize) * 4 + 0] = w1;\r\n\t\t\t\t\ttable[(x + y * m_fourierGridSize) * 4 + 1] = w2;\r\n\t\t\t\t\ttable[(x + y * m_fourierGridSize) * 4 + 2] = w3;\r\n\t\t\t\t\ttable[(x + y * m_fourierGridSize) * 4 + 3] = w4;\r\n\t\t\t\t\t\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tm_writeFloat.WriteIntoRenderTexture(m_WTable, 4, table);\r\n\t\t\t\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Some of the values needed in the InitWaveSpectrum function can be precomputed.\r\n\t\t/// If the grid sizes change this function must called again.\r\n\t\t/// </summary>\r\n\t\tvoid CreateWTableForCPU()\r\n\t\t{\r\n\t\t\t\r\n\t\t\tVector2 uv, st;\r\n\t\t\tfloat k1, k2, k3, k4, w1, w2, w3, w4;\r\n\t\t\t\r\n\t\t\tm_WTablevector = new Vector4[m_fourierGridSize * m_fourierGridSize];\r\n\t\t\t\r\n\t\t\tfor (int x = 0; x < m_fourierGridSize; x++)\r\n\t\t\t{\r\n\t\t\t\tfor (int y = 0; y < m_fourierGridSize; y++)\r\n\t\t\t\t{\r\n\t\t\t\t\tuv = new Vector2(x, y) / m_fsize;\r\n\t\t\t\t\t\r\n\t\t\t\t\tst.x = uv.x > 0.5f ? uv.x - 1.0f : uv.x;\r\n\t\t\t\t\tst.y = uv.y > 0.5f ? uv.y - 1.0f : uv.y;\r\n\t\t\t\t\t\r\n\t\t\t\t\tk1 = (st * m_inverseGridSizes.x).magnitude;\r\n\t\t\t\t\tk2 = (st * m_inverseGridSizes.y).magnitude;\r\n\t\t\t\t\tk3 = (st * m_inverseGridSizes.z).magnitude;\r\n\t\t\t\t\tk4 = (st * m_inverseGridSizes.w).magnitude;\r\n\t\t\t\t\t\r\n\t\t\t\t\tw1 = Mathf.Sqrt(9.81f * k1 * (1.0f + k1 * k1 / (WAVE_KM * WAVE_KM)));\r\n\t\t\t\t\tw2 = Mathf.Sqrt(9.81f * k2 * (1.0f + k2 * k2 / (WAVE_KM * WAVE_KM)));\r\n\t\t\t\t\tw3 = Mathf.Sqrt(9.81f * k3 * (1.0f + k3 * k3 / (WAVE_KM * WAVE_KM)));\r\n\t\t\t\t\tw4 = Mathf.Sqrt(9.81f * k4 * (1.0f + k4 * k4 / (WAVE_KM * WAVE_KM)));\r\n\t\t\t\t\t\r\n\t\t\t\t\tm_WTablevector[x + y * m_fourierGridSize] = new Vector4(w1, w2, w3, w4);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t}\r\n\t\t\r\n\t\tVector2 GetSpectrum(float t, float w, float s0x, float s0y, float s0cx, float s0cy)\r\n\t\t{\r\n\t\t\tfloat c = Mathf.Cos(w * t);\r\n\t\t\tfloat s = Mathf.Sin(w * t);\r\n\t\t\treturn new Vector2((s0x + s0cx) * c - (s0y + s0cy) * s, (s0x - s0cx) * s + (s0y - s0cy) * c);\r\n\t\t}\r\n\t\t\r\n\t\tVector2 COMPLEX(Vector2 z)\r\n\t\t{\r\n\t\t\treturn new Vector2(-z.y, z.x); // returns i times z (complex number)\r\n\t\t}\r\n\t\t\r\n\t\tpublic virtual void onThreadsDone()\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t\r\n\t\tvoid CommitResults(ref Vector4[,] data, ref Vector4[,] output)\r\n\t\t{\r\n\t\t\t\r\n\t\t\tfor (int x = 0; x < m_fourierGridSize; x++)\r\n\t\t\t{\r\n\t\t\t\tfor (int y = 0; y < m_fourierGridSize; y++)\r\n\t\t\t\t{\r\n\t\t\t\t\tint i = x + y * m_fourierGridSize;\r\n\t\t\t\t\t\r\n\t\t\t\t\toutput[m_bufferIdx,i] = data[m_bufferIdx, i];\r\n\t\t\t\t\t\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t//main thread that launches the other threads\r\n\t\tvoid RunThreaded(object o)\r\n\t\t{\r\n\t\t\t\r\n\t\t\tNullable<float> time  = o as Nullable<float>;\r\n\t\t\t\r\n\t\t\tInitWaveSpectrumCPU(time.Value);\r\n\r\n\t\t\tThreadPool.QueueUserWorkItem(new WaitCallback(RunThreaded1), time);\r\n\t\t\tThreadPool.QueueUserWorkItem(new WaitCallback(RunThreaded2), time);\r\n\t\t\tThreadPool.QueueUserWorkItem(new WaitCallback(RunThreaded3), time);\r\n\t\t\tThreadPool.QueueUserWorkItem(new WaitCallback(RunThreaded4), time);\r\n\t\t\tThreadPool.QueueUserWorkItem(new WaitCallback(RunThreaded5), time);\r\n\r\n\t\t\tdone0 = true;\r\n\t\t}\r\n\t\t\r\n\t\tvoid RunThreaded1(object o)\r\n\t\t{\r\n\t\t\tNullable<float> time  = o as Nullable<float>;\t\r\n\t\t\t\r\n\t\t\tm_bufferIdx = m_CPUfourier.PeformFFT(0, m_fourierBuffer0vector);\r\n\t\t\t\t\t\t\r\n\t\t\tdone1 = true;\r\n\t\t}\r\n\t\t\r\n\t\tvoid RunThreaded2(object o)\r\n\t\t{\r\n\t\t\t\r\n\t\t\tNullable<float> time  = o as Nullable<float>;\r\n\t\t\t\r\n\t\t\tm_CPUfourier.PeformFFT(0, m_fourierBuffer1vector);\r\n\r\n\t\t\tdone2 = true;\r\n\t\t\t\r\n\t\t}\r\n\t\t\r\n\t\tvoid RunThreaded3(object o)\r\n\t\t{\r\n\t\t\t\r\n\t\t\tNullable<float> time  = o as Nullable<float>;\r\n\t\t\t\r\n\t\t\tm_CPUfourier.PeformFFT(0, m_fourierBuffer2vector);\r\n\r\n\t\t\tdone3 = true;\r\n\t\t\t\r\n\t\t}\r\n\t\t\r\n\t\tvoid RunThreaded4(object o)\r\n\t\t{\r\n\t\t\t\r\n\t\t\tNullable<float> time  = o as Nullable<float>;\r\n\t\t\t\r\n\t\t\tm_CPUfourier.PeformFFT(0, m_fourierBuffer3vector);\r\n\t\t\t\r\n\t\t\tdone4 = true;\r\n\t\t\t\r\n\t\t}\r\n\t\t\r\n\t\t\r\n\t\tvoid RunThreaded5(object o)\r\n\t\t{\r\n\t\t\t\r\n\t\t\tNullable<float> time  = o as Nullable<float>;\r\n\t\t\t\r\n\t\t\tm_CPUfourier.PeformFFT(0, m_fourierBuffer4vector);\r\n\t\t\t\r\n\t\t\tdone5 = true;\r\n\t\t\t\r\n\t\t}\r\n\t\t\r\n\t\t\r\n\t\tvoid ComputeButterflyLookupTable()\r\n\t\t{\r\n\t\t\tm_butterflyLookupTable = new float[m_fourierGridSize * m_passes * 4];\r\n\t\t\t\r\n\t\t\tfor (int i = 0; i < m_passes; i++)\r\n\t\t\t{\r\n\t\t\t\tint nBlocks = (int)Mathf.Pow(2, m_passes - 1 - i);\r\n\t\t\t\tint nHInputs = (int)Mathf.Pow(2, i);\r\n\t\t\t\t\r\n\t\t\t\tfor (int j = 0; j < nBlocks; j++)\r\n\t\t\t\t{\r\n\t\t\t\t\tfor (int k = 0; k < nHInputs; k++)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tint i1, i2, j1, j2;\r\n\t\t\t\t\t\tif (i == 0)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\ti1 = j * nHInputs * 2 + k;\r\n\t\t\t\t\t\t\ti2 = j * nHInputs * 2 + nHInputs + k;\r\n\t\t\t\t\t\t\tj1 = BitReverse(i1);\r\n\t\t\t\t\t\t\tj2 = BitReverse(i2);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\ti1 = j * nHInputs * 2 + k;\r\n\t\t\t\t\t\t\ti2 = j * nHInputs * 2 + nHInputs + k;\r\n\t\t\t\t\t\t\tj1 = i1;\r\n\t\t\t\t\t\t\tj2 = i2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tfloat wr = Mathf.Cos(2.0f * Mathf.PI * (float)(k * nBlocks) / m_fsize);\r\n\t\t\t\t\t\tfloat wi = Mathf.Sin(2.0f * Mathf.PI * (float)(k * nBlocks) / m_fsize);\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tint offset1 = 4 * (i1 + i * m_fourierGridSize);\r\n\t\t\t\t\t\tm_butterflyLookupTable[offset1 + 0] = j1;\r\n\t\t\t\t\t\tm_butterflyLookupTable[offset1 + 1] = j2;\r\n\t\t\t\t\t\tm_butterflyLookupTable[offset1 + 2] = wr;\r\n\t\t\t\t\t\tm_butterflyLookupTable[offset1 + 3] = wi;\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tint offset2 = 4 * (i2 + i * m_fourierGridSize);\r\n\t\t\t\t\t\tm_butterflyLookupTable[offset2 + 0] = j1;\r\n\t\t\t\t\t\tm_butterflyLookupTable[offset2 + 1] = j2;\r\n\t\t\t\t\t\tm_butterflyLookupTable[offset2 + 2] = -wr;\r\n\t\t\t\t\t\tm_butterflyLookupTable[offset2 + 3] = -wi;\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tint BitReverse(int i)\r\n\t\t{\r\n\t\t\tint j = i;\r\n\t\t\tint Sum = 0;\r\n\t\t\tint W = 1;\r\n\t\t\tint M = m_fourierGridSize / 2;\r\n\t\t\twhile (M != 0)\r\n\t\t\t{\r\n\t\t\t\tj = ((i & M) > M - 1) ? 1 : 0;\r\n\t\t\t\tSum += j * W;\r\n\t\t\t\tW *= 2;\r\n\t\t\t\tM /= 2;\r\n\t\t\t}\r\n\t\t\treturn Sum;\r\n\t\t}\r\n\t\t\r\n\t\tvoid OnGUI(){\r\n\t\t\t//\t\t\tGUI.DrawTexture(new Rect(0,0,512, 512), m_map0tex2DScaleMode.ScaleToFit, false);\r\n\t\t\t//\t\t\tGUI.DrawTexture(new Rect(0,0,512, 512), m_map0, ScaleMode.ScaleToFit, false);\r\n\t\t\t\r\n\t\t\t//\t\t\tGUI.DrawTexture(new Rect(512,0,512, 512), m_map0);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Get the two indices that need to be sampled for bilinear filtering.\r\n\t\t/// </summary>\r\n\t\tpublic void Index(double x, int sx, out int ix0, out int ix1)\r\n\t\t{\r\n\t\t\t\r\n\t\t\tix0 = (int)x;\r\n\t\t\tix1 = (int)x + (int)Math.Sign(x);\r\n\t\t\t\r\n\t\t\t//\t\t\tif(m_wrap)\r\n\t\t\t//\t\t\t{\r\n\t\t\tif(ix0 >= sx || ix0 <= -sx) ix0 = ix0 % sx;\r\n\t\t\tif(ix0 < 0) ix0 = sx - -ix0;\r\n\t\t\t\r\n\t\t\tif(ix1 >= sx || ix1 <= -sx) ix1 = ix1 % sx;\r\n\t\t\tif(ix1 < 0) ix1 = sx - -ix1;\r\n\t\t\t//\t\t\t}\r\n\t\t\t//\t\t\telse\r\n\t\t\t//\t\t\t{\r\n\t\t\t//\t\t\t\tif(ix0 < 0) ix0 = 0;\r\n\t\t\t//\t\t\t\telse if(ix0 >= sx) ix0 = sx-1;\r\n\t\t\t//\t\t\t\t\r\n\t\t\t//\t\t\t\tif(ix1 < 0) ix1 = 0;\r\n\t\t\t//\t\t\t\telse if(ix1 >= sx) ix1 = sx-1;\r\n\t\t\t//\t\t\t}\r\n\t\t\t//\t\t\t\r\n\t\t}\r\n\t\t\r\n\t\t\r\n\t\tpublic void GetUsingBilinearFiltering(float x, float y, float[] v, Vector4[,] m_data, int m_c)\r\n\t\t{\r\n\t\t\t\r\n\t\t\t//un-normalize cords\r\n\t\t\tx *= (float)m_fourierGridSize;\r\n\t\t\ty *= (float)m_fourierGridSize;\r\n\t\t\t\r\n\t\t\tx -= 0.5f;\r\n\t\t\ty -= 0.5f;\r\n\t\t\t\r\n\t\t\tint x0, x1;\r\n\t\t\tfloat fx = Math.Abs(x - (int)x);\r\n\t\t\tIndex(x, m_fourierGridSize, out x0, out x1);\r\n\t\t\t\r\n\t\t\tint y0, y1;\r\n\t\t\tfloat fy = Math.Abs(y - (int)y);\r\n\t\t\tIndex(y, m_fourierGridSize, out y0, out y1);\r\n\t\t\t\r\n\t\t\t//\t\t\tfor(int c = 0; c < m_c; c++)  //change this loop to work with Vector4 format\r\n\t\t\t//\t\t\t{\r\n\t\t\t//\t\t\t\tfloat v0 = m_data[(x0 + y0 * m_size) * m_c + c] * (1.0f-fx) + m_data[(x1 + y0 * m_size) * m_c + c] * fx;\r\n\t\t\t//\t\t\t\tfloat v1 = m_data[(x0 + y1 * m_size) * m_c + c] * (1.0f-fx) + m_data[(x1 + y1 * m_size) * m_c + c] * fx;\r\n\t\t\t//\t\t\t\t\r\n\t\t\t//\t\t\t\tv[c] = v0 * (1.0f-fy) + v1 * fy;\r\n\t\t\t//\t\t\t}\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\tfloat v0 = m_data[m_bufferIdx,(x0 + y0 * m_fourierGridSize)].x * (1.0f-fx) + m_data[m_bufferIdx,(x1 + y0 * m_fourierGridSize)].x * fx;\r\n\t\t\tfloat v1 = m_data[m_bufferIdx,(x0 + y1 * m_fourierGridSize)].x * (1.0f-fx) + m_data[m_bufferIdx,(x1 + y1 * m_fourierGridSize)].x * fx;\r\n\t\t\tv[0] = v0 * (1.0f-fy) + v1 * fy;\r\n\t\t\t\r\n\t\t\tv0 = m_data[m_bufferIdx,(x0 + y0 * m_fourierGridSize)].y * (1.0f-fx) + m_data[m_bufferIdx,(x1 + y0 * m_fourierGridSize)].y * fx;\r\n\t\t\tv1 = m_data[m_bufferIdx,(x0 + y1 * m_fourierGridSize)].y * (1.0f-fx) + m_data[m_bufferIdx,(x1 + y1 * m_fourierGridSize)].y * fx;\r\n\t\t\tv[1] = v0 * (1.0f-fy) + v1 * fy;\r\n\t\t\t\r\n\t\t\tv0 = m_data[m_bufferIdx,(x0 + y0 * m_fourierGridSize)].z * (1.0f-fx) + m_data[m_bufferIdx,(x1 + y0 * m_fourierGridSize)].z * fx;\r\n\t\t\tv1 = m_data[m_bufferIdx,(x0 + y1 * m_fourierGridSize)].z * (1.0f-fx) + m_data[m_bufferIdx,(x1 + y1 * m_fourierGridSize)].z * fx;\r\n\t\t\tv[2] = v0 * (1.0f-fy) + v1 * fy;\r\n\t\t\t\r\n\t\t\tv0 = m_data[m_bufferIdx,(x0 + y0 * m_fourierGridSize)].w * (1.0f-fx) + m_data[m_bufferIdx,(x1 + y0 * m_fourierGridSize)].w * fx;\r\n\t\t\tv1 = m_data[m_bufferIdx,(x0 + y1 * m_fourierGridSize)].w * (1.0f-fx) + m_data[m_bufferIdx,(x1 + y1 * m_fourierGridSize)].w * fx;\r\n\t\t\tv[3] = v0 * (1.0f-fy) + v1 * fy;\r\n\t\t\t\r\n\t\t\t\r\n\t\t}\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// This will return the ocean height at any world pos.\r\n\t\t/// </summary>\r\n\t\tpublic float SampleHeight(Vector3 worldPos)\r\n\t\t{\r\n\t\t\tfloat ht = 0.0f;\r\n\t\t\t\r\n\t\t\tint HEIGHTS_CHANNELS = 4;\r\n\t\t\tfloat[] result = new float[HEIGHTS_CHANNELS];\r\n\t\t\t\r\n\t\t\tVector2 pos = new Vector2(worldPos.x, worldPos.y) / m_gridSizes.x;\r\n\t\t\t\r\n\t\t\tGetUsingBilinearFiltering(pos.x, pos.y, result, m_fourierBuffer0vectorResults, 4);\r\n\t\t\tht += result[0];\r\n\t\t\t\r\n\t\t\tpos = new Vector2(worldPos.x, worldPos.y) / m_gridSizes.y;\r\n\t\t\t\r\n\t\t\tGetUsingBilinearFiltering(pos.x, pos.y, result, m_fourierBuffer0vectorResults, 4);\r\n\t\t\tht += result[1];\r\n\t\t\t\r\n\t\t\tpos = new Vector2(worldPos.x, worldPos.y) / m_gridSizes.z;\r\n\t\t\t\r\n\t\t\tGetUsingBilinearFiltering(pos.x, pos.y, result, m_fourierBuffer0vectorResults, 4);\r\n\t\t\tht += result[2];\r\n\t\t\t\r\n\t\t\tpos = new Vector2(worldPos.x, worldPos.y) / m_gridSizes.w;\r\n\t\t\t\r\n\t\t\tGetUsingBilinearFiltering(pos.x, pos.y, result, m_fourierBuffer0vectorResults, 4);\r\n\t\t\tht += result[3];\r\n\t\t\t\r\n\t\t\treturn ht;\r\n\t\t}\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// This will return the ocean displacement at any world pos.\r\n\t\t/// </summary>\r\n\t\tpublic Vector2 SampleDisplacement(Vector3 worldPos)\r\n\t\t{\r\n\t\t\tVector2 disp = Vector2.zero;\r\n\t\t\t\r\n\t\t\tint HEIGHTS_CHANNELS = 4;\r\n\t\t\tfloat[] result = new float[HEIGHTS_CHANNELS];\r\n\t\t\t\r\n\t\t\tVector2 pos = new Vector2(worldPos.x, worldPos.y) / m_gridSizes.x;\r\n\t\t\t\r\n\t\t\tGetUsingBilinearFiltering(pos.x, pos.y, result, m_fourierBuffer3vectorResults, 4);\r\n\t\t\tdisp.x += result[0]* m_choppyness.x ;\r\n\t\t\tdisp.y += result[1]* m_choppyness.x;\r\n\t\t\t\r\n\t\t\tpos = new Vector2(worldPos.x, worldPos.y) / m_gridSizes.y;\r\n\t\t\t\r\n\t\t\tGetUsingBilinearFiltering(pos.x, pos.y, result, m_fourierBuffer3vectorResults, 4);\r\n\t\t\tdisp.x += result[2]* m_choppyness.y;\r\n\t\t\tdisp.y += result[3]* m_choppyness.y;\r\n\t\t\t\r\n\t\t\tpos = new Vector2(worldPos.x, worldPos.y) / m_gridSizes.z;\r\n\t\t\t\r\n\t\t\tGetUsingBilinearFiltering(pos.x, pos.y, result, m_fourierBuffer4vectorResults, 4);\r\n\t\t\tdisp.x += result[0]* m_choppyness.z;\r\n\t\t\tdisp.y += result[1]* m_choppyness.z;\r\n\t\t\t\r\n\t\t\tpos = new Vector2(worldPos.x, worldPos.y) / m_gridSizes.w;\r\n\t\t\t\r\n\t\t\tGetUsingBilinearFiltering(pos.x, pos.y, result, m_fourierBuffer4vectorResults, 4);\r\n\t\t\tdisp.x += result[2]* m_choppyness.w;\r\n\t\t\tdisp.y += result[3]* m_choppyness.w;\r\n\t\t\t\r\n\t\t\t\r\n\t\t\treturn disp;\r\n\t\t}\r\n\r\n\t\t//Essentially a search method to find which point on the ocean is displaced sideways to end up at our part's position, so we can sample the correct height\r\n\t\t//Thanks to Scrawk (Justin Hawkins) for the tip\r\n\t\t//Original source: Water technology of uncharted p.126 https://www.gdcvault.com/play/1015309/Water-Technology-of\r\n\t\tpublic float findHeight(Vector3 worldPos, float precision)\r\n\t\t{\r\n\t\t\tint it = 0;\r\n\r\n\t\t\tVector3 currentPosition = worldPos;\r\n\t\t\tVector2 displacement = SampleDisplacement (currentPosition);\r\n\t\t\tVector3 resultingPosition = currentPosition + new Vector3 (displacement.x, displacement.y, 0f);\r\n\r\n\t\t\twhile ( ((resultingPosition - worldPos).magnitude > precision) && it<40 )\r\n\t\t\t{\r\n\t\t\t\tVector3 newPosition = currentPosition - (resultingPosition - worldPos);\r\n\t\t\t\tVector3 newDisplacement = SampleDisplacement (newPosition);\r\n\t\t\t\tVector3 newResultingPosition = newPosition + new Vector3 (newDisplacement.x, newDisplacement.y, 0f);\r\n\r\n\t\t\t\tcurrentPosition = newPosition;\r\n\t\t\t\tresultingPosition = newResultingPosition;\r\n\r\n\t\t\t\tit++;\r\n\t\t\t}\r\n\r\n\t\t\treturn (SampleHeight (currentPosition));\r\n\t\t}\r\n\t\t\r\n\t}\r\n\t\r\n}"
  },
  {
    "path": "scatterer/Effects/Proland/Ocean/OceanFFTgpu.cs",
    "content": "/*\r\n * Proland: a procedural landscape rendering library.\r\n * Copyright (c) 2008-2011 INRIA\r\n *\r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n *\r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n *\r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n *\r\n * Proland is distributed under a dual-license scheme.\r\n * You can obtain a specific license from Inria: proland-licensing@inria.fr.\r\n *\r\n * Authors: Eric Bruneton, Antoine Begault, Guillaume Piolat.\r\n * Modified and ported to Unity by Justin Hawkins 2014\r\n * \r\n * \r\n */\r\n\r\nusing UnityEngine;\r\n\r\nnamespace Scatterer {\r\n\t/*\r\n\t * Extend the base class OceanNode to provide the data need \r\n\t * to create the waves using fourier transform which can then be applied\r\n\t * to the projected grid handled by the OceanNode.\r\n\t * All the fourier transforms are performed on the GPU\r\n\t */\r\n\tpublic class OceanFFTgpu: OceanNode {\r\n\r\n\t\tWriteFloat m_writeFloat;\r\n\r\n\t\tpublic float WAVE_CM = 0.23f;\t// Eq 59\r\n\t\tpublic float WAVE_KM = 370.0f;\t// Eq 59\r\n\r\n\t\t[Persistent] public float AMP = 1.0f;\r\n\t\t\r\n\t\tMaterial m_initSpectrumMat, m_initDisplacementMat;\r\n\t\t\r\n\t\tpublic int mapsAniso = 2;\r\n\r\n\t\t[Persistent] public float m_windSpeed = 5.0f;\t\t\t\t\t\t\t//A higher wind speed gives greater swell to the waves\r\n\t\t[Persistent] public float m_omega = 0.84f;\t\t\t\t\t\t\t\t//A lower number means the waves last longer and will build up larger waves\r\n\t\t[Persistent] public float m_gravity = 9.81f;\r\n\r\n\t\tpublic Vector4 m_gridSizes = new Vector4(5488, 392, 28, 2);\t\t\t\t//Size in meters (i.e. in spatial domain) of each grid\r\n\t\tpublic Vector4 m_choppyness = new Vector4(2.3f, 2.1f, 1.3f, 0.9f);\t\t//strenght of sideways displacement for each grid\r\n\r\n\t\tpublic int m_fourierGridSize = 64;                                      //This is the fourier transform size, must pow2 number. Recommend no higher or lower than 64, 128 or 256.\r\n\r\n\t\tprivate int m_varianceSize = 4;\r\n\t\t\r\n\t\tfloat m_fsize;\r\n\t\tfloat m_maxSlopeVariance;\r\n\t\tprotected int m_idx = 0;\r\n\t\tprotected Vector4 m_spectrumOffset;\r\n\t\tprotected Vector4 m_inverseGridSizes;\r\n\t\t\r\n\t\tprotected RenderTexture m_spectrum01, m_spectrum23;\r\n\t\tprotected RenderTexture m_WTable;\r\n\t\t\r\n\t\tpublic bool rendertexturesCreated {\r\n\t\t\tget {\r\n\t\t\t\treturn (m_WTable.IsCreated());\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tRenderTexture[] m_fourierBuffer0, m_fourierBuffer1, m_fourierBuffer2;\r\n\t\tRenderTexture[] m_fourierBuffer3, m_fourierBuffer4;\r\n\t\tpublic RenderTexture m_map0, m_map1, m_map2, m_map3, m_map4;\r\n\r\n\t\tprivate ComputeShader m_varianceShader;\r\n\t\tRenderTexture m_varianceRenderTexture;\r\n\t\t\r\n\t\tTexture3D m_varianceTexture;\r\n\t\tVector2 m_varianceMax;\r\n\t\t\r\n\t\tprotected FourierGPU m_fourier;\r\n\t\t\r\n\t\tpublic override float GetMaxSlopeVariance()\r\n\t\t{\r\n\t\t\treturn m_maxSlopeVariance;\r\n\t\t}\r\n\r\n\t\t[Persistent] public float maxWaveInteractionShipAltitude = 500.0f;\r\n\r\n\t\t// These are all oceanWhiteCaps settings but I add them here so they don't mess up serialization of gui\r\n\t\tpublic float m_foamMipMapBias = -2.0f;\t\t\r\n\t\t[Persistent] public float m_whiteCapStr = 0.1f;\t\t\r\n\t\t[Persistent] public float shoreFoam = 1.0f;\t\t\r\n\t\t[Persistent] public float m_farWhiteCapStr = 0.1f;\r\n\r\n\t\tprivate GPUWaveInteractionHandler waveInteractionHandler = null;\r\n\r\n\t\tpublic void Awake()\r\n\t\t{\r\n\t\t\t\r\n\t\t}\r\n\r\n\t\tpublic override void Init(ProlandManager manager)\r\n\t\t{\r\n\t\t\tbase.Init(manager);\r\n\r\n\t\t\tif (m_gravity == 0f)\r\n\t\t\t{\r\n\t\t\t\tm_gravity = (float)(prolandManager.parentCelestialBody.GeeASL * 9.81d);\r\n\t\t\t}\r\n\t\t\r\n\t\t\tm_initSpectrumMat = new Material(ShaderReplacer.Instance.LoadedShaders[ (\"Proland/Ocean/InitSpectrum\")]);\r\n\t\t\tm_initDisplacementMat = new Material(ShaderReplacer.Instance.LoadedShaders[ (\"Proland/Ocean/InitDisplacement\")]);\r\n\r\n\t\t\tm_fourierGridSize = Scatterer.Instance.mainSettings.m_fourierGridSize;\r\n\t\t\t\r\n\t\t\tif (m_fourierGridSize > 256) {\r\n\t\t\t\tUtils.LogDebug(\"Proland::OceanFFT::Start\t- fourier grid size must not be greater than 256, changing to 256\");\r\n\t\t\t\tm_fourierGridSize = 256;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif (!Mathf.IsPowerOfTwo(m_fourierGridSize)) {\r\n\t\t\t\tUtils.LogDebug(\"Proland::OceanFFT::Start\t- fourier grid size must be pow2 number, changing to nearest pow2 number\");\r\n\t\t\t\tm_fourierGridSize = Mathf.NextPowerOfTwo(m_fourierGridSize);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tm_fsize = (float) m_fourierGridSize;\r\n\t\t\tm_spectrumOffset = new Vector4(1.0f + 0.5f / m_fsize, 1.0f + 0.5f / m_fsize, 0, 0);\r\n\t\t\t\r\n\t\t\t\r\n\t\t\tfloat factor = 2.0f * Mathf.PI * m_fsize;\r\n\t\t\tm_inverseGridSizes = new Vector4(factor / m_gridSizes.x, factor / m_gridSizes.y, factor / m_gridSizes.z, factor / m_gridSizes.w);\r\n\t\t\t\r\n\t\t\t\r\n\t\t\tm_fourier = new FourierGPU(m_fourierGridSize);\r\n\t\t\t\r\n\t\t\tm_writeFloat = new WriteFloat(m_fourierGridSize, m_fourierGridSize);\r\n\r\n\t\t\tm_varianceSize = SystemInfo.supportsComputeShaders ? 16 : 4;\r\n\r\n\t\t\t//Create the data needed to make the waves each frame\r\n\t\t\tCreateRenderTextures();\r\n\t\t\tGenerateWavesSpectrum();\r\n\t\t\tCreateWTable();\r\n\t\t\t\r\n\t\t\tm_initSpectrumMat.SetTexture (ShaderProperties._Spectrum01_PROPERTY, m_spectrum01);\r\n\t\t\tm_initSpectrumMat.SetTexture (ShaderProperties._Spectrum23_PROPERTY, m_spectrum23);\r\n\t\t\tm_initSpectrumMat.SetTexture (ShaderProperties._WTable_PROPERTY, m_WTable);\r\n\t\t\tm_initSpectrumMat.SetVector (ShaderProperties._Offset_PROPERTY, m_spectrumOffset);\r\n\t\t\tm_initSpectrumMat.SetVector (ShaderProperties._InverseGridSizes_PROPERTY, m_inverseGridSizes);\r\n\t\t\t\r\n\t\t\tm_initDisplacementMat.SetVector (ShaderProperties._InverseGridSizes_PROPERTY, m_inverseGridSizes);\r\n\r\n\t\t\tm_oceanMaterial.SetVector (ShaderProperties._Ocean_MapSize_PROPERTY, new Vector2(m_fsize, m_fsize));\r\n\t\t\tm_oceanMaterial.SetVector (ShaderProperties._Ocean_Choppyness_PROPERTY, m_choppyness);\r\n\t\t\tm_oceanMaterial.SetVector (ShaderProperties._Ocean_GridSizes_PROPERTY, m_gridSizes);\r\n\r\n\t\t\tUtils.EnableOrDisableShaderKeywords (m_oceanMaterial, \"FOAM_ON\", \"FOAM_OFF\", false);\r\n\r\n\t\t\tif (SystemInfo.supportsAsyncGPUReadback && SystemInfo.supportsComputeShaders && Scatterer.Instance.mainSettings.oceanCraftWaveInteractions)\r\n\t\t\t{\r\n\t\t\t\twaveInteractionHandler = new GPUWaveInteractionHandler(maxWaveInteractionShipAltitude, prolandManager.parentCelestialBody.isHomeWorld);\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tVector2 GetSlopeVariances(Vector2 k, float A, float B, float C, float spectrumX, float spectrumY) {\r\n\t\t\tfloat w = 1.0f - Mathf.Exp(A * k.x * k.x + B * k.x * k.y + C * k.y * k.y);\r\n\t\t\treturn new Vector2((k.x * k.x) * w, (k.y * k.y) * w) * (spectrumX * spectrumX + spectrumY * spectrumY) * 2.0f;\r\n\t\t}\r\n\t\t\r\n\r\n\t\t/// <summary>\r\n\t\t/// Iterate over the spectrum and find the variance.\r\n\t\t/// Use in the BRDF equations.\r\n\t\t/// </summary>\r\n\t\tVector2 ComputeVariance(float slopeVarianceDelta, float[] inSpectrum01, float[] inSpectrum23, float idxX, float idxY, float idxZ) {\r\n\t\t\tconst float SCALE = 10.0f;\r\n\t\t\t\r\n\t\t\tfloat A = Mathf.Pow(idxX / ((float) m_varianceSize - 1.0f), 4.0f) * SCALE;\r\n\t\t\tfloat C = Mathf.Pow(idxZ / ((float) m_varianceSize - 1.0f), 4.0f) * SCALE;\r\n\t\t\tfloat B = (2.0f * idxY / ((float) m_varianceSize - 1.0f) - 1.0f) * Mathf.Sqrt(A * C);\r\n\t\t\tA = -0.5f * A;\r\n\t\t\tB = -B;\r\n\t\t\tC = -0.5f * C;\r\n\t\t\t\r\n\t\t\tVector2 slopeVariances = new Vector2(slopeVarianceDelta, slopeVarianceDelta);\r\n\t\t\t\r\n\t\t\tfor (int x = 0; x < m_fourierGridSize; x++) {\r\n\t\t\t\tfor (int y = 0; y < m_fourierGridSize; y++) {\r\n\t\t\t\t\tint i = x >= m_fsize / 2.0f ? x - m_fourierGridSize : x;\r\n\t\t\t\t\tint j = y >= m_fsize / 2.0f ? y - m_fourierGridSize : y;\r\n\t\t\t\t\t\r\n\t\t\t\t\tVector2 k = new Vector2(i, j) * 2.0f * Mathf.PI;\r\n\t\t\t\t\t\r\n\t\t\t\t\tslopeVariances += GetSlopeVariances(k / m_gridSizes.x, A, B, C, inSpectrum01[(x + y * m_fourierGridSize) * 4 + 0], inSpectrum01[(x + y * m_fourierGridSize) * 4 + 1]);\r\n\t\t\t\t\tslopeVariances += GetSlopeVariances(k / m_gridSizes.y, A, B, C, inSpectrum01[(x + y * m_fourierGridSize) * 4 + 2], inSpectrum01[(x + y * m_fourierGridSize) * 4 + 3]);\r\n\t\t\t\t\tslopeVariances += GetSlopeVariances(k / m_gridSizes.z, A, B, C, inSpectrum23[(x + y * m_fourierGridSize) * 4 + 0], inSpectrum23[(x + y * m_fourierGridSize) * 4 + 1]);\r\n\t\t\t\t\tslopeVariances += GetSlopeVariances(k / m_gridSizes.w, A, B, C, inSpectrum23[(x + y * m_fourierGridSize) * 4 + 2], inSpectrum23[(x + y * m_fourierGridSize) * 4 + 3]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\treturn slopeVariances;\r\n\t\t}\r\n\t\t\r\n\t\t\r\n\t\t/*\r\n\t\t * Initializes the data to the shader that needs to \r\n\t\t * have the fourier transform applied to it this frame.\r\n\t\t */\r\n\t\tprotected virtual void InitWaveSpectrum(float t)\r\n\t\t{\r\n\t\t\t// init heights (0) and slopes (1,2)\r\n\t\t\tRenderTexture[] buffers012 = new RenderTexture[]\r\n\t\t\t{\r\n\t\t\t\tm_fourierBuffer0[1], m_fourierBuffer1[1], m_fourierBuffer2[1]\r\n\t\t\t};\r\n\t\t\tm_initSpectrumMat.SetFloat (ShaderProperties._T_PROPERTY, t);\r\n\t\t\tRTUtility.MultiTargetBlit(buffers012, m_initSpectrumMat, 0);\r\n\t\t\t\r\n\t\t\t// Init displacement (3,4)\r\n\t\t\tRenderTexture[] buffers34 = new RenderTexture[]\r\n\t\t\t{\r\n\t\t\t\tm_fourierBuffer3[1], m_fourierBuffer4[1]\r\n\t\t\t};\r\n\t\t\tm_initDisplacementMat.SetTexture (ShaderProperties._Buffer1_PROPERTY, m_fourierBuffer1[1]);\r\n\t\t\tm_initDisplacementMat.SetTexture (ShaderProperties._Buffer2_PROPERTY, m_fourierBuffer2[1]);\r\n\t\t\t//\t\t\tRTUtility.MultiTargetBlit(buffers34, m_initDisplacementMat);\r\n\t\t\tRTUtility.MultiTargetBlit(buffers34, m_initDisplacementMat, 0);\r\n\t\t}\r\n\t\r\n\r\n\t\tpublic override void UpdateNode()\r\n\t\t{\r\n\t\t\tif (!prolandManager.skyNode.inScaledSpace || (prolandManager.skyNode.simulateOceanInteraction && (waveInteractionHandler != null)))\r\n\t\t\t{\r\n\t\t\t\t//keep within low float exponents, otherwise we lose precision\r\n\t\t\t\tfloat t = (float)(Planetarium.GetUniversalTime() % 100000.0);\r\n\r\n\t\t\t\tInitWaveSpectrum(t);\r\n\t\t\t\t\r\n\t\t\t\t//Perform fourier transform and record what is the current index\r\n\t\t\t\tm_idx = m_fourier.PeformFFT(m_fourierBuffer0, m_fourierBuffer1, m_fourierBuffer2);\r\n\t\t\t\tm_fourier.PeformFFT(m_fourierBuffer3, m_fourierBuffer4);\r\n\t\t\t\t\r\n\t\t\t\t//Copy the contents of the completed fourier transform to the map textures.\r\n\t\t\t\t//You could just use the buffer textures (m_fourierBuffer0,1,2,etc) to read from for the ocean shader \r\n\t\t\t\t//but they need to have mipmaps and unity updates the mipmaps\r\n\t\t\t\t//every time the texture is renderer into. This impacts performance during fourier transform stage as mipmaps would be updated every pass\r\n\t\t\t\t//and there is no way to disable and then enable mipmaps on render textures in Unity at time of writting.\r\n\t\t\t\t\r\n\t\t\t\tGraphics.Blit(m_fourierBuffer0[m_idx], m_map0);\r\n\t\t\t\tGraphics.Blit(m_fourierBuffer1[m_idx], m_map1);\r\n\t\t\t\tGraphics.Blit(m_fourierBuffer2[m_idx], m_map2);\r\n\t\t\t\tGraphics.Blit(m_fourierBuffer3[m_idx], m_map3);\r\n\t\t\t\tGraphics.Blit(m_fourierBuffer4[m_idx], m_map4);\r\n\t\t\t\t\r\n\t\t\t\t//m_oceanMaterial.SetFloat (ShaderProperties._Ocean_HeightOffset_PROPERTY, m_oceanLevel);\t\t\t\t\r\n\t\t\t\tm_oceanMaterial.SetFloat (ShaderProperties._Ocean_HeightOffset_PROPERTY, 0f);\r\n\t\t\t\tif (SystemInfo.supportsComputeShaders)\r\n\t\t\t\t{\r\n\t\t\t\t\tm_oceanMaterial.SetTexture (ShaderProperties._Ocean_Variance_PROPERTY, m_varianceRenderTexture );\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tm_oceanMaterial.SetTexture (ShaderProperties._Ocean_Variance_PROPERTY, m_varianceTexture);\r\n\t\t\t\t}\r\n\t\t\t\tm_oceanMaterial.SetTexture (ShaderProperties._Ocean_Map0_PROPERTY, m_map0);\r\n\t\t\t\tm_oceanMaterial.SetTexture (ShaderProperties._Ocean_Map1_PROPERTY, m_map1);\r\n\t\t\t\tm_oceanMaterial.SetTexture (ShaderProperties._Ocean_Map2_PROPERTY, m_map2);\r\n\t\t\t\tm_oceanMaterial.SetTexture (ShaderProperties._Ocean_Map3_PROPERTY, m_map3);\r\n\t\t\t\tm_oceanMaterial.SetTexture (ShaderProperties._Ocean_Map4_PROPERTY, m_map4);\r\n\t\t\t\tm_oceanMaterial.SetVector (ShaderProperties._VarianceMax_PROPERTY, SystemInfo.supportsComputeShaders? Vector2.one : m_varianceMax);\r\n\t\t\t\t\r\n\t\t\t\t// don't need to be done every frame\r\n\t\t\t\tif (waveInteractionHandler != null)\r\n\t\t\t\t{\r\n\t\t\t\t\twaveInteractionHandler.SetMaterialProperties(m_choppyness, m_gridSizes, m_map0, m_map3, m_map4);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tbase.UpdateNode();\r\n\t\t}\r\n\t\t\r\n\t\tpublic override void OnDestroy()\r\n\t\t{\r\n\t\t\tbase.OnDestroy();\r\n\t\t\t\r\n\t\t\tm_map0.Release();\r\n\t\t\tm_map1.Release();\r\n\t\t\tm_map2.Release();\r\n\t\t\tm_map3.Release();\r\n\t\t\tm_map4.Release();\r\n\t\t\t\r\n\t\t\tm_spectrum01.Release();\r\n\t\t\tm_spectrum23.Release();\r\n\t\t\t\r\n\t\t\tm_WTable.Release();\r\n\t\t\t\r\n\t\t\tfor (int i = 0; i < 2; i++) {\r\n\t\t\t\tm_fourierBuffer0[i].Release();\r\n\t\t\t\tm_fourierBuffer1[i].Release();\r\n\t\t\t\tm_fourierBuffer2[i].Release();\r\n\t\t\t\tm_fourierBuffer3[i].Release();\r\n\t\t\t\tm_fourierBuffer4[i].Release();\r\n\t\t\t}\r\n\r\n\t\t\tif (waveInteractionHandler != null)\r\n            {\r\n\t\t\t\twaveInteractionHandler.Cleanup();\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tprotected virtual void CreateRenderTextures()\r\n\t\t{\r\n\t\t\tRenderTextureFormat mapFormat = RenderTextureFormat.ARGBFloat;\r\n\t\t\tRenderTextureFormat fourierTransformformat = RenderTextureFormat.ARGBHalf;\r\n\t\t\t\r\n\t\t\t//These texture hold the actual data use in the ocean renderer\r\n\t\t\tCreateMap(ref m_map0, mapFormat, mapsAniso, true);\r\n\t\t\tCreateMap(ref m_map1, mapFormat, mapsAniso, true);\r\n\t\t\tCreateMap(ref m_map2, mapFormat, mapsAniso, true);\r\n\t\t\tCreateMap(ref m_map3, mapFormat, mapsAniso, true);\r\n\t\t\tCreateMap(ref m_map4, mapFormat, mapsAniso, true);\r\n\t\t\t\r\n\t\t\t//These textures are used to perform the fourier transform\r\n\t\t\tCreateBuffer(ref m_fourierBuffer0, fourierTransformformat); //heights\r\n\t\t\tCreateBuffer(ref m_fourierBuffer1, fourierTransformformat); // slopes X\r\n\t\t\tCreateBuffer(ref m_fourierBuffer2, fourierTransformformat); // slopes Y\r\n\t\t\tCreateBuffer(ref m_fourierBuffer3, fourierTransformformat); // displacement X\r\n\t\t\tCreateBuffer(ref m_fourierBuffer4, fourierTransformformat); // displacement Y\r\n\t\t\t\r\n\t\t\t//These textures hold the specturm the fourier transform is performed on\r\n\t\t\tm_spectrum01 = new RenderTexture(m_fourierGridSize, m_fourierGridSize, 0, fourierTransformformat);\r\n\t\t\tm_spectrum01.filterMode = FilterMode.Point;\r\n\t\t\tm_spectrum01.wrapMode = TextureWrapMode.Repeat;\r\n\t\t\tm_spectrum01.enableRandomWrite = false;\r\n\t\t\tm_spectrum01.Create();\r\n\t\t\t\r\n\t\t\tm_spectrum23 = new RenderTexture(m_fourierGridSize, m_fourierGridSize, 0, fourierTransformformat);\r\n\t\t\tm_spectrum23.filterMode = FilterMode.Point;\r\n\t\t\tm_spectrum23.wrapMode = TextureWrapMode.Repeat;\r\n\t\t\tm_spectrum23.enableRandomWrite = false;\r\n\t\t\tm_spectrum23.Create();\r\n\t\t\t\r\n\r\n\t\t\tm_WTable = new RenderTexture(m_fourierGridSize, m_fourierGridSize, 0, fourierTransformformat);\r\n\t\t\tm_WTable.filterMode = FilterMode.Point;\r\n\t\t\tm_WTable.wrapMode = TextureWrapMode.Clamp;\r\n\t\t\tm_WTable.enableRandomWrite = false;\r\n\t\t\tm_WTable.Create();\r\n\r\n\t\t\tif (SystemInfo.supportsComputeShaders)\r\n\t\t\t{\r\n\t\t\t\tm_varianceRenderTexture = new RenderTexture(m_varianceSize, m_varianceSize, 0, RenderTextureFormat.RHalf);\r\n\t\t\t\tm_varianceRenderTexture.volumeDepth = m_varianceSize;\r\n\t\t\t\tm_varianceRenderTexture.wrapMode = TextureWrapMode.Clamp;\r\n\t\t\t\tm_varianceRenderTexture.filterMode = FilterMode.Bilinear;\r\n\t\t\t\tm_varianceRenderTexture.dimension = UnityEngine.Rendering.TextureDimension.Tex3D;\r\n\t\t\t\tm_varianceRenderTexture.enableRandomWrite = true;\r\n\t\t\t\tm_varianceRenderTexture.useMipMap = true;\r\n\t\t\t\tm_varianceRenderTexture.Create();\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tm_varianceTexture = new Texture3D (m_varianceSize, m_varianceSize, m_varianceSize, TextureFormat.ARGB32, true);\r\n\t\t\t\tm_varianceTexture.wrapMode = TextureWrapMode.Clamp;\r\n\t\t\t\tm_varianceTexture.filterMode = FilterMode.Bilinear;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t}\r\n\t\t\r\n\t\tprotected void CreateBuffer(ref RenderTexture[] tex, RenderTextureFormat format)\r\n\t\t{\r\n\t\t\ttex = new RenderTexture[2];\r\n\t\t\t\r\n\t\t\tfor (int i = 0; i < 2; i++)\r\n\t\t\t{\r\n\t\t\t\ttex[i] = new RenderTexture(m_fourierGridSize, m_fourierGridSize, 0, format);\r\n\t\t\t\ttex[i].filterMode = FilterMode.Point;\r\n\t\t\t\ttex[i].wrapMode = TextureWrapMode.Clamp;\r\n\t\t\t\ttex[i].Create();\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tprotected void CreateMap(ref RenderTexture map, RenderTextureFormat format, int ansio, bool useMipMaps)\r\n\t\t{\r\n\t\t\tmap = new RenderTexture(m_fourierGridSize, m_fourierGridSize, 0, format);\r\n\t\t\tmap.filterMode = FilterMode.Trilinear;\r\n\t\t\tmap.wrapMode = TextureWrapMode.Repeat;\r\n\t\t\tmap.anisoLevel = ansio;\r\n\t\t\tmap.useMipMap = useMipMaps;\r\n\t\t\tmap.Create();\r\n\t\t}\r\n\t\t\r\n\t\tfloat sqr(float x) {\r\n\t\t\treturn x * x;\r\n\t\t}\r\n\t\t\r\n\t\tfloat omega(float k)\r\n\t\t{\r\n\t\t\treturn Mathf.Sqrt(m_gravity * k * (1.0f + sqr(k / WAVE_KM)));\r\n\t\t} // Eq 24\r\n\t\t\r\n\t\tfloat Spectrum(float kx, float ky, bool omnispectrum)\r\n\t\t{\r\n\t\t\t//I know this is a big chunk of ugly math but dont worry to much about what it all means\r\n\t\t\t//It recreates a statistcally representative model of a wave spectrum in the frequency domain.\r\n\r\n\t\t\t//How to rotate the windDirection in the spectrum: https://github.com/Scrawk/Ceto/blob/07f8f45955a989983fe2330ea17eaf3f44c82031/Assets/Ceto/Scripts/Spectrum/CustomWaveSpectrumExample.cs#L248-L250\r\n\t\t\t//But I prefere to rotate the Ux and Uy axis, that way can change the wind direction without regenerating spectrum\r\n\r\n\t\t\tfloat U10 = m_windSpeed;\r\n\t\t\t\r\n\t\t\t// phase speed\r\n\t\t\tfloat k = Mathf.Sqrt(kx * kx + ky * ky);\r\n\t\t\tfloat c = omega(k) / k;\r\n\t\t\t\r\n\t\t\t// spectral peak\r\n\t\t\tfloat kp = m_gravity * sqr(m_omega / U10); // after Eq 3\r\n\t\t\tfloat cp = omega(kp) / kp;\r\n\t\t\t\r\n\t\t\t// friction velocity\r\n\t\t\tfloat z0 = 3.7e-5f * sqr(U10) / m_gravity * Mathf.Pow(U10 / cp, 0.9f); // Eq 66\r\n\t\t\tfloat u_star = 0.41f * U10 / Mathf.Log(10.0f / z0); // Eq 60\r\n\t\t\t\r\n\t\t\tfloat Lpm = Mathf.Exp(-5.0f / 4.0f * sqr(kp / k)); // after Eq 3\r\n\t\t\tfloat gamma = (m_omega < 1.0f) ? 1.7f : 1.7f + 6.0f * Mathf.Log(m_omega); // after Eq 3 // log10 or log?\r\n\t\t\tfloat sigma = 0.08f * (1.0f + 4.0f / Mathf.Pow(m_omega, 3.0f)); // after Eq 3\r\n\t\t\tfloat Gamma = Mathf.Exp(-1.0f / (2.0f * sqr(sigma)) * sqr(Mathf.Sqrt(k / kp) - 1.0f));\r\n\t\t\tfloat Jp = Mathf.Pow(gamma, Gamma); // Eq 3\r\n\t\t\tfloat Fp = Lpm * Jp * Mathf.Exp(-m_omega / Mathf.Sqrt(10.0f) * (Mathf.Sqrt(k / kp) - 1.0f)); // Eq 32\r\n\t\t\tfloat alphap = 0.006f * Mathf.Sqrt(m_omega); // Eq 34\r\n\t\t\tfloat Bl = 0.5f * alphap * cp / c * Fp; // Eq 31\r\n\t\t\t\r\n\t\t\tfloat alpham = 0.01f * (u_star < WAVE_CM ? 1.0f + Mathf.Log(u_star / WAVE_CM) : 1.0f + 3.0f * Mathf.Log(u_star / WAVE_CM)); // Eq 44\r\n\t\t\tfloat Fm = Mathf.Exp(-0.25f * sqr(k / WAVE_KM - 1.0f)); // Eq 41\r\n\t\t\tfloat Bh = 0.5f * alpham * WAVE_CM / c * Fm * Lpm; // Eq 40 (fixed)\r\n\t\t\t\r\n\t\t\tBh *= Lpm; // bug fix???\r\n\t\t\t\r\n\t\t\tif (omnispectrum) return AMP * (Bl + Bh) / (k * sqr(k)); // Eq 30\r\n\t\t\t\r\n\t\t\tfloat a0 = Mathf.Log(2.0f) / 4.0f;\r\n\t\t\tfloat ap = 4.0f;\r\n\t\t\tfloat am = 0.13f * u_star / WAVE_CM; // Eq 59\r\n\t\t\tfloat Delta = (float) System.Math.Tanh(a0 + ap * Mathf.Pow(c / cp, 2.5f) + am * Mathf.Pow(WAVE_CM / c, 2.5f)); // Eq 57\r\n\t\t\t\r\n\t\t\tfloat phi = Mathf.Atan2(ky, kx);\r\n\t\t\t\r\n\t\t\tif (kx < 0.0f) return 0.0f;\r\n\t\t\t\r\n\t\t\tBl *= 2.0f;\r\n\t\t\tBh *= 2.0f;\r\n\t\t\t\r\n\t\t\t// remove waves perpendicular to wind dir\r\n\t\t\tfloat tweak = Mathf.Sqrt(Mathf.Max(kx / Mathf.Sqrt(kx * kx + ky * ky), 0.0f));\r\n\t\t\t\r\n\t\t\treturn AMP * (Bl + Bh) * (1.0f + Delta * Mathf.Cos(2.0f * phi)) / (2.0f * Mathf.PI * sqr(sqr(k))) * tweak; // Eq 67\r\n\t\t}\r\n\t\t\r\n\t\tVector2 GetSpectrumSample(float i, float j, float lengthScale, float kMin)\r\n\t\t{\r\n\t\t\tfloat dk = 2.0f * Mathf.PI / lengthScale;\r\n\t\t\tfloat kx = i * dk;\r\n\t\t\tfloat ky = j * dk;\r\n\t\t\tVector2 result = new Vector2(0.0f, 0.0f);\r\n\t\t\t\r\n\t\t\tfloat rnd = UnityEngine.Random.value;\r\n\t\t\t\r\n\t\t\tif (Mathf.Abs(kx) >= kMin || Mathf.Abs(ky) >= kMin) {\r\n\t\t\t\tfloat S = Spectrum(kx, ky, false);\r\n\t\t\t\tfloat h = Mathf.Sqrt(S / 2.0f) * dk;\r\n\t\t\t\t\r\n\t\t\t\tfloat phi = rnd * 2.0f * Mathf.PI;\r\n\t\t\t\tresult.x = h * Mathf.Cos(phi);\r\n\t\t\t\tresult.y = h * Mathf.Sin(phi);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\treturn result;\r\n\t\t}\r\n\t\t\r\n\t\tfloat GetSlopeVariance(float kx, float ky, Vector2 spectrumSample)\r\n\t\t{\r\n\t\t\tfloat kSquare = kx * kx + ky * ky;\r\n\t\t\tfloat real = spectrumSample.x;\r\n\t\t\tfloat img = spectrumSample.y;\r\n\t\t\tfloat hSquare = real * real + img * img;\r\n\t\t\treturn kSquare * hSquare * 2.0f;\r\n\t\t}\r\n\t\t\r\n\t\tvoid GenerateWavesSpectrum()\r\n\t\t{\r\n\t\t\t// Slope variance due to all waves, by integrating over the full spectrum.\r\n\t\t\t// Used by the BRDF rendering model\r\n\t\t\tfloat theoreticSlopeVariance = 0.0f;\r\n\t\t\tfloat k = 5e-3f;\r\n\t\t\twhile (k < 1e3f) {\r\n\t\t\t\tfloat nextK = k * 1.001f;\r\n\t\t\t\ttheoreticSlopeVariance += k * k * Spectrum(k, 0, true) * (nextK - k);\r\n\t\t\t\tk = nextK;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tfloat[] spectrum01 = new float[m_fourierGridSize * m_fourierGridSize * 4];\r\n\t\t\tfloat[] spectrum23 = new float[m_fourierGridSize * m_fourierGridSize * 4];\r\n\r\n\t\t\tint idx;\r\n\t\t\tfloat i;\r\n\t\t\tfloat j;\r\n\t\t\tfloat totalSlopeVariance = 0.0f;\r\n\t\t\tVector2 sample12XY;\r\n\t\t\tVector2 sample12ZW;\r\n\t\t\tVector2 sample34XY;\r\n\t\t\tVector2 sample34ZW;\r\n\t\t\t\r\n\t\t\tUnityEngine.Random.seed = 0;\r\n\t\t\t\r\n\t\t\tfor (int x = 0; x < m_fourierGridSize; x++)\r\n\t\t\t{\r\n\t\t\t\tfor (int y = 0; y < m_fourierGridSize; y++)\r\n\t\t\t\t{\r\n\t\t\t\t\tidx = x + y * m_fourierGridSize;\r\n\t\t\t\t\ti = (x >= m_fourierGridSize / 2) ? (float)(x - m_fourierGridSize) : (float) x;\r\n\t\t\t\t\tj = (y >= m_fourierGridSize / 2) ? (float)(y - m_fourierGridSize) : (float) y;\r\n\t\t\t\t\t\r\n\t\t\t\t\tsample12XY = GetSpectrumSample(i, j, m_gridSizes.x, Mathf.PI / m_gridSizes.x);\r\n\t\t\t\t\tsample12ZW = GetSpectrumSample(i, j, m_gridSizes.y, Mathf.PI * m_fsize / m_gridSizes.x);\r\n\t\t\t\t\tsample34XY = GetSpectrumSample(i, j, m_gridSizes.z, Mathf.PI * m_fsize / m_gridSizes.y);\r\n\t\t\t\t\tsample34ZW = GetSpectrumSample(i, j, m_gridSizes.w, Mathf.PI * m_fsize / m_gridSizes.z);\r\n\r\n\t\t\t\t\tspectrum01[idx * 4 + 0] = sample12XY.x;\r\n\t\t\t\t\tspectrum01[idx * 4 + 1] = sample12XY.y;\r\n\t\t\t\t\tspectrum01[idx * 4 + 2] = sample12ZW.x;\r\n\t\t\t\t\tspectrum01[idx * 4 + 3] = sample12ZW.y;\r\n\t\t\t\t\t\r\n\t\t\t\t\tspectrum23[idx * 4 + 0] = sample34XY.x;\r\n\t\t\t\t\tspectrum23[idx * 4 + 1] = sample34XY.y;\r\n\t\t\t\t\tspectrum23[idx * 4 + 2] = sample34ZW.x;\r\n\t\t\t\t\tspectrum23[idx * 4 + 3] = sample34ZW.y;\r\n\t\t\t\t\t\r\n\t\t\t\t\ti *= 2.0f * Mathf.PI;\r\n\t\t\t\t\tj *= 2.0f * Mathf.PI;\r\n\t\t\t\t\t\r\n\t\t\t\t\ttotalSlopeVariance += GetSlopeVariance(i / m_gridSizes.x, j / m_gridSizes.x, sample12XY);\r\n\t\t\t\t\ttotalSlopeVariance += GetSlopeVariance(i / m_gridSizes.y, j / m_gridSizes.y, sample12ZW);\r\n\t\t\t\t\ttotalSlopeVariance += GetSlopeVariance(i / m_gridSizes.z, j / m_gridSizes.z, sample34XY);\r\n\t\t\t\t\ttotalSlopeVariance += GetSlopeVariance(i / m_gridSizes.w, j / m_gridSizes.w, sample34ZW);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t//This can be replaced by a texture2D now and the whole thing with a set raw data + apply\r\n\t\t\tm_writeFloat.WriteIntoRenderTexture(m_spectrum01, 4, spectrum01);\r\n\t\t\tm_writeFloat.WriteIntoRenderTexture(m_spectrum23, 4, spectrum23);\r\n\t\t\t\r\n\t\t\tif (!SystemInfo.supportsComputeShaders)\r\n\t\t\t{\r\n\t\t\t\t// Compute variance for the BRDF, copied from the dx9 project\r\n\t\t\t\tfloat slopeVarianceDelta = 0.5f * (theoreticSlopeVariance - totalSlopeVariance);\r\n\r\n\t\t\t\tm_varianceMax = new Vector2 (float.NegativeInfinity, float.NegativeInfinity);\r\n\t\t\t\r\n\t\t\t\tVector2[, , ] variance32bit = new Vector2[m_varianceSize, m_varianceSize, m_varianceSize];\r\n\t\t\t\tColor[] variance8bit = new Color[m_varianceSize * m_varianceSize * m_varianceSize];\r\n\r\n\t\t\t\tfor (int x = 0; x < m_varianceSize; x++)\r\n\t\t\t\t{\r\n\t\t\t\t\tfor (int y = 0; y < m_varianceSize; y++)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tfor (int z = 0; z < m_varianceSize; z++)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tvariance32bit [x, y, z] = ComputeVariance (slopeVarianceDelta, spectrum01, spectrum23, x, y, z);\r\n\r\n\t\t\t\t\t\t\tif (variance32bit [x, y, z].x > m_varianceMax.x)\r\n\t\t\t\t\t\t\t\tm_varianceMax.x = variance32bit [x, y, z].x;\r\n\t\t\t\t\t\t\tif (variance32bit [x, y, z].y > m_varianceMax.y)\r\n\t\t\t\t\t\t\t\tm_varianceMax.y = variance32bit [x, y, z].y;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\r\n\t\t\t\tfor (int x = 0; x < m_varianceSize; x++)\r\n\t\t\t\t{\r\n\t\t\t\t\tfor (int y = 0; y < m_varianceSize; y++)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tfor (int z = 0; z < m_varianceSize; z++)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tidx = x + y * m_varianceSize + z * m_varianceSize * m_varianceSize;\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tvariance8bit [idx] = new Color (variance32bit [x, y, z].x / m_varianceMax.x, variance32bit [x, y, z].y / m_varianceMax.y, 0.0f, 1.0f);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\r\n\t\t\t\tm_varianceTexture.SetPixels (variance8bit);\r\n\t\t\t\tm_varianceTexture.Apply ();\r\n\r\n\t\t\t\tm_maxSlopeVariance = 0.0f;\r\n\t\t\t\tfor (int v = 0; v < m_varianceSize*m_varianceSize*m_varianceSize; v++)\r\n\t\t\t\t{\r\n\t\t\t\t\tm_maxSlopeVariance = Mathf.Max (m_maxSlopeVariance, variance8bit [v].r * m_varianceMax.x);\r\n\t\t\t\t\tm_maxSlopeVariance = Mathf.Max (m_maxSlopeVariance, variance8bit [v].g * m_varianceMax.y);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tm_varianceShader = ShaderReplacer.Instance.LoadedComputeShaders[\"SlopeVariance\"];\r\n\r\n\t\t\t\tm_varianceShader.SetFloat(\"_SlopeVarianceDelta\", 0.5f * (theoreticSlopeVariance - totalSlopeVariance));\r\n\t\t\t\tm_varianceShader.SetFloat(\"_VarianceSize\", (float)m_varianceSize);\r\n\t\t\t\tm_varianceShader.SetFloat(\"_Size\", m_fsize);\r\n\t\t\t\tm_varianceShader.SetVector(\"_GridSizes\", m_gridSizes);\r\n\t\t\t\tm_varianceShader.SetTexture(0, \"_Spectrum01\", m_spectrum01);\r\n\t\t\t\tm_varianceShader.SetTexture(0, \"_Spectrum23\", m_spectrum23);\r\n\t\t\t\tm_varianceShader.SetTexture(0, \"des\", m_varianceRenderTexture);\r\n\t\t\t\t\r\n\t\t\t\tm_varianceShader.Dispatch(0,m_varianceSize/4,m_varianceSize/4,m_varianceSize/4);\r\n\t\t\t\t\r\n\t\t\t\t//Find the maximum value for slope variance\r\n\t\t\t\tComputeBuffer buffer = new ComputeBuffer(m_varianceSize*m_varianceSize*m_varianceSize, sizeof(float));\r\n\t\t\t\tCBUtility.ReadFromRenderTexture(m_varianceRenderTexture, 1, buffer, ShaderReplacer.Instance.LoadedComputeShaders[\"ReadData\"]);\r\n\t\t\t\t\r\n\t\t\t\tfloat[] varianceData = new float[m_varianceSize*m_varianceSize*m_varianceSize];\r\n\t\t\t\tbuffer.GetData(varianceData);\r\n\t\t\t\t\r\n\t\t\t\tm_maxSlopeVariance = 0.0f;\r\n\t\t\t\tfor(int v = 0; v < m_varianceSize*m_varianceSize*m_varianceSize; v++) {\r\n\t\t\t\t\tm_maxSlopeVariance = Mathf.Max(m_maxSlopeVariance, varianceData[v]);\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tbuffer.Release();\r\n\t\t\t}\r\n\t\t\t\r\n\t\t}\r\n\t\t\r\n\t\tvoid CreateWTable()\r\n\t\t{\r\n\t\t\t//Some values need for the InitWaveSpectrum function can be precomputed\r\n\t\t\tVector2 uv, st;\r\n\t\t\tfloat k1, k2, k3, k4, w1, w2, w3, w4;\r\n\t\t\t\r\n\t\t\tfloat[] table = new float[m_fourierGridSize * m_fourierGridSize * 4];\r\n\t\t\t\r\n\t\t\tfor (int x = 0; x < m_fourierGridSize; x++) {\r\n\t\t\t\tfor (int y = 0; y < m_fourierGridSize; y++) {\r\n\t\t\t\t\tuv = new Vector2(x, y) / m_fsize;\r\n\t\t\t\t\t\r\n\t\t\t\t\tst.x = uv.x > 0.5f ? uv.x - 1.0f : uv.x;\r\n\t\t\t\t\tst.y = uv.y > 0.5f ? uv.y - 1.0f : uv.y;\r\n\t\t\t\t\t\r\n\t\t\t\t\tk1 = (st * m_inverseGridSizes.x).magnitude;\r\n\t\t\t\t\tk2 = (st * m_inverseGridSizes.y).magnitude;\r\n\t\t\t\t\tk3 = (st * m_inverseGridSizes.z).magnitude;\r\n\t\t\t\t\tk4 = (st * m_inverseGridSizes.w).magnitude;\r\n\t\t\t\t\t\r\n\t\t\t\t\tw1 = Mathf.Sqrt(m_gravity * k1 * (1.0f + k1 * k1 / (WAVE_KM * WAVE_KM)));\r\n\t\t\t\t\tw2 = Mathf.Sqrt(m_gravity * k2 * (1.0f + k2 * k2 / (WAVE_KM * WAVE_KM)));\r\n\t\t\t\t\tw3 = Mathf.Sqrt(m_gravity * k3 * (1.0f + k3 * k3 / (WAVE_KM * WAVE_KM)));\r\n\t\t\t\t\tw4 = Mathf.Sqrt(m_gravity * k4 * (1.0f + k4 * k4 / (WAVE_KM * WAVE_KM)));\r\n\t\t\t\t\t\r\n\t\t\t\t\ttable[(x + y * m_fourierGridSize) * 4 + 0] = w1;\r\n\t\t\t\t\ttable[(x + y * m_fourierGridSize) * 4 + 1] = w2;\r\n\t\t\t\t\ttable[(x + y * m_fourierGridSize) * 4 + 2] = w3;\r\n\t\t\t\t\ttable[(x + y * m_fourierGridSize) * 4 + 3] = w4;\r\n\t\t\t\t\t\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tm_writeFloat.WriteIntoRenderTexture(m_WTable, 4, table);\r\n\t\t}\r\n\t\t\r\n\t\tVector2 GetSpectrum(float t, float w, float s0x, float s0y, float s0cx, float s0cy)\r\n\t\t{\r\n\t\t\tfloat c = Mathf.Cos(w * t);\r\n\t\t\tfloat s = Mathf.Sin(w * t);\r\n\t\t\treturn new Vector2((s0x + s0cx) * c - (s0y + s0cy) * s, (s0x - s0cx) * s + (s0y - s0cy) * c);\r\n\t\t}\r\n\t\t\r\n\t\tVector2 COMPLEX(Vector2 z)\r\n\t\t{\r\n\t\t\treturn new Vector2(-z.y, z.x); // returns i times z (complex number)\r\n\t\t}\r\n\t\t\r\n\t\tint BitReverse(int i)\r\n\t\t{\r\n\t\t\tint j = i;\r\n\t\t\tint Sum = 0;\r\n\t\t\tint W = 1;\r\n\t\t\tint M = m_fourierGridSize / 2;\r\n\t\t\twhile (M != 0)\r\n\t\t\t{\r\n\t\t\t\tj = ((i & M) > M - 1) ? 1 : 0;\r\n\t\t\t\tSum += j * W;\r\n\t\t\t\tW *= 2;\r\n\t\t\t\tM /= 2;\r\n\t\t\t}\r\n\t\t\treturn Sum;\r\n\t\t}\r\n\r\n\t\t//FixedUpdate is responsible for physics, apply part displacement here\r\n\t\tpublic void FixedUpdate()\r\n\t\t{\r\n\t\t\tif (waveInteractionHandler != null && prolandManager.GetSkyNode().simulateOceanInteraction)\r\n\t\t\t{\r\n\t\t\t\twaterHeightAtCameraPosition = waveInteractionHandler.UpdateInteractions(height, waterHeightAtCameraPosition, ux.ToVector3(), uy.ToVector3(), offsetVector3);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t\r\n}"
  },
  {
    "path": "scatterer/Effects/Proland/Ocean/OceanNode.cs",
    "content": "/*\r\n * Proland: a procedural landscape rendering library.\r\n * Copyright (c) 2008-2011 INRIA\r\n *\r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n *\r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n *\r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n *\r\n * Proland is distributed under a dual-license scheme.\r\n * You can obtain a specific license from Inria: proland-licensing@inria.fr.\r\n *\r\n * Authors: Eric Bruneton, Antoine Begault, Guillaume Piolat.\r\n * Modified and ported to Unity by Justin Hawkins 2014\r\n *\r\n *\r\n */\r\nusing UnityEngine;\r\nusing System.Collections;\r\nusing System.IO;\r\n\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\nusing UnityEngine.Rendering;\r\n\r\nusing KSP.IO;\r\nusing UnityEngine.XR;\r\n\r\nnamespace Scatterer\r\n{\r\n\t//TODO: refactor and clean up this class\r\n\tpublic abstract class OceanNode: MonoBehaviour\r\n\t{\r\n\t\tpublic UrlDir.UrlConfig configUrl;\r\n\t\t\r\n\t\tpublic ProlandManager prolandManager;\r\n\r\n\t\tpublic Material m_oceanMaterial;\r\n\t\tOceanRenderingHook oceanRenderingHook;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic Vector3 m_oceanUpwellingColor = new Vector3 (0.0039f, 0.0156f, 0.047f);\r\n\r\n\t\t[Persistent]\r\n\t\tpublic Vector3 m_UnderwaterColor = new Vector3 (0.1f, 0.75f, 0.8f);\r\n\r\n\t\t//Size of each grid in the projected grid. (number of pixels on screen)\r\n\t\tpublic int m_resolution = 4;\r\n\t\tint m_screenWidth;\r\n\t\tint m_screenHeight;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic float offScreenVertexStretch = 1.25f;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic float alphaRadius = 3000f;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic float transparencyDepth = 60f;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic float darknessDepth = 1000f;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic float refractionIndex = 1.33f;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic float skyReflectionStrength = 1f;\r\n\r\n\t\tpublic bool isUnderwater = false;\r\n\t\tbool underwaterMode = false;\r\n\t\tbool oceanDraw = true;\r\n\r\n\t\tpublic int numGrids;\r\n\t\tMesh[] m_screenGrids;\r\n\r\n\t\tGameObject[] waterGameObjects;\r\n\t\tpublic MeshRenderer[] waterMeshRenderers;\r\n\t\tMeshFilter[] waterMeshFilters;\r\n\t\t\r\n\t\tpublic GenericLocalAtmosphereContainer underwaterScattering;\r\n\t\tpublic Material underwaterMaterial;\r\n\r\n\t\tpublic Vector3 offsetVector3{\r\n\t\t\tget {\r\n\t\t\t\treturn offset.ToVector3();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic double height = 0;\r\n\t\tpublic Vector3d2 m_Offset = Vector3d2.Zero();\r\n\t\tpublic Vector3d2 offset = Vector3d2.Zero(), ux=Vector3d2.Zero(), uy=Vector3d2.Zero(), uz=Vector3d2.Zero(), oo=Vector3d2.Zero();\r\n\r\n\t\tOceanCameraUpdateHook oceanCameraProjectionMatModifier;\r\n\t\tUnderwaterDimmingHook underwaterDimmingHook;\r\n\r\n\t\tpublic float planetOpacity=1f; //planetOpacity to fade out the ocean when PQS is fading out\r\n\r\n\t\t//Concrete classes must provide a function that returns the\r\n\t\t//variance of the waves need for the BRDF rendering of waves\r\n\t\tpublic abstract float GetMaxSlopeVariance ();\r\n\r\n\t\t//caustics\r\n\t\t[Persistent]\r\n\t\tpublic string causticsTexturePath=\"\";\r\n\t\t[Persistent]\r\n\t\tpublic Vector2 causticsLayer1Scale;\r\n\t\t[Persistent]\r\n\t\tpublic Vector2 causticsLayer1Speed;\r\n\t\t[Persistent]\r\n\t\tpublic Vector2 causticsLayer2Scale;\r\n\t\t[Persistent]\r\n\t\tpublic Vector2 causticsLayer2Speed;\r\n\t\t[Persistent]\r\n\t\tpublic float causticsMultiply;\r\n\t\t[Persistent]\r\n\t\tpublic float causticsUnderwaterLightBoost;\r\n\t\t[Persistent]\r\n\t\tpublic float causticsMinBrightness;\r\n\t\t[Persistent]\r\n\t\tpublic float causticsBlurDepth;\r\n\t\t[Persistent]\r\n\t\tpublic float lightRaysStrength=1f;\r\n\r\n\t\tpublic CausticsShadowMaskModulate causticsShadowMaskModulator;\r\n\t\tpublic CausticsLightRaysRenderer causticsLightRaysRenderer;\r\n\r\n\t\tprotected float waterHeightAtCameraPosition = 0f;\r\n\r\n\t\tpublic virtual void Init (ProlandManager manager)\r\n\t\t{\r\n\t\t\tm_resolution = Scatterer.Instance.mainSettings.oceanMeshResolution;\r\n\t\t\tm_screenWidth = Screen.width;\r\n\t\t\tm_screenHeight = Screen.height;\r\n\t\t\tif (XRSettings.loadedDeviceName != string.Empty)\r\n\t\t\t{\r\n\t\t\t\tm_screenWidth = Math.Max(m_screenWidth, XRSettings.eyeTextureWidth);\r\n\t\t\t\tm_screenHeight = Math.Max(m_screenHeight, XRSettings.eyeTextureHeight);\r\n\t\t\t}\r\n\r\n\t\t\tprolandManager = manager;\r\n\t\t\tloadFromConfigNode ();\r\n\r\n\t\t\tInitOceanMaterial ();\r\n\r\n\t\t\t//Worth moving to projected Grid Class?\r\n\t\t\tCreateProjectedGridMeshes (true);\r\n\r\n\t\t\toceanCameraProjectionMatModifier = waterGameObjects[0].AddComponent<OceanCameraUpdateHook>();\r\n\t\t\toceanCameraProjectionMatModifier.oceanNode = this;\r\n\r\n\t\t\toceanRenderingHook = waterGameObjects[0].AddComponent<OceanRenderingHook>();\r\n\t\t\toceanRenderingHook.targetMaterial = m_oceanMaterial;\r\n\t\t\toceanRenderingHook.targetRenderer = waterMeshRenderers [0];\r\n\t\t\toceanRenderingHook.celestialBodyName = prolandManager.parentCelestialBody.name;\r\n\r\n\t\t\tDisableEffectsChecker disableEffectsChecker = waterGameObjects[0].AddComponent<DisableEffectsChecker>();\r\n\t\t\tdisableEffectsChecker.manager = this.prolandManager;\r\n\r\n\t\t\tif (Scatterer.Instance.mainSettings.shadowsOnOcean || Scatterer.Instance.mainSettings.oceanLightRays)\r\n\t\t\t{\r\n\t\t\t\tShadowMapRetrieveCommandBuffer retriever = prolandManager.mainSunLight.gameObject.GetComponent<ShadowMapRetrieveCommandBuffer>();\r\n\t\t\t\tif (!retriever)\r\n\t\t\t\t\tprolandManager.mainSunLight.gameObject.AddComponent (typeof(ShadowMapRetrieveCommandBuffer));\r\n\t\t\t}\r\n\r\n\t\t\tInitUnderwaterMaterial ();\r\n\r\n\t\t\tunderwaterScattering = new ScreenSpaceScatteringContainer(underwaterMaterial,prolandManager.parentLocalTransform,(float)prolandManager.m_radius, prolandManager, false);\t//this shouldn't need quarter res as it isn't expensive\r\n\t\t\tunderwaterScattering.SetInScaledSpace(false);\r\n\t\t\tunderwaterScattering.SetActivated(false);\r\n\t\t\tunderwaterScattering.UpdateContainer ();\r\n\r\n\t\t\t//dimming\r\n\t\t\t//TODO: maybe this can be changed, instead of complicated hooks on the Camera, add it to the light, like causticsShadowMaskModulate?\r\n\t\t\tif ((Scatterer.Instance.mainSettings.underwaterLightDimming || Scatterer.Instance.mainSettings.oceanCaustics) && (HighLogic.LoadedScene != GameScenes.MAINMENU))\r\n\t\t\t{\r\n\t\t\t\tunderwaterDimmingHook = (UnderwaterDimmingHook) Scatterer.Instance.scaledSpaceCamera.gameObject.AddComponent(typeof(UnderwaterDimmingHook));\r\n\t\t\t\tunderwaterDimmingHook.oceanNode = this;\r\n\t\t\t}\r\n\r\n\t\t\tif (Scatterer.Instance.mainSettings.oceanCaustics && (HighLogic.LoadedScene == GameScenes.FLIGHT))\r\n\t\t\t{\r\n\t\t\t\t//why doesn't this work with IVA camera? do they have a separate light?\r\n\t\t\t\tcausticsShadowMaskModulator = (CausticsShadowMaskModulate) prolandManager.mainSunLight.gameObject.AddComponent (typeof(CausticsShadowMaskModulate));\r\n\t\t\t\tif(!causticsShadowMaskModulator.Init(causticsTexturePath, causticsLayer1Scale, causticsLayer1Speed, causticsLayer2Scale, causticsLayer2Speed,\r\n\t\t\t\t                                     causticsMultiply, causticsMinBrightness, (float)manager.GetRadius(), causticsBlurDepth, prolandManager.mainSunLight))\r\n\t\t\t\t{\r\n\t\t\t\t\tUnityEngine.Object.DestroyImmediate (causticsShadowMaskModulator);\r\n\t\t\t\t\tcausticsShadowMaskModulator = null;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (Scatterer.Instance.mainSettings.oceanLightRays)\r\n\t\t\t\t{\r\n\t\t\t\t\tcausticsLightRaysRenderer = (CausticsLightRaysRenderer) waterGameObjects[0].AddComponent<CausticsLightRaysRenderer>();\r\n\t\t\t\t\tif (!causticsLightRaysRenderer.Init(causticsTexturePath, causticsLayer1Scale, causticsLayer1Speed, causticsLayer2Scale, causticsLayer2Speed,\r\n\t\t\t\t\t                                    causticsMultiply, causticsMinBrightness, (float)manager.GetRadius(), causticsBlurDepth, this, lightRaysStrength))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tUnityEngine.Object.DestroyImmediate (causticsLightRaysRenderer);\r\n\t\t\t\t\t\tcausticsLightRaysRenderer = null;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\t\r\n\r\n\t\tpublic virtual void UpdateNode ()\r\n\t\t{\r\n\t\t\toceanDraw = !MapView.MapIsEnabled && !prolandManager.skyNode.inScaledSpace;\r\n\r\n\t\t\tforeach (MeshRenderer _mr in waterMeshRenderers)\r\n\t\t\t{\r\n\t\t\t\t_mr.enabled = oceanDraw;\r\n\t\t\t}\r\n\r\n\t\t\tisUnderwater = height < waterHeightAtCameraPosition;\r\n\r\n\t\t\tunderwaterScattering.SetActivated(isUnderwater);\r\n\r\n\t\t\tif (underwaterMode ^ isUnderwater)\r\n\t\t\t{\r\n\t\t\t\ttoggleUnderwaterMode();\r\n\t\t\t}\r\n\r\n\t\t\tif (causticsShadowMaskModulator)\r\n\t\t\t{\r\n\t\t\t\tcausticsShadowMaskModulator.isEnabled = oceanDraw && (prolandManager.GetSkyNode().altitude < 6000f);\r\n\t\t\t\tcausticsShadowMaskModulator.UpdateCaustics ();\r\n\t\t\t}\t\t\t\r\n\t\t}\r\n\r\n\t\tpublic void updateNonCameraSpecificUniforms (Material oceanMaterial)\r\n\t\t{\r\n\t\t\tprolandManager.GetSkyNode ().SetOceanUniforms (oceanMaterial);\r\n\r\n\t\t\tif (underwaterMode)\r\n\t\t\t{\r\n\t\t\t\tprolandManager.GetSkyNode ().UpdatePostProcessMaterialUniforms (underwaterMaterial);\r\n\t\t\t}\r\n\r\n\t\t\tplanetOpacity = 1f - prolandManager.parentCelestialBody.pqsController.surfaceMaterial.GetFloat (ShaderProperties._PlanetOpacity_PROPERTY);\r\n\t\t\tm_oceanMaterial.SetFloat (ShaderProperties._PlanetOpacity_PROPERTY, planetOpacity);\r\n\r\n\t\t\tm_oceanMaterial.SetInt (ShaderProperties._ZwriteVariable_PROPERTY, 1);\r\n\t\t}\r\n\r\n\t\tpublic void OnPreCull()\r\n\t\t{\r\n\t\t\tif (!MapView.MapIsEnabled && Scatterer.Instance.nearCamera && prolandManager.skyNode.simulateOceanInteraction)\r\n\t\t\t{\r\n\t\t\t\tupdateNonCameraSpecificUniforms(m_oceanMaterial);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid CreateProjectedGridMeshes (bool use32BitIndexMesh)\r\n\t\t{\r\n\t\t\t//Create the projected grid. The resolution is the size in pixels\r\n\t\t\t//of each square in the grid. If not using 32-bit index meshes, the verts of\r\n\t\t\t//the mesh will exceed the max verts for a mesh in Unity. In this case\r\n\t\t\t//split the mesh up into smaller meshes.\r\n\t\t\tm_resolution = Mathf.Max (1, m_resolution);\r\n\t\t\t//The number of squares in the grid on the x and y axis\r\n\t\t\tint NX = m_screenWidth / m_resolution;\r\n\t\t\tint NY = m_screenHeight / m_resolution;\r\n\t\t\tnumGrids = 1;\r\n\r\n\t\t\tconst int MAX_VERTS = 65000; //The number of meshes need to make a grid of this resolution, if not using 32-bit index meshes\r\n\r\n\t\t\tif (!use32BitIndexMesh && (NX * NY > MAX_VERTS))\r\n\t\t\t{\r\n\t\t\t\tnumGrids += (NX * NY) / MAX_VERTS;\r\n\t\t\t}\r\n\t\t\tm_screenGrids = new Mesh[numGrids];\r\n\t\t\twaterGameObjects = new GameObject[numGrids];\r\n\t\t\twaterMeshRenderers = new MeshRenderer[numGrids];\r\n\t\t\twaterMeshFilters = new MeshFilter[numGrids];\r\n\t\t\t//Make the meshes. The end product will be a grid of verts that cover\r\n\t\t\t//the screen on the x and y axis with the z depth at 0. This grid is then\r\n\t\t\t//projected as the ocean by the shader\r\n\t\t\tfor (int i = 0; i < numGrids; i++)\r\n\t\t\t{\r\n\t\t\t\tNY = m_screenHeight / numGrids / m_resolution;\r\n\t\t\t\tif (use32BitIndexMesh)\r\n\t\t\t\t\tm_screenGrids [i] = MeshFactory.MakePlane32BitIndexFormat (NX, NY, MeshFactory.PLANE.XY, false, true, (float)i / (float)numGrids, 1.0f / (float)numGrids);\r\n\t\t\t\telse\r\n\t\t\t\t\tm_screenGrids [i] = MeshFactory.MakePlane (NX, NY, MeshFactory.PLANE.XY, false, true, (float)i / (float)numGrids, 1.0f / (float)numGrids);\r\n\t\t\t\tm_screenGrids [i].bounds = new Bounds (Vector3.zero, new Vector3 (1e8f, 1e8f, 1e8f));\r\n\t\t\t\twaterGameObjects [i] = new GameObject ();\r\n\t\t\t\twaterGameObjects [i].transform.position = prolandManager.parentCelestialBody.transform.position;\r\n\t\t\t\twaterGameObjects [i].transform.parent = prolandManager.parentCelestialBody.transform;\r\n\t\t\t\t//might be redundant\r\n\t\t\t\twaterMeshFilters [i] = waterGameObjects [i].AddComponent<MeshFilter> ();\r\n\t\t\t\twaterMeshFilters [i].mesh.Clear ();\r\n\t\t\t\twaterMeshFilters [i].mesh = m_screenGrids [i];\r\n\t\t\t\twaterGameObjects [i].layer = 15;\r\n\t\t\t\twaterMeshRenderers [i] = waterGameObjects [i].AddComponent<MeshRenderer> ();\r\n\r\n\t\t\t\tif (Scatterer.Instance.mainSettings.oceanPixelLights)\r\n\t\t\t\t{\r\n\t\t\t\t\tm_oceanMaterial.SetPass (1); //Disable the main pass so we can render it with our commandbuffer. Pixel light passes render after scattering in depth buffer mode, and before scattering in projector mode\r\n\t\t\t\t\twaterMeshRenderers [i].sharedMaterial = m_oceanMaterial;\r\n\t\t\t\t\twaterMeshRenderers [i].material = m_oceanMaterial;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\twaterMeshRenderers [i].material = new Material (ShaderReplacer.Instance.LoadedShaders[(\"Scatterer/invisible\")]);\r\n\t\t\t\t}\r\n\t\t\t\twaterMeshRenderers [i].receiveShadows = Scatterer.Instance.mainSettings.shadowsOnOcean && (QualitySettings.shadows != ShadowQuality.Disable);\r\n\t\t\t\twaterMeshRenderers [i].shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;\r\n\t\t\t\twaterMeshRenderers [i].enabled = true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid InitOceanMaterial ()\r\n\t\t{\r\n\t\t\tm_oceanMaterial = new Material (ShaderReplacer.Instance.LoadedShaders [(\"Scatterer/OceanWhiteCaps\")]);\r\n\r\n\t\t\tUtils.EnableOrDisableShaderKeywords (m_oceanMaterial, \"SKY_REFLECTIONS_ON\", \"SKY_REFLECTIONS_OFF\", Scatterer.Instance.mainSettings.oceanSkyReflections);\r\n\t\t\tUtils.EnableOrDisableShaderKeywords (m_oceanMaterial, \"PLANETSHINE_ON\", \"PLANETSHINE_OFF\", (prolandManager.secondarySuns.Count > 0) || Scatterer.Instance.mainSettings.usePlanetShine);\r\n\r\n\t\t\tif (Scatterer.Instance.mainSettings.shadowsOnOcean && (QualitySettings.shadows != ShadowQuality.Disable))\r\n\t\t\t{\r\n\t\t\t\tUtils.EnableOrDisableShaderKeywords (m_oceanMaterial, \"OCEAN_SHADOWS_HARD\", \"OCEAN_SHADOWS_SOFT\", (QualitySettings.shadows == ShadowQuality.HardOnly));\r\n\t\t\t\tm_oceanMaterial.DisableKeyword (\"OCEAN_SHADOWS_OFF\");\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tm_oceanMaterial.EnableKeyword (\"OCEAN_SHADOWS_OFF\");\r\n\t\t\t\tm_oceanMaterial.DisableKeyword (\"OCEAN_SHADOWS_HARD\");\r\n\t\t\t\tm_oceanMaterial.DisableKeyword (\"OCEAN_SHADOWS_SOFT\");\r\n\t\t\t}\r\n\r\n\t\t\tm_oceanMaterial.EnableKeyword(\"DEPTH_BUFFER_MODE_ON\");\r\n\t\t\tm_oceanMaterial.DisableKeyword(\"PROJECTOR_MODE\");\r\n\t\t\tm_oceanMaterial.DisableKeyword(\"PROJECTOR_MODE_GODRAYS\");\r\n\r\n\t\t\tUtils.EnableOrDisableShaderKeywords (m_oceanMaterial, \"DEPTH_BUFFER_MODE_ON\", \"DEPTH_BUFFER_MODE_OFF\", true);\r\n\r\n\t\t\tm_oceanMaterial.SetOverrideTag (\"IgnoreProjector\", \"True\");\r\n\r\n            if (!Scatterer.Instance.unifiedCameraMode && DepthToDistanceCommandBuffer.RenderTexture != null)\r\n                m_oceanMaterial.SetTexture(ShaderProperties._customDepthTexture_PROPERTY, DepthToDistanceCommandBuffer.RenderTexture);\r\n\r\n            m_oceanMaterial.renderQueue=2502;\r\n\t\t\t\r\n\t\t\tm_oceanMaterial.SetVector (ShaderProperties._Ocean_Color_PROPERTY, m_oceanUpwellingColor);\r\n\t\t\tm_oceanMaterial.SetVector (\"_Underwater_Color\", m_UnderwaterColor);\r\n\t\t\tm_oceanMaterial.SetVector (ShaderProperties._Ocean_ScreenGridSize_PROPERTY, new Vector2 ((float)m_resolution / (float)m_screenWidth, (float)m_resolution / (float)m_screenHeight));\r\n\r\n\t\t\t//oceanMaterial.SetFloat (ShaderProperties._Ocean_Radius_PROPERTY, (float)(radius+m_oceanLevel));\r\n\t\t\tm_oceanMaterial.SetFloat (ShaderProperties._Ocean_Radius_PROPERTY, (float)(prolandManager.GetRadius()));\r\n\r\n\t\t\tm_oceanMaterial.SetFloat (ShaderProperties.alphaRadius_PROPERTY, alphaRadius);\r\n\r\n\t\t\tm_oceanMaterial.SetFloat (\"skyReflectionStrength\", skyReflectionStrength);\r\n\t\t\tm_oceanMaterial.SetFloat (\"refractionIndex\", refractionIndex); //these don't need to be updated every frame\r\n\t\t\tm_oceanMaterial.SetFloat (\"transparencyDepth\", transparencyDepth);\r\n\t\t\tm_oceanMaterial.SetFloat (\"darknessDepth\", darknessDepth);\r\n\r\n\t\t\tfloat camerasOverlap = 0f;\r\n\t\t\tif (!Scatterer.Instance.unifiedCameraMode)\r\n\t\t\t\tcamerasOverlap = Scatterer.Instance.nearCamera.farClipPlane - Scatterer.Instance.farCamera.nearClipPlane;\r\n\r\n\t\t\tm_oceanMaterial.SetFloat(\"_ScattererCameraOverlap\",camerasOverlap);\r\n\r\n\t\t\tm_oceanMaterial.SetFloat (\"offScreenVertexStretch\", offScreenVertexStretch);\r\n\t\t}\r\n\t\t\r\n\t\tvoid InitUnderwaterMaterial ()\r\n\t\t{\r\n\t\t\tunderwaterMaterial = new Material (ShaderReplacer.Instance.LoadedShaders [(\"Scatterer/UnderwaterScatterDepthBuffer\")]);\r\n\t\t\tunderwaterMaterial.renderQueue = 2502; //draw over fairings which is 2450 and over ocean which is 2501\r\n\t\t\t\r\n\t\t\tunderwaterMaterial.SetFloat (\"transparencyDepth\", transparencyDepth);\r\n\t\t\tunderwaterMaterial.SetFloat (\"darknessDepth\", darknessDepth);\r\n\t\t\tunderwaterMaterial.SetVector (\"_Underwater_Color\", m_UnderwaterColor);\r\n\t\t\tunderwaterMaterial.SetFloat (\"Rg\",(float)prolandManager.m_radius);\r\n\r\n\t\t\tUtils.EnableOrDisableShaderKeywords (underwaterMaterial, \"DITHERING_ON\", \"DITHERING_OFF\", Scatterer.Instance.mainSettings.useDithering);\r\n\t\t}\r\n\r\n\t\tvoid toggleUnderwaterMode()\r\n\t\t{\r\n\t\t\tif (underwaterMode) //switch to over water\r\n\t\t\t{\r\n\t\t\t\tunderwaterScattering.SetActivated(false);\r\n\t\t\t\tunderwaterScattering.UpdateContainer ();\r\n\t\t\t\tm_oceanMaterial.EnableKeyword(\"UNDERWATER_OFF\");\r\n\t\t\t\tm_oceanMaterial.DisableKeyword(\"UNDERWATER_ON\");\r\n\t\t\t\tprolandManager.GetSkyNode().SetUnderwater(false);\r\n\t\t\t}\r\n\t\t\telse   //switch to underwater \r\n\t\t\t{\r\n\t\t\t\tunderwaterScattering.SetActivated(true);\r\n\t\t\t\tunderwaterScattering.UpdateContainer ();\r\n\t\t\t\tm_oceanMaterial.EnableKeyword(\"UNDERWATER_ON\");\r\n\t\t\t\tm_oceanMaterial.DisableKeyword(\"UNDERWATER_OFF\");\r\n\t\t\t\tprolandManager.GetSkyNode().SetUnderwater(true);\r\n\t\t\t}\r\n\r\n\t\t\tunderwaterMode = !underwaterMode;\r\n\t\t}\r\n\r\n\t\tpublic virtual void OnDestroy ()\r\n\t\t{\t\r\n\t\t\tif (oceanCameraProjectionMatModifier)\r\n\t\t\t{\r\n\t\t\t\tComponent.Destroy (oceanCameraProjectionMatModifier);\r\n\t\t\t\tUnityEngine.Object.Destroy (oceanCameraProjectionMatModifier);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tfor (int i = 0; i < numGrids; i++)\r\n\t\t\t{\r\n\t\t\t\tDestroyImmediate(waterGameObjects[i]);\r\n\t\t\t\tComponent.DestroyImmediate(waterMeshFilters[i]);\r\n\t\t\t\tComponent.DestroyImmediate(waterMeshRenderers[i]);\r\n\t\t\t\t\r\n\t\t\t\tUnityEngine.Object.DestroyImmediate(m_screenGrids [i]);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t\r\n\t\t\tUnityEngine.Object.DestroyImmediate(m_oceanMaterial);\r\n\t\t\tUnityEngine.Object.DestroyImmediate(underwaterMaterial);\r\n\t\t\t\r\n\t\t\tif (underwaterDimmingHook)\r\n\t\t\t\tComponent.DestroyImmediate(underwaterDimmingHook);\r\n\t\t\t\r\n\t\t\tif (underwaterScattering!=null)\r\n\t\t\t{\r\n\t\t\t\tunderwaterScattering.Cleanup();\r\n\t\t\t}\r\n\r\n\t\t\tif (causticsShadowMaskModulator)\r\n\t\t\t{\r\n\t\t\t\tUnityEngine.Object.DestroyImmediate (causticsShadowMaskModulator);\r\n\t\t\t}\r\n\r\n\t\t\tif (causticsLightRaysRenderer)\r\n\t\t\t{\r\n\t\t\t\tUnityEngine.Object.DestroyImmediate(causticsLightRaysRenderer);\r\n\t\t\t}\r\n\r\n\t\t\tif (oceanRenderingHook)\r\n\t\t\t{\r\n\t\t\t\tComponent.DestroyImmediate(oceanRenderingHook);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void applyUnderwaterDimming () //called OnPostRender of scaledSpace Camera by hook, needs to be done before farCamera onPreCull where the color is set\r\n\t\t{\r\n\t\t\tif (!MapView.MapIsEnabled && isUnderwater)\r\n\t\t\t{\r\n\t\t\t\tfloat finalDim = 1f;\r\n\t\t\t\tif (Scatterer.Instance.mainSettings.underwaterLightDimming)\r\n\t\t\t\t{\r\n\t\t\t\t\tfloat underwaterDim = Mathf.Abs(Vector3.Distance (Scatterer.Instance.nearCamera.transform.position, prolandManager.parentLocalTransform.position)-(float)prolandManager.m_radius);\r\n\t\t\t\t\tunderwaterDim = Mathf.Lerp(1.0f,0.0f,underwaterDim / darknessDepth);\r\n\t\t\t\t\tfinalDim*=underwaterDim;\r\n\t\t\t\t}\r\n\t\t\t\tif (causticsShadowMaskModulator)\r\n\t\t\t\t{\r\n\t\t\t\t\tfinalDim*=causticsUnderwaterLightBoost; //replace by caustics multiplier\r\n\t\t\t\t}\r\n\t\t\t\tScatterer.Instance.sunlightModulatorsManagerInstance.ModulateByAttenuation(prolandManager.mainSunLight, finalDim);\r\n\t\t\t}\t\r\n\t\t}\r\n\r\n\t\tpublic void saveToConfigNode ()\r\n\t\t{\r\n\t\t\tConfigNode[] configNodeArray;\r\n\t\t\tbool found = false;\r\n\t\t\t\r\n\t\t\tconfigNodeArray = configUrl.config.GetNodes(\"Ocean\");\r\n\t\t\t\r\n\t\t\tforeach(ConfigNode _cn in configNodeArray)\r\n\t\t\t{\r\n\t\t\t\tif (_cn.HasValue(\"name\") && _cn.GetValue(\"name\") == prolandManager.parentCelestialBody.name)\r\n\t\t\t\t{\r\n\t\t\t\t\tConfigNode cnTemp = ConfigNode.CreateConfigFromObject (this);\r\n\t\t\t\t\t_cn.ClearData();\r\n\t\t\t\t\tConfigNode.Merge (_cn, cnTemp);\r\n\t\t\t\t\t_cn.name=\"Ocean\";\r\n\t\t\t\t\tUtils.LogDebug(\"saving \"+prolandManager.parentCelestialBody.name+\r\n\t\t\t\t\t          \" ocean config to: \"+configUrl.parent.url);\r\n\t\t\t\t\tconfigUrl.parent.SaveConfigs ();\r\n\t\t\t\t\tfound=true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif (!found)\r\n\t\t\t{\r\n\t\t\t\tUtils.LogDebug(\"couldn't find config file to save to\");\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tpublic void loadFromConfigNode ()\r\n\t\t{\r\n\t\t\tConfigNode cnToLoad = new ConfigNode();\r\n\t\t\tConfigNode[] configNodeArray;\r\n\t\t\tbool found = false;\r\n\r\n\t\t\tforeach (UrlDir.UrlConfig _url in Scatterer.Instance.planetsConfigsReader.oceanConfigs)\r\n\t\t\t{\r\n\t\t\t\tconfigNodeArray = _url.config.GetNodes(\"Ocean\");\r\n\t\t\t\t\r\n\t\t\t\tforeach(ConfigNode _cn in configNodeArray)\r\n\t\t\t\t{\r\n\t\t\t\t\tif (_cn.HasValue(\"name\") && _cn.GetValue(\"name\") == prolandManager.parentCelestialBody.name)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcnToLoad = _cn;\r\n\t\t\t\t\t\tconfigUrl = _url;\r\n\t\t\t\t\t\tfound = true;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif (found)\r\n\t\t\t{\r\n\t\t\t\tUtils.LogDebug(\"Ocean config found for: \"+prolandManager.parentCelestialBody.name);\r\n\t\t\t\t\r\n\t\t\t\tConfigNode.LoadObjectFromConfig (this, cnToLoad);\t\t\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tUtils.LogDebug(\"Ocean config not found for: \"+prolandManager.parentCelestialBody.name);\r\n\t\t\t\tUtils.LogDebug(\"Removing ocean for \"+prolandManager.parentCelestialBody.name +\" from planets list\");\r\n\t\t\t\t\r\n\t\t\t\t(Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies.Find(_cb => _cb.celestialBodyName == prolandManager.parentCelestialBody.name)).hasOcean = false;\r\n\t\t\t\t\r\n\t\t\t\tUnityEngine.Component.DestroyImmediate (this);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void setWaterMeshrenderersEnabled (bool enabled)\r\n\t\t{\r\n\t\t\tfor (int i=0; i < numGrids; i++)\r\n\t\t\t{\r\n\t\t\t\twaterMeshRenderers[i].enabled=enabled && oceanDraw;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "scatterer/Effects/Proland/Ocean/OceanRenderingHook.cs",
    "content": "using System.Collections.Generic;\r\nusing UnityEngine;\r\nusing UnityEngine.Rendering;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class OceanRenderingHook : MonoBehaviour\r\n\t{\r\n\t\tpublic bool isEnabled = false;\r\n\r\n\t\tpublic OceanRenderingHook ()\r\n\t\t{\r\n\t\t}\r\n\t\t\r\n\t\tpublic MeshRenderer targetRenderer;\r\n\t\tpublic Material targetMaterial;\r\n\t\tpublic string celestialBodyName;\r\n\r\n\t\t//Dictionary to check if we added the OceanCommandBuffer to the camera\r\n\t\tprivate Dictionary<Camera,OceanCommandBuffer> cameraToOceanCommandBuffer = new Dictionary<Camera,OceanCommandBuffer>();\r\n\t\t\r\n\t\tvoid OnWillRenderObject()\r\n\t\t{\r\n\t\t\tCamera cam = Camera.current;\r\n\t\t\t\r\n\t\t\tif (!cam || !targetRenderer || !targetMaterial)\r\n\t\t\t\treturn;\r\n\r\n\t\t\t// Render ocean MeshRenderer for this frame\r\n\t\t\t// If projector mode render directly to screen\r\n\t\t\t// If depth buffer mode render to separate buffer so we can have the ocean's color and depth to be used by the scattering shader\r\n\t\t\tif (cameraToOceanCommandBuffer.ContainsKey (cam))\r\n\t\t\t{\r\n\t\t\t\tif (cameraToOceanCommandBuffer[cam] != null)\r\n\t\t\t\t{\r\n\t\t\t\t\tcameraToOceanCommandBuffer[cam].EnableForThisFrame();\r\n\r\n                    // Enable screen copying for this frame\r\n                    if (Scatterer.Instance.mainSettings.oceanTransparencyAndRefractions && (cam == Scatterer.Instance.farCamera || cam == Scatterer.Instance.nearCamera))\r\n                        ScreenCopyCommandBuffer.EnableScreenCopyForFrame(cam);\r\n                }\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\t//we add null to the cameras we don't want to render on so we don't do a string compare every time\r\n\t\t\t\tif ((cam.name == \"TRReflectionCamera\") || (cam.name==\"Reflection Probes Camera\") || (cam.name == \"DepthCamera\") || (cam.name == \"NearCamera\"))\r\n\t\t\t\t{\r\n\t\t\t\t\tcameraToOceanCommandBuffer[cam] = null;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tOceanCommandBuffer oceanCommandBuffer = (OceanCommandBuffer) cam.gameObject.AddComponent(typeof(OceanCommandBuffer));\r\n\t\t\t\t\toceanCommandBuffer.targetRenderer = targetRenderer;\r\n\t\t\t\t\toceanCommandBuffer.targetMaterial = targetMaterial;\r\n\t\t\t\t\toceanCommandBuffer.celestialBodyName = celestialBodyName;\r\n\t\t\t\t\toceanCommandBuffer.Initialize();\r\n\t\t\t\t\toceanCommandBuffer.EnableForThisFrame();\r\n\t\t\t\t\t\r\n\t\t\t\t\tcameraToOceanCommandBuffer[cam] = oceanCommandBuffer;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tpublic void OnDestroy ()\r\n\t\t{\r\n\t\t\tforeach (OceanCommandBuffer oceanCommandBuffer in cameraToOceanCommandBuffer.Values)\r\n\t\t\t{\r\n\t\t\t\tif (oceanCommandBuffer)\r\n\t\t\t\t\tComponent.DestroyImmediate(oceanCommandBuffer);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tpublic class OceanCommandBuffer : MonoBehaviour\r\n\t{\r\n\t\tbool renderingEnabled = false;\r\n\t\tbool hdrEnabled = false;\r\n\r\n\t\tpublic MeshRenderer targetRenderer;\r\n\t\tpublic Material targetMaterial;\r\n\t\tpublic string celestialBodyName;\r\n\r\n\t\tprivate Camera targetCamera;\r\n\t\tprivate CommandBuffer rendererCommandBuffer;\r\n\r\n\t\tprivate int oceanRenderTextureNameID, depthCopyRenderTextureNameID;\r\n\t\tprivate Material copyCameraDepthMaterial;\r\n\t\tbool oceanScreenShotModeEnabled = false;\r\n\r\n\t\tpublic void Initialize()\r\n        {\r\n            targetCamera = GetComponent<Camera>();\r\n\r\n            copyCameraDepthMaterial = new Material(ShaderReplacer.Instance.LoadedShaders[\"Scatterer/CopyCameraDepth\"]);\r\n\r\n            rendererCommandBuffer = new CommandBuffer();\r\n            rendererCommandBuffer.name = \"Ocean MeshRenderer CommandBuffer\";\r\n\r\n            oceanRenderTextureNameID = Shader.PropertyToID(nameof(oceanRenderTextureNameID));\r\n            depthCopyRenderTextureNameID = Shader.PropertyToID(nameof(depthCopyRenderTextureNameID));\r\n\r\n            RecreateCommandBuffer();\r\n        }\r\n\r\n        private void RecreateCommandBuffer()\r\n        {\r\n            rendererCommandBuffer.Clear();\r\n\r\n            // review: not sure if these automatically generate mips.\r\n            // might need to use the overload that takes RenderTextureDescriptor to disable them\r\n\r\n            rendererCommandBuffer.GetTemporaryRT(\r\n                depthCopyRenderTextureNameID,\r\n                -1, -1, // width, height: use camera dimensions\r\n                0, // depth buffer bits\r\n                FilterMode.Point,\r\n                RenderTextureFormat.RFloat);\r\n\r\n            rendererCommandBuffer.GetTemporaryRT(\r\n                oceanRenderTextureNameID,\r\n                -1, -1, // width, height: use camera dimensions\r\n                0, // depth buffer bits\r\n                FilterMode.Point,\r\n                hdrEnabled ? RenderTextureFormat.DefaultHDR : RenderTextureFormat.ARGB32);\r\n\r\n            // Init depth render texture\r\n            rendererCommandBuffer.Blit(null, depthCopyRenderTextureNameID, copyCameraDepthMaterial, 3);\r\n\r\n            // Draw ocean renderer, output as normal to the screen, and ocean depth to the depth texture\r\n            RenderTargetIdentifier[] oceanRenderTargets = { new RenderTargetIdentifier(BuiltinRenderTextureType.CameraTarget), new RenderTargetIdentifier(depthCopyRenderTextureNameID) };\r\n\r\n            rendererCommandBuffer.SetRenderTarget(oceanRenderTargets, BuiltinRenderTextureType.CameraTarget);\r\n            rendererCommandBuffer.DrawRenderer(targetRenderer, targetMaterial, 0, 0);   //this doesn't work with pixel lights so render only the main pass here and render pixel lights the regular way\r\n                                                                                        //they will render on top of depth buffer scattering but that's not a noticeable issue, especially since ocean lights are soft additive\r\n\r\n            // expose the new depth buffer\r\n            rendererCommandBuffer.SetRenderTarget(BuiltinRenderTextureType.CameraTarget);\r\n            rendererCommandBuffer.SetGlobalTexture(\"ScattererDepthCopy\", depthCopyRenderTextureNameID);\r\n\r\n            // enable cloud shadows\r\n            rendererCommandBuffer.SetGlobalFloat(ShaderProperties.render_ocean_cloud_shadow_PROPERTY, 1f);\r\n\r\n            // draw cloud shadows\r\n            if (Scatterer.Instance.eveReflectionHandler.EVECloudLayers.ContainsKey(celestialBodyName))\r\n            {\r\n                foreach (var clouds2d in Scatterer.Instance.eveReflectionHandler.EVECloudLayers[celestialBodyName])\r\n                {\r\n                    if (clouds2d.CloudShadowMaterial != null)\r\n                    {\r\n                        rendererCommandBuffer.Blit(null, BuiltinRenderTextureType.CameraTarget, clouds2d.CloudShadowMaterial);\r\n                    }\r\n                }\r\n            }\r\n\r\n            // disable it for regular cloud shadows\r\n            rendererCommandBuffer.SetGlobalFloat(ShaderProperties.render_ocean_cloud_shadow_PROPERTY, 0f);\r\n\r\n            // recopy the screen and expose it as input for the scattering\r\n            rendererCommandBuffer.Blit(BuiltinRenderTextureType.CameraTarget, new RenderTargetIdentifier(oceanRenderTextureNameID));\r\n\r\n            // then set the textures for the scattering shader\r\n            rendererCommandBuffer.SetGlobalTexture(\"ScattererScreenCopy\", oceanRenderTextureNameID);\r\n        }\r\n\r\n        public void EnableForThisFrame()\r\n\t\t{\r\n\t\t\tif (!renderingEnabled)\r\n            {\r\n                if (hdrEnabled != targetCamera.allowHDR)\r\n                {\r\n                    RecreateCommandBuffer();\r\n                }\r\n\r\n                targetCamera.AddCommandBuffer(CameraEvent.AfterImageEffectsOpaque, rendererCommandBuffer); //ocean renders on AfterImageEffectsOpaque, local scattering (with it's depth downscale) can render and copy to screen on afterForwardAlpha\r\n                renderingEnabled = true;\r\n            }\r\n        }\r\n\r\n        void OnPostRender()\r\n\t\t{\r\n\t\t\tif (renderingEnabled && targetCamera.stereoActiveEye != Camera.MonoOrStereoscopicEye.Left)\r\n\t\t\t{\r\n\t\t\t\ttargetCamera.RemoveCommandBuffer(CameraEvent.AfterImageEffectsOpaque, rendererCommandBuffer);\r\n\t\t\t\trenderingEnabled = false;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tpublic void OnDestroy ()\r\n\t\t{\r\n\t\t\tif (targetCamera && rendererCommandBuffer != null)\r\n\t\t\t{\r\n\t\t\t\ttargetCamera.RemoveCommandBuffer (CameraEvent.AfterImageEffectsOpaque, rendererCommandBuffer);\r\n\r\n\t\t\t\trendererCommandBuffer.Release();\r\n\t\t\t\trendererCommandBuffer = null;\r\n\r\n\t\t\t\trenderingEnabled = false;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}"
  },
  {
    "path": "scatterer/Effects/Proland/Ocean/OceanWhiteCaps.cs",
    "content": "using UnityEngine;\r\nusing System.Collections;\r\n\r\nnamespace Scatterer {\r\n\t/*\r\n\t * Extend the OceanFFT node to also generate ocean white caps.\r\n\t */\r\n\tpublic class OceanWhiteCaps: OceanFFTgpu {\r\n\r\n\t\t[Persistent]\r\n\t\tprotected string name;\r\n\r\n\t\tMaterial m_initJacobiansMat;\t\t\r\n\t\tMaterial m_whiteCapsPrecomputeMat;\r\n\r\n\t\tRenderTexture[] m_fourierBuffer5, m_fourierBuffer6, m_fourierBuffer7;\t\t\r\n\t\tint foamAniso = 9;\t\t\r\n\t\tRenderTexture m_foam0, m_foam1;\r\n\r\n\t\tpublic override void Init(ProlandManager manager)\r\n\t\t{\r\n\t\t\tbase.Init(manager);\r\n\r\n\t\t\tm_initJacobiansMat = new Material(ShaderReplacer.Instance.LoadedShaders[ (\"Proland/Ocean/InitJacobians\")]);\r\n\t\t\tm_whiteCapsPrecomputeMat = new Material(ShaderReplacer.Instance.LoadedShaders[(\"Proland/Ocean/WhiteCapsPrecompute0\")]);\r\n\r\n\t\t\tm_initJacobiansMat.SetTexture(ShaderProperties._Spectrum01_PROPERTY, m_spectrum01);\r\n\t\t\tm_initJacobiansMat.SetTexture(ShaderProperties._Spectrum23_PROPERTY, m_spectrum23);\r\n\t\t\tm_initJacobiansMat.SetTexture(ShaderProperties._WTable_PROPERTY, m_WTable);\r\n\t\t\tm_initJacobiansMat.SetVector (ShaderProperties._Offset_PROPERTY, m_spectrumOffset);\r\n\t\t\tm_initJacobiansMat.SetVector (ShaderProperties._InverseGridSizes_PROPERTY, m_inverseGridSizes);\r\n\r\n\t\t\tm_oceanMaterial.SetFloat (ShaderProperties._Ocean_WhiteCapStr_PROPERTY, m_whiteCapStr);\r\n\t\t\tm_oceanMaterial.SetFloat (ShaderProperties.farWhiteCapStr_PROPERTY, m_farWhiteCapStr);\r\n\t\t\tm_oceanMaterial.SetTexture(ShaderProperties._Ocean_Foam0_PROPERTY, m_foam0);\r\n\t\t\tm_oceanMaterial.SetTexture(ShaderProperties._Ocean_Foam1_PROPERTY, m_foam1);\r\n\t\t\t\r\n\t\t\tm_oceanMaterial.SetFloat (ShaderProperties.shoreFoam_PROPERTY, shoreFoam);\r\n\t\t\tUtils.EnableOrDisableShaderKeywords (m_oceanMaterial, \"FOAM_ON\", \"FOAM_OFF\", true);\r\n\r\n\t\t}\r\n\t\t\r\n\t\tprotected override void CreateRenderTextures()\r\n\t\t{\r\n\t\t\tRenderTextureFormat format = RenderTextureFormat.ARGBHalf;\r\n\t\t\t\r\n\t\t\tCreateMap(ref m_foam0, format, foamAniso, true);\r\n\t\t\tCreateMap(ref m_foam1, format, foamAniso, true);\r\n\t\t\t\r\n\t\t\tm_foam1.mipMapBias = m_foamMipMapBias;\r\n\t\t\t\r\n\t\t\t//These textures are used to perform the fourier transform\r\n\t\t\tCreateBuffer(ref m_fourierBuffer5, format); // Jacobians XX\r\n\t\t\tCreateBuffer(ref m_fourierBuffer6, format); // Jacobians YY\r\n\t\t\tCreateBuffer(ref m_fourierBuffer7, format); // Jacobians XY\r\n\t\t\t\r\n\t\t\t//Make sure the base textures are also created\r\n\t\t\tbase.CreateRenderTextures();\r\n\t\t}\r\n\t\t\r\n\t\tpublic override void OnDestroy()\r\n\t\t{\r\n\t\t\tbase.OnDestroy();\r\n\t\t\t\r\n\t\t\tm_foam0.Release();\r\n\t\t\tm_foam1.Release();\r\n\t\t\t\r\n\t\t\tfor (int i = 0; i < 2; i++)\r\n\t\t\t{\r\n\t\t\t\tm_fourierBuffer5[i].Release();\r\n\t\t\t\tm_fourierBuffer6[i].Release();\r\n\t\t\t\tm_fourierBuffer7[i].Release();\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tprotected override void InitWaveSpectrum(float t)\r\n\t\t{\r\n\t\t\tbase.InitWaveSpectrum(t);\r\n\t\t\t\r\n\t\t\t// Init jacobians (5,6,7)\r\n\t\t\tRenderTexture[] buffers567 = new RenderTexture[]{m_fourierBuffer5[1], m_fourierBuffer6[1], m_fourierBuffer7[1]};\r\n\t\t\tm_initJacobiansMat.SetFloat (ShaderProperties._T_PROPERTY, t);\r\n\t\t\tRTUtility.MultiTargetBlit(buffers567, m_initJacobiansMat, 0);\r\n\t\t}\r\n\t\t\r\n\t\tpublic override void UpdateNode() {\r\n\r\n\t\t\tbase.UpdateNode();\r\n\r\n\t\t\tif (!MapView.MapIsEnabled && prolandManager.skyNode.simulateOceanInteraction)\r\n\t\t\t{\r\n\t\t\t\tm_fourier.PeformFFT(m_fourierBuffer5, m_fourierBuffer6, m_fourierBuffer7);\r\n\t\t\t\t\r\n\t\t\t\t//fixed block, two passes, fixes mipmapping issue resulting in black ocean\r\n\t\t\t\tm_whiteCapsPrecomputeMat.SetTexture(ShaderProperties._Map5_PROPERTY, m_fourierBuffer5[m_idx]);\r\n\t\t\t\tm_whiteCapsPrecomputeMat.SetTexture(ShaderProperties._Map6_PROPERTY, m_fourierBuffer6[m_idx]);\r\n\t\t\t\tm_whiteCapsPrecomputeMat.SetTexture(ShaderProperties._Map7_PROPERTY, m_fourierBuffer7[m_idx]);\r\n\t\t\t\tm_whiteCapsPrecomputeMat.SetVector (ShaderProperties._Choppyness_PROPERTY, m_choppyness);\r\n\r\n\t\t\t\t//RenderTexture[] buffers = new RenderTexture[] {m_foam0, m_foam1};\r\n\t\t\t\t//RTUtility.MultiTargetBlit(buffers, m_whiteCapsPrecomputeMat, 0); //causes mipmapping issue resulting in black ocean\r\n\t\t\t\tGraphics.Blit (null, m_foam0, m_whiteCapsPrecomputeMat, 0);\r\n\t\t\t\tGraphics.Blit (null, m_foam1, m_whiteCapsPrecomputeMat, 1);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}"
  },
  {
    "path": "scatterer/Effects/Proland/Ocean/UnderwaterDimmingHook.cs",
    "content": "using UnityEngine;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class UnderwaterDimmingHook : MonoBehaviour\r\n\t{\r\n\t\tpublic OceanNode oceanNode;\r\n\r\n\t\tpublic void OnPostRender()\r\n\t\t{\r\n\t\t\toceanNode.applyUnderwaterDimming ();\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/Effects/Proland/Ocean/Utils/CBUtility.cs",
    "content": "using UnityEngine;\r\nusing UnityEngine.Rendering;\r\nusing System;\r\nusing System.IO;\r\n\r\nnamespace Scatterer\r\n{\r\n\tstatic public class CBUtility\r\n\t{\r\n\t\t\r\n\t\tpublic static ComputeBuffer CreateArgBuffer(int vertexCountPerInstance, int instanceCount, int startVertex, int startInstance)\r\n\t\t{\r\n\t\t\tComputeBuffer buffer = new ComputeBuffer(4, sizeof(int), ComputeBufferType.IndirectArguments);\r\n\t\t\tint[] args = new int[] { vertexCountPerInstance, instanceCount, startVertex, startInstance };\r\n\t\t\tbuffer.SetData(args);\r\n\t\t\t\r\n\t\t\treturn buffer;\r\n\t\t}\r\n\t\t\r\n\t\tpublic static int GetVertexCountPerInstance(ComputeBuffer buffer)\r\n\t\t{\r\n\t\t\tint[] args = new int[] { 0, 0, 0, 0 };\r\n\t\t\tbuffer.GetData(args);\r\n\t\t\treturn args[0];\r\n\t\t}\r\n\t\t\r\n\t\tprivate static string[,] readNames2D = new string[,]\r\n\t\t{\r\n\t\t\t{\"read2DC1\", \"_Tex2D\", \"_Buffer2DC1\"},\r\n\t\t\t{\"read2DC2\", \"_Tex2D\", \"_Buffer2DC2\"},\r\n\t\t\t{\"read2DC3\", \"_Tex2D\", \"_Buffer2DC3\"},\r\n\t\t\t{\"read2DC4\", \"_Tex2D\", \"_Buffer2DC4\"}\r\n\t\t};\r\n\t\t\r\n\t\tprivate static string[,] readNames3D = new string[,]\r\n\t\t{\r\n\t\t\t{\"read3DC1\", \"_Tex3D\", \"_Buffer3DC1\"},\r\n\t\t\t{\"read3DC2\", \"_Tex3D\", \"_Buffer3DC2\"},\r\n\t\t\t{\"read3DC3\", \"_Tex3D\", \"_Buffer3DC3\"},\r\n\t\t\t{\"read3DC4\", \"_Tex3D\", \"_Buffer3DC4\"}\r\n\t\t};\r\n\t\t\r\n\t\tpublic static void ReadFromRenderTexture(RenderTexture tex, int channels, ComputeBuffer buffer, ComputeShader readData)\r\n\t\t{\r\n\t\t\tif (tex == null)\r\n\t\t\t\tthrow new ArgumentException(\"RenderTexture is null\");\r\n\t\t\t\r\n\t\t\tif (buffer == null)\r\n\t\t\t\tthrow new ArgumentException(\"Buffer is null\");\r\n\t\t\t\r\n\t\t\tif (readData == null)\r\n\t\t\t\tthrow new ArgumentException(\"Computer shader is null\");\r\n\t\t\t\r\n\t\t\tif (channels < 1 || channels > 4)\r\n\t\t\t\tthrow new ArgumentException(\"Channels must be 1, 2, 3, or 4\");\r\n\t\t\t\r\n\t\t\tif (!tex.IsCreated())\r\n\t\t\t\tthrow new ArgumentException(\"Tex has not been created (Call Create() on tex)\");\r\n\t\t\t\r\n\t\t\tint kernel = -1;\r\n\t\t\tint depth = 1;\r\n\t\t\t\r\n\t\t\tif(tex.dimension == TextureDimension.Tex3D)\r\n\t\t\t{\r\n\t\t\t\tdepth = tex.volumeDepth;\r\n\t\t\t\tkernel = readData.FindKernel(readNames3D[channels - 1, 0]);\r\n\t\t\t\treadData.SetTexture(kernel, readNames3D[channels - 1, 1], tex);\r\n\t\t\t\treadData.SetBuffer(kernel, readNames3D[channels - 1, 2], buffer);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tkernel = readData.FindKernel(readNames2D[channels - 1, 0]);\r\n\t\t\t\treadData.SetTexture(kernel, readNames2D[channels - 1, 1], tex);\r\n\t\t\t\treadData.SetBuffer(kernel, readNames2D[channels - 1, 2], buffer);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif (kernel == -1)\r\n\t\t\t\tthrow new ArgumentException(\"Could not find kernel \" + readNames2D[channels - 1, 0]);\r\n\t\t\t\r\n\t\t\tint width = tex.width;\r\n\t\t\tint height = tex.height;\r\n\t\t\t\r\n\t\t\treadData.SetInt(\"_Width\", width);\r\n\t\t\treadData.SetInt(\"_Height\", height);\r\n\t\t\treadData.SetInt(\"_Depth\", depth);\r\n\t\t\t\r\n\t\t\t//run the  compute shader. Runs in threads of 8 so non divisable by 8 numbers will need\r\n\t\t\t//some extra threadBlocks. This will result in some unneeded threads running \r\n\t\t\tint padX = (width % 8 == 0) ? 0 : 1;\r\n\t\t\tint padY = (height % 8 == 0) ? 0 : 1;\r\n\t\t\tint padZ = (depth % 8 == 0) ? 0 : 1;\r\n\t\t\t\r\n\t\t\treadData.Dispatch(kernel, Mathf.Max(1, width / 8 + padX), Mathf.Max(1, height / 8 + padY), Mathf.Max(1, depth / 8 + padZ));\r\n\t\t\t\r\n\t\t}\r\n\t\t\r\n\t\tpublic static void ReadSingleFromRenderTexture(RenderTexture tex, float x, float y, float z, ComputeBuffer buffer, ComputeShader readData, bool useBilinear)\r\n\t\t{\r\n\t\t\tif (tex == null)\r\n\t\t\t\tthrow new ArgumentException(\"RenderTexture is null\");\r\n\t\t\t\r\n\t\t\tif (buffer == null)\r\n\t\t\t\tthrow new ArgumentException(\"Buffer is null\");\r\n\t\t\t\r\n\t\t\tif (readData == null)\r\n\t\t\t\tthrow new ArgumentException(\"Computer shader is null\");\r\n\t\t\t\r\n\t\t\tif (!tex.IsCreated())\r\n\t\t\t\tthrow new ArgumentException(\"Tex has not been created (Call Create() on tex)\");\r\n\t\t\t\r\n\t\t\tint kernel = -1;\r\n\t\t\tint depth = 1;\r\n\t\t\t\r\n\t\t\tif (tex.dimension == TextureDimension.Tex3D)\r\n\t\t\t{\r\n\t\t\t\tif(useBilinear)\r\n\t\t\t\t\tkernel = readData.FindKernel(\"readSingleBilinear3D\");\r\n\t\t\t\telse\r\n\t\t\t\t\tkernel = readData.FindKernel(\"readSingle3D\");\r\n\t\t\t\t\r\n\t\t\t\tdepth = tex.volumeDepth;\r\n\t\t\t\treadData.SetTexture(kernel, \"_Tex3D\", tex);\r\n\t\t\t\treadData.SetBuffer(kernel, \"_BufferSingle3D\", buffer);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tif (useBilinear)\r\n\t\t\t\t\tkernel = readData.FindKernel(\"readSingleBilinear2D\");\r\n\t\t\t\telse\r\n\t\t\t\t\tkernel = readData.FindKernel(\"readSingle2D\");\r\n\t\t\t\t\r\n\t\t\t\treadData.SetTexture(kernel, \"_Tex2D\", tex);\r\n\t\t\t\treadData.SetBuffer(kernel, \"_BufferSingle2D\", buffer);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif (kernel == -1)\r\n\t\t\t\tthrow new ArgumentException(\"Could not find kernel readSingle for \" + tex.dimension);\r\n\t\t\t\r\n\t\t\tint width = tex.width;\r\n\t\t\tint height = tex.height;\r\n\t\t\t\r\n\t\t\t//used for point sampling\r\n\t\t\treadData.SetInt(\"_IdxX\", (int)x);\r\n\t\t\treadData.SetInt(\"_IdxY\", (int)y);\r\n\t\t\treadData.SetInt(\"_IdxZ\", (int)z);\r\n\t\t\t//used for bilinear sampling\r\n\t\t\treadData.SetVector(\"_UV\", new Vector4(x / (float)(width - 1), y / (float)(height - 1), z / (float)(depth - 1), 0.0f));\r\n\t\t\t\r\n\t\t\treadData.Dispatch(kernel, 1, 1, 1);\r\n\t\t\t\r\n\t\t}\r\n\t\t\r\n\t\tpublic static void WriteIntoRenderTexture(RenderTexture tex, int channels, ComputeBuffer buffer, ComputeShader writeData)\r\n\t\t{\r\n\t\t\tif (tex == null)\r\n\t\t\t\tthrow new ArgumentException(\"RenderTexture is null\");\r\n\t\t\t\r\n\t\t\tif (buffer == null)\r\n\t\t\t\tthrow new ArgumentException(\"Buffer is null\");\r\n\t\t\t\r\n\t\t\tif (writeData == null)\r\n\t\t\t\tthrow new ArgumentException(\"Computer shader is null\");\r\n\t\t\t\r\n\t\t\tif (channels < 1 || channels > 4)\r\n\t\t\t\tthrow new ArgumentException(\"Channels must be 1, 2, 3, or 4\");\r\n\t\t\t\r\n\t\t\tif (!tex.enableRandomWrite)\r\n\t\t\t\tthrow new ArgumentException(\"You must enable random write on render texture\");\r\n\t\t\t\r\n\t\t\tif (!tex.IsCreated())\r\n\t\t\t\tthrow new ArgumentException(\"Tex has not been created (Call Create() on tex)\");\r\n\t\t\t\r\n\t\t\tint kernel = -1;\r\n\t\t\tint depth = 1;\r\n\t\t\tstring D = \"2D\";\r\n\t\t\tstring C = \"C\" + channels.ToString();\r\n\t\t\t\r\n\t\t\tif (tex.dimension == TextureDimension.Tex3D)\r\n\t\t\t{\r\n\t\t\t\tdepth = tex.volumeDepth;\r\n\t\t\t\tD = \"3D\";\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tkernel = writeData.FindKernel(\"write\" + D + C);\r\n\t\t\t\r\n\t\t\tif (kernel == -1)\r\n\t\t\t\tthrow new ArgumentException(\"Could not find kernel \" + \"write\" + D + C);\r\n\t\t\t\r\n\t\t\tint width = tex.width;\r\n\t\t\tint height = tex.height;\r\n\t\t\t\r\n\t\t\t//set the compute shader uniforms\r\n\t\t\twriteData.SetTexture(kernel, \"_Des\" + D + C, tex);\r\n\t\t\twriteData.SetInt(\"_Width\", width);\r\n\t\t\twriteData.SetInt(\"_Height\", height);\r\n\t\t\twriteData.SetInt(\"_Depth\", depth);\r\n\t\t\twriteData.SetBuffer(kernel, \"_Buffer\" + D + C, buffer);\r\n\t\t\t//run the  compute shader. Runs in threads of 8 so non divisable by 8 numbers will need\r\n\t\t\t//some extra threadBlocks. This will result in some unneeded threads running \r\n\t\t\tint padX = (width % 8 == 0) ? 0 : 1;\r\n\t\t\tint padY = (height % 8 == 0) ? 0 : 1;\r\n\t\t\tint padZ = (depth % 8 == 0) ? 0 : 1;\r\n\t\t\t\r\n\t\t\twriteData.Dispatch(kernel, Mathf.Max(1, width / 8 + padX), Mathf.Max(1, height / 8 + padY), Mathf.Max(1, depth / 8 + padZ));\r\n\t\t}\r\n\t\t\r\n\t\tpublic static void WriteIntoRenderTexture(RenderTexture tex, int channels, string path, ComputeBuffer buffer, ComputeShader writeData)\r\n\t\t{\r\n\t\t\tif (tex == null)\r\n\t\t\t\tthrow new ArgumentException(\"RenderTexture is null\");\r\n\t\t\t\r\n\t\t\tif (buffer == null)\r\n\t\t\t\tthrow new ArgumentException(\"buffer is null\");\r\n\t\t\t\r\n\t\t\tif (writeData == null)\r\n\t\t\t\tthrow new ArgumentException(\"Computer shader is null\");\r\n\t\t\t\r\n\t\t\tif (channels < 1 || channels > 4)\r\n\t\t\t\tthrow new ArgumentException(\"Channels must be 1, 2, 3, or 4\");\r\n\t\t\t\r\n\t\t\tif (!tex.enableRandomWrite)\r\n\t\t\t\tthrow new ArgumentException(\"You must enable random write on render texture\");\r\n\t\t\t\r\n\t\t\tif (!tex.IsCreated())\r\n\t\t\t\tthrow new ArgumentException(\"Tex has not been created (Call Create() on tex)\");\r\n\t\t\t\r\n\t\t\tint kernel = -1;\r\n\t\t\tint depth = 1;\r\n\t\t\tstring D = \"2D\";\r\n\t\t\tstring C = \"C\" + channels.ToString();\r\n\t\t\t\r\n\t\t\tif (tex.dimension == TextureDimension.Tex3D)\r\n\t\t\t{\r\n\t\t\t\tdepth = tex.volumeDepth;\r\n\t\t\t\tD = \"3D\";\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tkernel = writeData.FindKernel(\"write\" + D + C);\r\n\t\t\t\r\n\t\t\tif (kernel == -1)\r\n\t\t\t\tthrow new ArgumentException(\"Could not find kernel \" + \"write\" + D + C);\r\n\t\t\t\r\n\t\t\tint width = tex.width;\r\n\t\t\tint height = tex.height;\r\n\t\t\tint size = width * height * depth * channels;\r\n\t\t\t\r\n\t\t\tfloat[] map = new float[size];\r\n\t\t\tLoadRawFile(path, map, size);\r\n\t\t\t\r\n\t\t\tbuffer.SetData(map);\r\n\t\t\t\r\n\t\t\t//set the compute shader uniforms\r\n\t\t\twriteData.SetTexture(kernel, \"_Des\" + D + C, tex);\r\n\t\t\twriteData.SetInt(\"_Width\", width);\r\n\t\t\twriteData.SetInt(\"_Height\", height);\r\n\t\t\twriteData.SetInt(\"_Depth\", depth);\r\n\t\t\twriteData.SetBuffer(kernel, \"_Buffer\" + D + C, buffer);\r\n\t\t\t//run the  compute shader. Runs in threads of 8 so non divisable by 8 numbers will need\r\n\t\t\t//some extra threadBlocks. This will result in some unneeded threads running \r\n\t\t\tint padX = (width % 8 == 0) ? 0 : 1;\r\n\t\t\tint padY = (height % 8 == 0) ? 0 : 1;\r\n\t\t\tint padZ = (depth % 8 == 0) ? 0 : 1;\r\n\t\t\t\r\n\t\t\twriteData.Dispatch(kernel, Mathf.Max(1, width / 8 + padX), Mathf.Max(1, height / 8 + padY), Mathf.Max(1, depth / 8 + padZ));\r\n\t\t}\r\n\t\t\r\n\t\tprivate static void LoadRawFile(string path, float[] map, int size)\r\n\t\t{\r\n\t\t\tFileInfo fi = new FileInfo(path);\r\n\t\t\t\r\n\t\t\tif (fi == null)\r\n\t\t\t\tthrow new ArgumentException(\"Raw file not found (\" + path + \")\");\r\n\t\t\t\r\n\t\t\tFileStream fs = fi.OpenRead();\r\n\t\t\t\r\n\t\t\tbyte[] data = new byte[fi.Length];\r\n\t\t\tfs.Read(data, 0, (int)fi.Length);\r\n\t\t\tfs.Close();\r\n\t\t\t\r\n\t\t\t//divide by 4 as there are 4 bytes in a 32 bit float\r\n\t\t\tif (size > fi.Length / 4)\r\n\t\t\t\tthrow new ArgumentException(\"Raw file is not the required size (\" + path + \")\");\r\n\t\t\t\r\n\t\t\tfor (int x = 0, i = 0; x < size; x++, i += 4)\r\n\t\t\t{\r\n\t\t\t\t//Convert 4 bytes to 1 32 bit float\r\n\t\t\t\tmap[x] = System.BitConverter.ToSingle(data, i);\r\n\t\t\t};\r\n\t\t\t\r\n\t\t}\r\n\t}\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "scatterer/Effects/Proland/Ocean/Utils/FakeOceanPQS.cs",
    "content": "using System;\r\nusing System.Reflection;\r\nusing System.Text.RegularExpressions;\r\nusing UnityEngine;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class FakeOceanPQS : PQSMod\r\n\t{\r\n\t\tbool coroutineStarted = false;\r\n\t\tMaterial originalOceanMaterial;\r\n\r\n\t\tIEnumerator StopSphereCoroutine()\r\n\t\t{\r\n\t\t\twhile (true)\r\n\t\t\t{\r\n\t\t\t\tfor (int i=0; i<10; i++)\r\n\t\t\t\t\tyield return new WaitForFixedUpdate ();\r\n\r\n\t\t\t\tsphere.StopAllCoroutines ();\r\n\t\t\t\tsphere.DeactivateSphere();\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tpublic override void OnSphereStarted()\r\n\t\t{\r\n\t\t\tif (!coroutineStarted)\r\n\t\t\t{\r\n\t\t\t\tStartCoroutine (StopSphereCoroutine ());\r\n\t\t\t\tcoroutineStarted = true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void Apply(PQS pqs)\r\n\t\t{\r\n\t\t\tif (pqs != null)\r\n\t\t\t{\r\n\t\t\t\tthis.sphere = pqs;\r\n\t\t\t\tthis.transform.parent = pqs.transform;\r\n\t\t\t\tthis.requirements = PQS.ModiferRequirements.Default;\r\n\t\t\t\tthis.modEnabled = true;\r\n\t\t\t\tthis.order = 0;\r\n\r\n\t\t\t\toriginalOceanMaterial = pqs.surfaceMaterial;\r\n\r\n\t\t\t\tMaterial invisibleOceanMaterial = new Material (ShaderReplacer.Instance.LoadedShaders[(\"Scatterer/invisible\")]);\r\n\t\t\t\tinvisibleOceanMaterial.SetOverrideTag (\"IgnoreProjector\", \"True\");\r\n\t\t\t\tinvisibleOceanMaterial.SetOverrideTag (\"ForceNoShadowCasting\", \"True\");\r\n\t\t\t\tpqs.surfaceMaterial = invisibleOceanMaterial;\r\n\r\n\t\t\t\tsphere.StopAllCoroutines ();\r\n\t\t\t\tsphere.DeactivateSphere();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void Remove()\r\n\t\t{\r\n\t\t\tthis.StopAllCoroutines ();\r\n\t\t\tsphere.surfaceMaterial = originalOceanMaterial;\r\n\t\t\tsphere.StartUpSphere ();\r\n\r\n\t\t\tgameObject.DestroyGameObject ();\r\n\t\t}\r\n\t}\r\n}"
  },
  {
    "path": "scatterer/Effects/Proland/Ocean/Utils/OceanUtils.cs",
    "content": "using System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.IO;\r\nusing System.Reflection;\r\nusing System.Runtime;\r\nusing KSP;\r\nusing KSP.IO;\r\nusing UnityEngine;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic static class OceanUtils\r\n\t{\r\n\t\tpublic static bool oceanRemoved = false;\r\n\r\n\t\tpublic static void removeStockOceansIfNotDone()\r\n\t\t{\r\n\t\t\tif (!oceanRemoved)\r\n\t\t\t{\r\n\t\t\t\tremoveStockOceans();\r\n\t\t\t\toceanRemoved = true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate static void removeStockOceans()\r\n\t\t{\r\n\t\t\tforeach (ScattererCelestialBody sctBody in Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies)\r\n\t\t\t{\r\n\t\t\t\tif (sctBody.hasOcean)\r\n\t\t\t\t{\r\n\t\t\t\t\tbool removed = false;\r\n\t\t\t\t\tvar celBody = FlightGlobals.Bodies.SingleOrDefault (_cb => _cb.bodyName == sctBody.celestialBodyName);\r\n\t\t\t\t\tif (celBody == null) {\r\n\t\t\t\t\t\tcelBody = FlightGlobals.Bodies.SingleOrDefault (_cb => _cb.bodyName == sctBody.transformName);\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\tif (celBody != null)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tPQS pqs = celBody.pqsController;\r\n\t\t\t\t\t\tif ((pqs != null) && (pqs.ChildSpheres != null) && (pqs.ChildSpheres.Count () != 0)) {\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tPQS ocean = pqs.ChildSpheres [0];\r\n\t\t\t\t\t\t\tif (ocean != null)\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tGameObject go = new GameObject (\"Scatterer stock ocean disabler \"+sctBody.celestialBodyName);\r\n\t\t\t\t\t\t\t\tFakeOceanPQS fakeOcean = go.AddComponent<FakeOceanPQS> ();\r\n\t\t\t\t\t\t\t\tfakeOcean.Apply (ocean);\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tremoved = true;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (!removed)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tUtils.LogDebug (\"Couldn't remove stock ocean for \" + sctBody.celestialBodyName);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tUtils.LogDebug (\"Removed stock oceans\");\r\n\t\t}\r\n\r\n\r\n\t\t//We can disable scatterer oceans and re-enable stock oceans without restarting the game\r\n\t\t//but once started the stock ocean \"pollutes\" the scene with gameObjects that remain and lower performance so it isn't recommended but the option is there\r\n\t\tpublic static void restoreOceansIfNeeded()\r\n\t\t{\r\n\t\t\tif (oceanRemoved)\r\n\t\t\t{\r\n\t\t\t\tFakeOceanPQS[] fakes = (FakeOceanPQS[])FakeOceanPQS.FindObjectsOfType (typeof(FakeOceanPQS));\r\n\r\n\t\t\t\tforeach (FakeOceanPQS fake in fakes)\r\n\t\t\t\t{\r\n\t\t\t\t\tfake.Remove ();\r\n\t\t\t\t\tComponent.Destroy(fake);\r\n\t\t\t\t}\r\n\r\n\t\t\t\toceanRemoved = false;\r\n\r\n\t\t\t\tUtils.LogDebug (\"Stock oceans restored\");\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/Effects/Proland/Ocean/Utils/RTUtility.cs",
    "content": "using UnityEngine;\r\nusing System.Collections;\r\n\r\nnamespace Scatterer\r\n{\r\n\tstatic public class RTUtility\r\n\t{\r\n\t\tstatic public void MultiTargetBlit(RenderTexture[] des, Material mat, int pass)\r\n\t\t{\t\t\t\r\n\t\t\tRenderBuffer[] rb = new RenderBuffer[des.Length];\r\n\t\t\t\r\n\t\t\tfor(int i = 0; i < des.Length; i++)\r\n\t\t\t\trb[i] = des[i].colorBuffer;\r\n\t\t\t\r\n\t\t\tGraphics.SetRenderTarget(rb, des[0].depthBuffer);\r\n\t\t\t\r\n\t\t\tGL.PushMatrix();\r\n\t\t\tGL.LoadOrtho();\r\n\t\t\t\r\n\t\t\tmat.SetPass(pass);\r\n\t\t\t\r\n\t\t\tGL.Begin(GL.QUADS);\r\n\t\t\tGL.TexCoord2(0.0f, 0.0f); GL.Vertex3(0.0f, 0.0f, 0.1f);\r\n\t\t\tGL.TexCoord2(1.0f, 0.0f); GL.Vertex3(1.0f, 0.0f, 0.1f);\r\n\t\t\tGL.TexCoord2(1.0f, 1.0f); GL.Vertex3(1.0f, 1.0f, 0.1f);\r\n\t\t\tGL.TexCoord2(0.0f, 1.0f); GL.Vertex3(0.0f, 1.0f, 0.1f);\r\n\t\t\tGL.End();\r\n\t\t\t\r\n\t\t\tGL.PopMatrix();\r\n\t\t}\r\n\t\t\r\n\t\tstatic public void MultiTargetBlit(RenderBuffer[] des_rb, RenderBuffer des_db, Material mat, int pass)\r\n\t\t{\r\n\t\t\tGraphics.SetRenderTarget(des_rb, des_db);\r\n\t\t\t\r\n\t\t\tGL.PushMatrix();\r\n\t\t\tGL.LoadOrtho();\r\n\t\t\t\r\n\t\t\tmat.SetPass(pass);\r\n\t\t\t\r\n\t\t\tGL.Begin(GL.QUADS);\r\n\t\t\tGL.TexCoord2(0.0f, 0.0f); GL.Vertex3(0.0f, 0.0f, 0.1f);\r\n\t\t\tGL.TexCoord2(1.0f, 0.0f); GL.Vertex3(1.0f, 0.0f, 0.1f);\r\n\t\t\tGL.TexCoord2(1.0f, 1.0f); GL.Vertex3(1.0f, 1.0f, 0.1f);\r\n\t\t\tGL.TexCoord2(0.0f, 1.0f); GL.Vertex3(0.0f, 1.0f, 0.1f);\r\n\t\t\tGL.End();\r\n\t\t\t\r\n\t\t\tGL.PopMatrix();\r\n\t\t}\r\n\t\t\r\n\t\tstatic public void Swap(RenderTexture[] texs)\r\n\t\t{\r\n\t\t\tRenderTexture temp = texs[0];\t\r\n\t\t\ttexs[0] = texs[1];\r\n\t\t\ttexs[1] = temp;\r\n\t\t}\r\n\t\t\r\n\t\tstatic public void ClearColor(RenderTexture[] texs)\r\n\t\t{\r\n\t\t\tfor(int i = 0; i < texs.Length; i++)\r\n\t\t\t{\r\n\t\t\t\tGraphics.SetRenderTarget(texs[i]);\r\n\t\t\t\tGL.Clear(false,true, Color.clear);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "scatterer/Effects/Proland/Ocean/Utils/WriteFloat.cs",
    "content": "using UnityEngine;\r\nusing System;\r\nusing System.Collections;\r\nusing System.IO;\r\n\r\nnamespace Scatterer\r\n{\r\n\r\n\t//This class is now obsolete and can be replaced with a single blit\r\n\r\n\r\n\t/// <summary>\r\n\t/// This class is designed to take 32 bit floating point data and get it into a 2D render texture.\r\n\t/// As there is no way in Unity to load floating point data straight into a render texture (with out dx11) the data for each\r\n\t/// channel must be encoded into a ARGB32 format texture and then decoded via a shader into the render texture.\r\n\t///\r\n\t/// At the moment there are some conditions that must be meet for this to work\r\n\t///\r\n\t/// 1 - The data must be 32 bit floating point but the render texture format can be float or half.\r\n\t///\r\n\t/// 2 - The encode/decode step only works on data in the range 0 - 0.9999 but the function will find the highest number and normalize the \r\n\t///     the data if its over 1 and then un-normalize it in the shader. This way you can have numbers greater than 1. \r\n\t///     The function will also find the lowest number and if its below 0 it will add this value to all the data so the lowest number is 0.\r\n\t///     This way you can have numbers lower than 0. This only works when copying data into a render texture. \r\n\t///     When trying to get it out of a render texture you will need to make sure the data is in the range 0 - 0.9999\r\n\t///     as there is not easy way to iterate over the texture and find the min and max values. \r\n\t///\r\n\t/// 3 - When trying encode/decode values it does not seem to work on values equal to 1 so Ive stated the max range as 0.9999.\r\n\t///\r\n\t/// 4 - Ive added the ability to load a raw file and copy the data into a render texture. \r\n\t///     You can load 32 bit or 16 bit data. 16 bit data can be big endian or little endian\r\n\t/// </summary>\r\n\tpublic class WriteFloat\r\n\t{\r\n\t\t\r\n\t\tconst float MAX_VALUE = 0.999999f;\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// The material which will write the encoded \r\n\t\t/// data into the render texture.\r\n\t\t/// </summary>\r\n\t\tMaterial m_writeToFloat;\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// The textures to hold the encoded data.\r\n\t\t/// To increase performance Ive made it so these\r\n\t\t/// textures are created once and reused. \r\n\t\t/// This does mean that the data must match the texture size. \r\n\t\t/// You can call the resize function to recreate the \r\n\t\t/// textures at a new size if needed. \r\n\t\t/// </summary>\r\n\t\tTexture2D m_mapR, m_mapG, m_mapB, m_mapA;\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// The current size of the maps.\r\n\t\t/// </summary>\r\n\t\tint m_width, m_height;\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// Create a new object that can write data into a render texture of dimensions w and h.\r\n\t\t/// </summary>\r\n\t\tpublic WriteFloat(int w, int h)\r\n\t\t{\r\n\r\n\t\t\tShader shader = ShaderReplacer.Instance.LoadedShaders[(\"EncodeFloat/WriteToFloat\")];\r\n\r\n\t\t\tif(shader == null)\r\n\t\t\t{\r\n\t\t\t\tthrow new InvalidOperationException(\"Could not find shader EncodeFloat/WriteToFloat. Did you change the shaders name?\");\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tm_writeToFloat = new Material(shader);\r\n\t\t\t\r\n\t\t\tm_width = w;\r\n\t\t\tm_height = h;\r\n\t\t\t\r\n\t\t\tm_mapR = new Texture2D(w, h, TextureFormat.ARGB32, false, true);\r\n\t\t\tm_mapR.filterMode = FilterMode.Point;\r\n\t\t\tm_mapR.wrapMode = TextureWrapMode.Clamp;\r\n\t\t\t\r\n\t\t\tm_mapG = new Texture2D(w, h, TextureFormat.ARGB32, false, true);\r\n\t\t\tm_mapG.filterMode = FilterMode.Point;\r\n\t\t\tm_mapG.wrapMode = TextureWrapMode.Clamp;\r\n\t\t\t\r\n\t\t\tm_mapB = new Texture2D(w, h, TextureFormat.ARGB32, false, true);\r\n\t\t\tm_mapB.filterMode = FilterMode.Point;\r\n\t\t\tm_mapB.wrapMode = TextureWrapMode.Clamp;\r\n\t\t\t\r\n\t\t\tm_mapA = new Texture2D(w, h, TextureFormat.ARGB32, false, true);\r\n\t\t\tm_mapA.filterMode = FilterMode.Point;\r\n\t\t\tm_mapA.wrapMode = TextureWrapMode.Clamp;\r\n\t\t\t\r\n\t\t}\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// Resize to new dimensions.\r\n\t\t/// </summary>\r\n\t\tpublic void Resize(int w, int h)\r\n\t\t{\r\n\t\t\t\r\n\t\t\tm_width = w;\r\n\t\t\tm_height = h;\r\n\t\t\t\r\n\t\t\tm_mapR.Resize(w, h, TextureFormat.ARGB32, false);\r\n\t\t\tm_mapG.Resize(w, h, TextureFormat.ARGB32, false);\r\n\t\t\tm_mapB.Resize(w, h, TextureFormat.ARGB32, false);\r\n\t\t\tm_mapA.Resize(w, h, TextureFormat.ARGB32, false);\r\n\t\t\t\r\n\t\t}\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// This will write the values in data array into tex\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"tex\">The texture to write into</param>\r\n\t\t/// <param name=\"channels\">The number of channels in texture</param>\r\n\t\t/// <param name=\"data\">The data to write into texture. Size must width * height * channels.</param>\r\n\t\tpublic void WriteIntoRenderTexture(RenderTexture tex, int channels, float[] data)\r\n\t\t{\r\n\t\t\t\r\n\t\t\tif(channels < 1 || channels > 4)\r\n\t\t\t{\r\n\t\t\t\tUtils.LogDebug(\"Channels must be 1, 2, 3, or 4\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tint w = tex.width;\r\n\t\t\tint h = tex.height;\r\n\t\t\t\r\n\t\t\tif(w != m_width || h != m_height)\r\n\t\t\t{\r\n\t\t\t\tUtils.LogDebug(\"Render texture not the correct dimensions\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tint size = w*h*channels;\r\n\t\t\t\r\n\t\t\tColor[] map = new Color[size];\r\n\t\t\t\r\n\t\t\tfloat max = 1.0f;\r\n\t\t\tfloat min = 0.0f;\r\n\t\t\tLoadData(data, map, size, ref min, ref max);\r\n\t\t\t\r\n\t\t\tWrite(w, h, channels, min, max, tex, map);\t\t\t\r\n\t\t}\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// Load 32 bit float data from raw file and write into render texture\r\n\t\t/// width the option of writting the loaded data into the fdata array if it is not null.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"tex\">The texture to write into</param>\r\n\t\t/// <param name=\"channels\">The number of channels in texture</param>\r\n\t\t/// <param name=\"data\">The data to write into texture. Size must width * height * channels.</param>\r\n\t\t/// <param name=\"fdata\">If this is not the data in the file will be written into this.</param>\r\n//\t\tpublic void WriteIntoRenderTexture(RenderTexture tex, int channels, string path, float[] fdata = null)\r\n\t\tpublic void WriteIntoRenderTexture(RenderTexture tex, int channels, string path, float[] fdata)\r\n\t\t{\r\n\t\t\t\r\n\t\t\tif(channels < 1 || channels > 4)\r\n\t\t\t{\r\n\t\t\t\tUtils.LogDebug(\"EncodeFloat::WriteIntoRenderTexture - Channels must be 1, 2, 3, or 4\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tint w = tex.width;\r\n\t\t\tint h = tex.height;\r\n\t\t\t\r\n\t\t\tif(w != m_width || h != m_height)\r\n\t\t\t{\r\n\t\t\t\tUtils.LogDebug(\"Render texture not the correct dimensions\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tint size = w*h*channels;\r\n\t\t\t\r\n\t\t\tColor[] map = new Color[size];\r\n\t\t\tif(fdata == null) fdata = new float[size];\r\n\t\t\t\r\n\t\t\tfloat max = 1.0f;\r\n\t\t\tfloat min = 0.0f;\r\n\t\t\tif(!LoadRawFile(path, map, size, ref min, ref max, fdata))\r\n\t\t\t{\r\n\t\t\t\tUtils.LogDebug(\"EncodeFloat::WriteIntoRenderTexture - Error loading raw file \" + path);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tWrite(w, h, channels, min, max, tex, map);\r\n\t\t}\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// Load 16 bit float data from raw file and write into render texture\r\n\t\t/// width the option of writting the loaded data in to the fdata array if it is not null.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"tex\">The texture to write into</param>\r\n\t\t/// <param name=\"channels\">The number of channels in texture</param>\r\n\t\t/// <param name=\"data\">The data to write into texture. Size must width * height * channels.</param>\r\n\t\t/// <param name=\"fdata\">If this is not the data in the file will be written into this.</param>\r\n\r\n//\t\tpublic void WriteIntoRenderTexture16bit(RenderTexture tex, int channels, string path, bool bigEndian, float[] fdata = null)\r\n\t\tpublic void WriteIntoRenderTexture16bit(RenderTexture tex, int channels, string path, bool bigEndian, float[] fdata)\r\n\t\t{\r\n\t\t\t\r\n\t\t\tif(channels < 1 || channels > 4)\r\n\t\t\t{\r\n\t\t\t\tUtils.LogDebug(\"Channels must be 1, 2, 3, or 4\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tint w = tex.width;\r\n\t\t\tint h = tex.height;\r\n\t\t\t\r\n\t\t\tif(w != m_width || h != m_height)\r\n\t\t\t{\r\n\t\t\t\tUtils.LogDebug(\"Render texture not the correct dimensions\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tint size = w*h*channels;\r\n\t\t\t\r\n\t\t\tColor[] map = new Color[size];\r\n\t\t\tif(fdata == null) fdata = new float[size];\r\n\t\t\t\r\n\t\t\tfloat max = 1.0f;\r\n\t\t\tfloat min = 0.0f;\r\n\t\t\tif(!LoadRawFile16(path, map, size, ref min, ref max, fdata, bigEndian))\r\n\t\t\t{\r\n\t\t\t\tUtils.LogDebug(\"EncodeFloat::WriteIntoRenderTexture16bit - Error loading raw file \" + path);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tWrite(w, h, channels, min, max, tex, map);\r\n\t\t}\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// Write the encoded float in map into texture.\r\n\t\t/// </summary>\r\n\t\tvoid Write(int w, int h, int c, float min, float max, RenderTexture tex, Color[] map)\r\n\t\t{\r\n\t\t\t\r\n\t\t\tfor(int x = 0; x < w; x++)\r\n\t\t\t{\r\n\t\t\t\tfor(int y = 0; y < h; y++)\r\n\t\t\t\t{\r\n\t\t\t\t\t\r\n\t\t\t\t\tif(c > 0)\r\n\t\t\t\t\t\tm_mapR.SetPixel(x, y, map[(x+y*w)*c+0]);\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tm_mapR.SetPixel(x, y, Color.clear);\r\n\t\t\t\t\t\r\n\t\t\t\t\tif(c > 1)\r\n\t\t\t\t\t\tm_mapG.SetPixel(x, y, map[(x+y*w)*c+1]);\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tm_mapG.SetPixel(x, y, Color.clear);\r\n\t\t\t\t\t\r\n\t\t\t\t\tif(c > 2)\r\n\t\t\t\t\t\tm_mapB.SetPixel(x, y, map[(x+y*w)*c+2]);\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tm_mapB.SetPixel(x, y, Color.clear);\r\n\t\t\t\t\t\r\n\t\t\t\t\tif(c > 3)\r\n\t\t\t\t\t\tm_mapA.SetPixel(x, y, map[(x+y*w)*c+3]);\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tm_mapA.SetPixel(x, y, Color.clear);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tm_mapR.Apply();\r\n\t\t\tm_mapG.Apply();\r\n\t\t\tm_mapB.Apply();\r\n\t\t\tm_mapA.Apply();\r\n\t\t\t\r\n\t\t\tm_writeToFloat.SetFloat(\"_Max\", max);\r\n\t\t\tm_writeToFloat.SetFloat(\"_Min\", min);\r\n\t\t\tm_writeToFloat.SetTexture(\"_TexR\", m_mapR);\r\n\t\t\tm_writeToFloat.SetTexture(\"_TexG\", m_mapG);\r\n\t\t\tm_writeToFloat.SetTexture(\"_TexB\", m_mapB);\r\n\t\t\tm_writeToFloat.SetTexture(\"_TexA\", m_mapA);\r\n\t\t\tGraphics.Blit(null, tex, m_writeToFloat);\r\n\t\t}\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// Encode a float into 4 bytes as normilized floats.\r\n\t\t/// </summary>\r\n\t\tfloat[] EncodeFloatRGBA(float val)\r\n\t\t{\r\n\t\t\t\r\n\t\t\tfloat[] kEncodeMul = new float[]{ 1.0f, 255.0f, 65025.0f, 160581375.0f };\r\n\t\t\tfloat kEncodeBit = 1.0f / 255.0f;            \r\n\t\t\tfor( int i = 0; i < kEncodeMul.Length; ++i )\r\n\t\t\t{\r\n\t\t\t\tkEncodeMul[i] *= val;\r\n\t\t\t\t// Frac\r\n\t\t\t\tkEncodeMul[i] = ( float )( kEncodeMul[i] - System.Math.Truncate( kEncodeMul[i] ) );\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t// enc -= enc.yzww * kEncodeBit;\r\n\t\t\tfloat[] yzww = new float[] { kEncodeMul[1], kEncodeMul[2], kEncodeMul[3], kEncodeMul[3] };\r\n\t\t\tfor( int i = 0; i < kEncodeMul.Length; ++i )\r\n\t\t\t{\r\n\t\t\t\tkEncodeMul[i] -= yzww[i] * kEncodeBit;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\treturn kEncodeMul;\r\n\t\t}\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// Find the range of the data and then pak it into the map.\r\n\t\t/// </summary>\r\n\t\tvoid LoadData(float[] data, Color[] map, int size, ref float min, ref float max) \r\n\t\t{\t\r\n\t\t\t\r\n\t\t\tfor(int x = 0 ; x < size; x++) \r\n\t\t\t{\r\n\t\t\t\t//Find the min and max range of data\r\n\t\t\t\tif(data[x] > max) max = data[x];\r\n\t\t\t\tif(data[x] < min) min = data[x];\r\n\t\t\t};\r\n\t\t\t\r\n\t\t\tmin = Mathf.Abs(min);\r\n\t\t\tmax += min;\r\n\t\t\t\r\n\t\t\tPackData(map, size, min, max, data);\r\n\t\t}\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// Load the data from a 32 bit file, find the range of the data and then pak it into the map.\r\n\t\t/// </summary>\r\n\t\tbool LoadRawFile(string path, Color[] map, int size, ref float min, ref float max, float[] fdata) \r\n\t\t{\t\r\n\t\t\tFileInfo fi = new FileInfo(path);\r\n\t\t\t\r\n\t\t\tif(fi == null)\r\n\t\t\t{\r\n\t\t\t\tUtils.LogDebug(\"Raw file not found\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tFileStream fs = fi.OpenRead();\r\n\t\t\t\r\n\t\t\tbyte[] data = new byte[fi.Length];\r\n\t\t\tfs.Read(data, 0, (int)fi.Length);\r\n\t\t\tfs.Close();\r\n\t\t\t\r\n\t\t\t//divide by 4 as there are 4 bytes in a 32 bit float\r\n\t\t\tif(size > fi.Length/4)\r\n\t\t\t{\r\n\t\t\t\tUtils.LogDebug(\"Raw file is not the required size\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tint i = 0;\r\n\t\t\tfor(int x = 0 ; x < size; x++) \r\n\t\t\t{\r\n\t\t\t\t//Convert 4 bytes to 1 32 bit float\r\n\t\t\t\tfdata[x] = System.BitConverter.ToSingle(data, i);\r\n\t\t\t\t\r\n\t\t\t\t//Find the min and max range of data\r\n\t\t\t\tif(fdata[x] > max) max = fdata[x];\r\n\t\t\t\tif(fdata[x] < min) min = fdata[x];\r\n\t\t\t\t\r\n\t\t\t\ti += 4; // theres 4 bytes in 32 bits so increment i by 4\r\n\t\t\t};\r\n\t\t\t\r\n\t\t\tmin = Mathf.Abs(min);\r\n\t\t\tmax += min;\r\n\t\t\t\r\n\t\t\tPackData(map, size, min, max, fdata);\r\n\t\t\t\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// Load the data from a 16 bit file, find the range of the data and then pak it into the map.\r\n\t\t/// </summary>\r\n\t\tbool LoadRawFile16(string path, Color[] map, int size, ref float min, ref float max, float[] fdata, bool bigendian) \r\n\t\t{\t\r\n\t\t\tFileInfo fi = new FileInfo(path);\r\n\t\t\t\r\n\t\t\tif(fi == null)\r\n\t\t\t{\r\n\t\t\t\tUtils.LogDebug(\"Raw file not found\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tFileStream fs = fi.OpenRead();\r\n\t\t\t\r\n\t\t\tbyte[] data = new byte[fi.Length];\r\n\t\t\tfs.Read(data, 0, (int)fi.Length);\r\n\t\t\tfs.Close();\r\n\t\t\t\r\n\t\t\t//divide by 2 as there are 2 bytes in a 16 bit float\r\n\t\t\tif(size > fi.Length/2)\r\n\t\t\t{\r\n\t\t\t\tUtils.LogDebug(\"Raw file is not the required size\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tint i = 0;\r\n\t\t\tfor(int x = 0 ; x < size; x++) \r\n\t\t\t{\r\n\t\t\t\t//Extract 16 bit data and normalize.\r\n\t\t\t\tfdata[x] = (bigendian) ? (data[i++]*256.0f + data[i++]) : (data[i++] + data[i++]*256.0f);\r\n\t\t\t\tfdata[x] /= 65535.0f;\r\n\t\t\t\t\r\n\t\t\t\t//Find the min and max range of data\r\n\t\t\t\tif(fdata[x] > max) max = fdata[x];\r\n\t\t\t\tif(fdata[x] < min) min = fdata[x];\r\n\t\t\t};\r\n\t\t\t\r\n\t\t\tmin = Mathf.Abs(min);\r\n\t\t\tmax += min;\r\n\t\t\t\r\n\t\t\tPackData(map, size, min, max, fdata);\r\n\t\t\t\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// Encode data into the map.\r\n\t\t/// </summary>\r\n\t\tvoid PackData(Color[] map, int size, float min, float max, float[] data)\r\n\t\t{\r\n\t\t\tfor(int x = 0 ; x < size; x++) \r\n\t\t\t{\r\n\t\t\t\tfloat normalizedData = (data[x] + min) / max;\r\n\t\t\t\t\r\n\t\t\t\t//does not work on value of one\r\n\t\t\t\tif(normalizedData >= 1.0f) normalizedData = MAX_VALUE;\r\n\t\t\t\t\r\n\t\t\t\tfloat[] farray = EncodeFloatRGBA(normalizedData);\r\n\t\t\t\t\r\n\t\t\t\tmap[x] = new Color(farray[0], farray[1], farray[2], farray[3]);\r\n\t\t\t};\r\n\t\t}\r\n\r\n\r\n\t\tpublic void OnDestroy ()\r\n\t\t{\r\n\t\t\tUnityEngine.Object.Destroy(m_mapA);\r\n\t\t\tUnityEngine.Object.Destroy(m_mapR);\r\n\t\t\tUnityEngine.Object.Destroy(m_mapG);\r\n\t\t\tUnityEngine.Object.Destroy(m_mapB);\r\n\t\t\tUnityEngine.Object.Destroy (m_writeToFloat);\r\n\r\n\t\t}\r\n\t\t\r\n\t}\r\n\t\r\n}\r\n"
  },
  {
    "path": "scatterer/Effects/Proland/ProlandManager.cs",
    "content": "using System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.IO;\r\nusing System.Reflection;\r\nusing System.Runtime;\r\nusing KSP;\r\nusing KSP.IO;\r\nusing UnityEngine;\r\n\r\nnamespace Scatterer\r\n{\r\n\t/*\r\n\t * A manager to organise what order update functions are called\r\n\t * Manages all effects taken from Proland (ie Precomputed Scattering and Ocean, maybe one day forests...)\r\n\t * The class structures from original Proland are kept, with some added Utilities related to scatterer and KSP\r\n\t * Provides a location for common settings and allows the nodes to access each other\r\n\t */\r\n\tpublic class ProlandManager: MonoBehaviour\r\n\t{\r\n\t\t\r\n\t\tpublic bool hasOcean = false;\r\n\t\tpublic bool usesCloudIntegration = true;\r\n\t\tpublic bool cloudIntegrationUsesScattererSunColors = false;\r\n\t\tpublic bool flatScaledSpaceModel = false;\r\n\t\t\r\n\t\tpublic double m_radius = 600000.0;\r\n\t\tpublic float mainMenuScaleFactor = 1f;\r\n\t\t\r\n\t\tOceanFFTgpu oceanNode;\r\n\t\tpublic SkyNode skyNode;\r\n\r\n\t\tpublic Color sunColor;\r\n\t\tpublic CelestialBody parentCelestialBody;\r\n\t\tpublic Transform parentScaledTransform;\r\n\t\tpublic Transform parentLocalTransform;\r\n\r\n\t\tpublic bool sunsUseIntensityCurves;\r\n\t\tpublic CelestialBody sunCelestialBody;\r\n\t\tpublic List<CelestialBody> eclipseCasters=new List<CelestialBody> {};\r\n\t\tpublic List<AtmoPlanetShineSource> planetshineSources=new List<AtmoPlanetShineSource> {};\r\n\t\tpublic List<SecondarySun> secondarySuns=new List<SecondarySun> {};\r\n\r\n\t\tpublic Light mainSunLight, mainScaledSunLight;\r\n\t\tpublic ScattererCelestialBody scattererCelestialBody;\r\n\r\n\t\tpublic Matrix4x4 planetShineSourcesMatrix=Matrix4x4.zero;\r\n\t\tpublic Matrix4x4 planetShineRGBMatrix=Matrix4x4.zero;\t\t\t\t\t//Contains the colors set in the scatterer config\r\n\t\tpublic Matrix4x4 planetShineOriginalRGBMatrix=Matrix4x4.zero;\t\t\t//Contains the original colors of the directional lights, if available\r\n\r\n\t\tpublic void Init(ScattererCelestialBody scattererBody)\r\n\t\t{\r\n\t\t\tscattererCelestialBody = scattererBody;\r\n\t\t\tparentCelestialBody = scattererBody.celestialBody;\r\n\t\t\tsunColor=scattererBody.sunColor;\r\n\t\t\tflatScaledSpaceModel = scattererBody.flatScaledSpaceModel;\r\n\t\t\tusesCloudIntegration = scattererBody.usesCloudIntegration;\r\n\t\t\tcloudIntegrationUsesScattererSunColors = scattererBody.cloudIntegrationUsesScattererSunColors;\r\n\t\t\thasOcean = scattererBody.hasOcean;\r\n\t\t\tsunsUseIntensityCurves = scattererBody.sunsUseIntensityCurves;\r\n\t\t\t\r\n\t\t\tsunCelestialBody = FlightGlobals.Bodies.SingleOrDefault (_cb => _cb.GetName () == scattererBody.mainSunCelestialBody);\r\n\r\n\t\t\tmainSunLight = findLight (scattererBody.mainSunCelestialBody);\r\n\t\t\tmainScaledSunLight = findScaledLight (scattererBody.mainSunCelestialBody);\r\n\r\n\t\t\tif (!mainSunLight)\r\n\t\t\t{\r\n\t\t\t\tUtils.LogError (\"No light found for \" + scattererBody.mainSunCelestialBody + \" for body \" + parentCelestialBody.name + \". Defaulting to main sunlight, godrays, lightrays and caustics may look wrong, check your Kopernicus configuration.\");\r\n\t\t\t\tmainSunLight = Scatterer.Instance.sunLight;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tif (Scatterer.Instance.mainSettings.terrainShadows)\r\n\t\t\t\t\tScatterer.Instance.SetShadowsForLight (mainSunLight);\r\n\t\t\t\telse\r\n\t\t\t\t\tScatterer.Instance.DisableCustomShadowResForLight (mainSunLight);\r\n\t\t\t}\r\n\r\n\t\t\tif (HighLogic.LoadedScene == GameScenes.MAINMENU)\r\n\t\t\t{\r\n\t\t\t\t\tparentScaledTransform = Utils.GetMainMenuObject(scattererBody.celestialBody).transform;\r\n\t\t\t\t\tparentLocalTransform  = Utils.GetMainMenuObject(scattererBody.celestialBody).transform;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tparentScaledTransform = scattererBody.transform;\r\n\t\t\t\tparentLocalTransform  = scattererBody.celestialBody.transform;\r\n\t\t\t}\r\n\r\n\t\t\tFindEclipseCasters (scattererBody);\r\n\t\t\tFindPlanetShineSources (scattererBody);\r\n\r\n\t\t\tif (HighLogic.LoadedScene == GameScenes.MAINMENU)\r\n\t\t\t{\r\n\t\t\t\tGameObject _go = Utils.GetMainMenuObject(scattererBody.celestialBody);\r\n\t\t\t\tif (_go)\r\n\t\t\t\t{\r\n\t\t\t\t\tMeshRenderer _mr = _go.GetComponent<MeshRenderer> ();\r\n\t\t\t\t\tif (_mr)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tvar sctBodyTransform = ScaledSpace.Instance.transform.FindChild (parentCelestialBody.name);\r\n\t\t\t\t\t\tmainMenuScaleFactor = (_go.transform.localScale.x / sctBodyTransform.localScale.x);\r\n\t\t\t\t\t\tm_radius = mainMenuScaleFactor * parentCelestialBody.Radius;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tm_radius = parentCelestialBody.Radius;\r\n\t\t\t}\r\n\r\n\t\t\tInitSecondarySuns ();\r\n\r\n\t\t\tInitSkyAndOceanNodes ();\r\n\t\t}\r\n\r\n\t\t//TODO: move to utils\r\n\t\tLight findLight (string sunCelestialBody)\r\n\t\t{\r\n\t\t\tLight light = Scatterer.Instance.lights.SingleOrDefault (_light => (_light != null) && (_light.gameObject != null) && (_light.gameObject.name == sunCelestialBody));\r\n\r\n\t\t\tif (!light && (sunCelestialBody == \"Sun\"))\r\n\t\t\t\tlight = Scatterer.Instance.sunLight;\r\n\r\n\t\t\treturn light;\r\n\t\t}\r\n\t\t\r\n\t\tLight findScaledLight (string sunCelestialBody)\r\n\t\t{\r\n\t\t\tLight light = Scatterer.Instance.lights.SingleOrDefault (_light => (_light != null) && (_light.gameObject != null) && (_light.gameObject.name == (\"Scaledspace SunLight \"+sunCelestialBody)));\r\n\r\n\t\t\tif (!light && (sunCelestialBody == \"Sun\"))\r\n\t\t\t\tlight = Scatterer.Instance.scaledSpaceSunLight;\r\n\t\t\t\r\n\t\t\treturn  light;\r\n\t\t}\r\n\r\n\t\tvoid FindEclipseCasters (ScattererCelestialBody scattererBody)\r\n\t\t{\r\n\t\t\tif (Scatterer.Instance.mainSettings.useEclipses) {\r\n\t\t\t\tfor (int k = 0; k < scattererBody.eclipseCasters.Count; k++) {\r\n\t\t\t\t\tvar cc = FlightGlobals.Bodies.SingleOrDefault (_cb => _cb.GetName () == scattererBody.eclipseCasters [k]);\r\n\t\t\t\t\tif (cc == null)\r\n\t\t\t\t\t\tUtils.LogDebug (\"Eclipse caster \" + scattererBody.eclipseCasters [k] + \" not found for \" + scattererBody.celestialBodyName);\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\teclipseCasters.Add (cc);\r\n\t\t\t\t\t\tUtils.LogDebug (\"Added eclipse caster \" + scattererBody.eclipseCasters [k] + \" for \" + scattererBody.celestialBodyName);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid FindPlanetShineSources (ScattererCelestialBody scattererBody)\r\n\t\t{\r\n\t\t\tif (Scatterer.Instance.mainSettings.usePlanetShine) {\r\n\t\t\t\tfor (int k = 0; k < scattererBody.planetshineSources.Count; k++)\r\n\t\t\t\t{\r\n\t\t\t\t\tvar cc = FlightGlobals.Bodies.SingleOrDefault (_cb => _cb.GetName () == scattererBody.planetshineSources [k].bodyName);\r\n\t\t\t\t\tif (cc == null)\r\n\t\t\t\t\t\tUtils.LogDebug (\"planetshine source \" + scattererBody.planetshineSources [k].bodyName + \" not found for \" + scattererBody.celestialBodyName);\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tAtmoPlanetShineSource src = scattererBody.planetshineSources [k];\r\n\t\t\t\t\t\tsrc.body = cc;\r\n\t\t\t\t\t\tscattererBody.planetshineSources [k].body = cc;\r\n\t\t\t\t\t\tplanetshineSources.Add (src);\r\n\t\t\t\t\t\tUtils.LogDebug (\"Added planetshine source\" + scattererBody.planetshineSources [k].bodyName + \" for \" + scattererBody.celestialBodyName);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid InitSkyAndOceanNodes ()\r\n\t\t{\r\n\t\t\tskyNode = (SkyNode)Scatterer.Instance.scaledSpaceCamera.gameObject.AddComponent (typeof(SkyNode));\r\n\t\t\tskyNode.prolandManager = this;\r\n\t\t\tskyNode.SetCelestialBodyName (parentCelestialBody.name);\r\n\t\t\tskyNode.SetParentScaledTransform (parentScaledTransform);\r\n\t\t\tskyNode.SetParentLocalTransform (parentLocalTransform);\r\n\t\t\tskyNode.usesCloudIntegration = usesCloudIntegration;\r\n\t\t\tskyNode.mainMenuScaleFactor = mainMenuScaleFactor;\r\n\r\n\t\t\tif (skyNode.LoadFromConfigNode ())\r\n\t\t\t{\r\n\t\t\t\tskyNode.Init ();\r\n\t\t\t\tif (hasOcean && Scatterer.Instance.mainSettings.useOceanShaders && (HighLogic.LoadedScene != GameScenes.MAINMENU))\r\n\t\t\t\t{\r\n\t\t\t\t\tif (Scatterer.Instance.mainSettings.oceanFoam)\r\n\t\t\t\t\t\toceanNode = (OceanFFTgpu) Scatterer.Instance.scaledSpaceCamera.gameObject.AddComponent(typeof(OceanWhiteCaps));\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\toceanNode = (OceanFFTgpu) Scatterer.Instance.scaledSpaceCamera.gameObject.AddComponent(typeof(OceanFFTgpu));\r\n\r\n\t\t\t\t\toceanNode.Init (this);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tpublic void Update()\r\n\t\t{\r\n\t\t\tif (secondarySuns.Count > 0)\r\n\t\t\t{\r\n\t\t\t\tUpdateSecondarySuns();\r\n\t\t\t}\r\n\r\n\t\t\tskyNode.UpdateNode();\r\n\t\t\t\r\n\t\t\tif (oceanNode)\r\n\t\t\t{\r\n\t\t\t\toceanNode.UpdateNode();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid FindSecondarySuns (ScattererCelestialBody scattererBody)\r\n\t\t{\r\n\t\t\tforeach (SecondarySunConfig sunConfig in scattererBody.secondarySuns)\r\n\t\t\t{\r\n\t\t\t\tSecondarySun secondarySun = SecondarySun.FindSecondarySun (sunConfig);\r\n\t\t\t\tif (secondarySun != null)\r\n\t\t\t\t{\r\n\t\t\t\t\tsecondarySun.sunLight = findLight (sunConfig.celestialBodyName);\r\n\t\t\t\t\tsecondarySun.scaledSunLight = findScaledLight (sunConfig.celestialBodyName);\r\n\t\t\t\t\tsecondarySuns.Add (secondarySun);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tvoid InitSecondarySuns ()\r\n\t\t{\r\n\t\t\tFindSecondarySuns (scattererCelestialBody);\r\n\r\n\t\t\tplanetShineRGBMatrix = Matrix4x4.zero;\r\n\t\t\t\r\n\t\t\tfor (int i = 0; i < Math.Min (4, secondarySuns.Count); i++)\r\n\t\t\t{\r\n\t\t\t\tplanetShineRGBMatrix.SetRow (i, new Vector4 (secondarySuns[i].config.sunColor.r, secondarySuns[i].config.sunColor.g, secondarySuns[i].config.sunColor.b, 1.0f));\r\n\t\t\t\tif (secondarySuns[i].scaledSunLight != null)\r\n\t\t\t\t\tplanetShineOriginalRGBMatrix.SetRow (i, new Vector4 (secondarySuns[i].scaledSunLight.color.r, secondarySuns[i].scaledSunLight.color.g, secondarySuns[i].scaledSunLight.color.b, 1.0f));\r\n\t\t\t\telse\r\n\t\t\t\t\tplanetShineOriginalRGBMatrix.SetRow(i, planetShineRGBMatrix.GetRow(i));\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid UpdateSecondarySuns ()\r\n\t\t{\r\n\t\t\tplanetShineSourcesMatrix = Matrix4x4.zero;\r\n\r\n\t\t\tfor (int i = 0; i < Math.Min (4, secondarySuns.Count); i++)\r\n\t\t\t{\r\n\t\t\t\tVector3 sourcePosRelPlanet = Vector3.Scale (secondarySuns[i].celestialBody.position - parentCelestialBody.GetTransform ().position, new Vector3d (ScaledSpace.ScaleFactor, ScaledSpace.ScaleFactor, ScaledSpace.ScaleFactor));\t//has to be this that is borked\r\n\t\t\t\tplanetShineSourcesMatrix.SetRow (i, new Vector4 (sourcePosRelPlanet.x, sourcePosRelPlanet.y, sourcePosRelPlanet.z, 1.0f));\r\n\r\n\t\t\t\tif (secondarySuns[i].scaledSunLight != null)\r\n\t\t\t\t{\r\n\t\t\t\t\tif (sunsUseIntensityCurves)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tplanetShineRGBMatrix[i,3] = secondarySuns[i].scaledSunLight.intensity;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (!cloudIntegrationUsesScattererSunColors)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tplanetShineOriginalRGBMatrix.SetRow (i, new Vector4 (secondarySuns[i].scaledSunLight.color.r, secondarySuns[i].scaledSunLight.color.g, secondarySuns[i].scaledSunLight.color.b, secondarySuns[i].scaledSunLight.intensity));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tpublic void OnDestroy()\r\n\t\t{\r\n\t\t\tif (skyNode)\r\n\t\t\t{\r\n\t\t\t\tskyNode.OnDestroy(); // no idea why this doesn't fire by itself sometimes\r\n\t\t\t\tComponent.Destroy(skyNode);\r\n\t\t\t}\r\n\r\n\t\t\tif (oceanNode)\r\n\t\t\t{\r\n\t\t\t\toceanNode.OnDestroy();\r\n\t\t\t\tComponent.Destroy(oceanNode);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t//TODO: change this so that it takes the new configNode and that's all? May not be possible depending on if it needs to recreate lightraysRenderer and stuff\r\n\t\t//Therefor add an option to init from configNode? yep\r\n\t\tpublic void reBuildOcean()\r\n\t\t{\r\n\t\t\tif (oceanNode)\r\n\t\t\t{\r\n\t\t\t\tComponent.DestroyImmediate(oceanNode);\r\n\r\n\t\t\t\tif (Scatterer.Instance.mainSettings.oceanFoam)\r\n\t\t\t\t\toceanNode = (OceanFFTgpu) Scatterer.Instance.scaledSpaceCamera.gameObject.AddComponent(typeof(OceanWhiteCaps));\r\n\t\t\t\telse\r\n\t\t\t\t\toceanNode = (OceanFFTgpu) Scatterer.Instance.scaledSpaceCamera.gameObject.AddComponent(typeof(OceanFFTgpu));\r\n\r\n\t\t\t\toceanNode.Init(this);\r\n\r\n\t\t\t\tUtils.LogDebug(\"Rebuilt Ocean\");\r\n\t\t\t}\r\n\r\n\t\t\tif (skyNode)\r\n\t\t\t\tskyNode.InitOceanMaterialUniforms();\r\n\t\t}\r\n\r\n\t\tpublic Vector3 getDirectionToMainSun()\r\n\t\t{\r\n\t\t\tif (HighLogic.LoadedScene == GameScenes.MAINMENU)\r\n\t\t\t{\r\n\t\t\t\treturn (Scatterer.Instance.mainMenuLight.gameObject.transform.forward*(-1));\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t\treturn (sunCelestialBody.GetTransform().position - parentCelestialBody.GetTransform().position).normalized;\t\t\t\r\n\t\t}\r\n\r\n\t\tpublic Vector3 getDirectionToCelestialBody(CelestialBody target)\r\n\t\t{\r\n\t\t\treturn (target.GetTransform().position - parentCelestialBody.GetTransform().position);\t\t\t\r\n\t\t}\r\n\r\n\t\tpublic double GetRadius() {\r\n\t\t\treturn m_radius;\r\n\t\t}\r\n\r\n\t\tpublic OceanFFTgpu GetOceanNode() {\r\n\t\t\treturn oceanNode;\r\n\t\t}\r\n\t\t\r\n\t\tpublic SkyNode GetSkyNode() {\r\n\t\t\treturn skyNode;\r\n\t\t}\r\n\r\n\t\tpublic Color getIntensityModulatedSunColor()\r\n\t\t{\r\n\t\t\treturn (sunsUseIntensityCurves ? sunColor * mainScaledSunLight.intensity : sunColor);\r\n\t\t}\r\n\t}\r\n}"
  },
  {
    "path": "scatterer/Effects/ScattererCelestialBodiesManager.cs",
    "content": "// Manages loading,unloading and updating for all the Scatterer-enabled celestial bodies\r\n// Will spawn/delete/update a ProlandManager for each body if within range\r\nusing System;\r\nusing System.Linq;\r\nusing UnityEngine;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class ScattererCelestialBodiesManager\r\n\t{\t\r\n\t\tpublic bool underwater = false;\r\n\t\t\r\n\t\tbool pqsEnabledOnScattererPlanet = false;\r\n\t\tpublic bool isPQSEnabledOnScattererPlanet{get{return pqsEnabledOnScattererPlanet;}}\r\n\r\n\t\tbool customOceanEnabledOnScattererPlanet = false;\r\n\t\tpublic bool isCustomOceanEnabledOnScattererPlanet{get{return customOceanEnabledOnScattererPlanet;}}\r\n\r\n\t\tpublic ScattererCelestialBodiesManager ()\r\n\t\t{\r\n\t\t}\r\n\r\n\t\tpublic void Init()\r\n\t\t{\r\n\t\t\tfindCelestialBodies ();\r\n\t\t}\r\n\r\n\t\tpublic void Update()\r\n\t\t{\r\n\t\t\tUpdateProlandManagers ();\r\n\t\t}\r\n\t\t\r\n\t\tvoid UpdateProlandManagers ()\r\n\t\t{\r\n\t\t\tpqsEnabledOnScattererPlanet = false;\r\n\t\t\tunderwater = false;\r\n\t\t\tcustomOceanEnabledOnScattererPlanet = false;\r\n\r\n\t\t\tforeach (ScattererCelestialBody scattererCelestialBody in Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies)\r\n\t\t\t{\r\n\t\t\t\tfloat minDistance;\t//smallest distance to either the camera or ship\r\n\t\t\t\tif (scattererCelestialBody.isFound)\r\n\t\t\t\t{\r\n\t\t\t\t\tminDistance = Vector3.Distance (Scatterer.Instance.scaledSpaceCamera.transform.position, scattererCelestialBody.transform.position) * ScaledSpace.ScaleFactor;\r\n\t\t\t\t\tminDistance = FlightGlobals.ActiveVessel ? Mathf.Min(minDistance, Vector3.Distance (FlightGlobals.ActiveVessel.transform.position, ScaledSpace.ScaledToLocalSpace (scattererCelestialBody.transform.position))) : minDistance;\r\n\r\n\t\t\t\t\tif (scattererCelestialBody.active)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif (minDistance > scattererCelestialBody.unloadDistance)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tunloadEffectsForBody(scattererCelestialBody);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tupdateBody (scattererCelestialBody, ref pqsEnabledOnScattererPlanet, ref underwater, ref customOceanEnabledOnScattererPlanet);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\t\r\n\t\t\t\t\t\tif (minDistance < scattererCelestialBody.loadDistance && scattererCelestialBody.transform && scattererCelestialBody.celestialBody)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tloadEffectsForBody (scattererCelestialBody);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid findCelestialBodies()\r\n\t\t{\r\n\t\t\tforeach (ScattererCelestialBody sctBody in Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies)\r\n\t\t\t{\r\n\t\t\t\tUtils.LogDebug(\"Finding ScattererCelestialBody name: \"+sctBody.celestialBodyName+\". TransformName: \"+sctBody.transformName);\r\n\r\n\t\t\t\tvar celBody = FlightGlobals.Bodies.SingleOrDefault (_cb => _cb.bodyName == sctBody.celestialBodyName);\r\n\t\t\t\t\r\n\t\t\t\tif (celBody == null)\r\n\t\t\t\t{\r\n\t\t\t\t\tUtils.LogDebug(\"ScattererCelestialBody not found by name, trying transformName\");\r\n\t\t\t\t\tcelBody = FlightGlobals.Bodies.SingleOrDefault (_cb => _cb.bodyName == sctBody.transformName);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (celBody == null)\r\n\t\t\t\t{\r\n\t\t\t\t\tUtils.LogError(\"ScattererCelestialBody \"+sctBody.celestialBodyName+\" not found by name, or transformName. Effects for this body won't be available.\");\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\telse\t\t\t\t\r\n\t\t\t\t{\r\n\t\t\t\t\tUtils.LogDebug (\"Found ScattererCelestialBody: \" + sctBody.celestialBodyName + \", actual ingame name: \" + celBody.GetName ());\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tsctBody.celestialBody = celBody;\r\n\t\t\t\t\r\n\t\t\t\tvar sctBodyTransform = ScaledSpace.Instance.transform.FindChild (sctBody.transformName);\r\n\t\t\t\tif (!sctBodyTransform)\r\n\t\t\t\t{\r\n\t\t\t\t\tsctBodyTransform = ScaledSpace.Instance.transform.FindChild (sctBody.celestialBodyName);\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tsctBody.transform = sctBodyTransform;\r\n\t\t\t\t\tsctBody.isFound = true;\r\n\t\t\t\t}\r\n\t\t\t\tsctBody.active = false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid loadEffectsForBody (ScattererCelestialBody scattererCelestialBody)\r\n\t\t{\r\n\t\t\ttry\r\n\t\t\t{\r\n\t\t\t\tif (HighLogic.LoadedScene == GameScenes.TRACKSTATION || HighLogic.LoadedScene == GameScenes.MAINMENU)\r\n\t\t\t\t\tscattererCelestialBody.hasOcean = false;\r\n\t\t\t\t\r\n\t\t\t\tscattererCelestialBody.prolandManager = new ProlandManager ();\r\n\t\t\t\tscattererCelestialBody.prolandManager.Init (scattererCelestialBody);\r\n\t\t\t\tscattererCelestialBody.active = true;\r\n\t\t\t\t\r\n\t\t\t\tif (Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies.Contains (scattererCelestialBody))\r\n\t\t\t\t{\r\n\t\t\t\t\tScatterer.Instance.guiHandler.LoadPlanet(Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies.IndexOf (scattererCelestialBody));\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tthrow new Exception (\"Planet already removed from planets list\");\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tUtils.LogDebug (\"Effects loaded for \" + scattererCelestialBody.celestialBodyName);\r\n\t\t\t}\r\n\t\t\tcatch (Exception exception)\r\n\t\t\t{\r\n\t\t\t\tif (HighLogic.LoadedScene != GameScenes.MAINMENU || !exception.Message.Contains(\"No correct main menu object found for \"))\r\n\t\t\t\t\tUtils.LogError (\"Effects couldn't be loaded for \" + scattererCelestialBody.celestialBodyName + \", \" + exception.ToString ());\r\n\t\t\t\t\r\n\t\t\t\ttry {\r\n\t\t\t\t\tscattererCelestialBody.prolandManager.OnDestroy ();\r\n\t\t\t\t}\r\n\t\t\t\tcatch (Exception exception2) {\r\n\t\t\t\t\tUtils.LogDebug (\"manager couldn't be removed for \" + scattererCelestialBody.celestialBodyName + \" because of exception: \" + exception2.ToString ());\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tScatterer.Instance.planetsConfigsReader.scattererCelestialBodies.Remove (scattererCelestialBody);\r\n\t\t\t\t\r\n\t\t\t\tif (HighLogic.LoadedScene != GameScenes.MAINMENU)\r\n\t\t\t\t{\r\n\t\t\t\t\tUtils.LogDebug (\"\" + scattererCelestialBody.celestialBodyName + \" removed from active planets.\");\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tScattererCelestialBody updateBody (ScattererCelestialBody scattererCelestialBody, ref bool inPqsEnabledOnScattererPlanet, ref bool inUnderwater, ref bool inCustomOceanEnabledOnScattererPlanet)\r\n\t\t{\r\n\t\t\tscattererCelestialBody.prolandManager.Update ();\r\n\t\t\tinPqsEnabledOnScattererPlanet = inPqsEnabledOnScattererPlanet || !scattererCelestialBody.prolandManager.skyNode.inScaledSpace;\r\n\t\t\tif (inPqsEnabledOnScattererPlanet && scattererCelestialBody.prolandManager.GetOceanNode()) {\r\n\t\t\t\tinCustomOceanEnabledOnScattererPlanet = true;\r\n\t\t\t\tinUnderwater = scattererCelestialBody.prolandManager.GetOceanNode ().isUnderwater;\r\n\t\t\t}\r\n\t\t\treturn scattererCelestialBody;\r\n\t\t}\r\n\t\t\r\n\t\tvoid unloadEffectsForBody(ScattererCelestialBody scattererCelestialBody)\r\n\t\t{\r\n\t\t\tscattererCelestialBody.prolandManager.OnDestroy ();\r\n\t\t\tUnityEngine.Object.DestroyImmediate (scattererCelestialBody.prolandManager);\r\n\t\t\tscattererCelestialBody.prolandManager = null;\r\n\t\t\tscattererCelestialBody.active = false;\r\n\t\t\tUtils.LogDebug (\"Effects unloaded for \" + scattererCelestialBody.celestialBodyName);\r\n\t\t}\r\n\r\n\t\tpublic void Cleanup()\r\n\t\t{\r\n\t\t\tforeach (ScattererCelestialBody scattererCelestialBody in Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies)\r\n\t\t\t{\t\r\n\t\t\t\tif (scattererCelestialBody.active)\r\n\t\t\t\t{\r\n\t\t\t\t\tscattererCelestialBody.prolandManager.OnDestroy ();\r\n\t\t\t\t\tUnityEngine.Object.DestroyImmediate (scattererCelestialBody.prolandManager);\r\n\t\t\t\t\tscattererCelestialBody.prolandManager = null;\r\n\t\t\t\t\tscattererCelestialBody.active = false;\r\n\t\t\t\t\tUtils.LogDebug (\"Effects unloaded for \" + scattererCelestialBody.celestialBodyName);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/Effects/SunFlare/SunFlare.cs",
    "content": "//rendering steps\r\n//scaledSpaceCamera.OnPrecull -> skynodes update the extinction texture one after one\r\n//camerahook on the relevant scaledSpace or farCamera -> clear the extinction texture before the next frame\r\n//while taking care of keeping it around until the rendering has finished (either nearCamera or scaledCamera)\r\n\r\nusing UnityEngine;\r\nusing System.Collections;\r\nusing System.IO;\r\n\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\n\r\nusing KSP.IO;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class SunFlare : MonoBehaviour\r\n\t{\r\n\t\tpublic ConfigNode configNodeToLoad;\r\n\r\n\t\tpublic Material sunglareMaterial;\r\n\r\n\t\tpublic CelestialBody source;\r\n\t\tpublic string sourceName;\r\n\t\tpublic Transform sourceScaledTransform;\r\n\r\n\t\tstatic Dictionary<string, Texture2D> texturesDictionary = new Dictionary<string, Texture2D> ();\r\n\r\n\r\n\t\tpublic RenderTexture extinctionTexture;\r\n\t\tint waitBeforeReloadCnt = 0;\r\n\t\tSunflareCameraHook nearCameraHook, scaledCameraHook;\r\n\r\n\t\tRaycastHit hit;\r\n\t\tbool hitStatus=false;\r\n\t\tbool flareRendering=false;\r\n\r\n\t\tpublic bool FlareRendering {\r\n\t\t\tget {\r\n\t\t\t\treturn flareRendering;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfloat sunGlareScale=1;\r\n\t\tfloat sunGlareFade=1;\r\n\t\tfloat ghostFade=1;\r\n\r\n\t\tMesh screenMesh;\r\n\t\tGameObject sunflareGameObject;\r\n\t\t\r\n\t\tpublic int syntaxVersion = 1;\r\n\r\n\t\tSunflareSettingsV1 settingsV1;\r\n\t\tSunflareSettingsV2 settingsV2;\r\n\r\n\t\tpublic void start()\r\n\t\t{\r\n\t\t\tLoadSettings ();\r\n\r\n\t\t\tsunglareMaterial = new Material (ShaderReplacer.Instance.LoadedShaders[\"Scatterer/sunFlare\"]);\r\n\r\n\t\t\tsunglareMaterial.SetOverrideTag (\"IGNOREPROJECTOR\", \"True\");\r\n\t\t\tsunglareMaterial.SetOverrideTag (\"IgnoreProjector\", \"True\");\r\n\r\n\t\t\tUtils.EnableOrDisableShaderKeywords (sunglareMaterial, \"SCATTERER_MERGED_DEPTH_ON\", \"SCATTERER_MERGED_DEPTH_OFF\", !Scatterer.Instance.unifiedCameraMode);\r\n\r\n\t\t\tif (!Scatterer.Instance.unifiedCameraMode)\r\n\t\t\t{\r\n\t\t\t\tif (HighLogic.LoadedScene != GameScenes.TRACKSTATION && DepthToDistanceCommandBuffer.RenderTexture != null)\r\n\t\t\t\t{\r\n\t\t\t\t\tsunglareMaterial.SetTexture (\"_customDepthTexture\", DepthToDistanceCommandBuffer.RenderTexture);\r\n                }\r\n                else\r\n\t\t\t\t\tsunglareMaterial.SetTexture (\"_customDepthTexture\", Texture2D.whiteTexture);\t//keep this in mind for when doing multiple points check and ditching raycast\r\n\t\t\t}\r\n\r\n\t\t\tsunglareMaterial.renderQueue = 3100;\r\n\r\n\t\t\tscreenMesh = MeshFactory.MakePlane (2, 2, MeshFactory.PLANE.XY, false, false);\r\n\t\t\tscreenMesh.bounds = new Bounds (Vector4.zero, new Vector3 (Mathf.Infinity, Mathf.Infinity, Mathf.Infinity));\r\n\r\n\t\t\tsunflareGameObject = new GameObject ();\r\n\t\t\tMeshFilter sunflareGameObjectMeshFilter;\r\n\r\n\t\t\tif (sunflareGameObject.GetComponent<MeshFilter> ())\r\n\t\t\t\tsunflareGameObjectMeshFilter = sunflareGameObject.GetComponent<MeshFilter> ();\r\n\t\t\telse\r\n\t\t\t\tsunflareGameObjectMeshFilter = sunflareGameObject.AddComponent<MeshFilter>();\r\n\t\t\t\r\n\t\t\tsunflareGameObjectMeshFilter.mesh.Clear ();\r\n\t\t\tsunflareGameObjectMeshFilter.mesh = screenMesh;\r\n\t\t\t\r\n\t\t\tMeshRenderer sunflareGameObjectMeshRenderer;\r\n\r\n\t\t\tif (sunflareGameObject.GetComponent<MeshRenderer> ())\r\n\t\t\t\tsunflareGameObjectMeshRenderer = sunflareGameObject.GetComponent<MeshRenderer> ();\r\n\t\t\telse\r\n\t\t\t\tsunflareGameObjectMeshRenderer = sunflareGameObject.AddComponent<MeshRenderer>();\r\n\t\t\t\r\n\t\t\tsunflareGameObjectMeshRenderer.sharedMaterial = sunglareMaterial;\r\n\t\t\tsunflareGameObjectMeshRenderer.material = sunglareMaterial;\r\n\t\t\t\r\n\t\t\tsunflareGameObjectMeshRenderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;\r\n\t\t\tsunflareGameObjectMeshRenderer.receiveShadows = false;\r\n\t\t\tsunflareGameObjectMeshRenderer.enabled = true;\r\n\t\t\t\r\n\t\t\tsunflareGameObject.layer = 10; //start in scaledspace\r\n\r\n\t\t\tscaledCameraHook = (SunflareCameraHook) Scatterer.Instance.scaledSpaceCamera.gameObject.AddComponent (typeof(SunflareCameraHook));\r\n\t\t\tscaledCameraHook.flare = this;\r\n\t\t\tscaledCameraHook.useDbufferOnCamera = 0f;\r\n\r\n\t\t\tif (!(HighLogic.LoadedScene == GameScenes.TRACKSTATION))\r\n\t\t\t{\r\n\t\t\t\tnearCameraHook = (SunflareCameraHook)Scatterer.Instance.nearCamera.gameObject.AddComponent (typeof(SunflareCameraHook));\r\n\t\t\t\tnearCameraHook.flare = this;\r\n\t\t\t\tnearCameraHook.useDbufferOnCamera = 1f;\r\n\t\t\t}\r\n\r\n\t\t\tApplySunflareConfig ();\r\n\r\n\t\t\tsunglareMaterial.SetFloat (ShaderProperties.aspectRatio_PROPERTY, Scatterer.Instance.scaledSpaceCamera.aspect);\r\n\r\n\t\t\tShader.SetGlobalTexture(ShaderProperties.scattererReconstructedCloud_PROPERTY, Texture2D.whiteTexture); // Temporary way to pass volumetric cloud extinction, if raymarched volumetrics are loaded they override this\r\n\r\n\t\t\tUtils.LogDebug (\"Added custom sun flare for \"+sourceName);\r\n\t\t}\r\n\r\n\t\tpublic void updateProperties()\r\n\t\t{\r\n\t\t\tvar sunViewPortPos = Scatterer.Instance.scaledSpaceCamera.WorldToViewportPoint (sourceScaledTransform.position);\r\n\t\t\thitStatus=false;\r\n\r\n\t\t\tif (sunViewPortPos.z > 0)\r\n\t\t\t{\r\n\t\t\t\tif (syntaxVersion == 1)\r\n\t\t\t\t{\r\n\t\t\t\t\tfloat dist = (float) (Scatterer.Instance.scaledSpaceCamera.transform.position - sourceScaledTransform.position)\r\n\t\t\t\t\t\t.magnitude;\r\n\r\n\t\t\t\t\tsunGlareScale = dist / 2266660f * Scatterer.Instance.scaledSpaceCamera.fieldOfView / 60f;\r\n\r\n\t\t\t\t\t//if dist > 1.25*sunglareFadeDistance -->1\r\n\t\t\t\t\t//if dist < 0.25*sunglareFadeDistance -->0\r\n\t\t\t\t\t//else values smoothstepped in between\r\n\t\t\t\t\tsunGlareFade = Mathf.SmoothStep (0, 1, (dist / settingsV1.sunGlareFadeDistance) - 0.25f);\r\n\r\n\t\t\t\t\t//if dist < 0.5 * ghostFadeDistance -->1\r\n\t\t\t\t\t//if dist > 1.5 * ghostFadeDistance -->0\r\n\t\t\t\t\t//else values smoothstepped in between\r\n\t\t\t\t\tghostFade = Mathf.SmoothStep (0, 1, (dist - 0.5f * settingsV1.ghostFadeDistance) / (settingsV1.ghostFadeDistance));\r\n\t\t\t\t\tghostFade = 1 - ghostFade;\r\n\r\n\t\t\t\t\tsunglareMaterial.SetFloat (ShaderProperties.sunGlareScale_PROPERTY, sunGlareScale);\r\n\t\t\t\t\tsunglareMaterial.SetFloat (ShaderProperties.sunGlareFade_PROPERTY, sunGlareFade);\r\n\t\t\t\t\tsunglareMaterial.SetFloat (ShaderProperties.ghost1Fade_PROPERTY, ghostFade);\r\n\t\t\t\t\tsunglareMaterial.SetFloat (ShaderProperties.ghost2Fade_PROPERTY, ghostFade);\r\n\t\t\t\t\tsunglareMaterial.SetFloat (ShaderProperties.ghost3Fade_PROPERTY, ghostFade);\r\n\t\t\t\t}\r\n\t\t\t\telse if (syntaxVersion == 2)\r\n\t\t\t\t{\r\n\t\t\t\t\tfloat dist = (float) (Scatterer.Instance.scaledSpaceCamera.transform.position - sourceScaledTransform.position).magnitude / ((float) source.Radius / ScaledSpace.ScaleFactor); //distance measured in stellar radius\r\n\r\n\t\t\t\t\tif (settingsV2.flares.Count > 0)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tfloat intensity = settingsV2.flares[0].intensityCurve.Curve.Evaluate(dist);\r\n\t\t\t\t\t\tfloat scale = settingsV2.flares[0].scaleCurve.Curve.Evaluate(dist);\r\n\r\n\t\t\t\t\t\tsunglareMaterial.SetVector (\"flareSettings\", new Vector3(intensity, settingsV2.flares[0].displayAspectRatio,1f/scale));\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (settingsV2.flares.Count > 1)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tfloat intensity = settingsV2.flares[1].intensityCurve.Evaluate(dist);\r\n\t\t\t\t\t\tfloat scale = settingsV2.flares[1].scaleCurve.Evaluate(dist);\r\n\t\t\t\t\t\tsunglareMaterial.SetVector (\"spikesSettings\", new Vector3(intensity, settingsV2.flares[1].displayAspectRatio,1f/scale));\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t//ghostFade is now per ghost\r\n\t\t\t\t\tif (settingsV2.ghosts.Count > 0)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tghostFade = settingsV2.ghosts[0].intensityCurve.Evaluate(dist);\r\n\t\t\t\t\t\tsunglareMaterial.SetFloat (ShaderProperties.ghost1Fade_PROPERTY, ghostFade);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (settingsV2.ghosts.Count > 1)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tghostFade = settingsV2.ghosts[1].intensityCurve.Evaluate(dist);\r\n\t\t\t\t\t\tsunglareMaterial.SetFloat (ShaderProperties.ghost2Fade_PROPERTY, ghostFade);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (settingsV2.ghosts.Count > 2)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tghostFade = settingsV2.ghosts[2].intensityCurve.Evaluate(dist);\r\n\t\t\t\t\t\tsunglareMaterial.SetFloat (ShaderProperties.ghost3Fade_PROPERTY, ghostFade);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!MapView.MapIsEnabled && !(HighLogic.LoadedScene == GameScenes.TRACKSTATION))\r\n\t\t\t\t{\r\n\t\t\t\t\t\r\n\t\t\t\t\thitStatus = Physics.Raycast (Scatterer.Instance.nearCamera.transform.position,\r\n\t\t\t\t\t                             (source.transform.position - Scatterer.Instance.nearCamera.transform.position).normalized,\r\n\t\t\t\t\t                             out hit, Mathf.Infinity, (int)((1 << 15) + (1 << 0)));\r\n\t\t\t\t\tif (!hitStatus) {\r\n\t\t\t\t\t\thitStatus = Physics.Raycast (Scatterer.Instance.scaledSpaceCamera.transform.position,\r\n\t\t\t\t\t\t                             (sourceScaledTransform.position - Scatterer.Instance.scaledSpaceCamera.transform.position)\r\n\t\t\t\t\t\t                             .normalized, out hit, Mathf.Infinity, (int)((1 << 10)));\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tsunglareMaterial.SetVector(ShaderProperties.sunWorldPosition_PROPERTY, (Vector3)ScaledSpace.ScaledToLocalSpace(new Vector3d(sourceScaledTransform.position.x, sourceScaledTransform.position.y, sourceScaledTransform.position.z)));\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\thitStatus = Physics.Raycast (Scatterer.Instance.scaledSpaceCamera.transform.position, (sourceScaledTransform.position - Scatterer.Instance.transform.position).normalized, out hit, Mathf.Infinity, (int)((1 << 10)));\r\n\t\t\t\t\t\r\n\t\t\t\t\tsunglareMaterial.SetVector(ShaderProperties.sunWorldPosition_PROPERTY, sourceScaledTransform.position);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif(hitStatus)\r\n\t\t\t\t{\r\n\t\t\t\t\t//if sun visible, draw sunflare\r\n\t\t\t\t\tif(hit.transform == sourceScaledTransform)\r\n\t\t\t\t\t\thitStatus=false;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (HighLogic.LoadedScene != GameScenes.TRACKSTATION && DepthToDistanceCommandBuffer.RenderTexture != null)\r\n\t\t\t\t\tsunglareMaterial.SetTexture (ShaderProperties._customDepthTexture_PROPERTY, DepthToDistanceCommandBuffer.RenderTexture);\r\n\t\t\t}\r\n\r\n\t\t\tflareRendering = !hitStatus && (sunViewPortPos.z > 0) && !Scatterer.Instance.scattererCelestialBodiesManager.underwater;\r\n\t\t\tsunglareMaterial.SetFloat(ShaderProperties.renderSunFlare_PROPERTY, flareRendering ? 1.0f : 0.0f);\r\n\t\t}\t\r\n\r\n\t\tpublic void Update()\r\n\t\t{\r\n\t\t\t//if rendertexture is lost, wait a bit before re-creating it\r\n\t\t\tif (!extinctionTexture.IsCreated())\r\n\t\t\t{\r\n\t\t\t\twaitBeforeReloadCnt++;\r\n\t\t\t\tif (waitBeforeReloadCnt >= 2)\r\n\t\t\t\t{\r\n\t\t\t\t\textinctionTexture.Create();\r\n\t\t\t\t\twaitBeforeReloadCnt = 0;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t//enable or disable scaled or near script depending on trackstation or mapview\r\n\t\t\tif (!MapView.MapIsEnabled && HighLogic.LoadedScene != GameScenes.TRACKSTATION)\r\n\t\t\t{\r\n\t\t\t\tnearCameraHook.enabled = true;\r\n\t\t\t\tscaledCameraHook.enabled = false;\r\n\t\t\t\tsunflareGameObject.layer = 15;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tif (nearCameraHook)\r\n\t\t\t\t\tnearCameraHook.enabled=false;\r\n\r\n\t\t\t\tscaledCameraHook.enabled=true;\r\n\t\t\t\tsunflareGameObject.layer = 10;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void ClearExtinction()\r\n\t\t{\r\n\t\t\tRenderTexture rt=RenderTexture.active;\r\n\t\t\tRenderTexture.active= extinctionTexture;\t\t\t\r\n\r\n\t\t\tGL.Clear(false,true,Color.white);\r\n\r\n\t\t\t//restore active rendertexture\r\n\t\t\tRenderTexture.active=rt;\r\n\t\t}\t\r\n\r\n\t\tpublic void OnDestroy()\r\n\t\t{\r\n\t\t\tif (nearCameraHook)\r\n\t\t\t{\r\n\t\t\t\tComponent.Destroy (nearCameraHook);\r\n\t\t\t\tUnityEngine.Object.Destroy (nearCameraHook);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif (scaledCameraHook)\r\n\t\t\t{\r\n\t\t\t\tComponent.Destroy (scaledCameraHook);\r\n\t\t\t\tUnityEngine.Object.Destroy (scaledCameraHook);\r\n\t\t\t}\r\n\r\n\t\t\tif (extinctionTexture)\r\n\t\t\t{\r\n\t\t\t\textinctionTexture.Release();\r\n\t\t\t\tUnityEngine.Object.Destroy (extinctionTexture);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void Configure(CelestialBody source, string sourceName, Transform sourceScaledTransform, ConfigNode configNodeToLoad)\r\n\t\t{\r\n\t\t\tthis.source = source;\r\n\t\t\tthis.sourceName = sourceName;\r\n\t\t\tthis.sourceScaledTransform = sourceScaledTransform;\r\n\t\t\tthis.configNodeToLoad = configNodeToLoad;\r\n\t\t}\r\n\r\n\t\tpublic void LoadSettings ()\r\n\t\t{\r\n\t\t\tLoadSettingsFromConfigNode (configNodeToLoad);\r\n\t\t}\r\n\r\n\t\tvoid LoadSettingsFromConfigNode (ConfigNode node)\r\n\t\t{\r\n\t\t\tif (node.HasValue (\"syntaxVersion\"))\r\n\t\t\t{\r\n\t\t\t\tif (node.TryGetValue (\"syntaxVersion\", ref syntaxVersion) && ((syntaxVersion == 1) || (syntaxVersion == 2)))\r\n\t\t\t\t{\r\n\t\t\t\t\tUtils.LogDebug (\"Sunflare syntax version: \" + syntaxVersion.ToString ());\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tUtils.LogDebug (\"Invalid sunflare syntax version found: \" + node.GetValue (\"syntaxVersion\") + \", defaulting to version 1 for retro-compatibility\");\r\n\t\t\t\t\tsyntaxVersion = 1;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tUtils.LogDebug (\"No sunflare syntax version found, defaulting to version 1 for retro-compatibility\");\r\n\t\t\t\tsyntaxVersion = 1;\r\n\t\t\t}\r\n\t\t\tif (syntaxVersion == 1)\r\n\t\t\t{\r\n\t\t\t\tsettingsV1 = new SunflareSettingsV1 ();\r\n\t\t\t\tConfigNode.LoadObjectFromConfig (settingsV1, node);\r\n\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tsettingsV2 = new SunflareSettingsV2 ();\r\n\t\t\t\tsettingsV2.Load(node);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t\r\n\t\tpublic void ApplyFromUI(ConfigNode node)\r\n\t\t{\r\n\t\t\tLoadSettingsFromConfigNode (node);\r\n\t\t\tconfigNodeToLoad = node;\r\n\t\t\tApplySunflareConfig ();\r\n\t\t}\r\n\r\n\t\tvoid ApplySunflareConfig ()\r\n\t\t{\r\n\t\t\tif (syntaxVersion == 1)\r\n\t\t\t{\r\n\t\t\t\tApplySyntaxV1FlareConfig ();\r\n\t\t\t}\r\n\t\t\telse if (syntaxVersion == 2)\r\n\t\t\t{\r\n\t\t\t\tApplySyntaxV2FlareConfig ();\r\n\t\t\t}\r\n\r\n\t\t\textinctionTexture = new RenderTexture (4, 4, 0, RenderTextureFormat.ARGB32);\r\n\t\t\textinctionTexture.antiAliasing = 1;\r\n\t\t\textinctionTexture.filterMode = FilterMode.Point;\r\n\t\t\textinctionTexture.Create ();\r\n\t\t\tsunglareMaterial.SetTexture (\"extinctionTexture\", extinctionTexture);\r\n\t\t}\r\n\r\n\t\tvoid ApplySyntaxV1FlareConfig ()\r\n\t\t{\r\n\t\t\tLoadAndSetTexture (\"sunFlare\" , (String.Format (\"{0}/{1}\", Utils.GameDataPath + settingsV1.assetPath, \"sunFlare.png\")));\r\n\t\t\tLoadAndSetTexture (\"sunSpikes\", (String.Format (\"{0}/{1}\", Utils.GameDataPath + settingsV1.assetPath, \"sunSpikes.png\")));\r\n\r\n\t\t\tLoadAndSetTexture (\"sunGhost1\", (String.Format (\"{0}/{1}\", Utils.GameDataPath + settingsV1.assetPath, \"Ghost1.png\")));\r\n\t\t\tLoadAndSetTexture (\"sunGhost2\", (String.Format (\"{0}/{1}\", Utils.GameDataPath + settingsV1.assetPath, \"Ghost2.png\")));\r\n\t\t\tLoadAndSetTexture (\"sunGhost3\", (String.Format (\"{0}/{1}\", Utils.GameDataPath + settingsV1.assetPath, \"Ghost3.png\")));\r\n\r\n\t\t\t//didn't want to serialize the matrices directly as the result is pretty unreadable\r\n\t\t\t//sorry about the mess, syntax v2 is cleaner\r\n\t\t\tMatrix4x4 ghost1Settings1 = Matrix4x4.zero;\r\n\t\t\tfor (int i = 0; i < settingsV1.ghost1SettingsList1.Count; i++)\r\n\t\t\t{\r\n\t\t\t\tghost1Settings1.SetRow (i, settingsV1.ghost1SettingsList1 [i]);\r\n\t\t\t}\r\n\t\t\tMatrix4x4 ghost1Settings2 = Matrix4x4.zero;\r\n\t\t\tfor (int i = 0; i < settingsV1.ghost1SettingsList2.Count; i++)\r\n\t\t\t{\r\n\t\t\t\tghost1Settings2.SetRow (i, settingsV1.ghost1SettingsList2 [i]);\r\n\t\t\t}\r\n\t\t\t//ghost 2\r\n\t\t\tMatrix4x4 ghost2Settings1 = Matrix4x4.zero;\r\n\t\t\tfor (int i = 0; i < settingsV1.ghost2SettingsList1.Count; i++)\r\n\t\t\t{\r\n\t\t\t\tghost2Settings1.SetRow (i, settingsV1.ghost2SettingsList1 [i]);\r\n\t\t\t}\r\n\t\t\tMatrix4x4 ghost2Settings2 = Matrix4x4.zero;\r\n\t\t\tfor (int i = 0; i < settingsV1.ghost2SettingsList2.Count; i++)\r\n\t\t\t{\r\n\t\t\t\tghost2Settings2.SetRow (i, settingsV1.ghost2SettingsList2 [i]);\r\n\t\t\t}\r\n\t\t\t//ghost 3\r\n\t\t\tMatrix4x4 ghost3Settings1 = Matrix4x4.zero;\r\n\t\t\tfor (int i = 0; i < settingsV1.ghost3SettingsList1.Count; i++)\r\n\t\t\t{\r\n\t\t\t\tghost3Settings1.SetRow (i, settingsV1.ghost3SettingsList1 [i]);\r\n\t\t\t}\r\n\t\t\tMatrix4x4 ghost3Settings2 = Matrix4x4.zero;\r\n\t\t\tfor (int i = 0; i < settingsV1.ghost3SettingsList2.Count; i++)\r\n\t\t\t{\r\n\t\t\t\tghost3Settings2.SetRow (i, settingsV1.ghost3SettingsList2 [i]);\r\n\t\t\t}\r\n\r\n\t\t\tsunglareMaterial.SetVector (\"flareSettings\", settingsV1.flareSettings);\r\n\t\t\tsunglareMaterial.SetVector (\"spikesSettings\", settingsV1.spikesSettings);\r\n\t\t\tsunglareMaterial.SetMatrix (\"ghost1Settings1\", ghost1Settings1);\r\n\t\t\tsunglareMaterial.SetMatrix (\"ghost1Settings2\", ghost1Settings2);\r\n\t\t\tsunglareMaterial.SetMatrix (\"ghost2Settings1\", ghost2Settings1);\r\n\t\t\tsunglareMaterial.SetMatrix (\"ghost2Settings2\", ghost2Settings2);\r\n\t\t\tsunglareMaterial.SetMatrix (\"ghost3Settings1\", ghost3Settings1);\r\n\t\t\tsunglareMaterial.SetMatrix (\"ghost3Settings2\", ghost3Settings2);\r\n\t\t\tsunglareMaterial.SetVector (\"flareColor\", settingsV1.flareColor);\r\n\t\t}\r\n\r\n\t\tvoid ApplySyntaxV2FlareConfig ()\r\n\t\t{\r\n\t\t\tsunglareMaterial.SetVector (\"flareSettings\", Vector3.zero);\r\n\t\t\tsunglareMaterial.SetVector (\"spikesSettings\", Vector3.zero);\r\n\t\t\tsunglareMaterial.SetMatrix (\"ghost1Settings1\", Matrix4x4.zero);\r\n\t\t\tsunglareMaterial.SetMatrix (\"ghost1Settings2\", Matrix4x4.zero);\r\n\t\t\tsunglareMaterial.SetMatrix (\"ghost2Settings1\", Matrix4x4.zero);\r\n\t\t\tsunglareMaterial.SetMatrix (\"ghost2Settings2\", Matrix4x4.zero);\r\n\t\t\tsunglareMaterial.SetMatrix (\"ghost3Settings1\", Matrix4x4.zero);\r\n\t\t\tsunglareMaterial.SetMatrix (\"ghost3Settings2\", Matrix4x4.zero);\r\n\t\t\tsunglareMaterial.SetFloat (ShaderProperties.sunGlareScale_PROPERTY, 1f);\r\n\t\t\tsunglareMaterial.SetFloat (ShaderProperties.sunGlareFade_PROPERTY, 1f);\r\n\r\n\t\t\t//For the 2 flares the scale and intensity have to be overriden from curve I think, or just leave intensity at 1 here and override fade from curve?\r\n\t\t\t//TODO: replace only the second 1f with the 1/value from the scaleCurve\r\n\r\n\t\t\tif (settingsV2.flares.Count > 0)\r\n\t\t\t{\r\n\t\t\t\tLoadAndSetTexture (\"sunFlare\", Utils.GameDataPath + settingsV2.flares[0].texture);\r\n\t\t\t\tsunglareMaterial.SetVector (\"flareSettings\", new Vector3(1f, settingsV2.flares[0].displayAspectRatio,1f));\r\n\t\t\t}\r\n\t\t\tif (settingsV2.flares.Count > 1)\r\n\t\t\t{\r\n\t\t\t\tLoadAndSetTexture (\"sunSpikes\", Utils.GameDataPath + settingsV2.flares[1].texture);\r\n\t\t\t\tsunglareMaterial.SetVector (\"spikesSettings\", new Vector3(1f, settingsV2.flares[1].displayAspectRatio,1f));\r\n\t\t\t}\r\n\t\t\tif (settingsV2.flares.Count > 2)\r\n\t\t\t{\r\n\t\t\t\tUtils.LogError (\"More than 2 flares used on sunflare \" + sourceName + \", only 2 are supported, additional flares will not be used\");\r\n\t\t\t}\r\n\r\n\t\t\t//All static settings are set for ghosts, all that's left to do is configure the fade from ghost intensity curves\r\n\t\t\tif (settingsV2.ghosts.Count > 0)\r\n\t\t\t{\r\n\t\t\t\tLoadAndSetTexture (\"sunGhost1\", Utils.GameDataPath + settingsV2.ghosts[0].texture);\r\n\t\t\t\tSetGhostParameters (\"ghost1Settings1\", \"ghost1Settings2\", settingsV2.ghosts[0]);\r\n\t\t\t}\r\n\t\t\tif (settingsV2.ghosts.Count > 1)\r\n\t\t\t{\r\n\t\t\t\tLoadAndSetTexture (\"sunGhost2\", Utils.GameDataPath + settingsV2.ghosts[1].texture);\r\n\t\t\t\tSetGhostParameters (\"ghost2Settings1\", \"ghost2Settings2\", settingsV2.ghosts[1]);\r\n\t\t\t}\r\n\t\t\tif (settingsV2.ghosts.Count > 2)\r\n\t\t\t{\r\n\t\t\t\tLoadAndSetTexture (\"sunGhost3\", Utils.GameDataPath + settingsV2.ghosts[2].texture);\r\n\t\t\t\tSetGhostParameters (\"ghost3Settings1\", \"ghost3Settings2\", settingsV2.ghosts[2]);\r\n\t\t\t}\r\n\t\t\tif (settingsV2.ghosts.Count > 3)\r\n\t\t\t{\r\n\t\t\t\tUtils.LogError (\"More than 3 ghosts used on sunflare \" + sourceName + \", only 3 are supported, additional ghosts will not be used\");\r\n\t\t\t}\r\n\r\n\t\t\tsunglareMaterial.SetVector (\"flareColor\", settingsV2.flareColor);\r\n\t\t}\r\n\r\n\t\tvoid SetGhostParameters (string shaderParam1, string shaderParam2, GhostSettings ghostSettings )\r\n\t\t{\r\n\t\t\tMatrix4x4 ghostSettings1 = Matrix4x4.zero;\r\n\t\t\tfor (int i = 0; (i < ghostSettings.instances.Count) && (i < 4); i++)\r\n\t\t\t{\r\n\t\t\t\tghostSettings1.SetRow (i, new Vector4 (ghostSettings.instances [i].intensityMultiplier, ghostSettings.instances [i].displayAspectRatio, 1f / ghostSettings.instances [i].scale, ghostSettings.instances [i].sunToScreenCenterPosition));\r\n\t\t\t}\r\n\t\t\tMatrix4x4 ghostSettings2 = Matrix4x4.zero;\r\n\t\t\tfor (int i = 4; (i < ghostSettings.instances.Count) && (i < 8); i++)\r\n\t\t\t{\r\n\t\t\t\tghostSettings2.SetRow (i-4, new Vector4 (ghostSettings.instances [i].intensityMultiplier, ghostSettings.instances [i].displayAspectRatio, 1f / ghostSettings.instances [i].scale, ghostSettings.instances [i].sunToScreenCenterPosition));\r\n\t\t\t}\r\n\t\t\tsunglareMaterial.SetMatrix (shaderParam1, ghostSettings1);\r\n\t\t\tsunglareMaterial.SetMatrix (shaderParam2, ghostSettings2);\r\n\t\t}\r\n\r\n\t\tvoid LoadAndSetTexture (string textureName, string path)\r\n\t\t{\r\n\t\t\tTexture2D texture = null;\r\n\r\n\t\t\tif (texturesDictionary.ContainsKey (path))\r\n\t\t\t{\r\n\t\t\t\ttexture = texturesDictionary[path];\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tif (Path.GetExtension(path) == \".dds\")\r\n\t\t\t\t{\r\n\t\t\t\t\ttexture = Utils.LoadDDSTexture(System.IO.File.ReadAllBytes (path),path);\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\ttexture = new Texture2D(1, 1);\r\n\t\t\t\t\ttexture.LoadImage(System.IO.File.ReadAllBytes(path));\r\n\t\t\t\t}\r\n\r\n\t\t\t\ttexturesDictionary[path] = texture;\r\n\t\t\t}\r\n\r\n\t\t\ttexture.wrapMode = TextureWrapMode.Clamp;\r\n\t\t\tsunglareMaterial.SetTexture (textureName, texture);\r\n\t\t}\r\n\t}\r\n}"
  },
  {
    "path": "scatterer/Effects/SunFlare/SunflareCameraHook.cs",
    "content": "\r\nusing UnityEngine;\r\nusing System.Collections;\r\nusing System.IO;\r\n\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\n\r\nusing KSP.IO;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class SunflareCameraHook : MonoBehaviour\r\n\t{\r\n\t\tpublic SunFlare flare;\r\n\t\tpublic float useDbufferOnCamera;\r\n\r\n\t\tpublic SunflareCameraHook ()\r\n\t\t{\r\n\t\t}\r\n\r\n\t\tpublic void OnPreRender()\r\n\t\t{\r\n\t\t\tif(flare)\r\n\t\t\t{\r\n\t\t\t\tflare.updateProperties ();\r\n\t\t\t\tflare.sunglareMaterial.SetFloat(ShaderProperties.renderOnCurrentCamera_PROPERTY,1.0f);\r\n\t\t\t\tflare.sunglareMaterial.SetFloat(ShaderProperties.useDbufferOnCamera_PROPERTY,useDbufferOnCamera);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void OnPostRender()\r\n\t\t{\r\n\t\t\tif(flare)\r\n\t\t\t{\r\n\t\t\t\tflare.ClearExtinction ();\r\n\t\t\t\tflare.sunglareMaterial.SetFloat(ShaderProperties.renderOnCurrentCamera_PROPERTY,0.0f);\r\n\t\t\t\tflare.sunglareMaterial.SetFloat(ShaderProperties.useDbufferOnCamera_PROPERTY,useDbufferOnCamera);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/Effects/SunFlare/SunflareManager.cs",
    "content": "using System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing UnityEngine;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class SunflareManager : MonoBehaviour\r\n\t{\r\n\t\tpublic Dictionary<String, SunFlare> scattererSunFlares = new Dictionary<String, SunFlare>();\r\n\r\n\t\tpublic SunflareManager ()\r\n\t\t{\r\n\t\t}\r\n\r\n\t\tpublic void Init()\r\n\t\t{\r\n\t\t\tStartCoroutine (InitCoroutine());\r\n\t\t}\r\n\r\n\r\n\t\tIEnumerator InitCoroutine()\r\n\t\t{\r\n\t\t\tforeach (ConfigNode _sunflareConfigs in Scatterer.Instance.planetsConfigsReader.sunflareConfigs)\r\n\t\t\t{\r\n\t\t\t\tforeach (ConfigNode _cn in _sunflareConfigs.GetNodes())\r\n\t\t\t\t{\r\n\t\t\t\t\tif (scattererSunFlares.ContainsKey(_cn.name))\r\n\t\t\t\t\t\tcontinue;\r\n\r\n\t\t\t\t\tSunFlare customSunFlare = (SunFlare)Scatterer.Instance.scaledSpaceCamera.gameObject.AddComponent (typeof(SunFlare));\r\n\t\t\t\t\ttry\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcustomSunFlare.Configure(FlightGlobals.Bodies.SingleOrDefault (_cb => _cb.GetName () == _cn.name),\r\n\t\t\t\t\t\t                         _cn.name,Utils.GetScaledTransform (_cn.name), _cn);\r\n\t\t\t\t\t\tcustomSunFlare.start ();\r\n\t\t\t\t\t\tscattererSunFlares.Add (_cn.name, customSunFlare);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcatch (Exception exception)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tUtils.LogDebug (\"Custom sunflare cannot be added to \" + _cn.name + \" \" + exception.ToString ());\r\n\t\t\t\t\t\tComponent.Destroy (customSunFlare);\r\n\t\t\t\t\t\tUnityEngine.Object.Destroy (customSunFlare);\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tyield return new WaitForFixedUpdate ();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tDisableStockSunflares ();\r\n\t\t}\r\n\t\t\r\n\t\t//TODO: decouple and let every sunflare update itself, based on the GameObject it is linked to?\r\n\t\tpublic void UpdateFlares()\r\n\t\t{\r\n\t\t\tforeach (SunFlare customSunFlare in scattererSunFlares.Values)\r\n\t\t\t{\r\n\t\t\t\tcustomSunFlare.Update();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void OnDestroy()\r\n\t\t{\r\n\t\t\tif (this)\r\n\t\t\t\tStopAllCoroutines();\r\n\r\n\t\t\tReenableStockSunflares ();\r\n\r\n\t\t\tforeach (SunFlare customSunFlare in scattererSunFlares.Values)\r\n\t\t\t{\r\n\t\t\t\tComponent.DestroyImmediate (customSunFlare);\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tvoid DisableStockSunflares ()\r\n\t\t{\r\n\t\t\tglobal::SunFlare[] stockFlares = (global::SunFlare[])global::SunFlare.FindObjectsOfType (typeof(global::SunFlare));\r\n\t\t\tforeach (global::SunFlare _flare in stockFlares)\r\n\t\t\t{\r\n\t\t\t\tif (scattererSunFlares.ContainsKey (_flare.sun.name))\r\n\t\t\t\t{\r\n\t\t\t\t\tUtils.LogDebug (\"Disabling stock sunflare for \" + _flare.sun.name);\r\n\t\t\t\t\t_flare.sunFlare.enabled = false;\r\n\t\t\t\t\t_flare.enabled = false;\r\n\t\t\t\t\t_flare.gameObject.SetActive (false);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tvoid ReenableStockSunflares ()\r\n\t\t{\r\n\t\t\tglobal::SunFlare[] stockFlares = (global::SunFlare[]) global::SunFlare.FindObjectsOfType(typeof( global::SunFlare));\r\n\t\t\tforeach(global::SunFlare _flare in stockFlares)\r\n\t\t\t{\t\t\t\t\t\t\r\n\t\t\t\tif (scattererSunFlares.ContainsKey (_flare.sun.name))\r\n\t\t\t\t{\r\n\t\t\t\t\t_flare.sunFlare.enabled=true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/Effects/SunFlare/SunflareSettingsV1.cs",
    "content": "using UnityEngine;\r\nusing System.Collections;\r\nusing System.IO;\r\n\r\nusing System;\r\nusing System.Collections.Generic;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class SunflareSettingsV1\r\n\t{\r\n\t\t[Persistent]\r\n\t\tpublic int syntaxVersion = 1;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic string assetPath;\r\n\t\t\r\n\t\t[Persistent]\r\n\t\tpublic float sunGlareFadeDistance = 250000;\r\n\t\t[Persistent]\r\n\t\tpublic float ghostFadeDistance = 13500000;\r\n\r\n\t\t[Persistent]\r\n\t\tpublic Vector3 flareSettings = Vector3.zero;\r\n\t\t[Persistent]\r\n\t\tpublic Vector3 spikesSettings = Vector3.zero;\r\n\t\t\r\n\t\t[Persistent]\r\n\t\tpublic List<Vector4> ghost1SettingsList1=new List<Vector4>{};\r\n\t\t[Persistent]\r\n\t\tpublic List<Vector4> ghost1SettingsList2=new List<Vector4>{};\r\n\t\t\r\n\t\t[Persistent]\r\n\t\tpublic List<Vector4> ghost2SettingsList1=new List<Vector4>{};\r\n\t\t[Persistent]\r\n\t\tpublic List<Vector4> ghost2SettingsList2=new List<Vector4>{};\r\n\t\t\r\n\t\t[Persistent]\r\n\t\tpublic List<Vector4> ghost3SettingsList1=new List<Vector4>{};\r\n\t\t[Persistent]\r\n\t\tpublic List<Vector4> ghost3SettingsList2=new List<Vector4>{};\r\n\t\t\r\n\t\t[Persistent]\r\n\t\tpublic Vector3 flareColor = Vector3.one;\r\n\r\n\t\tpublic SunflareSettingsV1 ()\r\n\t\t{\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/Effects/SunFlare/SunflareSettingsV2.cs",
    "content": "using UnityEngine;\r\nusing System.Collections;\r\nusing System.IO;\r\n\r\nusing System;\r\nusing System.Collections.Generic;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class SunflareSettingsV2\r\n\t{\r\n\t\t[Persistent] public int syntaxVersion = 2;\r\n\t\t[Persistent] public Vector3 flareColor = Vector3.one;\r\n\r\n\t\t[Persistent] public List<FlareSettings> flares = new List<FlareSettings> {};\r\n\t\t[Persistent] public List<GhostSettings> ghosts = new List<GhostSettings> {};\r\n\r\n\t\tpublic SunflareSettingsV2 ()\r\n\t\t{\r\n\t\t}\r\n\r\n\t\tpublic void Load(ConfigNode node)\r\n\t\t{\r\n\t\t\tConfigNode.LoadObjectFromConfig (this, node);\r\n\r\n\t\t\tif (node.HasNode (\"flares\") && node.GetNode(\"flares\").HasNode(\"Item\"))\r\n\t\t\t{\r\n\t\t\t\tConfigNode[] flareNodes =  node.GetNode(\"flares\").GetNodes(\"Item\");\r\n\t\t\t\tfor (int i = 0; i < flareNodes.Length; i++) { flares[i].Load(flareNodes[i]);}\r\n\t\t\t}\r\n\r\n\t\t\tif (node.HasNode (\"ghosts\") && node.GetNode(\"ghosts\").HasNode(\"Item\"))\r\n\t\t\t{\r\n\t\t\t\tConfigNode[] ghostNodes =  node.GetNode(\"ghosts\").GetNodes(\"Item\");\r\n\t\t\t\tfor (int i = 0; i< ghostNodes.Length; i++) {ghosts[i].Load(ghostNodes[i]);}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tpublic class FlareSettings\r\n\t{\r\n\t\t[Persistent] public string texture;\r\n\t\t[Persistent] public float displayAspectRatio;\r\n\t\t[Persistent] public FloatCurve scaleCurve = new FloatCurve(new [] {new Keyframe(0, 1), new Keyframe(1, 1)});\r\n\t\t[Persistent] public FloatCurve intensityCurve = new FloatCurve(new [] {new Keyframe(0, 1), new Keyframe(1, 1)});\r\n\r\n\t\tpublic void Load(ConfigNode node)\r\n\t\t{\r\n\t\t\tif (node.HasNode (\"scaleCurve\"))\r\n\t\t\t\tscaleCurve.Load (node.GetNode (\"scaleCurve\"));\r\n\r\n\t\t\tif (node.HasNode (\"intensityCurve\"))\r\n\t\t\t\tintensityCurve.Load (node.GetNode (\"intensityCurve\"));\r\n\t\t}\r\n\t}\r\n\r\n\tpublic class GhostSettings\r\n\t{\r\n\t\t[Persistent] public string texture;\r\n\t\t[Persistent] public FloatCurve intensityCurve = new FloatCurve(new [] {new Keyframe(0, 1), new Keyframe(1, 1)});\r\n\t\t[Persistent] public List<GhostInstanceSettings> instances = new List<GhostInstanceSettings> {};\r\n\r\n\t\tpublic void Load(ConfigNode node)\r\n\t\t{\r\n\t\t\tif (node.HasNode (\"intensityCurve\"))\r\n\t\t\t\tintensityCurve.Load (node.GetNode (\"intensityCurve\"));\r\n\t\t}\r\n\t}\r\n\r\n\t//not sure this will serialize or reach the depth limit thing\r\n\tpublic class GhostInstanceSettings\r\n\t{\r\n\t\t[Persistent] public float intensityMultiplier;\r\n\t\t[Persistent] public float displayAspectRatio;\r\n\t\t[Persistent] public float scale;\r\n\t\t[Persistent] public float sunToScreenCenterPosition;\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/Effects/SunlightModulator/SunlightModulator.cs",
    "content": "using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class SunlightModulatorsManager\r\n\t{\r\n\t\tpublic void ModulateByAttenuation(Light light, float inAttenuation)\r\n\t\t{\r\n\t\t\tFindOrCreateModulator (light).ModulateByAttenuation (inAttenuation);\r\n\t\t}\r\n\t\t\r\n\t\tpublic void ModulateByColor(Light light, Color inColor)\r\n\t\t{\r\n\t\t\tFindOrCreateModulator (light).ModulateByColor (inColor);\r\n\t\t}\r\n\t\t\r\n\t\tpublic Color GetLastModulateColor(Light light)\r\n\t\t{\r\n\t\t\treturn FindOrCreateModulator (light).lastModulateColor;\r\n\t\t}\r\n\r\n\t\tpublic Color GetOriginalLightColor(Light light)\r\n\t\t{\r\n\t\t\treturn FindOrCreateModulator (light).getOriginalColor();\r\n\t\t}\r\n\t\t\r\n\t\tprivate SunlightModulator FindOrCreateModulator(Light light)\r\n\t\t{\r\n\t\t\tif (modulatorsDictionary.ContainsKey (light))\r\n\t\t\t{\r\n\t\t\t\treturn modulatorsDictionary [light];\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tmodulatorsDictionary[light] = (SunlightModulator) Scatterer.Instance.scaledSpaceCamera.gameObject.AddComponent(typeof(SunlightModulator));\r\n\t\t\t\tmodulatorsDictionary[light].Init(light);\r\n\t\t\t\treturn modulatorsDictionary[light];\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tprivate Dictionary<Light, SunlightModulator> modulatorsDictionary = new Dictionary<Light, SunlightModulator> ();\r\n\r\n\t\tpublic void Cleanup()\r\n\t\t{\r\n\t\t\tforeach (SunlightModulator modulator in modulatorsDictionary.Values)\r\n\t\t\t{\r\n\t\t\t\tComponent.DestroyImmediate(modulator);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tpublic class SunlightModulator : MonoBehaviour\r\n\t{\r\n\t\tColor originalColor = Color.white, modulateColor;\r\n\t\tpublic Color lastModulateColor;\r\n\r\n\t\tLight sunLight;\r\n\t\tbool applyModulation = false;\r\n\t\tbool originalColorStored = false;\r\n\t\tpublic SunlightModulatorPreRenderHook  preRenderHook;\r\n\t\tpublic SunlightModulatorPostRenderHook postRenderHook;\r\n\t\t\r\n\t\tpublic void Init(Light light)\r\n\t\t{\r\n\t\t\tsunLight = light;\r\n\t\t\tpreRenderHook = (SunlightModulatorPreRenderHook) Utils.getEarliestLocalCamera().gameObject.AddComponent(typeof(SunlightModulatorPreRenderHook));\r\n\t\t\tpreRenderHook.Init (this);\r\n\t\t\tpostRenderHook = (SunlightModulatorPostRenderHook) Scatterer.Instance.nearCamera.gameObject.AddComponent(typeof(SunlightModulatorPostRenderHook)); //less than optimal, doesn't affect internalCamera\r\n\t\t\tpostRenderHook.Init (this);\t\r\n\t\t}\r\n\r\n\t\tpublic void OnPreCull() //added to scaledSpaceCamera, called before any calls from skyNode or oceanNode\r\n\t\t{\r\n\t\t\tstoreOriginalColor ();\r\n\t\t}\r\n\r\n\t\tprivate void storeOriginalColor() //may not be necessary every frame?\r\n\t\t{\r\n\t\t\tif (sunLight.color != Color.black)\r\n\t\t\t{\r\n\t\t\t\toriginalColor = sunLight.color;\r\n\t\t\t\toriginalColorStored = true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic Color getOriginalColor()\r\n\t\t{\r\n\t\t\treturn originalColor;\r\n\t\t}\r\n\r\n\t\tpublic void ModulateByAttenuation(float inAttenuation) //called by skynode, ie scaledSpaceCamera onPreCull\r\n\t\t{\r\n\t\t\tmodulateColor *= inAttenuation;\r\n\t\t\tapplyModulation = true;\r\n\t\t}\r\n\r\n\t\tpublic void ModulateByColor(Color inColor)\r\n\t\t{\r\n\t\t\tmodulateColor *= inColor;\r\n\t\t\tapplyModulation = true;\r\n\t\t}\r\n\r\n\t\tpublic void applyColorModulation()  //called by hook on farCamera onPreRender\r\n\t\t{\r\n\t\t\tif (applyModulation && originalColorStored)\r\n\t\t\t{\r\n\t\t\t\tsunLight.color = modulateColor * originalColor;\r\n\t\t\t\tlastModulateColor = sunLight.color;\r\n\t\t\t\tmodulateColor = Color.white;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tpublic void restoreOriginalColor()  //called by hook on nearCamera/IVAcamera onPostRender  //may not be necessary every frame?\r\n\t\t{\r\n\t\t\tif (applyModulation && originalColorStored)\r\n\t\t\t{\r\n\t\t\t\tsunLight.color = originalColor;\r\n\t\t\t\tapplyModulation = false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void OnDestroy()\r\n\t\t{\r\n\t\t\tComponent.Destroy (preRenderHook);\r\n\t\t\tComponent.Destroy (postRenderHook);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/Effects/SunlightModulator/SunlightModulatorPostRenderHook.cs",
    "content": "using UnityEngine;\r\nusing System.Collections;\r\nusing System.IO;\r\n\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\n\r\nusing KSP.IO;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class SunlightModulatorPostRenderHook : MonoBehaviour\r\n\t{\r\n\t\tSunlightModulator targetModulator;\r\n\r\n\t\tpublic SunlightModulatorPostRenderHook ()\r\n\t\t{\r\n\t\t}\r\n\r\n\t\tpublic void Init(SunlightModulator target)\r\n\t\t{\r\n\t\t\ttargetModulator = target;\r\n\t\t}\r\n\r\n\t\tpublic void OnPostRender()\r\n\t\t{\r\n\t\t\ttargetModulator.restoreOriginalColor ();\r\n\t\t}\r\n\r\n\t\tpublic void OnDestroy()\r\n\t\t{\r\n\t\t\ttargetModulator.postRenderHook = null;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/Effects/SunlightModulator/SunlightModulatorPreRenderHook.cs",
    "content": "using UnityEngine;\r\nusing System.Collections;\r\nusing System.IO;\r\n\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\n\r\nusing KSP.IO;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class SunlightModulatorPreRenderHook : MonoBehaviour\r\n\t{\r\n\t\tSunlightModulator targetModulator;\r\n\r\n\t\tpublic SunlightModulatorPreRenderHook ()\r\n\t\t{\r\n\t\t}\r\n\r\n\t\tpublic void Init(SunlightModulator target)\r\n\t\t{\r\n\t\t\ttargetModulator = target;\r\n\t\t}\r\n\r\n\t\tpublic void OnPreCull() //needs to be onPreCull, onPreRender is too late\r\n\t\t{\r\n\t\t\ttargetModulator.applyColorModulation ();\r\n\t\t}\r\n\r\n\t\tpublic void OnDestroy()\r\n\t\t{\r\n\t\t\ttargetModulator.preRenderHook = null;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/Effects/Tonemapping/HableCurve.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing UnityEngine;\n\nnamespace Scatterer\n{\n    // From unity postprocessing\n\n    /// <summary>\n    /// A raw implementation of John Hable's artist-friendly tonemapping curve.\n    /// See http://filmicworlds.com/blog/filmic-tonemapping-with-piecewise-power-curves/\n    /// </summary>\n    public class HableCurve\n    {\n        class Segment\n        {\n            public float offsetX;\n            public float offsetY;\n            public float scaleX;\n            public float scaleY;\n            public float lnA;\n            public float B;\n\n            public float Eval(float x)\n            {\n                float x0 = (x - offsetX) * scaleX;\n                float y0 = 0f;\n\n                // log(0) is undefined but our function should evaluate to 0. There are better ways to handle this,\n                // but it's doing it the slow way here for clarity.\n                if (x0 > 0)\n                    y0 = Mathf.Exp(lnA + B * Mathf.Log(x0));\n\n                return y0 * scaleY + offsetY;\n            }\n        }\n\n        struct DirectParams\n        {\n            internal float x0;\n            internal float y0;\n            internal float x1;\n            internal float y1;\n            internal float W;\n\n            internal float overshootX;\n            internal float overshootY;\n\n            internal float gamma;\n        }\n\n        /// <summary>\n        /// The curve's white point.\n        /// </summary>\n        public float whitePoint { get; private set; }\n\n        /// <summary>\n        /// The inverse of the curve's white point.\n        /// </summary>\n        public float inverseWhitePoint { get; private set; }\n\n        internal float x0 { get; private set; }\n        internal float x1 { get; private set; }\n\n        internal float y0 { get; private set; }\n        internal float y1 { get; private set; }\n\n        // Toe, mid, shoulder\n        readonly Segment[] m_Segments = new Segment[3];\n\n        /// <summary>\n        /// Creates a new curve.\n        /// </summary>\n        public HableCurve()\n        {\n            for (int i = 0; i < 3; i++)\n                m_Segments[i] = new Segment();\n\n            uniforms = new Uniforms(this);\n        }\n\n        /// <summary>\n        /// Evaluates a given point on the curve.\n        /// </summary>\n        /// <param name=\"x\">The point within the curve to evaluate (on the horizontal axis)</param>\n        /// <returns>The value of the curve, at the point specified</returns>\n        public float Eval(float x)\n        {\n            float normX = x * inverseWhitePoint;\n            int index = (normX < x0) ? 0 : ((normX < x1) ? 1 : 2);\n            var segment = m_Segments[index];\n            float ret = segment.Eval(normX);\n            return ret;\n        }\n\n        /// <summary>\n        /// Returns the base-2 exponential function of <paramref name=\"x\"/>, which is <c>2</c>\n        /// raised to the power <paramref name=\"x\"/>.\n        /// </summary>\n        /// <param name=\"x\">Value of the exponent</param>\n        /// <returns>The base-2 exponential function of <paramref name=\"x\"/></returns>\n        public static float Exp2(float x)\n        {\n            return Mathf.Exp(x * 0.69314718055994530941723212145818f);\n        }\n\n        /// <summary>\n        /// Initializes the curve with given settings.\n        /// </summary>\n        /// <param name=\"toeStrength\">Affects the transition between the toe and the mid section of\n        /// the curve. A value of 0 means no toe, a value of 1 means a very hard transition</param>\n        /// <param name=\"toeLength\">Affects how much of the dynamic range is in the toe. With a\n        /// small value, the toe will be very short and quickly transition into the linear section,\n        /// and with a longer value having a longer toe</param>\n        /// <param name=\"shoulderStrength\">Affects the transition between the mid section and the\n        /// shoulder of the curve. A value of 0 means no shoulder, a value of 1 means a very hard\n        /// transition</param>\n        /// <param name=\"shoulderLength\">Affects how many F-stops (EV) to add to the dynamic range\n        /// of the curve</param>\n        /// <param name=\"shoulderAngle\">Affects how much overshoot to add to the shoulder</param>\n        /// <param name=\"gamma\">Applies a gamma function to the curve</param>\n        public void Init(float toeStrength, float toeLength, float shoulderStrength, float shoulderLength, float shoulderAngle, float gamma)\n        {\n            var dstParams = new DirectParams();\n\n            // This is not actually the display gamma. It's just a UI space to avoid having to \n            // enter small numbers for the input.\n            const float kPerceptualGamma = 2.2f;\n\n            // Constraints\n            {\n                toeLength = Mathf.Pow(Mathf.Clamp01(toeLength), kPerceptualGamma);\n                toeStrength = Mathf.Clamp01(toeStrength);\n                shoulderAngle = Mathf.Clamp01(shoulderAngle);\n                shoulderStrength = Mathf.Clamp(shoulderStrength, 1e-5f, 1f - 1e-5f);\n                shoulderLength = Mathf.Max(0f, shoulderLength);\n                gamma = Mathf.Max(1e-5f, gamma);\n            }\n\n            // Apply base params\n            {\n                // Toe goes from 0 to 0.5\n                float x0 = toeLength * 0.5f;\n                float y0 = (1f - toeStrength) * x0; // Lerp from 0 to x0\n\n                float remainingY = 1f - y0;\n\n                float initialW = x0 + remainingY;\n\n                float y1_offset = (1f - shoulderStrength) * remainingY;\n                float x1 = x0 + y1_offset;\n                float y1 = y0 + y1_offset;\n\n                // Filmic shoulder strength is in F stops\n                float extraW = Exp2(shoulderLength) - 1f;\n\n                float W = initialW + extraW;\n\n                dstParams.x0 = x0;\n                dstParams.y0 = y0;\n                dstParams.x1 = x1;\n                dstParams.y1 = y1;\n                dstParams.W = W;\n\n                // Bake the linear to gamma space conversion\n                dstParams.gamma = gamma;\n            }\n\n            dstParams.overshootX = (dstParams.W * 2f) * shoulderAngle * shoulderLength;\n            dstParams.overshootY = 0.5f * shoulderAngle * shoulderLength;\n\n            InitSegments(dstParams);\n        }\n\n        public void SetMaterialParams(Material mat)\n        {\n            /*\n            mat.SetVector(\"_CustomToneCurve\", uniforms.curve);\n            mat.SetVector(\"_y0y1\", uniforms.y0y1);\n            mat.SetVector(\"_ToeSegmentA\", uniforms.toeSegmentA);\n            mat.SetVector(\"_ToeSegmentB\", uniforms.toeSegmentB);\n            mat.SetVector(\"_MidSegmentA\", uniforms.midSegmentA);\n            mat.SetVector(\"_MidSegmentB\", uniforms.midSegmentB);\n            mat.SetVector(\"_ShoSegmentA\", uniforms.shoSegmentA);\n            mat.SetVector(\"_ShoSegmentB\", uniforms.shoSegmentB);\n            */\n\n            Shader.SetGlobalVector(\"_CustomToneCurve\", uniforms.curve);\n            Shader.SetGlobalVector(\"_y0y1\", uniforms.y0y1);\n            Shader.SetGlobalVector(\"_ToeSegmentA\", uniforms.toeSegmentA);\n            Shader.SetGlobalVector(\"_ToeSegmentB\", uniforms.toeSegmentB);\n            Shader.SetGlobalVector(\"_MidSegmentA\", uniforms.midSegmentA);\n            Shader.SetGlobalVector(\"_MidSegmentB\", uniforms.midSegmentB);\n            Shader.SetGlobalVector(\"_ShoSegmentA\", uniforms.shoSegmentA);\n            Shader.SetGlobalVector(\"_ShoSegmentB\", uniforms.shoSegmentB);\n        }\n\n        void InitSegments(DirectParams srcParams)\n        {\n            var paramsCopy = srcParams;\n\n            whitePoint = srcParams.W;\n            inverseWhitePoint = 1f / srcParams.W;\n\n            // normalize params to 1.0 range\n            paramsCopy.W = 1f;\n            paramsCopy.x0 /= srcParams.W;\n            paramsCopy.x1 /= srcParams.W;\n            paramsCopy.overshootX = srcParams.overshootX / srcParams.W;\n\n            float toeM = 0f;\n            float shoulderM = 0f;\n            {\n                float m, b;\n                AsSlopeIntercept(out m, out b, paramsCopy.x0, paramsCopy.x1, paramsCopy.y0, paramsCopy.y1);\n\n                float g = srcParams.gamma;\n\n                // Base function of linear section plus gamma is\n                // y = (mx+b)^g\n                //\n                // which we can rewrite as\n                // y = exp(g*ln(m) + g*ln(x+b/m))\n                //\n                // and our evaluation function is (skipping the if parts):\n                /*\n                    float x0 = (x - offsetX) * scaleX;\n                    y0 = exp(m_lnA + m_B*log(x0));\n                    return y0*scaleY + m_offsetY;\n                */\n\n                var midSegment = m_Segments[1];\n                midSegment.offsetX = -(b / m);\n                midSegment.offsetY = 0f;\n                midSegment.scaleX = 1f;\n                midSegment.scaleY = 1f;\n                midSegment.lnA = g * Mathf.Log(m);\n                midSegment.B = g;\n\n                toeM = EvalDerivativeLinearGamma(m, b, g, paramsCopy.x0);\n                shoulderM = EvalDerivativeLinearGamma(m, b, g, paramsCopy.x1);\n\n                // apply gamma to endpoints\n                paramsCopy.y0 = Mathf.Max(1e-5f, Mathf.Pow(paramsCopy.y0, paramsCopy.gamma));\n                paramsCopy.y1 = Mathf.Max(1e-5f, Mathf.Pow(paramsCopy.y1, paramsCopy.gamma));\n\n                paramsCopy.overshootY = Mathf.Pow(1f + paramsCopy.overshootY, paramsCopy.gamma) - 1f;\n            }\n\n            this.x0 = paramsCopy.x0;\n            this.x1 = paramsCopy.x1;\n\n            this.y0 = paramsCopy.y0;\n            this.y1 = paramsCopy.y1;\n\n            // Toe section\n            {\n                var toeSegment = m_Segments[0];\n                toeSegment.offsetX = 0;\n                toeSegment.offsetY = 0f;\n                toeSegment.scaleX = 1f;\n                toeSegment.scaleY = 1f;\n\n                float lnA, B;\n                SolveAB(out lnA, out B, paramsCopy.x0, paramsCopy.y0, toeM);\n                toeSegment.lnA = lnA;\n                toeSegment.B = B;\n            }\n\n            // Shoulder section\n            {\n                // Use the simple version that is usually too flat \n                var shoulderSegment = m_Segments[2];\n\n                float x0 = (1f + paramsCopy.overshootX) - paramsCopy.x1;\n                float y0 = (1f + paramsCopy.overshootY) - paramsCopy.y1;\n\n                float lnA, B;\n                SolveAB(out lnA, out B, x0, y0, shoulderM);\n\n                shoulderSegment.offsetX = (1f + paramsCopy.overshootX);\n                shoulderSegment.offsetY = (1f + paramsCopy.overshootY);\n\n                shoulderSegment.scaleX = -1f;\n                shoulderSegment.scaleY = -1f;\n                shoulderSegment.lnA = lnA;\n                shoulderSegment.B = B;\n            }\n\n            // Normalize so that we hit 1.0 at our white point. We wouldn't have do this if we \n            // skipped the overshoot part.\n            {\n                // Evaluate shoulder at the end of the curve\n                float scale = m_Segments[2].Eval(1f);\n                float invScale = 1f / scale;\n\n                m_Segments[0].offsetY *= invScale;\n                m_Segments[0].scaleY *= invScale;\n\n                m_Segments[1].offsetY *= invScale;\n                m_Segments[1].scaleY *= invScale;\n\n                m_Segments[2].offsetY *= invScale;\n                m_Segments[2].scaleY *= invScale;\n            }\n        }\n\n        // Find a function of the form:\n        //   f(x) = e^(lnA + Bln(x))\n        // where\n        //   f(0)   = 0; not really a constraint\n        //   f(x0)  = y0\n        //   f'(x0) = m\n        void SolveAB(out float lnA, out float B, float x0, float y0, float m)\n        {\n            B = (m * x0) / y0;\n            lnA = Mathf.Log(y0) - B * Mathf.Log(x0);\n        }\n\n        // Convert to y=mx+b\n        void AsSlopeIntercept(out float m, out float b, float x0, float x1, float y0, float y1)\n        {\n            float dy = (y1 - y0);\n            float dx = (x1 - x0);\n\n            if (dx == 0)\n                m = 1f;\n            else\n                m = dy / dx;\n\n            b = y0 - x0 * m;\n        }\n\n        // f(x) = (mx+b)^g\n        // f'(x) = gm(mx+b)^(g-1)\n        float EvalDerivativeLinearGamma(float m, float b, float g, float x)\n        {\n            float ret = g * m * Mathf.Pow(m * x + b, g - 1f);\n            return ret;\n        }\n\n        /// <summary>\n        /// Utility class to retrieve curve values for shader evaluation.\n        /// </summary>\n        public class Uniforms\n        {\n            HableCurve parent;\n\n            internal Uniforms(HableCurve parent)\n            {\n                this.parent = parent;\n            }\n\n            /// <summary>\n            /// A pre-built <see cref=\"Vector4\"/> holding: <c>(inverseWhitePoint, x0, x1, 0)</c>.\n            /// </summary>\n            public Vector4 curve\n            {\n                get { return new Vector4(parent.inverseWhitePoint, parent.x0, parent.x1, 0f); }\n            }\n\n\n            public Vector2 y0y1\n            {\n                get { return new Vector2(parent.y0, parent.y1); }\n            }\n\n            /// <summary>\n            /// A pre-built <see cref=\"Vector4\"/> holding: <c>(toe.offsetX, toe.offsetY, toe.scaleX, toe.scaleY)</c>.\n            /// </summary>\n            public Vector4 toeSegmentA\n            {\n                get\n                {\n                    var toe = parent.m_Segments[0];\n                    return new Vector4(toe.offsetX, toe.offsetY, toe.scaleX, toe.scaleY);\n                }\n            }\n\n            /// <summary>\n            /// A pre-built <see cref=\"Vector4\"/> holding: <c>(toe.lnA, toe.B, 0, 0)</c>.\n            /// </summary>\n            public Vector4 toeSegmentB\n            {\n                get\n                {\n                    var toe = parent.m_Segments[0];\n                    return new Vector4(toe.lnA, toe.B, 0f, 0f);\n                }\n            }\n\n            /// <summary>\n            /// A pre-built <see cref=\"Vector4\"/> holding: <c>(mid.offsetX, mid.offsetY, mid.scaleX, mid.scaleY)</c>.\n            /// </summary>\n            public Vector4 midSegmentA\n            {\n                get\n                {\n                    var mid = parent.m_Segments[1];\n                    return new Vector4(mid.offsetX, mid.offsetY, mid.scaleX, mid.scaleY);\n                }\n            }\n\n            /// <summary>\n            /// A pre-built <see cref=\"Vector4\"/> holding: <c>(mid.lnA, mid.B, 0, 0)</c>.\n            /// </summary>\n            public Vector4 midSegmentB\n            {\n                get\n                {\n                    var mid = parent.m_Segments[1];\n                    return new Vector4(mid.lnA, mid.B, 0f, 0f);\n                }\n            }\n\n            /// <summary>\n            /// A pre-built <see cref=\"Vector4\"/> holding: <c>(toe.offsetX, toe.offsetY, toe.scaleX, toe.scaleY)</c>.\n            /// </summary>\n            public Vector4 shoSegmentA\n            {\n                get\n                {\n                    var sho = parent.m_Segments[2];\n                    return new Vector4(sho.offsetX, sho.offsetY, sho.scaleX, sho.scaleY);\n                }\n            }\n\n            /// <summary>\n            /// A pre-built <see cref=\"Vector4\"/> holding: <c>(sho.lnA, sho.B, 0, 0)</c>.\n            /// </summary>\n            public Vector4 shoSegmentB\n            {\n                get\n                {\n                    var sho = parent.m_Segments[2];\n                    return new Vector4(sho.lnA, sho.B, 0f, 0f);\n                }\n            }\n        }\n\n        /// <summary>\n        /// The builtin <see cref=\"Uniforms\"/> instance for this curve.\n        /// </summary>\n        public readonly Uniforms uniforms;\n    }\n}"
  },
  {
    "path": "scatterer/GUI/AtmoGUI.cs",
    "content": "using System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.IO;\r\nusing System.Reflection;\r\nusing System.Runtime;\r\nusing KSP;\r\nusing KSP.IO;\r\nusing UnityEngine;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class AtmoGUI\r\n\t{\r\n\t\tfloat Rg = 600000.0f;\r\n\t\tfloat atmosphereStartRadiusScale = 1f;\r\n\t\tfloat HR = 3.2f;\r\n\t\tfloat HM = 0.48f;\r\n\r\n\t\tVector3 m_betaR = new Vector3(0.029f, 0.0675f, 0.1655f);\r\n\t\tVector3 BETA_MSca = new Vector3(0.02f,0.02f,0.02f);\r\n\r\n\t\tVector3 ozoneAbsorption = new Vector3(0.0000003426f, 0.0000008298f, 0.000000036f);\r\n\t\tfloat ozoneHeight = 25f;\r\n\t\tfloat ozoneFalloff = 15f;\r\n\t\tbool useOzone = false;\r\n\r\n\t\tfloat m_mieG = 0.85f;\r\n\t\tfloat AVERAGE_GROUND_REFLECTANCE = 0.1f;\r\n\r\n\t\tfloat rescale = 1f, thickenRayleigh = 1f, thickenMie = 1f, thickenOzone = 1f;\r\n\t\t\r\n\t\tbool multipleScattering = true;\r\n\t\tbool fastPreviewMode = false;\r\n\r\n\t\tSkyNode targetSkyNode;\r\n\t\tint selPlanet;\r\n\r\n\t\tpublic AtmoGUI ()\r\n\t\t{\r\n\t\t}\r\n\r\n\t\tpublic void drawAtmoGUI(int selectedPlanet)\r\n\t\t{\r\n\t\t\tGUILayout.BeginHorizontal();\r\n\t\t\tGUILayout.Label(\"Atmosphere start radius     \");\t\t\t\t\r\n\t\t\tGUILayout.TextField((Rg * atmosphereStartRadiusScale).ToString());\r\n\t\t\tGUILayout.EndHorizontal();\r\n\r\n\t\t\tGUILayout.BeginHorizontal();\r\n\t\t\tGUILayout.Label(\"Scale start radius\");\r\n\t\t\tatmosphereStartRadiusScale=(float)(float.Parse(GUILayout.TextField(atmosphereStartRadiusScale.ToString())));\r\n\t\t\tGUILayout.EndHorizontal();\r\n\r\n\t\t\tGUILayout.BeginHorizontal();\r\n\t\t\tGUILayout.Label(\"Atmo height (auto)\");\r\n\t\t\tGUILayout.TextField((AtmoPreprocessor.CalculateRt (Rg*atmosphereStartRadiusScale, HR, HM, m_betaR, BETA_MSca, useOzone, ozoneHeight, ozoneFalloff)-Rg*atmosphereStartRadiusScale).ToString());\r\n\t\t\tGUILayout.EndHorizontal();\r\n\r\n\t\t\tGUIvector3NoButton (\"Rayleigh Scattering - Beta_R:\", ref m_betaR);\r\n\t\t\t\r\n\t\t\tGUILayout.BeginHorizontal();\r\n\t\t\tGUILayout.Label(\"Thicken\");\r\n\t\t\tthickenRayleigh=(float)(float.Parse(GUILayout.TextField(thickenRayleigh.ToString(\"00.000\"))));\r\n\t\t\tif (GUILayout.Button (\"Go\"))\r\n\t\t\t{\r\n\t\t\t\tm_betaR*=thickenRayleigh;\r\n\t\t\t\tgenerate();\r\n\t\t\t}\r\n\t\t\tGUILayout.EndHorizontal();\r\n\r\n\t\t\tGUIvector3NoButton (\"Mie Scattering - Beta_MSca:\", ref BETA_MSca);\r\n\t\t\t\r\n\t\t\tGUILayout.BeginHorizontal();\r\n\t\t\tGUILayout.Label(\"Thicken\");\r\n\t\t\tthickenMie=(float)(float.Parse(GUILayout.TextField(thickenMie.ToString(\"00.000\"))));\r\n\t\t\tif (GUILayout.Button (\"Go\"))\r\n\t\t\t{\r\n\t\t\t\tBETA_MSca*=thickenMie;\r\n\t\t\t\tgenerate();\r\n\t\t\t}\r\n\t\t\tGUILayout.EndHorizontal();\r\n\r\n\t\t\tGUILayout.BeginHorizontal();\r\n\t\t\tGUILayout.Label(\"Mie G (Mie phase function asymmetry)\");\r\n\t\t\tm_mieG = (float)(float.Parse(GUILayout.TextField(m_mieG.ToString())));\r\n\t\t\tGUILayout.EndHorizontal();\r\n\r\n\t\t\tGUILayout.BeginHorizontal();\r\n\t\t\tGUILayout.Label(\"Rayleigh density scale height\");\t\r\n\t\t\tGUILayout.EndHorizontal();\r\n\r\n\t\t\tGUILayout.BeginHorizontal();\r\n\t\t\tGUILayout.Label(\"HR (in KM)\");\t\r\n\t\t\tHR=(float)(float.Parse(GUILayout.TextField(HR.ToString())));\r\n\t\t\tGUILayout.EndHorizontal();\r\n\r\n\t\t\tGUILayout.BeginHorizontal();\r\n\t\t\tGUILayout.Label(\"Mie density scale height\");\t\r\n\t\t\tGUILayout.EndHorizontal();\r\n\r\n\t\t\tGUILayout.BeginHorizontal();\r\n\t\t\tGUILayout.Label(\"HM (in KM)\");\t\r\n\t\t\tHM=(float)(float.Parse(GUILayout.TextField(HM.ToString())));\r\n\t\t\tGUILayout.EndHorizontal();\r\n\r\n\t\t\tGUIvector3NoButton(\"Ozone absorption:\", ref ozoneAbsorption);\r\n\r\n\t\t\tGUILayout.BeginHorizontal();\r\n\t\t\tGUILayout.Label(\"Thicken\");\r\n\t\t\tthickenOzone = (float)(float.Parse(GUILayout.TextField(thickenOzone.ToString(\"00.000\"))));\r\n\t\t\tif (GUILayout.Button(\"Go\"))\r\n\t\t\t{\r\n\t\t\t\tozoneAbsorption *= thickenOzone;\r\n\t\t\t\tgenerate();\r\n\t\t\t}\r\n\t\t\tGUILayout.EndHorizontal();\r\n\r\n\t\t\tGUILayout.BeginHorizontal();\r\n\t\t\tGUILayout.Label(\"Ozone layer altitude (km)\");\r\n\t\t\tozoneHeight = (float)(float.Parse(GUILayout.TextField(ozoneHeight.ToString())));\r\n\t\t\tGUILayout.EndHorizontal();\r\n\r\n\t\t\tGUILayout.BeginHorizontal();\r\n\t\t\tGUILayout.Label(\"Ozone layer falloff/extents (km)\");\r\n\t\t\tozoneFalloff = (float)(float.Parse(GUILayout.TextField(ozoneFalloff.ToString())));\r\n\t\t\tGUILayout.EndHorizontal();\r\n\r\n\t\t\tGUILayout.BeginHorizontal();\r\n\t\t\tGUILayout.Label(\"Use Ozone: \" + useOzone.ToString() + \" \");\r\n\t\t\tif (GUILayout.Button(\"Toggle\"))\r\n\t\t\t\tuseOzone = !useOzone;\r\n\t\t\tGUILayout.EndHorizontal();\r\n\r\n\t\t\tGUILayout.BeginHorizontal();\r\n\t\t\tGUILayout.Label(\"Auto rescale\");\r\n\t\t\trescale=(float)(float.Parse(GUILayout.TextField(rescale.ToString(\"00.000\"))));\r\n\t\t\tif (GUILayout.Button (\"Go\"))\r\n\t\t\t{\r\n\t\t\t\tHR*=rescale;\r\n\t\t\t\tHM*=rescale;\r\n\t\t\t\tm_betaR/=rescale;\r\n\t\t\t\tBETA_MSca/=rescale;\r\n\t\t\t\tozoneHeight *= rescale;\r\n\t\t\t\tozoneFalloff *= rescale;\r\n\t\t\t\tozoneAbsorption /= rescale;\r\n\t\t\t\tgenerate();\r\n\t\t\t}\r\n\t\t\tGUILayout.EndHorizontal();\r\n\t\t\t\r\n\t\t\tGUILayout.BeginHorizontal();\r\n\t\t\tGUILayout.Label(\"Average ground reflectance\");\r\n\t\t\tAVERAGE_GROUND_REFLECTANCE=(float)(float.Parse(GUILayout.TextField(AVERAGE_GROUND_REFLECTANCE.ToString())));\r\n\t\t\tGUILayout.EndHorizontal();\r\n\r\n\t\t\tGUILayout.BeginHorizontal();\r\n\t\t\tGUILayout.Label(\"Multiple scattering: \"+multipleScattering.ToString()+\" \");\t\r\n\t\t\tif (GUILayout.Button (\"Toggle\"))\r\n\t\t\t\tmultipleScattering = !multipleScattering;\r\n\t\t\tGUILayout.EndHorizontal();\r\n\t\t\t\r\n\t\t\tGUILayout.BeginHorizontal();\r\n\t\t\tGUILayout.Label(\"Fast preview mode: \"+fastPreviewMode.ToString());\t\r\n\t\t\tif (GUILayout.Button (\"Toggle\"))\r\n\t\t\t\tfastPreviewMode = !fastPreviewMode;\r\n\t\t\tGUILayout.EndHorizontal();\r\n\t\t\t\r\n\t\t\tGUILayout.BeginHorizontal();\r\n\t\t\tif (GUILayout.Button (\"Generate\"))\r\n\t\t\t{\r\n\t\t\t\tgenerate();\r\n\t\t\t}\r\n\t\t\tGUILayout.EndHorizontal();\r\n\t\t\tGUILayout.BeginHorizontal();\r\n\t\t\tif (GUILayout.Button (\"Delete atmo cache\"))\r\n\t\t\t{\r\n\t\t\t\tAtmoPreprocessor.DeleteCache();\r\n\t\t\t}\r\n\t\t\tGUILayout.EndHorizontal();\r\n\r\n\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\tif (!targetSkyNode.isConfigModuleManagerPatch)\r\n\t\t\t{\r\n\t\t\t\tif (GUILayout.Button (\"Save atmo\"))\r\n\t\t\t\t{\r\n\t\t\t\t\ttargetSkyNode.SaveToConfigNode ();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (GUILayout.Button (\"Load atmo\")) {\r\n\t\t\t\ttargetSkyNode.LoadFromConfigNode ();\r\n\t\t\t\tloadSettingsForPlanet(selPlanet);\r\n\r\n\t\t\t}\r\n\t\t\tGUILayout.EndHorizontal ();\r\n\r\n\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\tGUILayout.Label (\".cfg file used:\");\r\n\t\t\tGUIStyle guiStyle = new GUIStyle(GUI.skin.textArea);\r\n\t\t\tif (targetSkyNode.isConfigModuleManagerPatch)\r\n\t\t\t\tguiStyle.normal.textColor = Color.red;\r\n\t\t\t\r\n\t\t\tGUILayout.TextField (targetSkyNode.isConfigModuleManagerPatch ? \"ModuleManager patch detected, saving disabled\" : targetSkyNode.configUrl.parent.url, guiStyle);\r\n\t\t\tGUILayout.EndHorizontal ();\r\n\t\t}\r\n\r\n\r\n\t\tvoid generate()\r\n\t\t{\r\n\t\t\tUtils.LogDebug (\"Generating atmosphere from UI for planet: \" + targetSkyNode.prolandManager.scattererCelestialBody.celestialBodyName + \"\" +\r\n\t\t\t\t\"With settings:\" +\r\n\t\t\t\t\"Rg \" + (Rg*atmosphereStartRadiusScale).ToString () +\r\n\t\t\t\t\" HR \" + HR.ToString () +\r\n\t\t\t\t\" HM \" + HM.ToString () +\r\n\t\t\t\t\" m_betaR \" + m_betaR.ToString () +\r\n\t\t\t\t\" BETA_MSca \" + BETA_MSca.ToString () +\r\n\t\t\t\t\" m_mieG \" + m_mieG.ToString () +\r\n\t\t\t\t\" ozoneAbsorption \" + ozoneAbsorption.ToString() +\r\n\t\t\t\t\" ozoneHeight \" + ozoneHeight.ToString() +\r\n\t\t\t\t\" ozoneFalloff \" + ozoneFalloff.ToString() +\r\n\t\t\t\t\" useOzone \" + useOzone.ToString() +\r\n\t\t\t\t\" AVERAGE_GROUND_REFLECTANCE \" + AVERAGE_GROUND_REFLECTANCE.ToString () +\r\n\t\t\t\t\" multipleScattering \" + multipleScattering.ToString () +\r\n\t\t\t\t\" fastPreviewMode \" + fastPreviewMode.ToString ());\r\n\r\n\t\t\ttargetSkyNode.ApplyAtmoFromUI (m_betaR, BETA_MSca, m_mieG, HR, HM, AVERAGE_GROUND_REFLECTANCE, multipleScattering, fastPreviewMode, atmosphereStartRadiusScale, useOzone, ozoneAbsorption, ozoneHeight, ozoneFalloff);\r\n\t\t}\r\n\r\n\t\tpublic void loadSettingsForPlanet(int selectedPlanet)\r\n\t\t{\r\n\t\t\tif (Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].active)\r\n\t\t\t{\r\n\t\t\t\ttargetSkyNode = Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.GetSkyNode();\r\n\t\t\t\tselPlanet = selectedPlanet;\r\n\r\n\t\t\t\tRg = targetSkyNode.Rg;\r\n\t\t\t\tatmosphereStartRadiusScale = targetSkyNode.atmosphereStartRadiusScale;\r\n\t\t\t\tHR = targetSkyNode.HR;\r\n\t\t\t\tHM = targetSkyNode.HM;\r\n\t\t\t\tm_betaR = targetSkyNode.m_betaR;\r\n\t\t\t\tBETA_MSca = targetSkyNode.BETA_MSca;\r\n\t\t\t\tm_mieG = targetSkyNode.m_mieG;\r\n\t\t\t\tAVERAGE_GROUND_REFLECTANCE = targetSkyNode.averageGroundReflectance;\r\n\t\t\t\tmultipleScattering = targetSkyNode.multipleScattering;\r\n\r\n\t\t\t\tozoneAbsorption = targetSkyNode.ozoneAbsorption;\r\n\t\t\t\tozoneHeight = targetSkyNode.ozoneHeight;\r\n\t\t\t\tozoneFalloff = targetSkyNode.ozoneFalloff;\r\n\t\t\t\tuseOzone = targetSkyNode.useOzone;\r\n\r\n\t\t\t\tfastPreviewMode = false;\r\n\t\t\t\trescale=1f;\r\n\t\t\t\tthickenRayleigh=1f;\r\n\t\t\t\tthickenMie=1f;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void GUIvector3NoButton (string label, ref Vector3 target)\r\n\t\t{\r\n\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\tGUILayout.Label (label);\r\n\t\t\tGUILayout.EndHorizontal ();\r\n\r\n\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\tGUILayout.Label (\"R\");\r\n\t\t\ttarget.x = float.Parse(GUILayout.TextField(target.x.ToString()));\r\n\t\t\tGUILayout.Label (\"G\");\r\n\t\t\ttarget.y = float.Parse(GUILayout.TextField(target.y.ToString()));\r\n\t\t\tGUILayout.Label (\"B\");\r\n\t\t\ttarget.z = float.Parse (GUILayout.TextField (target.z.ToString()));\r\n\t\t\tGUILayout.EndHorizontal ();\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/GUI/ConfigPointGUI.cs",
    "content": "using System;\r\nusing UnityEngine;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class ConfigPointGUI\r\n\t{\r\n\t\tpublic int selectedConfigPoint = 0;\r\n\t\tprivate Vector2 _scroll;\r\n\r\n\t\tVector3 sunColor=Vector3.one;\r\n\t\t\r\n\t\tfloat rimBlend = 20f;\r\n\t\tfloat rimpower = 600f;\r\n\t\tfloat cloudColorMultiplier=1f;\r\n\t\tfloat cloudScatteringMultiplier=1f;\r\n\t\tfloat cloudSkyIrradianceMultiplier = 1f;\r\n\t\tfloat volumetricsColorMultiplier=1f;\r\n\t\t\r\n\t\tfloat godrayStrength = 1.0f;\r\n\t\t//\t\tfloat godrayCloudAlphaThreshold = 0.1f;\r\n\t\t\r\n\t\tfloat extinctionThickness = 1f;\r\n\t\tfloat skyExtinctionTint = 1f;\r\n\t\tfloat noonSunlightExtinctionStrength = 1f;\r\n\r\n\t\tfloat specR = 0f, specG = 0f, specB = 0f, shininess = 0f, flattenScaledSpaceMesh = 0f;\r\n\t\t\r\n\t\t//ConfigPoint variables \t\t\r\n\t\tfloat pointAltitude = 0f;\r\n\t\tfloat newCfgPtAlt = 0f;\r\n\t\tint configPointsCnt;\r\n\t\tfloat postProcessingalpha = 78f;\r\n\t\tfloat postProcessDepth = 200f;\r\n\t\t\r\n\t\tfloat extinctionTint=100f;\r\n\t\t\r\n\t\tfloat postProcessExposure = 18f;\r\n\t\t\r\n\t\t//sky properties\r\n\t\tfloat exposure = 25f;\r\n\t\tfloat alphaGlobal = 100f;\r\n\r\n\t\tpublic ConfigPointGUI ()\r\n\t\t{\r\n\t\t}\r\n\r\n\t\tpublic void DrawConfigPointGUI (int selectedPlanet)\r\n\t\t{\r\n\t\t\tconfigPointsCnt = Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.configPoints.Count;\r\n\t\t\t\r\n\t\t\tConfigPoint _cur = Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.configPoints [selectedConfigPoint];\r\n\t\t\t\r\n\t\t\t//if (!MapView.MapIsEnabled)\r\n\t\t\t{\r\n\t\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\t\tGUILayout.Label (\"New point altitude:\");\r\n\t\t\t\tnewCfgPtAlt = Convert.ToSingle (GUILayout.TextField (newCfgPtAlt.ToString ()));\r\n\t\t\t\tif (GUILayout.Button (\"Add\")) {\r\n\t\t\t\t\tScatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.configPoints.Insert (selectedConfigPoint + 1, new ConfigPoint (newCfgPtAlt, alphaGlobal / 100, exposure / 100, postProcessingalpha / 100, postProcessDepth / 10000, postProcessExposure / 100, skyExtinctionTint / 100, extinctionTint / 100, extinctionThickness));\r\n\t\t\t\t\tselectedConfigPoint += 1;\r\n\t\t\t\t\tconfigPointsCnt = Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.configPoints.Count;\r\n\t\t\t\t\tloadConfigPoint (selectedConfigPoint, selectedPlanet);\r\n\t\t\t\t}\r\n\t\t\t\tGUILayout.EndHorizontal ();\r\n\t\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\t\tGUILayout.Label (\"Config point:\");\r\n\t\t\t\tif (GUILayout.Button (\"<\")) {\r\n\t\t\t\t\tif (selectedConfigPoint > 0) {\r\n\t\t\t\t\t\tselectedConfigPoint -= 1;\r\n\t\t\t\t\t\tloadConfigPoint (selectedConfigPoint, selectedPlanet);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tGUILayout.TextField ((selectedConfigPoint).ToString ());\r\n\t\t\t\tif (GUILayout.Button (\">\")) {\r\n\t\t\t\t\tif (selectedConfigPoint < configPointsCnt - 1) {\r\n\t\t\t\t\t\tselectedConfigPoint += 1;\r\n\t\t\t\t\t\tloadConfigPoint (selectedConfigPoint, selectedPlanet);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t//GUILayout.Label (String.Format(\"Total:{0}\", configPointsCnt));\r\n\t\t\t\tif (GUILayout.Button (\"Delete\")) {\r\n\t\t\t\t\tif (configPointsCnt <= 1)\r\n\t\t\t\t\t\tDebug.LogError (\"Can't delete config point, one or no points remaining\");\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tScatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.configPoints.RemoveAt (selectedConfigPoint);\r\n\t\t\t\t\t\tif (selectedConfigPoint >= configPointsCnt - 1) {\r\n\t\t\t\t\t\t\tselectedConfigPoint = configPointsCnt - 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tconfigPointsCnt = Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.configPoints.Count;\r\n\t\t\t\t\t\tloadConfigPoint (selectedConfigPoint, selectedPlanet);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tGUILayout.EndHorizontal ();\r\n\t\t\t\tGUIfloat (\"Point altitude\", ref pointAltitude, ref _cur.altitude);\r\n\t\t\t\t_scroll = GUILayout.BeginScrollView (_scroll, false, true, GUILayout.Width (400), GUILayout.Height (Scatterer.Instance.pluginData.scrollSectionHeight));\r\n\t\t\t\tGUILayout.Label (\"(settings with a * are global and not cfgPoint dependent)\");\r\n\r\n\t\t\t\tGUILayout.Label (\"Sky\");\r\n\t\t\t\tGUIfloat (\"Sky Exposure\", ref exposure, ref _cur.skyExposure);\r\n\t\t\t\tGUIfloat (\"Sky Alpha\", ref alphaGlobal, ref _cur.skyAlpha);\r\n\t\t\t\tGUIfloat (\"Sky Extinction Tint\", ref skyExtinctionTint, ref _cur.skyExtinctionTint);\r\n\t\t\t\tGUILayout.Label (\"Scattering and Extinction\");\r\n\t\t\t\tGUIfloat (\"Scattering Exposure (scaled+local)\", ref postProcessExposure, ref _cur.scatteringExposure);\r\n\t\t\t\tGUIfloat (\"Extinction Tint (scaled+local)\", ref extinctionTint, ref _cur.extinctionTint);\r\n\t\t\t\tGUIfloat (\"Extinction Thickness (scaled+local)\", ref extinctionThickness, ref _cur.extinctionThickness);\r\n\t\t\t\tGUIfloat (\"Noon Sunlight Extinction strength*\", ref noonSunlightExtinctionStrength, ref Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies[selectedPlanet].prolandManager.skyNode.noonSunlightExtinctionStrength);\r\n\t\t\t\tGUILayout.Label (\"Post Processing\");\r\n\t\t\t\tGUIfloat (\"Post Processing Alpha\", ref postProcessingalpha, ref _cur.postProcessAlpha);\r\n\t\t\t\tGUIfloat (\"Post Processing Depth\", ref postProcessDepth, ref _cur.postProcessDepth);\r\n\t\t\t\tGUILayout.Label (\"Godrays\");\r\n\t\t\t\t\r\n\t\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\t\tGUILayout.Label (\"Legacy Godrays strength*\");\t\t\t\t\r\n\t\t\t\tgodrayStrength = Mathf.Min(float.Parse (GUILayout.TextField (godrayStrength.ToString (\"0.000\"))),1.0f);\r\n\t\t\t\tif (GUILayout.Button (\"Set\")) {\r\n\t\t\t\t\tScatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.godrayStrength = godrayStrength;\r\n\t\t\t\t}\r\n\t\t\t\tGUILayout.EndHorizontal ();\r\n\t\t\t}\r\n\t\t\tif (Scatterer.Instance.mainSettings.integrateWithEVEClouds && Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.usesCloudIntegration) {\r\n\t\t\t\tGUILayout.Label (\"EVE integration\");\r\n\t\t\t\tGUIfloat (\"2d Cloud Color Multiplier*\", ref cloudColorMultiplier, ref Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.cloudColorMultiplier);\r\n\t\t\t\tGUIfloat (\"2d Cloud Scattering Multiplier*\", ref cloudScatteringMultiplier, ref Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.cloudScatteringMultiplier);\r\n\t\t\t\tGUIfloat (\"2d Cloud Sky irradiance Multiplier*\", ref cloudSkyIrradianceMultiplier, ref Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.cloudSkyIrradianceMultiplier);\r\n\t\t\t\tGUIfloat (\"Particle Volumetrics Color Multiplier*\", ref volumetricsColorMultiplier, ref Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.volumetricsColorMultiplier);\r\n\t\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\t\tGUILayout.Label (\"Preserve 2d cloud colors*\");\r\n\t\t\t\tGUILayout.TextField (Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.EVEIntegration_preserveCloudColors.ToString ());\r\n\t\t\t\tif (GUILayout.Button (\"Toggle\"))\r\n\t\t\t\t\tScatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.TogglePreserveCloudColors ();\r\n\t\t\t\tGUILayout.EndHorizontal ();\r\n\t\t\t\t//\t\t\t\tGUIfloat (\"Godray alpha threshold* (alpha value above which a cloud casts a godray)\", ref godrayCloudAlphaThreshold, ref Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.m_skyNode.godrayCloudAlphaThreshold);\r\n\t\t\t\t//\t\t\t\t\t\t\t\tGUIfloat(\"Volumetrics Scattering Multiplier\", ref volumetricsScatteringMultiplier, ref Core.Instance.planetsListReader.scattererCelestialBodies [selectedPlanet].prolandManager.m_skyNode.volumetricsScatteringMultiplier);\r\n\t\t\t\t//\t\t\t\t\t\t\t\tGUIfloat(\"Volumetrics Sky irradiance Multiplier\", ref volumetricsSkyIrradianceMultiplier, ref Core.Instance.planetsListReader.scattererCelestialBodies [selectedPlanet].prolandManager.m_skyNode.volumetricsSkyIrradianceMultiplier);\r\n\t\t\t}\r\n\t\t\tGUILayout.Label (\"ScaledSpace model\");\r\n\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\tGUILayout.Label (\"RimBlend*\");\r\n\t\t\trimBlend = Convert.ToSingle (GUILayout.TextField (rimBlend.ToString ()));\r\n\t\t\tGUILayout.Label (\"RimPower*\");\r\n\t\t\trimpower = Convert.ToSingle (GUILayout.TextField (rimpower.ToString ()));\r\n\t\t\tif (GUILayout.Button (\"Set\")) {\r\n\t\t\t\tScatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.rimBlend = rimBlend;\r\n\t\t\t\tScatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.rimpower = rimpower;\r\n\t\t\t\tScatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.TweakStockAtmosphere ();\r\n\t\t\t}\r\n\t\t\tGUILayout.EndHorizontal ();\r\n\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\tGUILayout.Label (\"Spec*: R\");\r\n\t\t\tspecR = (float)(Convert.ToDouble (GUILayout.TextField (specR.ToString ())));\r\n\t\t\tGUILayout.Label (\"G\");\r\n\t\t\tspecG = (float)(Convert.ToDouble (GUILayout.TextField (specG.ToString ())));\r\n\t\t\tGUILayout.Label (\"B\");\r\n\t\t\tspecB = (float)(Convert.ToDouble (GUILayout.TextField (specB.ToString ())));\r\n\t\t\tGUILayout.Label (\"shine*\");\r\n\t\t\tshininess = (float)(Convert.ToDouble (GUILayout.TextField (shininess.ToString ())));\r\n\t\t\tif (GUILayout.Button (\"Set\")) {\r\n\t\t\t\tScatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.specR = specR;\r\n\t\t\t\tScatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.specG = specG;\r\n\t\t\t\tScatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.specB = specB;\r\n\t\t\t\tScatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.shininess = shininess;\r\n\t\t\t\tScatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.flattenScaledSpaceMesh = flattenScaledSpaceMesh;\r\n\t\t\t\tScatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.TweakStockAtmosphere ();\r\n\t\t\t}\r\n\t\t\tGUILayout.EndHorizontal ();\r\n\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\tGUILayout.Label (\"Flatten scaled mesh\");\r\n\t\t\tflattenScaledSpaceMesh = (float)(Convert.ToDouble (GUILayout.TextField (flattenScaledSpaceMesh.ToString (\"0.000\"))));\r\n\t\t\tif (GUILayout.Button (\"Set\")) {\r\n\t\t\t\tScatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.flattenScaledSpaceMesh = flattenScaledSpaceMesh;\r\n\t\t\t\tScatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.TweakScaledMesh();\r\n\t\t\t\tScatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.scaledScatteringContainer.ApplyNewMesh(Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.parentScaledTransform.GetComponent<MeshFilter> ().sharedMesh);\r\n\t\t\t}\r\n\t\t\tGUILayout.EndHorizontal ();\r\n\r\n\t\t\tScatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.adjustScaledTexture = GUILayout.Toggle (Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.adjustScaledTexture, \"Adjust scaled texture\");\r\n\r\n\t\t\tif (Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.adjustScaledTexture)\r\n\t\t\t{\r\n\t\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\t\tGUILayout.Label (\"Land (brightness/contrast/saturation)\");\r\n\t\t\t\tGUILayout.EndHorizontal ();\r\n\r\n\t\t\t\tvar node = Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode;\r\n\r\n\t\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\t\tnode.scaledLandBrightnessAdjust = (float)(Convert.ToDouble (GUILayout.TextField (node.scaledLandBrightnessAdjust.ToString (\"0.00\"))));\r\n\t\t\t\tnode.scaledLandContrastAdjust = (float)(Convert.ToDouble (GUILayout.TextField (node.scaledLandContrastAdjust.ToString (\"0.00\"))));\r\n\t\t\t\tnode.scaledLandSaturationAdjust = (float)(Convert.ToDouble (GUILayout.TextField (node.scaledLandSaturationAdjust.ToString (\"0.00\"))));\r\n\t\t\t\tGUILayout.EndHorizontal ();\r\n\r\n\t\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\t\tGUILayout.Label (\"Ocean (brightness/contrast/saturation)\");\r\n\t\t\t\tGUILayout.EndHorizontal ();\r\n\r\n\t\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\t\tnode.scaledOceanBrightnessAdjust = (float)(Convert.ToDouble (GUILayout.TextField (node.scaledOceanBrightnessAdjust.ToString (\"0.00\"))));\r\n\t\t\t\tnode.scaledOceanContrastAdjust = (float)(Convert.ToDouble (GUILayout.TextField (node.scaledOceanContrastAdjust.ToString (\"0.00\"))));\r\n\t\t\t\tnode.scaledOceanSaturationAdjust = (float)(Convert.ToDouble (GUILayout.TextField (node.scaledOceanSaturationAdjust.ToString (\"0.00\"))));\r\n\t\t\t\tGUILayout.EndHorizontal ();\r\n\r\n\t\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\t\tif (GUILayout.Button (\"Set\")) {\r\n\t\t\t\t\tScatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.TweakStockScaledTexture();\r\n\t\t\t\t}\r\n\t\t\t\tGUILayout.EndHorizontal ();\r\n\r\n\t\t\t}\r\n\r\n\t\t\tGUILayout.Label (\"Misc\");\r\n\t\t\tGUIColorNoButton(\"Sunlight color \"+ Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.mainSunLight.name+ \" (Not saved automatically, save manually to PlanetsList)\", ref Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.sunColor);\r\n\t\t\t\r\n\t\t\tint index = 0;\r\n\t\t\tforeach (SecondarySun secondarySun in Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.secondarySuns)\r\n\t\t\t{\r\n\t\t\t\tVector4 colorVect = Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.planetShineRGBMatrix.GetRow(index);\r\n\t\t\t\tColor col = new Color(colorVect.x, colorVect.y, colorVect.z);\r\n\t\t\t\tGUIColorNoButton(\"Secondary sunlight color \"+secondarySun.config.celestialBodyName, ref col);\r\n\t\t\t\tcolorVect = new Vector4(col.r, col.g, col.b, colorVect.w);\r\n\t\t\t\tScatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.planetShineRGBMatrix.SetRow(index, colorVect);\r\n\t\t\t\tindex++;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tGUILayout.EndScrollView ();\r\n\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\tif (Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.currentConfigPoint == 0)\r\n\t\t\t\tGUILayout.Label (\"Current state:Lowest configPoint, cfgPoint 0\");\r\n\t\t\telse\r\n\t\t\t\tif (Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.currentConfigPoint >= configPointsCnt)\r\n\t\t\t\t\tGUILayout.Label (String.Format (\"Current state:Highest configPoint, cfgPoint{0}\", Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.currentConfigPoint - 1));\r\n\t\t\telse\r\n\t\t\t\tGUILayout.Label (String.Format (\"Current state:{0}% cfgPoint{1} + {2}% cfgPoint{3} \", (int)(100 * (1 - Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.percentage)), Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.currentConfigPoint - 1, (int)(100 * Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.percentage), Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.currentConfigPoint));\r\n\t\t\tGUILayout.EndHorizontal ();\r\n\t\t\t//\t\t\t\t\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\t//\t\t\t\t\t\t\tif (GUILayout.Button (\"toggle sky\"))\r\n\t\t\t//\t\t\t\t\t\t\t{\r\n\t\t\t//\t\t\t\t\t\t\t\tCore.Instance.planetsListReader.scattererCelestialBodies [selectedPlanet].prolandManager.m_skyNode.skyEnabled = !Core.Instance.planetsListReader.scattererCelestialBodies [selectedPlanet].prolandManager.m_skyNode.skyEnabled;\r\n\t\t\t//\t\t\t\t\t\t\t\tif (Core.Instance.planetsListReader.scattererCelestialBodies [selectedPlanet].prolandManager.m_skyNode.skyEnabled)\r\n\t\t\t//\t\t\t\t\t\t\t\t\tCore.Instance.planetsListReader.scattererCelestialBodies [selectedPlanet].prolandManager.m_skyNode.tweakStockAtmosphere();\r\n\t\t\t//\t\t\t\t\t\t\t\telse\r\n\t\t\t//\t\t\t\t\t\t\t\t\tCore.Instance.planetsListReader.scattererCelestialBodies [selectedPlanet].prolandManager.m_skyNode.RestoreStockAtmosphere();\r\n\t\t\t//\t\t\t\t\t\t\t}\r\n\t\t\t//\t\t\t\t\t\t\tGUILayout.EndHorizontal ();\r\n\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\t\r\n\t\t\tif (!Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.isConfigModuleManagerPatch)\r\n\t\t\t{\r\n\t\t\t\tif (GUILayout.Button (\"Save atmo\"))\r\n\t\t\t\t{\r\n\t\t\t\t\tScatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.SaveToConfigNode ();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (GUILayout.Button (\"Load atmo\")) {\r\n\t\t\t\tScatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.LoadFromConfigNode ();\r\n\t\t\t\tgetSettingsFromSkynode (selectedPlanet);\r\n\t\t\t\tloadConfigPoint (selectedConfigPoint, selectedPlanet);\r\n\t\t\t\t//Restore sun color, hacky I know\r\n\t\t\t\tScatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.sunColor = Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.scattererCelestialBody.sunColor;\r\n\t\t\t}\r\n\t\t\tGUILayout.EndHorizontal ();\r\n\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\tGUILayout.Label (\".cfg file used:\");\r\n\t\t\t\r\n\t\t\tGUIStyle guiStyle = new GUIStyle(GUI.skin.textArea);\r\n\t\t\tif (Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.isConfigModuleManagerPatch)\r\n\t\t\t\tguiStyle.normal.textColor = Color.red;\r\n\t\t\t\r\n\t\t\tGUILayout.TextField (Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.isConfigModuleManagerPatch ? \"ModuleManager patch detected, saving disabled\" : Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.configUrl.parent.url, guiStyle);\r\n\t\t\tGUILayout.EndHorizontal ();\r\n\t\t}\r\n\r\n\t\tpublic void loadSettingsForPlanet(int selectedPlanet)\r\n\t\t{\r\n\t\t\tselectedConfigPoint = 0;\r\n\t\t\tif (Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].active)\r\n\t\t\t{\r\n\t\t\t\tloadConfigPoint (selectedConfigPoint, selectedPlanet);\r\n\t\t\t\tgetSettingsFromSkynode (selectedPlanet);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void getSettingsFromSkynode (int selectedPlanet)\r\n\t\t{\r\n\t\t\tSkyNode skyNode = Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode;\r\n\t\t\tConfigPoint selected = skyNode.configPoints [selectedConfigPoint];\r\n\t\t\t\r\n\t\t\tpostProcessingalpha = selected.postProcessAlpha;\r\n\t\t\tpostProcessDepth = selected.postProcessDepth;\r\n\t\t\t\r\n\t\t\textinctionTint = selected.extinctionTint;\r\n\t\t\t\r\n\t\t\tpostProcessExposure = selected.scatteringExposure;\r\n\t\t\texposure = selected.skyExposure;\r\n\t\t\talphaGlobal = selected.skyAlpha;\r\n\t\t\t\r\n\t\t\tconfigPointsCnt = skyNode.configPoints.Count;\r\n\t\t\t\r\n\t\t\tspecR = skyNode.specR;\r\n\t\t\tspecG = skyNode.specG;\r\n\t\t\tspecB = skyNode.specB;\r\n\t\t\tshininess = skyNode.shininess;\r\n\t\t\tflattenScaledSpaceMesh = skyNode.flattenScaledSpaceMesh;\r\n\t\t\t\r\n\t\t\trimBlend = skyNode.rimBlend;\r\n\t\t\trimpower = skyNode.rimpower;\r\n\t\t\t\r\n\t\t\tskyExtinctionTint = selected.skyExtinctionTint;\r\n\t\t\t\r\n\t\t\textinctionThickness = selected.extinctionThickness;\r\n\t\t\t\r\n\t\t\tcloudColorMultiplier = skyNode.cloudColorMultiplier;\r\n\t\t\tcloudScatteringMultiplier = skyNode.cloudScatteringMultiplier;\r\n\t\t\tcloudSkyIrradianceMultiplier = skyNode.cloudSkyIrradianceMultiplier;\r\n\t\t\t\r\n\t\t\tvolumetricsColorMultiplier = skyNode.volumetricsColorMultiplier;\r\n\t\t\t//\t\t\tvolumetricsScatteringMultiplier = skyNode.volumetricsScatteringMultiplier;\r\n\t\t\t//\t\t\tvolumetricsSkyIrradianceMultiplier = skyNode.volumetricsSkyIrradianceMultiplier;\r\n\t\t\t\r\n\t\t\tgodrayStrength = skyNode.godrayStrength;\r\n\t\t\t//\t\t\tgodrayCloudAlphaThreshold = skyNode.godrayCloudAlphaThreshold;\r\n\t\t}\r\n\t\t\r\n\t\tpublic void loadConfigPoint (int point, int selectedPlanet)\r\n\t\t{\r\n\t\t\tConfigPoint _cur = Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.configPoints [point];\r\n\t\t\t\r\n\t\t\tpostProcessDepth = _cur.postProcessDepth;\r\n\t\t\textinctionTint = _cur.extinctionTint;\r\n\t\t\tpostProcessExposure = _cur.scatteringExposure;\r\n\t\t\tpostProcessingalpha = _cur.postProcessAlpha;\r\n\t\t\t\r\n\t\t\talphaGlobal = _cur.skyAlpha;\r\n\t\t\texposure = _cur.skyExposure;\r\n\t\t\tskyExtinctionTint = _cur.skyExtinctionTint;\r\n\t\t\t\r\n\t\t\textinctionThickness = _cur.extinctionThickness;\r\n\t\t\t\r\n\t\t\tpointAltitude = _cur.altitude;\r\n\t\t}\r\n\r\n\t\tpublic void GUIfloat (string label, ref float local, ref float target)\r\n\t\t{\r\n\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\tGUILayout.Label (label);\r\n\t\t\t\r\n\t\t\tlocal = float.Parse (GUILayout.TextField (local.ToString ()));\r\n\t\t\tif (GUILayout.Button (\"Set\")) {\r\n\t\t\t\ttarget = local;\r\n\t\t\t}\r\n\t\t\tGUILayout.EndHorizontal ();\r\n\t\t}\r\n\r\n\t\tpublic void GUIColorNoButton (string label, ref Color target)\r\n\t\t{\r\n\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\tGUILayout.Label (label);\r\n\t\t\t\r\n\t\t\ttarget.r = float.Parse (GUILayout.TextField (target.r.ToString ()));\r\n\t\t\ttarget.g = float.Parse (GUILayout.TextField (target.g.ToString ()));\r\n\t\t\ttarget.b = float.Parse (GUILayout.TextField (target.b.ToString ()));\r\n\t\t\t\r\n\t\t\tGUILayout.EndHorizontal ();\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/GUI/GUIhandler.cs",
    "content": "using System;\r\nusing UnityEngine;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class GUIhandler: MonoBehaviour\r\n\t{\r\n\t\tpublic Rect windowRect = new Rect (0, 0, 400, 50);\r\n\t\tpublic int windowId;\r\n\r\n\t\tpublic bool visible = false;\r\n\t\tpublic bool mainOptions=false;\r\n\t\tpublic bool sunflareOptions=false;\r\n\r\n\t\tpublic int selectedPlanet = 0;\r\n\t\tbool wireFrame = false;\r\n\r\n\t\tenum PlanetSettingsTabs\r\n\t\t{\r\n\t\t\tAtmo,\r\n\t\t\tOcean,\r\n\t\t\tConfigPoints,\r\n\t\t}\r\n\t\tPlanetSettingsTabs selectedPlanetSettingsTab = PlanetSettingsTabs.Atmo;\r\n\r\n\t\tMainOptionsGUI mainOptionsGUI = new MainOptionsGUI();\r\n\t\tConfigPointGUI configPointGUI = new ConfigPointGUI ();\r\n\t\tAtmoGUI atmoGUI = new AtmoGUI ();\r\n\t\tOceanGUI oceanGUI = new OceanGUI ();\r\n\t\tSunflareGUI sunflareGUI = new SunflareGUI ();\r\n\r\n\t\tpublic GUIhandler ()\r\n\t\t{\r\n\t\t}\r\n\r\n\t\tpublic void Init()\r\n\t\t{\r\n\t\t\twindowId = UnityEngine.Random.Range(int.MinValue, int.MaxValue);\r\n\t\t\tmainOptions = (HighLogic.LoadedScene == GameScenes.SPACECENTER);\r\n\t\t\twindowRect.x=Scatterer.Instance.pluginData.inGameWindowLocation.x;\r\n\t\t\twindowRect.y=Scatterer.Instance.pluginData.inGameWindowLocation.y;\r\n\r\n\t\t\t//prevent window from going offscreen, only do this on start as otherwise it messes with lower resolutions\r\n\t\t\twindowRect.x = Mathf.Clamp(windowRect.x, 0, Screen.width - windowRect.width);\r\n\t\t\twindowRect.y = Mathf.Clamp(windowRect.y, 0, Screen.height - windowRect.height);\r\n\t\t}\r\n\r\n\t\tpublic void UpdateGUIvisible()\r\n\t\t{\r\n\t\t\tif ((Input.GetKey (Scatterer.Instance.pluginData.guiModifierKey1) || Input.GetKey (Scatterer.Instance.pluginData.guiModifierKey2)) && (Input.GetKeyDown (Scatterer.Instance.pluginData.guiKey1) || (Input.GetKeyDown (Scatterer.Instance.pluginData.guiKey2))))\r\n\t\t\t{\r\n\t\t\t\tif (ToolbarButton.Instance.button!= null)\r\n\t\t\t\t{\r\n\t\t\t\t\tif (visible)\r\n\t\t\t\t\t\tToolbarButton.Instance.button.SetFalse(false);\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tToolbarButton.Instance.button.SetTrue(false);\r\n\t\t\t\t}\r\n\t\t\t\tvisible = !visible;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void DrawGui()\r\n\t\t{\r\n\t\t\tif (visible)\r\n\t\t\t{\r\n\t\t\t\twindowRect = GUILayout.Window (windowId, windowRect, DrawScattererWindow,\"Scatterer v\"+Scatterer.Instance.versionNumber+\": \"\r\n\t\t\t\t                               + Scatterer.Instance.pluginData.guiModifierKey1String+\"/\"+Scatterer.Instance.pluginData.guiModifierKey2String +\"+\" +Scatterer.Instance.pluginData.guiKey1String\r\n\t\t\t\t                               +\"/\"+Scatterer.Instance.pluginData.guiKey2String+\" toggle\");\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tpublic void DrawScattererWindow (int windowId)\r\n\t\t{\r\n\t\t\tif (mainOptions)\r\n\t\t\t{ \r\n\t\t\t\tmainOptionsGUI.DrawOptionsMenu ();\r\n\t\t\t}\r\n\t\t\telse if (Scatterer.Instance.isActive)\r\n\t\t\t{\r\n\t\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\t\tif (GUILayout.Button (\"Planet settings\"))\r\n\t\t\t\t{\r\n\t\t\t\t\twindowRect.width = 400;\r\n\t\t\t\t\twindowRect.height = 40;\r\n\t\t\t\t\tsunflareOptions = false;\r\n\t\t\t\t}\r\n\t\t\t\tif (Scatterer.Instance.mainSettings.fullLensFlareReplacement && Scatterer.Instance.sunflareManager && Scatterer.Instance.sunflareManager.scattererSunFlares != null)\r\n\t\t\t\t{\r\n\t\t\t\t\tif (GUILayout.Button (\"Sunflare settings\"))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\twindowRect.width = 400;\r\n\t\t\t\t\t\twindowRect.height = 40;\r\n\t\t\t\t\t\tsunflareGUI.InitSunflareGUI();\r\n\t\t\t\t\t\tsunflareOptions = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tGUILayout.EndHorizontal ();\r\n\r\n\t\t\t\tif (sunflareOptions)\r\n\t\t\t\t{\r\n\t\t\t\t\tsunflareGUI.DrawSunflareGUI();\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tDrawPlanetSelectionHeader ();\r\n\r\n\r\n\t\t\t\t\tif (Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].active)\r\n\t\t\t\t\t{\t\r\n\r\n\t\t\t\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\t\t\t\tif (GUILayout.Button(\"Atmosphere\"))\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\twindowRect.width = 300;\r\n\t\t\t\t\t\t\twindowRect.height = 40;\r\n\t\t\t\t\t\t\tselectedPlanetSettingsTab = PlanetSettingsTabs.Atmo;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (GUILayout.Button(\"Ocean\") && Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies[selectedPlanet].hasOcean)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\twindowRect.width = 400;\r\n\t\t\t\t\t\t\twindowRect.height = 40;\r\n\t\t\t\t\t\t\tselectedPlanetSettingsTab = PlanetSettingsTabs.Ocean;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (GUILayout.Button (\"Config points\"))\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\twindowRect.width = 400;\r\n\t\t\t\t\t\t\twindowRect.height = 40;\r\n\t\t\t\t\t\t\tselectedPlanetSettingsTab = PlanetSettingsTabs.ConfigPoints;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tGUILayout.EndHorizontal ();\t\r\n\r\n\t\t\t\t\t\tif (selectedPlanetSettingsTab == PlanetSettingsTabs.ConfigPoints)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tconfigPointGUI.DrawConfigPointGUI(selectedPlanet);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse if (selectedPlanetSettingsTab == PlanetSettingsTabs.Atmo)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tatmoGUI.drawAtmoGUI (selectedPlanet);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\toceanGUI.drawOceanGUI (selectedPlanet);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t\tDrawSharedFooterGUI ();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tGUILayout.Label (String.Format (\"Inactive in tracking station and VAB/SPH\"));\r\n\t\t\t\tGUILayout.EndHorizontal ();\r\n\t\t\t}\r\n\t\t\r\n\t\t\tGUI.DragWindow();\r\n\t\t}\r\n\r\n\t\t//move the getSettings, loadConfigPoint, selectedConfigPoint = 0; to method in ConfigPoint GUI\r\n\t\tvoid DrawPlanetSelectionHeader ()\r\n\t\t{\r\n\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\tGUILayout.Label (\"Planet:\");\r\n\t\t\tif (GUILayout.Button (\"<\"))\r\n\t\t\t{\r\n\t\t\t\tif (selectedPlanet > 0)\r\n\t\t\t\t{\r\n\t\t\t\t\tselectedPlanet -= 1;\r\n\r\n\t\t\t\t\tconfigPointGUI.loadSettingsForPlanet(selectedPlanet);\r\n\t\t\t\t\tatmoGUI.loadSettingsForPlanet(selectedPlanet);\r\n\r\n\t\t\t\t\tif (Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].active && Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].hasOcean)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\toceanGUI.buildOceanGUI (selectedPlanet);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tGUILayout.TextField ((Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].celestialBodyName).ToString ());\r\n\t\t\tif (GUILayout.Button (\">\")) {\r\n\t\t\t\tif (selectedPlanet < Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies.Count - 1) {\r\n\t\t\t\t\tselectedPlanet += 1;\r\n\t\t\t\t\tconfigPointGUI.loadSettingsForPlanet(selectedPlanet);\r\n\t\t\t\t\tatmoGUI.loadSettingsForPlanet(selectedPlanet);\r\n\r\n\t\t\t\t\tif (Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].active && Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].hasOcean)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\toceanGUI.buildOceanGUI (selectedPlanet);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tGUILayout.EndHorizontal ();\r\n\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\tGUILayout.Label (\"Loaded:\" + Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].active.ToString () + \". Has ocean:\" + Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].hasOcean.ToString ());\r\n\t\t\tGUILayout.EndHorizontal ();\r\n\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\tGUILayout.Label (\"Load distance:\" + Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].loadDistance.ToString () + \". Unload distance:\" + Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].unloadDistance.ToString ());\r\n\t\t\tGUILayout.EndHorizontal ();\r\n\t\t}\r\n\r\n\t\tvoid DrawSharedFooterGUI ()\r\n\t\t{\r\n\t\t\tif (Scatterer.Instance.mainSettings.integrateWithEVEClouds)\r\n\t\t\t{\r\n\t\t\t\tGUILayout.BeginHorizontal();\r\n\t\t\t\tif (GUILayout.Button(\"Map EVE clouds\"))\r\n\t\t\t\t{\r\n\t\t\t\t\tScatterer.Instance.eveReflectionHandler.MapEVEClouds();\r\n\t\t\t\t\tforeach (ScattererCelestialBody _cel in Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif (_cel.active)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t_cel.prolandManager.skyNode.InitEVEClouds();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tGUILayout.EndHorizontal();\r\n\t\t\t}\r\n\r\n\t\t\tGUILayout.BeginHorizontal();\r\n\t\t\tif (GUILayout.Button (\"Toggle WireFrame\")) {\r\n\t\t\t\tif (wireFrame) {\r\n\t\t\t\t\tif (HighLogic.LoadedScene != GameScenes.TRACKSTATION) {\r\n\t\t\t\t\t\tif (Scatterer.Instance.nearCamera.gameObject.GetComponent (typeof(Wireframe)))\r\n\t\t\t\t\t\t\tComponent.Destroy (Scatterer.Instance.nearCamera.gameObject.GetComponent (typeof(Wireframe)));\r\n\r\n\t\t\t\t\t\tif (Scatterer.Instance.farCamera && Scatterer.Instance.farCamera.gameObject.GetComponent (typeof(Wireframe)))\r\n\t\t\t\t\t\t\t\tComponent.Destroy (Scatterer.Instance.farCamera.gameObject.GetComponent (typeof(Wireframe)));\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (Scatterer.Instance.scaledSpaceCamera.gameObject.GetComponent (typeof(Wireframe)))\r\n\t\t\t\t\t\tComponent.Destroy (Scatterer.Instance.scaledSpaceCamera.gameObject.GetComponent (typeof(Wireframe)));\r\n\t\t\t\t\twireFrame = false;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tif (HighLogic.LoadedScene != GameScenes.TRACKSTATION) {\r\n\t\t\t\t\t\tScatterer.Instance.nearCamera.gameObject.AddComponent (typeof(Wireframe));\r\n\t\t\t\t\t\tif (Scatterer.Instance.farCamera)\r\n\t\t\t\t\t\t\tScatterer.Instance.farCamera.gameObject.AddComponent (typeof(Wireframe));\r\n\t\t\t\t\t}\r\n\t\t\t\t\tScatterer.Instance.scaledSpaceCamera.gameObject.AddComponent (typeof(Wireframe));\r\n\t\t\t\t\twireFrame = true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tGUILayout.EndHorizontal ();\r\n\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\tif (GUILayout.Button (\"Reload shader bundles\")) {\r\n\t\t\t\tShaderReplacer.Instance.LoadAssetBundle ();\r\n\t\t\t}\r\n\t\t\tGUILayout.EndHorizontal ();\r\n\t\t}\r\n\r\n\t\tpublic void LoadPlanet(int planetIndex)\r\n\t\t{\r\n\t\t\tselectedPlanetSettingsTab = PlanetSettingsTabs.Atmo;\r\n\t\t\tselectedPlanet = planetIndex;\r\n\t\t\tconfigPointGUI.loadSettingsForPlanet (selectedPlanet);\r\n\t\t\tatmoGUI.loadSettingsForPlanet(selectedPlanet);\r\n\r\n\t\t\tif (Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.GetOceanNode())\r\n\t\t\t{\r\n\t\t\t\toceanGUI.buildOceanGUI (planetIndex);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/GUI/MainOptionsGUI.cs",
    "content": "using System;\r\nusing System.Linq;\r\nusing UnityEngine;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class MainOptionsGUI\r\n\t{\r\n\t\tenum MainMenuTabs\r\n\t\t{\r\n\t\t\tQualityPresets,\r\n\t\t\tIndividualSettings\r\n\t\t}\r\n\t\t\r\n\t\tenum IndividualSettingsTabs\r\n\t\t{\r\n\t\t\tScattering,\r\n\t\t\tOcean,\r\n\t\t\tSunflare,\r\n\t\t\tLighting,\r\n\t\t\tShadows,\r\n\t\t\tEVEintegration,\r\n\t\t\tMisc\r\n\t\t}\r\n\t\t\r\n\t\tMainMenuTabs selectedMainMenuTab = MainMenuTabs.QualityPresets;\r\n\t\tIndividualSettingsTabs selectedIndividualSettingsTab = IndividualSettingsTabs.Scattering;\r\n\r\n\t\tString[] qualityPresetsStrings;\r\n\t\tstring currentPreset;\r\n\t\tint selQualityPresetInt = -1;\r\n\t\t\r\n\t\tpublic MainOptionsGUI ()\r\n\t\t{\r\n\t\t}\r\n\r\n\t\tpublic void DrawOptionsMenu ()\r\n\t\t{\r\n\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\t{\r\n\t\t\t\tGUILayout.Label (\"Menu scroll section height\");\r\n\t\t\t\tScatterer.Instance.pluginData.scrollSectionHeight = (Int32)(Convert.ToInt32 (GUILayout.TextField (Scatterer.Instance.pluginData.scrollSectionHeight.ToString ())));\r\n\t\t\t}\r\n\t\t\tGUILayout.EndHorizontal ();\r\n\t\t\t\r\n\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\t{\r\n\t\t\t\tGUILayout.Label (\".cfg file used (display only):\");\r\n\t\t\t\tGUILayout.TextField (Scatterer.Instance.planetsConfigsReader.baseConfigs [0].parent.url);\r\n\t\t\t}\r\n\t\t\tGUILayout.EndHorizontal ();\r\n\t\t\t\r\n\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\t{\r\n\t\t\t\tif (GUILayout.Button (\"Quality Presets\"))\r\n\t\t\t\t{\r\n\t\t\t\t\tInitPresets();\r\n\t\t\t\t\tselectedMainMenuTab = MainMenuTabs.QualityPresets;\r\n\t\t\t\t}\r\n\t\t\t\tif (GUILayout.Button (\"Customize Settings\"))\r\n\t\t\t\t{\r\n\t\t\t\t\tselectedMainMenuTab = MainMenuTabs.IndividualSettings;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tGUILayout.EndHorizontal ();\r\n\t\t\t\r\n\t\t\tif (selectedMainMenuTab == MainMenuTabs.QualityPresets)\r\n\t\t\t{\r\n\t\t\t\tDrawQualityPresets();\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tDrawIndividualSettings ();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid DrawQualityPresets ()\r\n\t\t{\r\n\t\t\tif (qualityPresetsStrings == null)\r\n\t\t\t{\r\n\t\t\t\tInitPresets();\r\n\t\t\t}\r\n\r\n\t\t\tGUILayout.BeginVertical();\r\n\t\t\tGUILayout.BeginHorizontal();\r\n\t\t\t{\r\n\t\t\t\tGUILayout.Label(\"Current preset:\");\r\n\t\t\t\tGUILayout.TextField(currentPreset);\r\n\t\t\t}\r\n\t\t\tGUILayout.EndHorizontal();\r\n\t\t\tselQualityPresetInt = GUILayout.SelectionGrid(selQualityPresetInt, qualityPresetsStrings, 1);\r\n\t\t\tGUILayout.Label(\"\");\r\n\t\t\tif (GUILayout.Button(\"Apply preset\"))\r\n\t\t\t{\r\n\t\t\t\tif (qualityPresetsStrings.Count() > 0)\r\n\t\t\t\t{\r\n\t\t\t\t\tUtils.LogInfo(\"Applying quality preset \" + qualityPresetsStrings[selQualityPresetInt]);\r\n\t\t\t\t\tQualityPresetsLoader.LoadPresetIntoMainSettings(Scatterer.Instance.mainSettings, qualityPresetsStrings[selQualityPresetInt]);\r\n\t\t\t\t\tcurrentPreset = qualityPresetsStrings[selQualityPresetInt];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tGUILayout.EndVertical();\r\n\t\t}\r\n\r\n        private void InitPresets()\r\n        {\r\n\t\t\tif (qualityPresetsStrings == null)\r\n\t\t\t{\r\n\t\t\t\tqualityPresetsStrings = QualityPresetsLoader.GetPresetsList();\r\n\t\t\t}\r\n\r\n\t\t\tcurrentPreset = QualityPresetsLoader.FindPresetOfCurrentSettings(Scatterer.Instance.mainSettings);\r\n\r\n            int index = qualityPresetsStrings.IndexOf(currentPreset);\r\n\r\n\t\t\tselQualityPresetInt = index;\r\n        }\r\n\r\n        void DrawIndividualSettings ()\r\n\t\t{\r\n\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\t{\r\n\t\t\t\tif (GUILayout.Button (\"Scattering\")) {\r\n\t\t\t\t\tselectedIndividualSettingsTab = IndividualSettingsTabs.Scattering;\r\n\t\t\t\t}\r\n\t\t\t\tif (GUILayout.Button (\"Ocean\")) {\r\n\t\t\t\t\tselectedIndividualSettingsTab = IndividualSettingsTabs.Ocean;\r\n\t\t\t\t}\r\n\t\t\t\tif (GUILayout.Button (\"Sunflare\")) {\r\n\t\t\t\t\tselectedIndividualSettingsTab = IndividualSettingsTabs.Sunflare;\r\n\t\t\t\t}\r\n\t\t\t\tif (GUILayout.Button (\"Lighting\")) {\r\n\t\t\t\t\tselectedIndividualSettingsTab = IndividualSettingsTabs.Lighting;\r\n\t\t\t\t}\r\n\t\t\t\tif (GUILayout.Button (\"Shadows\")) {\r\n\t\t\t\t\tselectedIndividualSettingsTab = IndividualSettingsTabs.Shadows;\r\n\t\t\t\t}\r\n\t\t\t\tif (GUILayout.Button (\"EVE Clouds\")) {\r\n\t\t\t\t\tselectedIndividualSettingsTab = IndividualSettingsTabs.EVEintegration;\r\n\t\t\t\t}\r\n\t\t\t\tif (GUILayout.Button (\"Misc.\")) {\r\n\t\t\t\t\tselectedIndividualSettingsTab = IndividualSettingsTabs.Misc;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tGUILayout.EndHorizontal ();\r\n\t\t\tif (selectedIndividualSettingsTab == IndividualSettingsTabs.Scattering)\r\n\t\t\t{\r\n\t\t\t\tScatterer.Instance.mainSettings.useLegacyTerrainGodrays = GUILayout.Toggle(Scatterer.Instance.mainSettings.useLegacyTerrainGodrays, \"Legacy terrain godrays (Requires long-distance shadows and shadowMapResolution override, Directx11 only)\");\r\n\r\n\t\t\t\tif (Scatterer.Instance.mainSettings.useLegacyTerrainGodrays)\r\n\t\t\t\t{\r\n\t\t\t\t\t//Godrays tesselation placeholder\r\n\t\t\t\t}\r\n\r\n\t\t\t\t//Scatterer.Instance.mainSettings.quarterResScattering = GUILayout.Toggle (Scatterer.Instance.mainSettings.quarterResScattering, \"Render scattering in 1/4 resolution (speedup, incompatible and disabled with godrays)\");\r\n\t\t\t\t//Scatterer.Instance.mainSettings.mergeDepthPrePass = GUILayout.Toggle (Scatterer.Instance.mainSettings.mergeDepthPrePass, \"Merge depth pre-pass into main depth for culling (experimental, may give small speedup but may cause z-fighting\");\r\n\r\n\t\t\t\tScatterer.Instance.mainSettings.useTemporalAntiAliasing = GUILayout.Toggle(Scatterer.Instance.mainSettings.useTemporalAntiAliasing, \"Temporal Antialiasing (TAA), can combine with SMAA\");\r\n\t\t\t\tif (Scatterer.Instance.mainSettings.useTemporalAntiAliasing)\r\n\t\t\t\t{\r\n\t\t\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tGUILayout.Label (\"Stationary blending\");\r\n\t\t\t\t\t\tScatterer.Instance.mainSettings.taaStationaryBlending = Mathf.Clamp(float.Parse(GUILayout.TextField(Scatterer.Instance.mainSettings.taaStationaryBlending.ToString(\"0.00\"))),0f,0.99f);\r\n\r\n\t\t\t\t\t\tGUILayout.Label(\"   Motion blending\");\r\n\t\t\t\t\t\tScatterer.Instance.mainSettings.taaMotionBlending = Mathf.Clamp(float.Parse(GUILayout.TextField(Scatterer.Instance.mainSettings.taaMotionBlending.ToString(\"0.00\"))),0f,0.99f);\r\n\r\n\t\t\t\t\t\tGUILayout.Label(\"   Sample spread\");\r\n\t\t\t\t\t\tScatterer.Instance.mainSettings.taaJitterSpread = Mathf.Clamp(float.Parse(GUILayout.TextField(Scatterer.Instance.mainSettings.taaJitterSpread.ToString(\"0.00\"))),0.1f,1f);\r\n\r\n\t\t\t\t\t\tGUILayout.Label(\"   Sharpness\");\r\n\t\t\t\t\t\tScatterer.Instance.mainSettings.taaSharpness = Mathf.Clamp(float.Parse(GUILayout.TextField(Scatterer.Instance.mainSettings.taaSharpness.ToString(\"0.00\"))), 0f, 1f);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tGUILayout.EndHorizontal();\r\n\t\t\t\t}\r\n\r\n\t\t\t\tGUILayout.BeginHorizontal();\r\n\t\t\t\tGUILayout.Label(\"Disable TAA below framerate threshold (when SMAA is enabled)\");\r\n\t\t\t\tScatterer.Instance.mainSettings.disableTaaBelowFrameRateThreshold = Convert.ToInt32(GUILayout.TextField(Scatterer.Instance.mainSettings.disableTaaBelowFrameRateThreshold.ToString()));\r\n\t\t\t\tGUILayout.EndHorizontal();\r\n\r\n\t\t\t\tScatterer.Instance.mainSettings.useSubpixelMorphologicalAntialiasing = GUILayout.Toggle(Scatterer.Instance.mainSettings.useSubpixelMorphologicalAntialiasing, \"Subpixel Morphological Antialiasing (SMAA), can combine with TAA\");\r\n\t\t\t\tif (Scatterer.Instance.mainSettings.useSubpixelMorphologicalAntialiasing)\r\n\t\t\t\t{\r\n\t\t\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tGUILayout.Label (\"SMAA quality (1:normal,2:high)\");\r\n\t\t\t\t\t\tScatterer.Instance.mainSettings.smaaQuality = (Int32) Mathf.Clamp( (float)(Convert.ToInt32 (GUILayout.TextField (Scatterer.Instance.mainSettings.smaaQuality.ToString ()))),1f,2f);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tGUILayout.EndHorizontal ();\r\n\t\t\t\t}\r\n\r\n\t\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\t\tGUILayout.Label (\"Tonemapper (0:disabled,1:bruneton,2:uncharted)\");\r\n\t\t\t\tScatterer.Instance.mainSettings.scatteringTonemapper = (Int32) Mathf.Clamp( (float)(Convert.ToInt32 (GUILayout.TextField (Scatterer.Instance.mainSettings.scatteringTonemapper.ToString ()))),0f,2f);\r\n\t\t\t\tGUILayout.EndHorizontal ();\r\n\r\n\t\t\t\t/*\r\n\t\t\t\tif (Scatterer.Instance.mainSettings.scatteringTonemapper == 3)\r\n                {\r\n\t\t\t\t\tGUILayout.BeginHorizontal();\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tGUILayout.Label(\"Toe strength\");\r\n\t\t\t\t\t\tScatterer.Instance.mainSettings.hableToeStrength =float.Parse(GUILayout.TextField(Scatterer.Instance.mainSettings.hableToeStrength.ToString(\"0.00\")));\r\n\r\n\t\t\t\t\t\tGUILayout.Label(\"Toe length\");\r\n\t\t\t\t\t\tScatterer.Instance.mainSettings.hableToeLength = float.Parse(GUILayout.TextField(Scatterer.Instance.mainSettings.hableToeLength.ToString(\"0.00\")));\r\n\r\n\t\t\t\t\t\tGUILayout.Label(\"Shoulder strength\");\r\n\t\t\t\t\t\tScatterer.Instance.mainSettings.hableShoulderStrength = float.Parse(GUILayout.TextField(Scatterer.Instance.mainSettings.hableShoulderStrength.ToString(\"0.00\")));\r\n\r\n\t\t\t\t\t\tGUILayout.Label(\"Shoulder length\");\r\n\t\t\t\t\t\tScatterer.Instance.mainSettings.hableShoulderLength = float.Parse(GUILayout.TextField(Scatterer.Instance.mainSettings.hableShoulderLength.ToString(\"0.00\")));\r\n\r\n\t\t\t\t\t\tGUILayout.Label(\"Shoulder angle\");\r\n\t\t\t\t\t\tScatterer.Instance.mainSettings.hableShoulderAngle = float.Parse(GUILayout.TextField(Scatterer.Instance.mainSettings.hableShoulderAngle.ToString(\"0.00\")));\r\n\r\n\t\t\t\t\t\tGUILayout.Label(\"Gamma\");\r\n\t\t\t\t\t\tScatterer.Instance.mainSettings.hableGamma = float.Parse(GUILayout.TextField(Scatterer.Instance.mainSettings.hableGamma.ToString(\"0.00\")));\r\n\t\t\t\t\t}\r\n\t\t\t\t\tGUILayout.EndHorizontal();\r\n\t\t\t\t}\r\n\t\t\t\t*/\r\n\r\n\t\t\t\tGUILayout.BeginHorizontal();\r\n\t\t\t\tScatterer.Instance.mainSettings.useLowResolutionAtmosphere = GUILayout.Toggle(Scatterer.Instance.mainSettings.useLowResolutionAtmosphere, \"Use low resolution atmosphere (for slower machines that get white atmos)\");\r\n\t\t\t\tGUILayout.EndHorizontal();\r\n\t\t\t}\r\n\t\t\telse if (selectedIndividualSettingsTab == IndividualSettingsTabs.Ocean)\r\n\t\t\t{\r\n\t\t\t\tScatterer.Instance.mainSettings.useOceanShaders = GUILayout.Toggle (Scatterer.Instance.mainSettings.useOceanShaders, \"Ocean shaders\");\r\n\t\t\t\tif (Scatterer.Instance.mainSettings.useOceanShaders)\r\n\t\t\t\t{\r\n\t\t\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tGUILayout.Label (\"\\t\");\r\n\t\t\t\t\t\tGUILayout.BeginVertical ();\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\t\t\t\t\tGUILayout.Label (\"Fourier grid size (64:fast,128:normal,256:HQ)\");\r\n\t\t\t\t\t\t\tScatterer.Instance.mainSettings.m_fourierGridSize = (Int32)(Convert.ToInt32 (GUILayout.TextField (Scatterer.Instance.mainSettings.m_fourierGridSize.ToString ())));\r\n\t\t\t\t\t\t\tGUILayout.EndHorizontal ();\r\n\t\t\t\t\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\t\t\t\t\tGUILayout.Label (\"Mesh resolution (pixels covered by a mesh quad, lower is better but slower)\");\r\n\t\t\t\t\t\t\tScatterer.Instance.mainSettings.oceanMeshResolution = (Int32)(Convert.ToInt32 (GUILayout.TextField (Scatterer.Instance.mainSettings.oceanMeshResolution.ToString ())));\r\n\t\t\t\t\t\t\tGUILayout.EndHorizontal ();\r\n\t\t\t\t\t\t\tScatterer.Instance.mainSettings.oceanTransparencyAndRefractions = GUILayout.Toggle (Scatterer.Instance.mainSettings.oceanTransparencyAndRefractions, \"Transparency and refractions\");\r\n\t\t\t\t\t\t\tScatterer.Instance.mainSettings.oceanFoam = GUILayout.Toggle (Scatterer.Instance.mainSettings.oceanFoam, \"Foam\");\r\n\t\t\t\t\t\t\tScatterer.Instance.mainSettings.oceanSkyReflections = GUILayout.Toggle (Scatterer.Instance.mainSettings.oceanSkyReflections, \"Sky reflections\");\r\n\t\t\t\t\t\t\tScatterer.Instance.mainSettings.shadowsOnOcean = GUILayout.Toggle (Scatterer.Instance.mainSettings.shadowsOnOcean, \"Surface receives shadows\");\r\n\t\t\t\t\t\t\tScatterer.Instance.mainSettings.oceanPixelLights = GUILayout.Toggle (Scatterer.Instance.mainSettings.oceanPixelLights, \"Secondary lights compatibility (huge performance hit when lights on)\");\r\n\t\t\t\t\t\t\tScatterer.Instance.mainSettings.oceanCaustics = GUILayout.Toggle (Scatterer.Instance.mainSettings.oceanCaustics, \"Underwater caustics\");\r\n\t\t\t\t\t\t\tScatterer.Instance.mainSettings.oceanLightRays = GUILayout.Toggle (Scatterer.Instance.mainSettings.oceanLightRays, \"Underwater light rays\");\r\n\t\t\t\t\t\t\tGUI.contentColor = SystemInfo.supportsAsyncGPUReadback && SystemInfo.supportsComputeShaders ? Color.white : Color.gray;\r\n\t\t\t\t\t\t\tScatterer.Instance.mainSettings.oceanCraftWaveInteractions = GUILayout.Toggle (Scatterer.Instance.mainSettings.oceanCraftWaveInteractions, \"Waves interact with ships (Requires asyncGPU readback, Directx11 only)\");\r\n\t\t\t\t\t\t\tif (Scatterer.Instance.mainSettings.oceanCraftWaveInteractions) {\r\n\t\t\t\t\t\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\tGUILayout.Label (\"\\t\");\r\n\t\t\t\t\t\t\t\t\tGUILayout.BeginVertical ();\r\n\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\tScatterer.Instance.mainSettings.oceanCraftWaveInteractionsOverrideWaterCrashTolerance = GUILayout.Toggle (Scatterer.Instance.mainSettings.oceanCraftWaveInteractionsOverrideWaterCrashTolerance, \"Override water crash tolerance\");\r\n\t\t\t\t\t\t\t\t\t\tif (Scatterer.Instance.mainSettings.oceanCraftWaveInteractionsOverrideWaterCrashTolerance) {\r\n\t\t\t\t\t\t\t\t\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\t\t\t\t\t\t\t\t\tGUILayout.Label (\"Crash tolerance (default is 1.2)\");\r\n\t\t\t\t\t\t\t\t\t\t\tScatterer.Instance.mainSettings.buoyancyCrashToleranceMultOverride = float.Parse (GUILayout.TextField (Scatterer.Instance.mainSettings.buoyancyCrashToleranceMultOverride.ToString (\"00.00\")));\r\n\t\t\t\t\t\t\t\t\t\t\tGUILayout.EndHorizontal ();\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\tScatterer.Instance.mainSettings.oceanCraftWaveInteractionsOverrideDrag = GUILayout.Toggle (Scatterer.Instance.mainSettings.oceanCraftWaveInteractionsOverrideDrag, \"Override water drag\");\r\n\t\t\t\t\t\t\t\t\t\tScatterer.Instance.mainSettings.oceanCraftWaveInteractionsOverrideRecoveryVelocity = GUILayout.Toggle (Scatterer.Instance.mainSettings.oceanCraftWaveInteractionsOverrideRecoveryVelocity, \"Override max water recovery velocity\");\r\n\t\t\t\t\t\t\t\t\t\tif (Scatterer.Instance.mainSettings.oceanCraftWaveInteractionsOverrideRecoveryVelocity) {\r\n\t\t\t\t\t\t\t\t\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\t\t\t\t\t\t\t\t\tGUILayout.Label (\"Maximum recovery velocity (default is 0.3)\");\r\n\t\t\t\t\t\t\t\t\t\t\tScatterer.Instance.mainSettings.waterMaxRecoveryVelocity = float.Parse (GUILayout.TextField (Scatterer.Instance.mainSettings.waterMaxRecoveryVelocity.ToString (\"00.00\")));\r\n\t\t\t\t\t\t\t\t\t\t\tGUILayout.EndHorizontal ();\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\tGUILayout.EndVertical ();\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tGUILayout.EndHorizontal ();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tGUILayout.EndVertical ();\r\n\t\t\t\t\t}\r\n\t\t\t\t\tGUILayout.EndHorizontal ();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (selectedIndividualSettingsTab == IndividualSettingsTabs.Lighting)\r\n\t\t\t{\r\n\t\t\t\tScatterer.Instance.mainSettings.useEclipses = GUILayout.Toggle (Scatterer.Instance.mainSettings.useEclipses, \"Eclipses (WIP, sky/orbit only for now)\");\r\n\t\t\t\tScatterer.Instance.mainSettings.useRingShadows = GUILayout.Toggle (Scatterer.Instance.mainSettings.useRingShadows, \"Kopernicus ring shadows (linear only, tiled rings not supported)\");\r\n\t\t\t\tScatterer.Instance.mainSettings.disableAmbientLight = GUILayout.Toggle (Scatterer.Instance.mainSettings.disableAmbientLight, \"Disable scaled space ambient light\");\r\n\t\t\t\tScatterer.Instance.mainSettings.sunlightExtinction = GUILayout.Toggle (Scatterer.Instance.mainSettings.sunlightExtinction, \"Sunlight extinction (direct sun light changes color with sunset/dusk)\");\r\n\t\t\t\tScatterer.Instance.mainSettings.underwaterLightDimming = GUILayout.Toggle (Scatterer.Instance.mainSettings.underwaterLightDimming, \"Dim light underwater\");\r\n\t\t\t}\r\n\t\t\telse if (selectedIndividualSettingsTab == IndividualSettingsTabs.Shadows)\r\n\t\t\t{\r\n\t\t\t\tScatterer.Instance.mainSettings.d3d11ShadowFix = GUILayout.Toggle (Scatterer.Instance.mainSettings.d3d11ShadowFix, \"1.9+ Directx11 flickering shadows fix (recommended for 1.9, 1.10)\");\r\n\t\t\t\tScatterer.Instance.mainSettings.terrainShadows = GUILayout.Toggle (Scatterer.Instance.mainSettings.terrainShadows, \"Long-Distance Terrain shadows\");\r\n\t\t\t\tif (Scatterer.Instance.mainSettings.terrainShadows)\r\n\t\t\t\t{\r\n\t\t\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tGUILayout.Label (\"  \");\r\n\t\t\t\t\t\tGUILayout.BeginVertical ();\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tGUI.contentColor = Scatterer.Instance.unifiedCameraMode ? Color.white : Color.gray;\r\n\t\t\t\t\t\t\tGUILayout.Label ((Scatterer.Instance.unifiedCameraMode ? \"[Active] \" : \"[Inactive] \") + \"Unified camera mode (1.9+ Directx11):\");\r\n\t\t\t\t\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tGUILayout.Label (\"\\t\");\r\n\t\t\t\t\t\t\t\tGUILayout.BeginVertical ();\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\tGUILayout.Label (\"Shadows Distance (in meters):\");\r\n\t\t\t\t\t\t\t\t\t\tScatterer.Instance.mainSettings.unifiedCamShadowsDistance = float.Parse (GUILayout.TextField (Scatterer.Instance.mainSettings.unifiedCamShadowsDistance.ToString (\"0\")));\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\tGUILayout.EndHorizontal ();\r\n\t\t\t\t\t\t\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\tGUILayout.Label (\"Shadowmap resolution (power of 2, zero for no override):\");\r\n\t\t\t\t\t\t\t\t\t\tScatterer.Instance.mainSettings.unifiedCamShadowResolutionOverride = (Int32)(Convert.ToInt32 (GUILayout.TextField (Scatterer.Instance.mainSettings.unifiedCamShadowResolutionOverride.ToString ())));\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\tGUILayout.EndHorizontal ();\r\n\t\t\t\t\t\t\t\t\tGUIvector3NoButton (\"Shadow cascade splits (zeroes for no override):\", ref Scatterer.Instance.mainSettings.unifiedCamShadowCascadeSplitsOverride);\r\n\t\t\t\t\t\t\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\tGUILayout.Label (\"Shadow bias (0 for no override)\");\r\n\t\t\t\t\t\t\t\t\t\tScatterer.Instance.mainSettings.unifiedCamShadowBiasOverride = float.Parse (GUILayout.TextField (Scatterer.Instance.mainSettings.unifiedCamShadowBiasOverride.ToString (\"0.000\")));\r\n\t\t\t\t\t\t\t\t\t\tGUILayout.Label (\"Normal bias (0 for no override)\");\r\n\t\t\t\t\t\t\t\t\t\tScatterer.Instance.mainSettings.unifiedCamShadowNormalBiasOverride = float.Parse (GUILayout.TextField (Scatterer.Instance.mainSettings.unifiedCamShadowNormalBiasOverride.ToString (\"0.000\")));\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\tGUILayout.EndHorizontal ();\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tGUILayout.EndVertical ();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tGUILayout.EndHorizontal ();\r\n\t\t\t\t\t\t\tGUI.contentColor = !Scatterer.Instance.unifiedCameraMode ? Color.white : Color.gray;\r\n\t\t\t\t\t\t\tGUILayout.Label ((!Scatterer.Instance.unifiedCameraMode ? \"[Active] \" : \"[Inactive] \") + \"Dual camera mode (1.8, 1.9 and 1.10 Opengl):\");\r\n\t\t\t\t\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tGUILayout.Label (\"\\t\");\r\n\t\t\t\t\t\t\t\tGUILayout.BeginVertical ();\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\tGUILayout.Label (\"Shadows Distance (in meters):\");\r\n\t\t\t\t\t\t\t\t\t\tScatterer.Instance.mainSettings.dualCamShadowsDistance = float.Parse (GUILayout.TextField (Scatterer.Instance.mainSettings.dualCamShadowsDistance.ToString (\"0\")));\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\tGUILayout.EndHorizontal ();\r\n\t\t\t\t\t\t\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\tGUILayout.Label (\"Shadowmap resolution (power of 2, zero for no override):\");\r\n\t\t\t\t\t\t\t\t\t\tScatterer.Instance.mainSettings.dualCamShadowResolutionOverride = (Int32)(Convert.ToInt32 (GUILayout.TextField (Scatterer.Instance.mainSettings.dualCamShadowResolutionOverride.ToString ())));\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\tGUILayout.EndHorizontal ();\r\n\t\t\t\t\t\t\t\t\tGUIvector3NoButton (\"Shadow cascade splits (zeroes for no override):\", ref Scatterer.Instance.mainSettings.dualCamShadowCascadeSplitsOverride);\r\n\t\t\t\t\t\t\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\tGUILayout.Label (\"Shadow bias (0 for no override)\");\r\n\t\t\t\t\t\t\t\t\t\tScatterer.Instance.mainSettings.dualCamShadowBiasOverride = float.Parse (GUILayout.TextField (Scatterer.Instance.mainSettings.dualCamShadowBiasOverride.ToString (\"0.000\")));\r\n\t\t\t\t\t\t\t\t\t\tGUILayout.Label (\"Normal bias (0 for no override)\");\r\n\t\t\t\t\t\t\t\t\t\tScatterer.Instance.mainSettings.dualCamShadowNormalBiasOverride = float.Parse (GUILayout.TextField (Scatterer.Instance.mainSettings.dualCamShadowNormalBiasOverride.ToString (\"0.000\")));\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\tGUILayout.EndHorizontal ();\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tGUILayout.EndVertical ();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tGUILayout.EndHorizontal ();\r\n\t\t\t\t\t\t\tGUILayout.EndVertical ();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tGUILayout.EndHorizontal ();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (selectedIndividualSettingsTab == IndividualSettingsTabs.Sunflare)\r\n\t\t\t{\r\n\t\t\t\tScatterer.Instance.mainSettings.fullLensFlareReplacement = GUILayout.Toggle (Scatterer.Instance.mainSettings.fullLensFlareReplacement, \"Lens flare shader\");\r\n\t\t\t}\r\n\t\t\telse if (selectedIndividualSettingsTab == IndividualSettingsTabs.EVEintegration)\r\n\t\t\t{\r\n\t\t\t\tScatterer.Instance.mainSettings.integrateWithEVEClouds = GUILayout.Toggle (Scatterer.Instance.mainSettings.integrateWithEVEClouds, \"Integrate effects with EVE clouds (may require restart)\");\r\n\t\t\t\t//\t\t\t\tif (Scatterer.Instance.mainSettings.integrateWithEVEClouds)\r\n\t\t\t\t//\t\t\t\t{\r\n\t\t\t\t//\t\t\t\t\tScatterer.Instance.mainSettings.integrateEVECloudsGodrays = GUILayout.Toggle (Scatterer.Instance.mainSettings.integrateEVECloudsGodrays, \"EVE clouds cast godrays (require godrays)\");\r\n\t\t\t\t//\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (selectedIndividualSettingsTab == IndividualSettingsTabs.Misc)\r\n\t\t\t{\r\n\t\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\t\t{\r\n\t\t\t\t\tScatterer.Instance.mainSettings.overrideNearClipPlane = GUILayout.Toggle (Scatterer.Instance.mainSettings.overrideNearClipPlane, \"Override Near ClipPlane (not recommended - restart on disable)\");\r\n\t\t\t\t\tScatterer.Instance.mainSettings.nearClipPlane = float.Parse (GUILayout.TextField (Scatterer.Instance.mainSettings.nearClipPlane.ToString (\"0.000\")));\r\n\t\t\t\t}\r\n\t\t\t\tGUILayout.EndHorizontal ();\r\n\t\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\t\t{\r\n\t\t\t\t\tScatterer.Instance.mainSettings.useDithering = GUILayout.Toggle (Scatterer.Instance.mainSettings.useDithering, \"Use dithering (Reduces color banding in sky and scattering, disable if you notice dithering patterns\");\r\n\t\t\t\t}\r\n\t\t\t\tGUILayout.EndHorizontal ();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void GUIvector3NoButton (string label, ref Vector3 target)\r\n\t\t{\r\n\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\tGUILayout.Label (label);\r\n\t\t\t\r\n\t\t\ttarget.x = float.Parse (GUILayout.TextField (target.x.ToString (\"0.0000\")));\r\n\t\t\ttarget.y = float.Parse (GUILayout.TextField (target.y.ToString (\"0.0000\")));\r\n\t\t\ttarget.z = float.Parse (GUILayout.TextField (target.z.ToString (\"0.0000\")));\r\n\t\t\t\r\n\t\t\tGUILayout.EndHorizontal ();\r\n\t\t}\r\n\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/GUI/ModularGUI/AbstractGUIModule.cs",
    "content": "//Generic GUIModule, to be overriden by concrete classes that provide their own implementation of RenderGUI\n\nusing System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.IO;\nusing System.Reflection;\nusing System.Runtime;\nusing UnityEngine;\n\nnamespace Scatterer\n{\n\tpublic abstract class AbstractGUIModule\n\t{\n\t\tstatic protected BindingFlags Flags =  BindingFlags.FlattenHierarchy |  BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static;\n\t\t\n\t\tpublic AbstractGUIModule ()\n\t\t{\n\t\t}\n\t\t\n\t\tpublic abstract void RenderGUI ();\n\t}\n}"
  },
  {
    "path": "scatterer/GUI/ModularGUI/GUIModuleBool.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.IO;\nusing System.Reflection;\nusing System.Runtime;\nusing UnityEngine;\n\nnamespace Scatterer\n{\n\tpublic class GUIModuleBool  : AbstractGUIModule\n\t{\n\t\tbool localVariable = false;\n\t\tstring label = \"\";\n\n\t\tobject targetObject;\n\t\tFieldInfo targetField;\n\n\t\tpublic GUIModuleBool (string label, object targetObject, string fieldName)\n\t\t{\n\t\t\tthis.label = label;\n\t\t\tthis.targetObject = targetObject;\n\n\t\t\tType targetType = targetObject.GetType ();\n\n\t\t\tthis.targetField = targetType.GetField(fieldName, Flags);\n\t\t\tthis.localVariable = (bool) targetField.GetValue(targetObject);\n\t\t}\n\n\t\tpublic override void RenderGUI()\n\t\t{\n\n\t\t\tGUILayout.BeginHorizontal ();\n\n\t\t\tGUILayout.Label (label);\n\t\t\tGUILayout.TextField (targetField.GetValue(targetObject).ToString ());\n\t\t\tif (GUILayout.Button (\"Toggle\"))\n\t\t\t{\n\t\t\t\ttargetField.SetValue(targetObject, !(bool)targetField.GetValue(targetObject));\n\t\t\t}\n\t\t\tGUILayout.EndHorizontal ();\n\t\t}\n\t}\n}"
  },
  {
    "path": "scatterer/GUI/ModularGUI/GUIModuleFloat.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.IO;\nusing System.Reflection;\nusing System.Runtime;\nusing UnityEngine;\n\nnamespace Scatterer\n{\n\tpublic class GUIModuleFloat  : AbstractGUIModule\n\t{\n\t\tfloat localVariable = 0f;\n\t\tstring label = \"\";\n\n\t\tobject targetObject;\n\t\tFieldInfo targetField;\n\n\t\tpublic GUIModuleFloat (string label, object targetObject, string fieldName)\n\t\t{\n\t\t\tthis.label = label;\n\t\t\tthis.targetObject = targetObject;\n\n\t\t\tType targetType = targetObject.GetType ();\n\n\t\t\tthis.targetField = targetType.GetField(fieldName, Flags);\n\t\t\tthis.localVariable = (float) targetField.GetValue(targetObject);\n\t\t}\n\n\t\tpublic override void RenderGUI()\n\t\t{\n\n\t\t\tGUILayout.BeginHorizontal ();\n\n\t\t\tGUILayout.Label (label);\n\t\t\tlocalVariable = float.Parse (GUILayout.TextField (localVariable.ToString ()));\n\t\t\tif (GUILayout.Button (\"Set\"))\n\t\t\t{\n\t\t\t\ttargetField.SetValue(targetObject, localVariable);\n\t\t\t}\n\t\t\tGUILayout.EndHorizontal ();\n\t\t}\n\t}\n}"
  },
  {
    "path": "scatterer/GUI/ModularGUI/GUIModuleInt.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.IO;\nusing System.Reflection;\nusing System.Runtime;\nusing UnityEngine;\n\nnamespace Scatterer\n{\n\tpublic class GUIModuleInt  : AbstractGUIModule\n\t{\n\t\tint localVariable = 0;\n\t\tstring label = \"\";\n\n\t\tobject targetObject;\n\t\tFieldInfo targetField;\n\n\t\tpublic GUIModuleInt (string label, object targetObject, string fieldName)\n\t\t{\n\t\t\tthis.label = label;\n\t\t\tthis.targetObject = targetObject;\n\n\t\t\tType targetType = targetObject.GetType ();\n\n\t\t\tthis.targetField = targetType.GetField(fieldName, Flags);\n\t\t\tthis.localVariable = (int) targetField.GetValue(targetObject);\n\t\t}\n\n\t\tpublic override void RenderGUI()\n\t\t{\n\n\t\t\tGUILayout.BeginHorizontal ();\n\n\t\t\tGUILayout.Label (label);\n\t\t\tlocalVariable = (Int32)(Convert.ToInt32 (GUILayout.TextField (localVariable.ToString ())));\n\t\t\tif (GUILayout.Button (\"Set\"))\n\t\t\t{\n\t\t\t\ttargetField.SetValue(targetObject, localVariable);\n\t\t\t}\n\t\t\tGUILayout.EndHorizontal ();\n\t\t}\n\t}\n}"
  },
  {
    "path": "scatterer/GUI/ModularGUI/GUIModuleLabel.cs",
    "content": "using System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.IO;\r\nusing System.Reflection;\r\nusing System.Runtime;\r\nusing UnityEngine;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class GUIModuleLabel : AbstractGUIModule\r\n\t{\r\n\t\tstring label = \"\";\r\n\t\t\r\n\t\tpublic GUIModuleLabel (string label)\r\n\t\t{\r\n\t\t\tthis.label = label;\r\n\t\t}\r\n\t\t\r\n\t\tpublic override void RenderGUI()\r\n\t\t{\r\n\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\tGUILayout.Label (label);\r\n\t\t\tGUILayout.EndHorizontal ();\r\n\t\t}\r\n\t}\r\n}"
  },
  {
    "path": "scatterer/GUI/ModularGUI/GUIModuleString.cs",
    "content": "using System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.IO;\r\nusing System.Reflection;\r\nusing System.Runtime;\r\nusing UnityEngine;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class GUIModuleString  : AbstractGUIModule\r\n\t{\r\n\t\tstring localVariable = \"\";\r\n\t\tstring label = \"\";\r\n\t\t\r\n\t\tobject targetObject;\r\n\t\tFieldInfo targetField;\r\n\t\t\r\n\t\tpublic GUIModuleString (string label, object targetObject, string fieldName)\r\n\t\t{\r\n\t\t\tthis.label = label;\r\n\t\t\tthis.targetObject = targetObject;\r\n\t\t\t\r\n\t\t\tType targetType = targetObject.GetType ();\r\n\t\t\t\r\n\t\t\tthis.targetField = targetType.GetField(fieldName, Flags);\r\n\t\t\tthis.localVariable = (string) targetField.GetValue(targetObject);\r\n\t\t}\r\n\t\t\r\n\t\tpublic override void RenderGUI()\r\n\t\t{\r\n\t\t\t\r\n\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\t\r\n\t\t\tGUILayout.Label (label);\r\n\t\t\tlocalVariable = GUILayout.TextField (localVariable);\r\n\t\t\tif (GUILayout.Button (\"Set\"))\r\n\t\t\t{\r\n\t\t\t\ttargetField.SetValue(targetObject, localVariable);\r\n\t\t\t}\r\n\t\t\tGUILayout.EndHorizontal ();\r\n\t\t}\r\n\t}\r\n}"
  },
  {
    "path": "scatterer/GUI/ModularGUI/GUIModuleVector2.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.IO;\nusing System.Reflection;\nusing System.Runtime;\nusing UnityEngine;\n\nnamespace Scatterer\n{\n\tpublic class GUIModuleVector2  : AbstractGUIModule\n\t{\n\t\tVector2 localVariable = new Vector2(0f,0f);\n\t\tstring label = \"\";\n\n\t\tobject targetObject;\n\t\tFieldInfo targetField;\n\n\t\tpublic GUIModuleVector2 (string label, object targetObject, string fieldName)\n\t\t{\n\t\t\tthis.label = label;\n\t\t\tthis.targetObject = targetObject;\n\n\t\t\tType targetType = targetObject.GetType ();\n\n\t\t\tthis.targetField = targetType.GetField(fieldName, Flags);\n\t\t\tthis.localVariable = (Vector2) targetField.GetValue(targetObject);\n\t\t}\n\n\t\tpublic override void RenderGUI()\n\t\t{\n\n\t\t\tGUILayout.BeginHorizontal ();\n\n\t\t\tGUILayout.Label (label);\n\n\t\t\tlocalVariable.x = float.Parse (GUILayout.TextField (localVariable.x.ToString ()));\n\t\t\tlocalVariable.y = float.Parse (GUILayout.TextField (localVariable.y.ToString ()));\n\n\t\t\tif (GUILayout.Button (\"Set\"))\n\t\t\t{\n\t\t\t\ttargetField.SetValue(targetObject, localVariable);\n\t\t\t}\n\t\t\tGUILayout.EndHorizontal ();\n\t\t}\n\t}\n}"
  },
  {
    "path": "scatterer/GUI/ModularGUI/GUIModuleVector3.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.IO;\nusing System.Reflection;\nusing System.Runtime;\nusing UnityEngine;\n\nnamespace Scatterer\n{\n\tpublic class GUIModuleVector3  : AbstractGUIModule\n\t{\n\t\tVector3 localVariable = new Vector3(0f,0f,0f);\n\t\tstring label = \"\";\n\n\t\tobject targetObject;\n\t\tFieldInfo targetField;\n\n\t\tpublic GUIModuleVector3 (string label, object targetObject, string fieldName)\n\t\t{\n\t\t\tthis.label = label;\n\t\t\tthis.targetObject = targetObject;\n\n\t\t\tType targetType = targetObject.GetType ();\n\n\t\t\tthis.targetField = targetType.GetField(fieldName, Flags);\n\t\t\tthis.localVariable = (Vector3) targetField.GetValue(targetObject);\n\t\t}\n\n\t\tpublic override void RenderGUI()\n\t\t{\n\n\t\t\tGUILayout.BeginHorizontal ();\n\n\t\t\tGUILayout.Label (label);\n\n\t\t\tlocalVariable.x = float.Parse (GUILayout.TextField (localVariable.x.ToString ()));\n\t\t\tlocalVariable.y = float.Parse (GUILayout.TextField (localVariable.y.ToString ()));\n\t\t\tlocalVariable.z = float.Parse (GUILayout.TextField (localVariable.z.ToString ()));\n\n\t\t\tif (GUILayout.Button (\"Set\"))\n\t\t\t{\n\t\t\t\ttargetField.SetValue(targetObject, localVariable);\n\t\t\t}\n\t\t\tGUILayout.EndHorizontal ();\n\t\t}\n\t}\n}"
  },
  {
    "path": "scatterer/GUI/ModularGUI/GUIModuleVector4.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.IO;\nusing System.Reflection;\nusing System.Runtime;\nusing UnityEngine;\n\nnamespace Scatterer\n{\n\tpublic class GUIModuleVector4  : AbstractGUIModule\n\t{\n\t\tVector4 localVariable = new Vector4(0f,0f,0f,0f);\n\t\tstring label = \"\";\n\n\t\tobject targetObject;\n\t\tFieldInfo targetField;\n\n\t\tpublic GUIModuleVector4 (string label, object targetObject, string fieldName)\n\t\t{\n\t\t\tthis.label = label;\n\t\t\tthis.targetObject = targetObject;\n\n\t\t\tType targetType = targetObject.GetType ();\n\n\t\t\tthis.targetField = targetType.GetField(fieldName, Flags);\n\t\t\tthis.localVariable = (Vector4) targetField.GetValue(targetObject);\n\t\t}\n\n\t\tpublic override void RenderGUI()\n\t\t{\n\n\t\t\tGUILayout.BeginHorizontal ();\n\n\t\t\tGUILayout.Label (label);\n\n\t\t\tlocalVariable.x = float.Parse (GUILayout.TextField (localVariable.x.ToString ()));\n\t\t\tlocalVariable.y = float.Parse (GUILayout.TextField (localVariable.y.ToString ()));\n\t\t\tlocalVariable.z = float.Parse (GUILayout.TextField (localVariable.z.ToString ()));\n\t\t\tlocalVariable.w = float.Parse (GUILayout.TextField (localVariable.w.ToString ()));\n\n\t\t\tif (GUILayout.Button (\"Set\"))\n\t\t\t{\n\t\t\t\ttargetField.SetValue(targetObject, localVariable);\n\t\t\t}\n\t\t\tGUILayout.EndHorizontal ();\n\t\t}\n\t}\n}"
  },
  {
    "path": "scatterer/GUI/ModularGUI/ModularGUI.cs",
    "content": "﻿//A modular gui class to simplify writing a GUI\n//Define the gui once and have render everything\n//Submodules can be used to access and modify private fields of the main types, and hold their own local variables so I don't have to juggle them\n\nusing System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.IO;\nusing System.Reflection;\nusing System.Runtime;\nusing UnityEngine;\n\nnamespace Scatterer\n{\n\tpublic class ModularGUI\n\t{\n\n\t\tList<AbstractGUIModule> Modules = new List<AbstractGUIModule>();\n\n\t\tpublic ModularGUI ()\n\t\t{\n\n\t\t}\n\n\t\tpublic void RenderGUI()\n\t\t{\n\t\t\tforeach (AbstractGUIModule module in Modules)\n\t\t\t{\n\t\t\t\tmodule.RenderGUI();\n\t\t\t}\n\t\t}\n\n\t\tpublic void AddModule(AbstractGUIModule module)\n\t\t{\n\t\t\tthis.Modules.Add (module);\n\t\t}\n\n\t\tpublic void ClearModules()\n\t\t{\n\t\t\tModules.Clear ();\n\t\t}\n\t}\n}\n\n"
  },
  {
    "path": "scatterer/GUI/OceanGUI.cs",
    "content": "using System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.IO;\r\nusing System.Reflection;\r\nusing System.Runtime;\r\nusing KSP;\r\nusing KSP.IO;\r\nusing UnityEngine;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class OceanGUI\r\n\t{\r\n\t\tModularGUI oceanModularGUI = new ModularGUI();\r\n\t\tprivate Vector2 _scroll;\r\n\r\n\t\tpublic OceanGUI ()\r\n\t\t{\r\n\t\t}\r\n\r\n\t\tpublic void buildOceanGUI(int selectedPlanet)\r\n\t\t{\r\n\t\t\tOceanFFTgpu oceanNode = Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.GetOceanNode ();\r\n\t\t\t\r\n\t\t\toceanModularGUI.ClearModules ();\r\n\r\n\t\t\toceanModularGUI.AddModule(new GUIModuleLabel(\"To apply press \\\"rebuild ocean\\\" and wait\"));\r\n\t\t\toceanModularGUI.AddModule(new GUIModuleLabel(\"Keep in mind this saves your current settings\"));\r\n\r\n\t\t\toceanModularGUI.AddModule(new GUIModuleLabel(\"\"));\r\n\t\t\toceanModularGUI.AddModule(new GUIModuleLabel(\"Waves physical model settings\"));\r\n\t\t\toceanModularGUI.AddModule(new GUIModuleFloat(\"Wave amplitude (AMP)\", oceanNode, \"AMP\"));\r\n\t\t\toceanModularGUI.AddModule(new GUIModuleFloat(\"Wind Speed (m/s)\", oceanNode, \"m_windSpeed\"));\r\n\t\t\toceanModularGUI.AddModule(new GUIModuleFloat(\"Omega (inverse wave age)\", oceanNode, \"m_omega\"));\r\n\t\t\toceanModularGUI.AddModule(new GUIModuleFloat(\"Gravity (m/s², set to 0 for auto)\", oceanNode, \"m_gravity\"));\r\n\t\t\toceanModularGUI.AddModule(new GUIModuleFloat(\"Off screen vertex coverage (Increase with big waves)\", oceanNode, \"offScreenVertexStretch\"));\r\n\r\n\t\t\toceanModularGUI.AddModule(new GUIModuleLabel(\"\"));\r\n\t\t\toceanModularGUI.AddModule (new GUIModuleLabel (\"Surface shading settings\"));\r\n\t\t\toceanModularGUI.AddModule(new GUIModuleVector3(\"Ocean Upwelling Color\", oceanNode, \"m_oceanUpwellingColor\"));\r\n\t\t\toceanModularGUI.AddModule(new GUIModuleFloat(\"Transparency Depth\", oceanNode, \"transparencyDepth\"));\r\n\t\t\toceanModularGUI.AddModule(new GUIModuleFloat(\"Foam strength (m_whiteCapStr)\", oceanNode, \"m_whiteCapStr\"));\r\n\t\t\toceanModularGUI.AddModule(new GUIModuleFloat(\"Shore/shallow foam strength\", oceanNode, \"shoreFoam\"));\r\n\t\t\toceanModularGUI.AddModule(new GUIModuleFloat(\"Far foam strength (m_farWhiteCapStr)\", oceanNode, \"m_farWhiteCapStr\"));\r\n\t\t\toceanModularGUI.AddModule(new GUIModuleFloat(\"Far foam strength radius (alphaRadius)\", oceanNode, \"alphaRadius\"));\r\n\t\t\toceanModularGUI.AddModule(new GUIModuleFloat(\"Sky reflection strength\", oceanNode, \"skyReflectionStrength\"));\r\n\r\n\t\t\toceanModularGUI.AddModule(new GUIModuleLabel(\"\"));\r\n\t\t\toceanModularGUI.AddModule (new GUIModuleLabel (\"Underwater shading Settings\"));\r\n\t\t\toceanModularGUI.AddModule(new GUIModuleFloat(\"Refraction Index\", oceanNode, \"refractionIndex\"));\r\n\t\t\toceanModularGUI.AddModule(new GUIModuleFloat(\"Darkness Depth\", oceanNode, \"darknessDepth\"));\r\n\t\t\toceanModularGUI.AddModule(new GUIModuleVector3(\"Ocean Underwater Color\", oceanNode, \"m_UnderwaterColor\"));\r\n\t\t\t\r\n\t\t\tif (Scatterer.Instance.mainSettings.oceanCaustics || Scatterer.Instance.mainSettings.oceanLightRays)\r\n\t\t\t{\r\n\t\t\t\toceanModularGUI.AddModule(new GUIModuleLabel(\"\"));\r\n\t\t\t\toceanModularGUI.AddModule(new GUIModuleLabel(\"Caustics/lightrays Settings\"));\r\n\t\t\t\toceanModularGUI.AddModule (new GUIModuleString (\"Caustics texture path\", oceanNode, \"causticsTexturePath\"));\r\n\t\t\t\toceanModularGUI.AddModule (new GUIModuleVector2 (\"Caustics layer 1 scale\", oceanNode, \"causticsLayer1Scale\"));\r\n\t\t\t\toceanModularGUI.AddModule (new GUIModuleVector2 (\"caustics layer 1 speed\", oceanNode, \"causticsLayer1Speed\"));\r\n\t\t\t\toceanModularGUI.AddModule (new GUIModuleVector2 (\"Caustics Layer 2 scale\", oceanNode, \"causticsLayer2Scale\"));\r\n\t\t\t\toceanModularGUI.AddModule (new GUIModuleVector2 (\"caustics Layer 2 speed\", oceanNode, \"causticsLayer2Speed\"));\r\n\t\t\t\toceanModularGUI.AddModule (new GUIModuleFloat (\"Caustics texture multiply\", oceanNode, \"causticsMultiply\"));\r\n\t\t\t\toceanModularGUI.AddModule (new GUIModuleFloat (\"Caustics underwater light boost\", oceanNode, \"causticsUnderwaterLightBoost\"));\r\n\t\t\t\toceanModularGUI.AddModule (new GUIModuleFloat (\"Caustics minimum brightness (of dark areas in the caustics texture)\", oceanNode, \"causticsMinBrightness\"));\r\n\t\t\t\toceanModularGUI.AddModule (new GUIModuleFloat (\"Caustics blur depth\", oceanNode, \"causticsBlurDepth\"));\r\n\t\t\t\toceanModularGUI.AddModule (new GUIModuleFloat (\"Light rays strength\", oceanNode, \"lightRaysStrength\"));\r\n\t\t\t}\r\n\r\n\t\t\toceanModularGUI.AddModule(new GUIModuleLabel(\"\"));\r\n\t\t\toceanModularGUI.AddModule (new GUIModuleLabel (\"Performance settings\"));\r\n\t\t\toceanModularGUI.AddModule (new GUIModuleLabel (\"Current fourierGridSize (change from KSC menu): \" + Scatterer.Instance.mainSettings.m_fourierGridSize.ToString ()));\r\n\t\t\toceanModularGUI.AddModule (new GUIModuleLabel (\"Current mesh resolution (change from KSC menu): \" + Scatterer.Instance.mainSettings.oceanMeshResolution.ToString ()));\r\n\t\t}\r\n\t\t\r\n\t\tpublic void drawOceanGUI (int selectedPlanet)\r\n\t\t{\r\n\t\t\tOceanFFTgpu oceanNode = Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.GetOceanNode ();\r\n\t\t\t//GUItoggle(\"Toggle ocean\", ref stockOcean);\r\n\t\t\t_scroll = GUILayout.BeginScrollView (_scroll, false, true, GUILayout.Width (400), GUILayout.Height (Scatterer.Instance.pluginData.scrollSectionHeight + 100));\r\n\t\t\t{\r\n\t\t\t\toceanModularGUI.RenderGUI();\r\n\t\t\t}\r\n\t\t\tGUILayout.EndScrollView ();\r\n\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\tif (GUILayout.Button (\"Apply settings/Rebuild ocean\")) {\r\n\t\t\t\tScatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.GetOceanNode ().saveToConfigNode ();\r\n\t\t\t\tScatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.reBuildOcean ();\r\n\t\t\t\tbuildOceanGUI(selectedPlanet);\r\n\t\t\t}\r\n\t\t\tGUILayout.EndHorizontal ();\r\n\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\t\r\n\t\t\tif (!Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.skyNode.isConfigModuleManagerPatch)\r\n\t\t\t{\r\n\t\t\t\tif (GUILayout.Button (\"Save ocean\"))\r\n\t\t\t\t{\r\n\t\t\t\t\tScatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.GetOceanNode ().saveToConfigNode ();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif (GUILayout.Button (\"Load ocean\")) {\r\n\t\t\t\tScatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.GetOceanNode ().loadFromConfigNode ();\r\n\t\t\t\tbuildOceanGUI (selectedPlanet);\r\n\t\t\t}\r\n\t\t\tGUILayout.EndHorizontal ();\r\n\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\tGUILayout.Label (\".cfg file used:\");\r\n\t\t\tGUILayout.TextField (Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies [selectedPlanet].prolandManager.GetOceanNode ().configUrl.parent.url);\r\n\t\t\tGUILayout.EndHorizontal ();\r\n\t\t}\r\n\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/GUI/SunflareGUI.cs",
    "content": "using System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.IO;\r\nusing System.Reflection;\r\nusing System.Runtime;\r\nusing KSP;\r\nusing KSP.IO;\r\nusing UnityEngine;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class SunflareGUI\r\n\t{\r\n\t\tString[] sunflareStrings;\r\n\t\t\r\n\t\tint selSunflareGridInt = 0;\r\n\t\tprivate Vector2 sunflareListScrollPosition = new Vector2();\r\n\t\tbool editingSunflare = false;\r\n\t\tstring sunflareText = \"\";\r\n\t\tprivate Vector2 sunflareEditScrollPosition = new Vector2();\r\n\r\n\t\tpublic SunflareGUI ()\r\n\t\t{\r\n\t\t}\r\n\r\n\t\tpublic void InitSunflareGUI()\r\n\t\t{\r\n\t\t\tsunflareStrings = new string[Scatterer.Instance.sunflareManager.scattererSunFlares.Count];\r\n\t\t\t\r\n\t\t\tfor (int i=0; i<Scatterer.Instance.sunflareManager.scattererSunFlares.Count; i++)\r\n\t\t\t{\r\n\t\t\t\tsunflareStrings[i] = Scatterer.Instance.sunflareManager.scattererSunFlares.ElementAt(i).Value.sourceName;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void DrawSunflareGUI()\r\n\t\t{\r\n\t\t\tGUILayout.BeginVertical ();\r\n\t\t\tsunflareListScrollPosition = GUILayout.BeginScrollView(sunflareListScrollPosition, false, true, GUILayout.MinHeight(100));\r\n\t\t\tselSunflareGridInt = GUILayout.SelectionGrid (selSunflareGridInt, sunflareStrings, 1);\r\n\t\t\tGUILayout.EndScrollView();\r\n\t\t\tif (GUILayout.Button (\"Edit Selected\"))\r\n\t\t\t{\r\n\t\t\t\tsunflareText = string.Copy(Scatterer.Instance.sunflareManager.scattererSunFlares.ElementAt(selSunflareGridInt).Value.configNodeToLoad.ToString());\r\n\t\t\t\teditingSunflare = true;\r\n\t\t\t}\r\n\t\t\tGUILayout.EndVertical ();\r\n\t\t\t\r\n\t\t\tif (editingSunflare)\r\n\t\t\t{\r\n\t\t\t\tsunflareEditScrollPosition = GUILayout.BeginScrollView(sunflareEditScrollPosition, false, true, GUILayout.Width(600) ,GUILayout.MinHeight(Scatterer.Instance.pluginData.scrollSectionHeight + 100));\r\n\t\t\t\tsunflareText = GUILayout.TextArea(sunflareText, GUILayout.ExpandWidth(true), GUILayout.ExpandHeight(true));\r\n\t\t\t\tGUILayout.EndScrollView();\r\n\t\t\t\t\r\n\t\t\t\tGUILayout.BeginHorizontal ();\r\n\t\t\t\t\r\n\t\t\t\tif (GUILayout.Button(\"Reimport\"))\r\n\t\t\t\t{\r\n\t\t\t\t\tsunflareText = string.Copy(Scatterer.Instance.sunflareManager.scattererSunFlares.ElementAt(selSunflareGridInt).Value.configNodeToLoad.ToString());\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tif (GUILayout.Button(\"Apply\"))\r\n\t\t\t\t{\r\n\t\t\t\t\tConfigNode node = ConfigNode.Parse(sunflareText);\r\n\t\t\t\t\tUtils.LogInfo(\"Applying sunflare config from UI:\\r\\n\"+sunflareText);\r\n\t\t\t\t\tScatterer.Instance.sunflareManager.scattererSunFlares.ElementAt(selSunflareGridInt).Value.ApplyFromUI(node.GetNode(\"Sun\"));\r\n\t\t\t\t\t\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tif (GUILayout.Button(\"Copy to clipboard\"))\r\n\t\t\t\t{\r\n\t\t\t\t\tGUIUtility.systemCopyBuffer = sunflareText;\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tif (GUILayout.Button (\"Print to Log\"))\r\n\t\t\t\t{\r\n\t\t\t\t\tUtils.LogInfo(\"Sunflare config print to log:\\r\\n\"+sunflareText);\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tGUILayout.EndHorizontal ();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/GUI/ToolbarButton.cs",
    "content": "using System;\r\nusing System.Collections;\r\nusing UnityEngine;\r\nusing KSP.UI.Screens;\r\n\r\nnamespace Scatterer\r\n{\r\n\t[KSPAddon(KSPAddon.Startup.EveryScene, false)]\r\n\tpublic class ToolbarButton : MonoBehaviour\r\n\t{\r\n\t\tbool hasAddedButton = false;\t\t\r\n\t\t\r\n\t\tRect toolbarRect;\r\n\t\tfloat toolbarWidth = 280;\r\n\t\tfloat toolbarHeight = 0;\r\n\t\tfloat toolbarMargin = 6;\r\n\t\tfloat contentWidth;\r\n\t\tVector2 toolbarPosition;\r\n\t\tpublic ApplicationLauncherButton button;\r\n\r\n\t\tprivate static ToolbarButton instance;\r\n\r\n\t\tprivate void Awake()\r\n\t\t{\r\n\t\t\tif (instance == null)\r\n\t\t\t{\r\n\t\t\t\tinstance = this;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tUnityEngine.Object.Destroy (this);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic static ToolbarButton Instance\r\n\t\t{\r\n\t\t\tget \r\n\t\t\t{\r\n\t\t\t\treturn instance;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid Start()\r\n\t\t{\r\n\t\t\ttoolbarPosition = new Vector2(Screen.width - toolbarWidth - 80, 39);\r\n\t\t\ttoolbarRect = new Rect(toolbarPosition.x, toolbarPosition.y, toolbarWidth, toolbarHeight);\r\n\t\t\tcontentWidth = toolbarWidth - (2 * toolbarMargin);\r\n\t\t\t\r\n\t\t\tAddToolbarButton();\r\n\t\t}\r\n\r\n\t\tvoid AddToolbarButton()\r\n\t\t{\r\n\t\t\tif(HighLogic.LoadedScene == GameScenes.SPACECENTER)\r\n\t\t\t{\r\n\t\t\t\tif(!hasAddedButton)\r\n\t\t\t\t{\r\n\t\t\t\t\tTexture buttonTexture = GameDatabase.Instance.GetTexture(\"Scatterer/icon/icon\", false);\r\n\t\t\t\t\tbutton = ApplicationLauncher.Instance.AddModApplication(ShowToolbarGUI, HideToolbarGUI, Dummy, Dummy, Dummy, Dummy, ApplicationLauncher.AppScenes.ALWAYS, buttonTexture);\r\n\t\t\t\t\thasAddedButton = true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tpublic void ShowToolbarGUI()\r\n\t\t{\r\n\t\t\tScatterer.Instance.guiHandler.visible = true;\r\n\t\t}\r\n\t\t\r\n\t\tpublic void HideToolbarGUI()\r\n\t\t{\r\n\t\t\tScatterer.Instance.guiHandler.visible = false;\r\n\t\t}\r\n\r\n\t\tvoid OnDestroy ()\r\n\t\t{\r\n\t\t\tif (button)\r\n\t\t\t\tApplicationLauncher.Instance.RemoveModApplication (button);\r\n\t\t}\r\n\r\n\t\tvoid Dummy()\r\n\t\t{}\r\n\t\t\r\n\t\tpublic static bool MouseIsInRect(Rect rect)\r\n\t\t{\r\n\t\t\treturn rect.Contains(MouseGUIPos());\r\n\t\t}\r\n\t\t\r\n\t\tpublic static Vector2 MouseGUIPos()\r\n\t\t{\r\n\t\t\treturn new Vector3(Input.mousePosition.x, Screen.height-Input.mousePosition.y, 0);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/OldShaders/readme.md.txt",
    "content": "These are the old shader files that were distributed under GPL (matching version 0.0772) and are kept here for reference. Newer shader files are distributed only in compiled form, see license for more info.\n\nHow to use:\n\n1) Get Unity version that matches KSP (2019.2.2f1 at this time)\n\n2) Navigate to this project in Unity\n\n3) Go into .\\Assets\\Editor\\ExportAssetBundle.cs and modify the output directory to where you want the compiled shaders to go\n\n\n\n4) In unity Editor, go to the assets menu and press \"export asset bundles\"\n\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assembly-CSharp-Editor.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <LangVersion>latest</LangVersion>\n    <CscToolPath>C:\\Program Files\\Unity2019.2\\Editor\\Data\\Tools\\RoslynScripts</CscToolPath>\n    <CscToolExe>unity_csc.bat</CscToolExe>\n  </PropertyGroup>\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProductVersion>10.0.20506</ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <RootNamespace></RootNamespace>\n    <ProjectGuid>{1BA7E86D-23C1-619A-C471-A2388FCC27DA}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <AssemblyName>Assembly-CSharp-Editor</AssemblyName>\n    <TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <BaseDirectory>.</BaseDirectory>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>Temp\\bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;UNITY_2019_2_21;UNITY_2019_2;UNITY_2019;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_3_OR_NEWER;UNITY_2018_4_OR_NEWER;UNITY_2019_1_OR_NEWER;UNITY_2019_2_OR_NEWER;UNITY_INCLUDE_TESTS;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_TEXTURE_STREAMING;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;ENABLE_MANAGED_AUDIO_JOBS;INCLUDE_DYNAMIC_GI;ENABLE_MONO_BDWGC;ENABLE_SCRIPTING_GC_WBARRIERS;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;ENABLE_VIDEO;PLATFORM_STANDALONE_WIN;PLATFORM_STANDALONE;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_UNITYWEBREQUEST;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_OUT_OF_PROCESS_CRASH_HANDLER;ENABLE_EVENT_QUEUE;ENABLE_CLUSTER_SYNC;ENABLE_CLUSTERINPUT;ENABLE_VR;ENABLE_AR;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;NET_4_6;ENABLE_PROFILER;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_DIRECTOR;ENABLE_LOCALIZATION;ENABLE_SPRITES;ENABLE_TERRAIN;ENABLE_TILEMAP;ENABLE_TIMELINE;ENABLE_LEGACY_INPUT_MANAGER;CSHARP_7_OR_LATER;CSHARP_7_3_OR_NEWER</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <NoWarn>0169</NoWarn>\n    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>Temp\\bin\\Release\\</OutputPath>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <NoWarn>0169</NoWarn>\n    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>\n  </PropertyGroup>\n  <PropertyGroup>\n    <NoConfig>true</NoConfig>\n    <NoStdLib>true</NoStdLib>\n    <AddAdditionalExplicitAssemblyReferences>false</AddAdditionalExplicitAssemblyReferences>\n    <ImplicitlyExpandNETStandardFacades>false</ImplicitlyExpandNETStandardFacades>\n    <ImplicitlyExpandDesignTimeFacades>false</ImplicitlyExpandDesignTimeFacades>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"UnityEngine\">\n      <HintPath>C:\\Program Files\\Unity2019.2\\Editor\\Data\\Managed/UnityEngine/UnityEngine.dll</HintPath>\n    </Reference>\n    <Reference Include=\"UnityEditor\">\n      <HintPath>C:\\Program Files\\Unity2019.2\\Editor\\Data\\Managed/UnityEditor.dll</HintPath>\n    </Reference>\n  </ItemGroup>\n  <ItemGroup>\n     <Compile Include=\"Assets\\Editor\\ExportAssetBundle.cs\" />\n <Reference Include=\"UnityEditor.TestRunner\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/UnityEditor.TestRunner.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.TestRunner\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/UnityEngine.TestRunner.dll</HintPath>\n </Reference>\n <Reference Include=\"Unity.Timeline.Editor\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/Unity.Timeline.Editor.dll</HintPath>\n </Reference>\n <Reference Include=\"Unity.VSCode.Editor\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/Unity.VSCode.Editor.dll</HintPath>\n </Reference>\n <Reference Include=\"Unity.TextMeshPro.Editor\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/Unity.TextMeshPro.Editor.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UI\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/UnityEngine.UI.dll</HintPath>\n </Reference>\n <Reference Include=\"Unity.Timeline\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/Unity.Timeline.dll</HintPath>\n </Reference>\n <Reference Include=\"Unity.CollabProxy.Editor\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/Unity.CollabProxy.Editor.dll</HintPath>\n </Reference>\n <Reference Include=\"Unity.Rider.Editor\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/Unity.Rider.Editor.dll</HintPath>\n </Reference>\n <Reference Include=\"Unity.TextMeshPro\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/Unity.TextMeshPro.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEditor.UI\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/UnityEditor.UI.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.AIModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.AIModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.ARModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.ARModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.AccessibilityModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.AccessibilityModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.AndroidJNIModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.AndroidJNIModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.AnimationModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.AnimationModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.AssetBundleModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.AssetBundleModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.AudioModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.AudioModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.ClothModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.ClothModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.ClusterInputModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.ClusterInputModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.ClusterRendererModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.ClusterRendererModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.CoreModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.CoreModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.CrashReportingModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.CrashReportingModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.DSPGraphModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.DSPGraphModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.DirectorModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.DirectorModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.FileSystemHttpModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.FileSystemHttpModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.GameCenterModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.GameCenterModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.GridModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.GridModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.HotReloadModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.HotReloadModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.IMGUIModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.IMGUIModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.ImageConversionModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.ImageConversionModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.InputModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.InputModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.InputLegacyModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.InputLegacyModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.JSONSerializeModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.JSONSerializeModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.LocalizationModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.LocalizationModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.ParticleSystemModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.ParticleSystemModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.PerformanceReportingModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.PerformanceReportingModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.PhysicsModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.PhysicsModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.Physics2DModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.Physics2DModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.ProfilerModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.ProfilerModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.ScreenCaptureModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.ScreenCaptureModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.SharedInternalsModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.SharedInternalsModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.SpriteMaskModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.SpriteMaskModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.SpriteShapeModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.SpriteShapeModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.StreamingModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.StreamingModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.SubstanceModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.SubstanceModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.TLSModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.TLSModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.TerrainModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.TerrainModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.TerrainPhysicsModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.TerrainPhysicsModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.TextCoreModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.TextCoreModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.TextRenderingModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.TextRenderingModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.TilemapModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.TilemapModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UIModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.UIModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UIElementsModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.UIElementsModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UNETModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.UNETModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UmbraModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.UmbraModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UnityAnalyticsModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.UnityAnalyticsModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UnityConnectModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.UnityConnectModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UnityTestProtocolModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.UnityTestProtocolModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UnityWebRequestModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UnityWebRequestAssetBundleModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestAssetBundleModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UnityWebRequestAudioModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestAudioModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UnityWebRequestTextureModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestTextureModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UnityWebRequestWWWModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestWWWModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.VFXModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.VFXModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.VRModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.VRModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.VehiclesModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.VehiclesModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.VideoModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.VideoModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.WindModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.WindModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.XRModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.XRModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEditor.VR\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/UnityExtensions/Unity/UnityVR/Editor/UnityEditor.VR.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEditor.Graphs\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEditor.Graphs.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEditor.WindowsStandalone.Extensions\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/PlaybackEngines/WindowsStandaloneSupport/UnityEditor.WindowsStandalone.Extensions.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEditor.WebGL.Extensions\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/PlaybackEngines/WebGLSupport/UnityEditor.WebGL.Extensions.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEditor.OSXStandalone.Extensions\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/PlaybackEngines/MacStandaloneSupport/UnityEditor.OSXStandalone.Extensions.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEditor.LinuxStandalone.Extensions\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/PlaybackEngines/LinuxStandaloneSupport/UnityEditor.LinuxStandalone.Extensions.dll</HintPath>\n </Reference>\n <Reference Include=\"nunit.framework\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom/nunit.framework.dll</HintPath>\n </Reference>\n <Reference Include=\"mscorlib\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/mscorlib.dll</HintPath>\n </Reference>\n <Reference Include=\"System\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Core\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Core.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.Serialization\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Runtime.Serialization.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Xml\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Xml.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Xml.Linq\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Xml.Linq.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Numerics\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Numerics.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Numerics.Vectors\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Numerics.Vectors.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.Http\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Net.Http.dll</HintPath>\n </Reference>\n <Reference Include=\"Microsoft.CSharp\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Microsoft.CSharp.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Data\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Data.dll</HintPath>\n </Reference>\n <Reference Include=\"Microsoft.Win32.Primitives\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/Microsoft.Win32.Primitives.dll</HintPath>\n </Reference>\n <Reference Include=\"netstandard\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/netstandard.dll</HintPath>\n </Reference>\n <Reference Include=\"System.AppContext\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.AppContext.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Collections.Concurrent\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Collections.Concurrent.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Collections\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Collections.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Collections.NonGeneric\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Collections.NonGeneric.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Collections.Specialized\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Collections.Specialized.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ComponentModel.Annotations\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ComponentModel.Annotations.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ComponentModel\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ComponentModel.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ComponentModel.EventBasedAsync\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ComponentModel.EventBasedAsync.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ComponentModel.Primitives\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ComponentModel.Primitives.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ComponentModel.TypeConverter\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ComponentModel.TypeConverter.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Console\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Console.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Data.Common\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Data.Common.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Diagnostics.Contracts\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.Contracts.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Diagnostics.Debug\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.Debug.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Diagnostics.FileVersionInfo\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.FileVersionInfo.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Diagnostics.Process\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.Process.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Diagnostics.StackTrace\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.StackTrace.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Diagnostics.TextWriterTraceListener\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.TextWriterTraceListener.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Diagnostics.Tools\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.Tools.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Diagnostics.TraceSource\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.TraceSource.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Drawing.Primitives\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Drawing.Primitives.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Dynamic.Runtime\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Dynamic.Runtime.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Globalization.Calendars\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Globalization.Calendars.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Globalization\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Globalization.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Globalization.Extensions\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Globalization.Extensions.dll</HintPath>\n </Reference>\n <Reference Include=\"System.IO.Compression.ZipFile\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.Compression.ZipFile.dll</HintPath>\n </Reference>\n <Reference Include=\"System.IO\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.dll</HintPath>\n </Reference>\n <Reference Include=\"System.IO.FileSystem\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.FileSystem.dll</HintPath>\n </Reference>\n <Reference Include=\"System.IO.FileSystem.DriveInfo\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.FileSystem.DriveInfo.dll</HintPath>\n </Reference>\n <Reference Include=\"System.IO.FileSystem.Primitives\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.FileSystem.Primitives.dll</HintPath>\n </Reference>\n <Reference Include=\"System.IO.FileSystem.Watcher\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.FileSystem.Watcher.dll</HintPath>\n </Reference>\n <Reference Include=\"System.IO.IsolatedStorage\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.IsolatedStorage.dll</HintPath>\n </Reference>\n <Reference Include=\"System.IO.MemoryMappedFiles\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.MemoryMappedFiles.dll</HintPath>\n </Reference>\n <Reference Include=\"System.IO.Pipes\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.Pipes.dll</HintPath>\n </Reference>\n <Reference Include=\"System.IO.UnmanagedMemoryStream\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.UnmanagedMemoryStream.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Linq\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Linq.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Linq.Expressions\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Linq.Expressions.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Linq.Parallel\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Linq.Parallel.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Linq.Queryable\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Linq.Queryable.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.Http.Rtc\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.Http.Rtc.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.NameResolution\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.NameResolution.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.NetworkInformation\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.NetworkInformation.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.Ping\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.Ping.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.Primitives\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.Primitives.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.Requests\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.Requests.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.Security\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.Security.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.Sockets\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.Sockets.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.WebHeaderCollection\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.WebHeaderCollection.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.WebSockets.Client\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.WebSockets.Client.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.WebSockets\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.WebSockets.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ObjectModel\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ObjectModel.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Reflection\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Reflection.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Reflection.Emit\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Reflection.Emit.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Reflection.Emit.ILGeneration\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Reflection.Emit.ILGeneration.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Reflection.Emit.Lightweight\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Reflection.Emit.Lightweight.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Reflection.Extensions\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Reflection.Extensions.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Reflection.Primitives\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Reflection.Primitives.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Resources.Reader\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Resources.Reader.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Resources.ResourceManager\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Resources.ResourceManager.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Resources.Writer\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Resources.Writer.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.CompilerServices.VisualC\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.CompilerServices.VisualC.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.Extensions\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Extensions.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.Handles\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Handles.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.InteropServices\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.InteropServices.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.InteropServices.RuntimeInformation\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.InteropServices.RuntimeInformation.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.InteropServices.WindowsRuntime\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.InteropServices.WindowsRuntime.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.Numerics\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Numerics.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.Serialization.Formatters\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Serialization.Formatters.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.Serialization.Json\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Serialization.Json.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.Serialization.Primitives\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Serialization.Primitives.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.Serialization.Xml\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Serialization.Xml.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Security.Claims\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Claims.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Security.Cryptography.Algorithms\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Cryptography.Algorithms.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Security.Cryptography.Csp\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Cryptography.Csp.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Security.Cryptography.Encoding\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Cryptography.Encoding.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Security.Cryptography.Primitives\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Cryptography.Primitives.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Security.Cryptography.X509Certificates\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Cryptography.X509Certificates.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Security.Principal\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Principal.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Security.SecureString\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.SecureString.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ServiceModel.Duplex\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ServiceModel.Duplex.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ServiceModel.Http\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ServiceModel.Http.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ServiceModel.NetTcp\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ServiceModel.NetTcp.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ServiceModel.Primitives\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ServiceModel.Primitives.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ServiceModel.Security\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ServiceModel.Security.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Text.Encoding\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Text.Encoding.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Text.Encoding.Extensions\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Text.Encoding.Extensions.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Text.RegularExpressions\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Text.RegularExpressions.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Threading\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Threading.Overlapped\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.Overlapped.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Threading.Tasks\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.Tasks.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Threading.Tasks.Parallel\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.Tasks.Parallel.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Threading.Thread\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.Thread.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Threading.ThreadPool\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.ThreadPool.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Threading.Timer\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.Timer.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ValueTuple\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ValueTuple.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Xml.ReaderWriter\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Xml.ReaderWriter.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Xml.XDocument\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Xml.XDocument.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Xml.XmlDocument\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Xml.XmlDocument.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Xml.XmlSerializer\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Xml.XmlSerializer.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Xml.XPath\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Xml.XPath.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Xml.XPath.XDocument\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Xml.XPath.XDocument.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityScript\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/unityscript/UnityScript.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityScript.Lang\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/unityscript/UnityScript.Lang.dll</HintPath>\n </Reference>\n <Reference Include=\"Boo.Lang\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/unityscript/Boo.Lang.dll</HintPath>\n </Reference>\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"Assembly-CSharp.csproj\">\n      <Project>{87622294-0BFC-2C93-A2E6-774E6D27C210}</Project>\n      <Name>Assembly-CSharp</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assembly-CSharp-Editor.csproj.orig",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <LangVersion>latest</LangVersion>\n    <CscToolPath>C:\\Program Files\\Unity2019.4\\Editor\\Data\\Tools\\RoslynScripts</CscToolPath>\n    <CscToolExe>unity_csc.bat</CscToolExe>\n  </PropertyGroup>\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProductVersion>10.0.20506</ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <RootNamespace></RootNamespace>\n    <ProjectGuid>{1BA7E86D-23C1-619A-C471-A2388FCC27DA}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <AssemblyName>Assembly-CSharp-Editor</AssemblyName>\n    <TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <BaseDirectory>.</BaseDirectory>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>Temp\\bin\\Debug\\</OutputPath>\n<<<<<<< HEAD\n    <DefineConstants>DEBUG;TRACE;UNITY_2019_4_18;UNITY_2019_4;UNITY_2019;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_3_OR_NEWER;UNITY_2018_4_OR_NEWER;UNITY_2019_1_OR_NEWER;UNITY_2019_2_OR_NEWER;UNITY_2019_3_OR_NEWER;UNITY_2019_4_OR_NEWER;UNITY_INCLUDE_TESTS;ENABLE_AR;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_EVENT_QUEUE;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_TEXTURE_STREAMING;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_VR;ENABLE_WEBCAM;ENABLE_UNITYWEBREQUEST;ENABLE_WWW;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;ENABLE_MANAGED_AUDIO_JOBS;INCLUDE_DYNAMIC_GI;ENABLE_MONO_BDWGC;ENABLE_SCRIPTING_GC_WBARRIERS;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;ENABLE_VIDEO;PLATFORM_STANDALONE;PLATFORM_STANDALONE_WIN;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_OUT_OF_PROCESS_CRASH_HANDLER;ENABLE_CLUSTER_SYNC;ENABLE_CLUSTERINPUT;GFXDEVICE_WAITFOREVENT_MESSAGEPUMP;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;NET_4_6;ENABLE_PROFILER;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_DIRECTOR;ENABLE_LOCALIZATION;ENABLE_SPRITES;ENABLE_TERRAIN;ENABLE_TILEMAP;ENABLE_TIMELINE;ENABLE_LEGACY_INPUT_MANAGER;UNITY_POST_PROCESSING_STACK_V2;CSHARP_7_OR_LATER;CSHARP_7_3_OR_NEWER</DefineConstants>\n=======\n    <DefineConstants>DEBUG;TRACE;UNITY_2019_2_21;UNITY_2019_2;UNITY_2019;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_3_OR_NEWER;UNITY_2018_4_OR_NEWER;UNITY_2019_1_OR_NEWER;UNITY_2019_2_OR_NEWER;UNITY_INCLUDE_TESTS;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_TEXTURE_STREAMING;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;ENABLE_MANAGED_AUDIO_JOBS;INCLUDE_DYNAMIC_GI;ENABLE_MONO_BDWGC;ENABLE_SCRIPTING_GC_WBARRIERS;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;ENABLE_VIDEO;PLATFORM_STANDALONE_WIN;PLATFORM_STANDALONE;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_UNITYWEBREQUEST;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_OUT_OF_PROCESS_CRASH_HANDLER;ENABLE_EVENT_QUEUE;ENABLE_CLUSTER_SYNC;ENABLE_CLUSTERINPUT;ENABLE_VR;ENABLE_AR;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;NET_4_6;ENABLE_PROFILER;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_DIRECTOR;ENABLE_LOCALIZATION;ENABLE_SPRITES;ENABLE_TERRAIN;ENABLE_TILEMAP;ENABLE_TIMELINE;ENABLE_LEGACY_INPUT_MANAGER;UNITY_POST_PROCESSING_STACK_V2;CSHARP_7_OR_LATER;CSHARP_7_3_OR_NEWER</DefineConstants>\n>>>>>>> parent of d91e357... Revert \"Experiments with blending + eclipse raymarching, stashed for later\"\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <NoWarn>0169</NoWarn>\n    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>Temp\\bin\\Release\\</OutputPath>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <NoWarn>0169</NoWarn>\n    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>\n  </PropertyGroup>\n  <PropertyGroup>\n    <NoConfig>true</NoConfig>\n    <NoStdLib>true</NoStdLib>\n    <AddAdditionalExplicitAssemblyReferences>false</AddAdditionalExplicitAssemblyReferences>\n    <ImplicitlyExpandNETStandardFacades>false</ImplicitlyExpandNETStandardFacades>\n    <ImplicitlyExpandDesignTimeFacades>false</ImplicitlyExpandDesignTimeFacades>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"UnityEngine\">\n      <HintPath>C:\\Program Files\\Unity2019.4\\Editor\\Data\\Managed/UnityEngine/UnityEngine.dll</HintPath>\n    </Reference>\n    <Reference Include=\"UnityEditor\">\n      <HintPath>C:\\Program Files\\Unity2019.4\\Editor\\Data\\Managed/UnityEditor.dll</HintPath>\n    </Reference>\n  </ItemGroup>\n  <ItemGroup>\n     <Compile Include=\"Assets\\Editor\\ExportAssetBundle.cs\" />\n     <Compile Include=\"Assets\\Editor\\KSPCurveEditor.cs\" />\n<<<<<<< HEAD\n <Reference Include=\"UnityEngine\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.dll</HintPath>\n=======\n <Reference Include=\"UnityEditor.TestRunner\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/UnityEditor.TestRunner.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.TestRunner\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/UnityEngine.TestRunner.dll</HintPath>\n </Reference>\n <Reference Include=\"Unity.Timeline.Editor\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/Unity.Timeline.Editor.dll</HintPath>\n </Reference>\n <Reference Include=\"Unity.VSCode.Editor\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/Unity.VSCode.Editor.dll</HintPath>\n </Reference>\n <Reference Include=\"Unity.TextMeshPro.Editor\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/Unity.TextMeshPro.Editor.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UI\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/UnityEngine.UI.dll</HintPath>\n </Reference>\n <Reference Include=\"Unity.Timeline\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/Unity.Timeline.dll</HintPath>\n </Reference>\n <Reference Include=\"Unity.CollabProxy.Editor\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/Unity.CollabProxy.Editor.dll</HintPath>\n </Reference>\n <Reference Include=\"Unity.Rider.Editor\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/Unity.Rider.Editor.dll</HintPath>\n </Reference>\n <Reference Include=\"Unity.TextMeshPro\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/Unity.TextMeshPro.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEditor.UI\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/UnityEditor.UI.dll</HintPath>\n>>>>>>> parent of d91e357... Revert \"Experiments with blending + eclipse raymarching, stashed for later\"\n </Reference>\n <Reference Include=\"UnityEngine.AIModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.AIModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.ARModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.ARModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.AccessibilityModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.AccessibilityModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.AndroidJNIModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.AndroidJNIModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.AnimationModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.AnimationModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.AssetBundleModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.AssetBundleModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.AudioModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.AudioModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.ClothModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.ClothModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.ClusterInputModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.ClusterInputModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.ClusterRendererModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.ClusterRendererModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.CoreModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.CoreModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.CrashReportingModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.CrashReportingModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.DSPGraphModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.DSPGraphModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.DirectorModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.DirectorModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.GameCenterModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.GameCenterModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.GridModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.GridModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.HotReloadModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.HotReloadModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.IMGUIModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.IMGUIModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.ImageConversionModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.ImageConversionModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.InputModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.InputModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.InputLegacyModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.InputLegacyModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.JSONSerializeModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.JSONSerializeModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.LocalizationModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.LocalizationModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.ParticleSystemModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.ParticleSystemModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.PerformanceReportingModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.PerformanceReportingModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.PhysicsModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.PhysicsModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.Physics2DModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.Physics2DModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.ProfilerModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.ProfilerModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.ScreenCaptureModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.ScreenCaptureModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.SharedInternalsModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.SharedInternalsModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.SpriteMaskModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.SpriteMaskModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.SpriteShapeModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.SpriteShapeModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.StreamingModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.StreamingModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.SubstanceModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.SubstanceModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.SubsystemsModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.SubsystemsModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.TLSModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.TLSModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.TerrainModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.TerrainModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.TerrainPhysicsModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.TerrainPhysicsModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.TextCoreModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.TextCoreModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.TextRenderingModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.TextRenderingModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.TilemapModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.TilemapModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UIModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.UIModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UIElementsModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.UIElementsModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UNETModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.UNETModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UmbraModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.UmbraModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UnityAnalyticsModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.UnityAnalyticsModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UnityConnectModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.UnityConnectModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UnityTestProtocolModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.UnityTestProtocolModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UnityWebRequestModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UnityWebRequestAssetBundleModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestAssetBundleModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UnityWebRequestAudioModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestAudioModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UnityWebRequestTextureModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestTextureModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UnityWebRequestWWWModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestWWWModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.VFXModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.VFXModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.VRModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.VRModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.VehiclesModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.VehiclesModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.VideoModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.VideoModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.WindModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.WindModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.XRModule\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEngine/UnityEngine.XRModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEditor\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEditor.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEditor.VR\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/UnityExtensions/Unity/UnityVR/Editor/UnityEditor.VR.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEditor.Graphs\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/Managed/UnityEditor.Graphs.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEditor.WindowsStandalone.Extensions\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/PlaybackEngines/WindowsStandaloneSupport/UnityEditor.WindowsStandalone.Extensions.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEditor.WebGL.Extensions\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/PlaybackEngines/WebGLSupport/UnityEditor.WebGL.Extensions.dll</HintPath>\n </Reference>\n <Reference Include=\"nunit.framework\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/PackageCache/com.unity.ext.nunit@1.0.6/net35/unity-custom/nunit.framework.dll</HintPath>\n </Reference>\n <Reference Include=\"mscorlib\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/mscorlib.dll</HintPath>\n </Reference>\n <Reference Include=\"System\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Core\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Core.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.Serialization\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Runtime.Serialization.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Xml\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Xml.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Xml.Linq\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Xml.Linq.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Numerics\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Numerics.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Numerics.Vectors\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Numerics.Vectors.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.Http\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Net.Http.dll</HintPath>\n </Reference>\n <Reference Include=\"Microsoft.CSharp\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Microsoft.CSharp.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Data\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Data.dll</HintPath>\n </Reference>\n <Reference Include=\"Microsoft.Win32.Primitives\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/Microsoft.Win32.Primitives.dll</HintPath>\n </Reference>\n <Reference Include=\"netstandard\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/netstandard.dll</HintPath>\n </Reference>\n <Reference Include=\"System.AppContext\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.AppContext.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Collections.Concurrent\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Collections.Concurrent.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Collections\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Collections.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Collections.NonGeneric\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Collections.NonGeneric.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Collections.Specialized\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Collections.Specialized.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ComponentModel.Annotations\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ComponentModel.Annotations.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ComponentModel\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ComponentModel.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ComponentModel.EventBasedAsync\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ComponentModel.EventBasedAsync.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ComponentModel.Primitives\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ComponentModel.Primitives.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ComponentModel.TypeConverter\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ComponentModel.TypeConverter.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Console\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Console.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Data.Common\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Data.Common.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Diagnostics.Contracts\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.Contracts.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Diagnostics.Debug\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.Debug.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Diagnostics.FileVersionInfo\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.FileVersionInfo.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Diagnostics.Process\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.Process.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Diagnostics.StackTrace\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.StackTrace.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Diagnostics.TextWriterTraceListener\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.TextWriterTraceListener.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Diagnostics.Tools\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.Tools.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Diagnostics.TraceSource\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.TraceSource.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Drawing.Primitives\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Drawing.Primitives.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Dynamic.Runtime\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Dynamic.Runtime.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Globalization.Calendars\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Globalization.Calendars.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Globalization\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Globalization.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Globalization.Extensions\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Globalization.Extensions.dll</HintPath>\n </Reference>\n <Reference Include=\"System.IO.Compression.ZipFile\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.Compression.ZipFile.dll</HintPath>\n </Reference>\n <Reference Include=\"System.IO\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.dll</HintPath>\n </Reference>\n <Reference Include=\"System.IO.FileSystem\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.FileSystem.dll</HintPath>\n </Reference>\n <Reference Include=\"System.IO.FileSystem.DriveInfo\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.FileSystem.DriveInfo.dll</HintPath>\n </Reference>\n <Reference Include=\"System.IO.FileSystem.Primitives\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.FileSystem.Primitives.dll</HintPath>\n </Reference>\n <Reference Include=\"System.IO.FileSystem.Watcher\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.FileSystem.Watcher.dll</HintPath>\n </Reference>\n <Reference Include=\"System.IO.IsolatedStorage\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.IsolatedStorage.dll</HintPath>\n </Reference>\n <Reference Include=\"System.IO.MemoryMappedFiles\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.MemoryMappedFiles.dll</HintPath>\n </Reference>\n <Reference Include=\"System.IO.Pipes\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.Pipes.dll</HintPath>\n </Reference>\n <Reference Include=\"System.IO.UnmanagedMemoryStream\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.UnmanagedMemoryStream.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Linq\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Linq.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Linq.Expressions\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Linq.Expressions.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Linq.Parallel\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Linq.Parallel.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Linq.Queryable\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Linq.Queryable.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.Http.Rtc\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.Http.Rtc.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.NameResolution\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.NameResolution.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.NetworkInformation\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.NetworkInformation.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.Ping\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.Ping.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.Primitives\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.Primitives.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.Requests\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.Requests.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.Security\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.Security.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.Sockets\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.Sockets.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.WebHeaderCollection\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.WebHeaderCollection.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.WebSockets.Client\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.WebSockets.Client.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.WebSockets\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.WebSockets.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ObjectModel\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ObjectModel.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Reflection\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Reflection.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Reflection.Emit\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Reflection.Emit.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Reflection.Emit.ILGeneration\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Reflection.Emit.ILGeneration.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Reflection.Emit.Lightweight\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Reflection.Emit.Lightweight.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Reflection.Extensions\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Reflection.Extensions.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Reflection.Primitives\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Reflection.Primitives.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Resources.Reader\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Resources.Reader.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Resources.ResourceManager\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Resources.ResourceManager.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Resources.Writer\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Resources.Writer.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.CompilerServices.VisualC\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.CompilerServices.VisualC.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.Extensions\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Extensions.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.Handles\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Handles.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.InteropServices\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.InteropServices.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.InteropServices.RuntimeInformation\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.InteropServices.RuntimeInformation.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.InteropServices.WindowsRuntime\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.InteropServices.WindowsRuntime.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.Numerics\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Numerics.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.Serialization.Formatters\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Serialization.Formatters.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.Serialization.Json\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Serialization.Json.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.Serialization.Primitives\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Serialization.Primitives.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.Serialization.Xml\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Serialization.Xml.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Security.Claims\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Claims.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Security.Cryptography.Algorithms\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Cryptography.Algorithms.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Security.Cryptography.Csp\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Cryptography.Csp.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Security.Cryptography.Encoding\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Cryptography.Encoding.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Security.Cryptography.Primitives\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Cryptography.Primitives.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Security.Cryptography.X509Certificates\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Cryptography.X509Certificates.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Security.Principal\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Principal.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Security.SecureString\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.SecureString.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ServiceModel.Duplex\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ServiceModel.Duplex.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ServiceModel.Http\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ServiceModel.Http.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ServiceModel.NetTcp\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ServiceModel.NetTcp.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ServiceModel.Primitives\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ServiceModel.Primitives.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ServiceModel.Security\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ServiceModel.Security.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Text.Encoding\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Text.Encoding.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Text.Encoding.Extensions\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Text.Encoding.Extensions.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Text.RegularExpressions\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Text.RegularExpressions.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Threading\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Threading.Overlapped\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.Overlapped.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Threading.Tasks\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.Tasks.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Threading.Tasks.Parallel\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.Tasks.Parallel.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Threading.Thread\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.Thread.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Threading.ThreadPool\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.ThreadPool.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Threading.Timer\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.Timer.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ValueTuple\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ValueTuple.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Xml.ReaderWriter\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Xml.ReaderWriter.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Xml.XDocument\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Xml.XDocument.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Xml.XmlDocument\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Xml.XmlDocument.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Xml.XmlSerializer\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Xml.XmlSerializer.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Xml.XPath\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Xml.XPath.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Xml.XPath.XDocument\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Xml.XPath.XDocument.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityScript\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/unityscript/UnityScript.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityScript.Lang\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/unityscript/UnityScript.Lang.dll</HintPath>\n </Reference>\n <Reference Include=\"Boo.Lang\">\n <HintPath>C:/Program Files/Unity2019.4/Editor/Data/MonoBleedingEdge/lib/mono/unityscript/Boo.Lang.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEditor.TestRunner\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/UnityEditor.TestRunner.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.TestRunner\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/UnityEngine.TestRunner.dll</HintPath>\n </Reference>\n <Reference Include=\"Unity.Timeline.Editor\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/Unity.Timeline.Editor.dll</HintPath>\n </Reference>\n <Reference Include=\"Unity.VSCode.Editor\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/Unity.VSCode.Editor.dll</HintPath>\n </Reference>\n <Reference Include=\"Unity.TextMeshPro.Editor\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/Unity.TextMeshPro.Editor.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UI\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/UnityEngine.UI.dll</HintPath>\n </Reference>\n <Reference Include=\"Unity.Timeline\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/Unity.Timeline.dll</HintPath>\n </Reference>\n <Reference Include=\"Unity.CollabProxy.Editor\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/Unity.CollabProxy.Editor.dll</HintPath>\n </Reference>\n <Reference Include=\"Unity.Rider.Editor\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/Unity.Rider.Editor.dll</HintPath>\n </Reference>\n <Reference Include=\"Unity.TextMeshPro\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/Unity.TextMeshPro.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEditor.UI\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/UnityEditor.UI.dll</HintPath>\n </Reference>\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"Assembly-CSharp.csproj\">\n      <Project>{87622294-0BFC-2C93-A2E6-774E6D27C210}</Project>\n      <Name>Assembly-CSharp</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assembly-CSharp.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <LangVersion>latest</LangVersion>\n    <CscToolPath>C:\\Program Files\\Unity2019.2\\Editor\\Data\\Tools\\RoslynScripts</CscToolPath>\n    <CscToolExe>unity_csc.bat</CscToolExe>\n  </PropertyGroup>\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProductVersion>10.0.20506</ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <RootNamespace></RootNamespace>\n    <ProjectGuid>{87622294-0BFC-2C93-A2E6-774E6D27C210}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <AssemblyName>Assembly-CSharp</AssemblyName>\n    <TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <BaseDirectory>.</BaseDirectory>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>Temp\\bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;UNITY_2019_2_21;UNITY_2019_2;UNITY_2019;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_3_OR_NEWER;UNITY_2018_4_OR_NEWER;UNITY_2019_1_OR_NEWER;UNITY_2019_2_OR_NEWER;UNITY_INCLUDE_TESTS;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_TEXTURE_STREAMING;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;ENABLE_MANAGED_AUDIO_JOBS;INCLUDE_DYNAMIC_GI;ENABLE_MONO_BDWGC;ENABLE_SCRIPTING_GC_WBARRIERS;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;ENABLE_VIDEO;PLATFORM_STANDALONE_WIN;PLATFORM_STANDALONE;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_UNITYWEBREQUEST;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_OUT_OF_PROCESS_CRASH_HANDLER;ENABLE_EVENT_QUEUE;ENABLE_CLUSTER_SYNC;ENABLE_CLUSTERINPUT;ENABLE_VR;ENABLE_AR;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;NET_STANDARD_2_0;ENABLE_PROFILER;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_DIRECTOR;ENABLE_LOCALIZATION;ENABLE_SPRITES;ENABLE_TERRAIN;ENABLE_TILEMAP;ENABLE_TIMELINE;ENABLE_LEGACY_INPUT_MANAGER;UNITY_POST_PROCESSING_STACK_V2;CSHARP_7_OR_LATER;CSHARP_7_3_OR_NEWER</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <NoWarn>0169</NoWarn>\n    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>Temp\\bin\\Release\\</OutputPath>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <NoWarn>0169</NoWarn>\n    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>\n  </PropertyGroup>\n  <PropertyGroup>\n    <NoConfig>true</NoConfig>\n    <NoStdLib>true</NoStdLib>\n    <AddAdditionalExplicitAssemblyReferences>false</AddAdditionalExplicitAssemblyReferences>\n    <ImplicitlyExpandNETStandardFacades>false</ImplicitlyExpandNETStandardFacades>\n    <ImplicitlyExpandDesignTimeFacades>false</ImplicitlyExpandDesignTimeFacades>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"UnityEngine\">\n      <HintPath>C:\\Program Files\\Unity2019.2\\Editor\\Data\\Managed/UnityEngine/UnityEngine.dll</HintPath>\n    </Reference>\n    <Reference Include=\"UnityEditor\">\n      <HintPath>C:\\Program Files\\Unity2019.2\\Editor\\Data\\Managed/UnityEditor.dll</HintPath>\n    </Reference>\n  </ItemGroup>\n  <ItemGroup>\n     <Compile Include=\"Assets\\Shaders\\Ocean\\Caustics\\ModulateShadowMask.cs\" />\n     <None Include=\"Assets\\Shaders\\DecodeEncode\\DecodedToFloat.shader\" />\n     <None Include=\"Assets\\Shaders\\ClippingUtils.cginc\" />\n     <None Include=\"Assets\\Shaders\\Atmo\\ScaledPlanetScattering.shader\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\OceanShadows.cginc\" />\n     <None Include=\"Assets\\Shaders\\EVE\\noiseSimplex.cginc\" />\n     <None Include=\"Assets\\Shaders\\EVE\\cubeMap.cginc\" />\n     <None Include=\"Assets\\Shaders\\Atmo\\ProjectorScattering.shader\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\InitDisplacement.shader\" />\n     <None Include=\"Assets\\Shaders\\EclipseCommon.cginc\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\OceanLight.cginc\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\ReadData.compute\" />\n     <None Include=\"Assets\\Shaders\\Depth\\DepthToDistance.shader\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\Fourier.shader\" />\n     <None Include=\"Assets\\Shaders\\DecodeEncode\\WriteToFloat.shader\" />\n     <None Include=\"Assets\\Shaders\\EVE\\GeometryCloudVolumeParticleToTexture.shader\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\Caustics\\CausticsGodraysRaymarch.shader\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\UnderwaterDepthBuffer.shader\" />\n     <None Include=\"Assets\\Shaders\\Shadows\\FixedScreenSpaceShadows.shader\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\InitSpectrum.shader\" />\n     <None Include=\"Assets\\Shaders\\EVE\\EVEUtils.cginc\" />\n     <None Include=\"Assets\\Shaders\\DepthCommon.cginc\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\OceanDisplacement3.cginc\" />\n     <None Include=\"Assets\\Shaders\\EVE\\GeometryCloudVolumeParticle.shader\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\OceanWhiteCapsModProj3PixelLights.shader\" />\n     <None Include=\"Assets\\Shaders\\Depth\\CopyCameraDepth.shader\" />\n     <None Include=\"Assets\\Shaders\\Atmo\\SkySphere.shader\" />\n     <None Include=\"Assets\\Shaders\\Shadows\\LongDistanceScreenSpaceShadows.shader\" />\n     <None Include=\"Assets\\Shaders\\AA\\CustomTAA.shader\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\FindHeights.compute\" />\n     <None Include=\"Assets\\Shaders\\IntersectCommon.cginc\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\Caustics\\CausticsOcclusion.shader\" />\n     <None Include=\"Assets\\Shaders\\ShadowsCommon.cginc\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\OceanUtils.cginc\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\OceanBRDF.cginc\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\WhiteCapsPrecompute0.shader\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\OceanWhiteCapsModProj3VertexSearch.shader\" />\n     <None Include=\"Assets\\Shaders\\CommonAtmosphere.cginc\" />\n     <None Include=\"Assets\\Shaders\\Depth\\DownscaleDepth.shader\" />\n     <None Include=\"Assets\\Shaders\\Shadows\\DoublePrecisionEmulation.cginc\" />\n     <None Include=\"Assets\\Shaders\\SunFlare\\SunFlare.shader\" />\n     <None Include=\"Assets\\Shaders\\SunFlare\\SunFlareExtinction.shader\" />\n     <None Include=\"Assets\\Shaders\\Atmo\\Godrays\\ShadowVolumeUtils.cginc\" />\n     <None Include=\"Assets\\Shaders\\Atmo\\DepthBufferScattering.shader\" />\n     <None Include=\"Assets\\Shaders\\Atmo\\CompositeDownscaledScattering.shader\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\SlopeVariance.compute\" />\n     <None Include=\"Assets\\Shaders\\EVE\\alphaMap.cginc\" />\n     <None Include=\"Assets\\Shaders\\AA\\SMAABridge.cginc\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\InvisibleOcean.shader\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\OceanWhiteCapsModProj3.shader\" />\n     <None Include=\"Assets\\Shaders\\AA\\SMAA.cginc\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\UnderwaterProjector.shader\" />\n     <None Include=\"Assets\\Shaders\\Atmo\\Godrays\\VolumeDepth.shader\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\Caustics\\CompositeCausticsGodrays.shader\" />\n     <None Include=\"Assets\\Shaders\\RingCommon.cginc\" />\n     <None Include=\"Assets\\Shaders\\EVE\\SphereCloud.shader\" />\n     <None Include=\"Assets\\Shaders\\EVE\\SphereCloudShadowMap.shader\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\InitJacobians.shader\" />\n     <None Include=\"Assets\\Shaders\\Atmo\\Godrays\\GodraysCommon.cginc\" />\n     <None Include=\"Assets\\Shaders\\Shadows\\FixedScreenSpaceShadows.cginc\" />\n     <None Include=\"Assets\\Shaders\\EVE\\CloudVolumeParticle.shader\" />\n     <None Include=\"Assets\\Shaders\\Utility.cginc\" />\n     <None Include=\"Assets\\Shaders\\AA\\SMAA.shader\" />\n     <None Include=\"Assets\\Shaders\\Atmo\\Godrays\\ComputeInverseShadowMatrices.compute\" />\n <Reference Include=\"Unity.Timeline.Editor\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/Unity.Timeline.Editor.dll</HintPath>\n </Reference>\n <Reference Include=\"Unity.VSCode.Editor\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/Unity.VSCode.Editor.dll</HintPath>\n </Reference>\n <Reference Include=\"Unity.TextMeshPro.Editor\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/Unity.TextMeshPro.Editor.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UI\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/UnityEngine.UI.dll</HintPath>\n </Reference>\n <Reference Include=\"Unity.Timeline\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/Unity.Timeline.dll</HintPath>\n </Reference>\n <Reference Include=\"Unity.CollabProxy.Editor\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/Unity.CollabProxy.Editor.dll</HintPath>\n </Reference>\n <Reference Include=\"Unity.Rider.Editor\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/Unity.Rider.Editor.dll</HintPath>\n </Reference>\n <Reference Include=\"Unity.TextMeshPro\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/Unity.TextMeshPro.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEditor.UI\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/UnityEditor.UI.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.AIModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.AIModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.ARModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.ARModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.AccessibilityModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.AccessibilityModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.AndroidJNIModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.AndroidJNIModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.AnimationModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.AnimationModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.AssetBundleModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.AssetBundleModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.AudioModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.AudioModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.ClothModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.ClothModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.ClusterInputModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.ClusterInputModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.ClusterRendererModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.ClusterRendererModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.CoreModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.CoreModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.CrashReportingModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.CrashReportingModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.DSPGraphModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.DSPGraphModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.DirectorModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.DirectorModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.FileSystemHttpModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.FileSystemHttpModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.GameCenterModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.GameCenterModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.GridModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.GridModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.HotReloadModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.HotReloadModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.IMGUIModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.IMGUIModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.ImageConversionModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.ImageConversionModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.InputModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.InputModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.InputLegacyModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.InputLegacyModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.JSONSerializeModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.JSONSerializeModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.LocalizationModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.LocalizationModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.ParticleSystemModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.ParticleSystemModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.PerformanceReportingModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.PerformanceReportingModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.PhysicsModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.PhysicsModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.Physics2DModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.Physics2DModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.ProfilerModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.ProfilerModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.ScreenCaptureModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.ScreenCaptureModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.SharedInternalsModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.SharedInternalsModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.SpriteMaskModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.SpriteMaskModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.SpriteShapeModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.SpriteShapeModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.StreamingModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.StreamingModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.SubstanceModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.SubstanceModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.TLSModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.TLSModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.TerrainModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.TerrainModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.TerrainPhysicsModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.TerrainPhysicsModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.TextCoreModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.TextCoreModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.TextRenderingModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.TextRenderingModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.TilemapModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.TilemapModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UIModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.UIModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UIElementsModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.UIElementsModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UNETModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.UNETModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UmbraModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.UmbraModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UnityAnalyticsModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.UnityAnalyticsModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UnityConnectModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.UnityConnectModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UnityTestProtocolModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.UnityTestProtocolModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UnityWebRequestModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UnityWebRequestAssetBundleModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestAssetBundleModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UnityWebRequestAudioModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestAudioModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UnityWebRequestTextureModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestTextureModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UnityWebRequestWWWModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestWWWModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.VFXModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.VFXModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.VRModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.VRModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.VehiclesModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.VehiclesModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.VideoModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.VideoModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.WindModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.WindModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.XRModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.XRModule.dll</HintPath>\n </Reference>\n <Reference Include=\"mscorlib\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/mscorlib.dll</HintPath>\n </Reference>\n <Reference Include=\"System\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Core\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Core.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.Serialization\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Runtime.Serialization.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Xml\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Xml.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Xml.Linq\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Xml.Linq.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Numerics\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Numerics.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Numerics.Vectors\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Numerics.Vectors.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.Http\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Net.Http.dll</HintPath>\n </Reference>\n <Reference Include=\"Microsoft.CSharp\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Microsoft.CSharp.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Data\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Data.dll</HintPath>\n </Reference>\n <Reference Include=\"Microsoft.Win32.Primitives\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/Microsoft.Win32.Primitives.dll</HintPath>\n </Reference>\n <Reference Include=\"netstandard\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/netstandard.dll</HintPath>\n </Reference>\n <Reference Include=\"System.AppContext\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.AppContext.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Collections.Concurrent\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Collections.Concurrent.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Collections\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Collections.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Collections.NonGeneric\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Collections.NonGeneric.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Collections.Specialized\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Collections.Specialized.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ComponentModel.Annotations\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ComponentModel.Annotations.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ComponentModel\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ComponentModel.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ComponentModel.EventBasedAsync\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ComponentModel.EventBasedAsync.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ComponentModel.Primitives\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ComponentModel.Primitives.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ComponentModel.TypeConverter\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ComponentModel.TypeConverter.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Console\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Console.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Data.Common\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Data.Common.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Diagnostics.Contracts\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.Contracts.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Diagnostics.Debug\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.Debug.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Diagnostics.FileVersionInfo\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.FileVersionInfo.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Diagnostics.Process\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.Process.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Diagnostics.StackTrace\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.StackTrace.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Diagnostics.TextWriterTraceListener\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.TextWriterTraceListener.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Diagnostics.Tools\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.Tools.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Diagnostics.TraceSource\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.TraceSource.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Drawing.Primitives\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Drawing.Primitives.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Dynamic.Runtime\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Dynamic.Runtime.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Globalization.Calendars\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Globalization.Calendars.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Globalization\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Globalization.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Globalization.Extensions\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Globalization.Extensions.dll</HintPath>\n </Reference>\n <Reference Include=\"System.IO.Compression.ZipFile\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.Compression.ZipFile.dll</HintPath>\n </Reference>\n <Reference Include=\"System.IO\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.dll</HintPath>\n </Reference>\n <Reference Include=\"System.IO.FileSystem\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.FileSystem.dll</HintPath>\n </Reference>\n <Reference Include=\"System.IO.FileSystem.DriveInfo\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.FileSystem.DriveInfo.dll</HintPath>\n </Reference>\n <Reference Include=\"System.IO.FileSystem.Primitives\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.FileSystem.Primitives.dll</HintPath>\n </Reference>\n <Reference Include=\"System.IO.FileSystem.Watcher\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.FileSystem.Watcher.dll</HintPath>\n </Reference>\n <Reference Include=\"System.IO.IsolatedStorage\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.IsolatedStorage.dll</HintPath>\n </Reference>\n <Reference Include=\"System.IO.MemoryMappedFiles\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.MemoryMappedFiles.dll</HintPath>\n </Reference>\n <Reference Include=\"System.IO.Pipes\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.Pipes.dll</HintPath>\n </Reference>\n <Reference Include=\"System.IO.UnmanagedMemoryStream\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.UnmanagedMemoryStream.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Linq\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Linq.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Linq.Expressions\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Linq.Expressions.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Linq.Parallel\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Linq.Parallel.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Linq.Queryable\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Linq.Queryable.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.Http.Rtc\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.Http.Rtc.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.NameResolution\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.NameResolution.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.NetworkInformation\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.NetworkInformation.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.Ping\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.Ping.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.Primitives\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.Primitives.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.Requests\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.Requests.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.Security\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.Security.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.Sockets\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.Sockets.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.WebHeaderCollection\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.WebHeaderCollection.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.WebSockets.Client\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.WebSockets.Client.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.WebSockets\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.WebSockets.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ObjectModel\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ObjectModel.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Reflection\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Reflection.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Reflection.Emit\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Reflection.Emit.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Reflection.Emit.ILGeneration\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Reflection.Emit.ILGeneration.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Reflection.Emit.Lightweight\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Reflection.Emit.Lightweight.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Reflection.Extensions\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Reflection.Extensions.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Reflection.Primitives\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Reflection.Primitives.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Resources.Reader\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Resources.Reader.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Resources.ResourceManager\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Resources.ResourceManager.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Resources.Writer\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Resources.Writer.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.CompilerServices.VisualC\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.CompilerServices.VisualC.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.Extensions\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Extensions.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.Handles\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Handles.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.InteropServices\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.InteropServices.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.InteropServices.RuntimeInformation\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.InteropServices.RuntimeInformation.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.InteropServices.WindowsRuntime\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.InteropServices.WindowsRuntime.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.Numerics\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Numerics.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.Serialization.Formatters\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Serialization.Formatters.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.Serialization.Json\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Serialization.Json.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.Serialization.Primitives\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Serialization.Primitives.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.Serialization.Xml\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Serialization.Xml.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Security.Claims\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Claims.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Security.Cryptography.Algorithms\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Cryptography.Algorithms.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Security.Cryptography.Csp\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Cryptography.Csp.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Security.Cryptography.Encoding\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Cryptography.Encoding.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Security.Cryptography.Primitives\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Cryptography.Primitives.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Security.Cryptography.X509Certificates\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Cryptography.X509Certificates.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Security.Principal\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Principal.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Security.SecureString\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.SecureString.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ServiceModel.Duplex\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ServiceModel.Duplex.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ServiceModel.Http\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ServiceModel.Http.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ServiceModel.NetTcp\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ServiceModel.NetTcp.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ServiceModel.Primitives\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ServiceModel.Primitives.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ServiceModel.Security\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ServiceModel.Security.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Text.Encoding\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Text.Encoding.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Text.Encoding.Extensions\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Text.Encoding.Extensions.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Text.RegularExpressions\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Text.RegularExpressions.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Threading\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Threading.Overlapped\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.Overlapped.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Threading.Tasks\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.Tasks.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Threading.Tasks.Parallel\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.Tasks.Parallel.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Threading.Thread\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.Thread.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Threading.ThreadPool\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.ThreadPool.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Threading.Timer\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.Timer.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ValueTuple\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ValueTuple.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Xml.ReaderWriter\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Xml.ReaderWriter.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Xml.XDocument\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Xml.XDocument.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Xml.XmlDocument\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Xml.XmlDocument.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Xml.XmlSerializer\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Xml.XmlSerializer.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Xml.XPath\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Xml.XPath.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Xml.XPath.XDocument\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Xml.XPath.XDocument.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityScript\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/unityscript/UnityScript.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityScript.Lang\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/unityscript/UnityScript.Lang.dll</HintPath>\n </Reference>\n <Reference Include=\"Boo.Lang\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/unityscript/Boo.Lang.dll</HintPath>\n </Reference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assembly-CSharp.csproj.orig",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <LangVersion>latest</LangVersion>\n    <CscToolPath>C:\\Program Files\\Unity2019.2\\Editor\\Data\\Tools\\RoslynScripts</CscToolPath>\n    <CscToolExe>unity_csc.bat</CscToolExe>\n  </PropertyGroup>\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProductVersion>10.0.20506</ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <RootNamespace></RootNamespace>\n    <ProjectGuid>{87622294-0BFC-2C93-A2E6-774E6D27C210}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <AssemblyName>Assembly-CSharp</AssemblyName>\n    <TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <BaseDirectory>.</BaseDirectory>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>Temp\\bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;UNITY_2019_2_21;UNITY_2019_2;UNITY_2019;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_3_OR_NEWER;UNITY_2018_4_OR_NEWER;UNITY_2019_1_OR_NEWER;UNITY_2019_2_OR_NEWER;UNITY_INCLUDE_TESTS;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_TEXTURE_STREAMING;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;ENABLE_MANAGED_AUDIO_JOBS;INCLUDE_DYNAMIC_GI;ENABLE_MONO_BDWGC;ENABLE_SCRIPTING_GC_WBARRIERS;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;ENABLE_VIDEO;PLATFORM_STANDALONE_WIN;PLATFORM_STANDALONE;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_UNITYWEBREQUEST;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_OUT_OF_PROCESS_CRASH_HANDLER;ENABLE_EVENT_QUEUE;ENABLE_CLUSTER_SYNC;ENABLE_CLUSTERINPUT;ENABLE_VR;ENABLE_AR;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;NET_STANDARD_2_0;ENABLE_PROFILER;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_DIRECTOR;ENABLE_LOCALIZATION;ENABLE_SPRITES;ENABLE_TERRAIN;ENABLE_TILEMAP;ENABLE_TIMELINE;ENABLE_LEGACY_INPUT_MANAGER;UNITY_POST_PROCESSING_STACK_V2;CSHARP_7_OR_LATER;CSHARP_7_3_OR_NEWER</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <NoWarn>0169</NoWarn>\n    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>Temp\\bin\\Release\\</OutputPath>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <NoWarn>0169</NoWarn>\n    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>\n  </PropertyGroup>\n  <PropertyGroup>\n    <NoConfig>true</NoConfig>\n    <NoStdLib>true</NoStdLib>\n    <AddAdditionalExplicitAssemblyReferences>false</AddAdditionalExplicitAssemblyReferences>\n    <ImplicitlyExpandNETStandardFacades>false</ImplicitlyExpandNETStandardFacades>\n    <ImplicitlyExpandDesignTimeFacades>false</ImplicitlyExpandDesignTimeFacades>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"UnityEngine\">\n      <HintPath>C:\\Program Files\\Unity2019.2\\Editor\\Data\\Managed/UnityEngine/UnityEngine.dll</HintPath>\n    </Reference>\n    <Reference Include=\"UnityEditor\">\n      <HintPath>C:\\Program Files\\Unity2019.2\\Editor\\Data\\Managed/UnityEditor.dll</HintPath>\n    </Reference>\n  </ItemGroup>\n  <ItemGroup>\n     <Compile Include=\"Assets\\Shaders\\Ocean\\Caustics\\ModulateShadowMask.cs\" />\n     <None Include=\"Assets\\Shaders\\Instancing\\My Shadows.cginc\" />\n     <None Include=\"Assets\\Shaders\\DecodeEncode\\DecodedToFloat.shader\" />\n     <None Include=\"Assets\\Shaders\\DepthTexture\\customDepthTexture.shader\" />\n     <None Include=\"Assets\\Shaders\\ClippingUtils.cginc\" />\n     <None Include=\"Assets\\Shaders\\Atmo\\ScaledPlanetScattering.shader\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\OceanShadows.cginc\" />\n     <None Include=\"Assets\\Shaders\\EVE\\noiseSimplex.cginc\" />\n     <None Include=\"Assets\\Shaders\\EVE\\cubeMap.cginc\" />\n     <None Include=\"Assets\\Shaders\\EVE\\old\\EVEUtils.cginc\" />\n     <None Include=\"Assets\\Shaders\\DepthTexture\\ShadowVolumeDepth.shader\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\InitDisplacement.shader\" />\n     <None Include=\"Assets\\Shaders\\EVE\\old\\cubeMap.cginc\" />\n     <None Include=\"Assets\\Shaders\\EclipseCommon.cginc\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\OceanLight.cginc\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\ReadData.compute\" />\n     <None Include=\"Assets\\Shaders\\DepthTexture\\DepthToDistance.shader\" />\n     <None Include=\"Assets\\Shaders\\Instancing\\My First Shader.shader\" />\n     <None Include=\"Assets\\Shaders\\EVE\\old\\noiseSimplex.cginc\" />\n     <None Include=\"Assets\\Shaders\\EVE\\old\\CloudVolumeParticle.shader\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\Fourier.shader\" />\n     <None Include=\"Assets\\Shaders\\OldOrUnused\\SkyScaledBoxScaled.shader\" />\n     <None Include=\"Assets\\Shaders\\DecodeEncode\\WriteToFloat.shader\" />\n     <None Include=\"Assets\\Shaders\\EVE\\GeometryCloudVolumeParticleToTexture.shader\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\Caustics\\CausticsGodraysRaymarch.shader\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\UnderwaterDepthBuffer.shader\" />\n     <None Include=\"Assets\\Shaders\\EVE\\old\\SphereCloud.shader\" />\n     <None Include=\"Assets\\Shaders\\Atmo\\mergedAtmosphereLocalScattering.shader\" />\n     <None Include=\"Assets\\Shaders\\Shadows\\FixedScreenSpaceShadows.shader\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\InitSpectrum.shader\" />\n     <None Include=\"Assets\\Shaders\\EVE\\EVEUtils.cginc\" />\n     <None Include=\"Assets\\Shaders\\DepthTexture\\ShadowVolumeDepthAdditive.shader\" />\n     <None Include=\"Assets\\Shaders\\EVE\\old\\SphereCloudOld.shader\" />\n     <None Include=\"Assets\\Shaders\\Instancing\\DeferredFog.shader\" />\n     <None Include=\"Assets\\Shaders\\Instancing\\My Lighting.cginc\" />\n     <None Include=\"Assets\\Shaders\\Instancing\\Texture Splatting.shader\" />\n     <None Include=\"Assets\\Shaders\\DepthCommon.cginc\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\OceanDisplacement3.cginc\" />\n     <None Include=\"Assets\\Shaders\\EVE\\GeometryCloudVolumeParticle.shader\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\OceanWhiteCapsModProj3PixelLights.shader\" />\n     <None Include=\"Assets\\Shaders\\DepthTexture\\CopyCameraDepth.shader\" />\n     <None Include=\"Assets\\Shaders\\Atmo\\atmosphereLocalScattering.shader\" />\n     <None Include=\"Assets\\Shaders\\Atmo\\SkySphere.shader\" />\n     <None Include=\"Assets\\Shaders\\Shadows\\LongDistanceScreenSpaceShadows.shader\" />\n     <None Include=\"Assets\\Shaders\\AA\\CustomTAA.shader\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\FindHeights.compute\" />\n     <None Include=\"Assets\\Shaders\\IntersectCommon.cginc\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\Caustics\\CausticsOcclusion.shader\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\Caustics\\CausticsGodraysBAK.shader\" />\n     <None Include=\"Assets\\Shaders\\EVE\\old\\alphaMap.cginc\" />\n     <None Include=\"Assets\\Shaders\\Instancing\\My First Lighting Shader.shader\" />\n     <None Include=\"Assets\\Shaders\\Instancing\\MyDeferredShading.cginc\" />\n     <None Include=\"Assets\\Shaders\\ShadowsCommon.cginc\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\OceanUtils.cginc\" />\n     <None Include=\"Assets\\Shaders\\KSP\\LightingKSP.cginc\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\OceanBRDF.cginc\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\WhiteCapsPrecompute0.shader\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\OceanWhiteCapsModProj3VertexSearch.shader\" />\n     <None Include=\"Assets\\Shaders\\CommonAtmosphere.cginc\" />\n     <None Include=\"Assets\\Shaders\\Instancing\\DeferredShading.shader\" />\n     <None Include=\"Assets\\Shaders\\OldOrUnused\\AtmosphereNew.cginc\" />\n     <None Include=\"Assets\\Shaders\\DepthTexture\\DownscaleDepth.shader\" />\n     <None Include=\"Assets\\Shaders\\Shadows\\DoublePrecisionEmulation.cginc\" />\n     <None Include=\"Assets\\Shaders\\SunFlare\\SunFlare.shader\" />\n     <None Include=\"Assets\\Shaders\\SunFlare\\SunFlareExtinction.shader\" />\n     <None Include=\"Assets\\Shaders\\Instancing\\My Lightmapping.cginc\" />\n     <None Include=\"Assets\\Shaders\\OldOrUnused\\SkyScaledBox.shader\" />\n     <None Include=\"Assets\\Shaders\\Atmo\\Godrays\\ShadowVolumeUtils.cginc\" />\n     <None Include=\"Assets\\Shaders\\DepthTexture\\ShadowVolumeDepth - Copy.shader\" />\n     <None Include=\"Assets\\Shaders\\Atmo\\DepthBufferScattering.shader\" />\n     <None Include=\"Assets\\Shaders\\Atmo\\CompositeDownscaledScattering.shader\" />\n     <None Include=\"Assets\\Shaders\\Grass\\Grass.shader\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\SlopeVariance.compute\" />\n     <None Include=\"Assets\\Shaders\\EVE\\alphaMap.cginc\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\underwaterPostProcessing32bitViewSpaceDepth.shader\" />\n     <None Include=\"Assets\\Shaders\\AA\\SMAABridge.cginc\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\InvisibleOcean.shader\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\OceanWhiteCapsModProj3.shader\" />\n     <None Include=\"Assets\\Shaders\\Grass\\GrassBak.shader\" />\n<<<<<<< HEAD\n     <None Include=\"Assets\\Shaders\\AA\\SMAA.cginc\" />\n=======\n     <None Include=\"Assets\\Shaders\\Ocean\\MapSplit.shader\" />\n>>>>>>> c935259... split into individual maps, is slower, therefore I think the compiler optimizes 1-2 channel accesses\n     <None Include=\"Assets\\Shaders\\Ocean\\UnderwaterProjector.shader\" />\n     <None Include=\"Assets\\Shaders\\Atmo\\Godrays\\VolumeDepth.shader\" />\n     <None Include=\"Assets\\Shaders\\KSP\\Diffuse.shader\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\Caustics\\CompositeCausticsGodrays.shader\" />\n     <None Include=\"Assets\\Shaders\\RingCommon.cginc\" />\n     <None Include=\"Assets\\Shaders\\EVE\\SphereCloud.shader\" />\n     <None Include=\"Assets\\Shaders\\EVE\\SphereCloudShadowMap.shader\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\InitJacobians.shader\" />\n     <None Include=\"Assets\\Shaders\\Ocean\\Caustics\\GodraysSoftAdd.shader\" />\n     <None Include=\"Assets\\Shaders\\Atmo\\Godrays\\GodraysCommon.cginc\" />\n     <None Include=\"Assets\\Shaders\\Instancing\\Textured With Detail.shader\" />\n     <None Include=\"Assets\\Shaders\\Shadows\\FixedScreenSpaceShadows.cginc\" />\n     <None Include=\"Assets\\Shaders\\Occlusion\\ModulateShadowMaskWithOcclusion.shader\" />\n     <None Include=\"Assets\\Shaders\\EVE\\CloudVolumeParticle.shader\" />\n     <None Include=\"Assets\\Shaders\\Utility.cginc\" />\n     <None Include=\"Assets\\Shaders\\DepthTexture\\simpleDepthTexture.shader\" />\n     <None Include=\"Assets\\Shaders\\AA\\SMAA.shader\" />\n     <None Include=\"Assets\\Shaders\\Atmo\\Godrays\\ComputeInverseShadowMatrices.compute\" />\n <Reference Include=\"Unity.Timeline.Editor\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/Unity.Timeline.Editor.dll</HintPath>\n </Reference>\n <Reference Include=\"Unity.VSCode.Editor\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/Unity.VSCode.Editor.dll</HintPath>\n </Reference>\n <Reference Include=\"Unity.TextMeshPro.Editor\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/Unity.TextMeshPro.Editor.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UI\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/UnityEngine.UI.dll</HintPath>\n </Reference>\n <Reference Include=\"Unity.Timeline\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/Unity.Timeline.dll</HintPath>\n </Reference>\n <Reference Include=\"Unity.CollabProxy.Editor\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/Unity.CollabProxy.Editor.dll</HintPath>\n </Reference>\n <Reference Include=\"Unity.Rider.Editor\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/Unity.Rider.Editor.dll</HintPath>\n </Reference>\n <Reference Include=\"Unity.TextMeshPro\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/Unity.TextMeshPro.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEditor.UI\">\n <HintPath>C:/gh/scattererGithub/Scatterer/scatterer/Shaders/scattererShaders/Library/ScriptAssemblies/UnityEditor.UI.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.AIModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.AIModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.ARModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.ARModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.AccessibilityModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.AccessibilityModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.AndroidJNIModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.AndroidJNIModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.AnimationModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.AnimationModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.AssetBundleModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.AssetBundleModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.AudioModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.AudioModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.ClothModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.ClothModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.ClusterInputModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.ClusterInputModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.ClusterRendererModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.ClusterRendererModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.CoreModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.CoreModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.CrashReportingModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.CrashReportingModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.DSPGraphModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.DSPGraphModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.DirectorModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.DirectorModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.FileSystemHttpModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.FileSystemHttpModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.GameCenterModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.GameCenterModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.GridModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.GridModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.HotReloadModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.HotReloadModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.IMGUIModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.IMGUIModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.ImageConversionModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.ImageConversionModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.InputModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.InputModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.InputLegacyModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.InputLegacyModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.JSONSerializeModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.JSONSerializeModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.LocalizationModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.LocalizationModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.ParticleSystemModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.ParticleSystemModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.PerformanceReportingModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.PerformanceReportingModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.PhysicsModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.PhysicsModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.Physics2DModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.Physics2DModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.ProfilerModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.ProfilerModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.ScreenCaptureModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.ScreenCaptureModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.SharedInternalsModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.SharedInternalsModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.SpriteMaskModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.SpriteMaskModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.SpriteShapeModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.SpriteShapeModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.StreamingModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.StreamingModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.SubstanceModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.SubstanceModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.TLSModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.TLSModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.TerrainModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.TerrainModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.TerrainPhysicsModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.TerrainPhysicsModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.TextCoreModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.TextCoreModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.TextRenderingModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.TextRenderingModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.TilemapModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.TilemapModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UIModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.UIModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UIElementsModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.UIElementsModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UNETModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.UNETModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UmbraModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.UmbraModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UnityAnalyticsModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.UnityAnalyticsModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UnityConnectModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.UnityConnectModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UnityTestProtocolModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.UnityTestProtocolModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UnityWebRequestModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UnityWebRequestAssetBundleModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestAssetBundleModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UnityWebRequestAudioModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestAudioModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UnityWebRequestTextureModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestTextureModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.UnityWebRequestWWWModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestWWWModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.VFXModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.VFXModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.VRModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.VRModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.VehiclesModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.VehiclesModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.VideoModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.VideoModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.WindModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.WindModule.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.XRModule\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/Managed/UnityEngine/UnityEngine.XRModule.dll</HintPath>\n </Reference>\n <Reference Include=\"mscorlib\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/mscorlib.dll</HintPath>\n </Reference>\n <Reference Include=\"System\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Core\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Core.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.Serialization\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Runtime.Serialization.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Xml\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Xml.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Xml.Linq\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Xml.Linq.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Numerics\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Numerics.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Numerics.Vectors\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Numerics.Vectors.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.Http\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Net.Http.dll</HintPath>\n </Reference>\n <Reference Include=\"Microsoft.CSharp\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Microsoft.CSharp.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Data\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Data.dll</HintPath>\n </Reference>\n <Reference Include=\"Microsoft.Win32.Primitives\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/Microsoft.Win32.Primitives.dll</HintPath>\n </Reference>\n <Reference Include=\"netstandard\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/netstandard.dll</HintPath>\n </Reference>\n <Reference Include=\"System.AppContext\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.AppContext.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Collections.Concurrent\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Collections.Concurrent.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Collections\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Collections.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Collections.NonGeneric\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Collections.NonGeneric.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Collections.Specialized\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Collections.Specialized.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ComponentModel.Annotations\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ComponentModel.Annotations.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ComponentModel\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ComponentModel.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ComponentModel.EventBasedAsync\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ComponentModel.EventBasedAsync.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ComponentModel.Primitives\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ComponentModel.Primitives.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ComponentModel.TypeConverter\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ComponentModel.TypeConverter.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Console\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Console.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Data.Common\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Data.Common.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Diagnostics.Contracts\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.Contracts.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Diagnostics.Debug\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.Debug.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Diagnostics.FileVersionInfo\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.FileVersionInfo.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Diagnostics.Process\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.Process.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Diagnostics.StackTrace\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.StackTrace.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Diagnostics.TextWriterTraceListener\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.TextWriterTraceListener.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Diagnostics.Tools\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.Tools.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Diagnostics.TraceSource\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.TraceSource.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Drawing.Primitives\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Drawing.Primitives.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Dynamic.Runtime\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Dynamic.Runtime.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Globalization.Calendars\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Globalization.Calendars.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Globalization\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Globalization.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Globalization.Extensions\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Globalization.Extensions.dll</HintPath>\n </Reference>\n <Reference Include=\"System.IO.Compression.ZipFile\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.Compression.ZipFile.dll</HintPath>\n </Reference>\n <Reference Include=\"System.IO\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.dll</HintPath>\n </Reference>\n <Reference Include=\"System.IO.FileSystem\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.FileSystem.dll</HintPath>\n </Reference>\n <Reference Include=\"System.IO.FileSystem.DriveInfo\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.FileSystem.DriveInfo.dll</HintPath>\n </Reference>\n <Reference Include=\"System.IO.FileSystem.Primitives\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.FileSystem.Primitives.dll</HintPath>\n </Reference>\n <Reference Include=\"System.IO.FileSystem.Watcher\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.FileSystem.Watcher.dll</HintPath>\n </Reference>\n <Reference Include=\"System.IO.IsolatedStorage\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.IsolatedStorage.dll</HintPath>\n </Reference>\n <Reference Include=\"System.IO.MemoryMappedFiles\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.MemoryMappedFiles.dll</HintPath>\n </Reference>\n <Reference Include=\"System.IO.Pipes\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.Pipes.dll</HintPath>\n </Reference>\n <Reference Include=\"System.IO.UnmanagedMemoryStream\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.UnmanagedMemoryStream.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Linq\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Linq.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Linq.Expressions\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Linq.Expressions.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Linq.Parallel\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Linq.Parallel.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Linq.Queryable\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Linq.Queryable.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.Http.Rtc\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.Http.Rtc.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.NameResolution\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.NameResolution.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.NetworkInformation\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.NetworkInformation.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.Ping\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.Ping.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.Primitives\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.Primitives.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.Requests\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.Requests.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.Security\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.Security.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.Sockets\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.Sockets.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.WebHeaderCollection\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.WebHeaderCollection.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.WebSockets.Client\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.WebSockets.Client.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Net.WebSockets\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.WebSockets.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ObjectModel\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ObjectModel.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Reflection\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Reflection.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Reflection.Emit\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Reflection.Emit.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Reflection.Emit.ILGeneration\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Reflection.Emit.ILGeneration.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Reflection.Emit.Lightweight\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Reflection.Emit.Lightweight.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Reflection.Extensions\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Reflection.Extensions.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Reflection.Primitives\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Reflection.Primitives.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Resources.Reader\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Resources.Reader.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Resources.ResourceManager\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Resources.ResourceManager.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Resources.Writer\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Resources.Writer.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.CompilerServices.VisualC\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.CompilerServices.VisualC.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.Extensions\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Extensions.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.Handles\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Handles.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.InteropServices\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.InteropServices.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.InteropServices.RuntimeInformation\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.InteropServices.RuntimeInformation.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.InteropServices.WindowsRuntime\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.InteropServices.WindowsRuntime.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.Numerics\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Numerics.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.Serialization.Formatters\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Serialization.Formatters.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.Serialization.Json\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Serialization.Json.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.Serialization.Primitives\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Serialization.Primitives.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Runtime.Serialization.Xml\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Serialization.Xml.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Security.Claims\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Claims.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Security.Cryptography.Algorithms\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Cryptography.Algorithms.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Security.Cryptography.Csp\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Cryptography.Csp.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Security.Cryptography.Encoding\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Cryptography.Encoding.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Security.Cryptography.Primitives\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Cryptography.Primitives.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Security.Cryptography.X509Certificates\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Cryptography.X509Certificates.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Security.Principal\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Principal.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Security.SecureString\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.SecureString.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ServiceModel.Duplex\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ServiceModel.Duplex.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ServiceModel.Http\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ServiceModel.Http.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ServiceModel.NetTcp\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ServiceModel.NetTcp.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ServiceModel.Primitives\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ServiceModel.Primitives.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ServiceModel.Security\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ServiceModel.Security.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Text.Encoding\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Text.Encoding.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Text.Encoding.Extensions\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Text.Encoding.Extensions.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Text.RegularExpressions\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Text.RegularExpressions.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Threading\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Threading.Overlapped\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.Overlapped.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Threading.Tasks\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.Tasks.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Threading.Tasks.Parallel\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.Tasks.Parallel.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Threading.Thread\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.Thread.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Threading.ThreadPool\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.ThreadPool.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Threading.Timer\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.Timer.dll</HintPath>\n </Reference>\n <Reference Include=\"System.ValueTuple\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ValueTuple.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Xml.ReaderWriter\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Xml.ReaderWriter.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Xml.XDocument\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Xml.XDocument.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Xml.XmlDocument\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Xml.XmlDocument.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Xml.XmlSerializer\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Xml.XmlSerializer.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Xml.XPath\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Xml.XPath.dll</HintPath>\n </Reference>\n <Reference Include=\"System.Xml.XPath.XDocument\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Xml.XPath.XDocument.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityScript\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/unityscript/UnityScript.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityScript.Lang\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/unityscript/UnityScript.Lang.dll</HintPath>\n </Reference>\n <Reference Include=\"Boo.Lang\">\n <HintPath>C:/Program Files/Unity2019.2/Editor/Data/MonoBleedingEdge/lib/mono/unityscript/Boo.Lang.dll</HintPath>\n </Reference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assembly-UnityScript.unityproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n\t<Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n\t<Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n\t<ProductVersion>10.0.20506</ProductVersion>\n\t<SchemaVersion>2.0</SchemaVersion>\n\t<RootNamespace></RootNamespace>\n\t<ProjectGuid>{07FD5666-7B78-6483-21E2-6D1791113BE7}</ProjectGuid>\n\t<OutputType>Library</OutputType>\n\t<AppDesignerFolder>Properties</AppDesignerFolder>\n\t<AssemblyName>Assembly-UnityScript</AssemblyName>\n\t<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>\n\t<FileAlignment>512</FileAlignment>\n\t<BaseDirectory>Assets</BaseDirectory>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n\t<DebugSymbols>true</DebugSymbols>\n\t<DebugType>full</DebugType>\n\t<Optimize>false</Optimize>\n\t<OutputPath>Temp\\bin\\Debug\\</OutputPath>\n\t<DefineConstants>DEBUG;TRACE;UNITY_5_2_4;UNITY_5_2;UNITY_5;ENABLE_NEW_BUGREPORTER;ENABLE_2D_PHYSICS;ENABLE_4_6_FEATURES;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_FRAME_DEBUGGER;ENABLE_GENERICS;ENABLE_HOME_SCREEN;ENABLE_IMAGEEFFECTS;ENABLE_LIGHT_PROBES_LEGACY;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_PLUGIN_INSPECTOR;ENABLE_SHADOWS;ENABLE_SINGLE_INSTANCE_BUILD_SETTING;ENABLE_SPRITES;ENABLE_TERRAIN;ENABLE_RAKNET;ENABLE_UNET;ENABLE_UNITYEVENTS;ENABLE_VR;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_METRICS;ENABLE_REFLECTION_BUFFERS;INCLUDE_DYNAMIC_GI;INCLUDE_GI;INCLUDE_IL2CPP;INCLUDE_DIRECTX12;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;ENABLE_LOCALIZATION;ENABLE_ANDROID_ATLAS_ETC1_COMPRESSION;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_TEXTUREID_MAP;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_LOG_MIXED_STACKTRACE;ENABLE_UNITYWEBREQUEST;ENABLE_EVENT_QUEUE;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;ENABLE_PROFILER;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN</DefineConstants>\n\t<ErrorReport>prompt</ErrorReport>\n\t<WarningLevel>4</WarningLevel>\n\t<NoWarn>0169</NoWarn>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n\t<DebugType>pdbonly</DebugType>\n\t<Optimize>true</Optimize>\n\t<OutputPath>Temp\\bin\\Release\\</OutputPath>\n\t<ErrorReport>prompt</ErrorReport>\n\t<WarningLevel>4</WarningLevel>\n\t<NoWarn>0169</NoWarn>\n  </PropertyGroup>\n  <ItemGroup>\n\t<Reference Include=\"System\" />\n    <Reference Include=\"System.XML\" />\n\t<Reference Include=\"System.Core\" />\n\t<Reference Include=\"System.Xml.Linq\" />\n\t<Reference Include=\"UnityEngine\">\n\t  <HintPath>E:/gh/Unity5/Editor/Data/Managed/UnityEngine.dll</HintPath>\n\t</Reference>\n\t<Reference Include=\"UnityEditor\">\n\t  <HintPath>E:/gh/Unity5/Editor/Data/Managed/UnityEditor.dll</HintPath>\n\t</Reference>\n  </ItemGroup>\n  <ItemGroup>\n     <Compile Include=\"Assets\\shaders\\Bundle.js\" />\n     <None Include=\"Assets\\shaders\\DecodedToFloat.shader\" />\n     <None Include=\"Assets\\shaders\\customDepthTexture.shader\" />\n     <None Include=\"Assets\\shaders\\noiseSimplex.cginc\" />\n     <None Include=\"Assets\\shaders\\cubeMap.cginc\" />\n     <None Include=\"Assets\\shaders\\EVE\\old\\EVEUtils.cginc\" />\n     <None Include=\"Assets\\shaders\\PQSScattererLightTest.shader\" />\n     <None Include=\"Assets\\shaders\\ShadowVolumeDepth.shader\" />\n     <None Include=\"Assets\\shaders\\ReplacedShaders\\PQSProjectionAerialQuadRelative.shader\" />\n     <None Include=\"Assets\\shaders\\InitDisplacement.shader\" />\n     <None Include=\"Assets\\shaders\\EVE\\old\\cubeMap.cginc\" />\n     <None Include=\"Assets\\shaders\\OceanLight.cginc\" />\n     <None Include=\"Assets\\shaders\\SimpleBlit.shader\" />\n     <None Include=\"Assets\\shaders\\EVE\\old\\noiseSimplex.cginc\" />\n     <None Include=\"Assets\\shaders\\EVE\\old\\CloudVolumeParticle.shader\" />\n     <None Include=\"Assets\\shaders\\Fourier.shader\" />\n     <None Include=\"Assets\\shaders\\SkyScaledBoxScaled.shader\" />\n     <None Include=\"Assets\\shaders\\WriteToFloat.shader\" />\n     <None Include=\"Assets\\shaders\\ReplacedShaders\\PQSMainShader.shader\" />\n     <None Include=\"Assets\\shaders\\SphereCloudOld.shader\" />\n     <None Include=\"Assets\\shaders\\ReplacedShaders\\PQSProjectionSurfaceQuad.shader\" />\n     <None Include=\"Assets\\shaders\\EVE\\old\\SphereCloud.shader\" />\n     <None Include=\"Assets\\shaders\\ReplacedShaders\\PQSMainOptimised.shader\" />\n     <None Include=\"Assets\\shaders\\ReplacedShaders\\PQSMainOptimisedScatterer.shader\" />\n     <None Include=\"Assets\\shaders\\InitSpectrum.shader\" />\n     <None Include=\"Assets\\shaders\\EVEUtils.cginc\" />\n     <None Include=\"Assets\\shaders\\ShadowVolumeDepthAdditive.shader\" />\n     <None Include=\"Assets\\shaders\\EVE\\old\\SphereCloudOld.shader\" />\n     <None Include=\"Assets\\shaders\\atmosphereGhoss 24 bit depth buffer.shader\" />\n     <None Include=\"Assets\\shaders\\OceanDisplacement3.cginc\" />\n     <None Include=\"Assets\\shaders\\OceanWhiteCapsModProj3PixelLights.shader\" />\n     <None Include=\"Assets\\shaders\\EVE\\old\\alphaMap.cginc\" />\n     <None Include=\"Assets\\shaders\\OceanBRDF.cginc\" />\n     <None Include=\"Assets\\shaders\\WhiteCapsPrecompute0.shader\" />\n     <None Include=\"Assets\\shaders\\AtmosphereScatterer.cginc\" />\n     <None Include=\"Assets\\shaders\\AtmosphereNew.cginc\" />\n     <None Include=\"Assets\\shaders\\SunGlare.shader\" />\n     <None Include=\"Assets\\shaders\\atmosphereGhoss 24 bit depth buffer AdditiveGodrays.shader\" />\n     <None Include=\"Assets\\shaders\\SkyScaledBox.shader\" />\n     <None Include=\"Assets\\shaders\\alphaMap.cginc\" />\n     <None Include=\"Assets\\shaders\\ReplacedShaders\\PQSProjectionSurfaceQuadScatterer.shader\" />\n     <None Include=\"Assets\\shaders\\OceanWhiteCapsModProj3.shader\" />\n     <None Include=\"Assets\\shaders\\AccumulateExposure.shader\" />\n     <None Include=\"Assets\\shaders\\SphereCloud.shader\" />\n     <None Include=\"Assets\\shaders\\InitJacobians.shader\" />\n     <None Include=\"Assets\\shaders\\CloudVolumeParticle.shader\" />\n     <None Include=\"Assets\\shaders\\Utility.cginc\" />\n <Reference Include=\"UnityEngine.UI\">\n <HintPath>E:/gh/Unity5/Editor/Data/UnityExtensions/Unity/GUISystem/UnityEngine.UI.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEngine.Networking\">\n <HintPath>E:/gh/Unity5/Editor/Data/UnityExtensions/Unity/Networking/UnityEngine.Networking.dll</HintPath>\n </Reference>\n <Reference Include=\"Mono.Cecil\">\n <HintPath>E:/gh/Unity5/Editor/Data/Managed/Mono.Cecil.dll</HintPath>\n </Reference>\n <Reference Include=\"UnityEditor.iOS.Extensions.Xcode\">\n <HintPath>E:/gh/Unity5/Editor/Data/PlaybackEngines/iOSSupport/UnityEditor.iOS.Extensions.Xcode.dll</HintPath>\n </Reference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n\t   Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n  \n</Project>\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/AssetBundles/AssetBundles.meta",
    "content": "fileFormatVersion: 2\nguid: fb1eb8dd5509788428a96514cc36f0d0\ntimeCreated: 1520625575\nlicenseType: Free\nDefaultImporter:\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/AssetBundles.meta",
    "content": "fileFormatVersion: 2\nguid: 5d4d7b45df12a6845beb7d6a034a41a2\nfolderAsset: yes\ntimeCreated: 1520623653\nlicenseType: Free\nDefaultImporter:\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Editor/ExportAssetBundle.cs",
    "content": "﻿using UnityEditor;\nusing UnityEngine;\nusing System;\nusing System.Linq;\nusing System.IO;\nusing System.Collections;\n\nnamespace scattererShaders\n{\n\n\tpublic class CreateAssetBundles\n\t{\n\t\t[MenuItem (\"Assets/Build AssetBundles for release\")]\n\t\tstatic void BuildAllAssetBundles ()\n\t\t{\n\t\t\tBuildTarget[] platforms = { BuildTarget.StandaloneWindows, BuildTarget.StandaloneOSX, BuildTarget.StandaloneLinux64 };\n\t\t\tstring[] platformExts = { \"-windows\", \"-macosx\", \"-linux\" };\n\n\t\t\tBuildBundles(platforms, platformExts);\n\t\t}\n\n\t\t[MenuItem (\"Assets/Build AssetBundles for local openGL\")]\n\t\tstatic void BuildOpenGL ()\n\t\t{\n\t\t\tBuildTarget[] platforms = {BuildTarget.StandaloneLinux64};\n\t\t\tstring[] platformExts = { \"-linux\"};\n\n\t\t\tBuildBundles(platforms, platformExts);\n\t\t}\n\n\t\t[MenuItem (\"Assets/Build AssetBundles for local dx11\")]\n\t\tstatic void BuildDx11 ()\n\t\t{\n\t\t\tBuildTarget[] platforms = {BuildTarget.StandaloneWindows};\n\t\t\tstring[] platformExts = { \"-windows\"};\n\n\t\t\tBuildBundles(platforms, platformExts);\n\t\t}\n\n\n\t\tstatic void BuildBundles (BuildTarget[] platforms, string[] platformExts)\n\t\t{\n\t\t\t// Put the bundles in a folder called \"AssetBundles\"\n\t\t\t//var outDir = \"Assets/AssetBundles\";\n\t\t\tvar outDir = \"C:/Steam/steamapps/common/Kerbal Space Program/GameData/scatterer/shaders\";\n\t\t\tvar outDir2 = \"C:/Steam/steamapps/common/Kerbal Space Program 1.9/GameData/scatterer/shaders\";\n\n\t\t\tif (!Directory.Exists (outDir))\n\t\t\t\tDirectory.CreateDirectory (outDir);\n\n\t\t\tif (!Directory.Exists (outDir2))\n\t\t\t\tDirectory.CreateDirectory (outDir2);\n\n\t\t\tvar opts = BuildAssetBundleOptions.DeterministicAssetBundle | BuildAssetBundleOptions.ForceRebuildAssetBundle;\n\n\t\t\tfor (var i = 0; i < platforms.Length; ++i)\n\t\t\t{\n\t\t\t\tBuildPipeline.BuildAssetBundles(outDir, opts, platforms[i]);\n\t\t\t\tvar outFile  = outDir  + \"/scatterershaders\" + platformExts[i];\n\t\t\t\tvar outFile2 = outDir2 + \"/scatterershaders\" + platformExts[i];\n\t\t\t\tFileUtil.ReplaceFile(outDir  + \"/scatterershaders\", outFile);\n\t\t\t\tFileUtil.ReplaceFile(outDir  + \"/scatterershaders\", outFile2);\n\t\t\t}\n\n\t\t\t//cleanup\n\t\t\tforeach (string file in Directory.GetFiles(outDir, \"*.*\").Where(item => (item.EndsWith(\".meta\") || item.EndsWith(\".manifest\"))))\n\t\t\t{\n\t\t\t\tFile.Delete(file);\n\t\t\t}\n\t\t\tFile.Delete (outDir + \"/CompiledAssetBundles\");\n\t\t\tFile.Delete(outDir+\"/scatterershaders\");\n\t\t\tFile.Delete(outDir+\"/shaders\");\n\t\t}\n\t}\n\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Editor/ExportAssetBundle.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 661266b8a30572e4fb9365bba3866896\ntimeCreated: 1474706063\nlicenseType: Free\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Editor/KSPCurveEditor.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing UnityEditorInternal;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace MuMech\n{\n\n    public class KSPCurveEditor : EditorWindow\n    {\n        [MenuItem(\"KSP/Curve Editor\")]\n        static void Init()\n        {\n            EditorWindow.GetWindow(typeof(KSPCurveEditor));\n        }\n\n        AnimationCurve curve = new AnimationCurve();\n        Vector2 scrollPos = new Vector2();\n        string textVersion;\n        List<FloatString4> points = new List<FloatString4>();\n        bool curveNeedsUpdate = false, textChanged = false;\n        float lastCurve = 0;\n\n        void OnGUI()\n        {\n            textChanged = false;\n\n            GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true), GUILayout.Height(50));\n            EditorGUILayout.LabelField(\"Click curve to edit ->\", GUILayout.ExpandWidth(false));\n            curve = EditorGUILayout.CurveField(curve, GUILayout.ExpandWidth(true), GUILayout.ExpandHeight(true));\n            GUILayout.EndHorizontal();\n\n            string newT = EditorGUILayout.TextArea(textVersion, GUILayout.ExpandWidth(true), GUILayout.Height(100));\n            if (newT != textVersion)\n            {\n                textVersion = newT;\n                textChanged = true;\n            }\n\n            scrollPos = EditorGUILayout.BeginScrollView(scrollPos, GUILayout.ExpandWidth(true), GUILayout.ExpandHeight(true));\n            GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));\n\n            GUILayout.BeginVertical();\n            GUILayout.Label(\"X\", GUILayout.ExpandWidth(true));\n            foreach (FloatString4 p in points)\n            {\n                string ns = EditorGUILayout.TextField(p.strings[0]);\n                if (ns != p.strings[0])\n                {\n                    p.strings[0] = ns;\n                    p.UpdateFloats();\n                    curveNeedsUpdate = true;\n                }\n\n            }\n            GUILayout.EndVertical();\n\n            GUILayout.BeginVertical();\n            GUILayout.Label(\"Y\", GUILayout.ExpandWidth(true));\n            foreach (FloatString4 p in points)\n            {\n                string ns = EditorGUILayout.TextField(p.strings[1]);\n                if (ns != p.strings[1])\n                {\n                    p.strings[1] = ns;\n                    p.UpdateFloats();\n                    curveNeedsUpdate = true;\n                }\n\n            }\n            GUILayout.EndVertical();\n\n            GUILayout.BeginVertical();\n            GUILayout.Label(\"Auto\", GUILayout.ExpandWidth(true));\n            foreach (FloatString4 p in points)\n            {\n                bool a = EditorGUILayout.Toggle(p.twoMode);\n                if (a != p.twoMode)\n                {\n                    p.twoMode = a;\n                    curveNeedsUpdate = true;\n                }\n\n            }\n            GUILayout.EndVertical();\n\n            GUILayout.BeginVertical();\n            GUILayout.Label(\"In Tangent\", GUILayout.ExpandWidth(true));\n            foreach (FloatString4 p in points)\n            {\n                if (!p.twoMode)\n                {\n                    string ns = EditorGUILayout.TextField(p.strings[2]);\n                    if (ns != p.strings[2])\n                    {\n                        p.strings[2] = ns;\n                        p.UpdateFloats();\n                        curveNeedsUpdate = true;\n                    }\n                }\n                else\n                {\n                    EditorGUILayout.TextField(\"\");\n                }\n            }\n            GUILayout.EndVertical();\n\n            GUILayout.BeginVertical();\n            GUILayout.Label(\"Out Tangent\", GUILayout.ExpandWidth(true));\n            foreach (FloatString4 p in points)\n            {\n                if (!p.twoMode)\n                {\n                    string ns = EditorGUILayout.TextField(p.strings[3]);\n                    if (ns != p.strings[3])\n                    {\n                        p.strings[3] = ns;\n                        p.UpdateFloats();\n                        curveNeedsUpdate = true;\n                    }\n                }\n                else\n                {\n                    EditorGUILayout.TextField(\"\");\n                }\n            }\n            GUILayout.EndVertical();\n\n            GUILayout.EndHorizontal();\n            EditorGUILayout.EndScrollView();\n        }\n\n        static float HashAnimationCurve(AnimationCurve c)\n        {\n            float h = 0;\n\n            foreach (Keyframe k in c.keys)\n            {\n                h += k.time + k.value + k.inTangent + k.outTangent + k.tangentMode;\n            }\n\n            return h;\n        }\n\n        void Update()\n        {\n            if (textChanged)\n            {\n                StringToCurve(textVersion);\n            }\n\n            if (curveNeedsUpdate)\n            {\n                UpdateCurve();\n            }\n\n            float newCurve = HashAnimationCurve(curve);\n            if (lastCurve != newCurve)\n            {\n                points = new List<FloatString4>();\n\n                for (int i = 0; i < curve.keys.Length; i++)\n                {\n                    FloatString4 nv = new FloatString4(curve.keys[i].time, curve.keys[i].value, curve.keys[i].inTangent, curve.keys[i].outTangent, (curve.keys[i].tangentMode == 10));\n                    nv.UpdateStrings();\n                    points.Add(nv);\n                }\n\n                if (!textChanged)\n                {\n                    textVersion = CurveToString();\n                }\n\n                lastCurve = newCurve;\n            }\n        }\n\n        string CurveToString()\n        {\n            string buff = \"\";\n            foreach (FloatString4 p in points)\n            {\n                if (p.twoMode)\n                {\n                    buff += \"key = \" + p.floats.x + \" \" + p.floats.y + \"\\n\";\n                }\n                else\n                {\n                    buff += \"key = \" + p.floats.x + \" \" + p.floats.y + \" \" + p.floats.z + \" \" + p.floats.w + \"\\n\";\n                }\n            }\n            return buff;\n        }\n\n        void StringToCurve(string data)\n        {\n            points = new List<FloatString4>();\n\n            string[] lines = data.Split('\\n');\n            foreach (string line in lines)\n            {\n                string[] pcs = line.Split(new char[] { '=', ' ' }, StringSplitOptions.RemoveEmptyEntries);\n                if ((pcs.Length >= 3) && (pcs[0] == \"key\"))\n                {\n                    FloatString4 nv = new FloatString4();\n                    if (pcs.Length >= 5)\n                    {\n                        nv.strings = new string[] { pcs[1], pcs[2], pcs[3], pcs[4] };\n                        nv.twoMode = false;\n                    }\n                    else\n                    {\n                        nv.strings = new string[] { pcs[1], pcs[2], \"0\", \"0\" };\n                        nv.twoMode = true;\n                    }\n                    nv.UpdateFloats();\n                    points.Add(nv);\n                }\n            }\n\n            if (!textChanged)\n            {\n                textVersion = CurveToString();\n            }\n\n            curveNeedsUpdate = true;\n        }\n\n        void UpdateCurve()\n        {\n            points.Sort();\n\n            curve = new AnimationCurve();\n\n            foreach (FloatString4 v in points)\n            {\n                Keyframe k = new Keyframe(v.floats.x, v.floats.y, v.floats.z, v.floats.w);\n                if (v.twoMode)\n                {\n                    k.tangentMode = 10;\n                }\n                else\n                {\n                    k.tangentMode = 1;\n                }\n                curve.AddKey(k);\n            }\n\n            for (int i = 0; i < curve.keys.Length; i++)\n            {\n                if (points[i].twoMode)\n                {\n                    curve.SmoothTangents(i, 0);\n                }\n            }\n\n            if (!textChanged)\n            {\n                textVersion = CurveToString();\n            }\n\n            lastCurve = HashAnimationCurve(curve);\n            curveNeedsUpdate = false;\n        }\n    }\n\n    public class FloatString4 : IComparable<FloatString4>\n    {\n        public Vector4 floats;\n        public string[] strings;\n        public bool twoMode;\n\n        public int CompareTo(FloatString4 other)\n        {\n            if (other == null) return 1;\n            return floats.x.CompareTo(other.floats.x);\n        }\n\n        public FloatString4()\n        {\n            floats = new Vector4();\n            strings = new string[] { \"0\", \"0\", \"0\", \"0\" };\n            twoMode = false;\n        }\n\n        public FloatString4(float x, float y, float z = 0, float w = 0, bool twoMode = true)\n        {\n            floats = new Vector4(x, y, z, w);\n            this.twoMode = twoMode;\n            UpdateStrings();\n        }\n\n        public void UpdateFloats()\n        {\n            float x, y, z, w;\n            float.TryParse(strings[0], out x);\n            float.TryParse(strings[1], out y);\n            float.TryParse(strings[2], out z);\n            float.TryParse(strings[3], out w);\n            floats = new Vector4(x, y, z, w);\n        }\n\n        public void UpdateStrings()\n        {\n            strings = new string[] { floats.x.ToString(), floats.y.ToString(), floats.z.ToString(), floats.w.ToString() };\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Editor/KSPCurveEditor.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 63cd91d36b6b0e4479ef6e61ad4f6f9a\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Editor.meta",
    "content": "fileFormatVersion: 2\nguid: 98bf0690f0c9686468d3866e3c0e5e45\nfolderAsset: yes\ntimeCreated: 1520625078\nlicenseType: Free\nDefaultImporter:\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/AA/AreaTex.tga.meta",
    "content": "fileFormatVersion: 2\nguid: b7c13973a7ed1444fb514d09b5e7e579\nTextureImporter:\n  internalIDToNameTable: []\n  externalObjects: {}\n  serializedVersion: 10\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 0\n    sRGBTexture: 0\n    linearTexture: 1\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapsPreserveCoverage: 0\n    alphaTestReferenceValue: 0.5\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: 0.25\n    normalMapFilter: 0\n  isReadable: 0\n  streamingMipmaps: 0\n  streamingMipmapsPriority: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 6\n  cubemapConvolution: 0\n  seamlessCubemap: 0\n  textureFormat: -3\n  maxTextureSize: 2048\n  textureSettings:\n    serializedVersion: 2\n    filterMode: 1\n    aniso: 0\n    mipBias: -100\n    wrapU: 1\n    wrapV: 1\n    wrapW: 1\n  nPOTScale: 0\n  lightmap: 0\n  compressionQuality: 50\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: 0.5, y: 0.5}\n  spritePixelsToUnits: 100\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spriteGenerateFallbackPhysicsShape: 1\n  alphaUsage: 0\n  alphaIsTransparency: 0\n  spriteTessellationDetail: -1\n  textureType: 0\n  textureShape: 1\n  singleChannelComponent: 0\n  maxTextureSizeSet: 0\n  compressionQualitySet: 0\n  textureFormatSet: 0\n  platformSettings:\n  - serializedVersion: 3\n    buildTarget: DefaultTexturePlatform\n    maxTextureSize: 2048\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 0\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 1\n  - serializedVersion: 3\n    buildTarget: Standalone\n    maxTextureSize: 2048\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 0\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 1\n  - serializedVersion: 3\n    buildTarget: iPhone\n    maxTextureSize: 2048\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 0\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 1\n  - serializedVersion: 3\n    buildTarget: Android\n    maxTextureSize: 2048\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 0\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 1\n  - serializedVersion: 3\n    buildTarget: WebGL\n    maxTextureSize: 2048\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 0\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 1\n  - serializedVersion: 3\n    buildTarget: PS4\n    maxTextureSize: 2048\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 0\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 1\n  spriteSheet:\n    serializedVersion: 2\n    sprites: []\n    outline: []\n    physicsShape: []\n    bones: []\n    spriteID: \n    internalID: 0\n    vertices: []\n    indices: \n    edges: []\n    weights: []\n    secondaryTextures: []\n  spritePackingTag: \n  pSDRemoveMatte: 0\n  pSDShowRemoveMatteOption: 0\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/AA/CustomTAA.shader",
    "content": "﻿// Modified TAA shader to not blur out the scatterer ocean\n\nShader \"Scatterer/TemporalAntialiasing\" {\n\tSubShader {\n\t\tTags {\"Queue\" = \"Transparent-499\" \"IgnoreProjector\" = \"True\" \"RenderType\" = \"Transparent\"}\n\n\t\tPass {\n\t\t\tTags {\"Queue\" = \"Transparent-499\" \"IgnoreProjector\" = \"True\" \"RenderType\" = \"Transparent\"}\n\n\t\t\tCull Off\n\t\t\tZTest Off\n\t\t\tZWrite Off\n\n\t\t\tBlend SrcAlpha OneMinusSrcAlpha\n\n\t\t\tCGPROGRAM\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\t\t\t#pragma target 3.0\n\t\t\t#include \"UnityCG.cginc\"\n\n\t\t\t#pragma multi_compile CUSTOM_OCEAN_OFF CUSTOM_OCEAN_ON\n\n\t\t\tsampler2D _ScreenColor;\n\t\t\tfloat4 _ScreenColor_TexelSize;\n\n\t\t\tsampler2D _HistoryTex;\n\n\t\t\tsampler2D _CameraDepthTexture;\n\t\t\tfloat4 _CameraDepthTexture_TexelSize;\n\n\t\t\tsampler2D _CameraMotionVectorsTexture;\n\n#if defined (CUSTOM_OCEAN_ON)\n\t\t\tuniform sampler2D ScattererDepthCopy;\n#endif\n\n\t\t\tfloat2 _Jitter;\n\t\t\tfloat4 _FinalBlendParameters; // x: static, y: dynamic, z: motion amplification\n\t\t\tfloat _Sharpness;\n\n\t\t\t// Constants\n\t\t\t#define HALF_MAX        65504.0 // (2 - 2^-10) * 2^15\n\t\t\t#define HALF_MAX_MINUS1 65472.0 // (2 - 2^-9) * 2^15\n\t\t\t#define EPSILON         1.0e-4\n\t\t\t#define PI              3.14159265359\n\t\t\t#define TWO_PI          6.28318530718\n\t\t\t#define FOUR_PI         12.56637061436\n\t\t\t#define INV_PI          0.31830988618\n\t\t\t#define INV_TWO_PI      0.15915494309\n\t\t\t#define INV_FOUR_PI     0.07957747155\n\t\t\t#define HALF_PI         1.57079632679\n\t\t\t#define INV_HALF_PI     0.636619772367\n\n\t\t\t#define FLT_EPSILON     1.192092896e-07 // Smallest positive number, such that 1.0 + FLT_EPSILON != 1.0\n\t\t\t#define FLT_MIN         1.175494351e-38 // Minimum representable positive floating-point number\n\t\t\t#define FLT_MAX         3.402823466e+38 // Maximum representable floating-point number\n\n\t\t\tstruct v2f\n\t\t\t{\n\t\t\t\tfloat4 pos : SV_POSITION;\n\t\t\t\tfloat4 screenPos : TEXCOORD0;\n\n\t\t\t};\n\t\t\tv2f vert (appdata_base v)\n\t\t\t{\n\t\t\t\tv2f o;\n\t\t\t\to.pos = UnityObjectToClipPos(v.vertex);\n\t\t\t\to.screenPos = ComputeScreenPos(o.pos);\n\n\t\t\t\treturn o;\n\t\t\t}\n\n\t\t\tfloat2 GetClosestFragment(float2 uv)\n\t\t\t{\n\t\t\t\tfloat2 k = _CameraDepthTexture_TexelSize.xy;\n\n\t\t\t\tfloat4 neighborhood = float4(\n\t\t\t\t\ttex2D(_CameraDepthTexture, uv - k).r,\n\t\t\t\t\ttex2D(_CameraDepthTexture, uv + float2(k.x, -k.y)).r,\n\t\t\t\t\ttex2D(_CameraDepthTexture, uv + float2(-k.x, k.y)).r,\n\t\t\t\t\ttex2D(_CameraDepthTexture, uv + k).r\n\t\t\t\t);\n\n\t\t\t\t#if SHADER_API_D3D11\n\t\t\t\t#define COMPARE_DEPTH(a, b) step(b, a)\n\t\t\t\t#else\n\t\t\t\t#define COMPARE_DEPTH(a, b) step(a, b)\n\t\t\t\t#endif\n\n\t\t\t\tfloat3 result = float3(0.0, 0.0, SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv));\n\t\t\t\tresult = lerp(result, float3(-1.0, -1.0, neighborhood.x), COMPARE_DEPTH(neighborhood.x, result.z));\n\t\t\t\tresult = lerp(result, float3( 1.0, -1.0, neighborhood.y), COMPARE_DEPTH(neighborhood.y, result.z));\n\t\t\t\tresult = lerp(result, float3(-1.0,  1.0, neighborhood.z), COMPARE_DEPTH(neighborhood.z, result.z));\n\t\t\t\tresult = lerp(result, float3( 1.0,  1.0, neighborhood.w), COMPARE_DEPTH(neighborhood.w, result.z));\n\n\t\t\t\treturn (uv + result.xy * k);\n\t\t\t}\n\n\t\t\tfloat3 Min3(float3 a, float3 b, float3 c)\n\t\t\t{\n\t\t\t\treturn min(min(a, b), c);\n\t\t\t}\n\n\t\t\tfloat4 ClipToAABB(float4 color, float3 minimum, float3 maximum)\n\t\t\t{\n\t\t\t\t// Note: only clips towards aabb center (but fast!)\n\t\t\t\tfloat3 center = 0.5 * (maximum + minimum);\n\t\t\t\tfloat3 extents = 0.5 * (maximum - minimum);\n\n\t\t\t\t// This is actually `distance`, however the keyword is reserved\n\t\t\t\tfloat3 offset = color.rgb - center;\n\n\t\t\t\tfloat3 ts = abs(extents / (offset + 0.0001));\n\t\t\t\tfloat t = saturate(Min3(ts.x, ts.y, ts.z));\n\t\t\t\tcolor.rgb = center + offset * t;\n\t\t\t\treturn color;\n\t\t\t}\n\n\t\t\tfloat4 Solve(float2 motion, float2 texcoord)\n\t\t\t{\n\t\t\t\tconst float2 k = _ScreenColor_TexelSize.xy;\n\t\t\t\tfloat2 uv = texcoord - _Jitter;\n\n\t\t\t\tfloat4 color = tex2Dlod(_ScreenColor, float4(uv,0.0,0.0));\n\n\t\t\t\tfloat4 topLeft = tex2D(_ScreenColor, (uv - k * 0.5));\n\t\t\t\tfloat4 bottomRight = tex2D(_ScreenColor, (uv + k * 0.5));\n\n\t\t\t\tfloat4 corners = 4.0 * (topLeft + bottomRight) - 2.0 * color;\n\n\t\t\t\t// Sharpen output\n\t\t\t\tcolor += (color - (corners * 0.166667)) * 2.718282 * _Sharpness;\n\t\t\t\tcolor = clamp(color, 0.0, HALF_MAX_MINUS1);\n\n\t\t\t\t// Tonemap color and history samples\n\t\t\t\tfloat4 average = (corners + color) * 0.142857;\n\n\t\t\t\tfloat4 history = tex2D(_HistoryTex, texcoord - motion);\n\n\t\t\t\tfloat motionLength = length(motion);\n\t\t\t\tfloat2 luma = float2(Luminance(average), Luminance(color));\n\t\t\t\t//float nudge = 4.0 * abs(luma.x - luma.y);\n\t\t\t\tfloat nudge = lerp(4.0, 0.25, saturate(motionLength * 100.0)) * abs(luma.x - luma.y);\n\n\t\t\t\tfloat4 minimum = min(bottomRight, topLeft) - nudge;\n\t\t\t\tfloat4 maximum = max(topLeft, bottomRight) + nudge;\n\n\t\t\t\t// Clip history samples\n\t\t\t\thistory = ClipToAABB(history, minimum.xyz, maximum.xyz);\n\n\t\t\t\t// Blend method\n\t\t\t\tfloat weight = clamp(\n\t\t\t\t\tlerp(_FinalBlendParameters.x, _FinalBlendParameters.y, motionLength * _FinalBlendParameters.z),\n\t\t\t\t\t_FinalBlendParameters.y, _FinalBlendParameters.x\n\t\t\t\t);\n\n#if defined (CUSTOM_OCEAN_ON)\n\t\t\t\tfloat oceanDepth = tex2Dlod(ScattererDepthCopy, float4(uv,0,0));\n\t\t\t\tfloat zdepth = tex2Dlod(_CameraDepthTexture, float4(uv,0,0));\n\n\t\t\t\tif (oceanDepth != zdepth)\n\t\t\t\t{\t\t\t\t\t\n\t\t\t\t\tweight*= 0.35; //seems to be the best of both worlds, still antialiases but doesn't blur the ocean much\n\t\t\t\t}\n#endif\n\n\t\t\t\tcolor = lerp(color, history, weight);\n\t\t\t\tcolor = clamp(color, 0.0, HALF_MAX_MINUS1);\n\n\t\t\t\treturn color;\n\t\t\t}\n\n\t\t\tfloat4 frag(v2f i) : SV_Target\n\t\t\t{\n\t\t\t\tfloat2 uv = i.screenPos.xy / i.screenPos.w;\n\n#if SHADER_API_D3D11 || SHADER_API_D3D || SHADER_API_D3D12\n\t\t\t\tif (_ProjectionParams.x > 0) {uv.y = 1.0 - uv.y;}\n#endif\n\t\t\t\tfloat2 closest = GetClosestFragment(uv);\n\t\t\t\tfloat2 motion = tex2Dlod(_CameraMotionVectorsTexture, float4(closest,0.0,0.0)).xy;\n\n\t\t\t\treturn Solve(motion, uv);\n\t\t\t}\n\t\t\tENDCG\n\t\t}\n\t}\n\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/AA/CustomTAA.shader.meta",
    "content": "fileFormatVersion: 2\nguid: ad09d3e70e7b09244b56b51e495a319c\nShaderImporter:\n  externalObjects: {}\n  defaultTextures: []\n  nonModifiableTextures: []\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/AA/SMAA.cginc",
    "content": "﻿// Ported to Unity & tweaked by Thomas Hourdel (thomas@hourdel.com)\n//#include \"Colors.hlsl\"\n\n/**\n * Copyright (C) 2013 Jorge Jimenez (jorge@iryoku.com)\n * Copyright (C) 2013 Jose I. Echevarria (joseignacioechevarria@gmail.com)\n * Copyright (C) 2013 Belen Masia (bmasia@unizar.es)\n * Copyright (C) 2013 Fernando Navarro (fernandn@microsoft.com)\n * Copyright (C) 2013 Diego Gutierrez (diegog@unizar.es)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\n * of the Software, and to permit persons to whom the Software is furnished to\n * do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software. As clarification, there\n * is no requirement that the copyright notice and permission be included in\n * binary distributions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n\n/**\n *                  _______  ___  ___       ___           ___\n *                 /       ||   \\/   |     /   \\         /   \\\n *                |   (---- |  \\  /  |    /  ^  \\       /  ^  \\\n *                 \\   \\    |  |\\/|  |   /  /_\\  \\     /  /_\\  \\\n *              ----)   |   |  |  |  |  /  _____  \\   /  _____  \\\n *             |_______/    |__|  |__| /__/     \\__\\ /__/     \\__\\\n *\n *                               E N H A N C E D\n *       S U B P I X E L   M O R P H O L O G I C A L   A N T I A L I A S I N G\n *\n *                         http://www.iryoku.com/smaa/\n *\n * Hi, welcome aboard!\n *\n * Here you'll find instructions to get the shader up and running as fast as\n * possible.\n *\n * IMPORTANTE NOTICE: when updating, remember to update both this file and the\n * precomputed textures! They may change from version to version.\n *\n * The shader has three passes, chained together as follows:\n *\n *                           |input|------------------�\n *                              v                     |\n *                    [ SMAA*EdgeDetection ]          |\n *                              v                     |\n *                          |edgesTex|                |\n *                              v                     |\n *              [ SMAABlendingWeightCalculation ]     |\n *                              v                     |\n *                          |blendTex|                |\n *                              v                     |\n *                [ SMAANeighborhoodBlending ] <------�\n *                              v\n *                           |output|\n *\n * Note that each [pass] has its own vertex and pixel shader. Remember to use\n * oversized triangles instead of quads to avoid overshading along the\n * diagonal.\n *\n * You've three edge detection methods to choose from: luma, color or depth.\n * They represent different quality/performance and anti-aliasing/sharpness\n * tradeoffs, so our recommendation is for you to choose the one that best\n * suits your particular scenario:\n *\n * - Depth edge detection is usually the fastest but it may miss some edges.\n *\n * - Luma edge detection is usually more expensive than depth edge detection,\n *   but catches visible edges that depth edge detection can miss.\n *\n * - Color edge detection is usually the most expensive one but catches\n *   chroma-only edges.\n *\n * For quickstarters: just use luma edge detection.\n *\n * The general advice is to not rush the integration process and ensure each\n * step is done correctly (don't try to integrate SMAA T2x with predicated edge\n * detection from the start!). Ok then, let's go!\n *\n *  1. The first step is to create two RGBA temporal render targets for holding\n *     |edgesTex| and |blendTex|.\n *\n *     In DX10 or DX11, you can use a RG render target for the edges texture.\n *     In the case of NVIDIA GPUs, using RG render targets seems to actually be\n *     slower.\n *\n *     On the Xbox 360, you can use the same render target for resolving both\n *     |edgesTex| and |blendTex|, as they aren't needed simultaneously.\n *\n *  2. Both temporal render targets |edgesTex| and |blendTex| must be cleared\n *     each frame. Do not forget to clear the alpha channel!\n *\n *  3. The next step is loading the two supporting precalculated textures,\n *     'areaTex' and 'searchTex'. You'll find them in the 'Textures' folder as\n *     C++ headers, and also as regular DDS files. They'll be needed for the\n *     'SMAABlendingWeightCalculation' pass.\n *\n *     If you use the C++ headers, be sure to load them in the format specified\n *     inside of them.\n *\n *     You can also compress 'areaTex' and 'searchTex' using BC5 and BC4\n *     respectively, if you have that option in your content processor pipeline.\n *     When compressing then, you get a non-perceptible quality decrease, and a\n *     marginal performance increase.\n *\n *  4. All samplers must be set to linear filtering and clamp.\n *\n *     After you get the technique working, remember that 64-bit inputs have\n *     half-rate linear filtering on GCN.\n *\n *     If SMAA is applied to 64-bit color buffers, switching to point filtering\n *     when accesing them will increase the performance. Search for\n *     'SMAASamplePoint' to see which textures may benefit from point\n *     filtering, and where (which is basically the color input in the edge\n *     detection and resolve passes).\n *\n *  5. All texture reads and buffer writes must be non-sRGB, with the exception\n *     of the input read and the output write in\n *     'SMAANeighborhoodBlending' (and only in this pass!). If sRGB reads in\n *     this last pass are not possible, the technique will work anyway, but\n *     will perform antialiasing in gamma space.\n *\n *     IMPORTANT: for best results the input read for the color/luma edge\n *     detection should *NOT* be sRGB.\n *\n *  6. Before including SMAA.h you'll have to setup the render target metrics,\n *     the target and any optional configuration defines. Optionally you can\n *     use a preset.\n *\n *     You have the following targets available:\n *         SMAA_HLSL_3\n *         SMAA_HLSL_4\n *         SMAA_HLSL_4_1\n *         SMAA_GLSL_3 *\n *         SMAA_GLSL_4 *\n *\n *         * (See SMAA_INCLUDE_VS and SMAA_INCLUDE_PS below).\n *\n *     And four presets:\n *         SMAA_PRESET_LOW          (%60 of the quality)\n *         SMAA_PRESET_MEDIUM       (%80 of the quality)\n *         SMAA_PRESET_HIGH         (%95 of the quality)\n *         SMAA_PRESET_ULTRA        (%99 of the quality)\n *\n *     For example:\n *         #define SMAA_RT_METRICS float4(1.0 / 1280.0, 1.0 / 720.0, 1280.0, 720.0)\n *         #define SMAA_HLSL_4\n *         #define SMAA_PRESET_HIGH\n *         #include \"SMAA.h\"\n *\n *     Note that SMAA_RT_METRICS doesn't need to be a macro, it can be a\n *     uniform variable. The code is designed to minimize the impact of not\n *     using a constant value, but it is still better to hardcode it.\n *\n *     Depending on how you encoded 'areaTex' and 'searchTex', you may have to\n *     add (and customize) the following defines before including SMAA.h:\n *          #define SMAA_AREATEX_SELECT(sample) sample.rg\n *          #define SMAA_SEARCHTEX_SELECT(sample) sample.r\n *\n *     If your engine is already using porting macros, you can define\n *     SMAA_CUSTOM_SL, and define the porting functions by yourself.\n *\n *  7. Then, you'll have to setup the passes as indicated in the scheme above.\n *     You can take a look into SMAA.fx, to see how we did it for our demo.\n *     Checkout the function wrappers, you may want to copy-paste them!\n *\n *  8. It's recommended to validate the produced |edgesTex| and |blendTex|.\n *     You can use a screenshot from your engine to compare the |edgesTex|\n *     and |blendTex| produced inside of the engine with the results obtained\n *     with the reference demo.\n *\n *  9. After you get the last pass to work, it's time to optimize. You'll have\n *     to initialize a stencil buffer in the first pass (discard is already in\n *     the code), then mask execution by using it the second pass. The last\n *     pass should be executed in all pixels.\n *\n *\n * After this point you can choose to enable predicated thresholding,\n * temporal supersampling and motion blur integration:\n *\n * a) If you want to use predicated thresholding, take a look into\n *    SMAA_PREDICATION; you'll need to pass an extra texture in the edge\n *    detection pass.\n *\n * b) If you want to enable temporal supersampling (SMAA T2x):\n *\n * 1. The first step is to render using subpixel jitters. I won't go into\n *    detail, but it's as simple as moving each vertex position in the\n *    vertex shader, you can check how we do it in our DX10 demo.\n *\n * 2. Then, you must setup the temporal resolve. You may want to take a look\n *    into SMAAResolve for resolving 2x modes. After you get it working, you'll\n *    probably see ghosting everywhere. But fear not, you can enable the\n *    CryENGINE temporal reprojection by setting the SMAA_REPROJECTION macro.\n *    Check out SMAA_DECODE_VELOCITY if your velocity buffer is encoded.\n *\n * 3. The next step is to apply SMAA to each subpixel jittered frame, just as\n *    done for 1x.\n *\n * 4. At this point you should already have something usable, but for best\n *    results the proper area textures must be set depending on current jitter.\n *    For this, the parameter 'subsampleIndices' of\n *    'SMAABlendingWeightCalculationPS' must be set as follows, for our T2x\n *    mode:\n *\n *    @SUBSAMPLE_INDICES\n *\n *    | S# |  Camera Jitter   |  subsampleIndices    |\n *    +----+------------------+---------------------+\n *    |  0 |  ( 0.25, -0.25)  |  float4(1, 1, 1, 0)  |\n *    |  1 |  (-0.25,  0.25)  |  float4(2, 2, 2, 0)  |\n *\n *    These jitter positions assume a bottom-to-top y axis. S# stands for the\n *    sample number.\n *\n * More information about temporal supersampling here:\n *    http://iryoku.com/aacourse/downloads/13-Anti-Aliasing-Methods-in-CryENGINE-3.pdf\n *\n * c) If you want to enable spatial multisampling (SMAA S2x):\n *\n * 1. The scene must be rendered using MSAA 2x. The MSAA 2x buffer must be\n *    created with:\n *      - DX10:     see below (*)\n *      - DX10.1:   D3D10_STANDARD_MULTISAMPLE_PATTERN or\n *      - DX11:     D3D11_STANDARD_MULTISAMPLE_PATTERN\n *\n *    This allows to ensure that the subsample order matches the table in\n *    @SUBSAMPLE_INDICES.\n *\n *    (*) In the case of DX10, we refer the reader to:\n *      - SMAA::detectMSAAOrder and\n *      - SMAA::msaaReorder\n *\n *    These functions allow to match the standard multisample patterns by\n *    detecting the subsample order for a specific GPU, and reordering\n *    them appropriately.\n *\n * 2. A shader must be run to output each subsample into a separate buffer\n *    (DX10 is required). You can use SMAASeparate for this purpose, or just do\n *    it in an existing pass (for example, in the tone mapping pass, which has\n *    the advantage of feeding tone mapped subsamples to SMAA, which will yield\n *    better results).\n *\n * 3. The full SMAA 1x pipeline must be run for each separated buffer, storing\n *    the results in the final buffer. The second run should alpha blend with\n *    the existing final buffer using a blending factor of 0.5.\n *    'subsampleIndices' must be adjusted as in the SMAA T2x case (see point\n *    b).\n *\n * d) If you want to enable temporal supersampling on top of SMAA S2x\n *    (which actually is SMAA 4x):\n *\n * 1. SMAA 4x consists on temporally jittering SMAA S2x, so the first step is\n *    to calculate SMAA S2x for current frame. In this case, 'subsampleIndices'\n *    must be set as follows:\n *\n *    | F# | S# |   Camera Jitter    |    Net Jitter     |   subsampleIndices   |\n *    +----+----+--------------------+-------------------+----------------------+\n *    |  0 |  0 |  ( 0.125,  0.125)  |  ( 0.375, -0.125) |  float4(5, 3, 1, 3)  |\n *    |  0 |  1 |  ( 0.125,  0.125)  |  (-0.125,  0.375) |  float4(4, 6, 2, 3)  |\n *    +----+----+--------------------+-------------------+----------------------+\n *    |  1 |  2 |  (-0.125, -0.125)  |  ( 0.125, -0.375) |  float4(3, 5, 1, 4)  |\n *    |  1 |  3 |  (-0.125, -0.125)  |  (-0.375,  0.125) |  float4(6, 4, 2, 4)  |\n *\n *    These jitter positions assume a bottom-to-top y axis. F# stands for the\n *    frame number. S# stands for the sample number.\n *\n * 2. After calculating SMAA S2x for current frame (with the new subsample\n *    indices), previous frame must be reprojected as in SMAA T2x mode (see\n *    point b).\n *\n * e) If motion blur is used, you may want to do the edge detection pass\n *    together with motion blur. This has two advantages:\n *\n * 1. Pixels under heavy motion can be omitted from the edge detection process.\n *    For these pixels we can just store \"no edge\", as motion blur will take\n *    care of them.\n * 2. The center pixel tap is reused.\n *\n * Note that in this case depth testing should be used instead of stenciling,\n * as we have to write all the pixels in the motion blur pass.\n *\n * That's it!\n */\n\n//-----------------------------------------------------------------------------\n// SMAA Presets\n\n/**\n * Note that if you use one of these presets, the following configuration\n * macros will be ignored if set in the \"Configurable Defines\" section.\n */\n\n#if defined(SMAA_PRESET_LOW)\n#define SMAA_THRESHOLD 0.15\n#define SMAA_MAX_SEARCH_STEPS 4\n#define SMAA_DISABLE_DIAG_DETECTION\n#define SMAA_DISABLE_CORNER_DETECTION\n#elif defined(SMAA_PRESET_MEDIUM)\n#define SMAA_THRESHOLD 0.1\n#define SMAA_MAX_SEARCH_STEPS 8\n#define SMAA_DISABLE_DIAG_DETECTION\n#define SMAA_DISABLE_CORNER_DETECTION\n#elif defined(SMAA_PRESET_HIGH)\n#define SMAA_THRESHOLD 0.1\n#define SMAA_MAX_SEARCH_STEPS 16\n#define SMAA_MAX_SEARCH_STEPS_DIAG 8\n#define SMAA_CORNER_ROUNDING 25\n#elif defined(SMAA_PRESET_ULTRA)\n#define SMAA_THRESHOLD 0.05\n#define SMAA_MAX_SEARCH_STEPS 32\n#define SMAA_MAX_SEARCH_STEPS_DIAG 16\n#define SMAA_CORNER_ROUNDING 25\n#endif\n\n//-----------------------------------------------------------------------------\n// Configurable Defines\n\n/**\n * SMAA_THRESHOLD specifies the threshold or sensitivity to edges.\n * Lowering this value you will be able to detect more edges at the expense of\n * performance.\n *\n * Range: [0, 0.5]\n *   0.1 is a reasonable value, and allows to catch most visible edges.\n *   0.05 is a rather overkill value, that allows to catch 'em all.\n *\n *   If temporal supersampling is used, 0.2 could be a reasonable value, as low\n *   contrast edges are properly filtered by just 2x.\n */\n#ifndef SMAA_THRESHOLD\n#define SMAA_THRESHOLD 0.1\n#endif\n\n/**\n * SMAA_DEPTH_THRESHOLD specifies the threshold for depth edge detection.\n *\n * Range: depends on the depth range of the scene.\n */\n#ifndef SMAA_DEPTH_THRESHOLD\n#define SMAA_DEPTH_THRESHOLD (0.1 * SMAA_THRESHOLD)\n#endif\n\n/**\n * SMAA_MAX_SEARCH_STEPS specifies the maximum steps performed in the\n * horizontal/vertical pattern searches, at each side of the pixel.\n *\n * In number of pixels, it's actually the double. So the maximum line length\n * perfectly handled by, for example 16, is 64 (by perfectly, we meant that\n * longer lines won't look as good, but still antialiased).\n *\n * Range: [0, 112]\n */\n#ifndef SMAA_MAX_SEARCH_STEPS\n#define SMAA_MAX_SEARCH_STEPS 16\n#endif\n\n/**\n * SMAA_MAX_SEARCH_STEPS_DIAG specifies the maximum steps performed in the\n * diagonal pattern searches, at each side of the pixel. In this case we jump\n * one pixel at time, instead of two.\n *\n * Range: [0, 20]\n *\n * On high-end machines it is cheap (between a 0.8x and 0.9x slower for 16\n * steps), but it can have a significant impact on older machines.\n *\n * Define SMAA_DISABLE_DIAG_DETECTION to disable diagonal processing.\n */\n#ifndef SMAA_MAX_SEARCH_STEPS_DIAG\n#define SMAA_MAX_SEARCH_STEPS_DIAG 8\n#endif\n\n/**\n * SMAA_CORNER_ROUNDING specifies how much sharp corners will be rounded.\n *\n * Range: [0, 100]\n *\n * Define SMAA_DISABLE_CORNER_DETECTION to disable corner processing.\n */\n#ifndef SMAA_CORNER_ROUNDING\n#define SMAA_CORNER_ROUNDING 25\n#endif\n\n/**\n * If there is an neighbor edge that has SMAA_LOCAL_CONTRAST_FACTOR times\n * bigger contrast than current edge, current edge will be discarded.\n *\n * This allows to eliminate spurious crossing edges, and is based on the fact\n * that, if there is too much contrast in a direction, that will hide\n * perceptually contrast in the other neighbors.\n */\n#ifndef SMAA_LOCAL_CONTRAST_ADAPTATION_FACTOR\n#define SMAA_LOCAL_CONTRAST_ADAPTATION_FACTOR 2.0\n#endif\n\n/**\n * Predicated thresholding allows to better preserve texture details and to\n * improve performance, by decreasing the number of detected edges using an\n * additional buffer like the light accumulation buffer, object ids or even the\n * depth buffer (the depth buffer usage may be limited to indoor or short range\n * scenes).\n *\n * It locally decreases the luma or color threshold if an edge is found in an\n * additional buffer (so the global threshold can be higher).\n *\n * This method was developed by Playstation EDGE MLAA team, and used in\n * Killzone 3, by using the light accumulation buffer. More information here:\n *     http://iryoku.com/aacourse/downloads/06-MLAA-on-PS3.pptx\n */\n#ifndef SMAA_PREDICATION\n#define SMAA_PREDICATION 0\n#endif\n\n/**\n * Threshold to be used in the additional predication buffer.\n *\n * Range: depends on the input, so you'll have to find the magic number that\n * works for you.\n */\n#ifndef SMAA_PREDICATION_THRESHOLD\n#define SMAA_PREDICATION_THRESHOLD 0.01\n#endif\n\n/**\n * How much to scale the global threshold used for luma or color edge\n * detection when using predication.\n *\n * Range: [1, 5]\n */\n#ifndef SMAA_PREDICATION_SCALE\n#define SMAA_PREDICATION_SCALE 2.0\n#endif\n\n/**\n * How much to locally decrease the threshold.\n *\n * Range: [0, 1]\n */\n#ifndef SMAA_PREDICATION_STRENGTH\n#define SMAA_PREDICATION_STRENGTH 0.4\n#endif\n\n/**\n * Temporal reprojection allows to remove ghosting artifacts when using\n * temporal supersampling. We use the CryEngine 3 method which also introduces\n * velocity weighting. This feature is of extreme importance for totally\n * removing ghosting. More information here:\n *    http://iryoku.com/aacourse/downloads/13-Anti-Aliasing-Methods-in-CryENGINE-3.pdf\n *\n * Note that you'll need to setup a velocity buffer for enabling reprojection.\n * For static geometry, saving the previous depth buffer is a viable\n * alternative.\n */\n#ifndef SMAA_REPROJECTION\n#define SMAA_REPROJECTION 0\n#endif\n\n/**\n * Temporal reprojection allows to remove ghosting artifacts when using\n * temporal supersampling. However, the default reprojection requires a velocity buffer\n * in order to function properly.\n *\n * A velocity buffer might not always be available (hi Unity 5!). To handle such cases\n * we provide a UV-based approximation for calculating motion vectors on the fly.\n */\n#ifndef SMAA_UV_BASED_REPROJECTION\n#define SMAA_UV_BASED_REPROJECTION 0\n#endif\n\n/**\n * SMAA_REPROJECTION_WEIGHT_SCALE controls the velocity weighting. It allows to\n * remove ghosting trails behind the moving object, which are not removed by\n * just using reprojection. Using low values will exhibit ghosting, while using\n * high values will disable temporal supersampling under motion.\n *\n * Behind the scenes, velocity weighting removes temporal supersampling when\n * the velocity of the subsamples differs (meaning they are different objects).\n *\n * Range: [0, 80]\n */\n#ifndef SMAA_REPROJECTION_WEIGHT_SCALE\n#define SMAA_REPROJECTION_WEIGHT_SCALE 30.0\n#endif\n\n/**\n * On some compilers, discard cannot be used in vertex shaders. Thus, they need\n * to be compiled separately.\n */\n#ifndef SMAA_INCLUDE_VS\n#define SMAA_INCLUDE_VS 1\n#endif\n#ifndef SMAA_INCLUDE_PS\n#define SMAA_INCLUDE_PS 1\n#endif\n\n//-----------------------------------------------------------------------------\n// Texture Access Defines\n\n#ifndef SMAA_AREATEX_SELECT\n#if defined(SMAA_HLSL_3)\n#define SMAA_AREATEX_SELECT(sample) sample.ra\n#else\n#define SMAA_AREATEX_SELECT(sample) sample.rg\n#endif\n#endif\n\n#ifndef SMAA_SEARCHTEX_SELECT\n#define SMAA_SEARCHTEX_SELECT(sample) sample.r\n#endif\n\n#ifndef SMAA_DECODE_VELOCITY\n#define SMAA_DECODE_VELOCITY(sample) sample.rg\n#endif\n\n//-----------------------------------------------------------------------------\n// Non-Configurable Defines\n\n#define SMAA_AREATEX_MAX_DISTANCE 16\n#define SMAA_AREATEX_MAX_DISTANCE_DIAG 20\n#define SMAA_AREATEX_PIXEL_SIZE (1.0 / float2(160.0, 560.0))\n#define SMAA_AREATEX_SUBTEX_SIZE (1.0 / 7.0)\n#define SMAA_SEARCHTEX_SIZE float2(66.0, 33.0)\n#define SMAA_SEARCHTEX_PACKED_SIZE float2(64.0, 16.0)\n#define SMAA_CORNER_ROUNDING_NORM (float(SMAA_CORNER_ROUNDING) / 100.0)\n\n//-----------------------------------------------------------------------------\n// Porting Functions\n\n#if defined(SMAA_HLSL_3)\n#define SMAATexture2D(tex) sampler2D tex\n#define SMAATexturePass2D(tex) tex\n#define SMAASampleLevelZero(tex, coord) tex2Dlod(tex, float4(coord, 0.0, 0.0))\n#define SMAASampleLevelZeroPoint(tex, coord) tex2Dlod(tex, float4(coord, 0.0, 0.0))\n#define SMAASampleLevelZeroOffset(tex, coord, offset) tex2Dlod(tex, float4(coord + offset * SMAA_RT_METRICS.xy, 0.0, 0.0))\n#define SMAASample(tex, coord) tex2D(tex, coord)\n#define SMAASamplePoint(tex, coord) tex2D(tex, coord)\n#define SMAASampleOffset(tex, coord, offset) tex2D(tex, coord + offset * SMAA_RT_METRICS.xy)\n//#define SMAA_FLATTEN [flatten]\n//#define SMAA_BRANCH [branch]\n#define SMAA_FLATTEN\n#define SMAA_BRANCH\n#endif\n#if defined(SMAA_HLSL_4) || defined(SMAA_HLSL_4_1)\n//SamplerState LinearSampler { Filter = MIN_MAG_LINEAR_MIP_POINT; AddressU = Clamp; AddressV = Clamp; };\n//SamplerState PointSampler { Filter = MIN_MAG_MIP_POINT; AddressU = Clamp; AddressV = Clamp; };\n#define SMAATexture2D(tex) Texture2D tex\n#define SMAATexturePass2D(tex) tex\n#define SMAASampleLevelZero(tex, coord) tex.SampleLevel(LinearSampler, coord, 0)\n#define SMAASampleLevelZeroPoint(tex, coord) tex.SampleLevel(PointSampler, coord, 0)\n#define SMAASampleLevelZeroOffset(tex, coord, offset) tex.SampleLevel(LinearSampler, coord, 0, offset)\n#define SMAASample(tex, coord) tex.Sample(LinearSampler, coord)\n#define SMAASamplePoint(tex, coord) tex.Sample(PointSampler, coord)\n#define SMAASampleOffset(tex, coord, offset) tex.Sample(LinearSampler, coord, offset)\n#define SMAA_FLATTEN [flatten]\n#define SMAA_BRANCH [branch]\n#define SMAATexture2DMS2(tex) Texture2DMS<float4, 2> tex\n#define SMAALoad(tex, pos, sample) tex.Load(pos, sample)\n#if defined(SMAA_HLSL_4_1)\n#define SMAAGather(tex, coord) tex.Gather(LinearSampler, coord, 0)\n#endif\n#endif\n#if defined(SMAA_GLSL_3) || defined(SMAA_GLSL_4)\n#define SMAATexture2D(tex) sampler2D tex\n#define SMAATexturePass2D(tex) tex\n#define SMAASampleLevelZero(tex, coord) textureLod(tex, coord, 0.0)\n#define SMAASampleLevelZeroPoint(tex, coord) textureLod(tex, coord, 0.0)\n#define SMAASampleLevelZeroOffset(tex, coord, offset) textureLodOffset(tex, coord, 0.0, offset)\n#define SMAASample(tex, coord) texture(tex, coord)\n#define SMAASamplePoint(tex, coord) texture(tex, coord)\n#define SMAASampleOffset(tex, coord, offset) texture(tex, coord, offset)\n#define SMAA_FLATTEN\n#define SMAA_BRANCH\n#define lerp(a, b, t) mix(a, b, t)\n#define saturate(a) clamp(a, 0.0, 1.0)\n#if defined(SMAA_GLSL_4)\n#define mad(a, b, c) fma(a, b, c)\n#define SMAAGather(tex, coord) textureGather(tex, coord)\n#else\n#define mad(a, b, c) (a * b + c)\n#endif\n#define float2 vec2\n#define float3 vec3\n#define float4 vec4\n#define int2 ivec2\n#define int3 ivec3\n#define int4 ivec4\n#define bool2 bvec2\n#define bool3 bvec3\n#define bool4 bvec4\n#endif\n\n#if !defined(SMAA_HLSL_3) && !defined(SMAA_HLSL_4) && !defined(SMAA_HLSL_4_1) && !defined(SMAA_GLSL_3) && !defined(SMAA_GLSL_4) && !defined(SMAA_CUSTOM_SL)\n#error you must define the shading language: SMAA_HLSL_*, SMAA_GLSL_* or SMAA_CUSTOM_SL\n#endif\n\n//-----------------------------------------------------------------------------\n// Misc functions\n\n/**\n * Gathers current pixel, and the top-left neighbors.\n */\nfloat3 SMAAGatherNeighbours(float2 texcoord,\n                            float4 offset[3],\n                            SMAATexture2D(tex)) {\n    #ifdef SMAAGather\n    return SMAAGather(tex, texcoord + SMAA_RT_METRICS.xy * float2(-0.5, -0.5)).grb;\n    #else\n    float P = SMAASamplePoint(tex, texcoord).r;\n    float Pleft = SMAASamplePoint(tex, offset[0].xy).r;\n    float Ptop  = SMAASamplePoint(tex, offset[0].zw).r;\n    return float3(P, Pleft, Ptop);\n    #endif\n}\n\n/**\n * Adjusts the threshold by means of predication.\n */\nfloat2 SMAACalculatePredicatedThreshold(float2 texcoord,\n                                        float4 offset[3],\n                                        SMAATexture2D(predicationTex)) {\n    float3 neighbours = SMAAGatherNeighbours(texcoord, offset, SMAATexturePass2D(predicationTex));\n    float2 delta = abs(neighbours.xx - neighbours.yz);\n    float2 edges = step(SMAA_PREDICATION_THRESHOLD, delta);\n    return SMAA_PREDICATION_SCALE * SMAA_THRESHOLD * (1.0 - SMAA_PREDICATION_STRENGTH * edges);\n}\n\n/**\n * Conditional move:\n */\nvoid SMAAMovc(bool2 cond, inout float2 variable, float2 value) {\n    SMAA_FLATTEN if (cond.x) variable.x = value.x;\n    SMAA_FLATTEN if (cond.y) variable.y = value.y;\n}\n\nvoid SMAAMovc(bool4 cond, inout float4 variable, float4 value) {\n    SMAAMovc(cond.xy, variable.xy, value.xy);\n    SMAAMovc(cond.zw, variable.zw, value.zw);\n}\n\n\n#if SMAA_INCLUDE_VS\n//-----------------------------------------------------------------------------\n// Vertex Shaders\n\n/**\n * Edge Detection Vertex Shader\n */\nvoid SMAAEdgeDetectionVS(float2 texcoord,\n                         out float4 offset[3]) {\n    offset[0] = mad(SMAA_RT_METRICS.xyxy, float4(-1.0, 0.0, 0.0, -1.0), texcoord.xyxy);\n    offset[1] = mad(SMAA_RT_METRICS.xyxy, float4( 1.0, 0.0, 0.0,  1.0), texcoord.xyxy);\n    offset[2] = mad(SMAA_RT_METRICS.xyxy, float4(-2.0, 0.0, 0.0, -2.0), texcoord.xyxy);\n}\n\n/**\n * Blend Weight Calculation Vertex Shader\n */\nvoid SMAABlendingWeightCalculationVS(float2 texcoord,\n                                     out float2 pixcoord,\n                                     out float4 offset[3]) {\n    pixcoord = texcoord * SMAA_RT_METRICS.zw;\n\n    // We will use these offsets for the searches later on (see @PSEUDO_GATHER4):\n    offset[0] = mad(SMAA_RT_METRICS.xyxy, float4(-0.25, -0.125,  1.25, -0.125), texcoord.xyxy);\n    offset[1] = mad(SMAA_RT_METRICS.xyxy, float4(-0.125, -0.25, -0.125,  1.25), texcoord.xyxy);\n\n    // And these for the searches, they indicate the ends of the loops:\n    offset[2] = mad(SMAA_RT_METRICS.xxyy,\n                    float4(-2.0, 2.0, -2.0, 2.0) * float(SMAA_MAX_SEARCH_STEPS),\n                    float4(offset[0].xz, offset[1].yw));\n}\n\n/**\n * Neighborhood Blending Vertex Shader\n */\nvoid SMAANeighborhoodBlendingVS(float2 texcoord,\n                                out float4 offset) {\n    offset = mad(SMAA_RT_METRICS.xyxy, float4( 1.0, 0.0, 0.0,  1.0), texcoord.xyxy);\n}\n#endif // SMAA_INCLUDE_VS\n\n#if SMAA_INCLUDE_PS\n//-----------------------------------------------------------------------------\n// Edge Detection Pixel Shaders (First Pass)\n\n/**\n * Luma Edge Detection\n *\n * IMPORTANT NOTICE: luma edge detection requires gamma-corrected colors, and\n * thus 'colorTex' should be a non-sRGB texture.\n */\nfloat2 SMAALumaEdgeDetectionPS(float2 texcoord,\n                               float4 offset[3],\n                               SMAATexture2D(colorTex)\n                               #if SMAA_PREDICATION\n                               , SMAATexture2D(predicationTex)\n                               #endif\n                               ) {\n    // Calculate the threshold:\n    #if SMAA_PREDICATION\n    float2 threshold = SMAACalculatePredicatedThreshold(texcoord, offset, SMAATexturePass2D(predicationTex));\n    #else\n    float2 threshold = float2(SMAA_THRESHOLD, SMAA_THRESHOLD);\n    #endif\n\n    // Calculate lumas:\n    float3 weights = float3(0.2126, 0.7152, 0.0722);\n    float L = dot(SMAASamplePoint(colorTex, texcoord).rgb, weights);\n\n    float Lleft = dot(SMAASamplePoint(colorTex, offset[0].xy).rgb, weights);\n    float Ltop  = dot(SMAASamplePoint(colorTex, offset[0].zw).rgb, weights);\n\n    // We do the usual threshold:\n    float4 delta;\n    delta.xy = abs(L - float2(Lleft, Ltop));\n    float2 edges = step(threshold, delta.xy);\n\n    // Then discard if there is no edge:\n    if (dot(edges, float2(1.0, 1.0)) == 0.0)\n        discard;\n\n    // Calculate right and bottom deltas:\n    float Lright = dot(SMAASamplePoint(colorTex, offset[1].xy).rgb, weights);\n    float Lbottom  = dot(SMAASamplePoint(colorTex, offset[1].zw).rgb, weights);\n    delta.zw = abs(L - float2(Lright, Lbottom));\n\n    // Calculate the maximum delta in the direct neighborhood:\n    float2 maxDelta = max(delta.xy, delta.zw);\n\n    // Calculate left-left and top-top deltas:\n    float Lleftleft = dot(SMAASamplePoint(colorTex, offset[2].xy).rgb, weights);\n    float Ltoptop = dot(SMAASamplePoint(colorTex, offset[2].zw).rgb, weights);\n    delta.zw = abs(float2(Lleft, Ltop) - float2(Lleftleft, Ltoptop));\n\n    // Calculate the final maximum delta:\n    maxDelta = max(maxDelta.xy, delta.zw);\n    float finalDelta = max(maxDelta.x, maxDelta.y);\n\n    // Local contrast adaptation:\n#if !defined(SHADER_API_OPENGL)\n   edges.xy *= step(finalDelta, SMAA_LOCAL_CONTRAST_ADAPTATION_FACTOR * delta.xy);\n#endif\n\n    return edges;\n}\n\n/**\n * Color Edge Detection\n *\n * IMPORTANT NOTICE: color edge detection requires gamma-corrected colors, and\n * thus 'colorTex' should be a non-sRGB texture.\n */\nfloat2 SMAAColorEdgeDetectionPS(float2 texcoord,\n                                float4 offset[3],\n                                SMAATexture2D(colorTex)\n                                #if SMAA_PREDICATION\n                                , SMAATexture2D(predicationTex)\n                                #endif\n                                ) {\n    // Calculate the threshold:\n    #if SMAA_PREDICATION\n    float2 threshold = SMAACalculatePredicatedThreshold(texcoord, offset, predicationTex);\n    #else\n    float2 threshold = float2(SMAA_THRESHOLD, SMAA_THRESHOLD);\n    #endif\n\n    // Calculate color deltas:\n    float4 delta;\n    float3 C = SMAASamplePoint(colorTex, texcoord).rgb;\n\n    float3 Cleft = SMAASamplePoint(colorTex, offset[0].xy).rgb;\n    float3 t = abs(C - Cleft);\n    delta.x = max(max(t.r, t.g), t.b);\n\n    float3 Ctop  = SMAASamplePoint(colorTex, offset[0].zw).rgb;\n    t = abs(C - Ctop);\n    delta.y = max(max(t.r, t.g), t.b);\n\n    // We do the usual threshold:\n    float2 edges = step(threshold, delta.xy);\n\n    // Then discard if there is no edge:\n    if (dot(edges, float2(1.0, 1.0)) == 0.0)\n        discard;\n\n    // Calculate right and bottom deltas:\n    float3 Cright = SMAASamplePoint(colorTex, offset[1].xy).rgb;\n    t = abs(C - Cright);\n    delta.z = max(max(t.r, t.g), t.b);\n\n    float3 Cbottom  = SMAASamplePoint(colorTex, offset[1].zw).rgb;\n    t = abs(C - Cbottom);\n    delta.w = max(max(t.r, t.g), t.b);\n\n    // Calculate the maximum delta in the direct neighborhood:\n    float2 maxDelta = max(delta.xy, delta.zw);\n\n    // Calculate left-left and top-top deltas:\n    float3 Cleftleft  = SMAASamplePoint(colorTex, offset[2].xy).rgb;\n    t = abs(Cleft - Cleftleft);\n    delta.z = max(max(t.r, t.g), t.b);\n\n    float3 Ctoptop = SMAASamplePoint(colorTex, offset[2].zw).rgb;\n    t = abs(Ctop - Ctoptop);\n    delta.w = max(max(t.r, t.g), t.b);\n\n    // Calculate the final maximum delta:\n    maxDelta = max(maxDelta.xy, delta.zw);\n    float finalDelta = max(maxDelta.x, maxDelta.y);\n\n    // Local contrast adaptation:\n#if !defined(SHADER_API_OPENGL)\n    edges.xy *= step(finalDelta, SMAA_LOCAL_CONTRAST_ADAPTATION_FACTOR * delta.xy);\n#endif\n\n    return edges;\n}\n\n/**\n * Depth Edge Detection\n */\nfloat2 SMAADepthEdgeDetectionPS(float2 texcoord,\n                                float4 offset[3],\n                                SMAATexture2D(depthTex)) {\n    float3 neighbours = SMAAGatherNeighbours(texcoord, offset, SMAATexturePass2D(depthTex));\n    float2 delta = abs(neighbours.xx - float2(neighbours.y, neighbours.z));\n    float2 edges = step(SMAA_DEPTH_THRESHOLD, delta);\n\n    if (dot(edges, float2(1.0, 1.0)) == 0.0)\n        discard;\n\n    return edges;\n}\n\n//-----------------------------------------------------------------------------\n// Diagonal Search Functions\n\n#if !defined(SMAA_DISABLE_DIAG_DETECTION)\n\n/**\n * Allows to decode two binary values from a bilinear-filtered access.\n */\nfloat2 SMAADecodeDiagBilinearAccess(float2 e) {\n    // Bilinear access for fetching 'e' have a 0.25 offset, and we are\n    // interested in the R and G edges:\n    //\n    // +---G---+-------+\n    // |   x o R   x   |\n    // +-------+-------+\n    //\n    // Then, if one of these edge is enabled:\n    //   Red:   (0.75 * X + 0.25 * 1) => 0.25 or 1.0\n    //   Green: (0.75 * 1 + 0.25 * X) => 0.75 or 1.0\n    //\n    // This function will unpack the values (mad + mul + round):\n    // wolframalpha.com: round(x * abs(5 * x - 5 * 0.75)) plot 0 to 1\n    e.r = e.r * abs(5.0 * e.r - 5.0 * 0.75);\n    return round(e);\n}\n\nfloat4 SMAADecodeDiagBilinearAccess(float4 e) {\n    e.rb = e.rb * abs(5.0 * e.rb - 5.0 * 0.75);\n    return round(e);\n}\n\n/**\n * These functions allows to perform diagonal pattern searches.\n */\nfloat2 SMAASearchDiag1(SMAATexture2D(edgesTex), float2 texcoord, float2 dir, out float2 e) {\n    float4 coord = float4(texcoord, -1.0, 1.0);\n    float3 t = float3(SMAA_RT_METRICS.xy, 1.0);\n    while (coord.z < float(SMAA_MAX_SEARCH_STEPS_DIAG - 1) &&\n           coord.w > 0.9) {\n        coord.xyz = mad(t, float3(dir, 1.0), coord.xyz);\n        e = SMAASampleLevelZero(edgesTex, coord.xy).rg;\n        coord.w = dot(e, float2(0.5, 0.5));\n    }\n    return coord.zw;\n}\n\nfloat2 SMAASearchDiag2(SMAATexture2D(edgesTex), float2 texcoord, float2 dir, out float2 e) {\n    float4 coord = float4(texcoord, -1.0, 1.0);\n    coord.x += 0.25 * SMAA_RT_METRICS.x; // See @SearchDiag2Optimization\n    float3 t = float3(SMAA_RT_METRICS.xy, 1.0);\n    while (coord.z < float(SMAA_MAX_SEARCH_STEPS_DIAG - 1) &&\n           coord.w > 0.9) {\n        coord.xyz = mad(t, float3(dir, 1.0), coord.xyz);\n\n        // @SearchDiag2Optimization\n        // Fetch both edges at once using bilinear filtering:\n        e = SMAASampleLevelZero(edgesTex, coord.xy).rg;\n        e = SMAADecodeDiagBilinearAccess(e);\n\n        // Non-optimized version:\n        // e.g = SMAASampleLevelZero(edgesTex, coord.xy).g;\n        // e.r = SMAASampleLevelZeroOffset(edgesTex, coord.xy, int2(1, 0)).r;\n\n        coord.w = dot(e, float2(0.5, 0.5));\n    }\n    return coord.zw;\n}\n\n/**\n * Similar to SMAAArea, this calculates the area corresponding to a certain\n * diagonal distance and crossing edges 'e'.\n */\nfloat2 SMAAAreaDiag(SMAATexture2D(areaTex), float2 dist, float2 e, float offset) {\n    float2 texcoord = mad(float2(SMAA_AREATEX_MAX_DISTANCE_DIAG, SMAA_AREATEX_MAX_DISTANCE_DIAG), e, dist);\n\n    // We do a scale and bias for mapping to texel space:\n    texcoord = mad(SMAA_AREATEX_PIXEL_SIZE, texcoord, 0.5 * SMAA_AREATEX_PIXEL_SIZE);\n\n    // Diagonal areas are on the second half of the texture:\n    texcoord.x += 0.5;\n\n    // Move to proper place, according to the subpixel offset:\n    texcoord.y += SMAA_AREATEX_SUBTEX_SIZE * offset;\n\n    // Do it!\n    return SMAA_AREATEX_SELECT(SMAASampleLevelZero(areaTex, texcoord));\n}\n\n/**\n * This searches for diagonal patterns and returns the corresponding weights.\n */\nfloat2 SMAACalculateDiagWeights(SMAATexture2D(edgesTex), SMAATexture2D(areaTex), float2 texcoord, float2 e, float4 subsampleIndices) {\n    float2 weights = float2(0.0, 0.0);\n\n    // Search for the line ends:\n    float4 d;\n    float2 end;\n    if (e.r > 0.0) {\n        d.xz = SMAASearchDiag1(SMAATexturePass2D(edgesTex), texcoord, float2(-1.0,  1.0), end);\n        d.x += float(end.y > 0.9);\n    } else\n        d.xz = float2(0.0, 0.0);\n    d.yw = SMAASearchDiag1(SMAATexturePass2D(edgesTex), texcoord, float2(1.0, -1.0), end);\n\n    SMAA_BRANCH\n    if (d.x + d.y > 2.0) { // d.x + d.y + 1 > 3\n        // Fetch the crossing edges:\n        float4 coords = mad(float4(-d.x + 0.25, d.x, d.y, -d.y - 0.25), SMAA_RT_METRICS.xyxy, texcoord.xyxy);\n        float4 c;\n        c.xy = SMAASampleLevelZeroOffset(edgesTex, coords.xy, int2(-1,  0)).rg;\n        c.zw = SMAASampleLevelZeroOffset(edgesTex, coords.zw, int2( 1,  0)).rg;\n        c.yxwz = SMAADecodeDiagBilinearAccess(c.xyzw);\n\n        // Non-optimized version:\n        // float4 coords = mad(float4(-d.x, d.x, d.y, -d.y), SMAA_RT_METRICS.xyxy, texcoord.xyxy);\n        // float4 c;\n        // c.x = SMAASampleLevelZeroOffset(edgesTex, coords.xy, int2(-1,  0)).g;\n        // c.y = SMAASampleLevelZeroOffset(edgesTex, coords.xy, int2( 0,  0)).r;\n        // c.z = SMAASampleLevelZeroOffset(edgesTex, coords.zw, int2( 1,  0)).g;\n        // c.w = SMAASampleLevelZeroOffset(edgesTex, coords.zw, int2( 1, -1)).r;\n\n        // Merge crossing edges at each side into a single value:\n        float2 cc = mad(float2(2.0, 2.0), c.xz, c.yw);\n\n        // Remove the crossing edge if we didn't found the end of the line:\n        SMAAMovc(bool2(step(float2(0.9, 0.9), d.zw)), cc, float2(0.0, 0.0));\n\n        // Fetch the areas for this line:\n        weights += SMAAAreaDiag(SMAATexturePass2D(areaTex), d.xy, cc, subsampleIndices.z);\n    }\n\n    // Search for the line ends:\n    d.xz = SMAASearchDiag2(SMAATexturePass2D(edgesTex), texcoord, float2(-1.0, -1.0), end);\n    if (SMAASampleLevelZeroOffset(edgesTex, texcoord, int2(1, 0)).r > 0.0) {\n        d.yw = SMAASearchDiag2(SMAATexturePass2D(edgesTex), texcoord, float2(1.0, 1.0), end);\n        d.y += float(end.y > 0.9);\n    } else\n        d.yw = float2(0.0, 0.0);\n\n    SMAA_BRANCH\n    if (d.x + d.y > 2.0) { // d.x + d.y + 1 > 3\n        // Fetch the crossing edges:\n        float4 coords = mad(float4(-d.x, -d.x, d.y, d.y), SMAA_RT_METRICS.xyxy, texcoord.xyxy);\n        float4 c;\n        c.x  = SMAASampleLevelZeroOffset(edgesTex, coords.xy, int2(-1,  0)).g;\n        c.y  = SMAASampleLevelZeroOffset(edgesTex, coords.xy, int2( 0, -1)).r;\n        c.zw = SMAASampleLevelZeroOffset(edgesTex, coords.zw, int2( 1,  0)).gr;\n        float2 cc = mad(float2(2.0, 2.0), c.xz, c.yw);\n\n        // Remove the crossing edge if we didn't found the end of the line:\n        SMAAMovc(bool2(step(float2(0.9, 0.9), d.zw)), cc, float2(0.0, 0.0));\n\n        // Fetch the areas for this line:\n        weights += SMAAAreaDiag(SMAATexturePass2D(areaTex), d.xy, cc, subsampleIndices.w).gr;\n    }\n\n    return weights;\n}\n#endif\n\n//-----------------------------------------------------------------------------\n// Horizontal/Vertical Search Functions\n\n/**\n * This allows to determine how much length should we add in the last step\n * of the searches. It takes the bilinearly interpolated edge (see\n * @PSEUDO_GATHER4), and adds 0, 1 or 2, depending on which edges and\n * crossing edges are active.\n */\nfloat SMAASearchLength(SMAATexture2D(searchTex), float2 e, float offset) {\n    // The texture is flipped vertically, with left and right cases taking half\n    // of the space horizontally:\n    float2 scale = SMAA_SEARCHTEX_SIZE * float2(0.5, -1.0);\n    float2 bias = SMAA_SEARCHTEX_SIZE * float2(offset, 1.0);\n\n    // Scale and bias to access texel centers:\n    scale += float2(-1.0,  1.0);\n    bias  += float2( 0.5, -0.5);\n\n    // Convert from pixel coordinates to texcoords:\n    // (We use SMAA_SEARCHTEX_PACKED_SIZE because the texture is cropped)\n    scale *= 1.0 / SMAA_SEARCHTEX_PACKED_SIZE;\n    bias *= 1.0 / SMAA_SEARCHTEX_PACKED_SIZE;\n\n    // Lookup the search texture:\n    return SMAA_SEARCHTEX_SELECT(SMAASampleLevelZero(searchTex, mad(scale, e, bias)));\n}\n\n/**\n * Horizontal/vertical search functions for the 2nd pass.\n */\nfloat SMAASearchXLeft(SMAATexture2D(edgesTex), SMAATexture2D(searchTex), float2 texcoord, float end) {\n    /**\n     * @PSEUDO_GATHER4\n     * This texcoord has been offset by (-0.25, -0.125) in the vertex shader to\n     * sample between edge, thus fetching four edges in a row.\n     * Sampling with different offsets in each direction allows to disambiguate\n     * which edges are active from the four fetched ones.\n     */\n    float2 e = float2(0.0, 1.0);\n    while (texcoord.x > end &&\n           e.g > 0.8281 && // Is there some edge not activated?\n           e.r == 0.0) { // Or is there a crossing edge that breaks the line?\n        e = SMAASampleLevelZero(edgesTex, texcoord).rg;\n        texcoord = mad(-float2(2.0, 0.0), SMAA_RT_METRICS.xy, texcoord);\n    }\n\n    float offset = mad(-(255.0 / 127.0), SMAASearchLength(SMAATexturePass2D(searchTex), e, 0.0), 3.25);\n    return mad(SMAA_RT_METRICS.x, offset, texcoord.x);\n\n    // Non-optimized version:\n    // We correct the previous (-0.25, -0.125) offset we applied:\n    // texcoord.x += 0.25 * SMAA_RT_METRICS.x;\n\n    // The searches are bias by 1, so adjust the coords accordingly:\n    // texcoord.x += SMAA_RT_METRICS.x;\n\n    // Disambiguate the length added by the last step:\n    // texcoord.x += 2.0 * SMAA_RT_METRICS.x; // Undo last step\n    // texcoord.x -= SMAA_RT_METRICS.x * (255.0 / 127.0) * SMAASearchLength(SMAATexturePass2D(searchTex), e, 0.0);\n    // return mad(SMAA_RT_METRICS.x, offset, texcoord.x);\n}\n\nfloat SMAASearchXRight(SMAATexture2D(edgesTex), SMAATexture2D(searchTex), float2 texcoord, float end) {\n    float2 e = float2(0.0, 1.0);\n    while (texcoord.x < end &&\n           e.g > 0.8281 && // Is there some edge not activated?\n           e.r == 0.0) { // Or is there a crossing edge that breaks the line?\n        e = SMAASampleLevelZero(edgesTex, texcoord).rg;\n        texcoord = mad(float2(2.0, 0.0), SMAA_RT_METRICS.xy, texcoord);\n    }\n    float offset = mad(-(255.0 / 127.0), SMAASearchLength(SMAATexturePass2D(searchTex), e, 0.5), 3.25);\n    return mad(-SMAA_RT_METRICS.x, offset, texcoord.x);\n}\n\nfloat SMAASearchYUp(SMAATexture2D(edgesTex), SMAATexture2D(searchTex), float2 texcoord, float end) {\n    float2 e = float2(1.0, 0.0);\n    while (texcoord.y > end &&\n           e.r > 0.8281 && // Is there some edge not activated?\n           e.g == 0.0) { // Or is there a crossing edge that breaks the line?\n        e = SMAASampleLevelZero(edgesTex, texcoord).rg;\n        texcoord = mad(-float2(0.0, 2.0), SMAA_RT_METRICS.xy, texcoord);\n    }\n    float offset = mad(-(255.0 / 127.0), SMAASearchLength(SMAATexturePass2D(searchTex), e.gr, 0.0), 3.25);\n    return mad(SMAA_RT_METRICS.y, offset, texcoord.y);\n}\n\nfloat SMAASearchYDown(SMAATexture2D(edgesTex), SMAATexture2D(searchTex), float2 texcoord, float end) {\n    float2 e = float2(1.0, 0.0);\n    while (texcoord.y < end &&\n           e.r > 0.8281 && // Is there some edge not activated?\n           e.g == 0.0) { // Or is there a crossing edge that breaks the line?\n        e = SMAASampleLevelZero(edgesTex, texcoord).rg;\n        texcoord = mad(float2(0.0, 2.0), SMAA_RT_METRICS.xy, texcoord);\n    }\n    float offset = mad(-(255.0 / 127.0), SMAASearchLength(SMAATexturePass2D(searchTex), e.gr, 0.5), 3.25);\n    return mad(-SMAA_RT_METRICS.y, offset, texcoord.y);\n}\n\n/**\n * Ok, we have the distance and both crossing edges. So, what are the areas\n * at each side of current edge?\n */\nfloat2 SMAAArea(SMAATexture2D(areaTex), float2 dist, float e1, float e2, float offset) {\n    // Rounding prevents precision errors of bilinear filtering:\n    float2 texcoord = mad(float2(SMAA_AREATEX_MAX_DISTANCE, SMAA_AREATEX_MAX_DISTANCE), round(4.0 * float2(e1, e2)), dist);\n\n    // We do a scale and bias for mapping to texel space:\n    texcoord = mad(SMAA_AREATEX_PIXEL_SIZE, texcoord, 0.5 * SMAA_AREATEX_PIXEL_SIZE);\n\n    // Move to proper place, according to the subpixel offset:\n    texcoord.y = mad(SMAA_AREATEX_SUBTEX_SIZE, offset, texcoord.y);\n\n    // Do it!\n    return SMAA_AREATEX_SELECT(SMAASampleLevelZero(areaTex, texcoord));\n}\n\n//-----------------------------------------------------------------------------\n// Corner Detection Functions\n\nvoid SMAADetectHorizontalCornerPattern(SMAATexture2D(edgesTex), inout float2 weights, float4 texcoord, float2 d) {\n    #if !defined(SMAA_DISABLE_CORNER_DETECTION)\n    float2 leftRight = step(d.xy, d.yx);\n    float2 rounding = (1.0 - SMAA_CORNER_ROUNDING_NORM) * leftRight;\n\n    rounding /= leftRight.x + leftRight.y; // Reduce blending for pixels in the center of a line.\n\n    float2 factor = float2(1.0, 1.0);\n    factor.x -= rounding.x * SMAASampleLevelZeroOffset(edgesTex, texcoord.xy, int2(0,  1)).r;\n    factor.x -= rounding.y * SMAASampleLevelZeroOffset(edgesTex, texcoord.zw, int2(1,  1)).r;\n    factor.y -= rounding.x * SMAASampleLevelZeroOffset(edgesTex, texcoord.xy, int2(0, -2)).r;\n    factor.y -= rounding.y * SMAASampleLevelZeroOffset(edgesTex, texcoord.zw, int2(1, -2)).r;\n\n    weights *= saturate(factor);\n    #endif\n}\n\nvoid SMAADetectVerticalCornerPattern(SMAATexture2D(edgesTex), inout float2 weights, float4 texcoord, float2 d) {\n    #if !defined(SMAA_DISABLE_CORNER_DETECTION)\n    float2 leftRight = step(d.xy, d.yx);\n    float2 rounding = (1.0 - SMAA_CORNER_ROUNDING_NORM) * leftRight;\n\n    rounding /= leftRight.x + leftRight.y;\n\n    float2 factor = float2(1.0, 1.0);\n    factor.x -= rounding.x * SMAASampleLevelZeroOffset(edgesTex, texcoord.xy, int2( 1, 0)).g;\n    factor.x -= rounding.y * SMAASampleLevelZeroOffset(edgesTex, texcoord.zw, int2( 1, 1)).g;\n    factor.y -= rounding.x * SMAASampleLevelZeroOffset(edgesTex, texcoord.xy, int2(-2, 0)).g;\n    factor.y -= rounding.y * SMAASampleLevelZeroOffset(edgesTex, texcoord.zw, int2(-2, 1)).g;\n\n    weights *= saturate(factor);\n    #endif\n}\n\n\n//-----------------------------------------------------------------------------\n// Blending Weight Calculation Pixel Shader (Second Pass)\n\nfloat4 SMAABlendingWeightCalculationPS(float2 texcoord,\n                                       float2 pixcoord,\n                                       float4 offset[3],\n                                       SMAATexture2D(edgesTex),\n                                       SMAATexture2D(areaTex),\n                                       SMAATexture2D(searchTex),\n                                       float4 subsampleIndices) { // Just pass zero for SMAA 1x, see @SUBSAMPLE_INDICES.\n    float4 weights = float4(0.0, 0.0, 0.0, 0.0);\n\n    float2 e = SMAASample(edgesTex, texcoord).rg;\n\n    SMAA_BRANCH\n    if (e.g > 0.0) { // Edge at north\n        #if !defined(SMAA_DISABLE_DIAG_DETECTION)\n        // Diagonals have both north and west edges, so searching for them in\n        // one of the boundaries is enough.\n        weights.rg = SMAACalculateDiagWeights(SMAATexturePass2D(edgesTex), SMAATexturePass2D(areaTex), texcoord, e, subsampleIndices);\n\n        // We give priority to diagonals, so if we find a diagonal we skip\n        // horizontal/vertical processing.\n        SMAA_BRANCH\n        if (weights.r == -weights.g) { // weights.r + weights.g == 0.0\n        #endif\n\n        float2 d;\n\n        // Find the distance to the left:\n        float3 coords;\n        coords.x = SMAASearchXLeft(SMAATexturePass2D(edgesTex), SMAATexturePass2D(searchTex), offset[0].xy, offset[2].x);\n        coords.y = offset[1].y; // offset[1].y = texcoord.y - 0.25 * SMAA_RT_METRICS.y (@CROSSING_OFFSET)\n        d.x = coords.x;\n\n        // Now fetch the left crossing edges, two at a time using bilinear\n        // filtering. Sampling at -0.25 (see @CROSSING_OFFSET) enables to\n        // discern what value each edge has:\n        float e1 = SMAASampleLevelZero(edgesTex, coords.xy).r;\n\n        // Find the distance to the right:\n        coords.z = SMAASearchXRight(SMAATexturePass2D(edgesTex), SMAATexturePass2D(searchTex), offset[0].zw, offset[2].y);\n        d.y = coords.z;\n\n        // We want the distances to be in pixel units (doing this here allow to\n        // better interleave arithmetic and memory accesses):\n        d = abs(round(mad(SMAA_RT_METRICS.zz, d, -pixcoord.xx)));\n\n        // SMAAArea below needs a sqrt, as the areas texture is compressed\n        // quadratically:\n        float2 sqrt_d = sqrt(d);\n\n        // Fetch the right crossing edges:\n        float e2 = SMAASampleLevelZeroOffset(edgesTex, coords.zy, int2(1, 0)).r;\n\n        // Ok, we know how this pattern looks like, now it is time for getting\n        // the actual area:\n        weights.rg = SMAAArea(SMAATexturePass2D(areaTex), sqrt_d, e1, e2, subsampleIndices.y);\n\n        // Fix corners:\n        coords.y = texcoord.y;\n        SMAADetectHorizontalCornerPattern(SMAATexturePass2D(edgesTex), weights.rg, coords.xyzy, d);\n\n        #if !defined(SMAA_DISABLE_DIAG_DETECTION)\n        } else\n            e.r = 0.0; // Skip vertical processing.\n        #endif\n    }\n\n    SMAA_BRANCH\n    if (e.r > 0.0) { // Edge at west\n        float2 d;\n\n        // Find the distance to the top:\n        float3 coords;\n        coords.y = SMAASearchYUp(SMAATexturePass2D(edgesTex), SMAATexturePass2D(searchTex), offset[1].xy, offset[2].z);\n        coords.x = offset[0].x; // offset[1].x = texcoord.x - 0.25 * SMAA_RT_METRICS.x;\n        d.x = coords.y;\n\n        // Fetch the top crossing edges:\n        float e1 = SMAASampleLevelZero(edgesTex, coords.xy).g;\n\n        // Find the distance to the bottom:\n        coords.z = SMAASearchYDown(SMAATexturePass2D(edgesTex), SMAATexturePass2D(searchTex), offset[1].zw, offset[2].w);\n        d.y = coords.z;\n\n        // We want the distances to be in pixel units:\n        d = abs(round(mad(SMAA_RT_METRICS.ww, d, -pixcoord.yy)));\n\n        // SMAAArea below needs a sqrt, as the areas texture is compressed\n        // quadratically:\n        float2 sqrt_d = sqrt(d);\n\n        // Fetch the bottom crossing edges:\n        float e2 = SMAASampleLevelZeroOffset(edgesTex, coords.xz, int2(0, 1)).g;\n\n        // Get the area for this direction:\n        weights.ba = SMAAArea(SMAATexturePass2D(areaTex), sqrt_d, e1, e2, subsampleIndices.x);\n\n        // Fix corners:\n        coords.x = texcoord.x;\n        SMAADetectVerticalCornerPattern(SMAATexturePass2D(edgesTex), weights.ba, coords.xyxz, d);\n    }\n\n    return weights;\n}\n\n//-----------------------------------------------------------------------------\n// UV-based reprojection functions\n\n#if SMAA_UV_BASED_REPROJECTION\nfloat2 SMAAReproject(float2 texcoord)\n{\n    // UV to clip-position:\n    // -- This must be sampled at exactly mip 0 due to possible gradient divergence\n    // -- as this function is called within a control flow block down below.\n    float depth = SMAASampleLevelZero(_CameraDepthTexture, texcoord).r;\n    float3 clipPosition = float3(2. * texcoord - 1., depth);\n\n    // Reproject\n    float4 previousClipPosition = mul(_ReprojectionMatrix, float4(clipPosition, 1.));\n    previousClipPosition.xyz /= previousClipPosition.w;\n\n    // Clip-position to UV\n    return (.5 * previousClipPosition.xy + .5);\n}\n#endif\n\n//-----------------------------------------------------------------------------\n// Neighborhood Blending Pixel Shader (Third Pass)\n\nfloat4 SMAANeighborhoodBlendingPS(float2 texcoord,\n                                  float4 offset,\n                                  SMAATexture2D(colorTex),\n                                  SMAATexture2D(blendTex)\n                                  #if SMAA_REPROJECTION\n                                  , SMAATexture2D(velocityTex)\n                                  #endif\n                                  ) {\n    // Fetch the blending weights for current pixel:\n    float4 a;\n    a.x = SMAASample(blendTex, offset.xy).a; // Right\n    a.y = SMAASample(blendTex, offset.zw).g; // Top\n    a.wz = SMAASample(blendTex, texcoord).xz; // Bottom / Left\n\n    // Is there any blending weight with a value greater than 0.0?\n    SMAA_BRANCH\n    if (dot(a, float4(1.0, 1.0, 1.0, 1.0)) < 1e-5) {\n        float4 color = SMAASampleLevelZero(colorTex, texcoord);\n\n        #if SMAA_REPROJECTION\n        float2 velocity = SMAA_DECODE_VELOCITY(SMAASampleLevelZero(velocityTex, texcoord));\n        #elif SMAA_UV_BASED_REPROJECTION\n        float2 velocity = texcoord - SMAAReproject(texcoord);\n        #endif\n\n        #if (SMAA_REPROJECTION || SMAA_UV_BASED_REPROJECTION)\n        // Pack velocity into the alpha channel:\n        color.a = sqrt(5.0 * length(velocity));\n        #endif\n\n        return color;\n    } else {\n        bool h = max(a.x, a.z) > max(a.y, a.w); // max(horizontal) > max(vertical)\n\n        // Calculate the blending offsets:\n        float4 blendingOffset = float4(0.0, a.y, 0.0, a.w);\n        float2 blendingWeight = a.yw;\n        SMAAMovc(bool4(h, h, h, h), blendingOffset, float4(a.x, 0.0, a.z, 0.0));\n        SMAAMovc(bool2(h, h), blendingWeight, a.xz);\n        blendingWeight /= dot(blendingWeight, float2(1.0, 1.0));\n\n        // Calculate the texture coordinates:\n        float4 blendingCoord = mad(blendingOffset, float4(SMAA_RT_METRICS.xy, -SMAA_RT_METRICS.xy), texcoord.xyxy);\n\n        // We exploit bilinear filtering to mix current pixel with the chosen\n        // neighbor:\n        float4 color = blendingWeight.x * SMAASampleLevelZero(colorTex, blendingCoord.xy);\n        color += blendingWeight.y * SMAASampleLevelZero(colorTex, blendingCoord.zw);\n\n        #if SMAA_REPROJECTION\n        // Antialias velocity for proper reprojection in a later stage:\n        float2 velocity = blendingWeight.x * SMAA_DECODE_VELOCITY(SMAASampleLevelZero(velocityTex, blendingCoord.xy));\n        velocity += blendingWeight.y * SMAA_DECODE_VELOCITY(SMAASampleLevelZero(velocityTex, blendingCoord.zw));\n        #elif SMAA_UV_BASED_REPROJECTION\n        // Antialias velocity for proper reprojection in a later stage:\n        float2 velocity = blendingWeight.x * (blendingCoord.xy - SMAAReproject(blendingCoord.xy));\n        velocity += blendingWeight.y * (blendingCoord.zw - SMAAReproject(blendingCoord.zw));\n        #endif\n\n        #if (SMAA_REPROJECTION || SMAA_UV_BASED_REPROJECTION)\n        // Pack velocity into the alpha channel:\n        color.a = sqrt(5.0 * length(velocity));\n        #endif\n\n        return color;\n    }\n}\n\n//-----------------------------------------------------------------------------\n// Temporal Resolve Pixel Shader (Optional Pass)\n\nfloat4 SMAAResolvePS(float2 texcoord,\n                     SMAATexture2D(currentColorTex),\n                     SMAATexture2D(previousColorTex)\n                     #if SMAA_REPROJECTION\n                     , SMAATexture2D(velocityTex)\n                     #endif\n                     ) {\n    #if SMAA_REPROJECTION\n    // Velocity is assumed to be calculated for motion blur, so we need to\n    // inverse it for reprojection:\n    float2 velocity = -SMAA_DECODE_VELOCITY(SMAASamplePoint(velocityTex, texcoord).rg);\n    #elif SMAA_UV_BASED_REPROJECTION\n    float2 velocity = SMAAReproject(texcoord) - texcoord;\n    #endif\n\n    #if (SMAA_REPROJECTION || SMAA_UV_BASED_REPROJECTION)\n    // Fetch current pixel:\n    float4 current = SMAASamplePoint(currentColorTex, texcoord);\n\n    // Reproject current coordinates and fetch previous pixel:\n    float4 previous = SMAASamplePoint(previousColorTex, texcoord + velocity);\n\n    // Attenuate the previous pixel if the velocity is different:\n    float delta = abs(current.a * current.a - previous.a * previous.a) / 5.0;\n    float weight = 0.5 * saturate(1.0 - sqrt(delta) * SMAA_REPROJECTION_WEIGHT_SCALE);\n\n    // Blend the pixels according to the calculated weight:\n    // return lerp(current, previous, weight);\n\n    // Neighbour clamp\n    // Contributed by pommak\n    float4 n0 = SMAASampleOffset(currentColorTex, texcoord, float2(-1, -1));\n    float4 n1 = SMAASampleOffset(currentColorTex, texcoord, float2(+1, -1));\n    float4 n2 = SMAASampleOffset(currentColorTex, texcoord, float2(-1, +1));\n    float4 n3 = SMAASampleOffset(currentColorTex, texcoord, float2(+1, +1));\n    float4 cmax = max(n0, max(n1, max(n2, n3)));\n    float4 cmin = min(n0, min(n1, min(n2, n3)));\n    float4 avg = 0.25 * (n0+n1+n2+n3);\n    float4 wk = abs(avg - current);\n    float blend = saturate(lerp(0.35, 0.85, wk));\n\n    // Clamp previous to neighbours colors\n    float4 previousClamped = clamp(previous, cmin, cmax);\n\n    float4 color = lerp(lerp(current, previousClamped, 0.5*weight), previousClamped, weight);\n    return color;\n    #else\n    // Just blend the pixels:\n    float4 current = SMAASamplePoint(currentColorTex, texcoord);\n    float4 previous = SMAASamplePoint(previousColorTex, texcoord);\n    return lerp(current, previous, 0.5);\n    #endif\n}\n\n//-----------------------------------------------------------------------------\n// Separate Multisamples Pixel Shader (Optional Pass)\n\n#ifdef SMAALoad\nvoid SMAASeparatePS(float4 position,\n                    float2 texcoord,\n                    out float4 target0,\n                    out float4 target1,\n                    SMAATexture2DMS2(colorTexMS)) {\n    int2 pos = int2(position.xy);\n    target0 = SMAALoad(colorTexMS, pos, 0);\n    target1 = SMAALoad(colorTexMS, pos, 1);\n}\n#endif\n\n//-----------------------------------------------------------------------------\n#endif // SMAA_INCLUDE_PS\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/AA/SMAA.cginc.meta",
    "content": "fileFormatVersion: 2\nguid: 3edf75dd062cabf449c243d3c0da9464\nShaderImporter:\n  externalObjects: {}\n  defaultTextures: []\n  nonModifiableTextures: []\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/AA/SMAA.shader",
    "content": "﻿Shader \"Scatterer/SubpixelMorphologicalAntialiasing\"\n{\n\tSubShader\n\t{\n\t\tCull Off ZWrite Off ZTest Always\n\n\n\t\t// 0 - Edge detection (Low)\n\t\tPass\n\t\t{\n\t\t\tCGPROGRAM\n\n\t\t\t#pragma vertex VertEdge\n\t\t\t#pragma fragment FragEdge\n\t\t\t#define SMAA_PRESET_LOW\n\t\t\t#include \"SMAABridge.cginc\"\n\n\t\t\tENDCG\n\t\t}\n\n\t\t// 1 - Edge detection (Medium)\n\t\tPass\n\t\t{\n\t\t\tCGPROGRAM\n\n\t\t\t#pragma vertex VertEdge\n\t\t\t#pragma fragment FragEdge\n\t\t\t#define SMAA_PRESET_MEDIUM\n\t\t\t#include \"SMAABridge.cginc\"\n\n\t\t\tENDCG\n\t\t}\n\n\t\t// 2 - Edge detection (High)\n\t\tPass\n\t\t{\n\t\t\tCGPROGRAM\n\n\t\t\t#pragma vertex VertEdge\n\t\t\t#pragma fragment FragEdge\n\t\t\t#define SMAA_PRESET_HIGH\n\t\t\t#include \"SMAABridge.cginc\"\n\n\t\t\tENDCG\n\t\t}\n\n\t\t// 3 - Blend Weights Calculation (Low)\n\t\tPass\n\t\t{\n\t\t\tCGPROGRAM\n\n\t\t\t#pragma vertex VertBlend\n\t\t\t#pragma fragment FragBlend\n\t\t\t#define SMAA_PRESET_LOW\n\t\t\t#include \"SMAABridge.cginc\"\n\n\t\t\tENDCG\n\t\t}\n\n\t\t// 4 - Blend Weights Calculation (Medium)\n\t\tPass\n\t\t{\n\t\t\tCGPROGRAM\n\n\t\t\t#pragma vertex VertBlend\n\t\t\t#pragma fragment FragBlend\n\t\t\t#define SMAA_PRESET_MEDIUM\n\t\t\t#include \"SMAABridge.cginc\"\n\n\t\t\tENDCG\n\t\t}\n\n\t\t// 5 - Blend Weights Calculation (High)\n\t\tPass\n\t\t{\n\t\t\tCGPROGRAM\n\n\t\t\t#pragma vertex VertBlend\n\t\t\t#pragma fragment FragBlend\n\t\t\t#define SMAA_PRESET_HIGH\n\t\t\t#include \"SMAABridge.cginc\"\n\n\t\t\tENDCG\n\t\t}\n\n\t\t// 6 - Neighborhood Blending\n\t\tPass\n\t\t{\n\t\t\tCGPROGRAM\n\n\t\t\t#pragma vertex VertNeighbor\n\t\t\t#pragma fragment FragNeighbor\n\t\t\t#include \"SMAABridge.cginc\"\n\n\t\t\tENDCG\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/AA/SMAA.shader.meta",
    "content": "fileFormatVersion: 2\nguid: 89df79cf5061c394d82abd40383976e5\nShaderImporter:\n  externalObjects: {}\n  defaultTextures: []\n  nonModifiableTextures: []\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/AA/SMAABridge.cginc",
    "content": "﻿#ifndef UNITY_POSTFX_SMAA_BRIDGE\n#define UNITY_POSTFX_SMAA_BRIDGE\n\n//#include \"StdLib.hlsl\"\n\nsampler2D _MainTexture;\nsampler2D _BlendTex;\nsampler2D _AreaTex;\nsampler2D _SearchTex;\nfloat4 _MainTexture_TexelSize;\n\n#define SMAA_RT_METRICS _MainTexture_TexelSize\n#define SMAA_AREATEX_SELECT(s) s.rg\n#define SMAA_SEARCHTEX_SELECT(s) s.a\n#define LinearSampler sampler_MainTexture\n#define PointSampler sampler_MainTexture\n\n#define SMAA_HLSL_3\n\n#include \"SMAA.cginc\"\n\nstruct AttributesDefault\n{\n\tfloat3 vertex : POSITION;\n};\n\nstruct VaryingsDefault\n{\n\tfloat4 vertex : SV_POSITION;\n\tfloat2 texcoord : TEXCOORD0;\n\tfloat2 texcoordStereo : TEXCOORD1;\n\t#if STEREO_INSTANCING_ENABLED\n\tuint stereoTargetEyeIndex : SV_RenderTargetArrayIndex;\n\t#endif\n};\n\n// Vertex manipulation\nfloat2 TransformTriangleVertexToUV(float2 vertex)\n{\n\t//float2 uv = (vertex + 1.0) * 0.5;\n\tfloat2 uv = vertex;\n\treturn uv;\n}\n\n// ----------------------------------------------------------------------------------------\n// Edge Detection\n\nstruct VaryingsEdge\n{\n    float4 vertex : SV_POSITION;\n    float2 texcoord : TEXCOORD0;\n    float4 offsets[3] : TEXCOORD1;\n};\n\nVaryingsEdge VertEdge(AttributesDefault v)\n{\n    VaryingsEdge o;\n    o.vertex = float4((v.vertex.xy-0.5)*2.0, 0.0, 1.0);\n    o.texcoord = TransformTriangleVertexToUV(v.vertex.xy);\n\n#if UNITY_UV_STARTS_AT_TOP\n    o.texcoord = o.texcoord * float2(1.0, -1.0) + float2(0.0, 1.0);\n#endif\n\n    o.offsets[0] = mad(SMAA_RT_METRICS.xyxy, float4(-1.0, 0.0, 0.0, -1.0), o.texcoord.xyxy);\n    o.offsets[1] = mad(SMAA_RT_METRICS.xyxy, float4( 1.0, 0.0, 0.0,  1.0), o.texcoord.xyxy);\n    o.offsets[2] = mad(SMAA_RT_METRICS.xyxy, float4(-2.0, 0.0, 0.0, -2.0), o.texcoord.xyxy);\n\n    return o;\n}\n\nfloat4 FragEdge(VaryingsEdge i) : SV_Target\n{\n    return float4(SMAAColorEdgeDetectionPS(i.texcoord, i.offsets, _MainTexture), 0.0, 0.0);\n}\n\n// ----------------------------------------------------------------------------------------\n// Blend Weights Calculation\n\nstruct VaryingsBlend\n{\n    float4 vertex : SV_POSITION;\n    float2 texcoord : TEXCOORD0;\n    float2 pixcoord : TEXCOORD1;\n    float4 offsets[3] : TEXCOORD2;\n};\n\nVaryingsBlend VertBlend(AttributesDefault v)\n{\n    VaryingsBlend o;\n    o.vertex = float4((v.vertex.xy-0.5)*2.0, 0.0, 1.0);\n    o.texcoord = TransformTriangleVertexToUV(v.vertex.xy);\n\n#if UNITY_UV_STARTS_AT_TOP\n    o.texcoord = o.texcoord * float2(1.0, -1.0) + float2(0.0, 1.0);\n#endif\n\n    o.pixcoord = o.texcoord * SMAA_RT_METRICS.zw;\n\n    // We will use these offsets for the searches later on (see @PSEUDO_GATHER4):\n    o.offsets[0] = mad(SMAA_RT_METRICS.xyxy, float4(-0.250, -0.125,  1.250, -0.125), o.texcoord.xyxy);\n    o.offsets[1] = mad(SMAA_RT_METRICS.xyxy, float4(-0.125, -0.250, -0.125,  1.250), o.texcoord.xyxy);\n\n    // And these for the searches, they indicate the ends of the loops:\n    o.offsets[2] = mad(SMAA_RT_METRICS.xxyy, float4(-2.0, 2.0, -2.0, 2.0) * float(SMAA_MAX_SEARCH_STEPS),\n        float4(o.offsets[0].xz, o.offsets[1].yw));\n\n        //potentially the offsets or pixcoord are broken, texcoord seems to be fine\n        //textures _AreaTex and _SearchTex should be fine but not sure\n        //perhaps mad is messed up?\n\n    return o;\n}\n\nfloat4 FragBlend(VaryingsBlend i) : SV_Target\n{\n    return SMAABlendingWeightCalculationPS(i.texcoord, i.pixcoord, i.offsets, _MainTexture, _AreaTex, _SearchTex, 0);\n}\n\n// ----------------------------------------------------------------------------------------\n// Neighborhood Blending\n\nstruct VaryingsNeighbor\n{\n    float4 vertex : SV_POSITION;\n    float2 texcoord : TEXCOORD0;\n    float4 offset : TEXCOORD1;\n};\n\nVaryingsNeighbor VertNeighbor(AttributesDefault v)\n{\n    VaryingsNeighbor o;\n    o.vertex = float4((v.vertex.xy-0.5)*2.0, 0.0, 1.0);\n    o.texcoord = TransformTriangleVertexToUV(v.vertex.xy);\n\n#if UNITY_UV_STARTS_AT_TOP\n    o.texcoord = o.texcoord * float2(1.0, -1.0) + float2(0.0, 1.0);\n#endif\n\n    o.offset = mad(SMAA_RT_METRICS.xyxy, float4(1.0, 0.0, 0.0, 1.0), o.texcoord.xyxy);\n    return o;\n}\n\nfloat4 FragNeighbor(VaryingsNeighbor i) : SV_Target\n{\n    return SMAANeighborhoodBlendingPS(i.texcoord, i.offset, _MainTexture, _BlendTex);\n}\n\n#endif\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/AA/SMAABridge.cginc.meta",
    "content": "fileFormatVersion: 2\nguid: d12fd27d9e34a1e43b79b04f9202d548\nShaderImporter:\n  externalObjects: {}\n  defaultTextures: []\n  nonModifiableTextures: []\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/AA/SearchTex.tga.meta",
    "content": "fileFormatVersion: 2\nguid: b14b67faac4aff04fac7127cf1ab4f97\nTextureImporter:\n  internalIDToNameTable: []\n  externalObjects: {}\n  serializedVersion: 10\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 0\n    sRGBTexture: 0\n    linearTexture: 1\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapsPreserveCoverage: 0\n    alphaTestReferenceValue: 0.5\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: 0.25\n    normalMapFilter: 0\n  isReadable: 0\n  streamingMipmaps: 0\n  streamingMipmapsPriority: 0\n  grayScaleToAlpha: 1\n  generateCubemap: 6\n  cubemapConvolution: 0\n  seamlessCubemap: 0\n  textureFormat: 1\n  maxTextureSize: 2048\n  textureSettings:\n    serializedVersion: 2\n    filterMode: 0\n    aniso: -1\n    mipBias: -100\n    wrapU: 1\n    wrapV: 1\n    wrapW: 1\n  nPOTScale: 0\n  lightmap: 0\n  compressionQuality: 50\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: 0.5, y: 0.5}\n  spritePixelsToUnits: 100\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spriteGenerateFallbackPhysicsShape: 1\n  alphaUsage: 2\n  alphaIsTransparency: 0\n  spriteTessellationDetail: -1\n  textureType: 10\n  textureShape: 1\n  singleChannelComponent: 0\n  maxTextureSizeSet: 0\n  compressionQualitySet: 0\n  textureFormatSet: 0\n  platformSettings:\n  - serializedVersion: 3\n    buildTarget: DefaultTexturePlatform\n    maxTextureSize: 2048\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 0\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 1\n  - serializedVersion: 3\n    buildTarget: Standalone\n    maxTextureSize: 2048\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 0\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 1\n  - serializedVersion: 3\n    buildTarget: PS4\n    maxTextureSize: 2048\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 0\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 1\n  spriteSheet:\n    serializedVersion: 2\n    sprites: []\n    outline: []\n    physicsShape: []\n    bones: []\n    spriteID: \n    internalID: 0\n    vertices: []\n    indices: \n    edges: []\n    weights: []\n    secondaryTextures: []\n  spritePackingTag: \n  pSDRemoveMatte: 0\n  pSDShowRemoveMatteOption: 0\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/AA.meta",
    "content": "fileFormatVersion: 2\nguid: 7db44d889e0cbbf4281132a752f96ce1\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Atmo/CompositeDownscaledScattering.shader",
    "content": "﻿Shader \"Scatterer/CompositeDownscaledScattering\" {\n\tSubShader {\n\t\tTags {\"Queue\" = \"Transparent-499\" \"IgnoreProjector\" = \"True\" \"RenderType\" = \"Transparent\"}\n\n\t\tPass {\n\t\t\tTags {\"Queue\" = \"Transparent-499\" \"IgnoreProjector\" = \"True\" \"RenderType\" = \"Transparent\"}\n\n\t\t\tCull Off\n\t\t\tZTest Off\n\t\t\tZWrite [_ZwriteVariable]\n\n\t\t\tBlend SrcAlpha OneMinusSrcAlpha //traditional alpha-blending\n\n\t\t\tCGPROGRAM\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\t\t\t#pragma target 3.0\n\t\t\t#include \"UnityCG.cginc\"\n\t\t\t#include \"../CommonAtmosphere.cginc\"\n\n\t\t\t#pragma multi_compile CUSTOM_OCEAN_OFF CUSTOM_OCEAN_ON\n\n\t\t\tuniform sampler2D DownscaledScattering0;\t//Scattering RGB, extinction.R\n\t\t\tuniform sampler2D DownscaledScattering1;\t//Extinction.GB\n\n\t\t\tuniform sampler2D ScattererDownscaledScatteringDepth;\n\t\t\tfloat4 ScattererDownscaledScatteringDepth_TexelSize;\n\n\n#if defined (CUSTOM_OCEAN_ON)\n\t\t\tuniform sampler2D ScattererScreenCopy;\n\t\t\tuniform sampler2D ScattererDepthCopy;\n\t\t\tfloat4 ScattererDepthCopy_TexelSize;\n\n\t\t\t#define fullresDepthTexture ScattererDepthCopy;\n\t\t\t#define fullresDepthTexture_TexelSize ScattererDepthCopy_TexelSize;\n#else\n\t\t\tuniform sampler2D _CameraDepthTexture;\n\t\t\tfloat4 _CameraDepthTexture_TexelSize;\n\n\t\t\t#define fullresDepthTexture _CameraDepthTexture;\n\t\t\t#define fullresDepthTexture_TexelSize _CameraDepthTexture_TexelSize;\n\n\t\t\tuniform sampler2D ScattererScreenCopyBeforeOcean;\n#endif\n\n\t\t\tstruct v2f\n\t\t\t{\n\t\t\t\tfloat4 screenPos : TEXCOORD0;\n\t\t\t};\n\n\t\t\tv2f vert(appdata_base v, out float4 outpos: SV_POSITION)\n\t\t\t{\n\t\t\t\tv2f o;\n\n#if defined(SHADER_API_GLES) || defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE)\n\t\t\t\toutpos = float4(2.0 * v.vertex.x, 2.0 * v.vertex.y *_ProjectionParams.x, -1.0 , 1.0);\n#else\n\t\t\t\toutpos = float4(2.0 * v.vertex.x, 2.0 * v.vertex.y, 0.0 , 1.0);\n#endif\n\t\t\t\to.screenPos = ComputeScreenPos(outpos);\n\n\t\t\t\treturn o;\n\t\t\t}\n\t\t\t\t\n\t\t\tstruct fout\n\t\t\t{\n\t\t\t\tfloat4 color : COLOR;\n#if defined (CUSTOM_OCEAN_ON)\n\t\t\t\tfloat depth  : DEPTH;\n#endif\n\t\t\t};\n\n\t\t\tvoid UpdateNearestSample(\tinout float MinDist,\n\t\t\t\tinout float2 NearestUV,\n\t\t\t\tfloat Z,\n\t\t\t\tfloat2 UV,\n\t\t\t\tfloat ZFull\n\t\t\t)\n\t\t\t{\n\t\t\t\tfloat Dist = abs(Z - ZFull);\n#if SHADER_API_D3D11 || SHADER_API_D3D || SHADER_API_D3D12\n\t\t\t\tif ((Dist < MinDist) && (Z > 0.0))\n#else\n\t\t\t\tif ((Dist < MinDist) && (Z < 1.0))\n#endif\n\t\t\t\t{\n\t\t\t\t\tMinDist = Dist;\n\t\t\t\t\tNearestUV = UV;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfout frag(v2f i, UNITY_VPOS_TYPE screenPos : VPOS)\n\t\t\t{\n\t\t\t\tfloat2 uv = i.screenPos.xy / i.screenPos.w;\n\n#if defined (CUSTOM_OCEAN_ON)\n\t\t\t\tfloat zdepth = tex2Dlod(ScattererDepthCopy, float4(uv,0,0));\n#else\n\t\t\t\tfloat zdepth = tex2Dlod(_CameraDepthTexture, float4(uv,0,0));\n#endif\n\n\t\t\t\t//read full resolution depth\n\t\t\t\tfloat ZFull = Linear01Depth(zdepth);\n\n#if SHADER_API_D3D11 || SHADER_API_D3D || SHADER_API_D3D12\n\t\t\t\tif (_ProjectionParams.x > 0) {uv.y = 1.0 - uv.y;}\n\t\t\t\tif (zdepth == 0.0) {discard;}\n#else\n\t\t\t\tif (zdepth == 1.0) {discard;}\n#endif\n\n\t\t\t\t//find low res depth texture texel size\n\t\t\t\tfloat2 lowResTexelSize = ScattererDownscaledScatteringDepth_TexelSize.xy;\n\n\t\t\t\tfloat2 lowResUV = uv; \n\n\t\t\t\tfloat MinDist = 1.0;\n\n\t\t\t\tfloat2 UV00 = lowResUV - 0.5 * lowResTexelSize;\n\t\t\t\tfloat2 NearestUV = UV00;\n\t\t\t\tfloat Z00 = Linear01Depth( SAMPLE_DEPTH_TEXTURE( ScattererDownscaledScatteringDepth, UV00) );   \n\t\t\t\tUpdateNearestSample(MinDist, NearestUV, Z00, UV00, ZFull);\n\n\t\t\t\tfloat2 UV10 = float2(UV00.x+lowResTexelSize.x, UV00.y);\n\t\t\t\tfloat Z10 = Linear01Depth( SAMPLE_DEPTH_TEXTURE( ScattererDownscaledScatteringDepth, UV10) );  \n\t\t\t\tUpdateNearestSample(MinDist, NearestUV, Z10, UV10, ZFull);\n\n\t\t\t\tfloat2 UV01 = float2(UV00.x, UV00.y+lowResTexelSize.y);\n\t\t\t\tfloat Z01 = Linear01Depth( SAMPLE_DEPTH_TEXTURE( ScattererDownscaledScatteringDepth, UV01) );  \n\t\t\t\tUpdateNearestSample(MinDist, NearestUV, Z01, UV01, ZFull);\n\n\t\t\t\tfloat2 UV11 = UV00 + lowResTexelSize;\n\t\t\t\tfloat Z11 = Linear01Depth( SAMPLE_DEPTH_TEXTURE( ScattererDownscaledScatteringDepth, UV11) );  \n\t\t\t\tUpdateNearestSample(MinDist, NearestUV, Z11, UV11, ZFull);\n\n\t\t\t\tfloat4 col0 = tex2Dlod(DownscaledScattering0, float4(NearestUV,0,0));\n\t\t\t\tfloat2 col1 = tex2Dlod(DownscaledScattering1, float4(NearestUV,0,0)).rg;\n\n\t\t\t\tfloat3 inscatter = col0.rgb;\n\t\t\t\tfloat3 extinction = float3(col0.a,col1.rg);\n\n#if defined (CUSTOM_OCEAN_ON)\n\t\t\t\tfloat3 backGrnd = tex2Dlod(ScattererScreenCopy, float4(uv.x, uv.y,0.0,0.0));\n#else\n\t\t\t\tfloat3 backGrnd = tex2Dlod(ScattererScreenCopyBeforeOcean, float4(uv.x, uv.y,0.0,0.0));\n#endif\n\n\t\t\t\t//composite backGround by extinction\n\t\t\t\tbackGrnd*=extinction;\n\n\t\t\t\t//composite background with inscatter, soft-blend it\n\t\t\t\tbackGrnd+= (1.0 - backGrnd) * dither(inscatter, screenPos);\n\n\t\t\t\tfout output;\n\t\t\t\toutput.color = float4(backGrnd,1.0);\n#if defined (CUSTOM_OCEAN_ON)\n\t\t\t\toutput.depth = zdepth;\t\t\t//this needs to only be done if rendering with an ocean\n#endif\n\t\t\t\treturn output;\n\t\t\t}\n\t\t\tENDCG\n\t\t}\n\t}\n\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Atmo/CompositeDownscaledScattering.shader.meta",
    "content": "fileFormatVersion: 2\nguid: 94a7f67cf7303d94fa3f076bd9f33095\nShaderImporter:\n  externalObjects: {}\n  defaultTextures: []\n  nonModifiableTextures: []\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Atmo/DepthBufferScattering.shader",
    "content": "﻿Shader \"Scatterer/DepthBufferScattering\" {\n\tSubShader {\n\t\tTags {\"Queue\" = \"Transparent-499\" \"IgnoreProjector\" = \"True\" \"RenderType\" = \"Transparent\"}\n\n\t\tPass {\t//Pass 0: render to screen directly\n\t\t\tTags {\"Queue\" = \"Transparent-499\" \"IgnoreProjector\" = \"True\" \"RenderType\" = \"Transparent\"}\n\n\t\t\tCull Off\n\t\t\tZTest Off\n\t\t\tZWrite [_ZwriteVariable]\n\n\t\t\tBlend SrcAlpha OneMinusSrcAlpha //traditional alpha-blending\n\n\t\t\tCGPROGRAM\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\t\t\t#pragma target 3.0\n\t\t\t#include \"UnityCG.cginc\"\n\t\t\t#include \"../CommonAtmosphere.cginc\"\n\t\t\t#include \"../DepthCommon.cginc\"\n\t\t\t#include \"Godrays/GodraysCommon.cginc\"\n\n//\t\t\t#pragma multi_compile ECLIPSES_OFF ECLIPSES_ON\n//\t\t\t#pragma multi_compile PLANETSHINE_OFF PLANETSHINE_ON\n\t\t\t#pragma multi_compile CUSTOM_OCEAN_OFF CUSTOM_OCEAN_ON\n\t\t\t#pragma multi_compile DITHERING_OFF DITHERING_ON\n\t\t\t#pragma multi_compile GODRAYS_OFF GODRAYS_ON\n\n\t\t\tuniform float _global_alpha;\n\t\t\tuniform float _global_depth;\n\t\t\tuniform float3 _planetPos; //planet origin, in world space\n\t\t\tuniform float3 _camForward; //camera's viewing direction, in world space\n\t\t\tuniform float _ScatteringExposure;\n\n\t\t\tuniform float _PlanetOpacity; //to smooth transition from/to scaledSpace\n\n\t\t\tuniform float _Post_Extinction_Tint;\n\t\t\tuniform float extinctionThickness;\n\n#if defined (GODRAYS_ON)\n\t\t\tuniform sampler2D _godrayDepthTexture;\n\t\t\tuniform float _godrayStrength;\n#endif\n\t\t\tuniform float _openglThreshold;\n\n#if defined (CUSTOM_OCEAN_ON)\n\t\t\tuniform sampler2D ScattererScreenCopy;\n\t\t\tuniform sampler2D ScattererDepthCopy;\n#else\n\t\t\tuniform sampler2D ScattererScreenCopyBeforeOcean;\n#endif\n\t\t\tfloat4x4 CameraToWorld;\n\n#if defined (PLANETSHINE_ON)\n\t\t\tuniform float4x4 planetShineSources;\n\t\t\tuniform float4x4 planetShineRGB;\n#endif\n\n\t\t\tstruct v2f\n\t\t\t{\n\t\t\t\tfloat3 camPosRelPlanet : TEXCOORD0;\n\t\t\t\tfloat4 screenPos : TEXCOORD1;\n\t\t\t};\n\n\t\t\tv2f vert(appdata_base v, out float4 outpos: SV_POSITION)\n\t\t\t{\n\t\t\t\tv2f o;\n\n#if defined(SHADER_API_GLES) || defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE)\n\t\t\t\toutpos = float4(2.0 * v.vertex.x, 2.0 * v.vertex.y *_ProjectionParams.x, -1.0 , 1.0);\n#else\n\t\t\t\toutpos = float4(2.0 * v.vertex.x, 2.0 * v.vertex.y, 0.0 , 1.0);\n#endif\n\t\t\t\to.camPosRelPlanet = _WorldSpaceCameraPos - _planetPos;\n\t\t\t\to.screenPos = ComputeScreenPos(outpos);\n\n\t\t\t\treturn o;\n\t\t\t}\n\n\t\t\t//this needs to only be done if rendering with an ocean\n\t\t\t//probably hurts performance on low-spec machines so disable it\n\t\t\tstruct fout\n\t\t\t{\n\t\t\t\tfloat4 color : COLOR;\n#if defined (CUSTOM_OCEAN_ON)\n\t\t\t\tfloat depth : DEPTH;\n#endif\n\t\t\t};\n\n\t\t\tfout frag(v2f i, UNITY_VPOS_TYPE screenPos : VPOS)\n\t\t\t{\n\t\t\t\tfloat2 uv = i.screenPos.xy / i.screenPos.w;\n\n#if defined (CUSTOM_OCEAN_ON)\n\t\t\t\tfloat zdepth = tex2Dlod(ScattererDepthCopy, float4(uv,0,0));\n#else\n\t\t\t\tfloat zdepth = tex2Dlod(_CameraDepthTexture, float4(uv,0,0));\n#endif\n\n#if SHADER_API_D3D11 || SHADER_API_D3D || SHADER_API_D3D12\n\t\t\t\tif (_ProjectionParams.x > 0) {uv.y = 1.0 - uv.y;}\n\t\t\t\tif (zdepth == 0.0) {discard;}\n#else\n\t\t\t\tif (zdepth == 1.0) {discard;}\n#endif\n\n\t\t\t\tfloat3 absWorldPos = getPreciseWorldPosFromDepth(i.screenPos.xy / i.screenPos.w, zdepth, CameraToWorld);\n\t\t\t\tfloat3 worldPos = absWorldPos - _planetPos;  //worldPos relative to planet origin\n\n\t\t\t\tfloat3 groundPos = normalize (worldPos) * Rg * 1.0008;\n\t\t\t\tfloat Rt2 = Rg + (Rt - Rg) * _experimentalAtmoScale;\n\n\t\t\t\tworldPos = (length(worldPos) < Rt2) ? lerp(groundPos,worldPos,_PlanetOpacity) : worldPos; //fades to flatScaledSpace planet shading to ease the transition to scaledSpace\n\n\t\t\t\tworldPos= (length(worldPos) < (Rg + _openglThreshold)) ? (Rg + _openglThreshold) * normalize(worldPos) : worldPos ; //artifacts fix\n\n#if defined (CUSTOM_OCEAN_ON)\n\t\t\t\tfloat3 backGrnd = tex2Dlod(ScattererScreenCopy, float4(uv.x, uv.y,0.0,0.0));\n#else\n\t\t\t\tfloat3 backGrnd = tex2Dlod(ScattererScreenCopyBeforeOcean, float4(uv.x, uv.y,0.0,0.0));\n#endif\n\t\t\t\tfloat minDistance = length(worldPos-i.camPosRelPlanet);\n\t\t\t\tfloat3 inscatter=0.0;\n\t\t\t\tfloat3 extinction=1.0;\n\n#if defined (GODRAYS_ON)\n\t\t\t\t//extinction of the full distance to the terrain, not just the lit part when factoring in godrays\n\t\t\t\tfloat3 fullSegmentExtinction = getExtinction(i.camPosRelPlanet, worldPos, 1.0, 1.0, 1.0);\n\n\t\t\t\tfloat godrayDepth = 0.0;\n\n\t\t\t\tgodrayDepth = sampleGodrayDepth(_godrayDepthTexture, uv, 1.0);\n\n\t\t\t\t//trying to find the optical depth from the terrain level\n\t\t\t\tfloat muTerrain = dot(normalize(worldPos), normalize(_WorldSpaceCameraPos - absWorldPos));\n\n\t\t\t\tgodrayDepth = _godrayStrength * DistanceFromOpticalDepth(_experimentalAtmoScale * (Rt-Rg) * 0.5, length(worldPos), muTerrain, godrayDepth, minDistance);\n\n\t\t\t\tworldPos -= godrayDepth * normalize(worldPos-i.camPosRelPlanet);\n#endif\n\n\t\t\t\tinscatter+= InScattering2(i.camPosRelPlanet, worldPos,SUN_DIR,extinction);\n\t\t\t\tinscatter*= (minDistance <= _global_depth) ? (1 - exp(-1 * (4 * minDistance / _global_depth))) : 1.0 ; //somehow the shader compiler for OpenGL behaves differently around braces\n\n\t\t\t\tinscatter = hdr(inscatter,_ScatteringExposure) *_global_alpha;\n\n#if defined (GODRAYS_ON)\n\t\t\t\textinction = fullSegmentExtinction;\n#endif\n\n\t\t\t\tfloat extinctionAverage=(extinction.r+extinction.g+extinction.b)/3;\n\n\t\t\t\t//lerped manually because of an issue with opengl or whatever\n\t\t\t\textinction = _Post_Extinction_Tint * extinction + (1-_Post_Extinction_Tint) * float3(extinctionAverage,extinctionAverage,extinctionAverage);\n\n\t\t\t\textinction= max(float3(0.0,0.0,0.0), (float3(1.0,1.0,1.0)*(1-extinctionThickness) + extinctionThickness*extinction) );\n\n\t\t\t\t//composite backGround by extinction\n\t\t\t\tbackGrnd*=extinction;\n\n\t\t\t\t//composite background with inscatter, soft-blend it\n\t\t\t\tbackGrnd+= (1.0 - backGrnd) * dither(inscatter,screenPos);\n\n\t\t\t\tfout output;\n\t\t\t\toutput.color = float4(backGrnd,1.0);\n#if defined (CUSTOM_OCEAN_ON)\n\t\t\t\toutput.depth = zdepth;\t//this needs to only be done if rendering with an ocean\n#endif\n\t\t\t\treturn output;\n\t\t\t}\n\t\t\tENDCG\n\t\t}\n\n\t\tPass {\t//Pass 1: render to 1/4 res textures\n\t\t\tTags {\"Queue\" = \"Transparent-499\" \"IgnoreProjector\" = \"True\" \"RenderType\" = \"Transparent\"}\n\n\t\t\tCull Off\n\t\t\tZTest Off\n\t\t\tZWrite Off\n\n\t\t\tCGPROGRAM\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\t\t\t#pragma target 3.0\n\t\t\t#include \"UnityCG.cginc\"\n\t\t\t#include \"../CommonAtmosphere.cginc\"\n\t\t\t#include \"../DepthCommon.cginc\"\n\t\t\t#include \"Godrays/GodraysCommon.cginc\"\n\n\t\t\t//\t\t\t#pragma multi_compile ECLIPSES_OFF ECLIPSES_ON\n\t\t\t//\t\t\t#pragma multi_compile PLANETSHINE_OFF PLANETSHINE_ON\n\t\t\t#pragma multi_compile GODRAYS_OFF GODRAYS_ON\n\n\t\t\tuniform float _global_alpha;\n\t\t\tuniform float _global_depth;\n\t\t\tuniform float3 _planetPos; //planet origin, in world space\n\t\t\tuniform float3 _camForward; //camera's viewing direction, in world space\n\t\t\tuniform float _ScatteringExposure;\n\n\t\t\tuniform float _PlanetOpacity; //to smooth transition from/to scaledSpace\n\n\t\t\tuniform float _Post_Extinction_Tint;\n\t\t\tuniform float extinctionThickness;\n\n#if defined (GODRAYS_ON)\n\t\t\tuniform sampler2D _godrayDepthTexture;\n\t\t\tuniform float _godrayStrength;\n#endif\n\t\t\tuniform float _openglThreshold;\n\n\t\t\tuniform sampler2D ScattererDownscaledScatteringDepth;\n\n\t\t\tfloat4x4 CameraToWorld;\n\n#if defined (PLANETSHINE_ON)\n\t\t\tuniform float4x4 planetShineSources;\n\t\t\tuniform float4x4 planetShineRGB;\n#endif\n\n\t\t\tstruct v2f\n\t\t\t{\n\t\t\t\tfloat3 camPosRelPlanet : TEXCOORD0;\n\t\t\t\tfloat4 screenPos : TEXCOORD1;\n\t\t\t};\n\n\t\t\tv2f vert(appdata_base v, out float4 outpos: SV_POSITION)\n\t\t\t{\n\t\t\t\tv2f o;\n\n\t\t\t\t#if defined(SHADER_API_GLES) || defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE)\n\t\t\t\toutpos = float4(2.0 * v.vertex.x, 2.0 * v.vertex.y *_ProjectionParams.x, -1.0 , 1.0);\n\t\t\t\t#else\n\t\t\t\toutpos = float4(2.0 * v.vertex.x, 2.0 * v.vertex.y, 0.0 , 1.0);\n\t\t\t\t#endif\n\t\t\t\to.camPosRelPlanet = _WorldSpaceCameraPos - _planetPos;\n\t\t\t\to.screenPos = ComputeScreenPos(outpos);\n\n\t\t\t\treturn o;\n\t\t\t}\n\n\t\t\tstruct fout\n\t\t\t{\n\t\t\t\tfloat4 col0 : COLOR0;\n\t\t\t\tfloat4 col1 : COLOR1;\n\t\t\t};\n\n\t\t\tfout frag(v2f i, UNITY_VPOS_TYPE screenPos : VPOS)\n\t\t\t{\n\t\t\t\tfout output;\n\n\t\t\t\tfloat2 uv = i.screenPos.xy / i.screenPos.w;\n\n\t\t\t\tfloat zdepth = tex2Dlod(ScattererDownscaledScatteringDepth, float4(uv,0,0));\n\n#if SHADER_API_D3D11 || SHADER_API_D3D || SHADER_API_D3D12\n\t\t\t\tif (_ProjectionParams.x > 0) {uv.y = 1.0 - uv.y;}\n\t\t\t\tif (zdepth == 0.0) {discard;}\n#else\n\t\t\t\tif (zdepth == 1.0) {discard;}\n#endif\n\n\t\t\t\tfloat3 absWorldPos = getPreciseWorldPosFromDepth(i.screenPos.xy / i.screenPos.w, zdepth, CameraToWorld);\n\t\t\t\tfloat3 worldPos = absWorldPos - _planetPos;  //worldPos relative to planet origin\n\n\t\t\t\tfloat3 groundPos = normalize (worldPos) * Rg * 1.0008;\n\t\t\t\tfloat Rt2 = Rg + (Rt - Rg) * _experimentalAtmoScale;\n\n\t\t\t\tworldPos = (length(worldPos) < Rt2) ? lerp(groundPos,worldPos,_PlanetOpacity) : worldPos; //fades to flatScaledSpace planet shading to ease the transition to scaledSpace\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  //this wasn't applied in extinction shader, not sure if it will be an issue\n\n\t\t\t\tworldPos= (length(worldPos) < (Rg + _openglThreshold)) ? (Rg + _openglThreshold) * normalize(worldPos) : worldPos ; //artifacts fix\n\n\t\t\t\tfloat minDistance = length(worldPos-i.camPosRelPlanet);\n\n#if defined (GODRAYS_ON)\n\t\t\t\t//extinction of the full distance to the terrain, not just the lit part when factoring in godrays\n\t\t\t\tfloat3 fullSegmentExtinction = getExtinction(i.camPosRelPlanet, worldPos, 1.0, 1.0, 1.0);\n\n\t\t\t\tfloat godrayDepth = 0.0;\n\n\t\t\t\tgodrayDepth = sampleGodrayDepth(_godrayDepthTexture, uv, 1.0);\n\n\t\t\t\t//trying to find the optical depth from the terrain level\n\t\t\t\tfloat muTerrain = dot(normalize(worldPos), normalize(_WorldSpaceCameraPos - absWorldPos));\n\n\t\t\t\tgodrayDepth = _godrayStrength * DistanceFromOpticalDepth(_experimentalAtmoScale * (Rt-Rg) * 0.5, length(worldPos), muTerrain, godrayDepth, minDistance);\n\n\t\t\t\tworldPos -= godrayDepth * normalize(worldPos-i.camPosRelPlanet);\n#endif\n\t\t\t\tfloat3 inscatter=0.0;\n\t\t\t\tfloat3 extinction=1.0;\n\n\t\t\t\tinscatter+= InScattering2(i.camPosRelPlanet, worldPos,SUN_DIR,extinction);\n\t\t\t\tinscatter*= (minDistance <= _global_depth) ? (1 - exp(-1 * (4 * minDistance / _global_depth))) : 1.0 ; //somehow the shader compiler for OpenGL behaves differently around braces\n\n\t\t\t\tinscatter = hdr(inscatter,_ScatteringExposure) *_global_alpha;\n\n\t\t\t\toutput.col0.rgb = inscatter;\n\n#if defined (GODRAYS_ON)\n\t\t\t\textinction = fullSegmentExtinction;\n#endif\n\n\t\t\t\tfloat extinctionAverage=(extinction.r+extinction.g+extinction.b)/3;\n\n\t\t\t\t//lerped manually because of an issue with opengl or whatever\n\t\t\t\textinction = _Post_Extinction_Tint * extinction + (1-_Post_Extinction_Tint) * float3(extinctionAverage,extinctionAverage,extinctionAverage);\n\n\t\t\t\textinction= max(float3(0.0,0.0,0.0), (float3(1.0,1.0,1.0)*(1-extinctionThickness) + extinctionThickness*extinction) );\n\n\t\t\t\toutput.col0.a = extinction.r;\n\t\t\t\toutput.col1 = float4(extinction.g,extinction.b,1.0,1.0);\n\n\t\t\t\treturn output;\n\t\t\t}\n\t\t\tENDCG\n\t\t}\n\t}\n\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Atmo/DepthBufferScattering.shader.meta",
    "content": "fileFormatVersion: 2\nguid: 470fdf3cd8176d94e8aadd242240fe3c\nShaderImporter:\n  externalObjects: {}\n  defaultTextures: []\n  nonModifiableTextures: []\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Atmo/Godrays/ComputeInverseShadowMatrices.compute",
    "content": "﻿#pragma kernel CSMain\n\nfloat4x4 unity_WorldToShadow[4];\n\nRWStructuredBuffer<float4x4> resultBuffer;\n\n//from https://answers.unity.com/questions/218333/shader-inversefloat4x4-function.html\nfloat4x4 inverse(float4x4 input)\n{\n\t#define minor(a,b,c) determinant(float3x3(input.a, input.b, input.c))\n\n\tfloat4x4 cofactors = float4x4(\n\t\tminor(_22_23_24, _32_33_34, _42_43_44), \n\t\t-minor(_21_23_24, _31_33_34, _41_43_44),\n\t\tminor(_21_22_24, _31_32_34, _41_42_44),\n\t\t-minor(_21_22_23, _31_32_33, _41_42_43),\n\n\t\t-minor(_12_13_14, _32_33_34, _42_43_44),\n\t\tminor(_11_13_14, _31_33_34, _41_43_44),\n\t\t-minor(_11_12_14, _31_32_34, _41_42_44),\n\t\tminor(_11_12_13, _31_32_33, _41_42_43),\n\n\t\tminor(_12_13_14, _22_23_24, _42_43_44),\n\t\t-minor(_11_13_14, _21_23_24, _41_43_44),\n\t\tminor(_11_12_14, _21_22_24, _41_42_44),\n\t\t-minor(_11_12_13, _21_22_23, _41_42_43),\n\n\t\t-minor(_12_13_14, _22_23_24, _32_33_34),\n\t\tminor(_11_13_14, _21_23_24, _31_33_34),\n\t\t-minor(_11_12_14, _21_22_24, _31_32_34),\n\t\tminor(_11_12_13, _21_22_23, _31_32_33)\n\t);\n\t#undef minor\n\treturn transpose(cofactors) / determinant(input);\n}\n\n[numthreads(1,1,1)]\nvoid CSMain (uint id : SV_DispatchThreadID)\n{\n    resultBuffer[id] = inverse(unity_WorldToShadow[id]);\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Atmo/Godrays/ComputeInverseShadowMatrices.compute.meta",
    "content": "fileFormatVersion: 2\nguid: eac7b0dfe80ae8b41b71e9e0c040a433\nComputeShaderImporter:\n  externalObjects: {}\n  currentAPIMask: 131076\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Atmo/Godrays/GodraysCommon.cginc",
    "content": "//Factor to divide the godray depth by before storing\n//Half have a max value of ~65000, we need to divide the depth value to be able to store it in a half texture\n#define textureDivisionFactor 100.0;\n\ninline float sampleGodrayDepth(sampler2D _godrayDepthTexture, float2 depthUV, float _godrayStrength)\n{\n\tfloat godrayDepth = tex2Dlod(_godrayDepthTexture, float4(depthUV,0,0)).r;\n\tgodrayDepth*=_godrayStrength*textureDivisionFactor;\n\treturn max(godrayDepth,0.0);\n}\n\ninline float writeGodrayToTexture(float depth)\n{\n\treturn depth / textureDivisionFactor;\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Atmo/Godrays/GodraysCommon.cginc.meta",
    "content": "fileFormatVersion: 2\nguid: 9f2f480fb2536e54ab8493a4e7421720\nShaderImporter:\n  externalObjects: {}\n  defaultTextures: []\n  nonModifiableTextures: []\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Atmo/Godrays/ShadowVolumeUtils.cginc",
    "content": "//check if ray defined by origin and end intersects frustum\n//for it to intersect frustum origin and end must be on different ends of one of the axes\nbool intersectsFrustum(float3 origin, float3 end)\n{\n\treturn !(origin.x > 1.0 && end.x > 1.0 || origin.x < -1.0 && end.x < -1.0)\n\t\t|| !(origin.y > 1.0 && end.y > 1.0 || origin.y < -1.0 && end.y < -1.0)\n\t\t|| !(origin.z < 0.0 && end.z < 0.0);\n}\n\nfloat rayDistanceToPoint(float3 rayOrigin, float3 rayDirection, float3 targetPoint)\n{\n\treturn  length(cross(rayDirection, targetPoint - rayOrigin));\n}\n\ninline bool between(float a, float b, float x)\n{\n\treturn (x > a) && (x < b);\n}\n\n//cascadeWeights -> 0,1,2,3 -> zero is the most detailed -> 3 is the least detailed\n//0 is in lower left corner, 1 in lower right corner, 2 in upper left corner, 3 in upper right corner, in the case of regular cascades no split spheres, not sure about splitSpheres\n//Still need to check the shadowMap for each cascade though to make sure we have a depth value at that coordinate\ninline fixed pickMostDetailedCascade(float4 wpos, out float4 shadowPos, sampler2D shadowMap)\n{\n\tfloat zdepth = 0;\n\tshadowPos = 0;\n\n\tfor (int i=0; i<4;i++)\n\t{\n\t\tfloat3 coords = mul (unity_WorldToShadow[i], wpos).xyz;\n\t\tzdepth = tex2Dlod(shadowMap, float4(coords.xy,0.0,0.0)).r;\n\t\t\t\n\t\tfloat startX = fmod(i,2) * 0.5;\n\t\tfloat startY = (i/2) * 0.5;\n\n\t\tif (between(startX, startX+0.5, coords.x) && between(startY, startY+0.5, coords.y) && (zdepth > 0.0) && ((zdepth < 0.98) || (i==3) ))\n\t\t{\n\t\t\tshadowPos = float4(coords.xy, zdepth, 1.0);\n\t\t\treturn i;\n\t\t}\n\t}\n\n\treturn -1;\n}\n\n//same but pick between regular shadowMap and cloud shadowMap\ninline fixed pickMostDetailedCascadeCloud(float4 wpos, out float4 shadowPos, sampler2D shadowMap, sampler2D cloudShadowMap, out float isCloud)\n{\n\tshadowPos = 0;\n\n\tfor (int i=0; i<4;i++)\n\t{\n\t\tfloat3 coords = mul (unity_WorldToShadow[i], wpos).xyz;\n\n\t\tfloat zdepth = tex2Dlod(shadowMap, float4(coords.xy,0.0,0.0)).r;\n\t\tfloat zdepthCloud = tex2Dlod(cloudShadowMap, float4(coords.xy,0.0,0.0)).r;\n\n\t\tfloat maxDepth = max(zdepth,zdepthCloud);\n\n\t\tfloat startX = fmod(i,2) * 0.5;\n\t\tfloat startY = (i/2) * 0.5;\n\n\t\tif (between(startX, startX+0.5, coords.x) && between(startY, startY+0.5, coords.y) && (maxDepth > 0.0) && ((maxDepth < 0.98) || (i==3) ))\n\t\t{\n\t\t\tisCloud = (zdepthCloud > zdepth) ? 1.0 : 0.0;\n\t\t\tshadowPos = float4(coords.xy, maxDepth, 1.0);\n\t\t\treturn i;\n\t\t}\n\t}\n\n\treturn -1;\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Atmo/Godrays/ShadowVolumeUtils.cginc.meta",
    "content": "fileFormatVersion: 2\nguid: c14a5e4bdca08454eb523515cecf43c2\nShaderImporter:\n  externalObjects: {}\n  defaultTextures: []\n  nonModifiableTextures: []\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Atmo/Godrays/VolumeDepth - Copy.shader.BAK",
    "content": "﻿Shader \"Scatterer/VolumeDepth\"\n{\n\tProperties\n\t{\n\n\t}\n\tSubShader\n\t{\n\t\tTags { \"RenderType\"=\"Opaque\" }\n\t\tLOD 100\n\n\n\t\tPass\n\t\t{\n\n\t\t\tCull Off\n\n\t\t\tZWrite Off\n\t\t\tZTest Always\n\t\t\tBlend One One\n\n//\t\t\tBlend SrcAlpha OneMinusSrcAlpha\n\n\t\t\tCGPROGRAM\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\t\t\t#pragma hull hull\n\t\t\t#pragma domain domain\n\n\t\t\t#include \"UnityCG.cginc\"\n\t\t\t#include \"UnityShadowLibrary.cginc\"\n\t\t\t#include \"ShadowVolumeUtils.cginc\"\n\n\t\t\t#pragma multi_compile DUAL_DEPTH_OFF DUAL_DEPTH_ON\n\n\t\t\tsampler2D _ShadowMapTextureCopyScatterer;\n\t\t\tsampler2D _CameraDepthTexture;\n\t\t\tfloat4x4 CameraToWorld;\n\n#if defined(DUAL_DEPTH_ON)\n\t\t\tUNITY_DECLARE_DEPTH_TEXTURE(AdditionalDepthBuffer);\n\t\t\tfloat4x4  ScattererAdditionalInvProjection;\n#endif\n\n\t\t\tStructuredBuffer<float4x4> inverseShadowMatricesBuffer;\n\n\t\t\tfloat4x4 lightToWorld;\n\n\n\t\t\tstruct appdata\n\t\t\t{\n\t\t\t\tfloat4 vertex : POSITION;\n\t\t\t\tfloat2 uv : TEXCOORD0;\n\t\t\t};\n\n\t\t\tstruct v2t //vertex 2 tesselation\n\t\t\t{\n\t\t\t\tfloat4 pos : INTERNALTESSPOS;\n\t\t\t\tfloat4 worldOriginPos : TEXCOORD0;\n\t\t\t\tfloat4 worldEndPos : TEXCOORD1;\n\t\t\t};\n\n\t\t\tstruct d2f //domain 2 frag\n\t\t\t{\n\t\t\t\tfloat4 pos : SV_POSITION;\n\t\t\t\tfloat3 outputColor: TEXCOORD0;\n\t\t\t\tfloat4 viewPos: TEXCOORD1;\n\t\t\t\tfloat4 projPos : TEXCOORD2;\n\t\t\t\tfloat displacedPatch : TEXCOORD3;\n\t\t\t};\n\n\t\t\tv2t vert (appdata v)\n\t\t\t{\n\t\t\t\tv2t o;\n\n\t\t\t\t//o.pos = float4(2.0*(v.uv-0.5),0.0,1.0); //try modifying this, clip space goes from -1 to 1, our UVs go from?to?\n\t\t\t\t//o.pos = float4(2.5*(v.uv-0.5),0.0,1.0);\n\t\t\t\to.pos = float4(3.0*(v.uv-0.5),0.0,1.0); //HOLY FUCK THIS FIXES THE DISAPPEARING CHUNKS WHAT THE FUCK, so there was some weird boundary issue, also 10 KM WORKS WELL, 50 KM has glitches, 35 KM also has glitches\n\t\t\t\t\t\t\t\t\t//20 KM also still has glitches what the fuck??\n\n\t\t\t\to.worldOriginPos = mul(lightToWorld,o.pos);\n\t\t\t\to.worldEndPos = mul(lightToWorld,float4(o.pos.x,o.pos.y,10.0,1.0));\n\t\t\t\t//o.worldEndPos = mul(lightToWorld,float4(0.5,0.5,10.0,1.0)); //eliminates box issue but causes holes\n\t\t\t\t//o.worldEndPos = mul(lightToWorld,float4(o.pos.x,o.pos.y,100.0,1.0));\n\t\t\t\t//o.worldEndPos = mul(lightToWorld,float4(o.pos.x,o.pos.y,10000.0,1.0));\n\n\t\t\t\treturn o;\n\t\t\t}\n\n\t\t\tstruct OutputPatchConstant\n\t\t\t{\n\t\t\t\tfloat edge[3]: SV_TessFactor;\n\t\t\t\tfloat inside : SV_InsideTessFactor;\n\t\t\t};\n\n\t\t\tOutputPatchConstant constantsFixed(InputPatch<v2t,3> patch)\n\t\t\t{\n\t\t\t\tOutputPatchConstant o;\n\n//\t\t\t\tbool isVisible = false;\n//\n//\t\t\t\tfor (int i=0;i<3;i++)\n//\t\t\t\t{\n//\t\t\t\t\tfloat4 clipSpaceOrigin = mul(UNITY_MATRIX_VP, patch[i].worldOriginPos);\n//\t\t\t\t\tfloat4 clipSpaceEnd    = mul(UNITY_MATRIX_VP, patch[i].worldEndPos);\n//\t\t\t\t\tisVisible = isVisible || intersectsFrustum(clipSpaceOrigin.xyz/clipSpaceOrigin.w, clipSpaceEnd.xyz/clipSpaceEnd.w); //consider this to be working though I'm not sure, maybe pass a color?\n//\t\t\t\t}\n//\n//\t\t\t\tif (!isVisible)\n//\t\t\t\t{\n//\t\t\t\t\to.edge[0] = 0.0;\n//\t\t\t\t\to.edge[1] = 0.0;\n//\t\t\t\t\to.edge[2] = 0.0;\n//\t\t\t\t\to.inside = 0.0;\n//\t\t\t\t}\n//\t\t\t\telse\n\t\t\t\t{\n//\t\t\t\t\t//this was really complicated to get working, and although I'm not completely sure about it, it has less holes than my cascade method\n\t\t\t\t\tfloat3 lightDir = normalize(_WorldSpaceLightPos0.xyz);\n\t\t\t\t\tfloat maxTesselationFactor = 64.0;\n\n\t\t\t\t\tfloat distEdge0 = rayDistanceToPoint(0.5*(patch[1].worldOriginPos+patch[2].worldOriginPos), lightDir, _WorldSpaceCameraPos);\n\t\t\t\t\tfloat distEdge1 = rayDistanceToPoint(0.5*(patch[2].worldOriginPos+patch[0].worldOriginPos), lightDir, _WorldSpaceCameraPos);\n\t\t\t\t\tfloat distEdge2 = rayDistanceToPoint(0.5*(patch[0].worldOriginPos+patch[1].worldOriginPos), lightDir, _WorldSpaceCameraPos);\n//\n////\t\t\t\t\tfloat factor0 = clamp(maxTesselationFactor * 25.0 / distEdge0,1.0,maxTesselationFactor);\n////\t\t\t\t\tfloat factor1 = clamp(maxTesselationFactor * 25.0 / distEdge1,1.0,maxTesselationFactor);\n////\t\t\t\t\tfloat factor2 = clamp(maxTesselationFactor * 25.0 / distEdge2,1.0,maxTesselationFactor);\n//\n\t\t\t\t\tfloat factor0 = clamp(maxTesselationFactor * 225.0 / distEdge0,1.0,maxTesselationFactor);\n\t\t\t\t\tfloat factor1 = clamp(maxTesselationFactor * 225.0 / distEdge1,1.0,maxTesselationFactor);\n\t\t\t\t\tfloat factor2 = clamp(maxTesselationFactor * 225.0 / distEdge2,1.0,maxTesselationFactor);\n\n\t\t\t\t\t//float insideFactor = max(factor0, max(factor1,factor2)); //doesn't seem to be always correct, so try to think about it, think about what causes cracks in this case, it's normal, every triangle's max isn't necessarily the adjacent triangle's max\n\n\t\t\t\t\to.edge[0] = factor0;\n\t\t\t\t\to.edge[1] = factor1;\n\t\t\t\t\to.edge[2] = factor2;\n\t\t\t\t\to.inside  = (factor0 + factor1 + factor2) / 3.0;  //doesn't seem to be always correct, so try to think about it, think about what causes cracks in this case, it's normal, every triangle's max isn't necessarily the adjacent triangle's max\n\n//\t\t\t\t\to.edge[0] = 16;\n//\t\t\t\t\to.edge[1] = 16;\n//\t\t\t\t\to.edge[2] = 16;\n//\t\t\t\t\to.inside  = 16;  //doesn't seem to be always correct, so try to think about it, think about what causes cracks in this case, it's normal, every triangle's max isn't necessarily the adjacent triangle's max\n\n//\t\t\t\t\to.edge[0] = 1;\n//\t\t\t\t\to.edge[1] = 1;\n//\t\t\t\t\to.edge[2] = 1;\n//\t\t\t\t\to.inside  = 1;  //doesn't seem to be always correct, so try to think about it, think about what causes cracks in this case, it's normal, every triangle's max isn't necessarily the adjacent triangle's max\n\n\t\t\t\t}\n\n\t\t\t\treturn o;\n\t\t\t}\n\n\t\t\t[domain(\"tri\")]\n\t\t\t[partitioning(\"integer\")]\n\t\t\t[outputtopology(\"triangle_cw\")]\n\t\t\t[patchconstantfunc(\"constantsFixed\")]\n\t\t\t[outputcontrolpoints(3)]\n\t\t\tv2t hull(InputPatch<v2t,3> patch, uint id : SV_OutputControlPointID)\n\t\t\t{\n\t\t\t\treturn patch[id];\n\t\t\t}\n\n\n\t\t\tinline bool between(float a, float b, float x)\n\t\t\t{\n\t\t\t\treturn (x > a) && (x < b);\n\t\t\t}\n\n\t\t\t//cascadeWeights -> 0,1,2,3 -> zero is the most detailed -> 3 is the least detailed\n\t\t\t//0 is in lower left corner, 1 in lower right corner, 2 in upper left corner, 3 in upper right corner, in the case of regular cascades no split spheres, not sure about splitSpheres\n\t\t\t//Still need to check the shadowMap for each cascade though to make sure we have a depth value at that coordinate\n\t\t\tinline fixed pickMostDetailedCascade(float4 wpos, out float4 shadowPos, sampler2D shadowMap)\n\t\t\t{\n\t\t\t\tfloat3 coords0 = mul (unity_WorldToShadow[0], wpos).xyz;\n\t\t\t\tfloat3 coords1 = mul (unity_WorldToShadow[1], wpos).xyz;\n\t\t\t\tfloat3 coords2 = mul (unity_WorldToShadow[2], wpos).xyz;\n\t\t\t\tfloat3 coords3 = mul (unity_WorldToShadow[3], wpos).xyz;\n\n\t\t\t\tfloat zdepth = 0;\n\t\t\t\tshadowPos = 0;\n\n\t\t\t\tif (between(0.0, 0.5, coords0.x) &&  between(0.0, 0.5, coords0.y) && ((zdepth = tex2Dlod(shadowMap, float4(coords0.xy,0.0,0.0)).r) > 0.0 ) && (zdepth<1.0))\n\t\t\t\t{\n\t\t\t\t\tshadowPos = float4(coords0.xy, zdepth, 1.0);\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t\telse if (between(0.5, 1.0, coords1.x) && between(0.0, 0.5, coords1.y) && ((zdepth = tex2Dlod(shadowMap, float4(coords1.xy,0.0,0.0)).r) > 0.0) && (zdepth<1.0))\n\t\t\t\t{\n\t\t\t\t\tshadowPos = float4(coords1.xy, zdepth, 1.0);\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\t\t\t\telse if (between(0.0, 0.5, coords2.x) && between(0.5, 1.0, coords2.y) && ((zdepth = tex2Dlod(shadowMap, float4(coords2.xy,0.0,0.0)).r) > 0.0) && (zdepth<1.0))\n\t\t\t\t{\n\t\t\t\t\tshadowPos = float4(coords2.xy, zdepth, 1.0);\n\t\t\t\t\treturn 2;\n\t\t\t\t}\n\t\t\t\telse if (between(0.5, 1.0, coords3.x) && between(0.5, 1.0, coords3.y) && ((zdepth = tex2Dlod(shadowMap, float4(coords3.xy,0.0,0.0)).r) > 0.0) && (zdepth<1.0))\n\t\t\t\t{\n\t\t\t\t\tshadowPos = float4(coords3.xy, zdepth, 1.0);\n\t\t\t\t\treturn 3;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t[domain(\"tri\")]\n\t\t\td2f domain(OutputPatchConstant tessFactors,const OutputPatch<v2t,3> vs, float3 d:SV_DomainLocation)\n\t\t\t{\n\t\t\t\td2f o;\n\t\t\t\tfloat3 worldPos = vs[0].worldOriginPos.xyz/vs[0].worldOriginPos.w * d.x + vs[1].worldOriginPos.xyz/vs[1].worldOriginPos.w * d.y + vs[2].worldOriginPos.xyz/vs[2].worldOriginPos.w * d.z;\n\n\t\t\t\tfloat4 finalWorldPos = 0;\n\t\t\t\tfloat4 shadowPos = 0;\n\t\t\t\tfixed cascadeIndex = pickMostDetailedCascade (float4(worldPos,1.0), shadowPos, _ShadowMapTextureCopyScatterer);\t\t//only support 4 cascades here\n\n\t\t\t\tfloat4x4 shadowToWorld = inverseShadowMatricesBuffer[max(cascadeIndex,0)];\n\t\t\t\t//finalWorldPos = (cascadeIndex > -1) ? mul( shadowToWorld, shadowPos) : float4(worldPos.xyz - 750000.0 * normalize(_WorldSpaceLightPos0.xyz), 1.0);\n\t\t\t\t//finalWorldPos = (cascadeIndex > -1) ? mul( shadowToWorld, shadowPos) : float4(_WorldSpaceCameraPos.xyz - 100000.0 * normalize(_WorldSpaceLightPos0.xyz), 1.0); //eliminates the glitchy square thing\n\t\t\t\t//finalWorldPos = (cascadeIndex > -1) ? mul( shadowToWorld, shadowPos) : float4(_WorldSpaceCameraPos.xyz - 700000.0 * normalize(_WorldSpaceLightPos0.xyz), 1.0); //still has holes although it seems to project to infinity\n\t\t\t\to.displacedPatch=1.0;\n\n\t\t\t\tfinalWorldPos = mul( shadowToWorld, shadowPos);\n\t\t\t\tif (cascadeIndex < 0.0)\n\t\t\t\t{\n//\t\t\t\t\tfloat3 coords3 = mul (unity_WorldToShadow[3], float4(worldPos,1.0)).xyz;\n//\t\t\t\t\t//float4 madeUpShadowPos = float4( coords3.xy, 10.0, 1.0);\n//\t\t\t\t\tfloat4 madeUpShadowPos = float4( 0.75,0.75, 10000.0, 1.0);\n\t\t\t\t\tfloat3 worldEndPos = vs[0].worldEndPos.xyz/vs[0].worldEndPos.w * d.x + vs[1].worldEndPos.xyz/vs[1].worldEndPos.w * d.y + vs[2].worldEndPos.xyz/vs[2].worldEndPos.w * d.z; //ideally we would project this to our far plane and tag it as undisplaced\n\t\t\t\t\t//worldEndPos-= 100000.0 * normalize(_WorldSpaceLightPos0.xyz);\n\t\t\t\t\tfinalWorldPos = float4(worldEndPos,1.0);\n\t\t\t\t\t//finalWorldPos = float4(worldPos,1.0);\n\t\t\t\t\to.displacedPatch = 0.0;\n\t\t\t\t}\n\n\t\t\t\t//maybe project by the final cascade and a made up depth anyway?\n\n\t\t\t\t//color debugging stuff\n\t\t\t\to.outputColor = float3(cascadeIndex == 0, cascadeIndex == 1, cascadeIndex ==2);\n\t\t\t\to.outputColor =  (cascadeIndex == -1) ? 0 :  ((cascadeIndex == 3) ? 1.0 : o.outputColor );\n\n\t\t\t\to.pos=UnityWorldToClipPos(finalWorldPos);\n\t\t\t\t//o.pos=UnityWorldToClipPos(worldPos);\n\t\t\t\to.viewPos = float4(UnityWorldToViewPos(finalWorldPos),1.0);\n\t\t\t\to.projPos = ComputeScreenPos(o.pos);\n\t\t\t\treturn o;\n\t\t\t}\n\n\n\t\t\tfloat4 frag (d2f i, fixed facing : VFACE) : SV_Target\n\t\t\t{\n\t\t\t\tfloat2 depthUV = i.projPos.xy/i.projPos.w;\n\t\t\t\tfloat zdepth = tex2Dlod(_CameraDepthTexture, float4(depthUV,0,0));\n\n#ifdef SHADER_API_D3D11  //#if defined(UNITY_REVERSED_Z)\n\t\t\t\tzdepth = 1 - zdepth;\n#endif\n\n\t\t\t\tfloat4 depthClipPos = float4(depthUV, zdepth, 1.0);\n\t\t\t\tdepthClipPos.xyz = 2.0f * depthClipPos.xyz - 1.0f;\n\t\t\t\tfloat4 depthViewPos = mul(unity_CameraInvProjection, depthClipPos);\n\n\t\t\t\tfloat depthLength = length(depthViewPos.xyz/depthViewPos.w);\n//#if defined(DUAL_DEPTH_ON)\n//\t\t\t\tzdepth = SAMPLE_DEPTH_TEXTURE(AdditionalDepthBuffer, depthUV);\n//\n//#ifdef SHADER_API_D3D11  //#if defined(UNITY_REVERSED_Z)\n//\t\t\t\tzdepth = 1 - zdepth;\n//#endif\n//\t\t\t\tdepthClipPos = float4(depthUV, zdepth, 1.0);\n//\t\t\t\tdepthClipPos.xyz = 2.0f * depthClipPos.xyz - 1.0f;\n//\t\t\t\tfloat4 depthViewPos2 = mul(ScattererAdditionalInvProjection, depthClipPos);\n//\n//\t\t\t\tdepthLength = (depthLength < 8000) || (depthLength > 50000) ? depthLength : length(depthViewPos2.xyz/depthViewPos2.w); //the 50000 is hardcoded shadow distance, hopefully we don't even need this crap\n//#endif\n\n\t\t\t\tfloat viewLength = length(i.viewPos.xyz/i.viewPos.w);\n\t\t\t\t//viewLength = (zdepth > 0.0) ? min(viewLength, depthLength) : viewLength;\n\n\t\t\t\t//viewLength = (zdepth > 0.0) ? min(viewLength, depthLength) : viewLength; //this is for the sky\n\t\t\t\t//viewLength = min(viewLength, depthLength);\n\n\t\t\t\tif (viewLength>depthLength) //discard what is behind terrain, will probably not work for clouds?\n\t\t\t\t\tviewLength = 0.0;\n\n//\t\t\t\tif (i.displacedPatch == 0.0) //not working with a factor of 3\n//\t\t\t\t\tviewLength = 0.0;\n\n//\t\t\t\treturn facing > 0 ? viewLength : -viewLength;\n\n\n//\t\t\t\tfloat cameraDepth = abs(i.viewPos.z/i.viewPos.w) / 750000;\n//\n//\t\t\t\tif (cameraDepth >= 0.9)\n//\t\t\t\t{\n//\t\t\t\t\tviewLength = 0.0;\n//\t\t\t\t\t//return float4(0.0,0.0,0.0,0.0);\n//\t\t\t\t}\n\n\t\t\t\treturn facing > 0 ? viewLength : -viewLength;\n\n\t\t\t\t//return float4(cameraDepth,cameraDepth,cameraDepth,1.0); //reaches nearly white on that goddamn square, why isn't it clipped?\n\n//\t\t\t\treturn facing > 0 ? float4(0.0,1.0,0.0,1.0) :  float4(1.0,0.0,0.0,1.0);\n\t\t\t\t//return i.displacedPatch > 0.0 ? float4(1.0,1.0,1.0,1.0) : float4(1.0,0.0,0.0,1.0);\n\t\t\t\t//return float4(i.outputColor,1.0);\n\n\t\t\t}\n\t\t\tENDCG\n\t\t}\n\t}\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Atmo/Godrays/VolumeDepth - Copy.shader.BAK.meta",
    "content": "fileFormatVersion: 2\nguid: 78213b1ce4da5e6438195d405c9da0f5\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Atmo/Godrays/VolumeDepth.shader",
    "content": "﻿Shader \"Scatterer/VolumeDepth\"\n{\n\tProperties\n\t{\n\n\t}\n\tSubShader\n\t{\n\t\tTags { \"RenderType\"=\"Opaque\" }\n\t\tLOD 100\n\n\t\tPass\n\t\t{\n\n\t\t\tCull Off\n\n\t\t\tZWrite Off\n\t\t\tZTest Always\n\t\t\tBlend One One\n\n//\t\t\tCull Off\n//\t\t\tBlend SrcAlpha OneMinusSrcAlpha\n\n\t\t\tCGPROGRAM\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\t\t\t#pragma hull hull\n\t\t\t#pragma domain domain\n\n\t\t\t#include \"UnityCG.cginc\"\n\t\t\t#include \"UnityShadowLibrary.cginc\"\n\t\t\t#include \"ShadowVolumeUtils.cginc\"\n\t\t\t#include \"../../IntersectCommon.cginc\"\n\t\t\t#include \"GodraysCommon.cginc\"\n\n\t\t\t//if no ocean -> use camera depth buffer: OCEAN_INTERSECT_OFF\n\t\t\t//if ocean and in depth buffer mode -> use ocean depth buffer: OCEAN_INTERSECT_DEPTH\n\t\t\t//if ocean and in projector mode -> use analytical ocean intersect: OCEAN_INTERSECT_ANALYTICAL\n\t\t\t#pragma multi_compile OCEAN_INTERSECT_OFF OCEAN_INTERSECT_ANALYTICAL \n\t\t\t#pragma multi_compile CLOUDSMAP_OFF CLOUDSMAP_ON\n\t\t\t#pragma multi_compile DOWNSCALE_DEPTH_OFF DOWNSCALE_DEPTH_ON\n\n\t\t\tsampler2D _ShadowMapTextureCopyScatterer;\n\n\t\t\tsampler2D _CameraDepthTexture;\n\t\t\tfloat4 _CameraDepthTexture_TexelSize;\n\n\t\t\tfloat4x4 CameraToWorld;\n\n\t\t\tfloat3 lightDirection;\n\n\t\t\tfloat3 _planetPos;\n\t\t\tfloat Rg;\n\t\t\tfloat Rt;\n\t\t\tfloat _experimentalAtmoScale;\n\n\t\t\tsampler2D cloudShadowMap;\n\n\t\t\tStructuredBuffer<float4x4> inverseShadowMatricesBuffer;\n\n\t\t\tfloat4x4 lightToWorld;\n\n\n\t\t\tstruct appdata\n\t\t\t{\n\t\t\t\tfloat4 vertex : POSITION;\n\t\t\t\tfloat2 uv : TEXCOORD0;\n\t\t\t};\n\n\t\t\tstruct v2t //vertex 2 tesselation\n\t\t\t{\n\t\t\t\tfloat4 pos : INTERNALTESSPOS;\n\t\t\t\tfloat4 worldOriginPos : TEXCOORD0;\n\t\t\t\tfloat4 worldEndPos : TEXCOORD1;\n\t\t\t};\n\n\t\t\tstruct d2f //domain 2 frag\n\t\t\t{\n\t\t\t\tfloat4 pos : SV_POSITION;\n\t\t\t\tfloat4 viewPos: TEXCOORD0;\n\t\t\t\tfloat4 projPos : TEXCOORD1;\n\t\t\t\tfloat4 finalWorldPos : TEXCOORD2;\n\t\t\t\tfloat isCloud : TEXCOORD3;\n\t\t\t};\n\n\t\t\tv2t vert (appdata v)\n\t\t\t{\n\t\t\t\tv2t o;\n\n\t\t\t\t//o.pos = float4(2.0*(v.uv-0.5),0.0,1.0); //try modifying this, clip space goes from -1 to 1, our UVs go from?to?\n\t\t\t\t//o.pos = float4(3.0*(v.uv-0.5),0.0,1.0); //HOLY FUCK THIS FIXES THE DISAPPEARING CHUNKS WHAT THE FUCK\n\t\t\t\to.pos = float4(2.9*(v.uv-0.5),0.0,1.0);\n\n\t\t\t\to.worldOriginPos = mul(lightToWorld,o.pos);\n\t\t\t\to.worldEndPos = mul(lightToWorld,float4(o.pos.x,o.pos.y,1.0,1.0));\n\n\t\t\t\treturn o;\n\t\t\t}\n\n\t\t\tstruct OutputPatchConstant\n\t\t\t{\n\t\t\t\tfloat edge[3]: SV_TessFactor;\n\t\t\t\tfloat inside : SV_InsideTessFactor;\n\t\t\t};\n\n\t\t\tOutputPatchConstant tesselationConstants(InputPatch<v2t,3> patch)\n\t\t\t{\n\t\t\t\tOutputPatchConstant o;\n\n\t\t\t\tbool isVisible = false;\n\t\t\t\tfor (int i=0;i<3;i++)\n\t\t\t\t{\n\t\t\t\t\tfloat4 clipSpaceOrigin = mul(UNITY_MATRIX_VP, patch[i].worldOriginPos);\n\t\t\t\t\tfloat4 clipSpaceEnd    = mul(UNITY_MATRIX_VP, patch[i].worldEndPos);\n\t\t\t\t\tisVisible = isVisible || intersectsFrustum(clipSpaceOrigin.xyz/clipSpaceOrigin.w, clipSpaceEnd.xyz/clipSpaceEnd.w); //consider this to be working though I'm not sure, maybe pass a color?\n\t\t\t\t}\n\n\t\t\t\tif (!isVisible)\n\t\t\t\t{\n\t\t\t\t\to.edge[0] = 0.0;\n\t\t\t\t\to.edge[1] = 0.0;\n\t\t\t\t\to.edge[2] = 0.0;\n\t\t\t\t\to.inside = 0.0;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tfloat maxTesselationFactor = 64.0;\n\n\t\t\t\t\tfloat distEdge0 = rayDistanceToPoint(0.5*(patch[1].worldOriginPos+patch[2].worldOriginPos), lightDirection, _WorldSpaceCameraPos);\n\t\t\t\t\tfloat distEdge1 = rayDistanceToPoint(0.5*(patch[2].worldOriginPos+patch[0].worldOriginPos), lightDirection, _WorldSpaceCameraPos);\n\t\t\t\t\tfloat distEdge2 = rayDistanceToPoint(0.5*(patch[0].worldOriginPos+patch[1].worldOriginPos), lightDirection, _WorldSpaceCameraPos);\n\n\t\t\t\t\tfloat factor0 = clamp(maxTesselationFactor * 225.0 / distEdge0,1.0,maxTesselationFactor);\n\t\t\t\t\tfloat factor1 = clamp(maxTesselationFactor * 225.0 / distEdge1,1.0,maxTesselationFactor);\n\t\t\t\t\tfloat factor2 = clamp(maxTesselationFactor * 225.0 / distEdge2,1.0,maxTesselationFactor);\n\n//\t\t\t\t\tfloat factor0 = clamp(maxTesselationFactor * 225.0 / distEdge0,4.0,maxTesselationFactor); // min of 4.0 is slooooow\n//\t\t\t\t\tfloat factor1 = clamp(maxTesselationFactor * 225.0 / distEdge1,4.0,maxTesselationFactor);\n//\t\t\t\t\tfloat factor2 = clamp(maxTesselationFactor * 225.0 / distEdge2,4.0,maxTesselationFactor);\n\n\t\t\t\t\t//float insideFactor = max(factor0, max(factor1,factor2)); //doesn't seem to be always correct, so try to think about it, think about what causes cracks in this case, it's normal, every triangle's max isn't necessarily the adjacent triangle's max\n\n\t\t\t\t\to.edge[0] = factor0;\n\t\t\t\t\to.edge[1] = factor1;\n\t\t\t\t\to.edge[2] = factor2;\n\t\t\t\t\to.inside  = (factor0 + factor1 + factor2) / 3.0;  //doesn't seem to be always correct, so try to think about it, think about what causes cracks in this case, it's normal, every triangle's max isn't necessarily the adjacent triangle's max\n\t\t\t\t}\n\n\t\t\t\treturn o;\n\t\t\t}\n\n\t\t\t[domain(\"tri\")]\n\t\t\t[partitioning(\"integer\")]\n\t\t\t[outputtopology(\"triangle_cw\")]\n\t\t\t[patchconstantfunc(\"tesselationConstants\")]\n\t\t\t[outputcontrolpoints(3)]\n\t\t\tv2t hull(InputPatch<v2t,3> patch, uint id : SV_OutputControlPointID)\n\t\t\t{\n\t\t\t\treturn patch[id];\n\t\t\t}\n\t\t\t\t\n\t\t\t[domain(\"tri\")]\n\t\t\td2f domain(OutputPatchConstant tessFactors,const OutputPatch<v2t,3> vs, float3 d:SV_DomainLocation)\n\t\t\t{\n\t\t\t\td2f o;\n\t\t\t\tfloat3 worldPos = vs[0].worldOriginPos.xyz/vs[0].worldOriginPos.w * d.x + vs[1].worldOriginPos.xyz/vs[1].worldOriginPos.w * d.y + vs[2].worldOriginPos.xyz/vs[2].worldOriginPos.w * d.z;\n\n\t\t\t\tfloat4 finalWorldPos = 0;\n\t\t\t\tfloat4 shadowPos = 0;\n\n\t\t\t\tfloat isCloud = 0;\n\t\t\t\t//only support 4 cascades here\n#if defined(CLOUDSMAP_ON)\n\t\t\t\tfixed cascadeIndex = pickMostDetailedCascadeCloud (float4(worldPos,1.0), shadowPos, _ShadowMapTextureCopyScatterer, cloudShadowMap, isCloud);\n#else\n\t\t\t\tfixed cascadeIndex = pickMostDetailedCascade (float4(worldPos,1.0), shadowPos, _ShadowMapTextureCopyScatterer);\t\t\n#endif\n\n\t\t\t\tfloat4x4 shadowToWorld = inverseShadowMatricesBuffer[max(cascadeIndex,0)];\n\n\t\t\t\tfinalWorldPos = mul( shadowToWorld, shadowPos);\n\n\t\t\t\tif (cascadeIndex < 0.0)\n\t\t\t\t{\n\t\t\t\t\t//finalWorldPos = float4(_WorldSpaceCameraPos.xyz + lightDirection * 700000,1.0); //this works well for stock but breaks with parallax, what gives?\n\t\t\t\t\tfinalWorldPos = float4(_WorldSpaceCameraPos.xyz + lightDirection * 500000,1.0);\n\t\t\t\t}\n\n\t\t\t\to.pos=UnityWorldToClipPos(finalWorldPos);\n\t\t\t\to.viewPos = float4(UnityWorldToViewPos(finalWorldPos),1.0);\n\t\t\t\to.projPos = ComputeScreenPos(o.pos);\n\t\t\t\to.finalWorldPos = finalWorldPos;\n\t\t\t\to.isCloud = isCloud;\n\n\t\t\t\treturn o;\n\t\t\t}\n\n\t\t\t// optical depth for ray (r,mu) of length d, using analytic formula\n\t\t\t// (mu=cos(view zenith angle)), intersections with ground ignored\n\t\t\t// H=height scale of exponential density function\n\t\t\tfloat OpticalDepth(float H, float r, float mu, float d)\n\t\t\t{\n\t\t\t\tfloat a = sqrt((0.5/H)*r);\n\t\t\t\tfloat2 a01 = a*float2(mu, mu + d / r);\n\t\t\t\tfloat2 a01s = sign(a01);\n\t\t\t\tfloat2 a01sq = a01*a01;\n\t\t\t\tfloat x = a01s.y > a01s.x ? exp(a01sq.x) : 0.0;\n\t\t\t\tfloat2 y = a01s / (2.3193*abs(a01) + sqrt(1.52*a01sq + 4.0)) * float2(1.0, exp(-d/H*(d/(2.0*r)+mu)));\n\t\t\t\treturn sqrt((6.2831*H)*r) * exp((Rg-r)/H) * (x + dot(y, float2(1.0, -1.0)));\n\t\t\t}\n\n\t\t\t//gets the min depth for surrounding 4 depth texels, in downscaled case\n\t\t\tfloat getMinDepth(float2 uv)\n\t\t\t{\n\t\t\t\tfloat2 texelSize = 0.5 * _CameraDepthTexture_TexelSize.xy;\n\t\t\t\tfloat2 taps[4] = { float2(uv + float2(-1,-1)*texelSize), float2(uv + float2(-1,1)*texelSize),\n\t\t\t\t\t\t   float2(uv + float2(1,-1)*texelSize),  float2(uv + float2(1,1)*texelSize)  };\n\n\t\t\t\tfloat depth1 = tex2D(_CameraDepthTexture, taps[0]).r;\n\t\t\t\tfloat depth2 = tex2D(_CameraDepthTexture, taps[1]).r;\n\t\t\t\tfloat depth3 = tex2D(_CameraDepthTexture, taps[2]).r;\n\t\t\t\tfloat depth4 = tex2D(_CameraDepthTexture, taps[3]).r;\n\n\t\t\t\t//Only return zero if all samples are zero, otherwise return the smallest which isn't zero\n\t\t\t\tfloat result = depth4;\n\t\t\t\tresult = (result == 0.0) || (depth3 == 0.0) ? max(result, depth3) : min (result,depth3);\n\t\t\t\tresult = (result == 0.0) || (depth2 == 0.0) ? max(result, depth2) : min (result,depth2);\n\t\t\t\tresult = (result == 0.0) || (depth1 == 0.0) ? max(result, depth1) : min (result,depth1);\n\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\tfloat4 frag (d2f i, fixed facing : VFACE) : SV_Target\n\t\t\t{\n\n\t\t\t\tfloat2 depthUV = i.projPos.xy/i.projPos.w;\n\n#if defined(DOWNSCALE_DEPTH_ON)\n\t\t\t\tfloat zdepth = getMinDepth(depthUV);\n#else\n\t\t\t\tfloat zdepth = tex2Dlod(_CameraDepthTexture, float4(depthUV,0,0));\n#endif\n\n\t\t\t\tfloat linearDepth = Linear01Depth(zdepth);\n\n#ifdef SHADER_API_D3D11  //#if defined(UNITY_REVERSED_Z)\n\t\t\t\tzdepth = 1 - zdepth;\n#endif\n\n\t\t\t\tfloat4 depthClipPos = float4(depthUV, zdepth, 1.0);\n\t\t\t\tdepthClipPos.xyz = 2.0 * depthClipPos.xyz - 1.0;\n\t\t\t\tfloat4 depthViewPos = mul(unity_CameraInvProjection, depthClipPos);\n\n\t\t\t\tdepthViewPos.xyz /= depthViewPos.w;\n\n\t\t\t\tfloat3 rayDirection = normalize(depthViewPos.xyz);\n\n\t\t\t\tfloat3 cameraForwardDir = float3(0,0,-1);\n\t\t\t\tfloat aa = dot(rayDirection, cameraForwardDir);\n\n\t\t\t\tdepthViewPos.xyz = rayDirection * linearDepth/aa * _ProjectionParams.z;\n\n\t\t\t\tfloat depthLength = length(depthViewPos.xyz);\n\n\t\t\t\tfloat3 viewDir = normalize(i.finalWorldPos.xyz/i.finalWorldPos.w - _WorldSpaceCameraPos);\n\t\t\t\tfloat viewLength = length(i.viewPos.xyz/i.viewPos.w);\n\n\t\t\t\tif (zdepth != 1.0)\t//cap by terrain distance\n\t\t\t\t{\n\t\t\t\t\tviewLength = min(depthLength, viewLength);\n\t\t\t\t}\n//\t\t\t\telse \t\t\t//ray going into the sky\n//\t\t\t\t{\n\n//\t\t\t\t\tif (i.isCloud > 0.0)\n//\t\t\t\t\t{\n//\t\t\t\t\t\tviewLength*= 0.3; //this looks nice against the sky but where terrain and shadow meet it looks like shite\n//\t\t\t\t\t}\n//\t\t\t\t}\n\n#if defined(OCEAN_INTERSECT_ANALYTICAL)  //cap by boundary to ocean\n\t\t\t\tfloat oceanIntersectDistance = intersectSphereOutside(_WorldSpaceCameraPos, viewDir, _planetPos, Rg);\n\n\t\t\t\tif ((oceanIntersectDistance > 0.0) && (oceanIntersectDistance <= viewLength))\n\t\t\t\t{\n\t\t\t\t\tviewLength = oceanIntersectDistance;\n\t\t\t\t}\n#endif\n\t\t\t\tfloat mu = dot(normalize(_WorldSpaceCameraPos-_planetPos), viewDir);\n\t\t\t\tviewLength = OpticalDepth(_experimentalAtmoScale * (Rt-Rg) * 0.5, length(_WorldSpaceCameraPos-_planetPos), mu, viewLength);\n\n\t\t\t\tviewLength = writeGodrayToTexture(viewLength);\n\n\t\t\t\treturn facing > 0 ? viewLength : -viewLength;\n\t\t\t}\n\t\t\tENDCG\n\t\t}\n\t}\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Atmo/Godrays/VolumeDepth.shader.meta",
    "content": "fileFormatVersion: 2\nguid: 4e82512e02403f342aefc6129f4d04a4\nShaderImporter:\n  externalObjects: {}\n  defaultTextures: []\n  nonModifiableTextures: []\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Atmo/Godrays.meta",
    "content": "fileFormatVersion: 2\nguid: d399317a9fcc74045a7924c9fdf2bcf6\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Atmo/Preprocessing.meta",
    "content": "fileFormatVersion: 2\nguid: 6124ad3c57404c3429a93ca37df030e9\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Atmo/ProjectorScattering.shader",
    "content": "﻿Shader \"Scatterer/AtmosphericLocalScatter\" {\n\tSubShader {\n\t\tTags {\"Queue\" = \"Transparent-497\" \"IgnoreProjector\" = \"True\" \"RenderType\" = \"Transparent\"}\n\n\t\t//extinction pass\n\t\tPass {\n\t\t\tTags {\"Queue\" = \"Transparent-497\" \"IgnoreProjector\" = \"True\" \"RenderType\" = \"Transparent\"}\n\n\t\t\t//Cull Front\n\t\t\tCull Back\n\t\t\tZTest LEqual\n\t\t\tZWrite Off\n\n\t\t\tBlend DstColor Zero //multiplicative\n\t\t\tOffset 0.0, -0.07\n\n\t\t\tCGPROGRAM\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\t\t\t#pragma target 3.0\n\t\t\t#include \"UnityCG.cginc\"\n\t\t\t#include \"../CommonAtmosphere.cginc\"\n\n\t\t\t#pragma multi_compile CUSTOM_OCEAN_OFF CUSTOM_OCEAN_ON\n\n\t\t\tuniform float _global_alpha;\n\t\t\tuniform float _global_depth;\n\t\t\tuniform float3 _planetPos; //planet origin, in world space\n\t\t\tuniform float3 _camForward; //camera's viewing direction, in world space\n\n\t\t\tuniform float _PlanetOpacity; //to smooth transition from/to scaledSpace\n\n\t\t\tuniform float _Post_Extinction_Tint;\n\t\t\tuniform float extinctionThickness;\n\n\t\t\tuniform float _openglThreshold;\n\t\t\tuniform float4x4 _Globals_CameraToWorld;\n\n\t\t\t//            //eclipse uniforms\n\t\t\t//#if defined (ECLIPSES_ON)\t\t\t\n\t\t\t//\t\t\tuniform float4 sunPosAndRadius; //xyz sun pos w radius\n\t\t\t//\t\t\tuniform float4x4 lightOccluders1; //array of light occluders\n\t\t\t//\t\t\t\t\t\t\t\t\t\t\t //for each float4 xyz pos w radius\n\t\t\t//\t\t\tuniform float4x4 lightOccluders2;\n\t\t\t//#endif\n\n\t\t\t#if defined (PLANETSHINE_ON)\n\t\t\tuniform float4x4 planetShineSources;\n\t\t\tuniform float4x4 planetShineRGB;\n\t\t\t#endif\n\n\t\t\tstruct v2f\n\t\t\t{\n\t\t\t\tfloat4 pos: SV_POSITION;\n\t\t\t\tfloat4 worldPos : TEXCOORD0;\n\t\t\t\tfloat3 _camPos : TEXCOORD1;\n\t\t\t};\n\n\t\t\tv2f vert(appdata_base v)\n\t\t\t{\n\t\t\t\tv2f o;\n\n\t\t\t\tfloat4 worldPos = mul(unity_ObjectToWorld,v.vertex);\n\t\t\t\tworldPos.xyz/=worldPos.w; //needed?\n\n#if defined (CUSTOM_OCEAN_ON)\n\t\t\t\tworldPos.xyz = (_PlanetOpacity < 1.0) && (length(worldPos.xyz-_planetPos) < Rg) ? _planetPos+Rg* normalize(worldPos.xyz-_planetPos)  : worldPos.xyz;\n#endif\n\n\t\t\t\to.worldPos = float4(worldPos.xyz,1.0);\n\t\t\t\to.pos = mul (UNITY_MATRIX_VP,o.worldPos);\n\t\t\t\to._camPos = _WorldSpaceCameraPos - _planetPos;\n\n\t\t\t\treturn o;\n\t\t\t}\n\n\n\t\t\thalf4 frag(v2f i) : SV_Target\n\t\t\t{\n\t\t\t\tfloat3 worldPos = i.worldPos.xyz/i.worldPos.w - _planetPos; //worldPos relative to planet origin\n\n\t\t\t\thalf returnPixel = ((  (length(i._camPos)-Rg) < 1000 )  && (length(worldPos) < (Rg-50))) ? 0.0: 1.0;  //enable in case of ocean and close enough to water surface, works well for kerbin\n\n\n\t\t\t\tworldPos= (length(worldPos) < (Rg + _openglThreshold)) ? (Rg + _openglThreshold) * normalize(worldPos) : worldPos ; //artifacts fix\n\n\t\t\t\tfloat3 extinction = getExtinction(i._camPos, worldPos, 1.0, 1.0, 1.0);\n\t\t\t\tfloat average=(extinction.r+extinction.g+extinction.b)/3;\n\n\t\t\t\t//lerped manually because of an issue with opengl or whatever\n\t\t\t\textinction = _Post_Extinction_Tint * extinction + (1-_Post_Extinction_Tint) * float3(average,average,average);\n\n\t\t\t\textinction= max(float3(0.0,0.0,0.0), (float3(1.0,1.0,1.0)*(1-extinctionThickness) + extinctionThickness*extinction) );\n\t\t\t\textinction = (returnPixel == 1.0) ? extinction : float3(1.0,1.0,1.0);\n\t\t\t\treturn float4(extinction,1.0);\n\t\t\t}\n\t\t\tENDCG\n\t\t}\n\n\n\t\t//scattering pass\n\t\tPass {\n\t\t\tTags {\"Queue\" = \"Transparent-498\" \"IgnoreProjector\" = \"True\" \"RenderType\" = \"Transparent\"}\n\n\t\t\t//Cull Front\n\t\t\tCull Back\n\t\t\tZTest LEqual\n\n\t\t\tZWrite [_ZwriteVariable]\n\n\t\t\tBlend OneMinusDstColor One //soft additive\n\t\t\t//Blend SrcAlpha OneMinusSrcAlpha //alpha\n\t\t\tOffset 0.0, -0.07\n\n\t\t\tCGPROGRAM\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\t\t\t#pragma target 3.0\n\t\t\t#include \"UnityCG.cginc\"\n\t\t\t#include \"../CommonAtmosphere.cginc\"\n\t\t\t#include \"Godrays/GodraysCommon.cginc\"\n\n\t\t\t//\t\t\t#pragma multi_compile ECLIPSES_OFF ECLIPSES_ON\n\t\t\t#pragma multi_compile PLANETSHINE_OFF PLANETSHINE_ON\n\t\t\t#pragma multi_compile CUSTOM_OCEAN_OFF CUSTOM_OCEAN_ON\n\t\t\t#pragma multi_compile DITHERING_OFF DITHERING_ON\n\t\t\t#pragma multi_compile GODRAYS_OFF GODRAYS_ON\n\n\t\t\tuniform float _global_alpha;\n\t\t\tuniform float _global_depth;\n\t\t\tuniform float3 _planetPos; //planet origin, in world space\n\t\t\tuniform float3 _camForward; //camera's viewing direction, in world space\n\t\t\tuniform float _ScatteringExposure;\n\n\t\t\tuniform float _PlanetOpacity; //to smooth transition from/to scaledSpace\n\n#if defined (GODRAYS_ON)\n\t\t\tuniform sampler2D _godrayDepthTexture;\n\t\t\tuniform float _godrayStrength;\n#endif\n\t\t\tuniform float _openglThreshold;\n\t\t\tuniform float4x4 _Globals_CameraToWorld;\n\n\t\t\t//            //eclipse uniforms\n\t\t\t//#if defined (ECLIPSES_ON)\t\t\t\n\t\t\t//\t\t\tuniform float4 sunPosAndRadius; //xyz sun pos w radius\n\t\t\t//\t\t\tuniform float4x4 lightOccluders1; //array of light occluders\n\t\t\t//\t\t\t\t\t\t\t\t\t\t\t //for each float4 xyz pos w radius\n\t\t\t//\t\t\tuniform float4x4 lightOccluders2;\n\t\t\t//#endif\n\n#if defined (PLANETSHINE_ON)\n\t\t\tuniform float4x4 planetShineSources;\n\t\t\tuniform float4x4 planetShineRGB;\n#endif\n\n\t\t\tstruct v2f\n\t\t\t{\n\t\t\t\tfloat4 worldPos : TEXCOORD0;\n\t\t\t\tfloat3 _camPos  : TEXCOORD1;\n#if defined (GODRAYS_ON)\n\t\t\t\tfloat4 projPos  : TEXCOORD2;\n#endif\n\n\t\t\t};\n\n\t\t\tv2f vert(appdata_base v, out float4 outpos: SV_POSITION)\n\t\t\t{\n\t\t\t\tv2f o;\n\n\t\t\t\tfloat4 worldPos = mul(unity_ObjectToWorld,v.vertex);\n\t\t\t\tworldPos.xyz/=worldPos.w; //needed?\n\n\t\t\t\t//display scattering at ocean level when we are fading out local shading\n\t\t\t\t//at the same time ocean stops rendering it's own scattering\n#if defined (CUSTOM_OCEAN_ON)\n\t\t\t\tworldPos.xyz = (_PlanetOpacity < 1.0) && (length(worldPos.xyz-_planetPos) < Rg) ? _planetPos+Rg* normalize(worldPos.xyz-_planetPos)  : worldPos.xyz;\n#endif\n\n\t\t\t\to.worldPos = float4(worldPos.xyz,1.0);\n\t\t\t\to.worldPos.xyz*=worldPos.w;\n\t\t\t\toutpos = mul (UNITY_MATRIX_VP,o.worldPos);\n\n\t\t\t\to._camPos = _WorldSpaceCameraPos - _planetPos;\n\n#if defined (GODRAYS_ON)\n\t\t\t\to.projPos = ComputeScreenPos(outpos);\n#endif\n\n\t\t\t\treturn o;\n\t\t\t}\n\n\t\t\thalf4 frag(v2f i, UNITY_VPOS_TYPE screenPos : VPOS) : SV_Target\n\t\t\t{\n\t\t\t\tfloat3 worldPos = i.worldPos.xyz/i.worldPos.w - _planetPos; //worldPos relative to planet origin\n\n\t\t\t\thalf returnPixel = ((  (length(i._camPos)-Rg) < 1000 )  && (length(worldPos) < (Rg-50))) ? 0.0: 1.0;  //enable in case of ocean and close enough to water surface, works well for kerbin\n\n\t\t\t\tfloat3 groundPos = normalize (worldPos) * Rg*1.0008;\n\t\t\t\tfloat Rt2 = Rg + (Rt - Rg) * _experimentalAtmoScale;\n\t\t\t\tworldPos = (length(worldPos) < Rt2) ? lerp(groundPos,worldPos,_PlanetOpacity) : worldPos; //fades to flatScaledSpace planet shading to ease the transition to scaledSpace\n\n\t\t\t\tworldPos= (length(worldPos) < (Rg + _openglThreshold)) ? (Rg + _openglThreshold) * normalize(worldPos) : worldPos ; //artifacts fix\n\n\t\t\t\tfloat minDistance = length(worldPos-i._camPos);\n\t\t\t\tfloat3 inscatter=0.0;\n\t\t\t\tfloat3 extinction=1.0;\n\n\t\t\t\t//TODO: put planetshine stuff in callable function\n#if defined (PLANETSHINE_ON)\n\t\t\t\tfor (int j=0; j<4;++j)\n\t\t\t\t{\n\t\t\t\t\tif (planetShineRGB[j].w == 0) break;\n\n\t\t\t\t\tfloat intensity=1;  \n\t\t\t\t\tif (planetShineSources[j].w != 1.0f)\n\t\t\t\t\t{\n\t\t\t\t\t\tintensity = 0.57f*max((0.75-dot(normalize(planetShineSources[j].xyz - worldPos),SUN_DIR)),0); //if source is not a sun compute intensity of light from angle to light source\n\t\t\t\t\t\t//totally made up formula by eyeballing it\n\t\t\t\t\t}\n\n\t\t\t\t\tinscatter+=InScattering2(i._camPos, worldPos, normalize(planetShineSources[j].xyz),extinction)  //lot of potential extinction recomputations here\n\t\t\t\t\t*planetShineRGB[j].xyz*planetShineRGB[j].w*intensity;\n\t\t\t\t}\n#endif\n\n#if defined (GODRAYS_ON)\n\t\t\t\tfloat2 depthUV = i.projPos.xy/i.projPos.w;\n\t\t\t\tfloat godrayDepth = 0.0;\n\n\t\t\t\tgodrayDepth = sampleGodrayDepth(_godrayDepthTexture, depthUV, 1.0);\n\n\t\t\t\t//trying to find the optical depth from the terrain level\n\t\t\t\tfloat muTerrain = dot(normalize(i.worldPos.xyz/i.worldPos.w - _planetPos), normalize(_WorldSpaceCameraPos - i.worldPos.xyz/i.worldPos.w));\n\n\t\t\t\tgodrayDepth = _godrayStrength * DistanceFromOpticalDepth(_experimentalAtmoScale * (Rt-Rg) * 0.5, length(i.worldPos.xyz/i.worldPos.w - _planetPos), muTerrain, godrayDepth, minDistance);\n\n\t\t\t\tworldPos -= godrayDepth * normalize(worldPos-i._camPos);\n#endif\n\n\t\t\t\tinscatter+= InScattering2(i._camPos, worldPos,SUN_DIR,extinction);\n\t\t\t\tinscatter*= (minDistance <= _global_depth) ? (1 - exp(-1 * (4 * minDistance / _global_depth))) : 1.0 ; //somehow the shader compiler for OpenGL behaves differently around braces\n\n\t\t\t\t//#if defined (ECLIPSES_ON)\t\t\t\t\n\t\t\t\t// \t\t\t\tfloat eclipseShadow = 1;\n\t\t\t\t// \t\t\t\t\t\t\t\n\t\t\t\t//            \tfor (int i=0; i<4; ++i)\n\t\t\t\t//    \t\t\t{\n\t\t\t\t//        \t\t\tif (lightOccluders1[i].w <= 0)\tbreak;\n\t\t\t\t//\t\t\t\t\teclipseShadow*=getEclipseShadow(worldPos, sunPosAndRadius.xyz,lightOccluders1[i].xyz,\n\t\t\t\t//\t\t\t\t\t\t\t\t   lightOccluders1[i].w, sunPosAndRadius.w)\t;\n\t\t\t\t//\t\t\t\t}\n\t\t\t\t//\t\t\t\t\t\t\n\t\t\t\t//\t\t\t\tfor (int j=0; j<4; ++j)\n\t\t\t\t//    \t\t\t{\n\t\t\t\t//        \t\t\tif (lightOccluders2[j].w <= 0)\tbreak;\n\t\t\t\t//\t\t\t\t\teclipseShadow*=getEclipseShadow(worldPos, sunPosAndRadius.xyz,lightOccluders2[j].xyz,\n\t\t\t\t//\t\t\t\t\t\t\t\t   lightOccluders2[j].w, sunPosAndRadius.w)\t;\n\t\t\t\t//\t\t\t\t}\n\t\t\t\t//\n\t\t\t\t//\t\t\t\tinscatter*=eclipseShadow;\n\t\t\t\t//#endif\n\t\t\t\tinscatter = hdr(inscatter,_ScatteringExposure) *_global_alpha;\n\n\t\t\t\treturn float4(dither(inscatter,screenPos)*returnPixel,1.0);\n\t\t\t}\n\t\t\tENDCG\n\t\t}\n\t}\n\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Atmo/ProjectorScattering.shader.meta",
    "content": "fileFormatVersion: 2\nguid: 9052dff19a12cb34bb02a7f74b75c4dd\nShaderImporter:\n  externalObjects: {}\n  defaultTextures: []\n  nonModifiableTextures: []\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Atmo/ScaledPlanetScattering.shader",
    "content": "﻿Shader \"Scatterer/ScaledPlanetScattering\" {\n\tSubShader \n\t{\n\t\tTags {\"QUEUE\"=\"Geometry+1\" \"IgnoreProjector\"=\"True\" }\n\n\t\tPass {  //extinction pass\n\n\t\t\tZWrite Off\n\t\t\tZTest LEqual\n\t\t\tCull Back\n\n\t\t\tOffset -0.05, -0.05\n\n\t\t\tBlend DstColor Zero //multiplicative\n\n\t\t\tCGPROGRAM\n\t\t\t#include \"UnityCG.cginc\"\n\t\t\t#pragma glsl\n\t\t\t#pragma target 3.0\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\n\t\t\t#include \"../CommonAtmosphere.cginc\"\n\t\t\t#include \"../EclipseCommon.cginc\"\n\t\t\t#include \"../RingCommon.cginc\"\t\t\n\n\t\t\t#define useAnalyticSkyTransmittance\n\n\t\t\t#pragma multi_compile ECLIPSES_OFF ECLIPSES_ON\n\t\t\t#pragma multi_compile RINGSHADOW_OFF RINGSHADOW_ON\n\t\t\t#pragma multi_compile LOCAL_MODE_OFF LOCAL_MODE_ON\n\n\t\t\tuniform float _Alpha_Global;\n\t\t\tuniform float extinctionTint;\n\t\t\tuniform float extinctionThickness;\n\t\t\tuniform float3 _Sun_WorldSunDir;\n\n\t\t\tuniform float flatScaledSpaceModel;\n\n\t\t\tstruct v2f\n\t\t\t{\n\t\t\t\tfloat4 pos: SV_POSITION;\n\t\t\t\tfloat3 worldPos : TEXCOORD0;\n\t\t\t\tfloat3 planetOrigin: TEXCOORD1;\n\t\t\t};\n\n\t\t\tv2f vert(appdata_base v)\n\t\t\t{\n\t\t\t\tv2f OUT;\n\t\t\t\tOUT.pos = UnityObjectToClipPos(v.vertex);\n\n\t\t\t\t//this is a hack to make the scaledScattering \"fill in\" for the local scattering when it gets cut off bu the limited clip plane\n\t\t\t\t//essentially render both scaled scattering and sky at max depth and check the z-buffer, that way only render where localScattering hasn't rendered\n#if defined(LOCAL_MODE_ON)\n\t#ifdef SHADER_API_D3D11\n\t\t\t\tOUT.pos.z = 0.00000000000001;\n\t#else\n\t\t\t\tOUT.pos.z = (1.0 - 0.00000000000001) * OUT.pos.w;\n\t\t\t\tOUT.pos = ( _ProjectionParams.y > 200.0 ) ? OUT.pos : float4(2.0,2.0,2.0,1.0); //cull on near camera on OpenGL\n\t#endif\n#endif\n\n\t\t\t\tOUT.worldPos = mul(unity_ObjectToWorld, v.vertex);\n\t\t\t\tOUT.planetOrigin = mul (unity_ObjectToWorld, float4(0,0,0,1)).xyz;\n\n#if defined(LOCAL_MODE_OFF)\n\t\t\t\tOUT.worldPos *= 6000.0;\n\t\t\t\tOUT.planetOrigin *= 6000.0;\n#endif\n\n\n\t\t\t\treturn OUT;\n\t\t\t}\n\n\t\t\thalf4 frag(v2f IN): COLOR\n\t\t\t{\n\t\t\t\tfloat3 extinction=0.0;\n\n\t\t\t\tfloat3 WCP = _WorldSpaceCameraPos;\n\n#if defined(LOCAL_MODE_OFF)\n\t\t\t\tWCP*=6000.0;\n#endif\n\n\t\t\t\tfloat3 planetSurfacePosition = IN.worldPos-IN.planetOrigin;\n\t\t\t\tfloat3 planetSurfaceScatteringPosition = (flatScaledSpaceModel == 1.0) ? normalize(planetSurfacePosition) * Rg * 1.0001 : planetSurfacePosition * (6005.0/6000.0); //1.0001 Rg and 6005*6000 to avoid some precision artifacts\n\t\t\t\textinction = getExtinction((WCP-IN.planetOrigin), planetSurfaceScatteringPosition, 1.0, 1.0, 1.0);\n\n\t\t\t\t#if defined (ECLIPSES_ON)\t\n\t\t\t\textinction*= getEclipseShadows(IN.worldPos);\n\t\t\t\t#endif\n\n\t\t\t\t#if defined (RINGSHADOW_ON)\n\t\t\t\textinction *= getLinearRingColor(IN.worldPos, _Sun_WorldSunDir, IN.planetOrigin).a;\n\t\t\t\t#endif\n\t\t\t\tfloat average=(extinction.r+extinction.g+extinction.b)/3;\n\t\t\t\textinction = extinctionTint * extinction + (1-extinctionTint) * float3(average,average,average);\n\t\t\t\textinction= max(float3(0.0,0.0,0.0), (float3(1.0,1.0,1.0)*(1-extinctionThickness) + extinctionThickness*extinction) );\n\n\t\t\t\treturn float4(extinction,1.0);\n\t\t\t}\n\t\t\tENDCG\n\t\t}\n\n\t\tPass {  //scattering pass\n\n\t\t\tZWrite On\n\t\t\tZTest LEqual\n\t\t\tCull Back\n\n\t\t\tOffset -0.05, -0.05\n\n\t\t\tBlend OneMinusDstColor One //soft additive\n\n\t\t\tCGPROGRAM\n\t\t\t#include \"UnityCG.cginc\"\n\t\t\t#pragma glsl\n\t\t\t#pragma target 3.0\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\n\t\t\t#include \"../CommonAtmosphere.cginc\"\n\t\t\t#include \"../EclipseCommon.cginc\"\n\t\t\t#include \"../RingCommon.cginc\"\t\n\n\t\t\t#pragma multi_compile ECLIPSES_OFF ECLIPSES_ON\n\t\t\t#pragma multi_compile PLANETSHINE_OFF PLANETSHINE_ON\n\t\t\t#pragma multi_compile RINGSHADOW_OFF RINGSHADOW_ON\n\t\t\t#pragma multi_compile LOCAL_MODE_OFF LOCAL_MODE_ON\n\n\t\t\t//#pragma fragmentoption ARB_precision_hint_nicest\n\n\t\t\tuniform float _Alpha_Global;\n\n\t\t\tuniform float3 _Sun_WorldSunDir;\n\t\t\tuniform float _ScatteringExposure;\n\n\t\t\t#if defined (PLANETSHINE_ON)\n\t\t\tuniform float4x4 planetShineSources;\n\t\t\tuniform float4x4 planetShineRGB;\n\t\t\t#endif\n\n\t\t\t//sampler2D _MainTex;\n\t\t\tuniform float flatScaledSpaceModel;\n\n\t\t\tstruct v2f\n\t\t\t{\n\t\t\t\tfloat4 pos: SV_POSITION;\n\t\t\t\tfloat3 worldPos : TEXCOORD0;\n\t\t\t\tfloat3 planetOrigin: TEXCOORD1;\n\t\t\t};\n\n\t\t\tv2f vert(appdata_base v)\n\t\t\t{\n\t\t\t\tv2f OUT;\n\t\t\t\tOUT.pos = UnityObjectToClipPos(v.vertex);\n\n#if defined(LOCAL_MODE_ON)\n\t#ifdef SHADER_API_D3D11\n\t\t\t\tOUT.pos.z = 0.00000000000001;\n\t#else\n\t\t\t\tOUT.pos.z = (1.0 - 0.00000000000001) * OUT.pos.w;\n\t\t\t\tOUT.pos = ( _ProjectionParams.y > 200.0 ) ? OUT.pos : float4(2.0,2.0,2.0,1.0); //cull on near camera on OpenGL\n\t#endif\n#endif\n\n\t\t\t\tOUT.worldPos = mul(unity_ObjectToWorld, v.vertex);\n\t\t\t\tOUT.planetOrigin = mul (unity_ObjectToWorld, float4(0,0,0,1)).xyz;\n\n#if defined(LOCAL_MODE_OFF)\n\t\t\t\tOUT.worldPos *= 6000.0;\n\t\t\t\tOUT.planetOrigin *= 6000.0;\n#endif\n\t\t\t\treturn OUT;\n\t\t\t}\n\n\t\t\thalf4 frag(v2f IN): COLOR\n\t\t\t{\n\t\t\t\tfloat3 inscatter=0.0;\n\t\t\t\tfloat3 extinction=0.0;\n\n\t\t\t\tfloat3 WCP = _WorldSpaceCameraPos;\n#if defined(LOCAL_MODE_OFF)\n\t\t\t\tWCP*=6000.0;\n#endif\n\n\t\t\t\tfloat3 planetSurfacePosition = IN.worldPos-IN.planetOrigin;\n\t\t\t\tfloat3 planetSurfaceScatteringPosition = (flatScaledSpaceModel == 1.0) ? normalize(planetSurfacePosition) * Rg * 1.0001 : planetSurfacePosition * (6005.0/6000.0); //1.0001 Rg and 6005*6000 to avoid some precision artifacts\n\t\t\t\tinscatter= InScattering2((WCP-IN.planetOrigin), planetSurfaceScatteringPosition, _Sun_WorldSunDir,extinction);\n\n\t\t\t\t#if defined (ECLIPSES_ON)\n\t\t\t\tinscatter *= getEclipseShadows(IN.worldPos);\n\t\t\t\t#endif\n\n\t\t\t\t#if defined (RINGSHADOW_ON)\n\t\t\t\tinscatter *= getLinearRingColor(IN.worldPos, _Sun_WorldSunDir, IN.planetOrigin).a;\n\t\t\t\t#endif\n\n\t\t\t\t///////////////////PLANETSHINE///////////////////////////////\t\t\t\t\t\t    \n\t\t\t\t//#if defined (PLANETSHINE_ON)\n\t\t\t\t//\t\t\t    float3 inscatter2=0;\n\t\t\t\t//\t\t\t   \tfloat intensity=1;\n\t\t\t\t//\t\t\t    for (int i=0; i<4; ++i)\n\t\t\t\t//    \t\t\t{\n\t\t\t\t//    \t\t\t\tif (planetShineRGB[i].w == 0) break;\n\t\t\t\t//    \t\t\t\t\t\n\t\t\t\t//    \t\t\t\t//if source is not a sun compute intensity of light from angle to light source\n\t\t\t\t//\t\t\t   \t\tintensity=1;  \n\t\t\t\t//\t\t\t   \t\tif (planetShineSources[i].w != 1.0f)\n\t\t\t\t//\t\t\t\t\t{\n\t\t\t\t////\t\t\t\t\t\tintensity = 0.5f*(1-dot(normalize(planetShineSources[i].xyz - worldPos),WSD));\n\t\t\t\t//\t\t\t\t\t\tintensity = 0.57f*max((0.75-dot(normalize(planetShineSources[i].xyz - planetSurfacePosition),WSD)),0);\n\t\t\t\t//\t\t\t\t\t}\n\t\t\t\t//\t\t\t\t    \t\t\t\t\n\t\t\t\t//    \t\t\t\tinscatter2+=SkyRadiance3(WCP - IN.planetOrigin, d, normalize(planetShineSources[i].xyz))\n\t\t\t\t//    \t\t\t\t\t\t\t*planetShineRGB[i].xyz*planetShineRGB[i].w*intensity;\n\t\t\t\t//    \t\t\t}\n\t\t\t\t//\t\t\t    \n\t\t\t\t//\t\t\t\tfinalColor+=inscatter2;\n\t\t\t\t//#endif\n\t\t\t\t/////////////////////////////////////////////////////////////\t\n\n\t\t\t\treturn float4(hdr(inscatter,_ScatteringExposure),1.0);\n\t\t\t}\n\t\t\tENDCG\n\t\t}\n\n\t}\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Atmo/ScaledPlanetScattering.shader.meta",
    "content": "fileFormatVersion: 2\nguid: f4452670096a14945b20cca112e82047\ntimeCreated: 1541873026\nlicenseType: Free\nShaderImporter:\n  defaultTextures: []\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Atmo/SkySphere.shader",
    "content": "Shader \"Scatterer/SkySphere\" \n{\n\tSubShader \n\t{\n\t\tTags {\"QUEUE\"=\"Geometry+1\" \"IgnoreProjector\"=\"True\" }\n\n\t\tPass   \t//extinction pass, I should really just put the shared components in an include file to clean this up\n\t\t{\t\t\n\t\t\tTags {\"QUEUE\"=\"Geometry+1\" \"IgnoreProjector\"=\"True\" }    \t \t \t\t\n\n\t\t\tZWrite Off\n\t\t\tcull Front\n\n\t\t\tBlend DstColor Zero  //multiplicative blending\n\n\t\t\tCGPROGRAM\n\t\t\t#include \"UnityCG.cginc\"\n\t\t\t#pragma glsl\n\t\t\t#pragma target 3.0\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\n\t\t\t#include \"../CommonAtmosphere.cginc\"\n\n\t\t\t#pragma multi_compile LOCAL_SKY_OFF LOCAL_SKY_ON\n\n\t\t\tuniform float _Alpha_Global;\n\t\t\tuniform float _Extinction_Tint;\n\t\t\tuniform float extinctionMultiplier;\n\n\t\t\tuniform float _experimentalExtinctionScale;\n\t\t\tuniform float3 _Sun_WorldSunDir;\n\n\t\t\tuniform float extinctionThickness;\n\n\t\t\tstruct v2f \n\t\t\t{\n\t\t\t\tfloat4 pos : SV_POSITION;\n\t\t\t\tfloat3 worldPos : TEXCOORD0;\n\t\t\t\tfloat3 planetOrigin: TEXCOORD1;\n\t\t\t};\n\n\t\t\tv2f vert(appdata_base v)\n\t\t\t{\n\t\t\t\tv2f OUT;\n\t\t\t\t//v.vertex.xyz*= (_experimentalExtinctionScale * (Rt-Rg)+ Rg) / Rt;\n\t\t\t\tOUT.pos = UnityObjectToClipPos(v.vertex);\n\n\t\t\t\t//this is a hack to make the sky and scaledScattering \"fill in\" for the local scattering when it gets cut off bu the limited clip plane\n\t\t\t\t//essentially render both scaled scattering and sky at max depth and check the z-buffer, that way only render where localScattering hasn't rendered\n#if defined (LOCAL_SKY_ON)\n\t#ifdef SHADER_API_D3D11\n\t\t\t\tOUT.pos.z = 0.0;\n\t#else\n\t\t\t\tOUT.pos.z = OUT.pos.w;\n\t\t\t\tOUT.pos = ( _ProjectionParams.y > 200.0 ) ? OUT.pos : float4(2.0,2.0,2.0,1.0); //cull on near camera on OpenGL\n\t#endif\n#endif\n\n\t\t\t\tOUT.worldPos = mul(unity_ObjectToWorld, v.vertex);\n\t\t\t\tOUT.planetOrigin = mul (unity_ObjectToWorld, float4(0,0,0,1)).xyz;\n#if defined (LOCAL_SKY_OFF)\n\t\t\t\tOUT.planetOrigin *= 6000;  //all calculations are done in localSpace\n#endif\n\t\t\t\treturn OUT;\n\t\t\t}\n\n\t\t\tfloat4 frag(v2f IN) : COLOR\n\t\t\t{\n\n\t\t\t\tfloat3 extinction = float3(1,1,1);\n\n\t\t\t\tfloat3 WCP = _WorldSpaceCameraPos;\n\n#if defined (LOCAL_SKY_OFF)\n\t\t\t\tWCP *= 6000;\n#endif\n\n\t\t\t\tfloat3 viewDir = normalize(IN.worldPos-_WorldSpaceCameraPos);\n\n\t\t\t\t//Rt=Rg+(Rt-Rg)*_experimentalExtinctionScale;\n\n\t\t\t\tfloat3 viewdir=normalize(viewDir);\n\t\t\t\tfloat3 camera=WCP - IN.planetOrigin;\n\n\t\t\t\tfloat r = length(camera);\n\t\t\t\tfloat rMu = dot(camera, viewdir);\n\t\t\t\tfloat mu = rMu / r;\n\t\t\t\tfloat r0 = r;\n\t\t\t\tfloat mu0 = mu;\n\n\t\t\t\tfloat dSq = rMu * rMu - r * r + Rt*Rt;\n\t\t\t\tfloat deltaSq = sqrt(dSq);\n\n\t\t\t\tfloat din = max(-rMu - deltaSq, 0.0);\n\n\t\t\t\tif (din > 0.0)\n\t\t\t\t{\n\t\t\t\t\tcamera += din * viewdir;\n\t\t\t\t\trMu += din;\n\t\t\t\t\tmu = rMu / Rt;\n\t\t\t\t\tr = Rt;\n\t\t\t\t}\n\n\t\t\t\tif (r > Rt || dSq < 0.0)\n\t\t\t\t{\n\t\t\t\t\treturn float4(1.0,1.0,1.0,1.0);\n\t\t\t\t} \n\n\t\t\t\textinction = Transmittance(r, mu);\t\t\t//this doesn't scale correctly as the view angle would have to be adjusted in a non-trivial way, and even then, intersections with the ground in the precomputed radius won't be adjusted for\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//Best to switch to analyticTransmittance, with scaling of HR and HM with experimentalAtmoScale, and rescaling HR and HM when applying config to the scaled Body\t\t\n\n\t\t\t\tfloat average=(extinction.r+extinction.g+extinction.b)/3;\n\t\t\t\textinction = _Extinction_Tint * extinction + (1-_Extinction_Tint) * float3(average,average,average);\n\n\t\t\t\textinction= max(float3(0.0,0.0,0.0), (float3(1.0,1.0,1.0)*(1-extinctionThickness) + extinctionThickness*extinction) );\n\n\t\t\t\treturn float4(extinction,1.0);\n\t\t\t}\n\n\t\t\tENDCG\n\n\t\t}\n\n\n\n\t\tPass \t//inscattering pass\n\t\t{\n\n\t\t\tTags {\"QUEUE\"=\"Geometry+1\" \"IgnoreProjector\"=\"True\" }\n\n\t\t\tZWrite Off\n\t\t\tcull Front\n\n\t\t\t//Blend One One  //additive blending\n\t\t\tBlend OneMinusDstColor One //soft additive\n\n\t\t\tCGPROGRAM\n\t\t\t#include \"UnityCG.cginc\"\n\t\t\t#pragma glsl\n\t\t\t#pragma target 3.0\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\n\t\t\t#include \"../CommonAtmosphere.cginc\"\n\t\t\t#include \"../EclipseCommon.cginc\"\n\t\t\t#include \"../RingCommon.cginc\"\n\t\t\t#include \"Godrays/GodraysCommon.cginc\"\n\n\t\t\t#pragma multi_compile ECLIPSES_OFF ECLIPSES_ON\n\t\t\t#pragma multi_compile PLANETSHINE_OFF PLANETSHINE_ON\n\t\t\t#pragma multi_compile RINGSHADOW_OFF RINGSHADOW_ON\n\t\t\t#pragma multi_compile DITHERING_OFF DITHERING_ON\n\t\t\t#pragma multi_compile GODRAYS_OFF GODRAYS_ON\n\t\t\t#pragma multi_compile LOCAL_SKY_OFF LOCAL_SKY_ON\n\n\t\t\tuniform float _Alpha_Global;\n\n\t\t\tuniform float3 _Sun_WorldSunDir;\n\t\t\tuniform float _SkyExposure;\n\n#if defined (PLANETSHINE_ON)\n\t\t\tuniform float4x4 planetShineSources;\n\t\t\tuniform float4x4 planetShineRGB;\n#endif\n\n\t\t\tuniform sampler2D _godrayDepthTexture;\n\t\t\tuniform float _godrayStrength;\n\n\t\t\tstruct v2f \n\t\t\t{\n\t\t\t\tfloat4 pos : SV_POSITION;\n\t\t\t\tfloat3 worldPos : TEXCOORD0;\n\t\t\t\tfloat3 planetOrigin: TEXCOORD1;\n#if defined(GODRAYS_ON) && defined(LOCAL_SKY_ON)\n\t\t\t\tfloat4 projPos  : TEXCOORD2;\n#endif\n\t\t\t};\n\n\t\t\tv2f vert(appdata_base v)\n\t\t\t{\n\t\t\t\tv2f OUT;\n\t\t\t\tv.vertex.xyz*= (_experimentalAtmoScale * (Rt-Rg)+ Rg) / Rt;\n\t\t\t\tOUT.pos = UnityObjectToClipPos(v.vertex);\n\n#if defined (LOCAL_SKY_ON)\n\t#ifdef SHADER_API_D3D11\n\t\t\t\tOUT.pos.z = 0.0;\n\t#else\n\t\t\t\tOUT.pos.z = OUT.pos.w;\n\t\t\t\tOUT.pos = ( _ProjectionParams.y > 200.0 ) ? OUT.pos : float4(2.0,2.0,2.0,1.0); //cull on near camera on OpenGL\n\t#endif\n#endif\n\n\t\t\t\tOUT.worldPos = mul(unity_ObjectToWorld, v.vertex);\n\n\n\t\t\t\tOUT.planetOrigin = mul (unity_ObjectToWorld, float4(0,0,0,1)).xyz;\n#if defined (LOCAL_SKY_OFF)\n\t\t\t\tOUT.planetOrigin *= 6000;  //all calculations are done in localSpace\n#endif\n\n#if defined(GODRAYS_ON) && defined(LOCAL_SKY_ON)\n\t\t\t\tOUT.projPos = ComputeScreenPos(OUT.pos);\n#endif\n\t\t\t\treturn OUT;\n\t\t\t}\n\n\t\t\tfloat4 frag(v2f IN) : SV_Target\n\t\t\t{\n\t\t\t\tfloat3 WSD = _Sun_WorldSunDir;\n\t\t\t\tfloat3 WCP = _WorldSpaceCameraPos;\n\n#if defined (LOCAL_SKY_OFF)\n\t\t\t\tWCP *= 6000;\n#endif\n\n\t\t\t\tfloat3 viewDir = normalize(IN.worldPos-_WorldSpaceCameraPos);\n\n\t\t\t\tfloat3 scatteringCameraPos = WCP - IN.planetOrigin;\n#if defined(GODRAYS_ON) && defined(LOCAL_SKY_ON)\n\t\t\t\tfloat2 depthUV = IN.projPos.xy/IN.projPos.w;\n\t\t\t\tfloat godrayDepth = 0.0;\n\n\t\t\t\tgodrayDepth = sampleGodrayDepth(_godrayDepthTexture, depthUV, 1.0);\n\n\t\t\t\t//trying to find the optical depth from the camera level, should probably remove these from the boundary of the atmo and not the camera level?\n\t\t\t\tfloat muCamera = dot(normalize(_WorldSpaceCameraPos - IN.planetOrigin), viewDir);\n\n\t\t\t\tgodrayDepth = DistanceFromOpticalDepth(_experimentalAtmoScale * (Rt-Rg) * 0.5, length(_WorldSpaceCameraPos - IN.planetOrigin), muCamera, godrayDepth, 500000.0);\n\t\t\t\t//cap by 0.3*distance to atmo boundary\n\t\t\t\tfloat skyIntersectDistance =  intersectSphereInside(_WorldSpaceCameraPos, viewDir, IN.planetOrigin, Rg + _experimentalAtmoScale * (Rt-Rg));\n\t\t\t\tgodrayDepth = min(0.3 * skyIntersectDistance, godrayDepth);\n\n\t\t\t\tgodrayDepth *= _godrayStrength;\n\n\t\t\t\tscatteringCameraPos = scatteringCameraPos + viewDir * godrayDepth ;\n#endif\n\t\t\t\tfloat3 inscatter = SkyRadiance3(scatteringCameraPos, viewDir, WSD);\n\n\t\t\t\tfloat3 finalColor = inscatter;\n\t\t\t\tfloat eclipseShadow = 1;\n\n\t\t\t\t//find worldPos of the point in the atmo we're looking at directly\n\t\t\t\t//necessary for eclipses, ring shadows and planetshine\n\t\t\t\tfloat3 worldPos;\n#if defined (PLANETSHINE_ON) || defined (ECLIPSES_ON) || defined (RINGSHADOW_ON)\n\t\t\t\tfloat interSectPt= intersectSphereInside(WCP,viewDir,IN.planetOrigin,Rt);//*_rimQuickFixMultiplier\n\n\t\t\t\tif (interSectPt != -1)\n\t\t\t\t{\n\t\t\t\tworldPos = WCP + viewDir * interSectPt;\n\t\t\t\t}\n#endif\n\n#if defined (ECLIPSES_ON)\n\t\t\t\tif (interSectPt != -1)\n\t\t\t\t{\t\t\t\t\n\t\t\t\t\tfinalColor*= getEclipseShadows(worldPos);\n\t\t\t\t}\n#endif\n\n#if defined (RINGSHADOW_ON)\n\t\t\t\tif (interSectPt != -1)\n\t\t\t\t{\n\t\t\t\t\tfinalColor *= getLinearRingColor(worldPos, _Sun_WorldSunDir, IN.planetOrigin).a;\n\t\t\t\t}\n#endif\n\n\t\t\t\t/////////////////PLANETSHINE///////////////////////////////\t\t\t\t\t\t    \n#if defined (PLANETSHINE_ON)\n\t\t\t\tfloat3 inscatter2=0;\n\t\t\t\tfloat intensity=1;\n\t\t\t\tfor (int i=0; i<4; ++i)\n\t\t\t\t{\n\t\t\t\t\tif (planetShineRGB[i].w == 0) break;\n\n\t\t\t\t\t//if source is not a sun compute intensity of light from angle to light source\n\t\t\t\t\tintensity=1;  \n\t\t\t\t\tif (planetShineSources[i].w != 1.0f)\n\t\t\t\t\t{\n//\t\t\t\t\t\tintensity = 0.5f*(1-dot(normalize(planetShineSources[i].xyz - worldPos),WSD));\n\t\t\t\t\t\tintensity = 0.57f*max((0.75-dot(normalize(planetShineSources[i].xyz - worldPos),WSD)),0);\n\t\t\t\t\t}\n\n\t\t\t\t\tinscatter2+=SkyRadiance3(WCP - IN.planetOrigin, viewDir, normalize(planetShineSources[i].xyz)) *planetShineRGB[i].xyz*planetShineRGB[i].w*intensity;\n\t\t\t\t}\n\n\t\t\t\tfinalColor+=inscatter2;\n\t\t\t\t#endif\n\t\t\t\t///////////////////////////////////////////////////////////\t\n\n\t\t\t\treturn float4(_Alpha_Global*dither(hdr(finalColor,_SkyExposure), IN.pos),1.0);\t\n\t\t\t}\n\t\t\tENDCG\n\t\t}\n\n\n\t}\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Atmo/SkySphere.shader.meta",
    "content": "fileFormatVersion: 2\nguid: 1e5ee557da46d59498c484308be5067e\ntimeCreated: 1541870321\nlicenseType: Free\nShaderImporter:\n  defaultTextures: []\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Atmo.meta",
    "content": "fileFormatVersion: 2\nguid: e5d490e301a36f04a9397d7257fb157b\nfolderAsset: yes\ntimeCreated: 1552241563\nlicenseType: Free\nDefaultImporter:\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/ClippingUtils.cginc",
    "content": "uniform float _ScattererCameraOverlap;\n\n//not sure if good idea to use a bool\nbool fragmentInsideOfClippingRange(float depth)\n{\n\tUNITY_BRANCH\n\tif (_ProjectionParams.z > 1000.0) \t//if farcamera\n\t{\n\t\treturn (depth  > (_ProjectionParams.y+1.0+_ScattererCameraOverlap)); //if fragment depth outside of current camera clipping range, return empty pixel\n\t}\n\telse\t\t\t\t\t\t\t\t//if nearcamera\n\t{\n\t\treturn (depth <= (_ProjectionParams.z+1.0));\n\t}\n}\n\nbool oceanFragmentInsideOfClippingRange(float depth)\n{\n\tUNITY_BRANCH\n\tif (_ProjectionParams.z > 1000.0) \t//if farcamera\n\t{\n\t\treturn (depth  > (_ProjectionParams.y+_ScattererCameraOverlap)); //if fragment depth outside of current camera clipping range, return empty pixel\n\t}\n\telse\t\t\t\t\t\t\t\t//if nearcamera\n\t{\n\t\treturn (depth <= (_ProjectionParams.z+1.0));\n\t}\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/ClippingUtils.cginc.meta",
    "content": "fileFormatVersion: 2\nguid: a3c7ce509d225e740aed9d6579e2a1e9\ntimeCreated: 1545494286\nlicenseType: Free\nShaderImporter:\n  defaultTextures: []\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/CommonAtmosphere.cginc",
    "content": "﻿//\n//  Precomputed Atmospheric Scattering\n//  Copyright (c) 2008 INRIA\n//  All rights reserved.\n//\n//  Redistribution and use in source and binary forms, with or without\n//  modification, are permitted provided that the following conditions\n//  are met:\n//  1. Redistributions of source code must retain the above copyright\n//     notice, this list of conditions and the following disclaimer.\n//  2. Redistributions in binary form must reproduce the above copyright\n//     notice, this list of conditions and the following disclaimer in the\n//     documentation and/or other materials provided with the distribution.\n//  3. Neither the name of the copyright holders nor the names of its\n//     contributors may be used to endorse or promote products derived from\n//     this software without specific prior written permission.\n//\n//  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n//  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n//  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n//  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n//  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n//  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n//  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n//  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n//  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n//  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\n//  THE POSSIBILITY OF SUCH DAMAGE.\n//\n//  Author: Eric Bruneton\n//  Modified and ported to Unity by Justin Hawkins 2013\n//\n\n\n//            #define useHorizonHack\n#define useAnalyticTransmittance\n\nuniform sampler2D _Transmittance;\nuniform sampler2D _Inscatter;\nuniform sampler2D _Irradiance;\nuniform float TRANSMITTANCE_W;\nuniform float TRANSMITTANCE_H;\nuniform float SKY_W;\nuniform float SKY_H;\nuniform float M_PI;\nuniform float3 EARTH_POS;\n\n// Rayleigh\nuniform float HR;\nuniform float3 betaR;\n\n// Mie\nuniform float HM;\nuniform float3 betaMSca;\nuniform float3 betaMEx;\nuniform float mieG;\n\nuniform float Rg;\nuniform float Rt;\nuniform float RL;\nuniform float RES_R;\nuniform float RES_MU;\nuniform float RES_MU_S;\nuniform float RES_NU;\nuniform float3 SUN_DIR;\n\n#define _Sun_Intensity 100.0;\nuniform float3 _sunColor;\n\nuniform float _experimentalAtmoScale;\n\nuniform float _viewdirOffset;\n\nuniform float cloudTerminatorSmooth;\n\n#include \"IntersectCommon.cginc\"\n\n/** returns the matrix {{0.0,3.0},{2.0,1.0}} */\nfloat bayer2(const float2 xy)\n{\n\treturn fmod(3.0*xy.x+2.0*xy.y,4.0);\n}\n\n/** \n * Non-normalized Bayer-Pattern for power-of-two sized matrices (see https://en.wikipedia.org/wiki/Ordered_dithering for the formula).\n * sizeExpOfTwo determines the dimension of the matrix to generate. For instance having sizeExpOfTwo == 3 yields an 8x8 matrix, sizeExpOfTwo == 4 yields 16x16.\n * The needed normalization factor is (2**(sizeExpOfTwo))**2, so for sizeExpOfTwo == 3 the normalization would be 64.\n * xy: Indices inside the matrix. For performance reasons they are not sanitized, so make sure you use valid indices.\n * Floating point variant. Known to be exact up to sizeExpOfTwo == 12 (might be better, just not tested)\n */\nfloat bayerPattern(const int sizeExpOfTwo, float2 xy)\n{\n\tfloat factor = 1.0;\n\tfloat summand = 0.0;\n\t//The code would get easier to read if a while-loop were used, but then the compiler would have a harder time unrolling it.\n\tfor(int i=1;i<sizeExpOfTwo;++i)\n\t{\n\t\tfloat matrixSize = exp2(sizeExpOfTwo-i);\n\t\tfloat summ = bayer2(floor(xy/matrixSize));\n\t\txy=fmod(xy,matrixSize);\n\t\tsummand = summand+factor*summ;\n\t\tfactor = factor*4.0;\n\t}\n\treturn factor * bayer2(xy) + summand;\n}\n\n//test version without a loop and for fixed 8x8 matrix size - not really any faster than the generic function above. Only left in for reference.\nuint bayer8inl(const uint2 xy)\n{\n\treturn 4*(4*bayer2(xy%2) + bayer2(xy%4/2)) + bayer2(xy/4);\n}\n\nfloat3 dither (float3 iColor, float2 iScreenPos)\n{\n#if defined (DITHERING_ON)\n\tfloat bayer=bayerPattern(3,fmod(int2(iScreenPos),8));\n\n\tconst float rgbByteMax=255.;\n\n\tfloat3 rgb=iColor*rgbByteMax;\n\tfloat3 head=floor(rgb);\n\tfloat3 tail=frac(rgb);\n\n\treturn (head + step(bayer,64.f*tail)) / rgbByteMax;\n#else\n\treturn iColor;\n#endif\n}\n\nfloat4 dither (float4 iColor, float2 iScreenPos)\n{\n\treturn float4(dither(iColor.rgb, iScreenPos), iColor.a);\n}\n\n\nfloat3 hdr(float3 L, float exposure) {\n\tL = L * exposure;\n\tL.r = L.r < 1.413 ? pow(L.r * 0.38317, 1.0 / 2.2) : 1.0 - exp(-L.r);\n\tL.g = L.g < 1.413 ? pow(L.g * 0.38317, 1.0 / 2.2) : 1.0 - exp(-L.g);\n\tL.b = L.b < 1.413 ? pow(L.b * 0.38317, 1.0 / 2.2) : 1.0 - exp(-L.b);\n\treturn L;\n}\n\nfloat3 hdrNoExposure(float3 L) {\n\tL.r = L.r < 1.413 ? pow(L.r * 0.38317, 1.0 / 2.2) : 1.0 - exp(-L.r);\n\tL.g = L.g < 1.413 ? pow(L.g * 0.38317, 1.0 / 2.2) : 1.0 - exp(-L.g);\n\tL.b = L.b < 1.413 ? pow(L.b * 0.38317, 1.0 / 2.2) : 1.0 - exp(-L.b);\n\treturn L;\n}\n\nfloat4 Texture4D(sampler2D table, float r, float mu, float muS, float nu, float RtResized)\n{\n\tfloat H = sqrt(RtResized * RtResized - Rg * Rg);\n\tfloat rho = sqrt(r * r - Rg * Rg);\n\tfloat rmu = r * mu;\n\tfloat delta = rmu * rmu - r * r + Rg * Rg;\n\tfloat4 cst = rmu < 0.0 && delta > 0.0 ? float4(1.0, 0.0, 0.0, 0.5 - 0.5 / RES_MU) : float4(-1.0, H * H, H, 0.5 + 0.5 / RES_MU);\n\tfloat uR = 0.5 / RES_R + rho / H * (1.0 - 1.0 / float(RES_R));\n\tfloat uMu = cst.w + (rmu * cst.x + sqrt(delta + cst.y)) / (rho + cst.z) * (0.5 - 1.0 / RES_MU);\n\t// paper formula\n\t//    float uMuS = 0.5 / float(RES_MU_S) + max((1.0 - exp(-3.0 * muS - 0.6)) / (1.0 - exp(-3.6)), 0.0) * (1.0 - 1.0 / float(RES_MU_S));\n\t// better formula\n\tfloat uMuS = 0.5 / RES_MU_S + (atan(max(muS, -0.1975) * tan(1.26 * 1.1)) / 1.1 + (1.0 - 0.26)) * 0.5 * (1.0 - 1.0 / RES_MU_S);\n\tfloat _lerp = (nu + 1.0) / 2.0 * (RES_NU - 1.0);\n\tfloat uNu = floor(_lerp);\n\t_lerp = _lerp - uNu;\n\t//original 3D lookup\n\t//return tex3Dlod(table, float4((uNu + uMuS) / RES_NU, uMu, uR, 0)) * (1.0 - _lerp) + tex3Dlod(table, float4((uNu + uMuS + 1.0) / RES_NU, uMu, uR, 0)) * _lerp;\n\t//new 2D lookup\n\tfloat u_0 = floor(uR*RES_R-1)/(RES_R);\n\tfloat u_1 = floor(uR*RES_R)/(RES_R);\n\tfloat u_frac = frac(uR*RES_R);\n\tfloat4 A = tex2Dlod(table, float4((uNu + uMuS) / RES_NU, uMu / RES_R + u_0,0.0,0.0)) * (1.0 - _lerp) + tex2Dlod(table, float4((uNu + uMuS + 1.0) / RES_NU, uMu / RES_R + u_0,0.0,0.0)) * _lerp;\n\tfloat4 B = tex2Dlod(table, float4((uNu + uMuS) / RES_NU, uMu / RES_R + u_1,0.0,0.0)) * (1.0 - _lerp) + tex2Dlod(table, float4((uNu + uMuS + 1.0) / RES_NU, uMu / RES_R + u_1,0.0,0.0)) * _lerp;\n\treturn (A * (1.0-u_frac) + B * u_frac);\n}\n\nfloat3 GetMie(float4 rayMie)\n{\n\t// approximated single Mie scattering (cf. approximate Cm in paragraph \"Angular precision\")\n\t// rayMie.rgb=C*, rayMie.w=Cm,r\n\treturn rayMie.rgb * rayMie.w / max(rayMie.r, 1e-4) * (betaR.r / betaR);\n}\n\nfloat PhaseFunctionR(float mu)\n{\n\t// Rayleigh phase function\n\treturn (3.0 / (16.0 * M_PI)) * (1.0 + mu * mu);\n}\n\nfloat PhaseFunctionM(float mu)\n{\n\t// Mie phase function\n\treturn 1.5 * 1.0 / (4.0 * M_PI) * (1.0 - mieG*mieG) * pow(1.0 + (mieG*mieG) - 2.0*mieG*mu, -3.0/2.0) * (1.0 + mu * mu) / (2.0 + mieG*mieG);\n}\n\nfloat3 Transmittance(float r, float mu)\n{\n\t// transmittance(=transparency) of atmosphere for infinite ray (r,mu)\n\t// (mu=cos(view zenith angle)), intersections with ground ignored\n\tfloat uR, uMu;\n\tuR = sqrt((r - Rg) / (Rt - Rg));\n\tuMu = atan((mu + 0.15) / (1.0 + 0.15) * tan(1.5)) / 1.5;\n\t//#if !defined(SHADER_API_OPENGL)\n\treturn tex2Dlod (_Transmittance, float4(uMu, uR,0.0,0.0)).rgb;\n\t//#else\n\t//    return tex2D (_Transmittance, float2(uMu, uR)).rgb;\n\t//#endif\n}\n\n\n// optical depth for ray (r,mu) of length d, using analytic formula\n// (mu=cos(view zenith angle)), intersections with ground ignored\n// H=height scale of exponential density function\nfloat OpticalDepth(float H, float r, float mu, float d)\n{\n\tfloat a = sqrt((0.5/H)*r);\n\tfloat2 a01 = a*float2(mu, mu + d / r);\n\tfloat2 a01s = sign(a01);\n\tfloat2 a01sq = a01*a01;\n\tfloat x = a01s.y > a01s.x ? exp(a01sq.x) : 0.0;\n\tfloat2 y = a01s / (2.3193*abs(a01) + sqrt(1.52*a01sq + 4.0)) * float2(1.0, exp(-d/H*(d/(2.0*r)+mu)));\n\treturn sqrt((6.2831*H)*r) * exp((Rg-r)/H) * (x + dot(y, float2(1.0, -1.0)));\n}\n\n// transmittance(=transparency) of atmosphere for ray (r,mu) of length d\n// (mu=cos(view zenith angle)), intersections with ground ignored\n// uses analytic formula instead of transmittance texture\nfloat3 AnalyticTransmittance(float r, float mu, float d)\n{\n\treturn exp(- betaR * OpticalDepth(HR * _experimentalAtmoScale, r, mu, d) - betaMEx * OpticalDepth(HM * _experimentalAtmoScale, r, mu, d));\n}\n\n//search algorithm to find approx distance from optical depth\nfloat DistanceFromOpticalDepth(float H, float r, float mu, float targetOpticalDepth, float maxLength)\n{\n\tif (targetOpticalDepth == 0.0)\n\t\treturn 0.0;\n\t\n\tint maxIterations = 12;\n\tint iteration = 0;\n\n\tfloat minDistance = 0; //maybe also init this with the targetOpticalDepth?\n\tfloat maxDistance = maxLength;\n\n\tfloat mid = 0.5 * (maxDistance + minDistance);\n\tfloat depth = 0;\n\n\twhile ((iteration < maxIterations) && (depth != targetOpticalDepth))\n\t{\n\t\tdepth = OpticalDepth(H, r, mu, mid);\n\n\t\tif (depth >= targetOpticalDepth)\n\t\t{\n\t\t\tmaxDistance = mid;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tminDistance = mid;\n\t\t}\n\n\t\tmid = 0.5 * (maxDistance + minDistance);\n\n\n\t\titeration++;\n\t}\n\n\treturn mid;\n}\n\n//the extinction part extracted from the inscattering function\n//this is for objects in atmo, computed using analyticTransmittance (better precision and less artifacts) or the precomputed transmittance table\nfloat3 getExtinction(float3 camera, float3 _point, float shaftWidth, float scaleCoeff, float irradianceFactor)\n{\n\tfloat3 extinction = float3(1, 1, 1);\n\tfloat3 viewdir = _point - camera;\n\tfloat d = length(viewdir) * scaleCoeff;\n\tviewdir = viewdir / d;\n\t/////////////////////experimental block begin\n\tfloat RtResized = Rg + (Rt - Rg) * _experimentalAtmoScale;\n\t//                viewdir.x += _viewdirOffset;\n\tviewdir = normalize(viewdir);\n\t/////////////////////experimental block end\n\tfloat r = length(camera) * scaleCoeff;\n\n\tif (r < 0.9 * Rg) {\n\t\tcamera.y += Rg;\n\t\tr = length(camera) * scaleCoeff;\n\t}\n\n\tfloat rMu = dot(camera, viewdir);\n\tfloat mu = rMu / r;\n\n\tfloat dSq = rMu * rMu - r * r + RtResized*RtResized;\n\tfloat deltaSq = sqrt(dSq);\n\n\tfloat din = max(-rMu - deltaSq, 0.0);\n\n\tif (din > 0.0 && din < d)\n\t{\n\t\trMu += din;\n\t\tmu = rMu / RtResized;\n\t\tr = RtResized;\n\t\td -= din;\n\t}\n\tif (r <= RtResized && dSq >= 0.0) \n\t{ \n\t\t//    \tif (r < Rg + 1600.0)\n\t\t//    \t{\n\t\t//    \t\t// avoids imprecision problems in aerial perspective near ground\n\t\t//    \t\t//Not sure if necessary with extinction\n\t\t//        \tfloat f = (Rg + 1600.0) / r;\n\t\t//        \tr = r * f;\n\t\t//    \t}\n\n\t\tr = (r < Rg + 1600.0) ? (Rg + 1600.0) : r; //wtf is this?\n\n\t\t//set to analyticTransmittance only atm\n\t\t#if defined (useAnalyticTransmittance)\n\t\textinction = min(AnalyticTransmittance(r, mu, d), 1.0);\n\t\t#endif\n\t}\t\n\telse\n\t{\t//if out of atmosphere\n\t\textinction = float3(1,1,1);\n\t}\n\n\treturn extinction;\n}\n\n//Extinction for a ray going all the way to the end of the atmosphere\n//i.e an infinite ray\n//for clouds so no analyticTransmittance required, may change this to use analytic transmittance so that everything is consistent\nfloat3 getSkyExtinction(float3 camera, float3 viewdir) //instead of camera this is the cloud position\n{\n\tfloat3 extinction = float3(1,1,1);\n\n\tfloat RtResized=Rg+(Rt-Rg)*_experimentalAtmoScale;\n\n\tfloat r = length(camera);\n\tfloat rMu = dot(camera, viewdir);\n\tfloat mu = rMu / r;\n\n\tfloat dSq = rMu * rMu - r * r + RtResized*RtResized;\n\tfloat deltaSq = sqrt(dSq);\n\n\tfloat din = max(-rMu - deltaSq, 0.0);\n\tif (din > 0.0)\n\t{\n\t\tcamera += din * viewdir;\n\t\trMu += din;\n\t\tmu = rMu / RtResized;\n\t\tr = RtResized;\n\t}\n\n\textinction = Transmittance(r, mu);\n\n\tif (r > RtResized || dSq < 0.0) \n\t{\n\t\textinction = float3(1,1,1);\n\t} \t\n\n\t//    //return mu < -sqrt(1.0 - (Rg / r) * (Rg / r)) ? float3(0,0,0) : extinction; //why is this not needed?\n\t//\n\t//    float terminatorAngle = -sqrt(1.0 - (Rg / r) * (Rg / r));\n\t//    //return mu < terminatorAngle ? float3(0,0,0) : extinction;\n\t//\n\t//    float index= (mu - (terminatorAngle - cloudTerminatorSmooth)) / (cloudTerminatorSmooth);\n\t//\n\t//    if (index>1)\n\t//    \treturn extinction;\n\t//    else if (index < 0)\n\t//    \treturn float3(0,0,0);\n\t//    else\n\t//    \treturn lerp (float3(0,0,0),extinction,index);\n\n\treturn extinction;\n}\n\nfloat3 sunsetExtinction(float3 camera)\n{\n\treturn(getSkyExtinction(camera,SUN_DIR));\n}\n\n//Extinction for a ray going all the way to the end of the atmosphere\n//i.e an infinite ray\n//with analyticTransmittance\n//doesn't seem to be used\nfloat3 getSkyExtinctionAnaLyticTransmittance(float3 camera, float3 viewdir) //instead of camera this is the cloud position\n{\n\tfloat3 extinction = float3(1,1,1);\n\n\tfloat RtResized=Rg+(Rt-Rg)*_experimentalAtmoScale;\n\n\tfloat r = length(camera);\n\tfloat rMu = dot(camera, viewdir);\n\tfloat mu = rMu / r;\n\n\tfloat dSq = rMu * rMu - r * r + RtResized*RtResized;\n\tfloat deltaSq = sqrt(dSq);\n\n\tfloat din = max(-rMu - deltaSq, 0.0);\n\tif (din > 0.0)\n\t{\n\t\tcamera += din * viewdir;\n\t\trMu += din;\n\t\tmu = rMu / RtResized;\n\t\tr = RtResized;\n\t}\n\n\t//extinction = Transmittance(r, mu);\n\n\tfloat distInAtmo = abs(intersectSphereInside(camera,viewdir,float3(0,0,0),RtResized));\n\textinction = AnalyticTransmittance(r, mu, distInAtmo);\n\n\tif (r > RtResized || dSq < 0.0) \n\t{\n\t\textinction = float3(1,1,1);\n\t} \t\t\t\t\n\n\t//return mu < -sqrt(1.0 - (Rg / r) * (Rg / r)) ? float3(0,0,0) : extinction; //why is this not needed?\n\n\n\t//    \t\t\tfloat terminatorAngle = -sqrt(1.0 - (Rg / r) * (Rg / r));\n\t//    \t\t\t//return mu < terminatorAngle ? float3(0,0,0) : extinction;\n\t//\n\t//    \t\t\tfloat index= (mu - (terminatorAngle - cloudTerminatorSmooth)) / (cloudTerminatorSmooth);\n\t//\n\t//    \t\t\tif (index>1)\n\t//    \t\t\t\treturn extinction;\n\t//    \t\t\telse if (index < 0)\n\t//    \t\t\t\treturn float3(0,0,0);\n\t//    \t\t\telse\n\t//    \t\t\t\treturn lerp (float3(0,0,0),extinction,index);\n\n\treturn extinction;\n}\n\nfloat3 SkyRadiance2(float3 camera, float3 viewdir, float3 sundir, out float3 extinction)\n{\n\textinction = float3(1,1,1);\n\tfloat3 result = float3(0,0,0);\n\n\tfloat RtResized=Rg+(Rt-Rg)*_experimentalAtmoScale;\n\n\n\t//viewdir.x+=_viewdirOffset;\n\tviewdir=normalize(viewdir);\n\n\t//camera *= scale;\n\t//camera += viewdir * max(shaftWidth, 0.0);\n\tfloat r = length(camera);\n\n\tfloat rMu = dot(camera, viewdir);\n\trMu+=_viewdirOffset * r;\n\n\tfloat mu = rMu / r;\n\n\t//\tfloat r0 = r;\n\t//\tfloat mu0 = mu;\n\n\tfloat dSq = rMu * rMu - r * r + RtResized*RtResized;\n\tfloat deltaSq = sqrt(dSq);\n\n\tfloat din = max(-rMu - deltaSq, 0.0);\n\tif (din > 0.0)\n\t{\n\t\tcamera += din * viewdir;\n\t\trMu += din;\n\t\tmu = rMu / RtResized;\n\t\tr = RtResized;\n\t}\n\n\tfloat nu = dot(viewdir, sundir);\n\tfloat muS = dot(camera, sundir) / r;\n\n\t//\tfloat4 inScatter = Texture4D(_Sky_Inscatter, r, rMu / r, muS, nu);\n\tfloat4 inScatter = Texture4D(_Inscatter, r, rMu / r, muS, nu,RtResized);\n\n\textinction = Transmittance(r, mu);\n\n\tif (r <= RtResized && dSq >= 0.0)\n\t{\n\n\t\t//        if (shaftWidth > 0.0) \n\t\t//        {\n\t\t//            if (mu > 0.0) {\n\t\t//                inScatter *= min(Transmittance(r0, mu0) / Transmittance(r, mu), 1.0).rgbr;\n\t\t//            } else {\n\t\t//                inScatter *= min(Transmittance(r, -mu) / Transmittance(r0, -mu0), 1.0).rgbr;\n\t\t//            }\n\t\t//        }\n\n\t\tfloat3 inScatterM = GetMie(inScatter);\n\t\tfloat phase = PhaseFunctionR(nu);\n\t\tfloat phaseM = PhaseFunctionM(nu);\n\t\tresult = inScatter.rgb * phase + inScatterM * phaseM;\n\t}    \n\telse\n\t{\n\t\tresult = float3(0,0,0);\n\t\textinction = float3(1,1,1);\n\t} \n\n\tresult*=_sunColor;\n\treturn result * _Sun_Intensity;\n\n}\n\n//same as 2 but with no extinction\nfloat3 SkyRadiance3(float3 camera, float3 viewdir, float3 sundir)//, out float3 extinction)//, float shaftWidth)\n{\n\tfloat3 result = float3(0,0,0);\n\n\tfloat RtResized=Rg+(Rt-Rg)*_experimentalAtmoScale;\n\n\n\t//viewdir.x+=_viewdirOffset;\n\tviewdir=normalize(viewdir);\n\n\t//camera *= scale;\n\t//camera += viewdir * max(shaftWidth, 0.0);\n\tfloat r = max(length(camera),Rg+100.0); //fixes artifacts when camera is crossing water surface\n\n\tfloat rMu = dot(camera, viewdir);\n\trMu+=_viewdirOffset * r;\n\n\t//float mu = rMu / r;\n\n\tfloat dSq = rMu * rMu - r * r + RtResized*RtResized;\n\tfloat deltaSq = sqrt(dSq);\n\n\tfloat din = max(-rMu - deltaSq, 0.0);\n\tif (din > 0.0)\n\t{\n\t\tcamera += din * viewdir;\n\t\trMu += din;\n\t\t//mu = rMu / RtResized;\n\t\tr = RtResized;\n\t}\n\n\tfloat nu = dot(viewdir, sundir);\n\tfloat muS = dot(camera, sundir) / r;\n\n\tfloat4 inScatter = Texture4D(_Inscatter, r, rMu / r, muS, nu,RtResized);\n\n\t//extinction = Transmittance(r, mu);\n\n\tif (r <= RtResized && dSq >= 0.0) \n\t{\n\n\t\t//        if (shaftWidth > 0.0) \n\t\t//        {\n\t\t//            if (mu > 0.0) {\n\t\t//                inScatter *= min(Transmittance(r0, mu0) / Transmittance(r, mu), 1.0).rgbr;\n\t\t//            } else {\n\t\t//                inScatter *= min(Transmittance(r, -mu) / Transmittance(r0, -mu0), 1.0).rgbr;\n\t\t//            }\n\t\t//        }\n\n\t\tfloat3 inScatterM = GetMie(inScatter);\n\t\tfloat phase = PhaseFunctionR(nu);\n\t\tfloat phaseM = PhaseFunctionM(nu);\n\t\tresult = inScatter.rgb * phase + inScatterM * phaseM;\n\t}    \n\telse\n\t{\n\t\tresult = float3(0,0,0);\n\t\t//extinction = float3(1,1,1);\n\t} \n\n\tresult*=_sunColor;\n\treturn result * _Sun_Intensity;\n}\n\nfloat2 GetIrradianceUV(float r, float muS) \n{\n\tfloat uR = (r - Rg) / (Rt - Rg);\n\tfloat uMuS = (muS + 0.2) / (1.0 + 0.2);\n\treturn float2(uMuS, uR);\n}\n\nfloat3 Irradiance(sampler2D samp, float r, float muS) \n{\n\tfloat2 uv = GetIrradianceUV(r, muS);  \n\treturn tex2Dlod(samp,float4(uv,0.0,0.0)).rgb;    \n}\n\n// incident sky light at given position, integrated over the hemisphere (irradiance)\n// r=length(x)\n// muS=dot(x,s) / r\nfloat3 SkyIrradiance(float r, float muS)\n{\t\n\treturn Irradiance(_Irradiance, r, muS) * _sunColor * _Sun_Intensity;\n}\n\n// transmittance(=transparency) of atmosphere for infinite ray (r,mu)\n// (mu=cos(view zenith angle)), or zero if ray intersects ground\n// Change to analytic?\nfloat3 TransmittanceWithShadow(float r, float mu) \n{\n\treturn mu < -sqrt(1.0 - (Rg / r) * (Rg / r)) ? float3(0,0,0) : Transmittance(r, mu);\n}\n\n// incident sun light at given position (radiance)\n// r=length(x)\n// muS=dot(x,s) / r\nfloat3 SunRadiance(float r, float muS)\n{\n\treturn TransmittanceWithShadow(r, muS) * _sunColor * _Sun_Intensity;\n}\n\nvoid SunRadianceAndSkyIrradiance(float3 worldP, float3 worldN, float3 worldS, out float3 sunL, out float3 skyE)\n{\n\t//\tworldP *= scale;\n\tfloat r = length(worldP);\n\tif (r < 0.9 * Rg) {\n\t\tworldP.z += Rg;\n\t\tr = length(worldP);\n\t}\n\tfloat3 worldV = worldP / r; // vertical vector\n\tfloat muS = dot(worldV, worldS);\n\n\tfloat sunOcclusion = 1.0;// - sunShadow;\n\t//sunL = SunRadiance(r, muS) * sunOcclusion;\n\tsunL = TransmittanceWithShadow(r, muS) * _sunColor * _Sun_Intensity;//removed _Sun_Intensity multiplier\n\n\t// ambient occlusion due only to slope, does not take self shadowing into account\n\tfloat skyOcclusion = (1.0 + dot(worldV, worldN)) * 0.5;\n\t// factor 2.0 : hack to increase sky contribution (numerical simulation of\n\t// \"precompued atmospheric scattering\" gives less luminance than in reality)\n\tskyE = 2.0 * SkyIrradiance(r, muS) * skyOcclusion;\n}\n\nfloat3 SimpleSkyirradiance(float3 worldP, float3 worldN, float3 worldS)\n{\n\tfloat r = length(worldP);\n\tif (r < 0.9 * Rg) {\n\t\tworldP.z += Rg;\n\t\tr = length(worldP);\n\t}\n\tfloat3 worldV = worldP / r; // vertical vector\n\tfloat muS = dot(worldV, worldS);\n\n\t// ambient occlusion due only to slope, does not take self shadowing into account\n\tfloat skyOcclusion = (1.0 + dot(worldV, worldN)) * 0.5;\n\t// factor 2.0 : hack to increase sky contribution (numerical simulation of\n\t// \"precompued atmospheric scattering\" gives less luminance than in reality)\n\tfloat3 skyE = 2.0 * SkyIrradiance(r, muS) * skyOcclusion;\n\n\treturn skyE;\n}\n\n//InScattering with modified atmo heights\nfloat3 InScattering2(float3 camera, float3 _point, float3 sunDir, out float3 extinction) {\n\t// single scattered sunlight between two points\n\t// camera=observer\n\t// point=point on the ground\n\t// sundir=unit vector towards the sun\n\t// return scattered light and extinction coefficient\n\tfloat3 result = float3(0, 0, 0);\n\textinction=1.0;\n\tfloat3 viewdir = _point - camera;\n\tfloat d = length(viewdir);\n\tviewdir = viewdir / d;\n\n\tfloat RtResized = Rg + (Rt - Rg) * _experimentalAtmoScale;\n\tviewdir = normalize(viewdir);\n\n\tfloat r = length(camera);\n\tif (r < 0.9 * Rg)\n\t{\n\t        camera.y += Rg;\n\t        _point.y += Rg;\n\t        r = length(camera);\n\t}\n\n\tfloat rMu = dot(camera, viewdir);\n\tfloat mu = rMu / r;\n\tfloat r0 = r;\n\tfloat mu0 = mu;\n\tfloat muExtinction=mu;\n\t_point -= viewdir * clamp(1.0, 0.0, d);\n\tfloat dSq = rMu * rMu - r * r + RtResized*RtResized;\n\tfloat deltaSq = sqrt(dSq);\n\tfloat din = max(-rMu - deltaSq, 0.0);\n\tif (din > 0.0 && din < d)\n\t{\n\t\tcamera += din * viewdir;\n\t\trMu += din;\n\t\tmu = rMu / RtResized;\n\t\tr = RtResized;\n\t\td -= din;\n\t}\n\n\tif (r <= RtResized && dSq >= 0.0) \n\t{ \n\t\tfloat nu = dot(viewdir, sunDir);\n\t\tfloat muS = dot(camera, sunDir) / r;\n\t\tfloat4 inScatter;\n\t\tif (r < Rg + 1600.0) {\n\t\t\t// avoids imprecision problems in aerial perspective near ground\n\t\t\tfloat f = (Rg + 1600.0) / r;\n\t\t\tr = r * f;\n\t\t\trMu = rMu * f;\n\t\t\t_point = _point * f;\n\t\t}\n\t\tfloat r1 = length(_point);\n\t\tfloat rMu1 = dot(_point, viewdir);\n\t\tfloat mu1 = rMu1 / r1;\n\t\tfloat muS1 = dot(_point, sunDir) / r1;\n\n\t\t//        #if defined (useAnalyticTransmittance)\n\t\textinction = min(AnalyticTransmittance(r, mu, d), 1.0);\n\t\t//#else\n\t\t//                            if (mu > 0.0)\n\t\t//                            {\n\t\t//                                    extinction = min(Transmittance(r, mu, Rt) / Transmittance(r1, mu1, Rt), 1.0);\n\t\t//                            }\n\t\t//                                else\n\t\t//                            {\n\t\t//                                    extinction = min(Transmittance(r1, -mu1, Rt) / Transmittance(r, -mu, Rt), 1.0);\n\t\t//                            }\n\n//\t\t        #endif\n//\t\t#ifdef useHorizonHack\n\t\t//reduces it but doesn't fix it, have to try to get the other one\n\t\t        //const float EPS = 0.004;\n\t\t\tconst float EPS = 0.01;\n\t\t        float lim = -sqrt(1.0 - (Rg / r) * (Rg / r));\n\t\t        if (abs(mu - lim) < EPS)\n\t\t\t{\n\t\t\t\t//float a = ((mu - lim) + EPS) / (2.0 * EPS);\n\t\t\t\tfloat a = saturate(2.0 * ((mu - lim) + EPS) / (2.0 * EPS));\n\n\t\t\t\t//these make inScatterA black, let's try without and increase EPS to 0.01\n\t\t\t\t//almost does it, still a faint outline of it visible, maybe debug if sqrt doesn't need to be 0 below?\n\t\t\t        //trying 0.04, nope, still a faint outline visible\n\t\t\t\t//back to 0.01 with sqrt fix, doesn't work either, weird, maybe extinction is too strong?\n\n//\t\t\t\tmu = lim - EPS;\n//\t\t\t\tr1 = r * r + d * d + 2.0 * r * d * mu;\n//\t\t\t\tr1 = r1 > 0.0 ? sqrt(r1) : 1e30;\n//\t\t\t\tmu1 = (r * mu + d) / r1;\n\n\t\t\t\tfloat4 inScatter0 = Texture4D(_Inscatter, r, mu, muS, nu, RtResized);\n\t\t\t\tfloat4 inScatter1 = Texture4D(_Inscatter, r1, mu1, muS1, nu, RtResized);\n\t\t\t\tfloat4 inScatterA = max(inScatter0 - inScatter1 * extinction.rgbr, 0.0);\n\n\t\t\t\tmu = lim + EPS;\n\t\t\t\tr1 = sqrt(r * r + d * d + 2.0 * r * d * mu);\n\t\t\t\tmu1 = (r * mu + d) / r1;\n\n\t\t\t\tinScatter0 = Texture4D(_Inscatter, r, mu, muS, nu, RtResized);\n\t\t\t\tinScatter1 = Texture4D(_Inscatter, r1, mu1, muS1, nu, RtResized);\n\t\t\t\tfloat4 inScatterB = max(inScatter0 - inScatter1 * extinction.rgbr, 0.0);\n\n\t\t\t\tinScatter = lerp(inScatterA, inScatterB, a);\n\t\t        }\n\t\t        else\n//\t\t#endif\n\t\t\t{\n\t\t\t\tfloat4 inScatter0 = Texture4D(_Inscatter, r, mu, muS, nu,RtResized);\n\t\t\t\tfloat4 inScatter1 = Texture4D(_Inscatter, r1, mu1, muS1, nu,RtResized);\n\t\t\t\tinScatter = max(inScatter0 - inScatter1 * extinction.rgbr, 0.0);\n\t\t\t}\n\n\t\t\n\t\t// avoids imprecision problems in Mie scattering when sun is below horizon\n\t\tinScatter.w *= smoothstep(0.00, 0.02, muS);\n\t\tfloat3 inScatterM = GetMie(inScatter);\n\t\tfloat phase = PhaseFunctionR(nu);\n\t\tfloat phaseM = PhaseFunctionM(nu);\n\t\tresult = inScatter.rgb * phase + inScatterM * phaseM;\n\t}\n\telse\n\t{\t//if out of atmosphere\n\t\tresult = float3(0,0,0);\n\t\t//        extinction = float3(1,1,1);\n\t}\n\n\treturn result * _sunColor * _Sun_Intensity;\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/CommonAtmosphere.cginc.meta",
    "content": "fileFormatVersion: 2\nguid: ac742e1acf5f82f45b9d8ec53fe15b21\nShaderImporter:\n  defaultTextures: []\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/DecodeEncode/DecodedToFloat.shader",
    "content": "Shader \"EncodeFloat/DecodeToFloat\" \n{\n\tSubShader \n\t{\n\t\tPass \n\t\t{\n\t\t\tZTest Always Cull Off ZWrite Off\n\t\t\tFog { Mode off }\n\n\t\t\tCGPROGRAM\n\t\t\t#include \"UnityCG.cginc\"\n\t\t\t#pragma target 3.0\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\n\t\t\tuniform sampler2D _TexR, _TexG, _TexB, _TexA;\n\t\t\tuniform float _Max, _Min;\n\n\t\t\tstruct v2f \n\t\t\t{\n\t\t\t\tfloat4  pos : SV_POSITION;\n\t\t\t\tfloat2  uv : TEXCOORD0;\n\t\t\t};\n\n\t\t\tv2f vert(appdata_base v)\n\t\t\t{\n\t\t\t\tv2f OUT;\n\t\t\t\tOUT.pos = UnityObjectToClipPos(v.vertex);\n\t\t\t\tOUT.uv = v.texcoord.xy;\n\t\t\t\treturn OUT;\n\t\t\t}\n\n\t\t\t//This is a built in function but I like to see the code\n\t\t\tfloat decodeFloatRGBA( float4 rgba ) \n\t\t\t{\n\t\t\t\treturn dot( rgba, float4(1.0, 1/255.0, 1/65025.0, 1/160581375.0) );\n\t\t\t}\n\n\t\t\tfloat4 frag(v2f IN) : COLOR\n\t\t\t{\n\n\t\t\t\tfloat R = decodeFloatRGBA(tex2D(_TexR, IN.uv.xy));\n\t\t\t\tfloat G = decodeFloatRGBA(tex2D(_TexG, IN.uv.xy));\n\t\t\t\tfloat B = decodeFloatRGBA(tex2D(_TexB, IN.uv.xy));\n\t\t\t\tfloat A = decodeFloatRGBA(tex2D(_TexA, IN.uv.xy));\n\n\t\t\t\treturn (float4(R,G,B,A) * _Max) - _Min;\n\n\t\t\t}\n\n\t\t\tENDCG\n\n\t\t}\n\t}\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/DecodeEncode/DecodedToFloat.shader.meta",
    "content": "fileFormatVersion: 2\nguid: 6aeb6a309c9b39647b273d5f92e593dd\ntimeCreated: 1459689856\nlicenseType: Free\nShaderImporter:\n  defaultTextures: []\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/DecodeEncode/WriteToFloat.shader",
    "content": "Shader \"EncodeFloat/WriteToFloat\" \n{\n\tSubShader \n\t{\n\t\tPass \n\t\t{\n\t\t\tZTest Always Cull Off ZWrite Off\n\t\t\tFog { Mode off }\n\n\t\t\tCGPROGRAM\n\t\t\t#include \"UnityCG.cginc\"\n\t\t\t#pragma target 3.0\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\n\t\t\tuniform sampler2D _TexR, _TexG, _TexB, _TexA;\n\t\t\tuniform float _Max, _Min;\n\n\t\t\tstruct v2f \n\t\t\t{\n\t\t\t\tfloat4  pos : SV_POSITION;\n\t\t\t\tfloat2  uv : TEXCOORD0;\n\t\t\t};\n\n\t\t\tv2f vert(appdata_base v)\n\t\t\t{\n\t\t\t\tv2f OUT;\n\t\t\t\tOUT.pos = UnityObjectToClipPos(v.vertex);\n\t\t\t\tOUT.uv = v.texcoord.xy;\n\t\t\t\treturn OUT;\n\t\t\t}\n\n\t\t\t//This is a built in function but I like to see the code\n\t\t\tfloat decodeFloatRGBA( float4 rgba ) \n\t\t\t{\n\t\t\t\treturn dot( rgba, float4(1.0, 1/255.0, 1/65025.0, 1/160581375.0) );\n\t\t\t}\n\n\t\t\tfloat4 frag(v2f IN) : COLOR\n\t\t\t{\n\n\t\t\t\tfloat R = decodeFloatRGBA(tex2D(_TexR, IN.uv.xy));\n\t\t\t\tfloat G = decodeFloatRGBA(tex2D(_TexG, IN.uv.xy));\n\t\t\t\tfloat B = decodeFloatRGBA(tex2D(_TexB, IN.uv.xy));\n\t\t\t\tfloat A = decodeFloatRGBA(tex2D(_TexA, IN.uv.xy));\n\n\t\t\t\treturn (float4(R,G,B,A) * _Max) - _Min;\n\n\t\t\t}\n\n\t\t\tENDCG\n\n\t\t}\n\t}\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/DecodeEncode/WriteToFloat.shader.meta",
    "content": "fileFormatVersion: 2\nguid: 2c80ef0306e06ac4d8a4b0fe7e4536ac\ntimeCreated: 1459689856\nlicenseType: Free\nShaderImporter:\n  defaultTextures: []\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/DecodeEncode.meta",
    "content": "fileFormatVersion: 2\nguid: 8e6115ff67c8ba44ba8780322ca78ef8\nfolderAsset: yes\ntimeCreated: 1541842845\nlicenseType: Free\nDefaultImporter:\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Depth/CopyCameraDepth.shader",
    "content": "﻿Shader \"Scatterer/CopyCameraDepth\"\n{\n\tSubShader\n\t{\n\t\tPass //pass 0, simple copy from camera's depth texture\n\t\t{\n\t\t\tZTest Always Cull Off\n\n\t\t\tCGPROGRAM\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\n\t\t\t#include \"UnityCG.cginc\"\n\n\t\t\tstruct v2f\n\t\t\t{\n\t\t\t\tfloat4 pos : SV_POSITION;\n\t\t\t\tfloat2 uv : TEXCOORD0;\n\t\t\t};\n\n\t\t\tsampler2D _CameraDepthTexture;\n\n\t\t\tv2f vert( appdata_img v )\n\t\t\t{\n\t\t\t\tv2f o = (v2f)0;\n\t\t\t\to.pos = UnityObjectToClipPos(v.vertex);\n\t\t\t\to.uv = v.texcoord;\n\n\t\t\t\treturn o;\n\t\t\t}\n\n\t\t\tfloat frag(v2f IN) : SV_Depth\n\t\t\t{\n\t\t\t\treturn float4(tex2Dlod(_CameraDepthTexture, float4(IN.uv,0.0,0.0)).rgb,1.0);\n\t\t\t}\n\t\t\tENDCG\n\t\t}\n\n\t\tPass //pass 1, same as 0 but with a small bias for depth pre-pass merging to screen\n\t\t{\n\t\t\tZTest Always Cull Off\n\n\t\t\tCGPROGRAM\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\n\t\t\t#include \"UnityCG.cginc\"\n\n\t\t\tstruct v2f\n\t\t\t{\n\t\t\t\tfloat4 pos : SV_POSITION;\n\t\t\t\tfloat2 uv : TEXCOORD0;\n\t\t\t};\n\n\t\t\tsampler2D _CameraDepthTexture;\n\n\t\t\tv2f vert( appdata_img v )\n\t\t\t{\n\t\t\t\tv2f o = (v2f)0;\n\t\t\t\to.pos = UnityObjectToClipPos(v.vertex);\n\t\t\t\to.uv = v.texcoord;\n\n\t\t\t\treturn o;\n\t\t\t}\n\n\t\t\tfloat frag(v2f IN) : SV_Depth\n\t\t\t{\n\t\t\t\treturn float4(tex2Dlod(_CameraDepthTexture, float4(IN.uv,0.0,0.0)).r * 0.9999, 0.0, 0.0, 1.0);\n\t\t\t}\n\t\t\tENDCG\n\t\t}\n\n\t\tPass //pass 2, same as 0 but from _MainTex\n\t\t{\n\t\t\tZTest Always Cull Off\n\n\t\t\tCGPROGRAM\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\n\t\t\t#include \"UnityCG.cginc\"\n\n\t\t\tstruct v2f\n\t\t\t{\n\t\t\t\tfloat4 pos : SV_POSITION;\n\t\t\t\tfloat2 uv : TEXCOORD0;\n\t\t\t};\n\n\t\t\tsampler2D _MainTex;\n\n\t\t\tv2f vert( appdata_img v )\n\t\t\t{\n\t\t\t\tv2f o = (v2f)0;\n\t\t\t\to.pos = UnityObjectToClipPos(v.vertex);\n\t\t\t\to.uv = v.texcoord;\n\n\t\t\t\treturn o;\n\t\t\t}\n\n\t\t\tfloat frag(v2f IN) : SV_Depth\n\t\t\t{\n\t\t\t\treturn float4(tex2Dlod(_MainTex, float4(IN.uv,0.0,0.0)).rgb,1.0);\n\t\t\t}\n\t\t\tENDCG\n\t\t} \n\t}\n\tFallback off\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Depth/CopyCameraDepth.shader.meta",
    "content": "fileFormatVersion: 2\nguid: 8db4dc37ed52fc24ba715aaa8e0fd20f\nShaderImporter:\n  externalObjects: {}\n  defaultTextures: []\n  nonModifiableTextures: []\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Depth/DepthToDistance.shader",
    "content": "﻿\nShader \"Scatterer/DepthToDistance\" {\n\tSubShader {\n\t\tTags {\"IgnoreProjector\" = \"True\" \"RenderType\" = \"Transparent\"}\n\n\t\tPass {\n\t\t\tCull Off\n\t\t\tZTest Off\n\t\t\tZWrite Off\n\n\t\t\tBlend SrcAlpha OneMinusSrcAlpha // Alpha blending\n\n\t\t\tCGPROGRAM\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\t\t\t#pragma target 3.0\n\t\t\t#include \"UnityCG.cginc\"\n\n\t\t\tuniform sampler2D _CameraDepthTexture;\n\n\t\t\tstruct v2f\n\t\t\t{\n\t\t\t\tfloat4 pos: SV_POSITION;\n\t\t\t\tfloat2 uv: TEXCOORD1;\n\t\t\t};\n\n\t\t\tv2f vert(appdata_base v)\n\t\t\t{\n\t\t\t\tv2f o;\n\n\t\t\t\to.pos = UnityObjectToClipPos(v.vertex);\n\t\t\t\to.uv  = ComputeNonStereoScreenPos(o.pos);\n\n\t\t\t\treturn o;\n\t\t\t}\n\n\t\t\thalf4 frag(v2f i) : SV_Target\n\t\t\t{\n\t\t\t\tfloat zdepth = tex2Dlod(_CameraDepthTexture, float4(i.uv,0,0));\n\n\t\t\t\t#ifdef SHADER_API_D3D11  //#if defined(UNITY_REVERSED_Z)\n\t\t\t\tzdepth = 1 - zdepth;\n\t\t\t\t#endif\n\n\t\t\t\tfloat4 clipPos = float4(i.uv, zdepth, 1.0);\n\t\t\t\tclipPos.xyz = 2.0f * clipPos.xyz - 1.0f;\n\t\t\t\tfloat4 camPos = mul(unity_CameraInvProjection, clipPos);\n\t\t\t\tcamPos.xyz /= camPos.w;\n\t\t\t\tcamPos.z *= -1;\n\n\t\t\t\tfloat fragDistance = length(camPos.xyz) / 750000.0;\n\n\t\t\t\treturn float4(fragDistance,fragDistance,fragDistance, (zdepth < 1.0) ? 1.0 : 0.0);  //discard if zdepth is 1.0, ie nothing written to depth texture\n\t\t\t}\n\n\t\t\tENDCG\n\t\t}\n\t}\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Depth/DepthToDistance.shader.meta",
    "content": "fileFormatVersion: 2\nguid: 34fc60e2fe0cbfa4a87375cdfff9dc86\ntimeCreated: 1550493086\nlicenseType: Free\nShaderImporter:\n  defaultTextures: []\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Depth/DownscaleDepth.shader",
    "content": "﻿Shader \"Scatterer/DownscaleDepth\"\n{\n\tSubShader\n\t{\n\t\tPass //Pass 0, downscale default buffer to 1/4\n\t\t{\n\t\t\tZTest Always Cull Off ZWrite Off\n\n\t\t\tCGPROGRAM\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\n\t\t\t#include \"UnityCG.cginc\"\n\n\t\t\tstruct v2f\n\t\t\t{\n\t\t\t\tfloat4 pos : SV_POSITION;\n\t\t\t\tfloat2 uv : TEXCOORD0;\n\t\t\t};\n\n\t\t\tsampler2D _CameraDepthTexture;\n\t\t\tfloat4 _CameraDepthTexture_TexelSize; // (1.0/width, 1.0/height, width, height)\n\n\t\t\tv2f vert( appdata_img v )\n\t\t\t{\n\t\t\t\tv2f o = (v2f)0;\n\t\t\t\to.pos = UnityObjectToClipPos(v.vertex);\n\t\t\t\to.uv = v.texcoord;\n\n\t\t\t\treturn o;\n\t\t\t}\n\n\t\t\tfloat4 frag(v2f input) : SV_Target\n\t\t\t{\n\t\t\t\tfloat2 texelSize = 0.5 * _CameraDepthTexture_TexelSize.xy;\n\t\t\t\tfloat2 taps[4] = {     float2(input.uv + float2(-1,-1)*texelSize),\n\t\t\t\t\tfloat2(input.uv + float2(-1,1)*texelSize),\n\t\t\t\t\tfloat2(input.uv + float2(1,-1)*texelSize),\n\t\t\t\t\tfloat2(input.uv + float2(1,1)*texelSize) };\n\n\t\t\t\tfloat depth1 = tex2D(_CameraDepthTexture, taps[0]).r;\n\t\t\t\tfloat depth2 = tex2D(_CameraDepthTexture, taps[1]).r;\n\t\t\t\tfloat depth3 = tex2D(_CameraDepthTexture, taps[2]).r;\n\t\t\t\tfloat depth4 = tex2D(_CameraDepthTexture, taps[3]).r;\n\n\t\t\t\t//float result = min(depth1, min(depth2, min(depth3, depth4))); //takes min depth, for reverse Z equivalent to taking farthest, may or may not be better for depth discontinuities, test both\n\t\t\t\t//good but should eliminate samples with depth 0.0\n\n//\t\t\t\t//Only return zero if all samples are zero, otherwise return the smallest which isn't zero\n\t\t\t\tfloat result = depth4;\n\t\t\t\tresult = (result == 0.0) || (depth3 == 0.0) ? max(result, depth3) : min (result,depth3);\n\t\t\t\tresult = (result == 0.0) || (depth2 == 0.0) ? max(result, depth2) : min (result,depth2);\n\t\t\t\tresult = (result == 0.0) || (depth1 == 0.0) ? max(result, depth1) : min (result,depth1);\n\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\tENDCG\n\t\t}\n\n\t\tPass //Pass 1, downscale other buffer to a further 1/4 (so 1/16 final)\n\t\t{\n\t\t\tZTest Always Cull Off ZWrite Off\n\n\t\t\tCGPROGRAM\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\n\t\t\t#include \"UnityCG.cginc\"\n\n\t\t\tstruct v2f\n\t\t\t{\n\t\t\t\tfloat4 pos : SV_POSITION;\n\t\t\t\tfloat2 uv : TEXCOORD0;\n\t\t\t};\n\n\t\t\tsampler2D ScattererDownscaledDepthIntermediate;\n\t\t\tfloat4 ScattererDownscaledDepthIntermediate_TexelSize; // (1.0/width, 1.0/height, width, height)\n\n\t\t\tv2f vert( appdata_img v )\n\t\t\t{\n\t\t\t\tv2f o = (v2f)0;\n\t\t\t\to.pos = UnityObjectToClipPos(v.vertex);\n\t\t\t\to.uv = v.texcoord;\n\n\t\t\t\treturn o;\n\t\t\t}\n\n\t\t\tfloat4 frag(v2f input) : SV_Target\n\t\t\t{\n\t\t\t\tfloat2 texelSize = 0.5 * ScattererDownscaledDepthIntermediate_TexelSize.xy;\n\t\t\t\tfloat2 taps[4] = {     float2(input.uv + float2(-1,-1)*texelSize),\n\t\t\t\t\tfloat2(input.uv + float2(-1,1)*texelSize),\n\t\t\t\t\tfloat2(input.uv + float2(1,-1)*texelSize),\n\t\t\t\t\tfloat2(input.uv + float2(1,1)*texelSize) };\n\n\t\t\t\tfloat depth1 = tex2D(ScattererDownscaledDepthIntermediate, taps[0]).r;\n\t\t\t\tfloat depth2 = tex2D(ScattererDownscaledDepthIntermediate, taps[1]).r;\n\t\t\t\tfloat depth3 = tex2D(ScattererDownscaledDepthIntermediate, taps[2]).r;\n\t\t\t\tfloat depth4 = tex2D(ScattererDownscaledDepthIntermediate, taps[3]).r;\n\n\t\t\t\t//Only return zero if all samples are zero, otherwise return the smalles which isn't zero\n\t\t\t\tfloat result = depth4;\n\t\t\t\tresult = (result == 0.0) || (depth3 == 0.0) ? max(result, depth3) : min (result,depth3);\n\t\t\t\tresult = (result == 0.0) || (depth2 == 0.0) ? max(result, depth2) : min (result,depth2);\n\t\t\t\tresult = (result == 0.0) || (depth1 == 0.0) ? max(result, depth1) : min (result,depth1);\n\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\tENDCG\n\t\t}\n\n\t\tPass //Pass 2, perform bilateral blurring\n\t\t{\n\t\t\tZTest Always Cull Off ZWrite Off\n\n\t\t\tCGPROGRAM\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\n\t\t\t#include \"UnityCG.cginc\"\n\n\t\t\tstruct v2f\n\t\t\t{\n\t\t\t\tfloat4 pos : SV_POSITION;\n\t\t\t\tfloat2 uv : TEXCOORD0;\n\t\t\t};\n\n\t\t\tsampler2D ScattererDownscaledDepth;\n\t\t\tfloat4 ScattererDownscaledDepth_TexelSize; // (1.0/width, 1.0/height, width, height)\n\n\t\t\tfloat2 BlurDir;\n\n\t\t\tsampler2D TextureToBlur;\n\t\t\tfloat4 TextureToBlur_TexelSize;\n\n\t\t\tv2f vert( appdata_img v )\n\t\t\t{\n\t\t\t\tv2f o = (v2f)0;\n\t\t\t\to.pos = UnityObjectToClipPos(v.vertex);\n\t\t\t\to.uv = v.texcoord;\n\n\t\t\t\treturn o;\n\t\t\t}\n\n\t\t\tfloat4 frag(v2f input) : SV_Target\n\t\t\t{\n\t\t\t\tconst float offset[4] = { 0, 1, 2, 3 };\n\t\t\t\tconst float weight[4] = { 0.266, 0.213, 0.1, 0.036 };\n\n\t\t\t\t//linearise depth [0-1]\n\t\t\t\tfloat centralDepth = Linear01Depth(tex2D(ScattererDownscaledDepth, input.uv));\n\n\t\t\t\tfloat result = tex2D(TextureToBlur, input.uv).r * weight[0];\n\t\t\t\tfloat totalWeight = weight[0];\n\n\n\t\t\t\t//float BlurDepthFalloff = 0.01; //probably change this\n\t\t\t\t//float BlurDepthFalloff = 1.0; //guess this is too much, try 0.1\n\t\t\t\tfloat BlurDepthFalloff = 0.1; //seems ok but doesn't fix my issue though\n\n\t\t\t\t[unroll]\n\t\t\t\tfor (int i = 1; i < 4; i++)\n\t\t\t\t{\n\t\t\t\t\tfloat depth = Linear01Depth(tex2D(ScattererDownscaledDepth, (input.uv + BlurDir * offset[i] * ScattererDownscaledDepth_TexelSize.xy )));\n\n\t\t\t\t\tfloat w = abs(depth-centralDepth)* BlurDepthFalloff;\n\t\t\t\t\tw = exp(-w*w);\n\n\t\t\t\t\tresult += tex2D(TextureToBlur, ( input.uv + BlurDir * offset[i] * TextureToBlur_TexelSize.xy )).r * w * weight[i];\n\n\t\t\t\t\ttotalWeight += w * weight[i];\n\n\t\t\t\t\tdepth = Linear01Depth(tex2D(ScattererDownscaledDepth, (input.uv - BlurDir * offset[i] * ScattererDownscaledDepth_TexelSize.xy )));\n\n\t\t\t\t\tw = abs(depth-centralDepth)* BlurDepthFalloff;\n\t\t\t\t\tw = exp(-w*w);\n\n\t\t\t\t\tresult += tex2D(TextureToBlur, ( input.uv - BlurDir * offset[i] * TextureToBlur_TexelSize.xy )).r * w* weight[i];\n\n\t\t\t\t\ttotalWeight += w * weight[i];\n\t\t\t\t}\n\n\t\t\t\treturn float4(result,result,result,1.0);\n\t\t\t}\n\n\t\t\tENDCG\n\t\t}\n\n\t\tPass //Pass 3, downscale custom depth buffer to 1/4\n\t\t{\n\t\t\tZTest Always Cull Off ZWrite Off\n\n\t\t\tCGPROGRAM\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\n\t\t\t#include \"UnityCG.cginc\"\n\n\t\t\tstruct v2f\n\t\t\t{\n\t\t\t\tfloat4 pos : SV_POSITION;\n\t\t\t\tfloat2 uv : TEXCOORD0;\n\t\t\t};\n\n\t\t\tsampler2D ScattererDepthCopy;\n\t\t\tfloat4 ScattererDepthCopy_TexelSize; // (1.0/width, 1.0/height, width, height)\n\n\t\t\tv2f vert( appdata_img v )\n\t\t\t{\n\t\t\t\tv2f o = (v2f)0;\n\t\t\t\to.pos = UnityObjectToClipPos(v.vertex);\n\t\t\t\to.uv = v.texcoord;\n\n\t\t\t\treturn o;\n\t\t\t}\n\n\t\t\tfloat4 frag(v2f input) : SV_Target\n\t\t\t{\n\t\t\t\tfloat2 texelSize = 0.5 * ScattererDepthCopy_TexelSize.xy;\n\t\t\t\tfloat2 taps[4] = {     float2(input.uv + float2(-1,-1)*texelSize),\n\t\t\t\t\tfloat2(input.uv + float2(-1,1)*texelSize),\n\t\t\t\t\tfloat2(input.uv + float2(1,-1)*texelSize),\n\t\t\t\t\tfloat2(input.uv + float2(1,1)*texelSize) };\n\n\t\t\t\tfloat depth1 = tex2D(ScattererDepthCopy, taps[0]).r;\n\t\t\t\tfloat depth2 = tex2D(ScattererDepthCopy, taps[1]).r;\n\t\t\t\tfloat depth3 = tex2D(ScattererDepthCopy, taps[2]).r;\n\t\t\t\tfloat depth4 = tex2D(ScattererDepthCopy, taps[3]).r;\n\n\t\t\t\t//Only return zero if all samples are zero, otherwise return the smallest which isn't zero\n\t\t\t\tfloat result = depth4;\n\t\t\t\tresult = (result == 0.0) || (depth3 == 0.0) ? max(result, depth3) : min (result,depth3);\n\t\t\t\tresult = (result == 0.0) || (depth2 == 0.0) ? max(result, depth2) : min (result,depth2);\n\t\t\t\tresult = (result == 0.0) || (depth1 == 0.0) ? max(result, depth1) : min (result,depth1);\n\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\tENDCG\n\t\t}\n\t}\n\tFallback off\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Depth/DownscaleDepth.shader.meta",
    "content": "fileFormatVersion: 2\nguid: 2cb24b5a5793c654e899a06bf08ec3ae\nShaderImporter:\n  externalObjects: {}\n  defaultTextures: []\n  nonModifiableTextures: []\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Depth.meta",
    "content": "fileFormatVersion: 2\nguid: 230f3ac09b9ef234cba81ade9bd0e32a\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/DepthCommon.cginc",
    "content": "﻿#include \"UnityCG.cginc\"\n\nuniform sampler2D _CameraDepthTexture;\nuniform sampler2D _customDepthTexture;\n\nfloat3 getViewSpacePosFromDepth(float2 uv)\n{\n\tuv.y = 1.0 - uv.y;\n\n\tfloat zdepth = tex2Dlod(_CameraDepthTexture, float4(uv,0,0));\n\n\t#ifdef SHADER_API_D3D11  //#if defined(UNITY_REVERSED_Z)\n\tzdepth = 1 - zdepth;\n\t#endif\n\n\tfloat4 clipPos = float4(uv, zdepth, 1.0);\n\tclipPos.xyz = 2.0f * clipPos.xyz - 1.0f;\n\tfloat4 camPos = mul(unity_CameraInvProjection, clipPos);\n\tcamPos.xyz /= camPos.w;\n\tcamPos.z *= -1;\n\treturn camPos.xyz;\n}\n\nfloat3 getPreciseViewSpacePosFromDepth(float2 uv)\n{\n\tuv.y = 1.0 - uv.y;\n\n\tfloat zdepth = tex2Dlod(_CameraDepthTexture, float4(uv,0,0));\n\tfloat depth = Linear01Depth(zdepth);\n\n\t#ifdef SHADER_API_D3D11  //#if defined(UNITY_REVERSED_Z)\n\tzdepth = 1 - zdepth;\n\t#endif\n\n\tfloat4 clipPos = float4(uv, zdepth, 1.0);\n\tclipPos.xyz = 2.0f * clipPos.xyz - 1.0f;\n\tfloat4 camPos = mul(unity_CameraInvProjection, clipPos);\n\tcamPos.xyz /= camPos.w;\n\tcamPos.z *= -1;\n\n\tfloat3 rayDirection = normalize(camPos.xyz);\n\n\tfloat3 cameraForwardDir = float3(0,0,1);\n\tfloat aa = dot(rayDirection, cameraForwardDir);\n\n\tfloat3 vposPersp = rayDirection * depth/aa * _ProjectionParams.z;\n\treturn vposPersp;\n}\n\nfloat getScattererFragDistance(float2 uv)\n{\n\t#if defined (SCATTERER_MERGED_DEPTH_ON)\n\treturn tex2Dlod(_customDepthTexture, float4(uv,0,0)).r* 750000;\n\t#else\n\treturn length(getPreciseViewSpacePosFromDepth(uv).xyz);\n\t#endif\n}\n\n//checks if we have anything in the depth buffer or is empty at coordinate\n//used by sunflare to check if we should block the sun\nfixed checkDepthBufferEmpty(float2 uv)\n{\n\t#if defined (SCATTERER_MERGED_DEPTH_ON)\n\tfloat depth =  tex2Dlod(_customDepthTexture,float4(uv,0.0,0.0));  //if there's something in the way don't render the flare\t\n\treturn (depth < 1.0) ? 0.0 : 1.0 ;\n\t#else\n\tfloat zdepth = tex2Dlod(_CameraDepthTexture, float4(uv,0,0));\n\n\t#ifdef SHADER_API_D3D11  //#if defined(UNITY_REVERSED_Z)\n\tzdepth = 1 - zdepth;\n\t#endif\n\n\treturn (zdepth < 1.0) ? 0.0 : 1.0 ;\n\t#endif\n}\n\n//get WorldPos from depth using inaccurate invprojection method\nfloat3 getWorldPosFromDepth(float2 uv, float zdepth, float4x4 CameraToWorld)\n{\n\t#ifdef SHADER_API_D3D11  //#if defined(UNITY_REVERSED_Z)\n\tzdepth = 1 - zdepth;\n\t#endif\n\n\tfloat4 clipPos = float4(uv, zdepth, 1.0);\n\tclipPos.xyz = 2.0f * clipPos.xyz - 1.0f;\n\n\tfloat4 camPos = mul(unity_CameraInvProjection, clipPos);\n\n\tfloat4 worldPos = mul(CameraToWorld,camPos);\n\treturn (worldPos.xyz/worldPos.w);\n}\n\n//hybrid method using the depth from the ray method and the direction from the invprojection method\n//seems to work pretty well\n//could be optimized further by moving the raydirection calculation to the vertex shader\nfloat3 getPreciseWorldPosFromDepth(float2 uv, float zdepth, float4x4 CameraToWorld)\n{\n\tfloat depth = Linear01Depth(zdepth);\n\n#if defined(UNITY_REVERSED_Z)\n\tzdepth = 1 - zdepth;\n#endif\n\n\tfloat4 clipPos = float4(uv, zdepth, 1.0);\n\tclipPos.xyz = 2.0f * clipPos.xyz - 1.0f;\n\tfloat4 camPos = mul(unity_CameraInvProjection, clipPos);\n\tcamPos.xyz /= camPos.w;\n\n\tfloat3 rayDirection = normalize(camPos.xyz);\n\n\tfloat3 cameraForwardDir = float3(0,0,-1);\n\tfloat aa = dot(rayDirection, cameraForwardDir);\n\n\tcamPos.xyz = rayDirection * depth/aa * _ProjectionParams.z;\n\n\tfloat4 worldPos = mul(CameraToWorld,float4(camPos.xyz,1.0));\n\treturn (worldPos.xyz/worldPos.w);\n}\n\n//Refines the inaccurate worldPos from invprojection with a search algorithm\n//While this gives good results, it is no longer needed, the hybrid ray/projmatrix method is faster and gives similar precision\nfloat getRefinedDistanceFromDepth(float unrefinedDistance, float zdepth, float3 worldViewDir)\n{\n\t//maybe scale these based on distance?\n\tconst int maxIterations = 10; //seems about perfect\n\tint iteration = 0;\n\n\t//This should considerably reduce the search space\n\tfloat maxSearchDistance = unrefinedDistance * 1.30;\n\tfloat minSearchDistance = unrefinedDistance * 0.70;\n\n\tfloat mid = 0;\n\tfloat3 worldPos0 = float3(0.0,0.0,0.0);\n\tfloat4 clipPos = float4(0.0,0.0,0.0,1.0);\n\tfloat depth = -10.0;\n\n\twhile ((iteration < maxIterations) && (depth != zdepth))\n\t{\n\t\tmid = 0.5 * (maxSearchDistance + minSearchDistance);\n\n\t\tworldPos0 = _WorldSpaceCameraPos + worldViewDir * mid;\n\n\t\tclipPos = mul(UNITY_MATRIX_VP, float4(worldPos0,1.0));\n\t\tdepth = clipPos.z/clipPos.w;\n\n\t\tmaxSearchDistance = (depth < zdepth) ? mid : maxSearchDistance;\n\t\tminSearchDistance = (depth > zdepth) ? mid : minSearchDistance;\n\n\t\titeration++;\n\t}\n\n\treturn mid;\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/DepthCommon.cginc.meta",
    "content": "fileFormatVersion: 2\nguid: 1b199a26663a15b4db765ffb1df401f2\nShaderImporter:\n  externalObjects: {}\n  defaultTextures: []\n  nonModifiableTextures: []\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/EVE/CloudVolumeParticle.shader",
    "content": "﻿\nShader \"Scatterer-EVE/CloudVolumeParticle\" {\n\tProperties {\n\t\t_Tex(\"Particle Texture\", 2D) = \"white\" {}\n\t\t_MainTex(\"Main (RGB)\", 2D) = \"white\" {}\n\t\t_PerlinTex(\"Perlin (RGB)\", 2D) = \"white\" {}\n\t\t_BumpMap(\"Normalmap\", 2D) = \"bump\" {}\n\t\t_DetailTex(\"Detail (RGB)\", 2D) = \"white\" {}\n\t\t_DetailScale(\"Detail Scale\", Range(0,1000)) = 100\n\t\t_DistFade(\"Distance Fade Near\", Float) = 1.0\n\t\t_DistFadeVert(\"Distance Fade Vertical\", Float) = 0.0004\n\t\t_MinScatter(\"Min Scatter\", Float) = 1.05\n\t\t_Opacity(\"Opacity\", Float) = 1.05\n\t\t_Color(\"Color Tint\", Color) = (1,1,1,1)\n\t\t_InvFade(\"Soft Particles Factor\", Range(0,1.0)) = .008\n\t\t_Rotation(\"Rotation\", Float) = 0\n\t\t_MaxScale(\"Max Scale\", Float) = 1\n\t\t_MaxTrans(\"Max Translation\", Vector) = (0,0,0)\n\t\t_NoiseScale(\"Noise Scale\", Vector) = (1,2,.0005,100)\n\t\t_SunPos(\"_SunPos\", Vector) = (0,0,0)\n\t\t_SunRadius(\"_SunRadius\", Float) = 1\n\t}\n\n\tCategory {\n\n\t\tTags { \"Queue\"=\"Transparent-1\" \"IgnoreProjector\"=\"True\" \"RenderType\"=\"Transparent\" \"DisableBatching\"=\"True\" }\n\t\tBlend SrcAlpha OneMinusSrcAlpha\n\t\tFog { Mode Global}\n\t\tAlphaTest Greater 0\n\t\tColorMask RGB\n\t\tCull Back Lighting On ZWrite Off\n\n\t\tSubShader {\n\t\t\tPass {\n\n\t\t\t\tLighting On\n\t\t\t\tTags { \"LightMode\"=\"ForwardBase\"}\n\n\t\t\t\tCGPROGRAM\n\t\t\t\t#include \"EVEUtils.cginc\"\n\t\t\t\t#pragma target 3.0\n\t\t\t\t#pragma glsl\n\t\t\t\t#pragma vertex vert\n\t\t\t\t#pragma fragment frag\n\t\t\t\t#define MAG_ONE 1.4142135623730950488016887242097\n\t\t\t\t#pragma fragmentoption ARB_precision_hint_fastest\n//\t\t\t\t#pragma multi_compile_fwdbase\n\t\t\t\t#pragma multi_compile SOFT_DEPTH_OFF SOFT_DEPTH_ON\n\t\t\t\t#pragma multi_compile MAP_TYPE_1 MAP_TYPE_CUBE_1 MAP_TYPE_CUBE2_1 MAP_TYPE_CUBE6_1\n\t\t\t#ifndef MAP_TYPE_CUBE2_1\n\t\t\t\t#pragma multi_compile ALPHAMAP_N_1 ALPHAMAP_1\n\t\t\t#endif\n\n\t\t\t\t#include \"noiseSimplex.cginc\"\n\t\t\t\t#include \"alphaMap.cginc\"\n\t\t\t\t#include \"cubeMap.cginc\"\n\n#pragma multi_compile SCATTERER_OFF SCATTERER_ON\n#pragma multi_compile SCATTERER_USE_ORIG_DIR_COLOR_OFF SCATTERER_USE_ORIG_DIR_COLOR_ON\n\n#ifdef SCATTERER_ON\n\t\t\t\t#include \"../CommonAtmosphere.cginc\"\n#endif\n\n\t\t\t\tCUBEMAP_DEF_1(_MainTex)\n\n\t\t\t\tsampler2D _Tex;\n\t\t\t\tsampler2D _DetailTex;\n\t\t\t\tsampler2D _BumpMap;\n\n\t\t\t\tfloat4x4 _PosRotation;\n\n\t\t\t\tfloat _DetailScale;\n\t\t\t\tfixed4 _Color;\n\t\t\t\tfloat _DistFade;\n\t\t\t\tfloat _DistFadeVert;\n\t\t\t\tfloat _MinScatter;\n\t\t\t\tfloat _Opacity;\n\t\t\t\tfloat _InvFade;\n\t\t\t\tfloat _Rotation;\n\t\t\t\tfloat _MaxScale;\n\t\t\t\tfloat4 _NoiseScale;\n\t\t\t\tfloat3 _MaxTrans;\n\n\t\t\t\tsampler2D _CameraDepthTexture;\n\n\t\t\t\t// float4x4 _CameraToWorld;\n\n\n\n#ifdef SCATTERER_ON\n\t\t\t\tuniform float cloudColorMultiplier;\n\t\t\t\tuniform float cloudScatteringMultiplier;\n\t\t\t\tuniform float cloudSkyIrradianceMultiplier;\n\t\t\t\tuniform float3 _Sun_WorldSunDir;\n\t\t\t\tuniform float3 _PlanetWorldPos;\n\t\t\t\tuniform float3 scattererOrigDirectionalColor;\n#endif\n\n\t\t\t\tstruct appdata_t {\n\t\t\t\t\tfloat4 vertex : POSITION;\n\t\t\t\t\tfixed4 color : COLOR;\n\t\t\t\t\tfloat3 normal : NORMAL;\n\t\t\t\t\tfloat4 tangent : TANGENT;\n\t\t\t\t\tfloat2 texcoord : TEXCOORD0;\n\t\t\t\t};\n\n\t\t\t\tstruct v2f {\n\t\t\t\t\tfloat4 pos : SV_POSITION;\n\t\t\t\t\tfixed4 color : COLOR;\n\t\t\t\t\thalf4 viewDir : TEXCOORD0;\n//\t\t\t\t\tfloat2 texcoordZY : TEXCOORD1;\n//\t\t\t\t\tfloat2 texcoordXZ : TEXCOORD2;\n//\t\t\t\t\tfloat2 texcoordXY : TEXCOORD3;\n//\t\t\t\t\tfloat2 uv : TEXCOORD4;\n//\t\t\t\t\tfloat4 projPos : TEXCOORD5;\n//\t\t\t\t\tfloat3 planetPos : TEXCOORD6;\n//\t\t\t\t\tfloat3 viewDirT : TEXCOORD7;\n//\t\t\t\t\tfloat3 lightDirT : TEXCOORD8;\n\n\t\t\t\t\t//store ZY+XZ and XY+uv together in two float4 to free up 2 interpolators\n\t\t\t\t\tfloat4 texcoordZYXZ : TEXCOORD1;\n\t\t\t\t\tfloat4 texcoordXYuv : TEXCOORD2;\n\t\t\t\t\tfloat4 projPos : TEXCOORD3;\n\t\t\t\t\tfloat3 planetPos : TEXCOORD4;\n\t\t\t\t\tfloat3 viewDirT : TEXCOORD5;\n\t\t\t\t\tfloat3 lightDirT : TEXCOORD6;\n//\t\t\t\t\tfloat3 inScattering : TEXCOORD7;\n//\t\t\t\t\tfloat3 relWorldPos : TEXCOORD8;\n//\t\t\t\t\tfloat3 sunExtinction : TEXCOORD8;\n\t\t\t\t};\n\n\t\t\t\tv2f vert (appdata_t v)\n\t\t\t\t{\n\t\t\t\t\tv2f o;\n\t\t\t\t\tUNITY_INITIALIZE_OUTPUT(v2f, o);\n\n\t\t\t\t\tfloat4 origin = mul(unity_ObjectToWorld, float4(0,0,0,1));\n\n\t\t\t\t\tfloat4 planet_pos = mul(_PosRotation, origin);\n\t\t\t\t\t\n\n\t\t\t\t\tfloat3 normalized = _NoiseScale.z*(planet_pos.xyz);\n\t\t\t\t\tfloat3 hashVect =  .5*(float3(snoise(normalized), snoise(_NoiseScale.x*normalized), snoise(_NoiseScale.y*normalized))+1);\n\n\t\t\t\t\tfloat4 localOrigin;\n\t\t\t\t\tlocalOrigin.xyz = (2*hashVect-1)*_MaxTrans;\n\t\t\t\t\tlocalOrigin.w = 1;\n\t\t\t\t\tfloat localScale = (hashVect.x*(_MaxScale - 1)) + 1;\n\n\t\t\t\t\torigin = mul(unity_ObjectToWorld, localOrigin);\n\n\t\t\t\t\tplanet_pos = mul(_MainRotation, origin);\n\t\t\t\t\tfloat3 detail_pos = mul(_DetailRotation, planet_pos).xyz;\n\t\t\t\t\to.planetPos = planet_pos.xyz;\n\t\t\t\t\to.color = VERT_GET_NO_LOD_CUBE_MAP_1(_MainTex, planet_pos.xyz);\n\n\t\t\t\t\to.color.rgba *= GetCubeDetailMapNoLOD(_DetailTex, detail_pos, _DetailScale);\n\n\t\t\t\t\to.viewDir.w = GetDistanceFade(distance(origin, _WorldSpaceCameraPos), _DistFade, _DistFadeVert);\n\t\t\t\t\to.color.a *= o.viewDir.w;\n\t\t\t\t\t\n\t\t\t\t\tfloat4x4 M = rand_rotation(\n\t\t\t\t\t(float3(frac(_Rotation),0,0))+hashVect,\n\t\t\t\t\tlocalScale,\n\t\t\t\t\tlocalOrigin.xyz);\n\t\t\t\t\tfloat4x4 mvMatrix = mul(mul(UNITY_MATRIX_V, unity_ObjectToWorld), M);\n\n\t\t\t\t\tfloat3 viewDir = normalize(mvMatrix[2].xyz);\n\t\t\t\t\to.viewDir.xyz = abs(viewDir).xyz;\n\n\t\t\t\t\tfloat4 mvCenter = mul(UNITY_MATRIX_MV, localOrigin);\n\n\t\t\t\t\to.pos = mul(UNITY_MATRIX_P,mvCenter+float4(v.vertex.xyz*localScale,v.vertex.w));\n\t\t\t\t\to.pos = o.color.a > (1.0/255.0) ? o.pos : float4(2.0, 2.0, 2.0, 1.0); //outside clip space => cull vertex\n\n\t\t\t\t\tfloat2 texcoodOffsetxy = ((2*v.texcoord)- 1);\n\t\t\t\t\tfloat4 texcoordOffset = float4(texcoodOffsetxy.x, texcoodOffsetxy.y, 0, v.vertex.w);\n\n\t\t\t\t\tfloat4 ZYv = texcoordOffset.zyxw;\n\t\t\t\t\tfloat4 XZv = texcoordOffset.xzyw;\n\t\t\t\t\tfloat4 XYv = texcoordOffset.xyzw;\n\n\t\t\t\t\tZYv.z*=sign(-viewDir.x);\n\t\t\t\t\tXZv.x*=sign(-viewDir.y);\n\t\t\t\t\tXYv.x*=sign(viewDir.z);\n\n\t\t\t\t\tZYv.x += sign(-viewDir.x)*sign(ZYv.z)*(viewDir.z);\n\t\t\t\t\tXZv.y += sign(-viewDir.y)*sign(XZv.x)*(viewDir.x);\n\t\t\t\t\tXYv.z += sign(-viewDir.z)*sign(XYv.x)*(viewDir.x);\n\n\t\t\t\t\tZYv.x += sign(-viewDir.x)*sign(ZYv.y)*(viewDir.y);\n\t\t\t\t\tXZv.y += sign(-viewDir.y)*sign(XZv.z)*(viewDir.z);\n\t\t\t\t\tXYv.z += sign(-viewDir.z)*sign(XYv.y)*(viewDir.y);\n\n\t\t\t\t\tfloat2 ZY = mul(mvMatrix, ZYv).xy - mvCenter.xy;\n\t\t\t\t\tfloat2 XZ = mul(mvMatrix, XZv).xy - mvCenter.xy;\n\t\t\t\t\tfloat2 XY = mul(mvMatrix, XYv).xy - mvCenter.xy;\n\n//\t\t\t\t\to.texcoordZY = half2(.5 ,.5) + .6*(ZY);\n//\t\t\t\t\to.texcoordXZ = half2(.5 ,.5) + .6*(XZ);\n//\t\t\t\t\to.texcoordXY = half2(.5 ,.5) + .6*(XY);\n\n\t\t\t\t\t//later store together in a float4 to free up 2 interpolators\n\t\t\t\t\tfloat2 texcoordZY = half2(.5 ,.5) + .6*(ZY);\n\t\t\t\t\tfloat2 texcoordXZ = half2(.5 ,.5) + .6*(XZ);\n\t\t\t\t\tfloat2 texcoordXY = half2(.5 ,.5) + .6*(XY);\n\n\n\t\t\t\t\tfloat3 worldNormal = normalize(mul( unity_ObjectToWorld, float4( v.normal, 0.0 ) ).xyz);\n\t\t\t\t\tviewDir = normalize(origin - _WorldSpaceCameraPos);\n\t\t\t\t\t//o.color.rgb *= MultiBodyShadow(origin, _SunRadius, _SunPos, _ShadowBodies);\n\t\t\t\t\t//o.color.rgb *= Terminator(_WorldSpaceLightPos0, worldNormal);\n\n\n#ifdef SCATTERER_ON\n\t\t\t\t\t//float3 worldPos = mul(unity_ObjectToWorld, localOrigin);\n\t\t\t\t\tfloat3 worldPos = origin;\n\n\t\t\t\t\tfloat3 extinction = float3(0, 0, 0);\n\n\t\t\t\t\tfloat3 WCP = _WorldSpaceCameraPos; //unity supplied, in local Space\n\n//\t\t\t\t\tfloat3 worigin = mul(unity_ObjectToWorld, float4(0,0,0,1)).xyz;\n\t\t\t\t\tfloat3 worigin = _PlanetWorldPos;\n                \t\n\t\t\t\t\tfloat3 relWorldPos=worldPos-worigin;\n\t\t\t\t\tfloat3 relCameraPos=WCP-worigin;\n\t\t\t\t\t//relWorldPos=lerp(Rg*normalize(relWorldPos),relWorldPos,cloudExtinctionHeightMultiplier);\t\t\t\t\t\n\n\t\t\t\t\t//extinction of light from sun to cloud\n\t\t\t\t\tfloat3 sunExtinction = getSkyExtinction(relWorldPos,_Sun_WorldSunDir);\n\n\t\t\t\t\t//extinction from cloud to observer\n\t\t\t\t\textinction = getExtinction(relCameraPos, relWorldPos, 1.0, 1.0, 1.0);\n\n\t\t\t\t\to.color.rgb *= cloudColorMultiplier * extinction * sunExtinction;\n\n//\t\t\t\t\t//skyLight\n//\t\t\t\t\tfloat3 skyE = SimpleSkyirradiance(relWorldPos, viewDir.xyz, _Sun_WorldSunDir);\n//\n//\t\t\t\t\to.color.rgb *= cloudColorMultiplier * extinction * sunExtinction + skyE*cloudSkyIrradianceMultiplier;\n\n//\t\t\t\t\to.relWorldPos = relWorldPos;\n//\t\t\t\t\t//inScattering from cloud to observer\n//\t\t\t\t\tfloat3 inscatter = InScattering2(relCameraPos, relWorldPos, extinction, _Sun_WorldSunDir, 1.0, 1.0, 1.0);\n//\t\t\t\t\to.inScattering = inscatter * cloudScatteringMultiplier;\n//\n//\t\t\t\t\t//extinction from cloud to observer\n//\t\t\t\t\textinction = getExtinction(relCameraPos, relWorldPos, 1.0, 1.0, 1.0);\n//\n//\t\t\t\t\to.color.rgb *= cloudColorMultiplier * extinction;\t\t\t\t\t \n#endif\t\n\t\t\t\t\n\n\n#ifdef SOFT_DEPTH_ON\n\t\t\t\t\to.projPos = ComputeScreenPos (o.pos);\n\t\t\t\t\tCOMPUTE_EYEDEPTH(o.projPos.z);\n#endif\n\t\t\t\t\t//WorldSpaceViewDir(origin).xyz\n\t\t\t\t\thalf3 normal = normalize(-viewDir);\n\t\t\t\t\tfloat3 tangent = UNITY_MATRIX_V[0].xyz;\n\t\t\t\t\tfloat3 binormal = -cross(normal, normalize(tangent));\n\t\t\t\t\tfloat3x3 rotation = float3x3(tangent.xyz, binormal, normal);\n\n\t\t\t\t\to.lightDirT = normalize(mul(rotation, _WorldSpaceLightPos0.xyz));\n\t\t\t\t\to.viewDirT = normalize(mul(rotation, viewDir));\n//\n//\t\t\t\t\to.uv = v.texcoord;\n\n\t\t\t\t\tfloat2 uv = v.texcoord;\n\n\t\t\t\t\t//store together in a float4 to free up 2 interpolators\n\t\t\t\t\to.texcoordZYXZ=float4(texcoordZY,texcoordXZ);\n\t\t\t\t\to.texcoordXYuv=float4(texcoordXY,uv);\n\n\t\t\t\t\treturn o;\n\t\t\t\t}\n\n\t\t\t\tfixed4 frag (v2f IN) : COLOR\n\t\t\t\t{\n\n\t\t\t\t\thalf4 tex;\n\n\t\t\t\t\t//extract from float4 interpolator\n\t\t\t\t\tfloat2 texcoordZY = IN.texcoordZYXZ.xy;\n\t\t\t\t\tfloat2 texcoordXZ = IN.texcoordZYXZ.zw;\n\t\t\t\t\tfloat2 texcoordXY = IN.texcoordXYuv.xy;\n\t\t\t\t\tfloat2 uv = IN.texcoordXYuv.zw;\n\n//\t\t\t\t\ttex.r = tex2D(_Tex, IN.texcoordZY).r;\n//\t\t\t\t\ttex.g = tex2D(_Tex, IN.texcoordXZ).g;\n//\t\t\t\t\ttex.b = tex2D(_Tex, IN.texcoordXY).b;\n\n\t\t\t\t\ttex.r = tex2D(_Tex, texcoordZY).r;\n\t\t\t\t\ttex.g = tex2D(_Tex, texcoordXZ).g;\n\t\t\t\t\ttex.b = tex2D(_Tex, texcoordXY).b;\n\n\t\t\t\t\ttex.a = 0;\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\ttex.rgb *= IN.viewDir.rgb;\n\t\t\t\t\thalf4 vect = half4( IN.viewDir.rgb, 0);\n\t\t\t\t\ttex /= vectorSum(vect);\n\n\t\t\t\t\ttex = half4(1, 1, 1, vectorSum(tex));\n\n\t\t\t\t\thalf4 color = FRAG_GET_NO_LOD_CUBE_MAP_1(_MainTex, IN.planetPos);\n\t\t\t\t\tcolor = ALPHA_COLOR_1(color);\n\n\t\t\t\t\tcolor *= _Color * IN.color;\n\n\t\t\t\t\t\n\t\t\t\t\t//half3 normT = UnpackNormal(tex2D(_BumpMap, IN.uv));\n\t\t\t\t\thalf3 normT;\n//\t\t\t\t\tnormT.xy = ((2*IN.uv)-1);\n\t\t\t\t\tnormT.xy = ((2*uv)-1);\n\t\t\t\t\tnormT.z = sqrt(1 - saturate(dot(normT.xy, normT.xy)));\n\t\t\t\t\t//normT.xy = 2 * INV_PI*asin((2 * IN.uv) - 1) ;\n\t\t\t\t\t//normT.xy = sin(PI*(IN.uv-.5));\n\t\t\t\t\t//normT.z = 1;\n\t\t\t\t\t//color.rg = IN.uv;\n\n\n\t\t\t\t\tcolor.a *= tex.a;\n\t\t\t\t\ttex.a = IN.viewDir.w*tex.a;\n\n#if (defined(SCATTERER_ON) && defined(SCATTERER_USE_ORIG_DIR_COLOR_ON))\n\t\t\t\t\t_LightColor0.rgb = scattererOrigDirectionalColor;\n#endif\n\n\t\t\t\t\tcolor.rgb *= ScatterColorLight(IN.lightDirT, IN.viewDirT, normT, tex, _MinScatter, _Opacity, 1).rgb;\n//#ifdef SCATTERER_ON\n//\n//\n//\t\t\t\t\t//extinction of light from sun to cloud\n//\t\t\t\t\tfloat3 sunExtinction = getSkyExtinction(IN.relWorldPos,_Sun_WorldSunDir);\n//\n//\t\t\t\t\t//skyLight\n//\t\t\t\t\tfloat3 skyE = SimpleSkyirradiance(IN.relWorldPos, IN.viewDir.xyz, _Sun_WorldSunDir);\n//\n//\t\t\t\t\tcolor.rgb = hdrNoExposure(sunExtinction*color.rgb+IN.inScattering+skyE*cloudSkyIrradianceMultiplier); //color.rgb already has extinction to viewer and colorMultiplier pre-applied\n//#endif\n\n\n#ifdef SOFT_DEPTH_ON\n\t\t\t\t\tfloat depth = UNITY_SAMPLE_DEPTH(tex2Dproj(_CameraDepthTexture, UNITY_PROJ_COORD(IN.projPos)));\n\t\t\t\t\tdepth = LinearEyeDepth (depth);\n\t\t\t\t\tfloat partZ = IN.projPos.z;\n\t\t\t\t\tfloat fade = saturate (_InvFade * (depth-partZ));\n\t\t\t\t\tcolor.a *= fade;\t\t\t\t\n#endif\n\n//\t\t\t\t\tcolor.rgb = color.rgb + IN.inScattering * (1-color.rgb); //soft additive blending //maybe do if no hdr?\n\n\t\t\t\t\treturn color;\n\t\t\t\t}\n\t\t\t\tENDCG\n\t\t\t}\n\n\t\t}\n\n\t}\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/EVE/CloudVolumeParticle.shader.meta",
    "content": "fileFormatVersion: 2\nguid: a331c23f613bfba4294059442ab01d4e\ntimeCreated: 1470912280\nlicenseType: Free\nShaderImporter:\n  defaultTextures: []\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/EVE/EVEUtils.cginc",
    "content": "#ifndef EVE_UTILS_CG_INCLUDED\n#define EVE_UTILS_CG_INCLUDED\n\n\t\n\t#include \"UnityCG.cginc\"\n\t#include \"AutoLight.cginc\"\n\t#include \"Lighting.cginc\"\n\t#define PI 3.1415926535897932384626\n\t#define INV_PI (1.0/PI)\n\t#define TWOPI (2.0*PI) \n\t#define INV_2PI (1.0/TWOPI)\n\t#define SQRT_2 (1.41421356237)\n\t#pragma fragmentoption ARB_precision_hint_fastest\n\n#ifdef DIRLIGHT_ONLY\n#define DIRECTIONAL 1\n#define SHADOWS_OFF 1\n#define LIGHTMAP_OFF 1\n#define DIRLIGHTMAP_OFF 1\n#endif\n\n#pragma skip_variants DIRLIGHTMAP_COMBINED DIRLIGHTMAP_SEPARATE DYNAMICLIGHTMAP_ON LIGHTMAP_ON VERTEXLIGHT_ON\n\n\n\tuniform float4x4 _MainRotation;\n\tuniform float4x4 _DetailRotation;\n\tuniform float4x4 _ShadowBodies = float4x4\n\t(\t0, 0, 0, 0,\n\t\t0, 0, 0, 0,\n\t\t0, 0, 0, 0,\n\t\t0, 0, 0, 0);\n\n\tfloat _SunRadius = 1;\n\tfloat3 _SunPos;\n\n\tfloat4 _UniversalTime;\n\n\t/*=========================================================================*\n\t* R A N D _ R O T A T I O N Author: Jim Arvo, 1991 *\n\t* *\n\t* This routine maps three values (x[0], x[1], x[2]) in the range [0,1] *\n\t* into a 3x3 rotation matrix, M. Uniformly distributed random variables *\n\t* x0, x1, and x2 create uniformly distributed random rotation matrices. *\n\t* To create small uniformly distributed \"perturbations\", supply *\n\t* samples in the following ranges *\n\t* *\n\t* x[0] in [ 0, d ] *\n\t* x[1] in [ 0, 1 ] *\n\t* x[2] in [ 0, d ] *\n\t* *\n\t* where 0 < d < 1 controls the size of the perturbation. Any of the *\n\t* random variables may be stratified (or \"jittered\") for a slightly more *\n\t* even distribution. *\n\t* *\n\t*=========================================================================*/\n\tfloat4x4 rand_rotation(float3 x, float scale, float3 trans)\n\t{\n\t\tfloat theta = x[0] * TWOPI; /* Rotation about the pole (Z). */\n\t\tfloat phi = x[1] * TWOPI; /* For direction of pole deflection. */\n\t\tfloat z = x[2] * 2.0; /* For magnitude of pole deflection. */\n\n\t\t\t\t\t\t\t  /* Compute a vector V used for distributing points over the sphere */\n\t\t\t\t\t\t\t  /* via the reflection I - V Transpose(V). This formulation of V */\n\t\t\t\t\t\t\t  /* will guarantee that if x[1] and x[2] are uniformly distributed, */\n\t\t\t\t\t\t\t  /* the reflected points will be uniform on the sphere. Note that V */\n\t\t\t\t\t\t\t  /* has length sqrt(2) to eliminate the 2 in the Householder matrix. */\n\n\t\tfloat r = sqrt(z);\n\t\tfloat Vx = sin(phi) * r;\n\t\tfloat Vy = cos(phi) * r;\n\t\tfloat Vz = sqrt(2.0 - z);\n\n\t\t/* Compute the row vector S = Transpose(V) * R, where R is a simple */\n\t\t/* rotation by theta about the z-axis. No need to compute Sz since */\n\t\t/* it's just Vz. */\n\n\t\tfloat st = sin(theta);\n\t\tfloat ct = cos(theta);\n\t\tfloat Sx = Vx * ct - Vy * st;\n\t\tfloat Sy = Vx * st + Vy * ct;\n\n\t\t/* Construct the rotation matrix ( V Transpose(V) - I ) R, which */\n\t\t/* is equivalent to V S - R. */\n\n\n\t\tfloat4x4 M = float4x4(\n\t\t\tscale*(Vx * Sx - ct), Vy * Sx + st, Vz * Sx, trans.x,\n\t\t\tVx * Sy - st, scale*(Vy * Sy - ct), Vz * Sy, trans.y,\n\t\t\tVx * Vz, Vy * Vz, scale*(1.0 - z), trans.z,\n\t\t\t0, 0, 0, 1);\n\n\t\treturn M;\n\t}\n\n\tinline float3 hash( float3 val )\n\t{\n\t\treturn frac(sin(val)*1232.53);\n\t}\n\n\tinline float GetDistanceFade( float dist, float fade, float fadeVert )\n\t{\n\t\tfloat fadeDist = fade*dist;\n\t\tfloat distVert = 1-(fadeVert*dist);\n\t\treturn saturate(fadeDist) * saturate(distVert);\n\t}\n\t\t\t\n\tinline half4 GetLighting(half3 worldNorm, half3 lightDir, fixed atten, fixed ambient)\n\t{\n\t\thalf3 ambientLighting = ambient * UNITY_LIGHTMODEL_AMBIENT;\n\t\thalf NdotL = dot (worldNorm, lightDir);\n\t\thalf lightIntensity = saturate(_LightColor0.a * NdotL * 2 * atten);\n\t\thalf4 light;\n\t\tlight.rgb = max(ambientLighting + (_LightColor0.rgb * lightIntensity), 0);\n\t\tlight.a = max(ambientLighting + lightIntensity, 0);\n\t\t\n\t\treturn light;\n\t}\n\t\n\t// Calculates Blinn-Phong (specular) lighting model\n\tinline half4 SpecularColorLight( half3 lightDir, half3 viewDir, half3 normal, half4 color, half4 specColor, float specK, half atten )\n\t{\n\t    \n\t    lightDir = normalize(lightDir);\n\t    viewDir = normalize(viewDir);\n\t    normal = normalize(normal);\n\t    half3 h = normalize( lightDir + viewDir );\n\t    \n\t    half diffuse = dot( normal, lightDir );\n\t    \n\t    float nh = saturate( dot( h, normal ) );\n\t    float spec = pow( nh, specK ) * specColor.a;\n\t    \n\t    half4 c;\n\t    c.rgb = _LightColor0.rgb*((color.rgb * diffuse )+ (specColor.rgb * spec)) * (atten * 2);\n\t    c.a = diffuse*(atten * 2);//_LightColor0.a * specColor.a * spec * atten; // specular passes by default put highlights to overbright\n\t    return c;\n\t}\n\n\tinline half4 ScatterColorLight(half3 lightDir, half3 viewDir, half3 normal, half4 color, float min, float opacity, half atten)\n\t{\n\n\t\tlightDir = normalize(lightDir);\n\t\tviewDir = normalize(viewDir);\n\t\tnormal = normalize(normal);\n\n\n\t\thalf diffuse = max( dot(normal, lightDir),0);\n\n\t\tfloat h = .5+(.5*dot(viewDir, lightDir));\n\t\tfloat scatter = (min-(opacity*color.a))*(1-(dot(normal,viewDir)))*h;\n\t\tscatter = saturate(scatter);\n\n\t\thalf4 c;\n\t\tc.rgb = _LightColor0*((color.rgb * diffuse) + scatter) * (atten * 2);\n\t\tc.a = diffuse*(atten * 2);//_LightColor0.a * specColor.a * spec * atten; // specular passes by default put highlights to overbright\n\t\treturn c;\n\t}\n\t\n\tinline half Terminator(half3 lightDir, half3 normal)\n\t{\n\t\thalf NdotL = dot( normal, lightDir );\n\t\thalf termlerp = saturate(10*-NdotL);\n\t\thalf terminator = lerp(1,saturate(floor(1.01+NdotL)), termlerp);\n\t\treturn terminator;\n\t}\n\n\tinline half BodyShadow(float3 v, float R, float r, float3 P, float3 p)\n\t{\n\t\t\n\t\tfloat3 D = P - v;\n\n\t\tfloat a = PI*(r*r);\n\t\tfloat3 d = p - v;\n\n\t\tfloat tc = dot(d, normalize(D));\n\t\tfloat tc2 = (tc*tc);\n\t\tfloat L = sqrt(dot(d, d) - tc2);\n\n\t\tfloat scale = tc / length(D); //Scaled Sun Area to match plane of intersecting body\n\t\tfloat Rs = R * scale;\n\t\tfloat A = PI*(Rs*Rs);\n\n\t\tfloat s = saturate((r + Rs - L) / (2 * min(r, Rs)));\n\t\ts = (INV_PI*asin((2 * s) - 1)) + .5;\n\t\treturn lerp(1, saturate((A - (s*a)) / A), step(r, tc)*saturate(a));\n\t}\n\n\tinline half MultiBodyShadow(float3 v, float R, float3 P, float4x4 m)\n\t{\n\t\thalf a = BodyShadow(v, R, m[0].w, P, m[0].xyz);\n\t\thalf b = BodyShadow(v, R, m[1].w, P, m[1].xyz);\n\t\thalf c = BodyShadow(v, R, m[2].w, P, m[2].xyz);\n\t\thalf d = BodyShadow(v, R, m[3].w, P, m[3].xyz);\n\t\treturn min(min(a, b), min(c, d));\n\t}\n#endif"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/EVE/EVEUtils.cginc.meta",
    "content": "fileFormatVersion: 2\nguid: e2392d942829c3b439a231d514e10321\ntimeCreated: 1470912310\nlicenseType: Free\nShaderImporter:\n  defaultTextures: []\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/EVE/GeometryCloudVolumeParticle.shader",
    "content": "﻿Shader \"Scatterer-EVE/GeometryCloudVolumeParticle\" {\n\tProperties {\n\t\t_Tex(\"Particle Texture\", 2D) = \"white\" {}\n\t\t_MainTex(\"Main (RGB)\", 2D) = \"white\" {}\n\t\t_PerlinTex(\"Perlin (RGB)\", 2D) = \"white\" {}\n\t\t_BumpMap(\"Normalmap\", 2D) = \"bump\" {}\n\t\t_DetailTex(\"Detail (RGB)\", 2D) = \"white\" {}\n\t\t_DetailScale(\"Detail Scale\", Range(0,1000)) = 100\n\t\t_DistFade(\"Distance Fade Near\", Float) = 1.0\n\t\t_DistFadeVert(\"Distance Fade Vertical\", Float) = 0.0004\n\t\t_MinScatter(\"Min Scatter\", Float) = 1.05\n\t\t_Opacity(\"Opacity\", Float) = 1.05\n\t\t_Color(\"Color Tint\", Color) = (1,1,1,1)\n\t\t_InvFade(\"Soft Particles Factor\", Range(0,1.0)) = .008\n\t\t_Rotation(\"Rotation\", Float) = 0\n\t\t_MaxScale(\"Max Scale\", Float) = 1\n\t\t_MaxTrans(\"Max Translation\", Vector) = (0,0,0)\n\t\t_NoiseScale(\"Noise Scale\", Vector) = (1,2,.0005,100)\n\t\t_SunPos(\"_SunPos\", Vector) = (0,0,0)\n\t\t_SunRadius(\"_SunRadius\", Float) = 1\n\t}\n\n\tCategory {\n\n\t\tTags { \"Queue\"=\"Transparent-1\" \"IgnoreProjector\"=\"True\" \"RenderType\"=\"Transparent\" \"DisableBatching\"=\"True\" }\n\t\tBlend SrcAlpha OneMinusSrcAlpha\n\t\tFog { Mode Global}\n\t\tAlphaTest Greater 0\n\t\tColorMask RGB\n\t\t//Cull Back\n\t\tCull Off\n\t\tLighting On\n\t\tZWrite Off\n\n\t\tSubShader {\n\t\t\tPass {\n\n\t\t\t\tLighting On\n\t\t\t\tTags { \"LightMode\"=\"ForwardBase\"}\n\n\t\t\t\tCGPROGRAM\n\t\t\t\t#include \"EVEUtils.cginc\"\n\t\t\t\t#pragma vertex vert\n\t\t\t\t#pragma fragment frag\n\t\t\t\t#pragma geometry geom\n\t\t\t\t#define MAG_ONE 1.4142135623730950488016887242097\n\t\t\t\t#pragma fragmentoption ARB_precision_hint_fastest\n\t\t\t\t//#pragma multi_compile_fwdbase\n\t\t\t\t#pragma multi_compile SOFT_DEPTH_OFF SOFT_DEPTH_ON\n#pragma multi_compile MAP_TYPE_1 MAP_TYPE_CUBE_1 MAP_TYPE_CUBE2_1 MAP_TYPE_CUBE6_1\n#ifndef MAP_TYPE_CUBE2_1\n#pragma multi_compile ALPHAMAP_N_1 ALPHAMAP_1\n#endif\n\n\t\t\t\t#include \"noiseSimplex.cginc\"\n\t\t\t\t#include \"alphaMap.cginc\"\n\t\t\t\t#include \"cubeMap.cginc\"\n\n#pragma multi_compile SCATTERER_OFF SCATTERER_ON\n#pragma multi_compile SCATTERER_USE_ORIG_DIR_COLOR_OFF SCATTERER_USE_ORIG_DIR_COLOR_ON\n\n#ifdef SCATTERER_ON\n\t\t\t\t#include \"../CommonAtmosphere.cginc\"\n#endif\n\n\t\t\t\tCUBEMAP_DEF_1(_MainTex)\n\n\t\t\t\tsampler2D _Tex;\n\t\t\t\tsampler2D _DetailTex;\n\t\t\t\tsampler2D _BumpMap;\n\n\t\t\t\tfloat4x4 _PosRotation;\n\n\t\t\t\tfloat _DetailScale;\n\t\t\t\tfixed4 _Color;\n\t\t\t\tfloat _DistFade;\n\t\t\t\tfloat _DistFadeVert;\n\t\t\t\tfloat _MinScatter;\n\t\t\t\tfloat _Opacity;\n\t\t\t\tfloat _InvFade;\n\t\t\t\tfloat _Rotation;\n\t\t\t\tfloat _QuadSize;\n\t\t\t\tfloat _MaxScale;\n\t\t\t\tfloat4 _NoiseScale;\n\t\t\t\tfloat3 _MaxTrans;\n\n\t\t\t\tsampler2D _CameraDepthTexture;\n\n#ifdef SCATTERER_ON\n\t\t\t\tuniform float cloudColorMultiplier;\n\t\t\t\tuniform float cloudScatteringMultiplier;\n\t\t\t\tuniform float cloudSkyIrradianceMultiplier;\n\t\t\t\tuniform float3 _Sun_WorldSunDir;\n\t\t\t\tuniform float3 _PlanetWorldPos;\n\t\t\t\tuniform float3 scattererOrigDirectionalColor;\n#endif\n\n\t\t\t\tstruct appdata_t {\n\t\t\t\t\tfloat4 vertex : POSITION;\n\t\t\t\t\tfixed4 color : COLOR;\n\t\t\t\t\tfloat3 normal : NORMAL;\n\t\t\t\t\tfloat4 tangent : TANGENT;\n\t\t\t\t\tfloat2 texcoord : TEXCOORD0;\n\t\t\t\t};\n\n\t\t\t\tstruct v2g {\n\t\t\t\t\tfloat4 pos : SV_POSITION;\n\t\t\t\t\tfixed4 color : COLOR;\n\t\t\t\t\tfloat3 hashVect : TEXCOORD0;\n\t\t\t\t\tfloat4 localOrigin : TEXCOORD1;\n\t\t\t\t\tfloat4 origin : TEXCOORD2;\n\t\t\t\t\tfloat viewDirFade : TEXCOORD3;\n\t\t\t\t\tfloat3 planetPos : TEXCOORD4;\n\t\t\t\t\tfloat particleFade: TEXCOORD5;\n\t\t\t\t};\n\n\t\t\t\t//vertex function, called for every point on our hexSeg, each vertex corresponding to the origin of a particle/quad\n\t\t\t\tv2g vert (appdata_t v)\n\t\t\t\t{\n\t\t\t\t\tv2g o;\n\t\t\t\t\tUNITY_INITIALIZE_OUTPUT(v2g, o);\n\n\t\t\t\t\tv.vertex.xyz/=v.vertex.w;\n\t\t\t\t\tfloat4 origin = mul(unity_ObjectToWorld, v.vertex); //origin of the quad in worldSpace\n\n\t\t\t\t\tfloat4 planet_pos = mul(_PosRotation, origin);\n\n\t\t\t\t\tfloat3 normalized = _NoiseScale.z*(planet_pos.xyz);\n\t\t\t\t\tfloat3 hashVect =  .5*(float3(snoise(normalized), snoise(_NoiseScale.x*normalized), snoise(_NoiseScale.y*normalized))+1);  //unique hash of the particle based on planet pos\n\t\t\t\t\to.hashVect = hashVect;\n\n\t\t\t\t\tfloat4 localOrigin;\n\t\t\t\t\tlocalOrigin.xyz = (2*hashVect-1)*_MaxTrans;   \t\t//offset to localOrigin based on hash above\n\t\t\t\t\tlocalOrigin.w = 1;\n\n\t\t\t\t\t//localOrigin.xyz+=v.vertex.xyz;\t\t\t//here this is wrong, in the original shader, local origin is added to the quad in it's space and gets transformed with it'w own M matrix with no issues\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//here as we add this to the space of the hex, transforming later with M matrix can cause additional rotation, we can add this in worldSpace instead\n\n\t\t\t\t\torigin.xyz+=localOrigin;\t\t\t\t//the particle transforms are originally oriented same as in world space, therefore we can do this offset directly in worldSpace in our case\n\t\t\t\t\to.origin = origin;\n\n\t\t\t\t\tlocalOrigin = mul (unity_WorldToObject, origin);\t//transform back to find the new localOrigin\n\t\t\t\t\to.localOrigin = localOrigin;\n\n\t\t\t\t\tplanet_pos = mul(_MainRotation, origin);  \t\t//new planet pos based on offset origin\n\t\t\t\t\to.planetPos = planet_pos.xyz;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\tfloat3 detail_pos = mul(_DetailRotation, planet_pos).xyz;\n\t\t\t\t\to.color = VERT_GET_NO_LOD_CUBE_MAP_1(_MainTex, planet_pos.xyz);\n\t\t\t\t\to.color.rgba *= GetCubeDetailMapNoLOD(_DetailTex, detail_pos, _DetailScale);\n\n\t\t\t\t\to.viewDirFade = GetDistanceFade(distance(origin, _WorldSpaceCameraPos), _DistFade, _DistFadeVert);\n\t\t\t\t\to.color.a *= o.viewDirFade;\n\n\t\t\t\t\tfloat4 mvCenter = mul(UNITY_MATRIX_MV, float4(localOrigin.xyz,1.0));  //offset quad origin in viewspace\n\t\t\t\t\to.pos=mvCenter;\n\t\t\t\t\to.pos = o.color.a > (1.0/255.0) ? o.pos : float4(2.0, 2.0, 2.0, 1.0); //cull vertex if low alpha, pos outside clipspace\n\n\t\t\t\t\tfloat fadeOut = (-mvCenter.z/mvCenter.w) * 0.004;\n\t\t\t\t\to.particleFade = smoothstep(0.0,1.0,fadeOut);\n#ifdef SCATTERER_ON\n\n\t\t\t\t\tfloat3 worldPos = origin;\n\n\t\t\t\t\tfloat3 extinction = float3(0, 0, 0);\n\n\t\t\t\t\tfloat3 WCP = _WorldSpaceCameraPos; //unity supplied, in local Space\n\n//\t\t\t\t\tfloat3 worigin = mul(unity_ObjectToWorld, float4(0,0,0,1)).xyz;\n\t\t\t\t\tfloat3 worigin = _PlanetWorldPos;\n                \t\n\t\t\t\t\tfloat3 relWorldPos=worldPos-worigin;\n\t\t\t\t\tfloat3 relCameraPos=WCP-worigin;\n\t\t\t\t\t//relWorldPos=lerp(Rg*normalize(relWorldPos),relWorldPos,cloudExtinctionHeightMultiplier);\t\t\t\t\t\n\n\t\t\t\t\t//extinction of light from sun to cloud\n\t\t\t\t\tfloat3 sunExtinction = getSkyExtinction(relWorldPos,_Sun_WorldSunDir);\n\n\t\t\t\t\t//extinction from cloud to observer\n\t\t\t\t\textinction = getExtinction(relCameraPos, relWorldPos, 1.0, 1.0, 1.0);\n\n\t\t\t\t\to.color.rgb *= cloudColorMultiplier * extinction * sunExtinction;\n\n//\t\t\t\t\t//skyLight\n//\t\t\t\t\tfloat3 skyE = SimpleSkyirradiance(relWorldPos, viewDir.xyz, _Sun_WorldSunDir);\n//\n//\t\t\t\t\to.color.rgb *= cloudColorMultiplier * extinction * sunExtinction + skyE*cloudSkyIrradianceMultiplier;\n\n//\t\t\t\t\to.relWorldPos = relWorldPos;\n//\t\t\t\t\t//inScattering from cloud to observer\n//\t\t\t\t\tfloat3 inscatter = InScattering2(relCameraPos, relWorldPos, extinction, _Sun_WorldSunDir, 1.0, 1.0, 1.0);\n//\t\t\t\t\to.inScattering = inscatter * cloudScatteringMultiplier;\n//\n//\t\t\t\t\t//extinction from cloud to observer\n//\t\t\t\t\textinction = getExtinction(relCameraPos, relWorldPos, 1.0, 1.0, 1.0);\n//\n//\t\t\t\t\to.color.rgb *= cloudColorMultiplier * extinction;\t\t\t\t\t \n#endif\t\n\n\n\t\t\t\t\treturn o;\n\t\t\t\t}\n\n\n\t\t\t\tstruct g2f\n\t\t\t\t{\n\t\t\t\t\tfloat4 pos : SV_POSITION;\n\t\t\t\t\tfixed4 color : COLOR;\n\t\t\t\t\thalf4 viewDir : TEXCOORD0;\n\t\t\t\t\tfloat2 texcoordZY : TEXCOORD1;\n\t\t\t\t\tfloat2 texcoordXZ : TEXCOORD2;\n\t\t\t\t\tfloat2 texcoordXY : TEXCOORD3;\n\t\t\t\t\tfloat3 uv : TEXCOORD4;\t\t//x and y UVs, z is particleFade\n\t\t\t\t\tfloat4 projPos : TEXCOORD5;\n\t\t\t\t\tfloat3 planetPos : TEXCOORD6;\n\t\t\t\t\tfloat3 viewDirT : TEXCOORD7;\n\t\t\t\t\tfloat3 lightDirT : TEXCOORD8;\n\t\t\t\t\tfloat4 localOrigin : TEXCOORD9;\n\t\t\t\t};\n\n\t\t\t\t//this function builds a quad corner vertex from the data passed to it, it will be called by the geometry shader\n\t\t\t\tg2f buildQuadVertex(v2g originPoint, float3 vertexPosition, float2 vertexUV, float3 viewDir, float4x4 mvMatrix, float localScale)\n\t\t\t\t{\n\t\t\t\t\tg2f tri;\n\t\t\t\t\tUNITY_INITIALIZE_OUTPUT(g2f, tri);\n\n\t\t\t\t\tfloat3 mvCenter = originPoint.pos.xyz/originPoint.pos.w;\n\t\t\t\t\ttri.pos = float4(mvCenter + _QuadSize * localScale * vertexPosition,1.0);    //position in view space of quad corner\n\n#ifdef SOFT_DEPTH_ON\n\t\t\t\t\tfloat eyedepth = -tri.pos.z;\n#endif\n\n\t\t\t\t\ttri.pos = mul (UNITY_MATRIX_P, tri.pos);\n\n#ifdef SOFT_DEPTH_ON\n\t\t\t\t\ttri.projPos = ComputeScreenPos (tri.pos);\n\t\t\t\t\t//COMPUTE_EYEDEPTH(tri.projPos.z);\n\n\t\t\t\t\t//we replace COMPUTE_EYEDEPTH with it's definition as it's only designed for the vertex shader input\n\t\t\t\t\t//tri.projPos.z = -UnityObjectToViewPos( v.vertex ).z\n\t\t\t\t\ttri.projPos.z = eyedepth;\n#endif\n\n    \t\t\t\t\n\n\t\t\t\t\t//pass these values we need for the fragment shader\n\t\t\t\t\ttri.viewDir.xyz = abs(viewDir).xyz;\n\t\t\t\t\ttri.viewDir.w = originPoint.viewDirFade;\n\t\t\t\t\ttri.planetPos = originPoint.planetPos;\n\t\t\t\t\ttri.color = originPoint.color;\n\n\t\t\t\t\tfloat2 texcoodOffsetxy = ((2*vertexUV)- 1);\n\t\t\t\t\tfloat4 texcoordOffset = float4(texcoodOffsetxy.x, texcoodOffsetxy.y, 0, 1.0);   //would 1.0 work here???? let's find out\n\n\t\t\t\t\tfloat4 ZYv = texcoordOffset.zyxw;\n\t\t\t\t\tfloat4 XZv = texcoordOffset.xzyw;\n\t\t\t\t\tfloat4 XYv = texcoordOffset.xyzw;\n\n\t\t\t\t\tZYv.z*=sign(-viewDir.x);\n\t\t\t\t\tXZv.x*=sign(-viewDir.y);\n\t\t\t\t\tXYv.x*=sign(viewDir.z);\n\t\t\t\t\t\n\t\t\t\t\tZYv.x += sign(-viewDir.x)*sign(ZYv.z)*(viewDir.z);\n\t\t\t\t\tXZv.y += sign(-viewDir.y)*sign(XZv.x)*(viewDir.x);\n\t\t\t\t\tXYv.z += sign(-viewDir.z)*sign(XYv.x)*(viewDir.x);\n\n\t\t\t\t\tZYv.x += sign(-viewDir.x)*sign(ZYv.y)*(viewDir.y);\n\t\t\t\t\tXZv.y += sign(-viewDir.y)*sign(XZv.z)*(viewDir.z);\n\t\t\t\t\tXYv.z += sign(-viewDir.z)*sign(XYv.y)*(viewDir.y);\n\n\t\t\t\t\tfloat2 ZY = mul(mvMatrix, ZYv).xy - mvCenter.xy;\n\t\t\t\t\tfloat2 XZ = mul(mvMatrix, XZv).xy - mvCenter.xy;\n\t\t\t\t\tfloat2 XY = mul(mvMatrix, XYv).xy - mvCenter.xy;\n\n\t\t\t\t\ttri.texcoordZY = half2(.5 ,.5) + .6*(ZY);\n\t\t\t\t\ttri.texcoordXZ = half2(.5 ,.5) + .6*(XZ);\n\t\t\t\t\ttri.texcoordXY = half2(.5 ,.5) + .6*(XY);\n\n\t\t\t\t\tviewDir = normalize(originPoint.origin - _WorldSpaceCameraPos); \t//worldSpaceView dir to center of quad not to fragment, why? maybe to frag would be better?\n\n\t\t\t\t\thalf3 normal = normalize(-viewDir);\n\t\t\t\t\tfloat3 tangent = UNITY_MATRIX_V[0].xyz;\n\t\t\t\t\tfloat3 binormal = -cross(normal, normalize(tangent));\n\t\t\t\t\tfloat3x3 rotation = float3x3(tangent.xyz, binormal, normal);\n\n\t\t\t\t\ttri.lightDirT = normalize(mul(rotation, _WorldSpaceLightPos0.xyz));\n\t\t\t\t\ttri.viewDirT = normalize(mul(rotation, viewDir));\n\n\t\t\t\t\ttri.uv = float3(vertexUV, originPoint.particleFade);   \t\t\t//x and y quad UV, z particleFade\n\t\t\t\t\ttri.localOrigin = originPoint.localOrigin;\n\n    \t\t\t\treturn tri;\n\t\t\t\t}\n\n\t\t\t\t//geometry shader\n\t\t\t\t//for every vertex from the vertex shader it will create a particle quad of 4 vertexes and 2 triangles\n\t\t\t\t[maxvertexcount(4)]\n    \t\t\tvoid geom(point v2g input[1], inout TriangleStream<g2f> outStream)\n    \t\t\t{\n\t\t\t\t\tg2f tri;\n\n\t\t\t\t\t//common values for all the quad\n\t\t\t\t\tfloat localScale = (input[0].hashVect.x*(_MaxScale - 1)) + 1;\n\n\t\t\t\t\tfloat4x4 M = rand_rotation(\n\t\t\t\t\t\t(float3(frac(_Rotation),0,0))+input[0].hashVect,\n\t\t\t\t\t\tlocalScale,\n\t\t\t\t\t\tinput[0].localOrigin.xyz/input[0].localOrigin.w);\n\n\t\t\t\t\tfloat4x4 mvMatrix = mul(mul(UNITY_MATRIX_V, unity_ObjectToWorld), M);\n\t\t\t\t\tfloat3 viewDir = normalize(mvMatrix[2].xyz); //cameraSpace viewDir I think\n\n\t\t\t\t\t//build our quad\n\t\t\t\t\ttri = buildQuadVertex(input[0],float3(-0.5,-0.5,0.0),float2(0.0,0.0),viewDir,mvMatrix,localScale);\n\t\t\t\t\toutStream.Append(tri);\n\n\t\t\t\t\ttri = buildQuadVertex(input[0],float3(-0.5,0.5,0.0),float2(0.0,1.0),viewDir,mvMatrix,localScale);\n\t\t\t\t\toutStream.Append(tri);\n\n\t\t\t\t\ttri = buildQuadVertex(input[0],float3(0.5,-0.5,0.0),float2(1.0,0.0),viewDir,mvMatrix,localScale);\n\t\t\t\t\toutStream.Append(tri);\n\n\t\t\t\t\ttri = buildQuadVertex(input[0],float3(0.5,0.5,0.0),float2(1.0,1.0),viewDir,mvMatrix,localScale);\n\t\t\t\t\toutStream.Append(tri);\n\n\t\t\t\t\toutStream.RestartStrip();\n    \t\t\t}\n\n\t\t\t\tfloat4 frag (g2f IN) : COLOR\n\t\t\t\t{\n\n\t\t\t\t\thalf4 tex;\n\t\t\t\t\ttex.r = tex2D(_Tex, IN.texcoordZY).r;\n\t\t\t\t\ttex.g = tex2D(_Tex, IN.texcoordXZ).g;\n\t\t\t\t\ttex.b = tex2D(_Tex, IN.texcoordXY).b;\n\n\t\t\t\t\ttex.a = 0;\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\ttex.rgb *= IN.viewDir.rgb;\n\t\t\t\t\thalf4 vect = half4( IN.viewDir.rgb, 0);\n\t\t\t\t\ttex /= vectorSum(vect);\n\n\t\t\t\t\ttex = half4(1, 1, 1, vectorSum(tex));\n\n\t\t\t\t\thalf4 color = FRAG_GET_NO_LOD_CUBE_MAP_1(_MainTex, IN.planetPos);\n\t\t\t\t\tcolor = ALPHA_COLOR_1(color);\n\n\t\t\t\t\tcolor *= _Color * IN.color;\n\n\t\t\t\t\t\n\t\t\t\t\t//half3 normT = UnpackNormal(tex2D(_BumpMap, IN.uv));\n\t\t\t\t\thalf3 normT;\n\t\t\t\t\tnormT.xy = ((2*IN.uv.xy)-1);\n\t\t\t\t\tnormT.z = sqrt(1 - saturate(dot(normT.xy, normT.xy)));\n\t\t\t\t\t//normT.xy = 2 * INV_PI*asin((2 * IN.uv) - 1) ;\n\t\t\t\t\t//normT.xy = sin(PI*(IN.uv-.5));\n\t\t\t\t\t//normT.z = 1;\n\t\t\t\t\t//color.rg = IN.uv;\n\n\n\t\t\t\t\tcolor.a *= tex.a;\n\t\t\t\t\ttex.a = IN.viewDir.w*tex.a;\n\n#if (defined(SCATTERER_ON) && defined(SCATTERER_USE_ORIG_DIR_COLOR_ON))\n\t\t\t\t\t_LightColor0.rgb = scattererOrigDirectionalColor;\n#endif\n\n\t\t\t\t\tcolor.rgb *= ScatterColorLight(IN.lightDirT, IN.viewDirT, normT, tex, _MinScatter, _Opacity, 1).rgb;\n\n#ifdef SOFT_DEPTH_ON\n\t\t\t\t\tfloat depth = UNITY_SAMPLE_DEPTH(tex2Dproj(_CameraDepthTexture, UNITY_PROJ_COORD(IN.projPos)));\n\t\t\t\t\tdepth = LinearEyeDepth (depth);\n\t\t\t\t\tfloat partZ = IN.projPos.z;\n\t\t\t\t\tfloat fade = depth >= (0.99 * _ProjectionParams.z) ? 1.0 : saturate (_InvFade * (depth-partZ));\t//fade near objects but don't fade on far plane (max depth value)\n\t\t\t\t\tcolor.a *= fade;\n#endif\n\n\t\t\t\t\tcolor.a *= IN.uv.z;\t\t//particle fade as they approach camera\n\t\t\t\t\t\n\t\t\t\t\treturn color;\n\t\t\t\t}\n\t\t\t\tENDCG\n\t\t\t}\n\n\t\t}\n\n\t}\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/EVE/GeometryCloudVolumeParticle.shader.meta",
    "content": "fileFormatVersion: 2\nguid: 99744ed686e28004180091658ee4f5ae\nShaderImporter:\n  externalObjects: {}\n  defaultTextures: []\n  nonModifiableTextures: []\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/EVE/GeometryCloudVolumeParticleToTexture.shader",
    "content": "﻿Shader \"Scatterer-EVE/GeometryCloudVolumeParticleToTexture\" {\n\tProperties {\n\t\t_Tex(\"Particle Texture\", 2D) = \"white\" {}\n\t\t_MainTex(\"Main (RGB)\", 2D) = \"white\" {}\n\t\t_PerlinTex(\"Perlin (RGB)\", 2D) = \"white\" {}\n\t\t_BumpMap(\"Normalmap\", 2D) = \"bump\" {}\n\t\t_DetailTex(\"Detail (RGB)\", 2D) = \"white\" {}\n\t\t_DetailScale(\"Detail Scale\", Range(0,1000)) = 100\n\t\t_DistFade(\"Distance Fade Near\", Float) = 1.0\n\t\t_DistFadeVert(\"Distance Fade Vertical\", Float) = 0.0004\n\t\t_MinScatter(\"Min Scatter\", Float) = 1.05\n\t\t_Opacity(\"Opacity\", Float) = 1.05\n\t\t_Color(\"Color Tint\", Color) = (1,1,1,1)\n\t\t_InvFade(\"Soft Particles Factor\", Range(0,1.0)) = .008\n\t\t_Rotation(\"Rotation\", Float) = 0\n\t\t_MaxScale(\"Max Scale\", Float) = 1\n\t\t_MaxTrans(\"Max Translation\", Vector) = (0,0,0)\n\t\t_NoiseScale(\"Noise Scale\", Vector) = (1,2,.0005,100)\n\t\t_SunPos(\"_SunPos\", Vector) = (0,0,0)\n\t\t_SunRadius(\"_SunRadius\", Float) = 1\n\t}\n\n\tCategory {\n\n\t\tTags { \"Queue\"=\"Transparent-1\" \"IgnoreProjector\"=\"True\" \"RenderType\"=\"Transparent\" \"DisableBatching\"=\"True\" }\n\t\tBlend SrcAlpha OneMinusSrcAlpha, Zero OneMinusSrcAlpha   //traditional alpha blending for colors, multiply by (1-alpha) for alpha to store in texture\n\t\tFog { Mode Global}\n\t\tAlphaTest Greater 0\n\t\tColorMask RGBA\n\t\t//Cull Back\n\t\tCull Off\n\t\tLighting On\n\t\tZWrite Off\n\n\t\tSubShader {\n\t\t\tPass {\n\n\t\t\t\tLighting On\n\t\t\t\tTags { \"LightMode\"=\"ForwardBase\"}\n\n\t\t\t\tCGPROGRAM\n\t\t\t\t#include \"EVEUtils.cginc\"\n\t\t\t\t#pragma vertex vert\n\t\t\t\t#pragma fragment frag\n\t\t\t\t#pragma geometry geom\n\t\t\t\t#define MAG_ONE 1.4142135623730950488016887242097\n\t\t\t\t#pragma fragmentoption ARB_precision_hint_fastest\n\t\t\t\t//#pragma multi_compile_fwdbase\n\t\t\t\t#pragma multi_compile SOFT_DEPTH_OFF SOFT_DEPTH_ON\n#pragma multi_compile MAP_TYPE_1 MAP_TYPE_CUBE_1 MAP_TYPE_CUBE2_1 MAP_TYPE_CUBE6_1\n#ifndef MAP_TYPE_CUBE2_1\n#pragma multi_compile ALPHAMAP_N_1 ALPHAMAP_1\n#endif\n\n\t\t\t\t#include \"noiseSimplex.cginc\"\n\t\t\t\t#include \"alphaMap.cginc\"\n\t\t\t\t#include \"cubeMap.cginc\"\n\n#pragma multi_compile SCATTERER_OFF SCATTERER_ON\n#pragma multi_compile SCATTERER_USE_ORIG_DIR_COLOR_OFF SCATTERER_USE_ORIG_DIR_COLOR_ON\n\n#ifdef SCATTERER_ON\n\t\t\t\t#include \"../CommonAtmosphere.cginc\"\n#endif\n\n\t\t\t\tCUBEMAP_DEF_1(_MainTex)\n\n\t\t\t\tsampler2D _Tex;\n\t\t\t\tsampler2D _DetailTex;\n\t\t\t\tsampler2D _BumpMap;\n\n\t\t\t\tfloat4x4 _PosRotation;\n\n\t\t\t\tfloat _DetailScale;\n\t\t\t\tfixed4 _Color;\n\t\t\t\tfloat _DistFade;\n\t\t\t\tfloat _DistFadeVert;\n\t\t\t\tfloat _MinScatter;\n\t\t\t\tfloat _Opacity;\n\t\t\t\tfloat _InvFade;\n\t\t\t\tfloat _Rotation;\n\t\t\t\tfloat _QuadSize;\n\t\t\t\tfloat _MaxScale;\n\t\t\t\tfloat4 _NoiseScale;\n\t\t\t\tfloat3 _MaxTrans;\n\n\t\t\t\tsampler2D EVEDownscaledDepth;\n\n#ifdef SCATTERER_ON\n\t\t\t\tuniform float cloudColorMultiplier;\n\t\t\t\tuniform float cloudScatteringMultiplier;\n\t\t\t\tuniform float cloudSkyIrradianceMultiplier;\n\t\t\t\tuniform float3 _Sun_WorldSunDir;\n\t\t\t\tuniform float3 _PlanetWorldPos;\n\t\t\t\tuniform float3 scattererOrigDirectionalColor;\n#endif\n\n\t\t\t\tstruct appdata_t {\n\t\t\t\t\tfloat4 vertex : POSITION;\n\t\t\t\t\tfixed4 color : COLOR;\n\t\t\t\t\tfloat3 normal : NORMAL;\n\t\t\t\t\tfloat4 tangent : TANGENT;\n\t\t\t\t\tfloat2 texcoord : TEXCOORD0;\n\t\t\t\t};\n\n\t\t\t\tstruct v2g {\n\t\t\t\t\tfloat4 pos : SV_POSITION;\n\t\t\t\t\tfixed4 color : COLOR;\n\t\t\t\t\tfloat3 hashVect : TEXCOORD0;\n\t\t\t\t\tfloat4 localOrigin : TEXCOORD1;\n\t\t\t\t\tfloat4 origin : TEXCOORD2;\n\t\t\t\t\tfloat viewDirFade : TEXCOORD3;\n\t\t\t\t\tfloat3 planetPos : TEXCOORD4;\n\t\t\t\t\tfloat particleFade: TEXCOORD5;\n\t\t\t\t};\n\n\t\t\t\t//vertex function, called for every point on our hexSeg, each vertex corresponding to the origin of a particle/quad\n\t\t\t\tv2g vert (appdata_t v)\n\t\t\t\t{\n\t\t\t\t\tv2g o;\n\t\t\t\t\tUNITY_INITIALIZE_OUTPUT(v2g, o);\n\n\t\t\t\t\tv.vertex.xyz/=v.vertex.w;\n\t\t\t\t\tfloat4 origin = mul(unity_ObjectToWorld, v.vertex); //origin of the quad in worldSpace\n\n\t\t\t\t\tfloat4 planet_pos = mul(_PosRotation, origin);\n\n\t\t\t\t\tfloat3 normalized = _NoiseScale.z*(planet_pos.xyz);\n\t\t\t\t\tfloat3 hashVect =  .5*(float3(snoise(normalized), snoise(_NoiseScale.x*normalized), snoise(_NoiseScale.y*normalized))+1);  //unique hash of the particle based on planet pos\n\t\t\t\t\to.hashVect = hashVect;\n\n\t\t\t\t\tfloat4 localOrigin;\n\t\t\t\t\tlocalOrigin.xyz = (2*hashVect-1)*_MaxTrans;   \t\t//offset to localOrigin based on hash above\n\t\t\t\t\tlocalOrigin.w = 1;\n\n\t\t\t\t\t//localOrigin.xyz+=v.vertex.xyz;\t\t\t//here this is wrong, in the original shader, local origin is added to the quad in it's space and gets transformed with it'w own M matrix with no issues\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//here as we add this to the space of the hex, transforming later with M matrix can cause additional rotation, we can add this in worldSpace instead\n\n\t\t\t\t\torigin.xyz+=localOrigin;\t\t\t\t//the particle transforms are originally oriented same as in world space, therefore we can do this offset directly in worldSpace in our case\n\t\t\t\t\to.origin = origin;\n\n\t\t\t\t\tlocalOrigin = mul (unity_WorldToObject, origin);\t//transform back to find the new localOrigin\n\t\t\t\t\to.localOrigin = localOrigin;\n\n\t\t\t\t\tplanet_pos = mul(_MainRotation, origin);   \t\t//new planet pos based on offset origin\n\t\t\t\t\to.planetPos = planet_pos.xyz;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\tfloat3 detail_pos = mul(_DetailRotation, planet_pos).xyz;\n\t\t\t\t\to.color = VERT_GET_NO_LOD_CUBE_MAP_1(_MainTex, planet_pos.xyz);\n\t\t\t\t\to.color.rgba *= GetCubeDetailMapNoLOD(_DetailTex, detail_pos, _DetailScale);\n\n\t\t\t\t\to.viewDirFade = GetDistanceFade(distance(origin, _WorldSpaceCameraPos), _DistFade, _DistFadeVert);\n\t\t\t\t\to.color.a *= o.viewDirFade;\n\n\t\t\t\t\tfloat4 mvCenter = mul(UNITY_MATRIX_MV, float4(localOrigin.xyz,1.0));  //offset quad origin in viewspace\n\t\t\t\t\to.pos=mvCenter;\n\t\t\t\t\to.pos = o.color.a > (1.0/255.0) ? o.pos : float4(2.0, 2.0, 2.0, 1.0); //cull vertex if low alpha, pos outside clipspace\n\n\t\t\t\t\tfloat fadeOut = (-mvCenter.z/mvCenter.w) * 0.004;\n\t\t\t\t\to.particleFade = smoothstep(0.0,1.0,fadeOut);\n#ifdef SCATTERER_ON\n\n\t\t\t\t\tfloat3 worldPos = origin;\n\n\t\t\t\t\tfloat3 extinction = float3(0, 0, 0);\n\n\t\t\t\t\tfloat3 WCP = _WorldSpaceCameraPos; //unity supplied, in local Space\n\n//\t\t\t\t\tfloat3 worigin = mul(unity_ObjectToWorld, float4(0,0,0,1)).xyz;\n\t\t\t\t\tfloat3 worigin = _PlanetWorldPos;\n                \t\n\t\t\t\t\tfloat3 relWorldPos=worldPos-worigin;\n\t\t\t\t\tfloat3 relCameraPos=WCP-worigin;\n\t\t\t\t\t//relWorldPos=lerp(Rg*normalize(relWorldPos),relWorldPos,cloudExtinctionHeightMultiplier);\t\t\t\t\t\n\n\t\t\t\t\t//extinction of light from sun to cloud\n\t\t\t\t\tfloat3 sunExtinction = getSkyExtinction(relWorldPos,_Sun_WorldSunDir);\n\n\t\t\t\t\t//extinction from cloud to observer\n\t\t\t\t\textinction = getExtinction(relCameraPos, relWorldPos, 1.0, 1.0, 1.0);\n\n\t\t\t\t\to.color.rgb *= cloudColorMultiplier * extinction * sunExtinction;\n\n//\t\t\t\t\t//skyLight\n//\t\t\t\t\tfloat3 skyE = SimpleSkyirradiance(relWorldPos, viewDir.xyz, _Sun_WorldSunDir);\n//\n//\t\t\t\t\to.color.rgb *= cloudColorMultiplier * extinction * sunExtinction + skyE*cloudSkyIrradianceMultiplier;\n\n//\t\t\t\t\to.relWorldPos = relWorldPos;\n//\t\t\t\t\t//inScattering from cloud to observer\n//\t\t\t\t\tfloat3 inscatter = InScattering2(relCameraPos, relWorldPos, extinction, _Sun_WorldSunDir, 1.0, 1.0, 1.0);\n//\t\t\t\t\to.inScattering = inscatter * cloudScatteringMultiplier;\n//\n//\t\t\t\t\t//extinction from cloud to observer\n//\t\t\t\t\textinction = getExtinction(relCameraPos, relWorldPos, 1.0, 1.0, 1.0);\n//\n//\t\t\t\t\to.color.rgb *= cloudColorMultiplier * extinction;\t\t\t\t\t \n#endif\t\n\n\n\t\t\t\t\treturn o;\n\t\t\t\t}\n\n\n\t\t\t\tstruct g2f\n\t\t\t\t{\n\t\t\t\t\tfloat4 pos : SV_POSITION;\n\t\t\t\t\tfixed4 color : COLOR;\n\t\t\t\t\thalf4 viewDir : TEXCOORD0;\n\t\t\t\t\tfloat2 texcoordZY : TEXCOORD1;\n\t\t\t\t\tfloat2 texcoordXZ : TEXCOORD2;\n\t\t\t\t\tfloat2 texcoordXY : TEXCOORD3;\n\t\t\t\t\tfloat3 uv : TEXCOORD4;\t\t//x and y UVs, z is particleFade\n\t\t\t\t\tfloat4 projPos : TEXCOORD5;\n\t\t\t\t\tfloat3 planetPos : TEXCOORD6;\n\t\t\t\t\tfloat3 viewDirT : TEXCOORD7;\n\t\t\t\t\tfloat3 lightDirT : TEXCOORD8;\n\t\t\t\t\tfloat4 localOrigin : TEXCOORD9;\n\t\t\t\t};\n\n\t\t\t\t//this function builds a quad corner vertex from the data passed to it, it will be called by the geometry shader\n\t\t\t\tg2f buildQuadVertex(v2g originPoint, float3 vertexPosition, float2 vertexUV, float3 viewDir, float4x4 mvMatrix, float localScale)\n\t\t\t\t{\n\t\t\t\t\tg2f tri;\n\t\t\t\t\tUNITY_INITIALIZE_OUTPUT(g2f, tri);\n\n\t\t\t\t\tfloat3 mvCenter = originPoint.pos.xyz/originPoint.pos.w;\n\t\t\t\t\ttri.pos = float4(mvCenter + _QuadSize * localScale * vertexPosition,1.0);    //position in view space of quad corner\n\n#ifdef SOFT_DEPTH_ON\n\t\t\t\t\tfloat eyedepth = -tri.pos.z;\n#endif\n\n\t\t\t\t\ttri.pos = mul (UNITY_MATRIX_P, tri.pos);\n\n#ifdef SOFT_DEPTH_ON\n\t\t\t\t\ttri.projPos = ComputeScreenPos (tri.pos);\n\t\t\t\t\t//COMPUTE_EYEDEPTH(tri.projPos.z);\n\n\t\t\t\t\t//we replace COMPUTE_EYEDEPTH with it's definition as it's only designed for the vertex shader input\n\t\t\t\t\t//tri.projPos.z = -UnityObjectToViewPos( v.vertex ).z\n\t\t\t\t\ttri.projPos.z = eyedepth;\n#endif\n\n    \t\t\t\t\n\n\t\t\t\t\t//pass these values we need for the fragment shader\n\t\t\t\t\ttri.viewDir.xyz = abs(viewDir).xyz;\n\t\t\t\t\ttri.viewDir.w = originPoint.viewDirFade;\n\t\t\t\t\ttri.planetPos = originPoint.planetPos;\n\t\t\t\t\ttri.color = originPoint.color;\n\n\t\t\t\t\tfloat2 texcoodOffsetxy = ((2*vertexUV)- 1);\n\t\t\t\t\tfloat4 texcoordOffset = float4(texcoodOffsetxy.x, texcoodOffsetxy.y, 0, 1.0);   //would 1.0 work here???? let's find out\n\n\t\t\t\t\tfloat4 ZYv = texcoordOffset.zyxw;\n\t\t\t\t\tfloat4 XZv = texcoordOffset.xzyw;\n\t\t\t\t\tfloat4 XYv = texcoordOffset.xyzw;\n\n\t\t\t\t\tZYv.z*=sign(-viewDir.x);\n\t\t\t\t\tXZv.x*=sign(-viewDir.y);\n\t\t\t\t\tXYv.x*=sign(viewDir.z);\n\t\t\t\t\t\n\t\t\t\t\tZYv.x += sign(-viewDir.x)*sign(ZYv.z)*(viewDir.z);\n\t\t\t\t\tXZv.y += sign(-viewDir.y)*sign(XZv.x)*(viewDir.x);\n\t\t\t\t\tXYv.z += sign(-viewDir.z)*sign(XYv.x)*(viewDir.x);\n\n\t\t\t\t\tZYv.x += sign(-viewDir.x)*sign(ZYv.y)*(viewDir.y);\n\t\t\t\t\tXZv.y += sign(-viewDir.y)*sign(XZv.z)*(viewDir.z);\n\t\t\t\t\tXYv.z += sign(-viewDir.z)*sign(XYv.y)*(viewDir.y);\n\n\t\t\t\t\tfloat2 ZY = mul(mvMatrix, ZYv).xy - mvCenter.xy;\n\t\t\t\t\tfloat2 XZ = mul(mvMatrix, XZv).xy - mvCenter.xy;\n\t\t\t\t\tfloat2 XY = mul(mvMatrix, XYv).xy - mvCenter.xy;\n\n\t\t\t\t\ttri.texcoordZY = half2(.5 ,.5) + .6*(ZY);\n\t\t\t\t\ttri.texcoordXZ = half2(.5 ,.5) + .6*(XZ);\n\t\t\t\t\ttri.texcoordXY = half2(.5 ,.5) + .6*(XY);\n\n\t\t\t\t\tviewDir = normalize(originPoint.origin - _WorldSpaceCameraPos); \t//worldSpaceView dir to center of quad not to fragment, why? maybe to frag would be better?\n\n\t\t\t\t\thalf3 normal = normalize(-viewDir);\n\t\t\t\t\tfloat3 tangent = UNITY_MATRIX_V[0].xyz;\n\t\t\t\t\tfloat3 binormal = -cross(normal, normalize(tangent));\n\t\t\t\t\tfloat3x3 rotation = float3x3(tangent.xyz, binormal, normal);\n\n\t\t\t\t\ttri.lightDirT = normalize(mul(rotation, _WorldSpaceLightPos0.xyz));\n\t\t\t\t\ttri.viewDirT = normalize(mul(rotation, viewDir));\n\n\t\t\t\t\ttri.uv = float3(vertexUV, originPoint.particleFade);   \t\t\t//x and y quad UV, z particleFade\n\t\t\t\t\ttri.localOrigin = originPoint.localOrigin;\n\n    \t\t\t\treturn tri;\n\t\t\t\t}\n\n\t\t\t\t//geometry shader\n\t\t\t\t//for every vertex from the vertex shader it will create a particle quad of 4 vertexes and 2 triangles\n\t\t\t\t[maxvertexcount(4)]\n    \t\t\tvoid geom(point v2g input[1], inout TriangleStream<g2f> outStream)\n    \t\t\t{\n    \t\t\t\tg2f tri;\n\n\t\t\t\t\t//common values for all the quad\n\t\t\t\t\tfloat localScale = (input[0].hashVect.x*(_MaxScale - 1)) + 1;\n\n\t\t\t\t\tfloat4x4 M = rand_rotation(\n\t\t\t\t\t\t(float3(frac(_Rotation),0,0))+input[0].hashVect,\n\t\t\t\t\t\tlocalScale,\n\t\t\t\t\t\tinput[0].localOrigin.xyz/input[0].localOrigin.w);\n\n\t\t\t\t\tfloat4x4 mvMatrix = mul(mul(UNITY_MATRIX_V, unity_ObjectToWorld), M);\n\t\t\t\t\tfloat3 viewDir = normalize(mvMatrix[2].xyz); //cameraSpace viewDir I think\n\n\t\t\t\t\t//build our quad\n\t\t\t\t\ttri = buildQuadVertex(input[0],float3(-0.5,-0.5,0.0),float2(0.0,0.0),viewDir,mvMatrix,localScale);\n\t\t\t\t\toutStream.Append(tri);\n\n\t\t\t\t\ttri = buildQuadVertex(input[0],float3(-0.5,0.5,0.0),float2(0.0,1.0),viewDir,mvMatrix,localScale);\n\t\t\t\t\toutStream.Append(tri);\n\n\t\t\t\t\ttri = buildQuadVertex(input[0],float3(0.5,-0.5,0.0),float2(1.0,0.0),viewDir,mvMatrix,localScale);\n\t\t\t\t\toutStream.Append(tri);\n\n\t\t\t\t\ttri = buildQuadVertex(input[0],float3(0.5,0.5,0.0),float2(1.0,1.0),viewDir,mvMatrix,localScale);\n\t\t\t\t\toutStream.Append(tri);\n\n\t\t\t\t\toutStream.RestartStrip();\n    \t\t\t}\n\n\t\t\t\tfloat4 frag (g2f IN) : COLOR\n\t\t\t\t{\n\t\t\t\t\thalf4 tex;\n\t\t\t\t\ttex.r = tex2D(_Tex, IN.texcoordZY).r;\n\t\t\t\t\ttex.g = tex2D(_Tex, IN.texcoordXZ).g;\n\t\t\t\t\ttex.b = tex2D(_Tex, IN.texcoordXY).b;\n\n\t\t\t\t\ttex.a = 0;\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\ttex.rgb *= IN.viewDir.rgb;\n\t\t\t\t\thalf4 vect = half4( IN.viewDir.rgb, 0);\n\t\t\t\t\ttex /= vectorSum(vect);\n\n\t\t\t\t\ttex = half4(1, 1, 1, vectorSum(tex));\n\n\t\t\t\t\thalf4 color = FRAG_GET_NO_LOD_CUBE_MAP_1(_MainTex, IN.planetPos);\n\t\t\t\t\tcolor = ALPHA_COLOR_1(color);\n\n\t\t\t\t\tcolor *= _Color * IN.color;\n\n\t\t\t\t\tcolor.a *= tex.a;\n\t\t\t\t\ttex.a = IN.viewDir.w*tex.a;\n\n\t\t\t\t\t\n\t\t\t\t\t//half3 normT = UnpackNormal(tex2D(_BumpMap, IN.uv));\n\t\t\t\t\thalf3 normT;\n\t\t\t\t\tnormT.xy = ((2*IN.uv.xy)-1);\n\t\t\t\t\tnormT.z = sqrt(1 - saturate(dot(normT.xy, normT.xy)));\n\t\t\t\t\t//normT.xy = 2 * INV_PI*asin((2 * IN.uv) - 1) ;\n\t\t\t\t\t//normT.xy = sin(PI*(IN.uv-.5));\n\t\t\t\t\t//normT.z = 1;\n\t\t\t\t\t//color.rg = IN.uv;\n\n#if (defined(SCATTERER_ON) && defined(SCATTERER_USE_ORIG_DIR_COLOR_ON))\n\t\t\t\t\t_LightColor0.rgb = scattererOrigDirectionalColor;\n#endif\n\n\t\t\t\t\tcolor.rgb *= ScatterColorLight(IN.lightDirT, IN.viewDirT, normT, tex, _MinScatter, _Opacity, 1).rgb;\n\n#ifdef SOFT_DEPTH_ON\n\t\t\t\t\tfloat depth = UNITY_SAMPLE_DEPTH(tex2Dlod(EVEDownscaledDepth, float4(IN.projPos.xy/IN.projPos.w,0.0,0.0))); //to be sure we are reading a single point/using point filtering\n\t\t\t\t\tdepth = LinearEyeDepth (depth);\n\t\t\t\t\tfloat partZ = IN.projPos.z;\n\t\t\t\t\tfloat fade = depth >= (0.99 * _ProjectionParams.z) ? 1.0 : saturate (_InvFade * (depth-partZ));\t//fade near objects but don't fade on far plane (max depth value)\n\t\t\t\t\tcolor.a *= fade;\n#endif\n\n\t\t\t\t\tcolor.a *= IN.uv.z;\t\t//particle fade as they approach camera\n\t\t\t\t\treturn color;\n\t\t\t\t}\n\t\t\t\tENDCG\n\t\t\t}\n\n\t\t}\n\n\t}\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/EVE/GeometryCloudVolumeParticleToTexture.shader.meta",
    "content": "fileFormatVersion: 2\nguid: 1bbfba4363c8e1e4b8214b4004316ce5\nShaderImporter:\n  externalObjects: {}\n  defaultTextures: []\n  nonModifiableTextures: []\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/EVE/SphereCloud.shader",
    "content": "Shader \"Scatterer-EVE/Cloud\" {\n\tProperties{\n\t\t_Color(\"Color Tint\", Color) = (1,1,1,1)\n\t\t_MainTex(\"Main (RGB)\", 2D) = \"white\" {}\n\t\t_DetailTex(\"Detail (RGB)\", 2D) = \"white\" {}\n\t\t_UVNoiseTex(\"UV Noise (RG)\", 2D) = \"black\" {}\n\t\t_FalloffPow(\"Falloff Power\", Range(0,3)) = 2\n\t\t_FalloffScale(\"Falloff Scale\", Range(0,20)) = 3\n\t\t_DetailScale(\"Detail Scale\", Range(0,100)) = 100\n\t\t_DetailDist(\"Detail Distance\", Range(0,1)) = 0.00875\n\t\t_UVNoiseScale(\"UV Noise Scale\", Range(0,0.1)) = 0.01\n\t\t_UVNoiseStrength(\"UV Noise Strength\", Range(0,0.1)) = 0.002\n\t\t_UVNoiseAnimation(\"UV Noise Animation\", Vector) = (0.002,0.001,0)\n\t\t_UniversalTime(\"Universal Time\", Vector) = (0,0,0,0)\n\t\t_MinLight(\"Minimum Light\", Range(0,1)) = 0\n\t\t_DistFade(\"Fade Distance\", Range(0,100)) = 10\n\t\t_DistFadeVert(\"Fade Scale\", Range(0,1)) = .002\n\t\t_RimDist(\"Rim Distance\", Range(0,1)) = 1\n\t\t_RimDistSub(\"Rim Distance Sub\", Range(0,2)) = 1.01\n\t\t_InvFade(\"Soft Particles Factor\", Range(0.01,3.0)) = .01\n\t\t_OceanRadius(\"Ocean Radius\", Float) = 63000\n\t\t_PlanetOrigin(\"Sphere Center\", Vector) = (0,0,0,1)\n\t\t_DepthPull(\"Depth Augment\", Float) = .99\n\t\t_SunPos(\"_SunPos\", Vector) = (0,0,0)\n\t\t_SunRadius(\"_SunRadius\", Float) = 1\n\t}\n\n\tCategory{\n\n\t\tTags { \"Queue\" = \"Transparent-2\" \"IgnoreProjector\" = \"True\" \"RenderType\" = \"Transparent\" }\n\t\tBlend SrcAlpha OneMinusSrcAlpha\n\t\t//Fog { Mode Global}\n\t\t//AlphaTest Greater 0\n\t\t//ColorMask RGB\n\t\tCull Off\n\t\tZWrite Off\n\t\tLighting On\n\n\t\tSubShader {\n\t\t\tPass {\n\n\t\t\t\tLighting On\n\t\t\t\tTags { \"LightMode\" = \"ForwardBase\"}\n\n\t\t\t\tCGPROGRAM\n\n\n\t\t\t\t#include \"EVEUtils.cginc\"\n\t\t\t\t#pragma target 3.0\n\t\t\t\t#pragma glsl\n\t\t\t\t#pragma vertex vert\n\t\t\t\t#pragma fragment frag\n\t\t\t\t#define MAG_ONE 1.4142135623730950488016887242097\n\t\t\t\t#pragma multi_compile SOFT_DEPTH_OFF SOFT_DEPTH_ON\n\t\t\t\t#pragma multi_compile WORLD_SPACE_OFF WORLD_SPACE_ON\n\t\t\t\t#pragma multi_compile MAP_TYPE_1 MAP_TYPE_CUBE_1 MAP_TYPE_CUBE2_1 MAP_TYPE_CUBE6_1\n\n\t\t\t\t#pragma multi_compile SCATTERER_OFF SCATTERER_ON\n#ifdef SCATTERER_ON\n\t\t\t\t#pragma multi_compile ECLIPSES_OFF ECLIPSES_ON\n\t\t\t\t#pragma multi_compile RINGSHADOW_OFF RINGSHADOW_ON\n\t\t\t\t#pragma multi_compile PRESERVECLOUDCOLORS_OFF PRESERVECLOUDCOLORS_ON\n\t\t\t\t//#pragma multi_compile GODRAYS_OFF GODRAYS_ON\n\t\t\t\t#define GODRAYS_OFF\n#endif\n\t\t\t\t\n#ifndef MAP_TYPE_CUBE2_1\n\t\t\t\t#pragma multi_compile ALPHAMAP_N_1 ALPHAMAP_1\n#endif\n\t\t\t\t#include \"alphaMap.cginc\"\n\t\t\t\t#include \"cubeMap.cginc\"\n\t\t\t\t\n#ifdef SCATTERER_ON\n\t\t\t\t#include \"../CommonAtmosphere.cginc\"\n\t\t\t\t#include \"../EclipseCommon.cginc\"\n\t\t\t\t#include \"../Atmo/Godrays/GodraysCommon.cginc\"\n\t\t\t\t#include \"../RingCommon.cginc\"\t\n#endif\n\t\t\t\t\n\t\t\t\tCUBEMAP_DEF_1(_MainTex)\n\n\t\t\t\tsampler2D _DetailTex;\n\t\t\t\tsampler2D _UVNoiseTex;\n\t\t\t\tfixed4 _Color;\n\t\t\t\tfloat _FalloffPow;\n\t\t\t\tfloat _FalloffScale;\n\t\t\t\tfloat _DetailScale;\n\t\t\t\tfloat _DetailDist;\n\n\t\t\t\tfloat _UVNoiseScale;\n\t\t\t\tfloat _UVNoiseStrength;\n\t\t\t\tfloat2 _UVNoiseAnimation;\n\n\t\t\t\tfloat _MinLight;\n\t\t\t\tfloat _DistFade;\n\t\t\t\tfloat _DistFadeVert;\n\t\t\t\tfloat _RimDist;\n\t\t\t\tfloat _RimDistSub;\n\t\t\t\tfloat _OceanRadius;\n\t\t\t\tfloat _InvFade;\n\t\t\t\tfloat3 _PlanetOrigin;\n\t\t\t\tsampler2D _CameraDepthTexture;\n\t\t\t\tfloat _DepthPull;\n\n#if defined (SCATTERER_ON)\n\t\t\t\tuniform float cloudColorMultiplier;\n\t\t\t\tuniform float cloudScatteringMultiplier;\n\t\t\t\tuniform float cloudSkyIrradianceMultiplier;\n\t\t\t\tuniform float3 _Sun_WorldSunDir;\n\t\t\t\tuniform float extinctionThickness;\n\t\t\t\tfloat _Radius;\n\n\t#if defined (GODRAYS_ON)\n\t\t\t\tuniform sampler2D _godrayDepthTexture;\n\t\t\t\tuniform float _godrayStrength;\n\t#endif\n#endif\n\n\t\t\t\tstruct appdata_t {\n\t\t\t\t\tfloat4 vertex : POSITION;\n\t\t\t\t\tfixed4 color : COLOR;\n\t\t\t\t\tfloat3 normal : NORMAL;\n\t\t\t\t};\n\n\t\t\t\tstruct v2f {\n\t\t\t\t\tfloat4 pos : SV_POSITION;\n\t\t\t\t\tfloat3 worldVert : TEXCOORD0;\n\t\t\t\t\tfloat3 L : TEXCOORD1;\n\t\t\t\t\tfloat4 objDetail : TEXCOORD2;\n\t\t\t\t\tfloat4 objMain : TEXCOORD3;\n\t\t\t\t\tfloat3 worldNormal : TEXCOORD4;\n\t\t\t\t\tfloat3 viewDir : TEXCOORD5;\n\t\t\t\t\tLIGHTING_COORDS(6,7)\n\t\t\t\t\tfloat4 projPos : TEXCOORD8;\n#if defined (SCATTERER_ON)\n\t\t\t\t\tfloat3 worldOrigin: TEXCOORD9;\n#endif\t\t\t\t\t\n\t\t\t\t};\n\n\n\t\t\t\tv2f vert(appdata_t v)\n\t\t\t\t{\n\t\t\t\t\tv2f o;\n\t\t\t\t\tUNITY_INITIALIZE_OUTPUT(v2f, o);\n\t\t\t\t\to.pos = UnityObjectToClipPos(v.vertex);\n\n\t\t\t\t\tfloat4 vertexPos = mul(unity_ObjectToWorld, v.vertex);\n\t\t\t\t\tfloat3 origin = mul(unity_ObjectToWorld, float4(0,0,0,1)).xyz;\n\t\t\t\t\to.worldVert = vertexPos;\n\t\t\t\t\to.worldNormal = normalize(vertexPos - origin);\n\t\t\t\t\to.objMain = mul(_MainRotation, v.vertex);\n\t\t\t\t\to.objDetail = mul(_DetailRotation, o.objMain);\n\t\t\t\t\to.viewDir = normalize(WorldSpaceViewDir(v.vertex));\n\n\t\t\t\t\to.projPos = ComputeScreenPos(o.pos);\n\t\t\t\t\tCOMPUTE_EYEDEPTH(o.projPos.z);\n\t\t\t\t\tTRANSFER_VERTEX_TO_FRAGMENT(o);\n\n\t\t\t\t\to.L = _PlanetOrigin - _WorldSpaceCameraPos.xyz;\n#if defined (SCATTERER_ON)\n\t\t\t\t\to.worldOrigin = origin;\n#endif\n\t\t\t\t\treturn o;\n\t\t\t\t}\n\n\t\t\t\tstruct fout\n\t\t\t\t{\n\t\t\t\t\tfloat4 color : COLOR;\n#if !(SHADER_API_D3D11 && WORLD_SPACE_ON)\n\t\t\t\t\tfloat depth : DEPTH;\n#endif\n\t\t\t\t};\n\n\t\t\t\tfout frag(v2f IN)\n\n\t\t\t\t{\n\t\t\t\t\tfout OUT;\n\t\t\t\t\tfloat4 color;\n\t\t\t\t\tfloat4 main;\n\n\t\t\t\t\tmain = GET_CUBE_MAP_P(_MainTex, IN.objMain.xyz, _UVNoiseTex, _UVNoiseScale, _UVNoiseStrength, _UVNoiseAnimation);\n\t\t\t\t\tmain = ALPHA_COLOR_1(main);\n\n\t\t\t\t\tfloat4 detail = GetCubeDetailMap(_DetailTex, IN.objDetail, _DetailScale);\n\n\t\t\t\t\tfloat viewDist = distance(IN.worldVert,_WorldSpaceCameraPos);\n\t\t\t\t\thalf detailLevel = saturate(2 * _DetailDist*viewDist);\n\t\t\t\t\tcolor = _Color * main.rgba * lerp(detail.rgba, 1, detailLevel);\n\n\t\t\t\t\tfloat rim = saturate(abs(dot(IN.viewDir, IN.worldNormal)));\n\t\t\t\t\trim = saturate(pow(_FalloffScale*rim,_FalloffPow));\n\t\t\t\t\tfloat dist = distance(IN.worldVert,_WorldSpaceCameraPos);\n\t\t\t\t\tfloat distLerp = saturate(_RimDist*(distance(_PlanetOrigin,_WorldSpaceCameraPos) - _RimDistSub*distance(IN.worldVert,_PlanetOrigin)));\n\t\t\t\t\tfloat distFade = 1 - GetDistanceFade(dist, _DistFade, _DistFadeVert);\n\t\t\t\t\tfloat distAlpha = lerp(distFade, rim, distLerp);\n\n\t\t\t\t\tcolor.a = lerp(0, color.a, distAlpha);\n\n#ifdef WORLD_SPACE_ON\n\t\t\t\t\tfloat3 worldDir = normalize(IN.worldVert - _WorldSpaceCameraPos.xyz);\n\t\t\t\t\tfloat tc = dot(IN.L, worldDir);\n\t\t\t\t\tfloat d = sqrt(dot(IN.L,IN.L) - (tc*tc));\n\t\t\t\t\tfloat3 norm = normalize(-IN.L);\n\t\t\t\t\tfloat d2 = pow(d,2);\n\t\t\t\t\tfloat td = sqrt(dot(IN.L,IN.L) - d2);\n\t\t\t\t\tfloat tlc = sqrt((_OceanRadius*_OceanRadius) - d2);\n\n\t\t\t\t\thalf sphereCheck = saturate(step(d, _OceanRadius)*step(0.0, tc) + step(length(IN.L), _OceanRadius));\n\t\t\t\t\tfloat sphereDist = lerp(tlc - td, tc - tlc, step(0.0, tc));\n\t\t\t\t\tsphereCheck *= step(sphereDist, dist);\n\n\t\t\t\t\tcolor.a *= 1 - sphereCheck;\n#endif\n\n\n\n\n////////////////////////////SCATTERER OFF\n#if !defined (SCATTERER_ON)\n\t\t\t\t\t//lighting\n\t\t\t\t\thalf transparency = color.a;\n\t\t\t\t\tfloat4 scolor = SpecularColorLight(_WorldSpaceLightPos0, IN.viewDir, IN.worldNormal, color, 0, 0, LIGHT_ATTENUATION(IN));\n\t\t\t\t\tscolor *= Terminator(normalize(_WorldSpaceLightPos0), IN.worldNormal);\n\t\t\t\t\tscolor.a = transparency;\n\n\t#ifdef SOFT_DEPTH_ON\n\t\t\t\t\tfloat depth = UNITY_SAMPLE_DEPTH(tex2Dproj(_CameraDepthTexture, UNITY_PROJ_COORD(IN.projPos)));\n\t\t\t\t\tdepth = LinearEyeDepth(depth);\n\t\t\t\t\tfloat partZ = IN.projPos.z;\n\t\t\t\t\tfloat fade = saturate(_InvFade * (depth - partZ));\n\t\t\t\t\tscolor.a *= fade;\n\t#endif\n\n\t\t\t\t\t//scolor.rgb *= MultiBodyShadow(IN.worldVert, _SunRadius, _SunPos, _ShadowBodies); //causes artifacts idk why\n\t\t\t\t\tOUT.color = lerp(scolor, color, _MinLight);\n\n////////////////////////////SCATTERER ON\n#else\n\t\t\t\t\tfloat4 texColor = color;\n\t\t\t\t\tfloat3 extinction = float3(0, 0, 0);\n\n\t#ifdef WORLD_SPACE_ON\n\t\t\t\t\tfloat3 WCP = _WorldSpaceCameraPos; //unity supplied, in local Space\n\t\t\t\t\tfloat3 worldPos = IN.worldVert;\n\t\t\t\t\tfloat3 worldOrigin = IN.worldOrigin;\n\t#else\n\t\t\t    \t\tfloat3 WCP = _WorldSpaceCameraPos * 6000; //unity supplied, converted from ScaledSpace to localSpace coords\n\t\t\t\t\tfloat3 worldPos = IN.worldVert * 6000;\n\t\t\t\t\tfloat3 worldOrigin = IN.worldOrigin * 6000;\n\t#endif\n\n\t\t\t\t\tfloat3 relWorldPos=worldPos-worldOrigin;\n\t\t\t\t\trelWorldPos = _Radius * normalize(relWorldPos);\n\t\t\t\t\t\n\t\t\t\t\tfloat alt = length(relWorldPos);\n\t\t\t\t\tfloat threshold = Rg * 1.00333333;\n\n\t\t\t\t\trelWorldPos = (alt < threshold) ? normalize(relWorldPos) * (threshold) : relWorldPos;   //artifacts fix (black scattering and overbright skyirradiance) when cloud altitude < Rg *( 1 + 2000/600000)\n\n\t\t\t\t\tfloat3 relCameraPos=WCP-worldOrigin;\n\n\t\t\t\t\tfloat3 scatteringPos = relWorldPos;\n\n#if defined (GODRAYS_ON) && defined(WORLD_SPACE_ON)\n\t\t\t\t\tfloat2 depthUV = IN.projPos.xy/IN.projPos.w;\n\t\t\t\t\tfloat godrayDepth = sampleGodrayDepth(_godrayDepthTexture, depthUV, _godrayStrength);\n\t\t\t\t\tgodrayDepth = min(godrayDepth, _godrayStrength * length(scatteringPos - relCameraPos));\n\t\t\t\t\tscatteringPos -= godrayDepth * IN.viewDir; //this works but it looks suuuper wrong when outside the cloud layer, to be revised I guess\n#endif\n\t\t\t\t\t\n\t\t\t\t\t//inScattering from cloud to observer\n\t\t\t\t\tfloat3 inscatter = InScattering2(relCameraPos, scatteringPos, _Sun_WorldSunDir,extinction);\n\t\t\t\t\t\n                \t\t\t//extinction from cloud to observer\n\t\t\t\t\textinction = getExtinction(relCameraPos, relWorldPos, 1.0, 1.0, 1.0);\n\n\t\t\t\t\t//extinction of light from sun to cloud\n\t\t\t\t\textinction *= getSkyExtinction(relWorldPos,_Sun_WorldSunDir);\n\n\t\t\t\t\textinction= max(float3(0.0,0.0,0.0), (float3(1.0,1.0,1.0)*(1-extinctionThickness) + extinctionThickness*extinction) );\n\n\t\t\t\t\textinction*= getEclipseShadow(relWorldPos, 20.0 * _Sun_WorldSunDir * Rg, 0.0, Rg, Rg); //just the terminator, extinction ignores ground intersection\n\n\t\t\t\t\t//skyLight\n\t\t\t\t\tfloat3 skyE = SimpleSkyirradiance(relWorldPos, IN.viewDir, _Sun_WorldSunDir);\n\n\t#if defined (PRESERVECLOUDCOLORS_OFF)\n\t\t\t\t\tcolor = float4(hdrNoExposure(color.rgb*cloudColorMultiplier*extinction+ inscatter*cloudScatteringMultiplier+skyE*cloudSkyIrradianceMultiplier), color.a); //not bad\n\t#else\n\t\t\t\t\tfloat3 cloudColor = color.rgb*cloudColorMultiplier*(extinction+hdrNoExposure(skyE * cloudSkyIrradianceMultiplier));\n\t\t\t\t\tinscatter = hdrNoExposure(inscatter * cloudScatteringMultiplier);\n\t\t\t\t\tcolor = float4(cloudColor + (float3(1.0,1.0,1.0)-cloudColor)*inscatter, color.a); //basically soft blend\n\t#endif\t\t\t\t\t\n\n\t#if defined (ECLIPSES_ON)\t\t\t\t\n\t\t\t\t\tcolor.rgb*=getEclipseShadows(worldPos);\n\t#endif\n\n\t#if defined (RINGSHADOW_ON)\n\t\t\t\t\tcolor.rgb *= getLinearRingColor(relWorldPos, _Sun_WorldSunDir, 0.0).a;\n\t#endif\n\t\t\t\t\tOUT.color = lerp(color, texColor, _MinLight);\n#endif //endif SCATTERER_ON\n\n\t\t\t\t\tfloat depthWithOffset = IN.projPos.z;\n#ifndef WORLD_SPACE_ON\n\t\t\t\t\tdepthWithOffset *= _DepthPull;\n\t\t\t\t\tOUT.color.a *= step(0, dot(IN.viewDir, IN.worldNormal));\n#endif\n\n#if !(SHADER_API_D3D11 && WORLD_SPACE_ON) //fixes clouds fading into the planet when zooming out\n\t\t\t\t\tOUT.depth = (1.0 - depthWithOffset * _ZBufferParams.w) / (depthWithOffset * _ZBufferParams.z);\n#endif\n\n\t\t\t\t\treturn OUT;\n\t\t\t\t}\n\t\t\t\tENDCG\n\n\t\t\t}\n\n\t\t}\n\n\t}\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/EVE/SphereCloud.shader.meta",
    "content": "fileFormatVersion: 2\nguid: 7071adaea60f6124d9ab426b002d5afa\ntimeCreated: 1470912280\nlicenseType: Free\nShaderImporter:\n  defaultTextures: []\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/EVE/SphereCloudShadowMap.shader",
    "content": "Shader \"Scatterer-EVE/CloudShadowMap\"\n{\n\tProperties\n\t{\n\t\t_Color(\"Color Tint\", Color) = (1,1,1,1)\n\t\t_MainTex(\"Main (RGB)\", 2D) = \"white\" {}\n\t\t_DetailTex(\"Detail (RGB)\", 2D) = \"white\" {}\n\t\t_UVNoiseTex(\"UV Noise (RG)\", 2D) = \"black\" {}\n\t\t_FalloffPow(\"Falloff Power\", Range(0,3)) = 2\n\t\t_FalloffScale(\"Falloff Scale\", Range(0,20)) = 3\n\t\t_DetailScale(\"Detail Scale\", Range(0,100)) = 100\n\t\t_DetailDist(\"Detail Distance\", Range(0,1)) = 0.00875\n\t\t_UVNoiseScale(\"UV Noise Scale\", Range(0,0.1)) = 0.01\n\t\t_UVNoiseStrength(\"UV Noise Strength\", Range(0,0.1)) = 0.002\n\t\t_UVNoiseAnimation(\"UV Noise Animation\", Vector) = (0.002,0.001,0)\n\t\t_UniversalTime(\"Universal Time\", Vector) = (0,0,0,0)\n\t\t_MinLight(\"Minimum Light\", Range(0,1)) = 0\n\t\t_DistFade(\"Fade Distance\", Range(0,100)) = 10\n\t\t_DistFadeVert(\"Fade Scale\", Range(0,1)) = .002\n\t\t_RimDist(\"Rim Distance\", Range(0,1)) = 1\n\t\t_RimDistSub(\"Rim Distance Sub\", Range(0,2)) = 1.01\n\t\t_InvFade(\"Soft Particles Factor\", Range(0.01,3.0)) = .01\n\t\t_OceanRadius(\"Ocean Radius\", Float) = 63000\n\t\t_PlanetOrigin(\"Sphere Center\", Vector) = (0,0,0,1)\n\t\t_DepthPull(\"Depth Augment\", Float) = .99\n\t\t_SunPos(\"_SunPos\", Vector) = (0,0,0)\n\t\t_SunRadius(\"_SunRadius\", Float) = 1\n\t}\n\tSubShader\n\t{\n\t\tPass\n\t\t{\n\t\t\tTags { \"LightMode\" = \"ShadowCaster\"}\n\n\t\t\tBlendOp Max\n\t\t\tBlend One One \n\t\t\t\t\n\t\t\tCGPROGRAM\n\t\t\t\t\t\n\t\t\t#include \"EVEUtils.cginc\"\n\t\t\t#pragma target 3.0\n\t\t\t#pragma glsl\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\t\t\t#define MAG_ONE 1.4142135623730950488016887242097\n\t\t\t#pragma multi_compile MAP_TYPE_1 MAP_TYPE_CUBE_1 MAP_TYPE_CUBE2_1 MAP_TYPE_CUBE6_1\n\n\t\t\t#ifndef MAP_TYPE_CUBE2_1\n\t\t\t#pragma multi_compile ALPHAMAP_N_1 ALPHAMAP_1\n\t\t\t#endif\n\t\t\t#include \"alphaMap.cginc\"\n\t\t\t#include \"cubeMap.cginc\"\n\t\t\t\t\t\n\t\t\tCUBEMAP_DEF_1(_MainTex)\n\n\t\t\tfixed4 _Color;\n\t\t\tuniform sampler2D _DetailTex;\n\t\t\tuniform sampler2D _UVNoiseTex;\n\t\t\tfixed4 _DetailOffset;\n\t\t\tfloat _DetailScale;\n\t\t\tfloat _DetailDist;\n\t\t\tfloat _UVNoiseScale;\n\t\t\tfloat _UVNoiseStrength;\n\t\t\tfloat2 _UVNoiseAnimation;\n\t\t\tfloat4 _SunDir;\n\t\t\tfloat _Radius;\n\t\t\tfloat _PlanetRadius;\n\n\t\t\tfloat3 _PlanetOrigin;\n\t\t\tfloat _godrayCloudThreshold;\n\t\t\t\n\t\t\tstruct appdata_t\n\t\t\t{\n\t\t\t\tfloat4 vertex : POSITION;\n\t\t\t};\n\t\t\t\n\t\t\tstruct v2f\n\t\t\t{\n\t\t\t\tfloat4 pos : SV_POSITION;\n\t\t\t\t//float4 objMain : TEXCOORD0;\n\t\t\t\tfloat4 worldPos : TEXCOORD0;\n\t\t\t};\n\t\t\t\n\t\t\t\n\t\t\tv2f vert(appdata_t v)\n\t\t\t{\n\t\t\t\tv2f o;\n\n\t\t\t\to.worldPos = float4(_PlanetOrigin + _Radius * normalize(v.vertex.xyz),1.0);\n\t\t\t\to.pos = UnityWorldToClipPos(o.worldPos);\n\n//\t\t\t\to.worldPos = float4(_PlanetOrigin + v.vertex.xyz/v.vertex.w * _Radius, 1.0);\n//\t\t\t\to.pos = UnityWorldToClipPos(o.worldPos);\n\n//#if defined(UNITY_REVERSED_Z)\n\t\t\t\tfloat clamped = min(o.pos.z, o.pos.w*UNITY_NEAR_CLIP_VALUE);\n//#else\n//\t\t\t\tfloat clamped = max(clipPos.z, clipPos.w*UNITY_NEAR_CLIP_VALUE);\n//#endif\n\t\t\t\to.pos.z = lerp(o.pos.z, clamped, unity_LightShadowBias.y);\n\n\n//\t\t\t\tTRANSFER_SHADOW_CASTER_NORMALOFFSET(o);\n//\t\t\t\tUnityApplyLinearShadowBias(o.pos);\n\n\t\t\t\treturn o;\n\t\t\t}\n\n\t\t\tfloat4 frag(v2f IN) : SV_Target\n\n\t\t\t{\n\t\t\t\tfloat4 worldPos = float4(IN.worldPos.xyz/IN.worldPos.w,1.0);\n\t\t\t\tfloat4 mainPos = mul(_MainRotation, worldPos);\n\n\t\t\t\tfloat4 color;\n\t\t\t\tfloat4 main;\n\t\t\t\t\n\t\t\t\tmain = GET_CUBE_MAP_P(_MainTex, mainPos.xyz/mainPos.w, _UVNoiseTex, _UVNoiseScale, _UVNoiseStrength, _UVNoiseAnimation);\n\t\t\t\tmain = ALPHA_COLOR_1(main);\n\t\t\t\t\n\t\t\t\tcolor = _Color * main.rgba;\n\n\t\t\t\tif (color.a < _godrayCloudThreshold)\n\t\t\t\t\tdiscard;\n\t\t\t\t\n\t\t\t\treturn float4(IN.pos.z/IN.pos.w,0.0,0.0,1.0);\n\t\t\t}\n\t\t\tENDCG\n\t\t}\n\t}\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/EVE/SphereCloudShadowMap.shader.meta",
    "content": "fileFormatVersion: 2\nguid: 1389c6be1c6e80b4eb8604aabdda8255\nShaderImporter:\n  externalObjects: {}\n  defaultTextures: []\n  nonModifiableTextures: []\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/EVE/alphaMap.cginc",
    "content": "#ifndef ALPHA_MAP_CG_INC\n#define ALPHA_MAP_CG_INC\n\ninline half vectorSum(half4 v) \n{\n\treturn (v.x + v.y + v.z + v.w);\n}\n\nhalf4 alphaMask1;\n\n#define ALPHA_VALUE_1(color) \\\n\tvectorSum( color * alphaMask1 )\n\n#ifdef ALPHAMAP_1\n#define ALPHA_COLOR_1(color) half4(1, 1, 1, ALPHA_VALUE_1(color))\n#else\n#define ALPHA_COLOR_1(color) color\n#endif\n\n#endif"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/EVE/alphaMap.cginc.meta",
    "content": "fileFormatVersion: 2\nguid: 1852920dca83b454c8e49493d9ead74c\ntimeCreated: 1470912310\nlicenseType: Free\nShaderImporter:\n  defaultTextures: []\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/EVE/cubeMap.cginc",
    "content": "#ifndef CUBE_MAP_CG_INC\n#define CUBE_MAP_CG_INC\n\n#ifdef MAP_TYPE_CUBE_1\n#define GET_CUBE_MAP_1(name, vect) GetCubeMap(cube ## name, vect)\n#define GET_CUBE_MAP_P(name, vect, n, nsc, nst, na) GetCubeMapPerturbed(cube ## name, vect, n, nsc, nst, na)\n#define GET_NO_LOD_CUBE_MAP_1(name, vect) GetCubeMapNoLOD(cube ## name, vect)\n#define FRAG_GET_NO_LOD_CUBE_MAP_1(name, vect) half4(1,1,1,1)\n#define VERT_GET_NO_LOD_CUBE_MAP_1(name, vect) GetCubeMapNoLOD(cube ## name, vect)\n#define CUBEMAP_DEF_1(name) \\\n\tuniform samplerCUBE cube ## name;\n#elif defined (MAP_TYPE_CUBE6_1)\n#define GET_CUBE_MAP_1(name, vect) GetCubeMap(cube ## name ## xn, cube ## name ## xp, \\\n\t\t\t\t\t\t\t\t\t\t\tcube ## name ## yn, cube ## name ## yp, \\\n\t\t\t\t\t\t\t\t\t\t\tcube ## name ## zn, cube ## name ## zp, vect)\n#define GET_CUBE_MAP_P(name, vect, n, nsc, nst, na) GetCubeMapPerturbed(cube ## name ## xn, cube ## name ## xp, \\\n\t\t\t\t\t\t\t\t\t\t\tcube ## name ## yn, cube ## name ## yp, \\\n\t\t\t\t\t\t\t\t\t\t\tcube ## name ## zn, cube ## name ## zp, vect, n, nsc, nst, na)\n#define GET_NO_LOD_CUBE_MAP_1(name, vect) GetCubeMapNoLOD(cube ## name ## xn, cube ## name ## xp, \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcube ## name ## yn, cube ## name ## yp, \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcube ## name ## zn, cube ## name ## zp, vect)\n#define FRAG_GET_NO_LOD_CUBE_MAP_1(name, vect)  GetCubeMap(cube ## name ## xn, cube ## name ## xp, \\\n\t\t\t\t\t\t\t\t\t\t\tcube ## name ## yn, cube ## name ## yp, \\\n\t\t\t\t\t\t\t\t\t\t\tcube ## name ## zn, cube ## name ## zp, vect)\n#define VERT_GET_NO_LOD_CUBE_MAP_1(name, vect) half4(1,1,1,1)\n#define CUBEMAP_DEF_1(name) \\\n\tsampler2D cube ## name ## xn, cube ## name ## xp; \\\n\tsampler2D cube ## name ## yn, cube ## name ## yp; \\\n\tsampler2D cube ## name ## zn, cube ## name ## zp;\n\n#elif defined (MAP_TYPE_CUBE2_1)\n#define GET_CUBE_MAP_1(name, vect) GetCubeMap(cube ## name ## POS, cube ## name ## NEG, vect)\n#define GET_CUBE_MAP_P(name, vect, n, nsc, nst, na) GetCubeMapPerturbed(cube ## name ## POS, cube ## name ## NEG, vect, n, nsc, nst, na)\n#define GET_NO_LOD_CUBE_MAP_1(name, vect) GetCubeMapNoLOD(cube ## name ## POS, cube ## name ## NEG, vect)\n#define FRAG_GET_NO_LOD_CUBE_MAP_1(name, vect) half4(1,1,1,1)\n#define VERT_GET_NO_LOD_CUBE_MAP_1(name, vect) GetCubeMapNoLOD(cube ## name ## POS, cube ## name ## NEG, vect)\n#define CUBEMAP_DEF_1(name) \\\n\tsampler2D cube ## name ## POS; \\\n\tsampler2D cube ## name ## NEG;\n\n#else\n#define GET_CUBE_MAP_1(name, vect) GetCubeMap(name, vect)\n#define GET_CUBE_MAP_P(name, vect, n, nsc, nst, na) GetCubeMapPerturbed(name, vect, n, nsc, nst, na)\n#define GET_NO_LOD_CUBE_MAP_1(name, vect) GetCubeMapNoLOD(name, vect)\n#define FRAG_GET_NO_LOD_CUBE_MAP_1(name, vect)  half4(1,1,1,1)\n#define VERT_GET_NO_LOD_CUBE_MAP_1(name, vect) GetCubeMapNoLOD(name, vect)\n#define CUBEMAP_DEF_1(name) \\\n\tsampler2D name;\n#endif\n\n\n\ninline float4 CubeDerivatives(float2 uv, float scale)\n{\n\t\n\t//Make the UV continuous. \n\tfloat2 uvS = abs(uv - (.5*scale));\n\n\tfloat2 uvCont;\n\tuvCont.x = max(uvS.x, uvS.y);\n\tuvCont.y = min(uvS.x, uvS.y);\n\n\treturn float4(ddx(uvCont), ddy(uvCont));\n}\n\n\ninline float4 Derivatives(float2 uv)\n{\n\tfloat2 uvCont = uv;\n\t//Make the UV continuous. \n\tuvCont.x = abs(uvCont.x - .5);\n\treturn float4(ddx(uvCont), ddy(uvCont));\n}\n\ninline float2 GetCubeUV(float3 cubeVect, float2 uvOffset)\n{\n\tfloat2 uv;\n\tuv.x = .5 + (INV_2PI*atan2(cubeVect.x, cubeVect.z));\n\tuv.y = INV_PI*acos(cubeVect.y);\n\tuv += uvOffset;\n\treturn uv;\n}\n\n#define GetCubeCubeUV(cubeVect) \\\n\tfloat3 cubeVectNorm = normalize(cubeVect); \\\n\tfloat3 cubeVectNormAbs = abs(cubeVectNorm);\\\n\thalf zxlerp = step(cubeVectNormAbs.x, cubeVectNormAbs.z);\\\n\thalf nylerp = step(cubeVectNormAbs.y, max(cubeVectNormAbs.x, cubeVectNormAbs.z));\\\n\thalf s = lerp(cubeVectNorm.x, cubeVectNorm.z, zxlerp);\\\n\ts = sign(lerp(cubeVectNorm.y, s, nylerp));\\\n\thalf3 detailCoords = lerp(half3(1, -s, -1)*cubeVectNorm.xzy, half3(1, s, -1)*cubeVectNorm.zxy, zxlerp);\\\n\tdetailCoords = lerp(half3(1, 1, s)*cubeVectNorm.yxz, detailCoords, nylerp);\\\n\thalf2 uv = ((.5*detailCoords.yz) / abs(detailCoords.x)) + .5;\n\n\ninline half4 GetCubeMapNoLOD(sampler2D texSampler, float3 cubeVect)\n{\n\tfloat4 uv;\n\tfloat3 cubeVectNorm = normalize(cubeVect);\n\tuv.xy = GetCubeUV(cubeVectNorm, float2(0, 0));\n\tuv.zw = float2(0, 0);\n\thalf4 tex = tex2Dlod(texSampler, uv);\n\treturn tex;\n}\n\ninline half4 GetCubeMap(sampler2D texSampler, float3 cubeVect)\n{\n\tfloat3 cubeVectNorm = normalize(cubeVect);\n\tfloat2 uv = GetCubeUV(cubeVectNorm, float2(0, 0));\n\tfloat4 uvdd = Derivatives(uv);\n\thalf4 tex = tex2D(texSampler, uv, uvdd.xy, uvdd.zw);\n\treturn tex;\n}\n\ninline half4 GetCubeMapPerturbed(sampler2D texSampler, float3 cubeVect, sampler2D uvNoiseSampler, float uvNoiseScale, float uvNoiseStrength, float2 uvNoiseAnimation)\n{\n\tfloat3 cubeVectNorm = normalize(cubeVect);\n\tfloat2 uv = GetCubeUV(cubeVectNorm, float2(0, 0));\n\tfloat2 uvd = fmod(uv, uvNoiseScale) / uvNoiseScale + uvNoiseAnimation*float2(_UniversalTime.x, _UniversalTime.x);\n\tuv += (tex2D(uvNoiseSampler, uvd) - float2(0.5, 0.5))*uvNoiseStrength;\n\tfloat4 uvdd = Derivatives(uv);\n\thalf4 tex = tex2D(texSampler, uv, uvdd.xy, uvdd.zw);\n\treturn tex;\n}\n\ninline half4 GetCubeMapNoLOD(samplerCUBE texSampler, float3 cubeVect)\n{\n\thalf4 uv;\n\tuv.xyz = normalize(cubeVect);\n\tuv.w = 0;\n\thalf4 tex = texCUBElod(texSampler, uv);\n\treturn tex;\n}\n\ninline half4 GetCubeMap(samplerCUBE texSampler, float3 cubeVect)\n{\n\thalf4 tex = texCUBE(texSampler, normalize(cubeVect));\n\treturn tex;\n}\n\ninline half4 GetCubeMapPerturbed(samplerCUBE texSampler, float3 cubeVect, sampler2D uvNoiseSampler, float uvNoiseScale, float uvNoiseStrength, float2 uvNoiseAnimation)\n{\n\tcubeVect = normalize(cubeVect);\n\tfloat2 uv;\n\tuv.x = .5 + (INV_2PI*atan2(cubeVect.x, cubeVect.z));\n\tuv.y = INV_PI*acos(cubeVect.y);\n\tfloat2 uvd = fmod(cubeVect, uvNoiseScale) / uvNoiseScale + uvNoiseAnimation*float2(_UniversalTime.x, _UniversalTime.x);\n\tcubeVect.xy += (tex2D(uvNoiseSampler, uvd) - float2(0.5, 0.5))*uvNoiseStrength;\n\thalf4 tex = texCUBE(texSampler, cubeVect);\n\treturn tex;\n}\n\ninline half4 GetCubeMapNoLOD(sampler2D texXn, sampler2D texXp, sampler2D texYn, sampler2D texYp, sampler2D texZn, sampler2D texZp, float3 cubeVect)\n{\n\tfloat4 uv4;\n\tuv4.zw = float2(0, 0);\n\n\tGetCubeCubeUV(cubeVect);\n\tuv4.xy = uv;\n\n\thalf4 sampxn = tex2Dlod(texXn, uv4);\n\thalf4 sampxp = tex2Dlod(texXp, uv4);\n\thalf4 sampyn = tex2Dlod(texYn, uv4);\n\thalf4 sampyp = tex2Dlod(texYp, uv4);\n\thalf4 sampzn = tex2Dlod(texZn, uv4);\n\thalf4 sampzp = tex2Dlod(texZp, uv4);\n\n\thalf4 sampx = lerp(sampxn, sampxp, step(0, s));\n\thalf4 sampy = lerp(sampyn, sampyp, step(0, s));\n\thalf4 sampz = lerp(sampzn, sampzp, step(0, s));\n\t\n\thalf4 samp = lerp(sampx, sampz, zxlerp);\n\t\t  samp = lerp(sampy, samp, nylerp);\n\t\n\n\treturn samp;\n\t\n}\n\ninline half4 GetCubeMap(sampler2D texXn, sampler2D texXp, sampler2D texYn, sampler2D texYp, sampler2D texZn, sampler2D texZp, float3 cubeVect)\n{\n\tGetCubeCubeUV(cubeVect);\n\n\t//this fixes UV discontinuity on Y-X seam by swapping uv coords in derivative calcs when in the X quadrants.\n\tfloat4 uvdd = CubeDerivatives(uv, 1);\n\n\n\thalf4 sampxn = tex2D(texXn, uv, uvdd.xy, uvdd.zw);\n\thalf4 sampxp = tex2D(texXp, uv, uvdd.xy, uvdd.zw);\n\thalf4 sampyn = tex2D(texYn, uv, uvdd.xy, uvdd.zw);\n\thalf4 sampyp = tex2D(texYp, uv, uvdd.xy, uvdd.zw);\n\thalf4 sampzn = tex2D(texZn, uv, uvdd.xy, uvdd.zw);\n\thalf4 sampzp = tex2D(texZp, uv, uvdd.xy, uvdd.zw);\n\n\thalf4 sampx = lerp(sampxn, sampxp, step(0, s));\n\thalf4 sampy = lerp(sampyn, sampyp, step(0, s));\n\thalf4 sampz = lerp(sampzn, sampzp, step(0, s));\n\n\thalf4 samp = lerp(sampx, sampz, zxlerp);\n\tsamp = lerp(sampy, samp, nylerp);\n\treturn samp;\n}\n\ninline half4 GetCubeMapPerturbed(sampler2D texXn, sampler2D texXp, sampler2D texYn, sampler2D texYp, sampler2D texZn, sampler2D texZp, float3 cubeVect, sampler2D uvNoiseSampler, float uvNoiseScale, float uvNoiseStrength, float2 uvNoiseAnimation)\n{\n\tGetCubeCubeUV(cubeVect);\n\n\tfloat2 uvd = fmod(uv, uvNoiseScale) / uvNoiseScale + uvNoiseAnimation*float2(_UniversalTime.x, _UniversalTime.x);\n\tuv += (tex2D(uvNoiseSampler, uvd) - float2(0.5, 0.5))*uvNoiseStrength;\n\n\t//this fixes UV discontinuity on Y-X seam by swapping uv coords in derivative calcs when in the X quadrants.\n\tfloat4 uvdd = CubeDerivatives(uv, 1);\n\n\n\thalf4 sampxn = tex2D(texXn, uv, uvdd.xy, uvdd.zw);\n\thalf4 sampxp = tex2D(texXp, uv, uvdd.xy, uvdd.zw);\n\thalf4 sampyn = tex2D(texYn, uv, uvdd.xy, uvdd.zw);\n\thalf4 sampyp = tex2D(texYp, uv, uvdd.xy, uvdd.zw);\n\thalf4 sampzn = tex2D(texZn, uv, uvdd.xy, uvdd.zw);\n\thalf4 sampzp = tex2D(texZp, uv, uvdd.xy, uvdd.zw);\n\n\thalf4 sampx = lerp(sampxn, sampxp, step(0, s));\n\thalf4 sampy = lerp(sampyn, sampyp, step(0, s));\n\thalf4 sampz = lerp(sampzn, sampzp, step(0, s));\n\n\thalf4 samp = lerp(sampx, sampz, zxlerp);\n\tsamp = lerp(sampy, samp, nylerp);\n\treturn samp;\n}\n\ninline half4 GetCubeMapNoLOD(sampler2D texSamplerPos, sampler2D texSamplerNeg, float3 cubeVect)\n{\n\n\tfloat4 uv4;\n\tuv4.zw = float2(0, 0);\n\n\tGetCubeCubeUV(cubeVect);\n\tuv4.xy = uv;\n\n\thalf4 texPos = tex2Dlod(texSamplerPos, uv4);\n\thalf4 texNeg = tex2Dlod(texSamplerNeg, uv4);\n\n\thalf4 tex = lerp(texNeg, texPos, step(0, s));\n\n\thalf alpha = lerp(tex.x, tex.z, zxlerp);\n\talpha = lerp(tex.y, alpha, nylerp);\n\treturn half4(tex.a, tex.a, tex.a, alpha);\n\n}\n\ninline half4 GetCubeMap(sampler2D texSamplerPos, sampler2D texSamplerNeg, float3 cubeVect)\n{\n\tGetCubeCubeUV(cubeVect);\n\n\tfloat4 uvdd = CubeDerivatives(uv, 1);\n\n\thalf4 texPos = tex2D(texSamplerPos, uv, uvdd.xy, uvdd.zw);\n\thalf4 texNeg = tex2D(texSamplerNeg, uv, uvdd.xy, uvdd.zw);\n\n\thalf4 tex = lerp(texNeg, texPos, step(0, s));\n\n\thalf alpha = lerp(tex.x, tex.z, zxlerp);\n\talpha = lerp(tex.y, alpha, nylerp);\n\treturn half4(tex.a, tex.a, tex.a, alpha);\n\n}\n\ninline half4 GetCubeMapPerturbed(sampler2D texSamplerPos, sampler2D texSamplerNeg, float3 cubeVect, sampler2D uvNoiseSampler, float uvNoiseScale, float uvNoiseStrength, float2 uvNoiseAnimation)\n{\n\tGetCubeCubeUV(cubeVect);\n\n\tfloat2 uvd = fmod(uv, uvNoiseScale) / uvNoiseScale + uvNoiseAnimation*float2(_UniversalTime.x, _UniversalTime.x);\n\tuv += (tex2D(uvNoiseSampler, uvd) - float2(0.5, 0.5))*uvNoiseStrength;\n\n\tfloat4 uvdd = CubeDerivatives(uv, 1);\n\n\thalf4 texPos = tex2D(texSamplerPos, uv, uvdd.xy, uvdd.zw);\n\thalf4 texNeg = tex2D(texSamplerNeg, uv, uvdd.xy, uvdd.zw);\n\n\thalf4 tex = lerp(texNeg, texPos, step(0, s));\n\n\thalf alpha = lerp(tex.x, tex.z, zxlerp);\n\talpha = lerp(tex.y, alpha, nylerp);\n\treturn half4(tex.a, tex.a, tex.a, alpha);\n}\n\n\n\ninline half4 GetCubeDetailMapNoLOD(sampler2D texSampler, float3 cubeVect, float detailScale)\n{\n\tfloat4 uv4;\n\tuv4.zw = float2(0, 0);\n\n\tGetCubeCubeUV(cubeVect);\n\tuv4.xy = uv;\n\thalf4 tex = tex2Dlod(texSampler, uv4);\n\treturn tex;\n}\n\ninline half4 GetCubeDetailMap(sampler2D texSampler, float3 cubeVect, float detailScale)\n{\n\tGetCubeCubeUV(cubeVect);\n\tuv*=detailScale;\n\tfloat4 uvdd = CubeDerivatives(uv, detailScale);\n\thalf4 tex = tex2D(texSampler, uv, uvdd.xy, uvdd.zw);\n\treturn \ttex;\n}\n\n\n#endif"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/EVE/cubeMap.cginc.meta",
    "content": "fileFormatVersion: 2\nguid: 6a022d21eb285c143ae29fc2aca21e11\ntimeCreated: 1470912310\nlicenseType: Free\nShaderImporter:\n  defaultTextures: []\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/EVE/noiseSimplex.cginc",
    "content": "#ifndef NOISE_SIMPLEX_FUNC\n#define NOISE_SIMPLEX_FUNC\n\n\n/*\n\nDescription:\nArray- and textureless CgFx/HLSL 2D, 3D and 4D simplex noise functions.\na.k.a. simplified and optimized Perlin noise.\n\nThe functions have very good performance\nand no dependencies on external data.\n\n2D - Very fast, very compact code.\n3D - Fast, compact code.\n4D - Reasonably fast, reasonably compact code.\n\n------------------------------------------------------------------\n\nPorted by:\nLex-DRL\nI've ported the code from GLSL to CgFx/HLSL for Unity,\nadded a couple more optimisations (to speed it up even further)\nand slightly reformatted the code to make it more readable.\n\nOriginal GLSL functions:\nhttps://github.com/ashima/webgl-noise\nCredits from original glsl file are at the end of this cginc.\n\n------------------------------------------------------------------\n\nUsage:\n\nfloat ns = snoise(v);\n// v is any of: float2, float3, float4\n\nReturn type is float.\nTo generate 2 or more components of noise (colorful noise),\ncall these functions several times with different\nconstant offsets for the arguments.\nE.g.:\n\nfloat3 colorNs = float3(\nsnoise(v),\nsnoise(v + 17.0),\nsnoise(v - 43.0),\n);\n\n\nRemark about those offsets from the original author:\n\nPeople have different opinions on whether these offsets should be integers\nfor the classic noise functions to match the spacing of the zeroes,\nso we have left that for you to decide for yourself.\nFor most applications, the exact offsets don't really matter as long\nas they are not too small or too close to the noise lattice period\n(289 in this implementation).\n\n*/\n\n// 1 / 289\n#define NOISE_SIMPLEX_1_DIV_289 0.00346020761245674740484429065744f\n\n\n// ( x*34.0 + 1.0 )*x =\n// x*x*34.0 + x\nfloat permute(float x) {\n\treturn fmod(\n\t\tx*x*34.0 + x,\n\t\t289.0\n\t\t);\n}\n\nfloat3 permute(float3 x) {\n\treturn fmod(\n\t\tx*x*34.0 + x,\n\t\t289.0\n\t\t);\n}\n\nfloat4 permute(float4 x) {\n\treturn fmod(\n\t\tx*x*34.0 + x,\n\t\t289.0\n\t\t);\n}\n\n\n\nfloat taylorInvSqrt(float r) {\n\treturn 1.79284291400159 - 0.85373472095314 * r;\n}\n\nfloat4 taylorInvSqrt(float4 r) {\n\treturn 1.79284291400159 - 0.85373472095314 * r;\n}\n\n\n\nfloat4 grad4(float j, float4 ip)\n{\n\tconst float4 ones = float4(1.0, 1.0, 1.0, -1.0);\n\tfloat4 p, s;\n\tp.xyz = floor(frac(j * ip.xyz) * 7.0) * ip.z - 1.0;\n\tp.w = 1.5 - dot(abs(p.xyz), ones.xyz);\n\n\t// GLSL: lessThan(x, y) = x < y\n\t// HLSL: 1 - step(y, x) = x < y\n\n\t//s = float4(\n\t//    1 - step(0.0, p)\n\t//);\n\t//p.xyz = p.xyz + (s.xyz * 2 - 1) * s.www;\n\n\tp.xyz -= sign(p.xyz) * (p.w < 0);\n\n\treturn p;\n}\n\n\n\n// ----------------------------------- 2D -------------------------------------\n\nfloat snoise(float2 v)\n{\n\tconst float4 C = float4(\n\t\t0.211324865405187, // (3.0-sqrt(3.0))/6.0\n\t\t0.366025403784439, // 0.5*(sqrt(3.0)-1.0)\n\t\t-0.577350269189626, // -1.0 + 2.0 * C.x\n\t\t0.024390243902439  // 1.0 / 41.0\n\t\t);\n\n\t// First corner\n\tfloat2 i = floor(v + dot(v, C.yy));\n\tfloat2 x0 = v - i + dot(i, C.xx);\n\n\t// Other corners\n\t// float2 i1 = (x0.x > x0.y) ? float2(1.0, 0.0) : float2(0.0, 1.0);\n\t// Lex-DRL: afaik, step() in GPU is faster than if(), so:\n\t// step(x, y) = x <= y\n\n\t//int xLessEqual = step(x0.x, x0.y); // x <= y ?\n\t//int2 i1 =\n\t//    int2(1, 0) * (1 - xLessEqual) // x > y\n\t//    + int2(0, 1) * xLessEqual // x <= y\n\t//;\n\t//float4 x12 = x0.xyxy + C.xxzz;\n\t//x12.xy -= i1;\n\n\tfloat4 x12 = x0.xyxy + C.xxzz;\n\tint2 i1 = (x0.x > x0.y) ? float2(1.0, 0.0) : float2(0.0, 1.0);\n\tx12.xy -= i1;\n\n\t// Permutations\n\ti = fmod(i, 289.0); // Avoid truncation effects in permutation\n\tfloat3 p = permute(\n\t\tpermute(\n\t\t\ti.y + float3(0.0, i1.y, 1.0)\n\t\t\t) + i.x + float3(0.0, i1.x, 1.0)\n\t\t);\n\n\tfloat3 m = max(\n\t\t0.5 - float3(\n\t\t\tdot(x0, x0),\n\t\t\tdot(x12.xy, x12.xy),\n\t\t\tdot(x12.zw, x12.zw)\n\t\t\t),\n\t\t0.0\n\t\t);\n\tm = m*m;\n\tm = m*m;\n\n\t// Gradients: 41 points uniformly over a line, mapped onto a diamond.\n\t// The ring size 17*17 = 289 is close to a multiple of 41 (41*7 = 287)\n\n\tfloat3 x = 2.0 * frac(p * C.www) - 1.0;\n\tfloat3 h = abs(x) - 0.5;\n\tfloat3 ox = floor(x + 0.5);\n\tfloat3 a0 = x - ox;\n\n\t// Normalise gradients implicitly by scaling m\n\t// Approximation of: m *= inversesqrt( a0*a0 + h*h );\n\tm *= 1.79284291400159 - 0.85373472095314 * (a0*a0 + h*h);\n\n\t// Compute final noise value at P\n\tfloat3 g;\n\tg.x = a0.x * x0.x + h.x * x0.y;\n\tg.yz = a0.yz * x12.xz + h.yz * x12.yw;\n\treturn 130.0 * dot(m, g);\n}\n\n// ----------------------------------- 3D -------------------------------------\n\nfloat snoise(float3 v)\n{\n\tconst float2 C = float2(\n\t\t0.166666666666666667, // 1/6\n\t\t0.333333333333333333  // 1/3\n\t\t);\n\tconst float4 D = float4(0.0, 0.5, 1.0, 2.0);\n\n\t// First corner\n\tfloat3 i = floor(v + dot(v, C.yyy));\n\tfloat3 x0 = v - i + dot(i, C.xxx);\n\n\t// Other corners\n\tfloat3 g = step(x0.yzx, x0.xyz);\n\tfloat3 l = 1 - g;\n\tfloat3 i1 = min(g.xyz, l.zxy);\n\tfloat3 i2 = max(g.xyz, l.zxy);\n\n\tfloat3 x1 = x0 - i1 + C.xxx;\n\tfloat3 x2 = x0 - i2 + C.yyy; // 2.0*C.x = 1/3 = C.y\n\tfloat3 x3 = x0 - D.yyy;      // -1.0+3.0*C.x = -0.5 = -D.y\n\n\t\t\t\t\t\t\t\t // Permutations\n\ti = fmod(i, 289.0);\n\tfloat4 p = permute(\n\t\tpermute(\n\t\t\tpermute(\n\t\t\t\ti.z + float4(0.0, i1.z, i2.z, 1.0)\n\t\t\t\t) + i.y + float4(0.0, i1.y, i2.y, 1.0)\n\t\t\t) + i.x + float4(0.0, i1.x, i2.x, 1.0)\n\t\t);\n\n\t// Gradients: 7x7 points over a square, mapped onto an octahedron.\n\t// The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294)\n\tfloat n_ = 0.142857142857; // 1/7\n\tfloat3 ns = n_ * D.wyz - D.xzx;\n\n\tfloat4 j = p - 49.0 * floor(p * ns.z * ns.z); // mod(p,7*7)\n\n\tfloat4 x_ = floor(j * ns.z);\n\tfloat4 y_ = floor(j - 7.0 * x_); // mod(j,N)\n\n\tfloat4 x = x_ *ns.x + ns.yyyy;\n\tfloat4 y = y_ *ns.x + ns.yyyy;\n\tfloat4 h = 1.0 - abs(x) - abs(y);\n\n\tfloat4 b0 = float4(x.xy, y.xy);\n\tfloat4 b1 = float4(x.zw, y.zw);\n\n\t//float4 s0 = float4(lessThan(b0,0.0))*2.0 - 1.0;\n\t//float4 s1 = float4(lessThan(b1,0.0))*2.0 - 1.0;\n\tfloat4 s0 = floor(b0)*2.0 + 1.0;\n\tfloat4 s1 = floor(b1)*2.0 + 1.0;\n\tfloat4 sh = -step(h, 0.0);\n\n\tfloat4 a0 = b0.xzyw + s0.xzyw*sh.xxyy;\n\tfloat4 a1 = b1.xzyw + s1.xzyw*sh.zzww;\n\n\tfloat3 p0 = float3(a0.xy, h.x);\n\tfloat3 p1 = float3(a0.zw, h.y);\n\tfloat3 p2 = float3(a1.xy, h.z);\n\tfloat3 p3 = float3(a1.zw, h.w);\n\n\t//Normalise gradients\n\tfloat4 norm = taylorInvSqrt(float4(\n\t\tdot(p0, p0),\n\t\tdot(p1, p1),\n\t\tdot(p2, p2),\n\t\tdot(p3, p3)\n\t\t));\n\tp0 *= norm.x;\n\tp1 *= norm.y;\n\tp2 *= norm.z;\n\tp3 *= norm.w;\n\n\t// Mix final noise value\n\tfloat4 m = max(\n\t\t0.6 - float4(\n\t\t\tdot(x0, x0),\n\t\t\tdot(x1, x1),\n\t\t\tdot(x2, x2),\n\t\t\tdot(x3, x3)\n\t\t\t),\n\t\t0.0\n\t\t);\n\tm = m * m;\n\treturn 42.0 * dot(\n\t\tm*m,\n\t\tfloat4(\n\t\t\tdot(p0, x0),\n\t\t\tdot(p1, x1),\n\t\t\tdot(p2, x2),\n\t\t\tdot(p3, x3)\n\t\t\t)\n\t\t);\n}\n\n// ----------------------------------- 4D -------------------------------------\n\nfloat snoise(float4 v)\n{\n\tconst float4 C = float4(\n\t\t0.138196601125011, // (5 - sqrt(5))/20 G4\n\t\t0.276393202250021, // 2 * G4\n\t\t0.414589803375032, // 3 * G4\n\t\t-0.447213595499958  // -1 + 4 * G4\n\t\t);\n\n\t// First corner\n\tfloat4 i = floor(\n\t\tv +\n\t\tdot(\n\t\t\tv,\n\t\t\t0.309016994374947451 // (sqrt(5) - 1) / 4\n\t\t\t)\n\t\t);\n\tfloat4 x0 = v - i + dot(i, C.xxxx);\n\n\t// Other corners\n\n\t// Rank sorting originally contributed by Bill Licea-Kane, AMD (formerly ATI)\n\tfloat4 i0;\n\tfloat3 isX = step(x0.yzw, x0.xxx);\n\tfloat3 isYZ = step(x0.zww, x0.yyz);\n\ti0.x = isX.x + isX.y + isX.z;\n\ti0.yzw = 1.0 - isX;\n\ti0.y += isYZ.x + isYZ.y;\n\ti0.zw += 1.0 - isYZ.xy;\n\ti0.z += isYZ.z;\n\ti0.w += 1.0 - isYZ.z;\n\n\t// i0 now contains the unique values 0,1,2,3 in each channel\n\tfloat4 i3 = saturate(i0);\n\tfloat4 i2 = saturate(i0 - 1.0);\n\tfloat4 i1 = saturate(i0 - 2.0);\n\n\t//    x0 = x0 - 0.0 + 0.0 * C.xxxx\n\t//    x1 = x0 - i1  + 1.0 * C.xxxx\n\t//    x2 = x0 - i2  + 2.0 * C.xxxx\n\t//    x3 = x0 - i3  + 3.0 * C.xxxx\n\t//    x4 = x0 - 1.0 + 4.0 * C.xxxx\n\tfloat4 x1 = x0 - i1 + C.xxxx;\n\tfloat4 x2 = x0 - i2 + C.yyyy;\n\tfloat4 x3 = x0 - i3 + C.zzzz;\n\tfloat4 x4 = x0 + C.wwww;\n\n\t// Permutations\n\ti = fmod(i, 289.0);\n\tfloat j0 = permute(\n\t\tpermute(\n\t\t\tpermute(\n\t\t\t\tpermute(i.w) + i.z\n\t\t\t\t) + i.y\n\t\t\t) + i.x\n\t\t);\n\tfloat4 j1 = permute(\n\t\tpermute(\n\t\t\tpermute(\n\t\t\t\tpermute(\n\t\t\t\t\ti.w + float4(i1.w, i2.w, i3.w, 1.0)\n\t\t\t\t\t) + i.z + float4(i1.z, i2.z, i3.z, 1.0)\n\t\t\t\t) + i.y + float4(i1.y, i2.y, i3.y, 1.0)\n\t\t\t) + i.x + float4(i1.x, i2.x, i3.x, 1.0)\n\t\t);\n\n\t// Gradients: 7x7x6 points over a cube, mapped onto a 4-cross polytope\n\t// 7*7*6 = 294, which is close to the ring size 17*17 = 289.\n\tconst float4 ip = float4(\n\t\t0.003401360544217687075, // 1/294\n\t\t0.020408163265306122449, // 1/49\n\t\t0.142857142857142857143, // 1/7\n\t\t0.0\n\t\t);\n\n\tfloat4 p0 = grad4(j0, ip);\n\tfloat4 p1 = grad4(j1.x, ip);\n\tfloat4 p2 = grad4(j1.y, ip);\n\tfloat4 p3 = grad4(j1.z, ip);\n\tfloat4 p4 = grad4(j1.w, ip);\n\n\t// Normalise gradients\n\tfloat4 norm = taylorInvSqrt(float4(\n\t\tdot(p0, p0),\n\t\tdot(p1, p1),\n\t\tdot(p2, p2),\n\t\tdot(p3, p3)\n\t\t));\n\tp0 *= norm.x;\n\tp1 *= norm.y;\n\tp2 *= norm.z;\n\tp3 *= norm.w;\n\tp4 *= taylorInvSqrt(dot(p4, p4));\n\n\t// Mix contributions from the five corners\n\tfloat3 m0 = max(\n\t\t0.6 - float3(\n\t\t\tdot(x0, x0),\n\t\t\tdot(x1, x1),\n\t\t\tdot(x2, x2)\n\t\t\t),\n\t\t0.0\n\t\t);\n\tfloat2 m1 = max(\n\t\t0.6 - float2(\n\t\t\tdot(x3, x3),\n\t\t\tdot(x4, x4)\n\t\t\t),\n\t\t0.0\n\t\t);\n\tm0 = m0 * m0;\n\tm1 = m1 * m1;\n\n\treturn 49.0 * (\n\t\tdot(\n\t\t\tm0*m0,\n\t\t\tfloat3(\n\t\t\t\tdot(p0, x0),\n\t\t\t\tdot(p1, x1),\n\t\t\t\tdot(p2, x2)\n\t\t\t\t)\n\t\t\t) + dot(\n\t\t\t\tm1*m1,\n\t\t\t\tfloat2(\n\t\t\t\t\tdot(p3, x3),\n\t\t\t\t\tdot(p4, x4)\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t);\n}\n\n\n\n//                 Credits from source glsl file:\n//\n// Description : Array and textureless GLSL 2D/3D/4D simplex\n//               noise functions.\n//      Author : Ian McEwan, Ashima Arts.\n//  Maintainer : ijm\n//     Lastmod : 20110822 (ijm)\n//     License : Copyright (C) 2011 Ashima Arts. All rights reserved.\n//               Distributed under the MIT License. See LICENSE file.\n//               https://github.com/ashima/webgl-noise\n//\n//\n//           The text from LICENSE file:\n//\n//\n// Copyright (C) 2011 by Ashima Arts (Simplex noise)\n// Copyright (C) 2011 by Stefan Gustavson (Classic noise)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n#endif"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/EVE/noiseSimplex.cginc.meta",
    "content": "fileFormatVersion: 2\nguid: 9ce3cf11b8f74594bb7b1e1dba03122d\ntimeCreated: 1470912310\nlicenseType: Free\nShaderImporter:\n  defaultTextures: []\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/EVE.meta",
    "content": "fileFormatVersion: 2\nguid: 47d9eecc3df4a854eaabab84609abb27\nfolderAsset: yes\ntimeCreated: 1460382633\nlicenseType: Free\nDefaultImporter:\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/EclipseCommon.cginc",
    "content": "﻿uniform float4 sunPosAndRadius;   //xyz sun pos w radius\nuniform float4x4 lightOccluders1; //array of light occluders\nuniform float4x4 lightOccluders2; //for each float4 xyz pos w radius\n\n//Source:   wikibooks.org/wiki/GLSL_Programming/Unity/Soft_Shadows_of_Spheres\n//I believe space engine also uses the same approach because the eclipses look the same ;)\nfloat getEclipseShadow(float3 worldPos, float3 worldLightPos,float3 occluderSpherePosition,\n\tfloat3 occluderSphereRadius, float3 lightSourceRadius)\t\t\n{\t\t\t\t\t\t\t\t\t\t\t\n\tfloat3 lightDirection = float3(worldLightPos - worldPos);\n\tfloat3 lightDistance = length(lightDirection);\n\tlightDirection = lightDirection / lightDistance;\n\n\t// computation of level of shadowing w  \n\tfloat3 sphereDirection = float3(occluderSpherePosition - worldPos);  //occluder planet\n\tfloat sphereDistance = length(sphereDirection);\n\tsphereDirection = sphereDirection / sphereDistance;\n\n\tfloat dd = lightDistance * (asin(min(1.0, length(cross(lightDirection, sphereDirection)))) \n\t\t- asin(min(1.0, occluderSphereRadius / sphereDistance)));\n\n\tfloat w = smoothstep(-1.0, 1.0, -dd / lightSourceRadius);\n\tw = w * smoothstep(0.0, 0.2, dot(lightDirection, sphereDirection));\n\n\treturn (1-w);\n}\n\ninline float getEclipseShadows(float3 worldPos, float4x4 lightOccludersmatrix)\n{\n\tfloat eclipseShadow = 1.0;\n\tfor (int i=0; i<4; ++i)\n\t{\n\t\tUNITY_BRANCH\n\t\tif (lightOccludersmatrix[i].w > 0)\n\t\t{\n\t\t\teclipseShadow*= getEclipseShadow(worldPos, sunPosAndRadius.xyz,lightOccludersmatrix[i].xyz,lightOccludersmatrix[i].w, sunPosAndRadius.w);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn eclipseShadow;\n}\n\n\ninline float getEclipseShadows(float3 worldPos)\n{\n\treturn (getEclipseShadows(worldPos, lightOccluders1) * getEclipseShadows(worldPos, lightOccluders2));\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/EclipseCommon.cginc.meta",
    "content": "fileFormatVersion: 2\nguid: 97f2c862ef7ea1d4fa3423506b5cf0ff\ntimeCreated: 1552766346\nlicenseType: Free\nShaderImporter:\n  defaultTextures: []\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/IntersectCommon.cginc",
    "content": "﻿#pragma once\n\nfloat3 LinePlaneIntersection(float3 linePoint, float3 lineVec, float3 planeNormal, float3 planePoint, out float parallel)\n{\n\tfloat tlength;\n\tfloat dotNumerator;\n\tfloat dotDenominator;\n\n\tfloat3 intersectVector;\n\tfloat3 intersection = 0.0;\n\n\t//calculate the distance between the linePoint and the line-plane intersection point\n\tdotNumerator = dot((planePoint - linePoint), planeNormal);\n\tdotDenominator = dot(lineVec, planeNormal);\n\n\t//line and plane are not parallel\n\tif(dotDenominator != 0.0f)\n\t{\n\t\ttlength =  dotNumerator / dotDenominator;\n\t\tintersection= (tlength > 0.0) ? linePoint + normalize(lineVec) * (tlength) : linePoint;\n\t\tparallel = 0.0;\n\t}\n\telse\n\t{\n\t\tparallel = 1.0;\n\t}\n\n\treturn intersection;\n}\n\n//works from outside only\n//p1 starting point, d look direction, p3 is the sphere center\nfloat intersectSphereOutside(float3 p1, float3 d, float3 p3, float r) {\n\n\tfloat a = dot(d, d);\n\tfloat b = 2.0 * dot(d, p1 - p3);\n\tfloat c = dot(p3, p3) + dot(p1, p1) - 2.0 * dot(p3, p1) - r * r;\n\n\tfloat test = b * b - 4.0 * a * c;\n\n\tfloat u = (test < 0) ? -1.0 : (-b - sqrt(test)) / (2.0 * a);\n\n\treturn u;\n}\n\n//works from inside and outside\n//p1 starting point, d look direction, p3 is the sphere center\nfloat intersectSphereInside(float3 p1, float3 d, float3 p3, float r)\n{\n\tfloat a = dot(d, d);\n\tfloat b = 2.0 * dot(d, p1 - p3);\n\tfloat c = dot(p3, p3) + dot(p1, p1) - 2.0 * dot(p3, p1) - r*r;\n\n\tfloat test = b*b - 4.0*a*c;\n\n\tif (test<0)\n\t{\n\t\treturn -1.0;\n\t}\n\n\tfloat u = (-b - sqrt(test)) / (2.0 * a);\n\n\tu = (u < 0) ? (-b + sqrt(test)) / (2.0 * a) : u;\n\n\treturn u;\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/IntersectCommon.cginc.meta",
    "content": "fileFormatVersion: 2\nguid: b4c60b58ddb35c749ad94bd8b5b83168\nShaderImporter:\n  externalObjects: {}\n  defaultTextures: []\n  nonModifiableTextures: []\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Misc.meta",
    "content": "fileFormatVersion: 2\nguid: 24f430bcb0b5b8046adfc8065bffc5c9\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/Caustics/0042-underwater-beach-sand-texture-seamless.jpg.meta",
    "content": "fileFormatVersion: 2\nguid: a9126848c43c4dd499da39a90664dd73\nTextureImporter:\n  internalIDToNameTable: []\n  externalObjects: {}\n  serializedVersion: 10\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 1\n    sRGBTexture: 1\n    linearTexture: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapsPreserveCoverage: 0\n    alphaTestReferenceValue: 0.5\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: 0.25\n    normalMapFilter: 0\n  isReadable: 0\n  streamingMipmaps: 0\n  streamingMipmapsPriority: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 6\n  cubemapConvolution: 0\n  seamlessCubemap: 0\n  textureFormat: 1\n  maxTextureSize: 2048\n  textureSettings:\n    serializedVersion: 2\n    filterMode: -1\n    aniso: -1\n    mipBias: -100\n    wrapU: -1\n    wrapV: -1\n    wrapW: -1\n  nPOTScale: 1\n  lightmap: 0\n  compressionQuality: 50\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: 0.5, y: 0.5}\n  spritePixelsToUnits: 100\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spriteGenerateFallbackPhysicsShape: 1\n  alphaUsage: 1\n  alphaIsTransparency: 0\n  spriteTessellationDetail: -1\n  textureType: 0\n  textureShape: 1\n  singleChannelComponent: 0\n  maxTextureSizeSet: 0\n  compressionQualitySet: 0\n  textureFormatSet: 0\n  platformSettings:\n  - serializedVersion: 3\n    buildTarget: DefaultTexturePlatform\n    maxTextureSize: 2048\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  spriteSheet:\n    serializedVersion: 2\n    sprites: []\n    outline: []\n    physicsShape: []\n    bones: []\n    spriteID: \n    internalID: 0\n    vertices: []\n    indices: \n    edges: []\n    weights: []\n    secondaryTextures: []\n  spritePackingTag: \n  pSDRemoveMatte: 0\n  pSDShowRemoveMatteOption: 0\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/Caustics/CausticsFinal.png.meta",
    "content": "fileFormatVersion: 2\nguid: 3c731404613599947b4b4559797a5168\nTextureImporter:\n  internalIDToNameTable: []\n  externalObjects: {}\n  serializedVersion: 10\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 1\n    sRGBTexture: 1\n    linearTexture: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapsPreserveCoverage: 0\n    alphaTestReferenceValue: 0.5\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: 0.25\n    normalMapFilter: 0\n  isReadable: 0\n  streamingMipmaps: 0\n  streamingMipmapsPriority: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 6\n  cubemapConvolution: 0\n  seamlessCubemap: 0\n  textureFormat: 1\n  maxTextureSize: 2048\n  textureSettings:\n    serializedVersion: 2\n    filterMode: -1\n    aniso: -1\n    mipBias: -100\n    wrapU: -1\n    wrapV: -1\n    wrapW: -1\n  nPOTScale: 1\n  lightmap: 0\n  compressionQuality: 50\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: 0.5, y: 0.5}\n  spritePixelsToUnits: 100\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spriteGenerateFallbackPhysicsShape: 1\n  alphaUsage: 1\n  alphaIsTransparency: 0\n  spriteTessellationDetail: -1\n  textureType: 0\n  textureShape: 1\n  singleChannelComponent: 0\n  maxTextureSizeSet: 0\n  compressionQualitySet: 0\n  textureFormatSet: 0\n  platformSettings:\n  - serializedVersion: 3\n    buildTarget: DefaultTexturePlatform\n    maxTextureSize: 2048\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  spriteSheet:\n    serializedVersion: 2\n    sprites: []\n    outline: []\n    physicsShape: []\n    bones: []\n    spriteID: \n    internalID: 0\n    vertices: []\n    indices: \n    edges: []\n    weights: []\n    secondaryTextures: []\n  spritePackingTag: \n  pSDRemoveMatte: 0\n  pSDShowRemoveMatteOption: 0\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/Caustics/CausticsGodrays.mat.meta",
    "content": "fileFormatVersion: 2\nguid: 89e0061781af2da4d938cac6c7381fdc\nNativeFormatImporter:\n  externalObjects: {}\n  mainObjectFileID: 0\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/Caustics/CausticsGodraysRaymarch.shader",
    "content": "﻿Shader \"Scatterer/CausticsGodraysRaymarch\"\n{\n\tProperties\n\t{\n\t\t_CausticsTexture (\"_CausticsTexture\", 2D) = \"\" {}\n\t\tlayer1Scale (\"Layer 1 scale\", Vector) = (1.0101,1.0101,0)\n\t\tlayer1Speed (\"Layer 1 speed\", Vector) = (0.05123,0.05123,0)\n\t\tlayer2Scale (\"Layer 2 scale\", Vector) = (1.235487,1.235487,0)\n\t\tlayer2Speed (\"Layer 2 speed\", Vector) = (0.074872,0.074872,0)\n\t}\n\n\tSubShader\n\t{\n\t\tPass\n\t\t{\n\t\t\tZTest On\n\t\t\tZWrite Off\n\n\t\t\tBlend SrcAlpha OneMinusSrcAlpha\n\n\t\t\tCGPROGRAM\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\t\t\t#pragma target 3.0\n\n\t\t\t#pragma multi_compile SPHERE_PLANET FLAT_PLANET\n\n\t\t\t#include \"UnityCG.cginc\"\n\t\t\t#include \"Lighting.cginc\"\t\t\n\t\t\t#include \"AutoLight.cginc\"\n\t\t\t#include \"../OceanShadows.cginc\"\n\t\t\t#include \"../../CommonAtmosphere.cginc\"\n\n\t\t\tfloat4x4 CameraToWorld;\n\t\t\tfloat4x4 WorldToLight;\n\n\t\t\tfloat3 LightDir;\n\t\t\tfloat3 PlanetOrigin;\n\t\t\tfloat oceanRadius;\n\t\t\tfloat transparencyDepth;\n\t\t\tfloat lightRaysStrength;\n\n\t\t\tsampler2D _CausticsTexture;\n\n\t\t\tfloat2 layer1Scale;\n\t\t\tfloat2 layer1Speed;\n\n\t\t\tfloat2 layer2Scale;\n\t\t\tfloat2 layer2Speed;\n\n\t\t\tfloat causticsBlurDepth;\n\n\t\t\tfloat warpTime;\n\n\t\t\tsampler2D ScattererDownscaledDepth;\n\t\t\tfloat4 ScattererDownscaledDepth_TexelSize;\n\n\t\t\tstruct v2f\n\t\t\t{\n\t\t\t\tfloat4 pos : SV_POSITION;\n\t\t\t\tfloat2 uv : TEXCOORD0;\n\t\t\t\tfloat4 screenPos : TEXCOORD1;\n\n\t\t\t};\n\t\t\tv2f vert (appdata_base v)\n\t\t\t{\n\t\t\t\tv2f o;\n\t\t\t\to.pos = UnityObjectToClipPos(v.vertex);\n\t\t\t\to.uv  = ComputeNonStereoScreenPos(o.pos);\n\t\t\t\to.screenPos = ComputeScreenPos(o.pos);\n\n\t\t\t\treturn o;\n\t\t\t}\n\n\t\t\tsampler2D _MainTex;\n\n\t\t\tfloat4 frag (v2f IN) : SV_Target\n\t\t\t{\n\t\t\t\t// blur caustics the farther we are from surface\n\t\t\t\tfloat blurFactor = 0.0;\n\t\t\t\tfloat time = _Time.y;\n\t\t\t\ttime = (warpTime == 0.0) ? time : warpTime;\n\n\t\t\t\tfloat totalCaustics = 0;\n\t\t\t\tfloat currentDistance = 0;\n\n\t\t\t\tfloat3 worldPosition = _WorldSpaceCameraPos;\n\n\t\t\t\tfloat2 uv = IN.screenPos.xy/IN.screenPos.w;\n\t\t\t\tfloat zdepth =  tex2Dlod(ScattererDownscaledDepth, float4(uv,0.0,0.0));\n#ifdef SHADER_API_D3D11  //#if defined(UNITY_REVERSED_Z)\n\t\t\t\tzdepth = 1 - zdepth;\n#endif\n\t\t\t\tfloat4 clipPos = float4(uv, zdepth, 1.0);\n\t\t\t\tclipPos.xyz = 2.0f * clipPos.xyz - 1.0f;\n\t\t\t\tfloat4 camPos = mul(unity_CameraInvProjection, clipPos);\n\n\t\t\t\tfloat4 fragWorldPos = mul(CameraToWorld,camPos);\n\t\t\t\tfragWorldPos/=fragWorldPos.w;\n\n\t\t\t\tfloat3 viewDir = normalize(fragWorldPos.xyz - worldPosition);\n\n\t\t\t\tfloat maxDistance = intersectSphereInside (worldPosition, viewDir, PlanetOrigin, oceanRadius);\n\t\t\t\tmaxDistance = min(maxDistance, length(camPos.xyz / camPos.w));\n\t\t\t\tmaxDistance = min(maxDistance, transparencyDepth * 2.0);\n\n\t\t\t\tfloat dotLight = dot(viewDir,-LightDir);\n\t\t\t\tdotLight=pow(abs(dotLight),40) * sign(dotLight);\n\t\t\t\tfloat boostFactor = (dotLight<0.0) ? -0.0085 : 0.005 ;\n\n\t\t\t\tfloat GRID_SIZE = 8;\n\t\t\t\tfloat GRID_SIZE_SQR_RCP = (1.0/(GRID_SIZE*GRID_SIZE));\n\t\t\t\tfloat stepSize = 0.2; //maybe change this to 0.007?\n\t\t\t\t// Calculate the offsets on the ray according to the interleaved sampling pattern\n\t\t\t\tfloat2 interleavedPos = fmod( float2(IN.pos.x, ScattererDownscaledDepth_TexelSize.w - IN.pos.y), GRID_SIZE );\n\t\t\t\tfloat rayStartOffset = ( interleavedPos.y * GRID_SIZE + interleavedPos.x ) * ( stepSize * GRID_SIZE_SQR_RCP ) ;\n\n\t\t\t\tworldPosition+=(0.1+rayStartOffset)*viewDir;\n\n\t\t\t\tfloat fadeOut = 1.0;\n#ifdef SPHERE_PLANET\n\t\t\t\tfloat underwaterDepth = max(oceanRadius - length(worldPosition - PlanetOrigin), 0.0);\n\t\t\t\tblurFactor = lerp(0.0,5.0,underwaterDepth/causticsBlurDepth);\n\n\t\t\t\tfadeOut = smoothstep(0.0,0.4,1.0-(underwaterDepth/causticsBlurDepth)); //fade them out starting from last 40% of causticsBlurDepth\n#else\n\t\t\t\tblurFactor = lerp(0.0,5.0,worldPosition.y/30.0);\n#endif\n\n\t\t\t\tfloat2 layer1Offset = layer1Speed * float2(time,time);\n\t\t\t\tfloat2 layer2Offset = layer2Speed * float2(time,time);\n\n\t\t\t\tfor (int i=0;i<150;i++)\n\t\t\t\t{\t\n\t\t\t\t\tfloat2 uvCookie = mul(WorldToLight, float4(worldPosition, 1)).xy;\n\n\t\t\t\t\tfloat2 uvSample1 = layer1Scale * uvCookie + layer1Offset;\n\t\t\t\t\tfloat2 uvSample2 = layer2Scale * uvCookie + layer2Offset;\n\n\t\t\t\t\tfloat causticsSample1 = tex2Dlod(_CausticsTexture,float4(uvSample1,0.0,blurFactor)).r;\n\t\t\t\t\tfloat causticsSample2 = tex2Dlod(_CausticsTexture,float4(uvSample2,0.0,blurFactor)).r;\n\n\t\t\t\t\tfloat caustics = 0.01*lightRaysStrength*min(causticsSample1,causticsSample2);\n\n\t\t\t\t\tfloat4 clipPos = mul(UNITY_MATRIX_VP,float4(worldPosition,1.0));\n\t\t\t\t\tfloat4 screenPos = ComputeScreenPos(clipPos);\n\t\t\t\t\tfloat shadowTerm = getOceanHardShadow(float4(worldPosition,1.0),-screenPos.z);\n\n\t\t\t\t\ttotalCaustics+=(1.0-totalCaustics)*caustics*shadowTerm;\n\t\t\t\t\tfloat increment = 0.2 + boostFactor*i*dotLight;   //variable step size, boost when looking towards light source or direction to make it look like it's properly coming from infinity\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\tcurrentDistance+=increment;\n\t\t\t\t\tworldPosition+=viewDir*increment;\n//\n\t\t\t\t\tif (currentDistance > maxDistance)\n\t\t\t\t\t{\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\ttotalCaustics*=fadeOut;\n\n\t\t\t\treturn float4(totalCaustics,totalCaustics,totalCaustics,1.0);\n\t\t\t}\n\t\t\tENDCG\n\t\t}\n\t}\n\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/Caustics/CausticsGodraysRaymarch.shader.meta",
    "content": "fileFormatVersion: 2\nguid: 44df73535c7a760458518e95391dbfdc\nShaderImporter:\n  externalObjects: {}\n  defaultTextures: []\n  nonModifiableTextures: []\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/Caustics/CausticsOcclusion.shader",
    "content": "﻿// Upgrade NOTE: replaced '_LightMatrix0' with 'unity_WorldToLight'\n\nShader \"Scatterer/CausticsOcclusion\"\n{\n    Properties\n    {\n    \t_CausticsTexture (\"_CausticsTexture\", 2D) = \"\" {}\n    \tlayer1Scale (\"Layer 1 scale\", Vector) = (1.0101,1.0101,0)\n    \tlayer1Speed (\"Layer 1 speed\", Vector) = (0.05123,0.05123,0)\n    \tlayer2Scale (\"Layer 2 scale\", Vector) = (1.235487,1.235487,0)\n    \tlayer2Speed (\"Layer 2 speed\", Vector) = (0.074872,0.074872,0)\n    \tcausticsMultiply (\"causticsMultiply\", Float) = 1\n    \tcausticsMinBrightness (\"causticsMinBrightness\", Float) = 0.1\n    }\n\n\tSubShader\n\t{\n\t\tPass\n\t\t{\n\t\t\tCull Back ZWrite Off ZTest Off\n\t\t\tBlendOp Min //take the minimum so existing shadows that are not completely at zero are respected\n\n\t\t\tCGPROGRAM\n\t\t\t#include \"UnityCG.cginc\"\n\t\t\t#include \"Lighting.cginc\"\n\t\t\t#include \"../../DepthCommon.cginc\"\n\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\t\t\t#pragma target 3.0\n\t\t\t#pragma multi_compile SPHERE_PLANET FLAT_PLANET\n\n\t\t\tfloat4x4 CameraToWorld;\n\t\t\tfloat4x4 WorldToLight;\n\n\t\t\tfloat3 PlanetOrigin;\n\t\t\tfloat oceanRadius;\n\n\t\t\tsampler2D _CausticsTexture;\n\n\t\t\tfloat2 layer1Scale;\n\t\t\tfloat2 layer1Speed;\n\n\t\t\tfloat2 layer2Scale;\n\t\t\tfloat2 layer2Speed;\n\n\t\t\tfloat causticsMultiply;\n\t\t\tfloat causticsMinBrightness;\n\t\t\tfloat causticsBlurDepth;\n\n\t\t\tfloat warpTime;\n\n\t\t\tstruct v2f \n\t\t\t{\n    \t\t\tfloat4  pos : SV_POSITION;\n    \t\t\tfloat2  uv : TEXCOORD0;\n\t\t\t};\n\n\t\t\tv2f vert(appdata_base v)\n\t\t\t{\n    \t\t\tv2f OUT;\n    \t\t\tOUT.pos = UnityObjectToClipPos(v.vertex);\n\t\t\tOUT.uv = ComputeScreenPos(OUT.pos);\n\n    \t\t\treturn OUT;\n\t\t\t}\n\n\t\t\tfixed4 frag (v2f i) : SV_Target\n\t\t\t{\n\t\t\t\tfloat zdepth = tex2Dlod(_CameraDepthTexture, float4(i.uv,0,0));\n\n#if SHADER_API_D3D11 || SHADER_API_D3D || SHADER_API_D3D12\n\t\t\t\tif (zdepth == 0.0) {discard;}\n#else\n\t\t\t\tif (zdepth == 1.0) {discard;}\n#endif\n\n\t\t\t\tfloat3 worldPos = getPreciseWorldPosFromDepth(i.uv, zdepth, CameraToWorld);\n\n\t\t\t\t// blur caustics the farther we are from texture\n\t\t\t\tfloat blurFactor = 0.0;\n\t\t\t\tfloat time = _Time.y;\n\n#ifdef SPHERE_PLANET\n\t\t\t\tfloat underwaterDepth = max(oceanRadius - length(worldPos - PlanetOrigin), 0.0);\n\t\t\t\tblurFactor = lerp(0.0,5.0,underwaterDepth/causticsBlurDepth);\n\t\t\t\ttime = (warpTime == 0.0) ? time : warpTime;\n#else\n\t\t\t\tblurFactor = lerp(0.0,5.0,-worldPos.y/30.0);\n#endif\n\n\t\t\t\tfloat2 uvCookie = mul(WorldToLight, float4(worldPos.xyz, 1)).xy;\n\n    \t\t\t\tfloat2 uvSample1 = layer1Scale * uvCookie + layer1Speed * float2(time,time);\n\t\t\t\tfloat2 uvSample2 = layer2Scale * uvCookie + layer2Speed * float2(time,time);\n\n\t\t\t\tfloat causticsSample1 = tex2Dbias(_CausticsTexture,float4(uvSample1,0.0,blurFactor)).r;\n\t\t\t\tfloat causticsSample2 = tex2Dbias(_CausticsTexture,float4(uvSample2,0.0,blurFactor)).r;\n\n\t\t\t\tfloat caustics = causticsMultiply*min(causticsSample1,causticsSample2)+causticsMinBrightness;\n#ifdef SPHERE_PLANET\n\t\t\t\tcaustics = lerp (1.0, caustics, clamp(underwaterDepth/1.5f, 0.0, 1.0)); //fade caustics in over the first meter and half of depth\n#endif\n\t\t\t\treturn float4(caustics,caustics,caustics,1.0);\n\t\t\t}\n\t\t\tENDCG\n\t\t}\n\t}\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/Caustics/CausticsOcclusion.shader.meta",
    "content": "fileFormatVersion: 2\nguid: 9c9e5198af35eb74d8c5d84a5194b184\nShaderImporter:\n  externalObjects: {}\n  defaultTextures: []\n  nonModifiableTextures: []\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/Caustics/CausticsScene.unity.meta",
    "content": "fileFormatVersion: 2\nguid: a4cac3a64ff3a4540bbabd58e2d7c8b2\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/Caustics/CausticsShadowMask.mat.meta",
    "content": "fileFormatVersion: 2\nguid: 43ad7f10b8cb01a4ca1b57eff53b024c\nNativeFormatImporter:\n  externalObjects: {}\n  mainObjectFileID: 0\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/Caustics/CompositeCausticsGodrays.shader",
    "content": "﻿Shader \"Scatterer/CompositeCausticsGodrays\"\n{\n\tProperties{\n\t}\n\n\tSubShader{\n\t\tTags { \"Queue\"=\"Transparent+2\" \"IgnoreProjector\"=\"True\" \"RenderType\"=\"Transparent\"}\n\t\tPass {\n\t\t\tBlend OneMinusDstColor One //softAdditive\n\t\t\tCGPROGRAM\n\t\t\t#pragma target 3.0\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\n\t\t\t#include\"UnityCG.cginc\"\n\n\t\t\tuniform sampler2D LightRaysTexture;\n\n\t\t\tuniform sampler2D _CameraDepthTexture;\n\t\t\tfloat4 _CameraDepthTexture_TexelSize;\n\n\t\t\tuniform sampler2D ScattererDownscaledDepth;\n\t\t\tfloat4 ScattererDownscaledDepth_TexelSize;\n\n\t\t\tuniform float3 _sunColor; //already calculated sun extinction or color\n\t\t\tuniform float3 _Underwater_Color;\n\n\t\t\tstruct appdata_t {\n\t\t\t\tfloat4 vertex : POSITION;\n\t\t\t\tfloat2 uv: TEXCOORD0;\n\t\t\t};\n\n\t\t\tstruct v2f {\n\t\t\t\tfloat4 pos : SV_POSITION;\n\t\t\t\tfloat2 uv : TEXCOORD0;\n\t\t\t};\n\n\t\t\tv2f vert(appdata_t v)\n\t\t\t{\n\t\t\t\tv2f o;\n\t\t\t\to.pos = UnityObjectToClipPos(v.vertex);\n\t\t\t\to.uv = v.uv;\n\n\t\t\t\treturn o;\n\t\t\t}\n\n\n\t\t\tfloat4 frag(v2f i) : COLOR\n\t\t\t{\n\t\t\t\tfloat color = tex2D(LightRaysTexture, i.uv).r;\n\t\t\t\treturn float4(_Underwater_Color * _sunColor * color,1.0);\n\t\t\t}\n\n\t\t\tENDCG\n\t\t}\n\t}\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/Caustics/CompositeCausticsGodrays.shader.meta",
    "content": "fileFormatVersion: 2\nguid: c91c0b6ea03975b419e4cb285a69a10d\nShaderImporter:\n  externalObjects: {}\n  defaultTextures: []\n  nonModifiableTextures: []\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/Caustics/ModulateShadowMask.cs",
    "content": "﻿using UnityEngine;\nusing UnityEngine.Rendering;\nusing System.Collections.Generic;\nusing System;\n\npublic class ModulateShadowMask : MonoBehaviour\n{\n\n\tprivate CommandBuffer m_Buffer;\n\tprivate Light m_Light;\n\tprivate Camera fakeCamera;\n\n\t[SerializeField]\n\tprivate Material m_ShadowMaskModulateMaterial;\n\n\tpublic ModulateShadowMask ()\n\t{\n\n\t}\n\n\tpublic void Awake()\n\t{\n\t\tm_ShadowMaskModulateMaterial.DisableKeyword (\"SPHERE_PLANET\");\n\t\tm_ShadowMaskModulateMaterial.EnableKeyword (\"FLAT_PLANET\");\n\n\t\tm_Buffer = new CommandBuffer();\n\t\tm_Buffer.name = \"ScreenspaceShadowMaskmodulate\";\n\n\t\tm_Buffer.Blit (null, BuiltinRenderTextureType.CurrentActive, m_ShadowMaskModulateMaterial);\n\n\t\tm_Light = GetComponent<Light>();\n\t\tm_Light.AddCommandBuffer (LightEvent.AfterScreenspaceMask, m_Buffer);\n\n\t}\n\t\t\n\tpublic void Update()\n\t{\n\t\tm_ShadowMaskModulateMaterial.SetMatrix (\"CameraToWorld\", Camera.main.cameraToWorldMatrix);\n\t\tm_ShadowMaskModulateMaterial.SetMatrix (\"WorldToLight\", m_Light.gameObject.transform.worldToLocalMatrix); //may look like it doesn't work in the editor, ie using the editor Camera\n\t}\n\n\tpublic void OnDestroy ()\n\t{\n\t\tm_Light.RemoveCommandBuffer (LightEvent.AfterScreenspaceMask, m_Buffer);\n\t}\n}\n\n\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/Caustics/ModulateShadowMask.cs.meta",
    "content": "fileFormatVersion: 2\nguid: eb1eda9941f181549a0b626e36a4dd26\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/Caustics/SeaFloor.mat.meta",
    "content": "fileFormatVersion: 2\nguid: 8cc83bff6b39f3d44af0de8320999144\nNativeFormatImporter:\n  externalObjects: {}\n  mainObjectFileID: 2100000\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/Caustics/WhiteTexture.png.meta",
    "content": "fileFormatVersion: 2\nguid: 6b152d671c864bf41bbcc096f5a7567c\nTextureImporter:\n  internalIDToNameTable: []\n  externalObjects: {}\n  serializedVersion: 10\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 1\n    sRGBTexture: 1\n    linearTexture: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapsPreserveCoverage: 0\n    alphaTestReferenceValue: 0.5\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: 0.25\n    normalMapFilter: 0\n  isReadable: 0\n  streamingMipmaps: 0\n  streamingMipmapsPriority: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 6\n  cubemapConvolution: 0\n  seamlessCubemap: 0\n  textureFormat: 1\n  maxTextureSize: 2048\n  textureSettings:\n    serializedVersion: 2\n    filterMode: -1\n    aniso: -1\n    mipBias: -100\n    wrapU: -1\n    wrapV: -1\n    wrapW: -1\n  nPOTScale: 1\n  lightmap: 0\n  compressionQuality: 50\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: 0.5, y: 0.5}\n  spritePixelsToUnits: 100\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spriteGenerateFallbackPhysicsShape: 1\n  alphaUsage: 1\n  alphaIsTransparency: 0\n  spriteTessellationDetail: -1\n  textureType: 0\n  textureShape: 1\n  singleChannelComponent: 0\n  maxTextureSizeSet: 0\n  compressionQualitySet: 0\n  textureFormatSet: 0\n  platformSettings:\n  - serializedVersion: 3\n    buildTarget: DefaultTexturePlatform\n    maxTextureSize: 2048\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  spriteSheet:\n    serializedVersion: 2\n    sprites: []\n    outline: []\n    physicsShape: []\n    bones: []\n    spriteID: \n    internalID: 0\n    vertices: []\n    indices: \n    edges: []\n    weights: []\n    secondaryTextures: []\n  spritePackingTag: \n  pSDRemoveMatte: 0\n  pSDShowRemoveMatteOption: 0\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/Caustics.meta",
    "content": "fileFormatVersion: 2\nguid: 94412382cf909c843b9a46a8f6b364f4\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/FindHeights.compute",
    "content": "﻿#pragma kernel CSMain\n\nfloat4 _Ocean_Choppyness;\nfloat4 _Ocean_GridSizes;\n\nsampler2D _Ocean_Map0;\nsampler2D _Ocean_Map3;\nsampler2D _Ocean_Map4;\n\nRWStructuredBuffer<float2> positions;\nRWStructuredBuffer<float> result;\n\nfloat SampleHeight(float2 oceanPos)\n{\n\tfloat height = 0;\n\n\theight += tex2Dlod(_Ocean_Map0, float4(oceanPos / _Ocean_GridSizes.x,0.0, 0.0) ).x;\n\theight += tex2Dlod(_Ocean_Map0, float4(oceanPos / _Ocean_GridSizes.y,0.0, 0.0) ).y;\n\theight += tex2Dlod(_Ocean_Map0, float4(oceanPos / _Ocean_GridSizes.z,0.0, 0.0) ).z;\n\theight += tex2Dlod(_Ocean_Map0, float4(oceanPos / _Ocean_GridSizes.w,0.0, 0.0) ).w;\n\n\treturn height;\n}\n\nfloat2 SampleDisplacement(float2 oceanPos)\n{\n\tfloat2 displacement = 0;\n\n\tdisplacement += _Ocean_Choppyness.x * tex2Dlod(_Ocean_Map3, float4(oceanPos / _Ocean_GridSizes.x,0.0, 0.0) ).xy;\n\tdisplacement += _Ocean_Choppyness.y * tex2Dlod(_Ocean_Map3, float4(oceanPos / _Ocean_GridSizes.y,0.0, 0.0) ).zw;\n\tdisplacement += _Ocean_Choppyness.z * tex2Dlod(_Ocean_Map4, float4(oceanPos / _Ocean_GridSizes.z,0.0, 0.0) ).xy;\n\tdisplacement += _Ocean_Choppyness.w * tex2Dlod(_Ocean_Map4, float4(oceanPos / _Ocean_GridSizes.w,0.0, 0.0) ).zw;\n\n\treturn displacement;\n}\n\n//Essentially a search method to find which point on the ocean is displaced sideways to end up at our part's position, so we can sample the correct height\n//Thanks to Scrawk (Justin Hawkins) for the tip\n//Original source: Water technology of uncharted p.126 https://www.gdcvault.com/play/1015309/Water-Technology-of\n[numthreads(1,1,1)]\nvoid CSMain (uint id : SV_DispatchThreadID)\n{\n    float precisionRequired = 0.02;\n\n\tfloat2 currentPosition = positions[id];\n\tfloat2 displacement = SampleDisplacement (currentPosition);\n\tfloat2 resultingPosition = currentPosition + displacement;\n\n\tfor (int i = 0; i < 40; i++)\n\t{\n\t\tif (length(resultingPosition - positions[id]) <= precisionRequired)\n\t\t\tbreak;\n\n\t\tfloat2 newPosition = currentPosition - (resultingPosition - positions[id]);\n\t\tfloat2 newDisplacement = SampleDisplacement (newPosition);\n\t\tfloat2 newResultingPosition = newPosition + newDisplacement;\n\n\t\tcurrentPosition = newPosition;\n\t\tresultingPosition = newResultingPosition;\n\t}\n\n\tresult[id] = SampleHeight(currentPosition);\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/FindHeights.compute.meta",
    "content": "fileFormatVersion: 2\nguid: 45322b284be6baf43a273a61abba527d\nComputeShaderImporter:\n  externalObjects: {}\n  currentAPIMask: 4\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/Fourier.shader",
    "content": "// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'\n\nShader \"Scatterer/Fourier\" \n{\n\tCGINCLUDE\n\n\t#include \"UnityCG.cginc\"\n\n\tuniform sampler2D _ReadBuffer0, _ReadBuffer1, _ReadBuffer2;\n\tuniform sampler2D _ButterFlyLookUp;\n\tuniform float _Size;\n\n\tstruct v2f \n\t{\n\t\tfloat4  pos : SV_POSITION;\n\t\tfloat2  uv : TEXCOORD0;\n\t};\n\n\tstruct f2a_1\n\t{\n\t\tfloat4 col0 : COLOR0;\n\t};\n\n\tstruct f2a_2\n\t{\n\t\tfloat4 col0 : COLOR0;\n\t\tfloat4 col1 : COLOR1;\n\t};\n\n\tstruct f2a_3\n\t{\n\t\tfloat4 col0 : COLOR0;\n\t\tfloat4 col1 : COLOR1;\n\t\tfloat4 col2 : COLOR2;\n\t};\n\n\tv2f vert(appdata_base v)\n\t{\n\t\tv2f OUT;\n\t\tOUT.pos = UnityObjectToClipPos(v.vertex);\n\t\tOUT.uv = v.texcoord;\n\t\treturn OUT;\n\t}\n\n\t//Performs two FFTs on two complex numbers packed in a vector4\n\tfloat4 FFT(float2 w, float4 input1, float4 input2) \n\t{\n\t\tfloat rx = w.x * input2.x - w.y * input2.y;\n\t\tfloat ry = w.y * input2.x + w.x * input2.y;\n\t\tfloat rz = w.x * input2.z - w.y * input2.w;\n\t\tfloat rw = w.y * input2.z + w.x * input2.w;\n\n\t\treturn input1 + float4(rx,ry,rz,rw);\n\t}\n\n\tf2a_1 fragX_1(v2f IN)\n\t{\n\t\tfloat4 lookUp = tex2D(_ButterFlyLookUp, float2(IN.uv.x, 0));\n\n\t\tlookUp.xyz *= 255.0;\n\t\tlookUp.xy /= _Size-1.0;\n\n\t\tfloat PI = 3.1415926;\n\t\tfloat2 w = float2(cos(2.0*PI*lookUp.z/_Size), sin(2.0*PI*lookUp.z/_Size));\n\n\t\tif(lookUp.w > 0.5) w *= -1.0;\n\n\t\tf2a_1 OUT;\n\n\t\tfloat2 uv1 = float2(lookUp.x, IN.uv.y);\n\t\tfloat2 uv2 = float2(lookUp.y, IN.uv.y);\n\n\t\tOUT.col0 = FFT(w, tex2D(_ReadBuffer0, uv1), tex2D(_ReadBuffer0, uv2));\n\n\t\treturn OUT;\n\t}\n\n\tf2a_1 fragY_1(v2f IN)\n\t{\n\t\tfloat4 lookUp = tex2D(_ButterFlyLookUp, float2(IN.uv.y, 0));\n\n\t\tlookUp.xyz *= 255.0;\n\t\tlookUp.xy /= _Size-1.0;\n\n\t\tfloat PI = 3.1415926;\n\t\tfloat2 w = float2(cos(2.0*PI*lookUp.z/_Size), sin(2.0*PI*lookUp.z/_Size));\n\n\t\tif(lookUp.w > 0.5) w *= -1.0;\n\n\t\tf2a_1 OUT;\n\n\t\tfloat2 uv1 = float2(IN.uv.x, lookUp.x);\n\t\tfloat2 uv2 = float2(IN.uv.x, lookUp.y);\n\n\t\tOUT.col0 = FFT(w, tex2D(_ReadBuffer0, uv1), tex2D(_ReadBuffer0, uv2));\n\n\t\treturn OUT;\n\t}\n\n\tf2a_2 fragX_2(v2f IN)\n\t{\n\t\tfloat4 lookUp = tex2D(_ButterFlyLookUp, float2(IN.uv.x, 0));\n\n\t\tlookUp.xyz *= 255.0;\n\t\tlookUp.xy /= _Size-1.0;\n\n\t\tfloat PI = 3.1415926;\n\t\tfloat2 w = float2(cos(2.0*PI*lookUp.z/_Size), sin(2.0*PI*lookUp.z/_Size));\n\n\t\tif(lookUp.w > 0.5) w *= -1.0;\n\n\t\tf2a_2 OUT;\n\n\t\tfloat2 uv1 = float2(lookUp.x, IN.uv.y);\n\t\tfloat2 uv2 = float2(lookUp.y, IN.uv.y);\n\n\t\tOUT.col0 = FFT(w, tex2D(_ReadBuffer0, uv1), tex2D(_ReadBuffer0, uv2));\n\t\tOUT.col1 = FFT(w, tex2D(_ReadBuffer1, uv1), tex2D(_ReadBuffer1, uv2));\n\n\t\treturn OUT;\n\t}\n\n\tf2a_2 fragY_2(v2f IN)\n\t{\n\t\tfloat4 lookUp = tex2D(_ButterFlyLookUp, float2(IN.uv.y, 0));\n\n\t\tlookUp.xyz *= 255.0;\n\t\tlookUp.xy /= _Size-1.0;\n\n\t\tfloat PI = 3.1415926;\n\t\tfloat2 w = float2(cos(2.0*PI*lookUp.z/_Size), sin(2.0*PI*lookUp.z/_Size));\n\n\t\tif(lookUp.w > 0.5) w *= -1.0;\n\n\t\tf2a_2 OUT;\n\n\t\tfloat2 uv1 = float2(IN.uv.x, lookUp.x);\n\t\tfloat2 uv2 = float2(IN.uv.x, lookUp.y);\n\n\t\tOUT.col0 = FFT(w, tex2D(_ReadBuffer0, uv1), tex2D(_ReadBuffer0, uv2));\n\t\tOUT.col1 = FFT(w, tex2D(_ReadBuffer1, uv1), tex2D(_ReadBuffer1, uv2));\n\n\t\treturn OUT;\n\t}\n\n\tf2a_3 fragX_3(v2f IN)\n\t{\n\t\tfloat4 lookUp = tex2D(_ButterFlyLookUp, float2(IN.uv.x, 0));\n\n\t\tlookUp.xyz *= 255.0;\n\t\tlookUp.xy /= _Size-1.0;\n\n\t\tfloat PI = 3.1415926;\n\t\tfloat2 w = float2(cos(2.0*PI*lookUp.z/_Size), sin(2.0*PI*lookUp.z/_Size));\n\n\t\tif(lookUp.w > 0.5) w *= -1.0;\n\n\t\tf2a_3 OUT;\n\n\t\tfloat2 uv1 = float2(lookUp.x, IN.uv.y);\n\t\tfloat2 uv2 = float2(lookUp.y, IN.uv.y);\n\n\t\tOUT.col0 = FFT(w, tex2D(_ReadBuffer0, uv1), tex2D(_ReadBuffer0, uv2));\n\t\tOUT.col1 = FFT(w, tex2D(_ReadBuffer1, uv1), tex2D(_ReadBuffer1, uv2));\n\t\tOUT.col2 = FFT(w, tex2D(_ReadBuffer2, uv1), tex2D(_ReadBuffer2, uv2));\n\n\t\treturn OUT;\n\t}\n\n\tf2a_3 fragY_3(v2f IN)\n\t{\n\t\tfloat4 lookUp = tex2D(_ButterFlyLookUp, float2(IN.uv.y, 0));\n\n\t\tlookUp.xyz *= 255.0;\n\t\tlookUp.xy /= _Size-1.0;\n\n\t\tfloat PI = 3.1415926;\n\t\tfloat2 w = float2(cos(2.0*PI*lookUp.z/_Size), sin(2.0*PI*lookUp.z/_Size));\n\n\t\tif(lookUp.w > 0.5) w *= -1.0;\n\n\t\tf2a_3 OUT;\n\n\t\tfloat2 uv1 = float2(IN.uv.x, lookUp.x);\n\t\tfloat2 uv2 = float2(IN.uv.x, lookUp.y);\n\n\t\tOUT.col0 = FFT(w, tex2D(_ReadBuffer0, uv1), tex2D(_ReadBuffer0, uv2));\n\t\tOUT.col1 = FFT(w, tex2D(_ReadBuffer1, uv1), tex2D(_ReadBuffer1, uv2));\n\t\tOUT.col2 = FFT(w, tex2D(_ReadBuffer2, uv1), tex2D(_ReadBuffer2, uv2));\n\n\t\treturn OUT;\n\t}\n\n\tENDCG\n\n\tSubShader \n\t{\n\t\tPass \n\t\t{\n\t\t\tZTest Always Cull Off ZWrite Off\n\t\t\tFog { Mode off }\n\n\t\t\tCGPROGRAM\n\t\t\t#pragma target 3.0\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment fragX_1\n\t\t\tENDCG\n\t\t}\n\n\t\tPass \n\t\t{\n\t\t\tZTest Always Cull Off ZWrite Off\n\t\t\tFog { Mode off }\n\n\t\t\tCGPROGRAM\n\t\t\t#pragma target 3.0\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment fragY_1\n\t\t\tENDCG\n\t\t}\n\n\t\tPass \n\t\t{\n\t\t\tZTest Always Cull Off ZWrite Off\n\t\t\tFog { Mode off }\n\n\t\t\tCGPROGRAM\n\t\t\t#pragma target 3.0\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment fragX_2\n\t\t\tENDCG\n\t\t}\n\n\t\tPass \n\t\t{\n\t\t\tZTest Always Cull Off ZWrite Off\n\t\t\tFog { Mode off }\n\n\t\t\tCGPROGRAM\n\t\t\t#pragma target 3.0\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment fragY_2\n\t\t\tENDCG\n\t\t}\n\n\t\tPass \n\t\t{\n\t\t\tZTest Always Cull Off ZWrite Off\n\t\t\tFog { Mode off }\n\n\t\t\tCGPROGRAM\n\t\t\t#pragma target 3.0\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment fragX_3\n\t\t\tENDCG\n\t\t}\n\n\t\tPass \n\t\t{\n\t\t\tZTest Always Cull Off ZWrite Off\n\t\t\tFog { Mode off }\n\n\t\t\tCGPROGRAM\n\t\t\t#pragma target 3.0\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment fragY_3\n\t\t\tENDCG\n\t\t}\n\t}\n\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/Fourier.shader.meta",
    "content": "fileFormatVersion: 2\nguid: 6a44d0f20e3f6cd45881a44134574169\ntimeCreated: 1459689856\nlicenseType: Free\nShaderImporter:\n  defaultTextures: []\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/InitDisplacement.shader",
    "content": "// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'\n\n\nShader \"Proland/Ocean/InitDisplacement\" \n{\n\tSubShader \n\t{\n\t\tPass \n\t\t{\n\t\t\tZTest Always Cull Off ZWrite Off\n\t\t\tFog { Mode off }\n\n\t\t\tCGPROGRAM\n\t\t\t#include \"UnityCG.cginc\"\n\t\t\t#pragma target 3.0\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\n\t\t\tuniform sampler2D _Buffer1;\n\t\t\tuniform sampler2D _Buffer2;\n\t\t\tuniform float4 _InverseGridSizes;\n\n\t\t\tstruct v2f \n\t\t\t{\n\t\t\t\tfloat4  pos : SV_POSITION;\n\t\t\t\tfloat2  uv : TEXCOORD0;\n\t\t\t};\n\n\t\t\tstruct f2a\n\t\t\t{\n\t\t\t\tfloat4 col0 : COLOR0;\n\t\t\t\tfloat4 col1 : COLOR1;\n\t\t\t};\n\n\t\t\tv2f vert(appdata_base v)\n\t\t\t{\n\t\t\t\tv2f OUT;\n\t\t\t\tOUT.pos = UnityObjectToClipPos(v.vertex);\n\t\t\t\tOUT.uv = v.texcoord;\n\t\t\t\treturn OUT;\n\t\t\t}\n\n\t\t\tf2a frag(v2f IN)\n\t\t\t{ \n\t\t\t\tfloat2 uv = IN.uv.xy;\n\n\t\t\t\tfloat2 st;\n\t\t\t\tst.x = uv.x > 0.5f ? uv.x - 1.0f : uv.x;\n\t\t\t\tst.y = uv.y > 0.5f ? uv.y - 1.0f : uv.y;\n\n\t\t\t\tfloat2 k1 = st * _InverseGridSizes.x;\n\t\t\t\tfloat2 k2 = st * _InverseGridSizes.y;\n\t\t\t\tfloat2 k3 = st * _InverseGridSizes.z;\n\t\t\t\tfloat2 k4 = st * _InverseGridSizes.w;\n\n\t\t\t\tfloat K1 = length(k1);\n\t\t\t\tfloat K2 = length(k2);\n\t\t\t\tfloat K3 = length(k3);\n\t\t\t\tfloat K4 = length(k4);\n\n\t\t\t\tfloat IK1 = K1 == 0.0 ? 0.0 : 1.0 / K1;\n\t\t\t\tfloat IK2 = K2 == 0.0 ? 0.0 : 1.0 / K2;\n\t\t\t\tfloat IK3 = K3 == 0.0 ? 0.0 : 1.0 / K3;\n\t\t\t\tfloat IK4 = K4 == 0.0 ? 0.0 : 1.0 / K4;\n\n\t\t\t\tf2a OUT;\n\n\t\t\t\tOUT.col0 = tex2D(_Buffer1, IN.uv) * float4(IK1, IK1, IK2, IK2);\n\t\t\t\tOUT.col1 = tex2D(_Buffer2, IN.uv) * float4(IK3, IK3, IK4, IK4);\n\n\t\t\t\treturn OUT;\n\t\t\t}\n\n\t\t\tENDCG\n\n\t\t}\n\t}\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/InitDisplacement.shader.meta",
    "content": "fileFormatVersion: 2\nguid: 4f809c227a3cfde4bbb9482dc1814105\ntimeCreated: 1459689457\nlicenseType: Free\nShaderImporter:\n  defaultTextures: []\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/InitJacobians.shader",
    "content": "// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'\n\n\nShader \"Proland/Ocean/InitJacobians\" \n{\n\tSubShader \n\t{\n\t\tPass \n\t\t{\n\t\t\tZTest Always Cull Off ZWrite Off\n\t\t\tFog { Mode off }\n\n\t\t\tCGPROGRAM\n\t\t\t#include \"UnityCG.cginc\"\n\t\t\t#pragma target 3.0\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\n\t\t\tuniform sampler2D _Spectrum01;\n\t\t\tuniform sampler2D _Spectrum23;\n\t\t\tuniform sampler2D _WTable;\n\t\t\tuniform float4 _Offset;\n\t\t\tuniform float4 _InverseGridSizes;\n\t\t\tuniform float _T;\n\n\t\t\tstruct v2f \n\t\t\t{\n\t\t\t\tfloat4  pos : SV_POSITION;\n\t\t\t\tfloat2  uv : TEXCOORD0;\n\t\t\t};\n\n\t\t\tstruct f2a\n\t\t\t{\n\t\t\t\tfloat4 col0 : COLOR0;\n\t\t\t\tfloat4 col1 : COLOR1;\n\t\t\t\tfloat4 col2 : COLOR2;\n\t\t\t};\n\n\t\t\tv2f vert(appdata_base v)\n\t\t\t{\n\t\t\t\tv2f OUT;\n\t\t\t\tOUT.pos = UnityObjectToClipPos(v.vertex);\n\t\t\t\tOUT.uv = v.texcoord;\n\t\t\t\treturn OUT;\n\t\t\t}\n\n\t\t\tfloat2 GetSpectrum(float w, float2 s0, float2 s0c) \n\t\t\t{\n\t\t\t\tfloat c = cos(w*_T);\n\t\t\t\tfloat s = sin(w*_T);\n\t\t\t\treturn float2((s0.x + s0c.x) * c - (s0.y + s0c.y) * s, (s0.x - s0c.x) * s + (s0.y - s0c.y) * c);\n\t\t\t}\n\n\t\t\tfloat2 COMPLEX(float2 z) \n\t\t\t{\n\t\t\t\treturn float2(-z.y, z.x); // returns i times z (complex number)\n\t\t\t}\n\n\t\t\tf2a frag(v2f IN)\n\t\t\t{ \n\t\t\t\tfloat2 uv = IN.uv.xy;\n\n\t\t\t\tfloat2 st;\n\t\t\t\tst.x = uv.x > 0.5f ? uv.x - 1.0f : uv.x;\n\t\t\t\tst.y = uv.y > 0.5f ? uv.y - 1.0f : uv.y;\n\n\t\t\t\tfloat4 s12 = tex2D(_Spectrum01, uv);\n\t\t\t\tfloat4 s12c = tex2D(_Spectrum01, _Offset.xy-uv);\n\t\t\t\tfloat4 s34 = tex2D(_Spectrum23, uv);\n\t\t\t\tfloat4 s34c = tex2D(_Spectrum23, _Offset.xy-uv);\n\n\t\t\t\tfloat2 k1 = st * _InverseGridSizes.x;\n\t\t\t\tfloat2 k2 = st * _InverseGridSizes.y;\n\t\t\t\tfloat2 k3 = st * _InverseGridSizes.z;\n\t\t\t\tfloat2 k4 = st * _InverseGridSizes.w;\n\n\t\t\t\tfloat K1 = length(k1);\n\t\t\t\tfloat K2 = length(k2);\n\t\t\t\tfloat K3 = length(k3);\n\t\t\t\tfloat K4 = length(k4);\n\n\t\t\t\tfloat IK1 = K1 == 0.0 ? 0.0 : 1.0 / K1;\n\t\t\t\tfloat IK2 = K2 == 0.0 ? 0.0 : 1.0 / K2;\n\t\t\t\tfloat IK3 = K3 == 0.0 ? 0.0 : 1.0 / K3;\n\t\t\t\tfloat IK4 = K4 == 0.0 ? 0.0 : 1.0 / K4;\n\n\t\t\t\tfloat4 w = tex2D(_WTable, uv);\n\n\t\t\t\tfloat2 h1 = GetSpectrum(w.x, s12.xy, s12c.xy);\n\t\t\t\tfloat2 h2 = GetSpectrum(w.y, s12.zw, s12c.zw);\n\t\t\t\tfloat2 h3 = GetSpectrum(w.z, s34.xy, s34c.xy);\n\t\t\t\tfloat2 h4 = GetSpectrum(w.w, s34.zw, s34c.zw);\n\n\t\t\t\t/// Jacobians\n\t\t\t\tfloat4 IK = float4(IK1,IK2,IK3,IK4);\n\t\t\t\tfloat2 k1Squared = k1*k1;\n\t\t\t\tfloat2 k2Squared = k2*k2;\n\t\t\t\tfloat2 k3Squared = k3*k3;\n\t\t\t\tfloat2 k4Squared = k4*k4;\n\n\t\t\t\t// 5: d(Dx(X,t))/dx \tTes01 eq30\n\t\t\t\t// 6: d(Dy(X,t))/dy \tTes01 eq30\n\t\t\t\t// 7: d(Dx(X,t))/dy \tTes01 eq30\n\t\t\t\tfloat4 tmp = float4(h1.x, h2.x, h3.x, h4.x);\n\n\t\t\t\tf2a OUT;\n\n\t\t\t\tOUT.col0 = -tmp * (float4(k1Squared.x, k2Squared.x, k3Squared.x, k4Squared.x) * IK);\n\t\t\t\tOUT.col1 = -tmp * (float4(k1Squared.y, k2Squared.y, k3Squared.y, k4Squared.y) * IK);\n\t\t\t\tOUT.col2 = -tmp * (float4(k1.x*k1.y, k2.x*k2.y, k3.x*k3.y, k4.x*k4.y) * IK);\n\n\t\t\t\treturn OUT;\n\t\t\t}\n\n\t\t\tENDCG\n\n\t\t}\n\t}\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/InitJacobians.shader.meta",
    "content": "fileFormatVersion: 2\nguid: f8f889eee05c15349bc81eeb0883357d\ntimeCreated: 1459689457\nlicenseType: Free\nShaderImporter:\n  defaultTextures: []\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/InitSpectrum.shader",
    "content": "// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'\n\n\nShader \"Proland/Ocean/InitSpectrum\" \n{\n\tSubShader \n\t{\n\t\tPass \n\t\t{\n\t\t\tZTest Always Cull Off ZWrite Off\n\t\t\tFog { Mode off }\n\n\t\t\tCGPROGRAM\n\t\t\t#include \"UnityCG.cginc\"\n\t\t\t#pragma target 3.0\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\n\t\t\tuniform sampler2D _Spectrum01;\n\t\t\tuniform sampler2D _Spectrum23;\n\t\t\tuniform sampler2D _WTable;\n\t\t\tuniform float4 _Offset;\n\t\t\tuniform float4 _InverseGridSizes;\n\t\t\tuniform float _T;\n\n\t\t\tstruct v2f \n\t\t\t{\n\t\t\t\tfloat4  pos : SV_POSITION;\n\t\t\t\tfloat2  uv : TEXCOORD0;\n\t\t\t};\n\n\t\t\tstruct f2a\n\t\t\t{\n\t\t\t\tfloat4 col0 : COLOR0;\n\t\t\t\tfloat4 col1 : COLOR1;\n\t\t\t\tfloat4 col2 : COLOR2;\n\t\t\t};\n\n\t\t\tv2f vert(appdata_base v)\n\t\t\t{\n\t\t\t\tv2f OUT;\n\t\t\t\tOUT.pos = UnityObjectToClipPos(v.vertex);\n\t\t\t\tOUT.uv = v.texcoord;\n\t\t\t\treturn OUT;\n\t\t\t}\n\n\t\t\tfloat2 GetSpectrum(float w, float2 s0, float2 s0c) \n\t\t\t{\n\t\t\t\tfloat c = cos(w*_T);\n\t\t\t\tfloat s = sin(w*_T);\n\t\t\t\treturn float2((s0.x + s0c.x) * c - (s0.y + s0c.y) * s, (s0.x - s0c.x) * s + (s0.y - s0c.y) * c);\n\t\t\t}\n\n\t\t\tfloat2 COMPLEX(float2 z) \n\t\t\t{\n\t\t\t\treturn float2(-z.y, z.x); // returns i times z (complex number)\n\t\t\t}\n\n\t\t\tf2a frag(v2f IN)\n\t\t\t{ \n\t\t\t\tfloat2 uv = IN.uv.xy;\n\n\t\t\t\tfloat2 st;\n\t\t\t\tst.x = uv.x > 0.5f ? uv.x - 1.0f : uv.x;\n\t\t\t\tst.y = uv.y > 0.5f ? uv.y - 1.0f : uv.y;\n\n\t\t\t\tfloat4 s12 = tex2D(_Spectrum01, uv);\n\t\t\t\tfloat4 s12c = tex2D(_Spectrum01, _Offset.xy-uv);\n\t\t\t\tfloat4 s34 = tex2D(_Spectrum23, uv);\n\t\t\t\tfloat4 s34c = tex2D(_Spectrum23, _Offset.xy-uv);\n\n\t\t\t\tfloat2 k1 = st * _InverseGridSizes.x;\n\t\t\t\tfloat2 k2 = st * _InverseGridSizes.y;\n\t\t\t\tfloat2 k3 = st * _InverseGridSizes.z;\n\t\t\t\tfloat2 k4 = st * _InverseGridSizes.w;\n\n\t\t\t\tfloat4 w = tex2D(_WTable, uv);\n\n\t\t\t\tfloat2 h1 = GetSpectrum(w.x, s12.xy, s12c.xy);\n\t\t\t\tfloat2 h2 = GetSpectrum(w.y, s12.zw, s12c.zw);\n\t\t\t\tfloat2 h3 = GetSpectrum(w.z, s34.xy, s34c.xy);\n\t\t\t\tfloat2 h4 = GetSpectrum(w.w, s34.zw, s34c.zw);\n\n\t\t\t\tfloat2 h12 = h1 + COMPLEX(h2);\n\t\t\t\tfloat2 h34 = h3 + COMPLEX(h4);\n\n\t\t\t\tfloat2 n1 = COMPLEX(k1.x * h1) - k1.y * h1;\n\t\t\t\tfloat2 n2 = COMPLEX(k2.x * h2) - k2.y * h2;\n\t\t\t\tfloat2 n3 = COMPLEX(k3.x * h3) - k3.y * h3;\n\t\t\t\tfloat2 n4 = COMPLEX(k4.x * h4) - k4.y * h4;\n\n\t\t\t\tf2a OUT;\n\n\t\t\t\tOUT.col0 = float4(h12, h34);\n\t\t\t\tOUT.col1 = float4(n1, n2);\n\t\t\t\tOUT.col2 = float4(n3, n4);\n\n\t\t\t\treturn OUT;\n\t\t\t}\n\n\t\t\tENDCG\n\n\t\t}\n\t}\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/InitSpectrum.shader.meta",
    "content": "fileFormatVersion: 2\nguid: 212a65848ed53294788b2731538c9d66\ntimeCreated: 1459689457\nlicenseType: Free\nShaderImporter:\n  defaultTextures: []\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/InvisibleOcean.shader",
    "content": "﻿Shader \"Scatterer/invisible\" \n{\n\tSubShader \n\t{\n\t\tTags {\"Queue\" = \"Transparent\" \"IgnoreProjector\"=\"True\" \"RenderType\"=\"InvOcean\"}\n\n\t\tPass \n\t\t{\n\t\t\tZWrite Off\n\t\t\tZTest on\n\n\t\t\tBlend SrcAlpha OneMinusSrcAlpha\n\n\n\t\t\tCGPROGRAM\n\t\t\t#include \"UnityCG.cginc\"\n\t\t\t#pragma target 3.0\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\t\t\t#pragma glsl\n\n\t\t\tstruct v2f \n\t\t\t{\n\t\t\t\tfloat4 pos : SV_POSITION;\n\t\t\t};\n\n\t\t\tv2f vert(appdata_base v)\n\t\t\t{\n\t\t\t\tv2f OUT;\n\t\t\t\tOUT.pos = float4(2.0, 2.0, 2.0, 1.0); //outside clip space => cull vertex\n\t\t\t\treturn OUT;\n\t\t\t}\n\n\n\t\t\tfloat4 frag(v2f IN) : COLOR\n\t\t\t{\n\t\t\t\treturn float4(0.0,0.0,0.0,0.0);\t\t\t\n\t\t\t}\n\n\t\t\tENDCG\n\t\t}\n\t}\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/InvisibleOcean.shader.meta",
    "content": "fileFormatVersion: 2\nguid: f32e959de7955be41a4af6dac2f75b09\ntimeCreated: 1499371576\nlicenseType: Free\nShaderImporter:\n  defaultTextures: []\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/OceanBRDF.cginc",
    "content": "/*\n * Proland: a procedural landscape rendering library.\n * Copyright (c) 2008-2011 INRIA\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\n */\n\n/*\n* Proland is distributed under a dual-license scheme.\n* You can obtain a specific license from Inria: proland-licensing@inria.fr.\n*/\n\n/*\n* Authors: Eric Bruneton, Antoine Begault, Guillaume Piolat.\n* Modified and ported to Unity by Justin Hawkins 2014\n*/\n\n#if !defined (M_PI)\n#define M_PI 3.141592657\n#endif\n\nfloat MeanFresnel(float cosThetaV, float sigmaV) {\n\treturn pow(1.0 - cosThetaV, 5.0 * exp(-2.69 * sigmaV)) / (1.0 + 22.7 * pow(sigmaV, 1.5));\n}\n\nfloat MeanFresnel(float3 V, float3 N, float sigmaSq) {\n\treturn MeanFresnel(dot(V, N), sqrt(sigmaSq));\n}\n\n// L, V, N in world space\nfloat ReflectedSunRadiance(float3 L, float3 V, float3 N, float sigmaSq) \n{\n\tfloat3 H = normalize(L + V);\n\n\tfloat hn = dot(H, N);\n\tfloat p = exp(-2.0 * ((1.0 - hn * hn) / sigmaSq) / (1.0 + hn)) / (4.0 * M_PI * sigmaSq);\n\n\tfloat c = 1.0 - dot(V, H);\n\tfloat c2 = c * c;\n\tfloat fresnel = 0.02 + 0.98 * c2 * c2 * c;\n\n\tfloat zL = dot(L, N);\n\tfloat zV = dot(V, N);\n\tzL = max(zL,0.01);\n\tzV = max(zV,0.01);\n\n\t// brdf times cos(thetaL)\n\treturn zL <= 0.0 ? 0.0 : max(fresnel * p * sqrt(abs(zL / zV)), 0.0);\n}\n\nfloat2 U(float2 zeta, float3 V) \n{\n\tfloat3 F = normalize(float3(-zeta, 1.0));\n\tfloat3 R = 2.0 * dot(F, V) * F - V;\n\treturn -R.xy / (1.0 + R.z);\n}\n\n// V, N, sunDir in world space\nfloat3 ReflectedSkyRadiance(sampler2D skymap, float3 V, float3 N, float sigmaSq, float3 sunDir) \n{\n\tfloat3 result = float3(0,0,0);\n\n\tfloat2 zeta0 = -N.xy / N.z;\n\tfloat2 tau0 = U(zeta0, V);\n\n\tconst float n = 1.0 / 1.1;\n\tfloat2 JX = (U(zeta0 + float2(0.01, 0.0), V) - tau0) / 0.01 * n * sqrt(sigmaSq);\n\tfloat2 JY = (U(zeta0 + float2(0.0, 0.01), V) - tau0) / 0.01 * n * sqrt(sigmaSq);\n\n\tresult = tex2D(skymap, (tau0 * 0.5 / 1.1 + 0.5), JX, JY).rgb;\n\n\tresult *= 0.02 + 0.98 * MeanFresnel(V, N, sigmaSq);\n\treturn result;\n}\n\n\nfloat RefractedSeaRadiance(float3 V, float3 N, float sigmaSq) {\n\treturn 0.98 * (1.0 - MeanFresnel(V, N, sigmaSq));\n}\n\nfloat erf(float x) \n{\n\tfloat a  = 0.140012;\n\tfloat x2 = x*x;\n\tfloat ax2 = a*x2;\n\treturn sign(x) * sqrt( 1.0 - exp(-x2*(4.0/M_PI + ax2)/(1.0 + ax2)) );\n}\n\nfloat WhitecapCoverage(float epsilon, float mu, float sigma2) {\n\treturn 0.5*erf((0.5*sqrt(2.0)*(epsilon-mu)*(1.0/sqrt(sigma2)))) + 0.5;\n}\n\nfloat3 OceanRadiance(float3 L, float3 V, float3 N, float sigmaSq, float3 sunL, float3 skyE, float3 seaColor) \n{\n\tfloat F = MeanFresnel(V, N, sigmaSq);\n\tfloat3 Lsun = ReflectedSunRadiance(L, V, N, sigmaSq) * sunL;\n\tfloat3 Lsky = skyE * F / M_PI;\n\tfloat3 Lsea = (1.0 - F) * seaColor * skyE / M_PI;\n\treturn Lsun + Lsky + Lsea;\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/OceanBRDF.cginc.meta",
    "content": "fileFormatVersion: 2\nguid: 907dff89ca8c76745b031725757e5f8b\nShaderImporter:\n  defaultTextures: []\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/OceanDisplacement3.cginc",
    "content": "/*\n * Proland: a procedural landscape rendering library.\n * Copyright (c) 2008-2011 INRIA\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\n */\n\n/*\n* Proland is distributed under a dual-license scheme.\n* You can obtain a specific license from Inria: proland-licensing@inria.fr.\n*/\n\n/*\n* Authors: Eric Bruneton, Antoine Begault, Guillaume Piolat.\n* Modified and ported to Unity by Justin Hawkins 2014\n*/\n\nuniform float _Ocean_Radius;\n//uniform float3 _Ocean_Horizon1;\n//uniform float3 _Ocean_Horizon2;\nuniform float _Ocean_HeightOffset;\nuniform float3 _Ocean_CameraPos;\nuniform float4x4 _Ocean_OceanToCamera;\nuniform float4x4 _Ocean_CameraToOcean;\n\nuniform float3 sphereDir;\nuniform float cosTheta;\nuniform float sinTheta;\n\n\n// A glorified sphere intersect, with some code to snap above the horizon back to the horizon\n// Returns Position in ocean space\nfloat2 OceanPos(float4 vert, float4x4 stoc, out float t, out float3 cameraDir, out float3 oceanDir) \n{\n\tfloat h = _Ocean_CameraPos.z;\n\tfloat4 v = float4(vert.x, vert.y, 0.0, 1.0);\n\tcameraDir = normalize(mul(stoc, v).xyz); \t\t\t//Dir in camera space\n\n\tfloat3 n1= cross (sphereDir, cameraDir);\t\t\t//Normal to plane containing dir to planet and vertex viewdir\n\tfloat3 n2= normalize(cross (n1, sphereDir)); \t\t\t//upwards vector in plane space, plane containing CamO and cameraDir\n\n\tfloat3 hor=cosTheta*sphereDir+sinTheta*n2;\n\n\tcameraDir= ( (dot(n1,cross(hor,cameraDir)) >=0) && (h>=0)) ? hor : cameraDir ; //checking if viewdir is above horizon\n\t//This could probably be optimized\n\n\toceanDir = mul(_Ocean_CameraToOcean, float4(cameraDir, 0.0)).xyz;    \n\n\tfloat cz = _Ocean_CameraPos.z;\n\tfloat dz = oceanDir.z;\n\tfloat radius = _Ocean_Radius;\n\n\tfloat b = dz * (cz + radius);\n\tfloat c = cz * (cz + 2.0 * radius);\n\n#if !defined (UNDERWATER_ON)\n\tfloat tSphere = - b - sqrt(max(b * b - c, 0.02));\n#else\n\tfloat tSphere = - b + sqrt(max(b * b - c, 0.02));\n#endif\n\tfloat tApprox = - cz / dz * (1.0 + cz / (2.0 * radius) * (1.0 - dz * dz));\n\tt = abs((tApprox - tSphere) * dz) < 1.0 ? tApprox : tSphere;\n\n\n\treturn _Ocean_CameraPos.xy + t * oceanDir.xy;\n}\n\n\nfloat2 OceanPos(float4 vert, float4x4 stoc) \n{\n\tfloat t;\n\tfloat3 cameraDir;\n\tfloat3 oceanDir;\n\treturn OceanPos(vert, stoc, t, cameraDir, oceanDir);\n}\n\nfloat4 Tex2DGrad(sampler2D tex, float2 uv, float2 dx, float2 dy, float2 texSize)\n{\n\t//Sampling a texture by derivatives in unsupported in vert shaders in Unity but if you\n\t//can manually calculate the derivates you can reproduce its effect using tex2Dlod \n\tfloat2 px = texSize.x * dx;\n\tfloat2 py = texSize.y * dy;\n\tfloat lod = 0.5 * log2(max(dot(px, px), dot(py, py)));\n\treturn tex2Dlod(tex, float4(uv, 0, lod));\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/OceanDisplacement3.cginc.meta",
    "content": "fileFormatVersion: 2\nguid: 2ac6db96cd5bff048a79be0215503e16\nShaderImporter:\n  defaultTextures: []\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/OceanLight.cginc",
    "content": "//  Modified Light helpers for the ocean\n//  unlike in autolight.cginc, object2world can't be used in the case of the ocean\n//  the projection is instead done via other means\n//  the world position is passed instead of doing a mul(_Object2World, v.vertex) which gives the wrong result here\n\n\n#ifdef POINT\n//#define LIGHTING_COORDS(idx1,idx2) unityShadowCoord3 _LightCoord : TEXCOORD##idx1; SHADOW_COORDS(idx2)\n#define OCEAN_TRANSFER_VERTEX_TO_FRAGMENT(a) a._LightCoord = mul(unity_WorldToLight, worldPos).xyz; TRANSFER_SHADOW(a)\n//#define LIGHT_ATTENUATION(a)\t(tex2D(_LightTexture0, dot(a._LightCoord,a._LightCoord).rr).UNITY_ATTEN_CHANNEL * SHADOW_ATTENUATION(a))\n#endif\n\n#ifdef SPOT\n//#define LIGHTING_COORDS(idx1,idx2) unityShadowCoord4 _LightCoord : TEXCOORD##idx1; SHADOW_COORDS(idx2)\n#define OCEAN_TRANSFER_VERTEX_TO_FRAGMENT(a) a._LightCoord = mul(unity_WorldToLight, worldPos); TRANSFER_SHADOW(a)\n//#define LIGHT_ATTENUATION(a)\t( (a._LightCoord.z > 0) * UnitySpotCookie(a._LightCoord) * UnitySpotAttenuate(a._LightCoord.xyz) * SHADOW_ATTENUATION(a) )\n#endif\n\n#ifdef DIRECTIONAL\n//\t#define LIGHTING_COORDS(idx1,idx2) SHADOW_COORDS(idx1)\n\t#define OCEAN_TRANSFER_VERTEX_TO_FRAGMENT(a) TRANSFER_SHADOW(a)\n//\t#define LIGHT_ATTENUATION(a)\tSHADOW_ATTENUATION(a)\n#endif\n\n#ifdef POINT_COOKIE\n//#define LIGHTING_COORDS(idx1,idx2) unityShadowCoord3 _LightCoord : TEXCOORD##idx1; SHADOW_COORDS(idx2)\n#define OCEAN_TRANSFER_VERTEX_TO_FRAGMENT(a) a._LightCoord = mul(unity_WorldToLight, worldPos).xyz; TRANSFER_SHADOW(a)\n//#define LIGHT_ATTENUATION(a)\t(tex2D(_LightTextureB0, dot(a._LightCoord,a._LightCoord).rr).UNITY_ATTEN_CHANNEL * texCUBE(_LightTexture0, a._LightCoord).w * SHADOW_ATTENUATION(a))\n#endif\n\n#ifdef DIRECTIONAL_COOKIE\n//#define LIGHTING_COORDS(idx1,idx2) unityShadowCoord2 _LightCoord : TEXCOORD##idx1; SHADOW_COORDS(idx2)\n#define OCEAN_TRANSFER_VERTEX_TO_FRAGMENT(a) a._LightCoord = mul(unity_WorldToLight, worldPos).xy; TRANSFER_SHADOW(a)\n//#define LIGHT_ATTENUATION(a)\t(tex2D(_LightTexture0, a._LightCoord).w * SHADOW_ATTENUATION(a))\n#endif"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/OceanLight.cginc.meta",
    "content": "fileFormatVersion: 2\nguid: eafae18265a10964e97bb7c9c1601ef6\ntimeCreated: 1460511161\nlicenseType: Free\nShaderImporter:\n  defaultTextures: []\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/OceanShadows.cginc",
    "content": "﻿UNITY_DECLARE_SHADOWMAP(_ShadowMapTextureScatterer);\nfloat4 _ShadowMapTextureScatterer_TexelSize;\n\n#if SHADER_API_D3D11\n\t#define SHADOWS_SPLIT_SPHERES\n#endif\n\n#include \"../ShadowsCommon.cginc\"\n\n/**\n* PCF tent shadowmap filtering based on a 7x7 kernel (optimized with 16 taps)\n* Same as unity's but modified to use a different shadowmap identifier\n*/\nhalf ScattererSampleShadowmap_PCF7x7(float4 coord, float3 receiverPlaneDepthBias)\n{\n    half shadow = 1;\n\n    #ifndef SHADOWS_NATIVE\n        // when we don't have hardware PCF sampling, fallback to a simple 3x3 sampling with averaged results.\n        return UnitySampleShadowmap_PCF3x3NoHardwareSupport(coord, receiverPlaneDepthBias);\n    #endif\n\n    // tent base is 7x7 base thus covering from 49 to 64 texels, thus we need 16 bilinear PCF fetches\n    float2 tentCenterInTexelSpace = coord.xy * _ShadowMapTextureScatterer_TexelSize.zw;\n    float2 centerOfFetchesInTexelSpace = floor(tentCenterInTexelSpace + 0.5);\n    float2 offsetFromTentCenterToCenterOfFetches = tentCenterInTexelSpace - centerOfFetchesInTexelSpace;\n\n    // find the weight of each texel based on the area of a 45 degree slop tent above each of them.\n    float4 texelsWeightsU_A, texelsWeightsU_B;\n    float4 texelsWeightsV_A, texelsWeightsV_B;\n    _UnityInternalGetWeightPerTexel_7TexelsWideTriangleFilter(offsetFromTentCenterToCenterOfFetches.x, texelsWeightsU_A, texelsWeightsU_B);\n    _UnityInternalGetWeightPerTexel_7TexelsWideTriangleFilter(offsetFromTentCenterToCenterOfFetches.y, texelsWeightsV_A, texelsWeightsV_B);\n\n    // each fetch will cover a group of 2x2 texels, the weight of each group is the sum of the weights of the texels\n    float4 fetchesWeightsU = float4(texelsWeightsU_A.xz, texelsWeightsU_B.xz) + float4(texelsWeightsU_A.yw, texelsWeightsU_B.yw);\n    float4 fetchesWeightsV = float4(texelsWeightsV_A.xz, texelsWeightsV_B.xz) + float4(texelsWeightsV_A.yw, texelsWeightsV_B.yw);\n\n    // move the PCF bilinear fetches to respect texels weights\n    float4 fetchesOffsetsU = float4(texelsWeightsU_A.yw, texelsWeightsU_B.yw) / fetchesWeightsU.xyzw + float4(-3.5,-1.5,0.5,2.5);\n    float4 fetchesOffsetsV = float4(texelsWeightsV_A.yw, texelsWeightsV_B.yw) / fetchesWeightsV.xyzw + float4(-3.5,-1.5,0.5,2.5);\n    fetchesOffsetsU *= _ShadowMapTextureScatterer_TexelSize.xxxx;\n    fetchesOffsetsV *= _ShadowMapTextureScatterer_TexelSize.yyyy;\n\n    // fetch !\n    float2 bilinearFetchOrigin = centerOfFetchesInTexelSpace * _ShadowMapTextureScatterer_TexelSize.xy;\n    shadow  = fetchesWeightsU.x * fetchesWeightsV.x * UNITY_SAMPLE_SHADOW(_ShadowMapTextureScatterer, UnityCombineShadowcoordComponents(bilinearFetchOrigin, float2(fetchesOffsetsU.x, fetchesOffsetsV.x), coord.z, receiverPlaneDepthBias));\n    shadow += fetchesWeightsU.y * fetchesWeightsV.x * UNITY_SAMPLE_SHADOW(_ShadowMapTextureScatterer, UnityCombineShadowcoordComponents(bilinearFetchOrigin, float2(fetchesOffsetsU.y, fetchesOffsetsV.x), coord.z, receiverPlaneDepthBias));\n    shadow += fetchesWeightsU.z * fetchesWeightsV.x * UNITY_SAMPLE_SHADOW(_ShadowMapTextureScatterer, UnityCombineShadowcoordComponents(bilinearFetchOrigin, float2(fetchesOffsetsU.z, fetchesOffsetsV.x), coord.z, receiverPlaneDepthBias));\n    shadow += fetchesWeightsU.w * fetchesWeightsV.x * UNITY_SAMPLE_SHADOW(_ShadowMapTextureScatterer, UnityCombineShadowcoordComponents(bilinearFetchOrigin, float2(fetchesOffsetsU.w, fetchesOffsetsV.x), coord.z, receiverPlaneDepthBias));\n    shadow += fetchesWeightsU.x * fetchesWeightsV.y * UNITY_SAMPLE_SHADOW(_ShadowMapTextureScatterer, UnityCombineShadowcoordComponents(bilinearFetchOrigin, float2(fetchesOffsetsU.x, fetchesOffsetsV.y), coord.z, receiverPlaneDepthBias));\n    shadow += fetchesWeightsU.y * fetchesWeightsV.y * UNITY_SAMPLE_SHADOW(_ShadowMapTextureScatterer, UnityCombineShadowcoordComponents(bilinearFetchOrigin, float2(fetchesOffsetsU.y, fetchesOffsetsV.y), coord.z, receiverPlaneDepthBias));\n    shadow += fetchesWeightsU.z * fetchesWeightsV.y * UNITY_SAMPLE_SHADOW(_ShadowMapTextureScatterer, UnityCombineShadowcoordComponents(bilinearFetchOrigin, float2(fetchesOffsetsU.z, fetchesOffsetsV.y), coord.z, receiverPlaneDepthBias));\n    shadow += fetchesWeightsU.w * fetchesWeightsV.y * UNITY_SAMPLE_SHADOW(_ShadowMapTextureScatterer, UnityCombineShadowcoordComponents(bilinearFetchOrigin, float2(fetchesOffsetsU.w, fetchesOffsetsV.y), coord.z, receiverPlaneDepthBias));\n    shadow += fetchesWeightsU.x * fetchesWeightsV.z * UNITY_SAMPLE_SHADOW(_ShadowMapTextureScatterer, UnityCombineShadowcoordComponents(bilinearFetchOrigin, float2(fetchesOffsetsU.x, fetchesOffsetsV.z), coord.z, receiverPlaneDepthBias));\n    shadow += fetchesWeightsU.y * fetchesWeightsV.z * UNITY_SAMPLE_SHADOW(_ShadowMapTextureScatterer, UnityCombineShadowcoordComponents(bilinearFetchOrigin, float2(fetchesOffsetsU.y, fetchesOffsetsV.z), coord.z, receiverPlaneDepthBias));\n    shadow += fetchesWeightsU.z * fetchesWeightsV.z * UNITY_SAMPLE_SHADOW(_ShadowMapTextureScatterer, UnityCombineShadowcoordComponents(bilinearFetchOrigin, float2(fetchesOffsetsU.z, fetchesOffsetsV.z), coord.z, receiverPlaneDepthBias));\n    shadow += fetchesWeightsU.w * fetchesWeightsV.z * UNITY_SAMPLE_SHADOW(_ShadowMapTextureScatterer, UnityCombineShadowcoordComponents(bilinearFetchOrigin, float2(fetchesOffsetsU.w, fetchesOffsetsV.z), coord.z, receiverPlaneDepthBias));\n    shadow += fetchesWeightsU.x * fetchesWeightsV.w * UNITY_SAMPLE_SHADOW(_ShadowMapTextureScatterer, UnityCombineShadowcoordComponents(bilinearFetchOrigin, float2(fetchesOffsetsU.x, fetchesOffsetsV.w), coord.z, receiverPlaneDepthBias));\n    shadow += fetchesWeightsU.y * fetchesWeightsV.w * UNITY_SAMPLE_SHADOW(_ShadowMapTextureScatterer, UnityCombineShadowcoordComponents(bilinearFetchOrigin, float2(fetchesOffsetsU.y, fetchesOffsetsV.w), coord.z, receiverPlaneDepthBias));\n    shadow += fetchesWeightsU.z * fetchesWeightsV.w * UNITY_SAMPLE_SHADOW(_ShadowMapTextureScatterer, UnityCombineShadowcoordComponents(bilinearFetchOrigin, float2(fetchesOffsetsU.z, fetchesOffsetsV.w), coord.z, receiverPlaneDepthBias));\n    shadow += fetchesWeightsU.w * fetchesWeightsV.w * UNITY_SAMPLE_SHADOW(_ShadowMapTextureScatterer, UnityCombineShadowcoordComponents(bilinearFetchOrigin, float2(fetchesOffsetsU.w, fetchesOffsetsV.w), coord.z, receiverPlaneDepthBias));\n\n    return shadow;\n}\n\n/**\n *  Hard shadow\n *  Same as unity's, with the min strength/intensity removed\n */\nhalf getOceanHardShadow(float4 worldPos, float viewPosZ)\n{\n    fixed4 cascadeWeights = GET_CASCADE_WEIGHTS (worldPos, viewPosZ);\n    float4 shadowCoord = GET_SHADOW_COORDINATES(worldPos, cascadeWeights);\n\n    //1 tap hard shadow\n    fixed shadow = UNITY_SAMPLE_SHADOW(_ShadowMapTextureScatterer, shadowCoord);\n    //shadow = lerp(_LightShadowData.r, 1.0, shadow); //min strength/intensity, not used for ocean\n\n    fixed4 res = shadow;\n    return res;\n}\n\n\n/**\n *  Soft Shadow (SM 3.0)\n *  Same as unity's, but using a different shadowMap identifier\n *  And with the min strength/intensity removed\n */\nhalf getOceanSoftShadow(float4 worldPos, float viewPosZ)\n{\n\n    fixed4 cascadeWeights = GET_CASCADE_WEIGHTS (worldPos, viewPosZ);\n    float4 coord = GET_SHADOW_COORDINATES(worldPos, cascadeWeights);\n\n\n#if SHADER_API_D3D11\n    float3 receiverPlaneDepthBias = float3(0.001,0.001,0.001); //custom bias to fix issue with jittering shadows on d3d11 in 1.9, probably not necessary for ocean though\n#else\n\tfloat3 receiverPlaneDepthBias = 0.0;\n#endif\n\n\t//why is this slower than the ragular shadow? maybe change this to 3x3?\n    half shadow = ScattererSampleShadowmap_PCF7x7(coord, receiverPlaneDepthBias);\n    //shadow = lerp(_LightShadowData.r, 1.0f, shadow); //min strength/intensity, not used for ocean\n\n    // Blend between shadow cascades if enabled\n    //\n    // Not working yet with split spheres, and no need when 1 cascade\n#if UNITY_USE_CASCADE_BLENDING && !defined(SHADOWS_SPLIT_SPHERES) && !defined(SHADOWS_SINGLE_CASCADE)\n    half4 z4 = (float4(viewPosZ,viewPosZ,viewPosZ,viewPosZ) - _LightSplitsNear) / (_LightSplitsFar - _LightSplitsNear);\n    half alpha = dot(z4 * cascadeWeights, half4(1,1,1,1));\n\n\t//why is it slow? maybe remove this?\n    UNITY_BRANCH\n        if (alpha > 1 - UNITY_CASCADE_BLEND_DISTANCE)\n        {\n            // get alpha to 0..1 range over the blend distance\n            alpha = (alpha - (1 - UNITY_CASCADE_BLEND_DISTANCE)) / UNITY_CASCADE_BLEND_DISTANCE;\n\n            // sample next cascade\n            cascadeWeights = fixed4(0, cascadeWeights.xyz);\n            coord = GET_SHADOW_COORDINATES(worldPos, cascadeWeights);\n\n            half shadowNextCascade = UnitySampleShadowmap_PCF3x3(coord, receiverPlaneDepthBias);\n            //shadowNextCascade = lerp(_LightShadowData.r, 1.0f, shadowNextCascade); //min strength/intensity, not used for ocean\n            shadow = lerp(shadow, shadowNextCascade, alpha);\n        }\n#endif\n    return shadow;\n}\n\nhalf getOceanShadow(float4 worldPos, float viewPosZ)\n{\n\t//fade value\n\tfloat zDist = dot(_WorldSpaceCameraPos - worldPos, UNITY_MATRIX_V[2].xyz);\n\tfloat fadeDist = UnityComputeShadowFadeDistance(worldPos, zDist);\n\thalf  shadowFade = UnityComputeShadowFade(fadeDist);\n\n#if defined (OCEAN_SHADOWS_SOFT)\n\treturn lerp(getOceanSoftShadow(worldPos, viewPosZ),1.0,shadowFade);\n#elif defined (OCEAN_SHADOWS_HARD)\n\treturn lerp(getOceanHardShadow(worldPos, viewPosZ),1.0,shadowFade);\n#endif\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/OceanShadows.cginc.meta",
    "content": "fileFormatVersion: 2\nguid: e0cb37a014cdcb142af891772a27189c\ntimeCreated: 1545852000\nlicenseType: Free\nShaderImporter:\n  defaultTextures: []\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/OceanUtils.cginc",
    "content": "﻿uniform float refractionIndex;\nuniform float3 _Underwater_Color;\nuniform float3 _Ocean_Color;\nuniform float transparencyDepth;\nuniform float skyReflectionStrength;\n\nfloat3 ReflectedSky(float3 V, float3 N, float3 sunDir, float3 earthP)\n{\n\tfloat3 result = float3(0,0,0);\n\n\tfloat3 reflectedAngle=reflect(-V,N);\n\treflectedAngle.z=max(reflectedAngle.z,0.0);\t//hack to avoid unsightly black pixels from downwards reflections\n\tresult = SkyRadiance3(earthP,reflectedAngle, sunDir);\n\n\treturn result;\n}\n\n//TODO: check if can optimize/simplify\nfloat3 refractVector(float3 I, float3 N, float ior) \n{ \n\tfloat cosi = dot(I, N);\n\n\tfloat3 n = N; \n\tcosi = -cosi;\n\n\tfloat eta = 1.0 / ior; \n\tfloat k = 1 - eta * eta * (1 - cosi * cosi); \n\treturn k < 0 ? 0 : eta * I + (eta * cosi - sqrt(k)) * n; \n}\n\nfloat3 RefractedSky(float3 V, float3 N, float3 sunDir, float3 earthP) \n{\n\tfloat3 result = float3(0,0,0);\n\n\tfloat3 refractedAngle = refractVector(-V, -N, 1/refractionIndex);\n\tresult = SkyRadiance3(earthP,refractedAngle, sunDir);\n\n\treturn result;\n}\n\n//TODO: check if can optimize/simplify\nfloat fresnel_dielectric(float3 I, float3 N, float eta)\n{\n\t//compute fresnel reflectance without explicitly computing the refracted direction\n\tfloat c = abs(dot(I, N));\n\tfloat g = eta * eta - 1.0 + c * c;\n\tfloat result;\n\n\tfloat g2 =g;\n\tg = sqrt(g);\n\tfloat A =(g - c)/(g + c);\n\tfloat B =(c *(g + c)- 1.0)/(c *(g - c)+ 1.0);\n\tresult = 0.5 * A * A *(1.0 + B * B);\n\n\tresult = (g2>0) ? result : 1.0;  // TIR (no refracted component)\n\n\treturn result;\n}\n\n//underwater ocean color\nfloat3 oceanColor(float3 viewDir, float3 lightDir, float3 surfaceDir)\n{\n\tfloat angleToLightDir = (dot(viewDir, surfaceDir) + 1 )* 0.5;\n\tfloat3 waterColor = pow(_Underwater_Color, 4.0 *(-1.0 * angleToLightDir + 1.0));\n\treturn waterColor;\n}\n\nfloat getFresnel(float3 V, float3 N, float sigmaSq)\n{\n  #if defined (UNDERWATER_ON)\n\tfloat fresnel = 1.0 - fresnel_dielectric(V, N, 1/refractionIndex);\n  #else\n\tfloat fresnel = MeanFresnel(V, N, sigmaSq);\n  #endif\n\n\tfresnel = clamp(fresnel,0.0,1.0);\n\treturn fresnel;\n}\n\nfloat3 getSkyColor(float fresnel, float3 V, float3 N, float3 L, float3 earthP, float3 skyE, float shadowTerm, float radius)\n{\n  #if defined (UNDERWATER_ON)\n\treturn (fresnel * RefractedSky(V, N, L, earthP));\n  #else\n    #if defined (SKY_REFLECTIONS_ON)\n\tfloat3 skyColor = lerp(skyE / M_PI, ReflectedSky(V, N, L, earthP), skyReflectionStrength);\t\t\t//mix accurate sky reflection and sky irradiance\n\n\treturn (fresnel * (skyColor * lerp(0.5,1.0,shadowTerm) + (UNITY_LIGHTMODEL_AMBIENT.rgb*0.07)));\n    #else\n\treturn (fresnel * (skyE / M_PI * lerp(0.5,1.0,shadowTerm) + (UNITY_LIGHTMODEL_AMBIENT.rgb*0.07)));\t\t//sky irradiance only\n    #endif\n  #endif\n}\n\nfloat3 getOceanColor(float fresnel, float3 V, float3 N, float3 L, float3 earthP, float3 skyE, float shadowTerm)\n{\n  #if defined (UNDERWATER_ON)\n\tfloat3 ocColor = _sunColor * oceanColor(reflect(-V,N),L,float3(0.0,0.0,1.0));\t\t//reflected ocean color from underwater\n\tfloat waterLightExtinction = length(getSkyExtinction(earthP, L));\n\treturn(hdrNoExposure(waterLightExtinction * ocColor) * lerp(0.8,1.0,shadowTerm));\n  #else\n\treturn(0.98 * (1.0 - fresnel) * _Ocean_Color * (skyE / M_PI) * lerp(0.3,1.0,shadowTerm));\n  #endif\n}\n\nfloat2 getPerturbedUVsAndDepth(float2 depthUV, float3 N, float oceanDistance, out float fragDistance, out float depth)\n{\n\tfloat2 uv;\n  #if defined (UNDERWATER_ON)\n\tuv = depthUV.xy + (N.xy)*0.025 * float2(1.0,10.0);\n  #else\n\tuv = depthUV.xy + N.xy*0.025;\n  #endif\n\n\tfragDistance = getScattererFragDistance(uv);\n\tdepth= fragDistance - oceanDistance;\t\t\t\t\t\t\t//water depth, ie viewing ray distance in water\n\n\tuv = (depth < 0) ? depthUV.xy : uv;\t\t\t\t\t\t\t//for refractions, use the normal fragment uv instead the perturbed one if the perturbed one is closer\n\tfragDistance = getScattererFragDistance(uv);\n\tdepth= fragDistance - oceanDistance;\n\n  #if !defined (UNDERWATER_ON)\n\tdepth=lerp(depth,transparencyDepth,clamp((oceanDistance-1000.0)/5000.0,0.0,1.0)); \t//fade out refractions and transparency at distance, to hide swirly artifacts of low precision\n  #endif\n\n\treturn uv;\n}\n\nfloat getTransparencyAlpha(float depth)\n{\n\tfloat transparencyAlpha=lerp(0.0,1.0,depth/transparencyDepth);\n\ttransparencyAlpha = (depth < -0.5) ? 1.0 : transparencyAlpha;   //fix black edge around antialiased terrain in front of ocean\n\treturn transparencyAlpha;\n}\n\nfloat adjustWhiteCapStrengthWithDepth(float _Ocean_WhiteCapStr, float shoreFoam, float depth)\n{\n\t_Ocean_WhiteCapStr = lerp(shoreFoam,_Ocean_WhiteCapStr, clamp(depth*0.2,0.0,1.0));\n\treturn ((depth <= 0.0) ? 0.0 : _Ocean_WhiteCapStr); //fixes white outline around objects in front of the ocean\n}\n\nfloat applyFarWhiteCapStrength(float oceanDistance, float alphaRadius, float _Ocean_WhiteCapStr, float farWhiteCapStr)\n{\n\tfloat clampFactor= clamp(oceanDistance/alphaRadius,0.0,1.0); //factor to clamp whitecaps\n\treturn(lerp(_Ocean_WhiteCapStr,farWhiteCapStr,clampFactor));\n}\n\nfloat3 getTotalWhiteCapRadiance(float outWhiteCapStr, float jmx, float jSigma2, float3 sunL, float3 N, float3 L, float3 skyE, float shadowTerm)\n{\n\t// get coverage\n\tfloat W = WhitecapCoverage(outWhiteCapStr,jmx,jSigma2);\n\n\t// compute and add whitecap radiance\n\tfloat3 l = (sunL * (max(dot(N, L), 0.0)) + skyE + UNITY_LIGHTMODEL_AMBIENT.rgb * 30) / M_PI;\n\treturn (float3(W * l * 0.4)* lerp(0.5,1.0,shadowTerm));\n}\n\n\n\nvoid getPlanetShineContribution(out float3 LsunTotal, out float3 R_ftotTotal, out float3 LseaTotal, out float3 LskyTotal)\n{\n//\tfor (int i=0; i<4; ++i)\n//\t{\n//\t\tif (planetShineRGB[i].w == 0) break;\n//\n//\t\tL=normalize(planetShineSources[i].xyz);\n//\t\tSunRadianceAndSkyIrradiance(earthP, N, L, sunL, skyE);\n//\n//\t\t#if defined (SKY_REFLECTIONS_ON)\n//\t\tLsky = fresnel * ReflectedSky(V, N, L, earthP);   //planet, accurate sky reflections\n//\t\t#else\n//\t\tLsky = fresnel * skyE / M_PI; \t\t   //planet, sky irradiance only\n//\t\t#endif\n//\n//\t\tLsun = ReflectedSunRadiance(L, V, N, sigmaSq) * sunL;\n//\t\tLsea = RefractedSeaRadiance(V, N, sigmaSq) * _Ocean_Color * skyE / M_PI;\n//\t\tl = (sunL * (max(dot(N, L), 0.0)) + skyE) / M_PI;\n//\t\tR_ftot = float3(W * l * 0.4);\n//\n//\t\t//if source is not a sun compute intensity of light from angle to light source\n//\t\tfloat intensity=1;  \n//\t\tif (planetShineSources[i].w != 1.0f)\n//\t\t{\n//\t\t\tintensity = 0.57f*max((0.75-dot(normalize(planetShineSources[i].xyz - earthP),_Ocean_SunDir)),0);\n//\t\t}\n//\n//\t\tsurfaceColor+= abs((Lsun + Lsky + Lsea + R_ftot)*planetShineRGB[i].xyz*planetShineRGB[i].w*intensity);\n//\t\tLsunTotal   += Lsun;\n//\t\tR_ftotTotal += R_ftot;\n//\t\tLseaTotal   += Lsea;\n//\t\tLskyTotal   += Lsky;\n//\t}\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/OceanUtils.cginc.meta",
    "content": "fileFormatVersion: 2\nguid: a2cc3e5914c2bb345a87c15d0b894ee8\nShaderImporter:\n  externalObjects: {}\n  defaultTextures: []\n  nonModifiableTextures: []\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/OceanWhiteCapsModProj3.shader",
    "content": "﻿/*\n * Proland: a procedural landscape rendering library.\n * Copyright (c) 2008-2011 INRIA\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\n */\n\n/*\n* Proland is distributed under a dual-license scheme.\n* You can obtain a specific license from Inria: proland-licensing@inria.fr.\n*/\n\n/*\n* Authors: Eric Bruneton, Antoine Begault, Guillaume Piolat.\n*/\n\n/**\n* Real-time Realistic Ocean Lighting using Seamless Transitions from Geometry to BRDF\n* Copyright (c) 2009 INRIA\n* All rights reserved.\n*\n* Redistribution and use in source and binary forms, with or without\n* modification, are permitted provided that the following conditions\n* are met:\n* 1. Redistributions of source code must retain the above copyright\n*    notice, this list of conditions and the following disclaimer.\n* 2. Redistributions in binary form must reproduce the above copyright\n*    notice, this list of conditions and the following disclaimer in the\n*    documentation and/or other materials provided with the distribution.\n* 3. Neither the name of the copyright holders nor the names of its\n*    contributors may be used to endorse or promote products derived from\n*    this software without specific prior written permission.\n*\n* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n\t* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n\t* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\n* THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n/**\n* Author: Eric Bruneton\n* Modified and ported to Unity by Justin Hawkins 2014\n* Modified and adapted for use with Kerbal Space Program by Ghassen Lahmar 2015-2020\n*/\n\nShader \"Scatterer/OceanWhiteCaps\" \n{\n\tSubShader \n\t{\n\t\tTags { \"Queue\" = \"Geometry+100\"\n\t\t\t\t\"RenderType\"=\"Transparent\"\n\t\t\t\t\"IgnoreProjector\"=\"True\"}\n\n\t\tPass   \n\t\t{\n\n\t\t\tTags { \"LightMode\" = \"MainPass\"\n\t\t\t\t\t\"Queue\" = \"Geometry+100\"\n\t\t\t\t\t\"RenderType\"=\"Transparent\"\n\t\t\t\t\t\"IgnoreProjector\"=\"True\"}\n\n\t\t\tBlend SrcAlpha OneMinusSrcAlpha\n\t\t\tOffset 0.0, -0.14\n\n\t\t\tCull Back\n\n\t\t\tZWrite [_ZwriteVariable]\n\n\t\t\tCGPROGRAM\n\t\t\t#include \"UnityCG.cginc\"\n\t\t\t#pragma glsl\n\t\t\t#pragma target 3.0\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\n\t\t\t//#pragma multi_compile PLANETSHINE_OFF PLANETSHINE_ON\n\t\t\t#pragma multi_compile SKY_REFLECTIONS_OFF SKY_REFLECTIONS_ON\n\t\t\t#pragma multi_compile UNDERWATER_OFF UNDERWATER_ON\n\t\t\t#pragma multi_compile OCEAN_SHADOWS_OFF OCEAN_SHADOWS_HARD OCEAN_SHADOWS_SOFT\n\t\t\t#pragma multi_compile REFRACTIONS_AND_TRANSPARENCY_OFF REFRACTIONS_AND_TRANSPARENCY_ON\n\t\t\t#pragma multi_compile SCATTERER_MERGED_DEPTH_ON SCATTERER_MERGED_DEPTH_OFF\n\t\t\t#pragma multi_compile DITHERING_OFF DITHERING_ON\n\t\t\t#pragma multi_compile GODRAYS_OFF GODRAYS_ON\n\t\t\t#pragma multi_compile DEPTH_BUFFER_MODE_OFF DEPTH_BUFFER_MODE_ON\n\t\t\t#pragma multi_compile FOAM_OFF FOAM_ON\n\t\t\t//#pragma multi_compile SCATTERING_ON SCATTERING_OFF\n\n\t\t\t#include \"../CommonAtmosphere.cginc\"\n\t\t\t#include \"../DepthCommon.cginc\"\n#if defined (OCEAN_SHADOWS_HARD) || defined (OCEAN_SHADOWS_SOFT)\n\t\t\t#include \"OceanShadows.cginc\"\n#endif\t\t\t\n\t\t\t#include \"OceanBRDF.cginc\"\n\t\t\t#include \"OceanDisplacement3.cginc\"\n\t\t\t#include \"OceanUtils.cginc\"\n\t\t\t#include \"../ClippingUtils.cginc\"\n\t\t\t#include \"../Atmo/Godrays/GodraysCommon.cginc\"\n\n\t\t\tuniform float offScreenVertexStretch;\n\n\t\t\tuniform float4x4 _Globals_ScreenToCamera;\n\t\t\tuniform float4x4 _Globals_CameraToWorld;\n\t\t\tuniform float4x4 _Globals_WorldToScreen;\n\t\t\tuniform float4x4 _Globals_CameraToScreen;\n\t\t\tuniform float3 _Globals_WorldCameraPos;\n\n\t\t\tuniform float4x4 _Globals_WorldToOcean;\n\t\t\tuniform float4x4 _Globals_OceanToWorld;\n\n\t\t\tuniform float3 _Sun_WorldSunDir;\n\n\t\t\tuniform float2 _Ocean_MapSize;\n\t\t\tuniform float4 _Ocean_Choppyness;\n\t\t\tuniform float3 _Ocean_SunDir;\n\t\t\tuniform float4 _Ocean_GridSizes;\n\t\t\tuniform float2 _Ocean_ScreenGridSize;\n\t\t\tuniform float _Ocean_WhiteCapStr;\n\t\t\tuniform float farWhiteCapStr;\n\t\t\tuniform float shoreFoam;\n\n\t\t\tuniform sampler3D _Ocean_Variance;\n\t\t\tuniform sampler2D _Ocean_Map0;\n\t\t\tuniform sampler2D _Ocean_Map1;\n\t\t\tuniform sampler2D _Ocean_Map2;\n\t\t\tuniform sampler2D _Ocean_Map3;\n\t\t\tuniform sampler2D _Ocean_Map4;\n\t\t\tuniform sampler2D _Ocean_Foam0;\n\t\t\tuniform sampler2D _Ocean_Foam1;\n\n\t\t\tuniform float alphaRadius;\n\t\t\tuniform float _PlanetOpacity;  //to fade out the ocean when PQS is fading out\n\t\t\tuniform float _ScatteringExposure;\n\n\t\t\tuniform float _Alpha_Global;\n\t\t\tuniform float _SkyExposure;\n\n\t\t\tuniform float2 _VarianceMax;\n\n\t\t\tuniform float darknessDepth;\n\n\t\t\tuniform float3 _planetPos;\n\t\t\tuniform float _openglThreshold;\n\t\t\tuniform float _global_depth;\n\t\t\tuniform float _global_alpha;\n\t\t\tuniform float _Post_Extinction_Tint;\n\t\t\tuniform float extinctionThickness;\n\n\t\t\t#if defined (REFRACTIONS_AND_TRANSPARENCY_ON)\n\t\t\tuniform sampler2D ScattererScreenCopyBeforeOcean;   //background texture used for refraction\n\t\t\t#endif\n\n\t\t\t#if defined (GODRAYS_ON)\n\t\t\tuniform sampler2D _godrayDepthTexture;\n\t\t\tuniform float _godrayStrength;\n\t\t\t#endif\n\n\t\t\t#if defined (PLANETSHINE_ON)\n\t\t\tuniform float4x4 planetShineSources;\n\t\t\tuniform float4x4 planetShineRGB;\n\t\t\t#endif\n\n\t\t\tstruct v2f \n\t\t\t{\n\t\t\t\tfloat4 pos : SV_POSITION;\n\t\t\t\tfloat2 oceanU\t: TEXCOORD0;\n\t\t\t\tfloat3 oceanP\t: TEXCOORD1;\n\t\t\t\tfloat4 screenPos: TEXCOORD2;\n\t\t\t\tfloat4 worldPos\t: TEXCOORD3;\n\t\t\t\tfloat4 viewPos\t: TEXCOORD4;\n\t\t\t\tfloat3 sunL\t: TEXCOORD5;\n\t\t\t\tfloat3 skyE\t: TEXCOORD6;\n\t\t\t};\n\n\t\t\tv2f vert(appdata_base v)\n\t\t\t{\n\t\t\t\tfloat t;\n\t\t\t\tfloat3 cameraDir, oceanDir;\n\t\t\t\tfloat4 vert = v.vertex;\n\t\t\t\tvert.xy *= offScreenVertexStretch;\n\n\t\t\t\tfloat2 u = OceanPos(vert, _Globals_ScreenToCamera, t, cameraDir, oceanDir);\t//camera dir is viewing direction in camera space\n\t\t\t\tfloat2 dux = OceanPos(vert + float4(_Ocean_ScreenGridSize.x, 0.0, 0.0, 0.0), _Globals_ScreenToCamera) - u;\n\t\t\t\tfloat2 duy = OceanPos(vert + float4(0.0, _Ocean_ScreenGridSize.y, 0.0, 0.0), _Globals_ScreenToCamera) - u;\n\n\t\t\t\tfloat3 dP = float3(0, 0, _Ocean_HeightOffset);\n\n\t\t\t\tif(duy.x != 0.0 || duy.y != 0.0)\n\t\t\t\t{\n\t\t\t\t\tdP.z += Tex2DGrad(_Ocean_Map0, u / _Ocean_GridSizes.x, dux / _Ocean_GridSizes.x, duy / _Ocean_GridSizes.x, _Ocean_MapSize).x;\n\t\t\t\t\tdP.z += Tex2DGrad(_Ocean_Map0, u / _Ocean_GridSizes.y, dux / _Ocean_GridSizes.y, duy / _Ocean_GridSizes.y, _Ocean_MapSize).y;\n\t\t\t\t\tdP.z += Tex2DGrad(_Ocean_Map0, u / _Ocean_GridSizes.z, dux / _Ocean_GridSizes.z, duy / _Ocean_GridSizes.z, _Ocean_MapSize).z;\n\t\t\t\t\tdP.z += Tex2DGrad(_Ocean_Map0, u / _Ocean_GridSizes.w, dux / _Ocean_GridSizes.w, duy / _Ocean_GridSizes.w, _Ocean_MapSize).w;\n//\n\t\t\t\t\tdP.xy += _Ocean_Choppyness.x * Tex2DGrad(_Ocean_Map3, u / _Ocean_GridSizes.x, dux / _Ocean_GridSizes.x, duy / _Ocean_GridSizes.x, _Ocean_MapSize).xy;\n\t\t\t\t\tdP.xy += _Ocean_Choppyness.y * Tex2DGrad(_Ocean_Map3, u / _Ocean_GridSizes.y, dux / _Ocean_GridSizes.y, duy / _Ocean_GridSizes.y, _Ocean_MapSize).zw;\n\t\t\t\t\tdP.xy += _Ocean_Choppyness.z * Tex2DGrad(_Ocean_Map4, u / _Ocean_GridSizes.z, dux / _Ocean_GridSizes.z, duy / _Ocean_GridSizes.z, _Ocean_MapSize).xy;\n\t\t\t\t\tdP.xy += _Ocean_Choppyness.w * Tex2DGrad(_Ocean_Map4, u / _Ocean_GridSizes.w, dux / _Ocean_GridSizes.w, duy / _Ocean_GridSizes.w, _Ocean_MapSize).zw;\n\t\t\t\t}\n\n\t\t\t\tv2f OUT;\n\n\t\t\t\tfloat3x3 otoc = _Ocean_OceanToCamera;\n\t\t\t\tfloat tClamped = clamp(t*0.25, 0.0, 1.0);\n\n\t\t\t\t#if defined (UNDERWATER_ON)\n\t\t\t\tdP = lerp(float3(0.0,0.0,0.1),dP,tClamped);   //prevents projected grid intersecting near plane\n\t\t\t\t#else\n\t\t\t\tdP = lerp(float3(0.0,0.0,-0.1),dP,tClamped);  //prevents projected grid intersecting near plane\n\t\t\t\t#endif\n\t\t\t\tfloat4 screenP = float4(t * cameraDir + mul(otoc, dP), 1.0);   //position in camera space\n\t\t\t\tfloat3 oceanP = t * oceanDir + dP + float3(0.0, 0.0, _Ocean_CameraPos.z);\n\n\t\t\t\tOUT.pos = mul(UNITY_MATRIX_P, screenP);\n\n\n\t\t\t\tOUT.oceanU = u;\n\t\t\t\tOUT.oceanP = oceanP;\n\n\t\t\t\tOUT.screenPos = ComputeScreenPos(OUT.pos);\n\t\t\t\tOUT.worldPos=mul(_Globals_CameraToWorld , screenP);\n\n\t\t\t\tOUT.viewPos = screenP;\n#if SHADER_API_D3D11 || SHADER_API_D3D9 || SHADER_API_D3D || SHADER_API_D3D12\n\t\t\t\tOUT.pos\t= (_PlanetOpacity == 0.0) ? float4(2.0, 2.0, 2.0, 1.0) : OUT.pos;\t\t//cull when completely transparent\n#else\n\t\t\t\tOUT.pos = lerp(float4(2.0, 2.0, 2.0, 1.0), OUT.pos, step(0.001,_PlanetOpacity));\t//stupid opengl\n#endif\n\n\t\t\t\tfloat3 earthP = normalize(oceanP + float3(0.0, 0.0, _Ocean_Radius)) * (_Ocean_Radius + 10.0);\n\n\t\t\t\tfloat3 sunL, skyE;\n\t\t\t\tSunRadianceAndSkyIrradiance(earthP, float3(0.0,0.0,1.0), _Ocean_SunDir, sunL, skyE);\n\t\t\t\tOUT.sunL = sunL;\n\t\t\t\tOUT.skyE = skyE;\n\n\t\t\t\treturn OUT;\n\t\t\t}\n\n\t\t\tfloat4 frag(v2f IN) : SV_Target\n\t\t\t{\n\t\t\t\tfloat2 u = IN.oceanU;\n\t\t\t\tfloat3 oceanP = IN.oceanP;\n\n\t\t\t\tfloat3 oceanCamera = float3(0.0, 0.0, _Ocean_CameraPos.z);\n\n\t\t\t\tfloat3 V = normalize(oceanCamera - oceanP);\n\n\t\t\t\tfloat2 slopes = float2(0,0);\n\t\t\t\tslopes += tex2D(_Ocean_Map1, u / _Ocean_GridSizes.x).xy;\n\t\t\t\tslopes += tex2D(_Ocean_Map1, u / _Ocean_GridSizes.y).zw;\n\t\t\t\tslopes += tex2D(_Ocean_Map2, u / _Ocean_GridSizes.z).xy;\n\t\t\t\tslopes += tex2D(_Ocean_Map2, u / _Ocean_GridSizes.w).zw;\n\n\t\t\t\tslopes -= oceanP.xy / (_Ocean_Radius + oceanP.z);\n\n\t\t\t\tfloat3 N = normalize(float3(-slopes.x, -slopes.y, 1.0));\n\n\t\t\t\tfloat Jxx = ddx(u.x);\n\t\t\t\tfloat Jxy = ddy(u.x);\n\t\t\t\tfloat Jyx = ddx(u.y);\n\t\t\t\tfloat Jyy = ddy(u.y);\n\t\t\t\tfloat A = Jxx * Jxx + Jyx * Jyx;\n\t\t\t\tfloat B = Jxx * Jxy + Jyx * Jyy;\n\t\t\t\tfloat C = Jxy * Jxy + Jyy * Jyy;\n\t\t\t\tconst float SCALE = 10.0;\n\t\t\t\tfloat ua = pow(A / SCALE, 0.25);\n\t\t\t\tfloat ub = 0.5 + 0.5 * B / sqrt(A * C);\n\t\t\t\tfloat uc = pow(C / SCALE, 0.25);\n\t\t\t\tfloat sigmaSq = tex3D(_Ocean_Variance, float3(ua, ub, uc)).x * _VarianceMax.x;\n\n\t\t\t\tsigmaSq = max(sigmaSq, 2e-5);\n\n#if defined (FOAM_ON)\n\t\t\t\t// extract mean and variance of the jacobian matrix determinant\n\t\t\t\tfloat2 jm1 = tex2D(_Ocean_Foam0, u / _Ocean_GridSizes.x).xy;\n\t\t\t\tfloat2 jm2 = tex2D(_Ocean_Foam0, u / _Ocean_GridSizes.y).zw;\n\t\t\t\tfloat2 jm3 = tex2D(_Ocean_Foam1, u / _Ocean_GridSizes.z).xy;\n\t\t\t\tfloat2 jm4 = tex2D(_Ocean_Foam1, u / _Ocean_GridSizes.w).zw;\n\n\t\t\t\tfloat2 jm  = jm1+jm2+jm3+jm4;\n\t\t\t\tfloat jSigma2 = max(jm.y - (jm1.x*jm1.x + jm2.x*jm2.x + jm3.x*jm3.x + jm4.x*jm4.x), 0.0);\n#endif\n\n\t\t\t\tfloat3 earthP = normalize(oceanP + float3(0.0, 0.0, _Ocean_Radius)) * (_Ocean_Radius + 10.0);\n\n\t\t\t\tfloat3 sunL = IN.sunL;\n\t\t\t\tfloat3 skyE = IN.skyE;\n\n\t\t\t\thalf shadowTerm = 1.0;\n#if defined (OCEAN_SHADOWS_HARD) || defined (OCEAN_SHADOWS_SOFT)\n\t\t\t\tshadowTerm = getOceanShadow (IN.worldPos, -IN.viewPos.z);\n#endif\n\n\t\t\t\tfloat fresnel = getFresnel(V, N, sigmaSq);\n\t\t\t\tfloat3 Lsky = getSkyColor(fresnel, V, N, _Ocean_SunDir, earthP, skyE, shadowTerm, _Ocean_Radius);\n\t\t\t\tfloat3 Lsea = getOceanColor(fresnel, V, N, _Ocean_SunDir, earthP, skyE, shadowTerm);\n\n\t\t\t\tfloat oceanDistance = length(IN.viewPos);\n\n#if defined (REFRACTIONS_AND_TRANSPARENCY_ON)\n\t\t\t\tfloat fragDistance, depth;\n\t\t\t\tfloat2 uv = IN.screenPos.xy / IN.screenPos.w;\n\n#if SHADER_API_D3D11 || SHADER_API_D3D9 || SHADER_API_D3D || SHADER_API_D3D12\n\t\t\t\tuv.y = 1.0 - uv.y;\n#endif\n\t\t\t\tuv = getPerturbedUVsAndDepth(uv, N, oceanDistance, fragDistance, depth);\n\n\t\t\t\t_Ocean_WhiteCapStr = adjustWhiteCapStrengthWithDepth(_Ocean_WhiteCapStr, shoreFoam, depth);\n\t\t\t\tfloat transparencyAlpha = getTransparencyAlpha(depth);\n#else\n\t\t\t\tfloat transparencyAlpha=1.0;\n#endif\n\t\t\t\tfloat3 R_ftot = float3(0.0,0.0,0.0);\n#if defined (FOAM_ON)\n\t\t\t\tfloat outWhiteCapStr=applyFarWhiteCapStrength(oceanDistance, alphaRadius, _Ocean_WhiteCapStr, farWhiteCapStr);\n\t\t\t\tR_ftot = getTotalWhiteCapRadiance(outWhiteCapStr, jm.x, jSigma2, sunL, N, _Ocean_SunDir, skyE, shadowTerm);\n#endif\n\n\t\t\t\tfloat3 Lsun = ReflectedSunRadiance(_Ocean_SunDir, V, N, sigmaSq) * sunL * shadowTerm;\n\n#if defined (UNDERWATER_ON)\n\t\t\t\tfloat3 surfaceColor = hdr(abs(Lsea + R_ftot),_ScatteringExposure);\n#else\n\t\t\t\tfloat3 surfaceColor = hdr(abs(Lsun + Lsea + R_ftot),_ScatteringExposure);\n\t\t\t\tLsky = _Alpha_Global*hdr(Lsky,_SkyExposure);\n\t\t\t\tsurfaceColor = surfaceColor + (1.0-surfaceColor) * Lsky;\n#endif\n\t\t\t\tfloat3 LsunTotal = Lsun; float3 R_ftotTotal = R_ftot; float3 LseaTotal = Lsea; float3 LskyTotal = Lsky;\n#if defined (PLANETSHINE_ON)\n\n\t\t\t\tgetPlanetShineContribution(LsunTotal, R_ftotTotal, LseaTotal, LskyTotal);\n#endif\n\n#if SHADER_API_D3D11\n\t\t\t\tbool insideClippingRange = true;\n#else\n\t\t\t\tbool insideClippingRange = oceanFragmentInsideOfClippingRange(-IN.viewPos.z/IN.viewPos.w);\n#endif\n\n#if defined (REFRACTIONS_AND_TRANSPARENCY_ON)\n\t\t\t\ttransparencyAlpha = max(hdr(LsunTotal + R_ftotTotal,_ScatteringExposure), fresnel+transparencyAlpha) ; //seems about perfect\n\t\t\t\ttransparencyAlpha = min(transparencyAlpha, 1.0);\n\n\t\t\t\tfloat3 backGrnd = 0.0;\n\n\t\t\t#if SHADER_API_D3D11 || SHADER_API_D3D9 || SHADER_API_D3D || SHADER_API_D3D12\n\t\t\t\tbackGrnd = tex2D(ScattererScreenCopyBeforeOcean, (_ProjectionParams.x == 1.0) ? uv : float2(uv.x,1.0-uv.y) );\n\t\t\t#else\n\t\t\t\tbackGrnd = tex2D(ScattererScreenCopyBeforeOcean, uv );\n\t\t\t#endif\n#endif\n\n#if defined (UNDERWATER_ON)\n\t\t\t\tLsky = _Alpha_Global*hdr(Lsky,_SkyExposure);\n\t\t\t\tfloat3 transmittance =  hdr(R_ftot, _ScatteringExposure);\n\t\t\t\ttransmittance = clamp(transmittance, float3(0.0,0.0,0.0), float3(1.0,1.0,1.0));\n\t\t\t\ttransmittance = transmittance + (1.0-transmittance) * Lsky;\t\t\t    //consider not using transmittance but instead background texture, change the refraction angle to have something matching what you would see from underwater\n\n\t\t\t\tfloat3 finalColor = (1.0 - fresnel) * Lsea;\n\t\t\t\tfinalColor+=clamp(transmittance * fresnel,float3(0.0,0.0,0.0),float3(1.0,1.0,1.0)); //somehow doing lerp directly breaks opengl\n\n\t#if defined (REFRACTIONS_AND_TRANSPARENCY_ON)\n\t\t\t\tbackGrnd+=hdr(R_ftotTotal,_ScatteringExposure)*(1-backGrnd); //make foam visible from below as well\n\t\t\t\tfinalColor = (fragDistance < 750000.0) ? backGrnd : finalColor;\n\t#endif\n\n\t\t\t\tfloat3 Vworld = mul ( _Globals_OceanToWorld, float4(V,0.0));\n\t\t\t\tfloat3 Lworld = mul ( _Globals_OceanToWorld, float4(_Ocean_SunDir,0.0));\n\n\t\t\t\tfloat3 earthCamPos = normalize(float3(_Ocean_CameraPos.xy,0.0) + float3(0.0, 0.0, _Ocean_Radius)) * (_Ocean_Radius + 10.0);\n\n\t\t\t\tfloat underwaterDepth = lerp(1.0,0.0,-_Ocean_CameraPos.z / darknessDepth);\n\n\t\t\t\tfloat waterLightExtinction = length(getSkyExtinction(earthCamPos, _Ocean_SunDir));\n\t\t\t\tfloat3 _camPos = _WorldSpaceCameraPos - _planetPos;\n\n\t\t\t\tfloat3 oceanCol = underwaterDepth * hdrNoExposure(waterLightExtinction * _sunColor * oceanColor(-Vworld,Lworld,normalize(_camPos))); //add planetshine loop here over Ls\n\n\t\t\t\tfinalColor= clamp(finalColor, float3(0.0,0.0,0.0),float3(1.0,1.0,1.0));\n\t\t\t\tfinalColor= lerp(finalColor, oceanCol, min(length(oceanCamera - oceanP)/transparencyDepth,1.0));\n\n\t\t\t\treturn float4(dither(finalColor, IN.pos),insideClippingRange);\n#else\n\t#if defined (REFRACTIONS_AND_TRANSPARENCY_ON)\n\t\t\t\tfloat3 finalColor = lerp(backGrnd, surfaceColor, transparencyAlpha);\t//refraction on and not underwater\n\t#else\n\t\t\t\tfloat3 finalColor = surfaceColor;  \t\t\t\t\t//refraction off and not underwater\n\t#endif\n\n#if defined (DEPTH_BUFFER_MODE_OFF)\n\t\t\t\tif (_PlanetOpacity == 1.0)\n\t\t\t\t{\n\t\t\t\t\tfloat3 worldPos= IN.worldPos - _planetPos;\n\t\t\t\t\tworldPos = (length(worldPos) < (Rg + _openglThreshold)) ? (Rg + _openglThreshold) * normalize(worldPos) : worldPos ; //artifacts fix\n\t\t\t\t\tfloat3 _camPos = _WorldSpaceCameraPos - _planetPos;\n\n\t\t\t\t\tfloat minDistance = length(worldPos-_camPos);\n\n\t#if defined (GODRAYS_ON)\n\t\t\t\t\tfloat2 godrayUV = IN.screenPos.xy / IN.screenPos.w;\n\t\t\t\t\tfloat godrayDepth = 0.0;\n\t\t\t\t\tgodrayDepth = sampleGodrayDepth(_godrayDepthTexture, godrayUV, 1.0);\n\n\t\t\t\t\t//trying to find the optical depth from the terrain level\n\t\t\t\t\tfloat muTerrain = dot(normalize(worldPos), normalize(_camPos - worldPos));\n\n\t\t\t\t\tgodrayDepth = _godrayStrength * DistanceFromOpticalDepth(_experimentalAtmoScale * (Rt-Rg) * 0.5, length(worldPos), muTerrain, godrayDepth, minDistance);\n\n\t\t\t\t\tworldPos = worldPos - godrayDepth * normalize(worldPos-_camPos);\n\t#endif\n\n\t\t\t\t\tfloat3 inscatter=0.0;float3 extinction=1.0;\n\t\t\t\t\tinscatter = InScattering2(_camPos, worldPos,SUN_DIR,extinction);\n\n\t\t\t\t\tinscatter*= (minDistance <= _global_depth) ? (1 - exp(-1 * (4 * minDistance / _global_depth))) : 1.0 ; //somehow the shader compiler for OpenGL behaves differently around braces            \t\t\t\t\n\t\t\t\t\tinscatter = hdr(inscatter,_ScatteringExposure) *_global_alpha;\n\n\t\t\t\t\tfloat average=(extinction.r+extinction.g+extinction.b)/3;\n\n\t\t\t\t\t//lerped manually because of an issue with opengl or whatever\n\t\t\t\t\textinction = _Post_Extinction_Tint * extinction + (1-_Post_Extinction_Tint) * float3(average,average,average);\n\n\t\t\t\t\textinction= max(float3(0.0,0.0,0.0), (float3(1.0,1.0,1.0)*(1-extinctionThickness) + extinctionThickness*extinction) );\n\n\t\t\t\t\tfinalColor*= extinction;\n\t\t\t\t\tfinalColor = inscatter*(1-finalColor) + finalColor;\n\t\t\t\t}\n#endif\n\n\t\t\t\tinsideClippingRange = (transparencyAlpha == 1.0) ? 1.0 : insideClippingRange;     //if no transparency -> render normally, if transparency play with the overlap to hide seams between cameras\n\t\t\t\treturn float4(dither(finalColor,IN.pos), _PlanetOpacity*insideClippingRange);\n#endif\n\t\t\t}\n\n\t\tENDCG\n\t\t}\n\n\t}\n}\n\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/OceanWhiteCapsModProj3.shader.meta",
    "content": "fileFormatVersion: 2\nguid: a0fba9bd62d2b5c4bb89c81f58569c58\nShaderImporter:\n  defaultTextures: []\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/OceanWhiteCapsModProj3PixelLights.shader",
    "content": "﻿\n/*\n * Proland: a procedural landscape rendering library.\n * Copyright (c) 2008-2011 INRIA\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\n */\n\n/*\n* Proland is distributed under a dual-license scheme.\n* You can obtain a specific license from Inria: proland-licensing@inria.fr.\n*/\n\n/*\n* Authors: Eric Bruneton, Antoine Begault, Guillaume Piolat.\n*/\n\n/**\n* Real-time Realistic Ocean Lighting using Seamless Transitions from Geometry to BRDF\n* Copyright (c) 2009 INRIA\n* All rights reserved.\n*\n* Redistribution and use in source and binary forms, with or without\n* modification, are permitted provided that the following conditions\n* are met:\n* 1. Redistributions of source code must retain the above copyright\n*    notice, this list of conditions and the following disclaimer.\n* 2. Redistributions in binary form must reproduce the above copyright\n*    notice, this list of conditions and the following disclaimer in the\n*    documentation and/or other materials provided with the distribution.\n* 3. Neither the name of the copyright holders nor the names of its\n*    contributors may be used to endorse or promote products derived from\n*    this software without specific prior written permission.\n*\n* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n\t* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n\t* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\n* THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n/**\n* Author: Eric Bruneton\n* Modified and ported to Unity by Justin Hawkins 2014\n* Modified and adapted for use with Kerbal Space Program by Ghassen Lahmar 2015-2020\n\t*/\n\n\tShader \"Scatterer/OceanWhiteCapsPixelLights\" \n{\n\tSubShader \n\t{\n\t\tTags { \"Queue\" = \"Geometry+100\"\n\t\t\t\t\"RenderType\"=\"Transparent\"\n\t\t\t\t\"IgnoreProjector\"=\"True\"}\n\n\t\tPass   \n\t\t{\n\n\t\t\tTags { \"LightMode\" = \"MainPass\"\n\t\t\t\t\t\"Queue\" = \"Geometry+100\"\n\t\t\t\t\t\"RenderType\"=\"Transparent\"\n\t\t\t\t\t\"IgnoreProjector\"=\"True\"}\n\n\t\t\tBlend SrcAlpha OneMinusSrcAlpha\n\t\t\tOffset 0.0, -0.14\n\n\t\t\tCull Back\n\n\t\t\tZWrite [_ZwriteVariable]\n\n\t\t\tCGPROGRAM\n\t\t\t#include \"UnityCG.cginc\"\n\t\t\t#pragma glsl\n\t\t\t#pragma target 3.0\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\n\t\t\t//#pragma multi_compile PLANETSHINE_OFF PLANETSHINE_ON\n\t\t\t#pragma multi_compile SKY_REFLECTIONS_OFF SKY_REFLECTIONS_ON\n\t\t\t#pragma multi_compile UNDERWATER_OFF UNDERWATER_ON\n\t\t\t#pragma multi_compile OCEAN_SHADOWS_OFF OCEAN_SHADOWS_HARD OCEAN_SHADOWS_SOFT\n\t\t\t#pragma multi_compile REFRACTIONS_AND_TRANSPARENCY_OFF REFRACTIONS_AND_TRANSPARENCY_ON\n\t\t\t#pragma multi_compile SCATTERER_MERGED_DEPTH_ON SCATTERER_MERGED_DEPTH_OFF\n\t\t\t#pragma multi_compile DITHERING_OFF DITHERING_ON\n\t\t\t#pragma multi_compile GODRAYS_OFF GODRAYS_ON\n\t\t\t#pragma multi_compile DEPTH_BUFFER_MODE_OFF DEPTH_BUFFER_MODE_ON\n\t\t\t#pragma multi_compile FOAM_OFF FOAM_ON\n\t\t\t//#pragma multi_compile SCATTERING_ON SCATTERING_OFF\n\n\t\t\t#include \"../CommonAtmosphere.cginc\"\n\t\t\t#include \"../DepthCommon.cginc\"\n\t\t\t#if defined (OCEAN_SHADOWS_HARD) || defined (OCEAN_SHADOWS_SOFT)\n\t\t\t#include \"OceanShadows.cginc\"\n\t\t\t#endif\t\t\t\n\t\t\t#include \"OceanBRDF.cginc\"\n\t\t\t#include \"OceanDisplacement3.cginc\"\n\t\t\t#include \"OceanUtils.cginc\"\n\t\t\t#include \"../ClippingUtils.cginc\"\n\t\t\t#include \"../Atmo/Godrays/GodraysCommon.cginc\"\n\n\t\t\tuniform float offScreenVertexStretch;\n\n\t\t\tuniform float4x4 _Globals_ScreenToCamera;\n\t\t\tuniform float4x4 _Globals_CameraToWorld;\n\t\t\tuniform float4x4 _Globals_WorldToScreen;\n\t\t\tuniform float4x4 _Globals_CameraToScreen;\n\t\t\tuniform float3 _Globals_WorldCameraPos;\n\n\t\t\tuniform float4x4 _Globals_WorldToOcean;\n\t\t\tuniform float4x4 _Globals_OceanToWorld;\n\n\t\t\tuniform float3 _Sun_WorldSunDir;\n\n\t\t\tuniform float2 _Ocean_MapSize;\n\t\t\tuniform float4 _Ocean_Choppyness;\n\t\t\tuniform float3 _Ocean_SunDir;\n\t\t\tuniform float4 _Ocean_GridSizes;\n\t\t\tuniform float2 _Ocean_ScreenGridSize;\n\t\t\tuniform float _Ocean_WhiteCapStr;\n\t\t\tuniform float farWhiteCapStr;\n\t\t\tuniform float shoreFoam;\n\n\t\t\tuniform sampler3D _Ocean_Variance;\n\t\t\tuniform sampler2D _Ocean_Map0;\n\t\t\tuniform sampler2D _Ocean_Map1;\n\t\t\tuniform sampler2D _Ocean_Map2;\n\t\t\tuniform sampler2D _Ocean_Map3;\n\t\t\tuniform sampler2D _Ocean_Map4;\n\t\t\tuniform sampler2D _Ocean_Foam0;\n\t\t\tuniform sampler2D _Ocean_Foam1;\n\n\t\t\tuniform float alphaRadius;\n\t\t\tuniform float _PlanetOpacity;  //to fade out the ocean when PQS is fading out\n\t\t\tuniform float _ScatteringExposure;\n\n\t\t\tuniform float _Alpha_Global;\n\t\t\tuniform float _SkyExposure;\n\n\t\t\tuniform float2 _VarianceMax;\n\n\t\t\tuniform float darknessDepth;\n\n\t\t\tuniform float3 _planetPos;\n\t\t\tuniform float _openglThreshold;\n\t\t\tuniform float _global_depth;\n\t\t\tuniform float _global_alpha;\n\t\t\tuniform float _Post_Extinction_Tint;\n\t\t\tuniform float extinctionThickness;\n\n\t\t\t#if defined (REFRACTIONS_AND_TRANSPARENCY_ON)\n\t\t\tuniform sampler2D ScattererScreenCopyBeforeOcean;   //background texture used for refraction\n\t\t\t#endif\n\n\t\t\t#if defined (GODRAYS_ON)\n\t\t\tuniform sampler2D _godrayDepthTexture;\n\t\t\tuniform float _godrayStrength;\n\t\t\t#endif\n\n\t\t\t#if defined (PLANETSHINE_ON)\n\t\t\tuniform float4x4 planetShineSources;\n\t\t\tuniform float4x4 planetShineRGB;\n\t\t\t#endif\n\n\t\t\tstruct v2f \n\t\t\t{\n\t\t\t\tfloat4 pos : SV_POSITION;\n\t\t\t\tfloat2 oceanU\t: TEXCOORD0;\n\t\t\t\tfloat3 oceanP\t: TEXCOORD1;\n\t\t\t\tfloat4 screenPos: TEXCOORD2;\n\t\t\t\tfloat4 worldPos\t: TEXCOORD3;\n\t\t\t\tfloat4 viewPos\t: TEXCOORD4;\n\t\t\t\tfloat3 sunL\t: TEXCOORD5;\n\t\t\t\tfloat3 skyE\t: TEXCOORD6;\n\t\t\t};\n\n\t\t\tv2f vert(appdata_base v)\n\t\t\t{\n\t\t\t\tfloat t;\n\t\t\t\tfloat3 cameraDir, oceanDir;\n\t\t\t\tfloat4 vert = v.vertex;\n\t\t\t\tvert.xy *= offScreenVertexStretch;\n\n\t\t\t\tfloat2 u = OceanPos(vert, _Globals_ScreenToCamera, t, cameraDir, oceanDir);\t//camera dir is viewing direction in camera space\n\t\t\t\tfloat2 dux = OceanPos(vert + float4(_Ocean_ScreenGridSize.x, 0.0, 0.0, 0.0), _Globals_ScreenToCamera) - u;\n\t\t\t\tfloat2 duy = OceanPos(vert + float4(0.0, _Ocean_ScreenGridSize.y, 0.0, 0.0), _Globals_ScreenToCamera) - u;\n\n\t\t\t\tfloat3 dP = float3(0, 0, _Ocean_HeightOffset);\n\n\t\t\t\tif(duy.x != 0.0 || duy.y != 0.0)\n\t\t\t\t{\n\t\t\t\t\tdP.z += Tex2DGrad(_Ocean_Map0, u / _Ocean_GridSizes.x, dux / _Ocean_GridSizes.x, duy / _Ocean_GridSizes.x, _Ocean_MapSize).x;\n\t\t\t\t\tdP.z += Tex2DGrad(_Ocean_Map0, u / _Ocean_GridSizes.y, dux / _Ocean_GridSizes.y, duy / _Ocean_GridSizes.y, _Ocean_MapSize).y;\n\t\t\t\t\tdP.z += Tex2DGrad(_Ocean_Map0, u / _Ocean_GridSizes.z, dux / _Ocean_GridSizes.z, duy / _Ocean_GridSizes.z, _Ocean_MapSize).z;\n\t\t\t\t\tdP.z += Tex2DGrad(_Ocean_Map0, u / _Ocean_GridSizes.w, dux / _Ocean_GridSizes.w, duy / _Ocean_GridSizes.w, _Ocean_MapSize).w;\n\t\t\t\t\t//\n\t\t\t\t\tdP.xy += _Ocean_Choppyness.x * Tex2DGrad(_Ocean_Map3, u / _Ocean_GridSizes.x, dux / _Ocean_GridSizes.x, duy / _Ocean_GridSizes.x, _Ocean_MapSize).xy;\n\t\t\t\t\tdP.xy += _Ocean_Choppyness.y * Tex2DGrad(_Ocean_Map3, u / _Ocean_GridSizes.y, dux / _Ocean_GridSizes.y, duy / _Ocean_GridSizes.y, _Ocean_MapSize).zw;\n\t\t\t\t\tdP.xy += _Ocean_Choppyness.z * Tex2DGrad(_Ocean_Map4, u / _Ocean_GridSizes.z, dux / _Ocean_GridSizes.z, duy / _Ocean_GridSizes.z, _Ocean_MapSize).xy;\n\t\t\t\t\tdP.xy += _Ocean_Choppyness.w * Tex2DGrad(_Ocean_Map4, u / _Ocean_GridSizes.w, dux / _Ocean_GridSizes.w, duy / _Ocean_GridSizes.w, _Ocean_MapSize).zw;\n\t\t\t\t}\n\n\t\t\t\tv2f OUT;\n\n\t\t\t\tfloat3x3 otoc = _Ocean_OceanToCamera;\n\t\t\t\tfloat tClamped = clamp(t*0.25, 0.0, 1.0);\n\n\t\t\t\t#if defined (UNDERWATER_ON)\n\t\t\t\tdP = lerp(float3(0.0,0.0,0.1),dP,tClamped);   //prevents projected grid intersecting near plane\n\t\t\t\t#else\n\t\t\t\tdP = lerp(float3(0.0,0.0,-0.1),dP,tClamped);  //prevents projected grid intersecting near plane\n\t\t\t\t#endif\n\t\t\t\tfloat4 screenP = float4(t * cameraDir + mul(otoc, dP), 1.0);   //position in camera space\n\t\t\t\tfloat3 oceanP = t * oceanDir + dP + float3(0.0, 0.0, _Ocean_CameraPos.z);\n\n\t\t\t\tOUT.pos = mul(UNITY_MATRIX_P, screenP);\n\n\n\t\t\t\tOUT.oceanU = u;\n\t\t\t\tOUT.oceanP = oceanP;\n\n\t\t\t\tOUT.screenPos = ComputeScreenPos(OUT.pos);\n\t\t\t\tOUT.worldPos=mul(_Globals_CameraToWorld , screenP);\n\n\t\t\t\tOUT.viewPos = screenP;\n\t\t\t\t#if SHADER_API_D3D11 || SHADER_API_D3D9 || SHADER_API_D3D || SHADER_API_D3D12\n\t\t\t\tOUT.pos\t= (_PlanetOpacity == 0.0) ? float4(2.0, 2.0, 2.0, 1.0) : OUT.pos;\t\t//cull when completely transparent\n\t\t\t\t#else\n\t\t\t\tOUT.pos = lerp(float4(2.0, 2.0, 2.0, 1.0), OUT.pos, step(0.001,_PlanetOpacity));\t//stupid opengl\n\t\t\t\t#endif\n\n\t\t\t\tfloat3 earthP = normalize(oceanP + float3(0.0, 0.0, _Ocean_Radius)) * (_Ocean_Radius + 10.0);\n\n\t\t\t\tfloat3 sunL, skyE;\n\t\t\t\tSunRadianceAndSkyIrradiance(earthP, float3(0.0,0.0,1.0), _Ocean_SunDir, sunL, skyE);\n\t\t\t\tOUT.sunL = sunL;\n\t\t\t\tOUT.skyE = skyE;\n\n\t\t\t\treturn OUT;\n\t\t\t}\n\n\t\t\tfloat4 frag(v2f IN) : SV_Target\n\t\t\t{\n\t\t\t\tfloat2 u = IN.oceanU;\n\t\t\t\tfloat3 oceanP = IN.oceanP;\n\n\t\t\t\tfloat3 oceanCamera = float3(0.0, 0.0, _Ocean_CameraPos.z);\n\n\t\t\t\tfloat3 V = normalize(oceanCamera - oceanP);\n\n\t\t\t\tfloat2 slopes = float2(0,0);\n\t\t\t\tslopes += tex2D(_Ocean_Map1, u / _Ocean_GridSizes.x).xy;\n\t\t\t\tslopes += tex2D(_Ocean_Map1, u / _Ocean_GridSizes.y).zw;\n\t\t\t\tslopes += tex2D(_Ocean_Map2, u / _Ocean_GridSizes.z).xy;\n\t\t\t\tslopes += tex2D(_Ocean_Map2, u / _Ocean_GridSizes.w).zw;\n\n\t\t\t\tslopes -= oceanP.xy / (_Ocean_Radius + oceanP.z);\n\n\t\t\t\tfloat3 N = normalize(float3(-slopes.x, -slopes.y, 1.0));\n\n\t\t\t\tfloat Jxx = ddx(u.x);\n\t\t\t\tfloat Jxy = ddy(u.x);\n\t\t\t\tfloat Jyx = ddx(u.y);\n\t\t\t\tfloat Jyy = ddy(u.y);\n\t\t\t\tfloat A = Jxx * Jxx + Jyx * Jyx;\n\t\t\t\tfloat B = Jxx * Jxy + Jyx * Jyy;\n\t\t\t\tfloat C = Jxy * Jxy + Jyy * Jyy;\n\t\t\t\tconst float SCALE = 10.0;\n\t\t\t\tfloat ua = pow(A / SCALE, 0.25);\n\t\t\t\tfloat ub = 0.5 + 0.5 * B / sqrt(A * C);\n\t\t\t\tfloat uc = pow(C / SCALE, 0.25);\n\t\t\t\tfloat sigmaSq = tex3D(_Ocean_Variance, float3(ua, ub, uc)).x * _VarianceMax.x;\n\n\t\t\t\tsigmaSq = max(sigmaSq, 2e-5);\n\n\t\t\t\t#if defined (FOAM_ON)\n\t\t\t\t// extract mean and variance of the jacobian matrix determinant\n\t\t\t\tfloat2 jm1 = tex2D(_Ocean_Foam0, u / _Ocean_GridSizes.x).xy;\n\t\t\t\tfloat2 jm2 = tex2D(_Ocean_Foam0, u / _Ocean_GridSizes.y).zw;\n\t\t\t\tfloat2 jm3 = tex2D(_Ocean_Foam1, u / _Ocean_GridSizes.z).xy;\n\t\t\t\tfloat2 jm4 = tex2D(_Ocean_Foam1, u / _Ocean_GridSizes.w).zw;\n\n\t\t\t\tfloat2 jm  = jm1+jm2+jm3+jm4;\n\t\t\t\tfloat jSigma2 = max(jm.y - (jm1.x*jm1.x + jm2.x*jm2.x + jm3.x*jm3.x + jm4.x*jm4.x), 0.0);\n\t\t\t\t#endif\n\n\t\t\t\tfloat3 earthP = normalize(oceanP + float3(0.0, 0.0, _Ocean_Radius)) * (_Ocean_Radius + 10.0);\n\n\t\t\t\tfloat3 sunL = IN.sunL;\n\t\t\t\tfloat3 skyE = IN.skyE;\n\n\t\t\t\thalf shadowTerm = 1.0;\n\t\t\t\t#if defined (OCEAN_SHADOWS_HARD) || defined (OCEAN_SHADOWS_SOFT)\n\t\t\t\tshadowTerm = getOceanShadow (IN.worldPos, -IN.viewPos.z);\n\t\t\t\t#endif\n\n\t\t\t\tfloat fresnel = getFresnel(V, N, sigmaSq);\n\t\t\t\tfloat3 Lsky = getSkyColor(fresnel, V, N, _Ocean_SunDir, earthP, skyE, shadowTerm, _Ocean_Radius);\n\t\t\t\tfloat3 Lsea = getOceanColor(fresnel, V, N, _Ocean_SunDir, earthP, skyE, shadowTerm);\n\n\t\t\t\tfloat oceanDistance = length(IN.viewPos);\n\n\t\t\t\t#if defined (REFRACTIONS_AND_TRANSPARENCY_ON)\n\t\t\t\tfloat fragDistance, depth;\n\t\t\t\tfloat2 uv = IN.screenPos.xy / IN.screenPos.w;\n\n\t\t\t\t#if SHADER_API_D3D11 || SHADER_API_D3D9 || SHADER_API_D3D || SHADER_API_D3D12\n\t\t\t\tuv.y = 1.0 - uv.y;\n\t\t\t\t#endif\n\t\t\t\tuv = getPerturbedUVsAndDepth(uv, N, oceanDistance, fragDistance, depth);\n\n\t\t\t\t_Ocean_WhiteCapStr = adjustWhiteCapStrengthWithDepth(_Ocean_WhiteCapStr, shoreFoam, depth);\n\t\t\t\tfloat transparencyAlpha = getTransparencyAlpha(depth);\n\t\t\t\t#else\n\t\t\t\tfloat transparencyAlpha=1.0;\n\t\t\t\t#endif\n\n\t\t\t\tfloat3 R_ftot = float3(0.0,0.0,0.0);\n#if defined (FOAM_ON)\n\t\t\t\tfloat outWhiteCapStr=applyFarWhiteCapStrength(oceanDistance, alphaRadius, _Ocean_WhiteCapStr, farWhiteCapStr);\n\t\t\t\tR_ftot = getTotalWhiteCapRadiance(outWhiteCapStr, jm.x, jSigma2, sunL, N, _Ocean_SunDir, skyE, shadowTerm);\n#endif\n\n\t\t\t\tfloat3 Lsun = ReflectedSunRadiance(_Ocean_SunDir, V, N, sigmaSq) * sunL * shadowTerm;\n\n\t\t\t\t#if defined (UNDERWATER_ON)\n\t\t\t\tfloat3 surfaceColor = hdr(abs(Lsea + R_ftot),_ScatteringExposure);\n\t\t\t\t#else\n\t\t\t\tfloat3 surfaceColor = hdr(abs(Lsun + Lsea + R_ftot),_ScatteringExposure);\n\t\t\t\tLsky = _Alpha_Global*hdr(Lsky,_SkyExposure);\n\t\t\t\tsurfaceColor = surfaceColor + (1.0-surfaceColor) * Lsky;\n\t\t\t\t#endif\n\t\t\t\tfloat3 LsunTotal = Lsun; float3 R_ftotTotal = R_ftot; float3 LseaTotal = Lsea; float3 LskyTotal = Lsky;\n\t\t\t\t#if defined (PLANETSHINE_ON)\n\n\t\t\t\tgetPlanetShineContribution(LsunTotal, R_ftotTotal, LseaTotal, LskyTotal);\n\t\t\t\t#endif\n\n\t\t\t\t#if SHADER_API_D3D11\n\t\t\t\tbool insideClippingRange = true;\n\t\t\t\t#else\n\t\t\t\tbool insideClippingRange = oceanFragmentInsideOfClippingRange(-IN.viewPos.z/IN.viewPos.w);\n\t\t\t\t#endif\n\n\t\t\t\t#if defined (REFRACTIONS_AND_TRANSPARENCY_ON)\n\t\t\t\ttransparencyAlpha = max(hdr(LsunTotal + R_ftotTotal,_ScatteringExposure), fresnel+transparencyAlpha) ; //seems about perfect\n\t\t\t\ttransparencyAlpha = min(transparencyAlpha, 1.0);\n\n\t\t\t\tfloat3 backGrnd = 0.0;\n\n\t\t\t\t//\t#if defined (DEPTH_BUFFER_MODE_ON)\n\t\t\t\t//\t\t\t\tbackGrnd = tex2D(ScattererScreenCopyBeforeOcean, uv );\n\t\t\t\t//\t#else\n\t\t\t\t#if SHADER_API_D3D11 || SHADER_API_D3D9 || SHADER_API_D3D || SHADER_API_D3D12\n\t\t\t\tbackGrnd = tex2D(ScattererScreenCopyBeforeOcean, (_ProjectionParams.x == 1.0) ? uv : float2(uv.x,1.0-uv.y) );\n\t\t\t\t#else\n\t\t\t\tbackGrnd = tex2D(ScattererScreenCopyBeforeOcean, uv );\n\t\t\t\t#endif\n\t\t\t\t//\t#endif\n\n\t\t\t\t#endif\n\n\t\t\t\t#if defined (UNDERWATER_ON)\n\t\t\t\tLsky = _Alpha_Global*hdr(Lsky,_SkyExposure);\n\t\t\t\tfloat3 transmittance =  hdr(R_ftot, _ScatteringExposure);\n\t\t\t\ttransmittance = clamp(transmittance, float3(0.0,0.0,0.0), float3(1.0,1.0,1.0));\n\t\t\t\ttransmittance = transmittance + (1.0-transmittance) * Lsky;\n\n\t\t\t\tfloat3 finalColor = lerp(transmittance,Lsea, 1-fresnel);\t//consider not using transmittance but instead background texture, change the refraction angle to have something matching what you would see from underwater\n\n\n\t\t\t\t#if defined (REFRACTIONS_AND_TRANSPARENCY_ON)\n\t\t\t\tbackGrnd+=hdr(R_ftotTotal,_ScatteringExposure)*(1-backGrnd); //make foam visible from below as well\n\t\t\t\tfinalColor = (fragDistance < 750000.0) ? backGrnd : finalColor;\n\t\t\t\t#endif\n\n\t\t\t\tfloat3 Vworld = mul ( _Globals_OceanToWorld, float4(V,0.0));\n\t\t\t\tfloat3 Lworld = mul ( _Globals_OceanToWorld, float4(_Ocean_SunDir,0.0));\n\n\t\t\t\tfloat3 earthCamPos = normalize(float3(_Ocean_CameraPos.xy,0.0) + float3(0.0, 0.0, _Ocean_Radius)) * (_Ocean_Radius + 10.0);\n\n\t\t\t\tfloat underwaterDepth = lerp(1.0,0.0,-_Ocean_CameraPos.z / darknessDepth);\n\n\t\t\t\tfloat waterLightExtinction = length(getSkyExtinction(earthCamPos, _Ocean_SunDir));\n\t\t\t\tfloat3 _camPos = _WorldSpaceCameraPos - _planetPos;\n\n\t\t\t\tfloat3 oceanCol = underwaterDepth * hdrNoExposure(waterLightExtinction * _sunColor * oceanColor(-Vworld,Lworld,normalize(_camPos))); //add planetshine loop here over Ls\n\n\t\t\t\tfinalColor= clamp(finalColor, float3(0.0,0.0,0.0),float3(1.0,1.0,1.0));\n\t\t\t\tfinalColor= lerp(finalColor, oceanCol, min(length(oceanCamera - oceanP)/transparencyDepth,1.0));\n\n\t\t\t\treturn float4(dither(finalColor, IN.pos),insideClippingRange);\n\t\t\t\t#else\n\t\t\t\t#if defined (REFRACTIONS_AND_TRANSPARENCY_ON)\n\t\t\t\tfloat3 finalColor = lerp(backGrnd, surfaceColor, transparencyAlpha);\t//refraction on and not underwater\n\t\t\t\t#else\n\t\t\t\tfloat3 finalColor = surfaceColor;  \t\t\t\t\t//refraction off and not underwater\n\t\t\t\t#endif\n\n\t\t\t\t#if defined (DEPTH_BUFFER_MODE_OFF)\n\t\t\t\tif (_PlanetOpacity == 1.0)\n\t\t\t\t{\n\t\t\t\tfloat3 worldPos= IN.worldPos - _planetPos;\n\t\t\t\tworldPos = (length(worldPos) < (Rg + _openglThreshold)) ? (Rg + _openglThreshold) * normalize(worldPos) : worldPos ; //artifacts fix\n\t\t\t\tfloat3 _camPos = _WorldSpaceCameraPos - _planetPos;\n\n\t\t\t\tfloat minDistance = length(worldPos-_camPos);\n\n\t\t\t\t#if defined (GODRAYS_ON)\n\t\t\t\tfloat2 godrayUV = IN.screenPos.xy / IN.screenPos.w;\n\t\t\t\tfloat godrayDepth = 0.0;\n\t\t\t\tgodrayDepth = sampleGodrayDepth(_godrayDepthTexture, godrayUV, 1.0);\n\n\t\t\t\t//trying to find the optical depth from the terrain level\n\t\t\t\tfloat muTerrain = dot(normalize(worldPos), normalize(_camPos - worldPos));\n\n\t\t\t\tgodrayDepth = _godrayStrength * DistanceFromOpticalDepth(_experimentalAtmoScale * (Rt-Rg) * 0.5, length(worldPos), muTerrain, godrayDepth, minDistance);\n\n\t\t\t\tworldPos = worldPos - godrayDepth * normalize(worldPos-_camPos);\n\t\t\t\t#endif\n\n\t\t\t\tfloat3 inscatter=0.0;float3 extinction=1.0;\n\t\t\t\tinscatter = InScattering2(_camPos, worldPos,SUN_DIR,extinction);\n\n\t\t\t\tinscatter*= (minDistance <= _global_depth) ? (1 - exp(-1 * (4 * minDistance / _global_depth))) : 1.0 ; //somehow the shader compiler for OpenGL behaves differently around braces            \t\t\t\t\n\t\t\t\tinscatter = hdr(inscatter,_ScatteringExposure) *_global_alpha;\n\n\t\t\t\tfloat average=(extinction.r+extinction.g+extinction.b)/3;\n\n\t\t\t\t//lerped manually because of an issue with opengl or whatever\n\t\t\t\textinction = _Post_Extinction_Tint * extinction + (1-_Post_Extinction_Tint) * float3(average,average,average);\n\n\t\t\t\textinction= max(float3(0.0,0.0,0.0), (float3(1.0,1.0,1.0)*(1-extinctionThickness) + extinctionThickness*extinction) );\n\n\t\t\t\tfinalColor*= extinction;\n\t\t\t\tfinalColor = inscatter*(1-finalColor) + finalColor;\n\t\t\t\t}\n\t\t\t\t#endif\n\n\t\t\t\tinsideClippingRange = (transparencyAlpha == 1.0) ? 1.0 : insideClippingRange;     //if no transparency -> render normally, if transparency play with the overlap to hide seams between cameras\n\t\t\t\treturn float4(dither(finalColor,IN.pos), _PlanetOpacity*insideClippingRange);\n\t\t\t\t#endif\n\t\t\t}\n\n\t\t\tENDCG\n\t\t}\n\n\n\t\tPass   //forward Add\n\t\t{\n\t\t\tTags { \"LightMode\" = \"ForwardAdd\" } \n\n\n\t\t\tBlend One OneMinusSrcColor //\"reverse\" soft-additive\n\t\t\tOffset 0.0, -0.14 //give a superior depth offset to that of localScattering to prevent scattering that should be behind ocean from appearing in front\n\n\t\t\tCGPROGRAM\n\t\t\t#include \"UnityCG.cginc\"\n\t\t\t#pragma glsl\n\t\t\t#pragma target 3.0\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\n\t\t\t#pragma multi_compile_fwdadd\n//\t\t\t#pragma multi_compile FOAM_OFF FOAM_ON\n\n\t\t\t#include \"../Utility.cginc\"\n\t\t\t//#include \"AtmosphereNew.cginc\"\n\t\t\t#include \"OceanBRDF.cginc\"\n\t\t\t#include \"OceanDisplacement3.cginc\"\n\n\t\t\t#include \"Lighting.cginc\"\n\t\t\t#include \"AutoLight.cginc\"\n\t\t\t#include \"OceanLight.cginc\"\n\n\t\t\tuniform float offScreenVertexStretch;\n\n\t\t\tuniform float4x4 _Globals_ScreenToCamera;\n\t\t\tuniform float4x4 _Globals_CameraToWorld;\n\t\t\tuniform float4x4 _Globals_WorldToScreen;\n\t\t\tuniform float4x4 _Globals_CameraToScreen;\n\t\t\tuniform float4x4 _Globals_WorldToOcean;\n\t\t\tuniform float4x4 _Globals_OceanToWorld;\n\t\t\tuniform float3 _Globals_WorldCameraPos;\n\n\t\t\tuniform float2 _Ocean_MapSize;\n\t\t\tuniform float4 _Ocean_Choppyness;\n\t\t\tuniform float3 _Ocean_SunDir;\n\t\t\tuniform float3 _Ocean_Color;\n\t\t\tuniform float4 _Ocean_GridSizes;\n\t\t\tuniform float2 _Ocean_ScreenGridSize;\n\t\t\tuniform float _Ocean_WhiteCapStr;\n\t\t\tuniform float farWhiteCapStr;\n\n\t\t\tuniform sampler3D _Ocean_Variance;\n\t\t\tuniform sampler2D _Ocean_Map0;\n\t\t\tuniform sampler2D _Ocean_Map1;\n\t\t\tuniform sampler2D _Ocean_Map2;\n\t\t\tuniform sampler2D _Ocean_Map3;\n\t\t\tuniform sampler2D _Ocean_Map4;\n\t\t\tuniform sampler2D _Ocean_Foam0;\n\t\t\tuniform sampler2D _Ocean_Foam1;\n\n\t\t\tuniform float alphaRadius;\n\t\t\tuniform float _ScatteringExposure;\n\t\t\tuniform float _PlanetOpacity;  //to fade out the ocean when PQS is fading out\n\n\t\t\tuniform float2 _VarianceMax;\n\n\t\t\tuniform sampler2D _Sky_Map;\n\n\t\t\tstruct v2f \n\t\t\t{\n\t\t\t\tfloat4  pos : SV_POSITION;\n\t\t\t\tfloat2  oceanU : TEXCOORD0;\n\t\t\t\tfloat3  oceanP : TEXCOORD1;\n\t\t\t\tLIGHTING_COORDS(2,3)\n\t\t\t};\n\n\t\t\tv2f vert(appdata_base v)\n\t\t\t{\n\t\t\t\tfloat t;\n\t\t\t\tfloat3 cameraDir, oceanDir;\n\t\t\t\tfloat4 vert = v.vertex;\n\t\t\t\tvert.xy *= offScreenVertexStretch;\n\n\t\t\t\tfloat2 u = OceanPos(vert, _Globals_ScreenToCamera, t, cameraDir, oceanDir);\t\t//camera dir is viewing direction in camera space\n\t\t\t\tfloat2 dux = OceanPos(vert + float4(_Ocean_ScreenGridSize.x, 0.0, 0.0, 0.0), _Globals_ScreenToCamera) - u;\n\t\t\t\tfloat2 duy = OceanPos(vert + float4(0.0, _Ocean_ScreenGridSize.y, 0.0, 0.0), _Globals_ScreenToCamera) - u;\n\n\t\t\t\tfloat3 dP = float3(0, 0, _Ocean_HeightOffset);\n\n\t\t\t\tif(duy.x != 0.0 || duy.y != 0.0) \n\t\t\t\t{\n\t\t\t\t\tfloat4 GRID_SIZES = _Ocean_GridSizes;\n\t\t\t\t\tfloat4 CHOPPYNESS = _Ocean_Choppyness;\n\n\t\t\t\t\tdP.z += Tex2DGrad(_Ocean_Map0, u / GRID_SIZES.x, dux / GRID_SIZES.x, duy / GRID_SIZES.x, _Ocean_MapSize).x;\n\t\t\t\t\tdP.z += Tex2DGrad(_Ocean_Map0, u / GRID_SIZES.y, dux / GRID_SIZES.y, duy / GRID_SIZES.y, _Ocean_MapSize).y;\n\t\t\t\t\tdP.z += Tex2DGrad(_Ocean_Map0, u / GRID_SIZES.z, dux / GRID_SIZES.z, duy / GRID_SIZES.z, _Ocean_MapSize).z;\n\t\t\t\t\tdP.z += Tex2DGrad(_Ocean_Map0, u / GRID_SIZES.w, dux / GRID_SIZES.w, duy / GRID_SIZES.w, _Ocean_MapSize).w;\n\n\t\t\t\t\tdP.xy += CHOPPYNESS.x * Tex2DGrad(_Ocean_Map3, u / GRID_SIZES.x, dux / GRID_SIZES.x, duy / GRID_SIZES.x, _Ocean_MapSize).xy;\n\t\t\t\t\tdP.xy += CHOPPYNESS.y * Tex2DGrad(_Ocean_Map3, u / GRID_SIZES.y, dux / GRID_SIZES.y, duy / GRID_SIZES.y, _Ocean_MapSize).zw;\n\t\t\t\t\tdP.xy += CHOPPYNESS.z * Tex2DGrad(_Ocean_Map4, u / GRID_SIZES.z, dux / GRID_SIZES.z, duy / GRID_SIZES.z, _Ocean_MapSize).xy;\n\t\t\t\t\tdP.xy += CHOPPYNESS.w * Tex2DGrad(_Ocean_Map4, u / GRID_SIZES.w, dux / GRID_SIZES.w, duy / GRID_SIZES.w, _Ocean_MapSize).zw;\n\t\t\t\t}\n\n\t\t\t\tv2f OUT;\n\n\t\t\t\tfloat3x3 otoc = _Ocean_OceanToCamera;\n\t\t\t\tfloat tClamped = clamp(t*0.25, 0.0, 1.0);\n\n\t\t\t\tdP = lerp(float3(0.0,0.0,-0.1),dP,tClamped);  //prevents projected grid intersecting near plane\n\n\t\t\t\tfloat4 screenP = float4(t * cameraDir + mul(otoc, dP), 1.0);   //position in camera space?\n\t\t\t\tfloat3 oceanP = t * oceanDir + dP + float3(0.0, 0.0, _Ocean_CameraPos.z);\n\n\t\t\t\tOUT.pos = mul(_Globals_CameraToScreen, screenP);\n\t\t\t\tOUT.pos.y = OUT.pos.y *_ProjectionParams.x;\n\n\t\t\t\tOUT.oceanU = u;\n\t\t\t\tOUT.oceanP = oceanP;\n\n\t\t\t\tfloat4 worldPos=mul(_Globals_CameraToWorld , screenP);\n\t\t\t\tOCEAN_TRANSFER_VERTEX_TO_FRAGMENT(OUT);\n\n\t\t\t\tOUT.pos\t= (_PlanetOpacity == 1.0) ? OUT.pos : float4(2.0, 2.0, 2.0, 1.0) ; //cull when planet starts fading out\n\t\t\t\t\t\t\n\t\t\t\treturn OUT;\n\t\t\t}\n\n\n\t\t\tfloat4 frag(v2f IN) : COLOR\n\t\t\t{\n\t\t\t\tfloat radius = _Ocean_Radius;\n\t\t\t\tfloat2 u = IN.oceanU;\n\t\t\t\tfloat3 oceanP = IN.oceanP;\n\n\t\t\t\tfloat3 earthCamera = float3(0.0, 0.0, _Ocean_CameraPos.z + radius); \n\n\t\t\t\tfloat3 earthP = normalize(oceanP + float3(0.0, 0.0, radius)) * (radius + 10.0); \n\n\t\t\t\tfloat dist=length(earthP-earthCamera);\n\n\t\t\t\tfloat clampFactor= clamp(dist/alphaRadius,0.0,1.0);\t\t\t\n\n\t\t\t\tfloat outWhiteCapStr=lerp(_Ocean_WhiteCapStr,farWhiteCapStr,clampFactor);\n\n\t\t\t\tfloat3 oceanCamera = float3(0.0, 0.0, _Ocean_CameraPos.z);\n\t\t\t\tfloat3 V = normalize(oceanCamera - oceanP);\n\n\t\t\t\tfloat2 slopes = float2(0,0);\n\t\t\t\tslopes += tex2D(_Ocean_Map1, u / _Ocean_GridSizes.x).xy;\n\t\t\t\tslopes += tex2D(_Ocean_Map1, u / _Ocean_GridSizes.y).zw;\n\t\t\t\tslopes += tex2D(_Ocean_Map2, u / _Ocean_GridSizes.z).xy;\n\t\t\t\tslopes += tex2D(_Ocean_Map2, u / _Ocean_GridSizes.w).zw;\n\n\t\t\t\tslopes -= oceanP.xy / (radius + oceanP.z);\n\n\t\t\t\tfloat3 N = normalize(float3(-slopes.x, -slopes.y, 1.0));\n\n\t\t\t\tif (dot(V, N) < 0.0) {\n\t\t\t\t\tN = reflect(N, V); // reflects backfacing normals\n\t\t\t\t}\n\n\t\t\t\tfloat Jxx = ddx(u.x);\n\t\t\t\tfloat Jxy = ddy(u.x);\n\t\t\t\tfloat Jyx = ddx(u.y);\n\t\t\t\tfloat Jyy = ddy(u.y);\n\t\t\t\tfloat A = Jxx * Jxx + Jyx * Jyx;\n\t\t\t\tfloat B = Jxx * Jxy + Jyx * Jyy;\n\t\t\t\tfloat C = Jxy * Jxy + Jyy * Jyy;\n\t\t\t\tconst float SCALE = 10.0;\n\t\t\t\tfloat ua = pow(A / SCALE, 0.25);\n\t\t\t\tfloat ub = 0.5 + 0.5 * B / sqrt(A * C);\n\t\t\t\tfloat uc = pow(C / SCALE, 0.25);\n\t\t\t\t//\t\t\t    float sigmaSq = tex3D(_Ocean_Variance, float3(ua, ub, uc)).x;\n\t\t\t\tfloat2 sigmaSq = tex3D(_Ocean_Variance, float3(ua, ub, uc)).xy * _VarianceMax;\n\n\t\t\t\tsigmaSq = max(sigmaSq, 2e-5);\n\n\t\t\t\tfloat atten=LIGHT_ATTENUATION(IN)*15;\n\n\t\t\t\tfloat3 Lsky;\n\t\t\t\tLsky = MeanFresnel(V, N, sigmaSq) * atten / M_PI;\n\n\t\t\t\tfloat3 oceanL= mul(_Globals_WorldToOcean, _WorldSpaceLightPos0);\n\t\t\t\tfloat3 L = normalize(oceanL - oceanP); //light dir in ocean space, find it\n\t\t\t\tfloat3 Lsun = ReflectedSunRadiance(L, V, N, sigmaSq) * atten;\n\n\t\t\t\tfloat3 Lsea = RefractedSeaRadiance(V, N, sigmaSq) * _Ocean_Color * atten;\n\n//#if defined (FOAM_ON)\n//\t\t\t\t// extract mean and variance of the jacobian matrix determinant\n//\t\t\t\tfloat2 jm1 = tex2D(_Ocean_Foam0, u / _Ocean_GridSizes.x).xy;\n//\t\t\t\tfloat2 jm2 = tex2D(_Ocean_Foam0, u / _Ocean_GridSizes.y).zw;\n//\t\t\t\tfloat2 jm3 = tex2D(_Ocean_Foam1, u / _Ocean_GridSizes.z).xy;\n//\t\t\t\tfloat2 jm4 = tex2D(_Ocean_Foam1, u / _Ocean_GridSizes.w).zw;\n//\t\t\t\tfloat2 jm  = jm1+jm2+jm3+jm4;\n//\t\t\t\tfloat jSigma2 = max(jm.y - (jm1.x*jm1.x + jm2.x*jm2.x + jm3.x*jm3.x + jm4.x*jm4.x), 0.0);\n//\n//\t\t\t\t// get coverage\n//\t\t\t\tfloat W = WhitecapCoverage(outWhiteCapStr,jm.x,jSigma2);\n//\n//\t\t\t\t// compute and add whitecap radiance\n//\t\t\t\t//\t\t\t\tfloat3 l = (atten * (max(dot(N, L), 0.0))) / M_PI;\n//\t\t\t\t//\t\t\t\tfloat3 R_ftot = float3(W * l * 0.4);\n//#endif\n\n\t\t\t\t//float3 surfaceColor = (Lsun + Lsky + Lsea + R_ftot) * _LightColor0.rgb;\n\t\t\t\tfloat3 surfaceColor = (Lsun + Lsky + Lsea) * _LightColor0.rgb;\n\n\t\t\t\tfloat3 finalColor= surfaceColor;\n\n\t\t\t\treturn float4(hdr(finalColor,_ScatteringExposure), 1.0);\n\t\t\t}\n\n\t\t\tENDCG\n\t\t}\n\t}\n}\n\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/OceanWhiteCapsModProj3PixelLights.shader.meta",
    "content": "fileFormatVersion: 2\nguid: 8a653817be39efa48bd2461f691b7249\ntimeCreated: 1474705423\nlicenseType: Free\nShaderImporter:\n  defaultTextures: []\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/OceanWhiteCapsModProj3VertexSearch.shader",
    "content": "﻿/*\n * Proland: a procedural landscape rendering library.\n * Copyright (c) 2008-2011 INRIA\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\n */\n\n/*\n* Proland is distributed under a dual-license scheme.\n* You can obtain a specific license from Inria: proland-licensing@inria.fr.\n*/\n\n/*\n* Authors: Eric Bruneton, Antoine Begault, Guillaume Piolat.\n*/\n\n/**\n* Real-time Realistic Ocean Lighting using Seamless Transitions from Geometry to BRDF\n* Copyright (c) 2009 INRIA\n* All rights reserved.\n*\n* Redistribution and use in source and binary forms, with or without\n* modification, are permitted provided that the following conditions\n* are met:\n* 1. Redistributions of source code must retain the above copyright\n*    notice, this list of conditions and the following disclaimer.\n* 2. Redistributions in binary form must reproduce the above copyright\n*    notice, this list of conditions and the following disclaimer in the\n*    documentation and/or other materials provided with the distribution.\n* 3. Neither the name of the copyright holders nor the names of its\n*    contributors may be used to endorse or promote products derived from\n*    this software without specific prior written permission.\n*\n* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n\t* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n\t* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\n* THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n/**\n* Author: Eric Bruneton\n* Modified and ported to Unity by Justin Hawkins 2014\n* Modified and adapted for use with Kerbal Space Program by Ghassen Lahmar 2015-2020\n\t*/\n\n\tShader \"Scatterer/OceanWhiteCapsVertexSearch\" \n{\n\tSubShader \n\t{\n\t\tTags { \"Queue\" = \"Geometry+100\"\n\t\t\t\t\"RenderType\"=\"Transparent\"\n\t\t\t\t\"IgnoreProjector\"=\"True\"}\n\n\t\tPass   \n\t\t{\n\n\t\t\tTags { \"Queue\" = \"Geometry+100\"\n\t\t\t\t\t\"RenderType\"=\"Transparent\"\n\t\t\t\t\t\"IgnoreProjector\"=\"True\"}\n\n\t\t\tBlend SrcAlpha OneMinusSrcAlpha\n\t\t\tOffset 0.0, -0.14\n\n\t\t\tCull Back\n\n\t\t\tZWrite [_ZwriteVariable]\n\n\t\t\tCGPROGRAM\n\t\t\t#include \"UnityCG.cginc\"\n\t\t\t#pragma glsl\n\t\t\t#pragma target 3.0\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\n\t\t\t//#pragma multi_compile PLANETSHINE_OFF PLANETSHINE_ON\n\t\t\t#pragma multi_compile SKY_REFLECTIONS_OFF SKY_REFLECTIONS_ON\n\t\t\t#pragma multi_compile UNDERWATER_OFF UNDERWATER_ON\n\t\t\t#pragma multi_compile OCEAN_SHADOWS_OFF OCEAN_SHADOWS_HARD OCEAN_SHADOWS_SOFT\n\t\t\t#pragma multi_compile REFRACTIONS_AND_TRANSPARENCY_OFF REFRACTIONS_AND_TRANSPARENCY_ON\n\t\t\t#pragma multi_compile SCATTERER_MERGED_DEPTH_ON SCATTERER_MERGED_DEPTH_OFF\n\t\t\t#pragma multi_compile DITHERING_OFF DITHERING_ON\n\t\t\t#pragma multi_compile GODRAYS_OFF GODRAYS_ON\n\t\t\t//#pragma multi_compile SCATTERING_ON SCATTERING_OFF\n\n\t\t\t#include \"../CommonAtmosphere.cginc\"\n\t\t\t#include \"../DepthCommon.cginc\"\n\t\t\t#if defined (OCEAN_SHADOWS_HARD) || defined (OCEAN_SHADOWS_SOFT)\n\t\t\t#include \"OceanShadows.cginc\"\n\t\t\t#endif\t\t\t\n\t\t\t#include \"OceanBRDF.cginc\"\n\t\t\t#include \"OceanDisplacement3.cginc\"\n\t\t\t#include \"OceanUtils.cginc\"\n\t\t\t#include \"../ClippingUtils.cginc\"\n\t\t\t#include \"../Atmo/Godrays/GodraysCommon.cginc\"\n\n\t\t\tuniform float offScreenVertexStretch;\n\n\t\t\tuniform float4x4 _Globals_ScreenToCamera;\n\t\t\tuniform float4x4 _Globals_CameraToWorld;\n\t\t\tuniform float4x4 _Globals_WorldToScreen;\n\t\t\tuniform float4x4 _Globals_CameraToScreen;\n\t\t\tuniform float3 _Globals_WorldCameraPos;\n\n\t\t\tuniform float4x4 _Globals_WorldToOcean;\n\t\t\tuniform float4x4 _Globals_OceanToWorld;\n\n\t\t\tuniform float3 _Sun_WorldSunDir;\n\n\t\t\tuniform float2 _Ocean_MapSize;\n\t\t\tuniform float4 _Ocean_Choppyness;\n\t\t\tuniform float3 _Ocean_SunDir;\n\t\t\tuniform float4 _Ocean_GridSizes;\n\t\t\tuniform float2 _Ocean_ScreenGridSize;\n\t\t\tuniform float _Ocean_WhiteCapStr;\n\t\t\tuniform float farWhiteCapStr;\n\t\t\tuniform float shoreFoam;\n\n\t\t\tuniform sampler3D _Ocean_Variance;\n\t\t\tuniform sampler2D _Ocean_Map0;\n\t\t\tuniform sampler2D _Ocean_Map1;\n\t\t\tuniform sampler2D _Ocean_Map2;\n\t\t\tuniform sampler2D _Ocean_Map3;\n\t\t\tuniform sampler2D _Ocean_Map4;\n\t\t\tuniform sampler2D _Ocean_Foam0;\n\t\t\tuniform sampler2D _Ocean_Foam1;\n\n\t\t\tuniform float alphaRadius;\n\t\t\tuniform float _PlanetOpacity;  //to fade out the ocean when PQS is fading out\n\t\t\tuniform float _ScatteringExposure;\n\n\t\t\tuniform float _Alpha_Global;\n\t\t\tuniform float _SkyExposure;\n\n\t\t\tuniform float2 _VarianceMax;\n\n\t\t\tuniform float darknessDepth;\n\n\t\t\tuniform float3 _planetPos;\n\t\t\tuniform float _openglThreshold;\n\t\t\tuniform float _global_depth;\n\t\t\tuniform float _global_alpha;\n\t\t\tuniform float _Post_Extinction_Tint;\n\t\t\tuniform float extinctionThickness;\n\n\t\t\t#if defined (REFRACTIONS_AND_TRANSPARENCY_ON)\n\t\t\tuniform sampler2D ScattererScreenCopy;   //background texture used for refraction\n\t\t\t#endif\n\n\t\t\t#if defined (GODRAYS_ON)\n\t\t\tuniform sampler2D _godrayDepthTexture;\n\t\t\tuniform float _godrayStrength;\n\t\t\t#endif\n\n\t\t\t#if defined (PLANETSHINE_ON)\n\t\t\tuniform float4x4 planetShineSources;\n\t\t\tuniform float4x4 planetShineRGB;\n\t\t\t#endif\n\n\t\t\tstruct v2f \n\t\t\t{\n\t\t\t\t//float4  pos : SV_POSITION;\n\t\t\t\tfloat2  oceanU : TEXCOORD0;\n\t\t\t\tfloat3  oceanP : TEXCOORD1;\n\t\t\t\tfloat4 \tscreenPos : TEXCOORD2;\n\t\t\t\tfloat4 \tworldPos : TEXCOORD3;\n\t\t\t\tfloat4  viewPos  :TEXCOORD4;\n\t\t\t};\n\n\t\t\tfloat2 SampleDisplacement(float2 oceanPos)\n\t\t\t{\n\t\t\t\tfloat2 displacement = 0;\n\n\t\t\t\tdisplacement += _Ocean_Choppyness.x * tex2Dlod(_Ocean_Map3, float4(oceanPos / _Ocean_GridSizes.x,0.0, 0.0) ).xy;\n\t\t\t\tdisplacement += _Ocean_Choppyness.y * tex2Dlod(_Ocean_Map3, float4(oceanPos / _Ocean_GridSizes.y,0.0, 0.0) ).zw;\n\t\t\t\tdisplacement += _Ocean_Choppyness.z * tex2Dlod(_Ocean_Map4, float4(oceanPos / _Ocean_GridSizes.z,0.0, 0.0) ).xy;\n\t\t\t\tdisplacement += _Ocean_Choppyness.w * tex2Dlod(_Ocean_Map4, float4(oceanPos / _Ocean_GridSizes.w,0.0, 0.0) ).zw;\n\n\t\t\t\treturn displacement;\n\t\t\t}\n\n\t\t\tv2f vert(appdata_base v, out float4 outpos: SV_POSITION)\n\t\t\t{\n\t\t\t\tfloat t;\n\t\t\t\tfloat3 cameraDir, oceanDir;\n\t\t\t\tfloat4 vert = v.vertex;\n\t\t\t\tvert.xy *= offScreenVertexStretch;\n\n\t\t\t\tfloat2 u = OceanPos(vert, _Globals_ScreenToCamera, t, cameraDir, oceanDir);\t//camera dir is viewing direction in camera space\n\t\t\t\tfloat2 dux = OceanPos(vert + float4(_Ocean_ScreenGridSize.x, 0.0, 0.0, 0.0), _Globals_ScreenToCamera) - u;\n\t\t\t\tfloat2 duy = OceanPos(vert + float4(0.0, _Ocean_ScreenGridSize.y, 0.0, 0.0), _Globals_ScreenToCamera) - u;\n\n\t\t\t\t//instead of using this u, t and oceanDir, need to do a search for the oceanPos that when displaced gives me this position, then apply no displacement here only up\n\t\t\t\t//knowing that you need dux and duy for every search step though is depressing\n\n\t\t\t\tfloat3 dP = float3(0, 0, _Ocean_HeightOffset);\n\n\t\t\t\tif(duy.x != 0.0 || duy.y != 0.0)  //wtf is this condition even\n\t\t\t\t{\n\t\t\t\t\t//test all of these without tex2dgrad? I don't remember if they make a difference\n\t\t\t\t\t//yep they do, a lot more shimmering without them\n\n//\t\t\t\t\tdP.z += Tex2DGrad(_Ocean_Map0, u / _Ocean_GridSizes.x, dux / _Ocean_GridSizes.x, duy / _Ocean_GridSizes.x, _Ocean_MapSize).x;\n//\t\t\t\t\tdP.z += Tex2DGrad(_Ocean_Map0, u / _Ocean_GridSizes.y, dux / _Ocean_GridSizes.y, duy / _Ocean_GridSizes.y, _Ocean_MapSize).y;\n//\t\t\t\t\tdP.z += Tex2DGrad(_Ocean_Map0, u / _Ocean_GridSizes.z, dux / _Ocean_GridSizes.z, duy / _Ocean_GridSizes.z, _Ocean_MapSize).z;\n//\t\t\t\t\tdP.z += Tex2DGrad(_Ocean_Map0, u / _Ocean_GridSizes.w, dux / _Ocean_GridSizes.w, duy / _Ocean_GridSizes.w, _Ocean_MapSize).w;\n//\t\t\t\t\t//\n//\t\t\t\t\tdP.xy += _Ocean_Choppyness.x * Tex2DGrad(_Ocean_Map3, u / _Ocean_GridSizes.x, dux / _Ocean_GridSizes.x, duy / _Ocean_GridSizes.x, _Ocean_MapSize).xy;\n//\t\t\t\t\tdP.xy += _Ocean_Choppyness.y * Tex2DGrad(_Ocean_Map3, u / _Ocean_GridSizes.y, dux / _Ocean_GridSizes.y, duy / _Ocean_GridSizes.y, _Ocean_MapSize).zw;\n//\t\t\t\t\tdP.xy += _Ocean_Choppyness.z * Tex2DGrad(_Ocean_Map4, u / _Ocean_GridSizes.z, dux / _Ocean_GridSizes.z, duy / _Ocean_GridSizes.z, _Ocean_MapSize).xy;\n//\t\t\t\t\tdP.xy += _Ocean_Choppyness.w * Tex2DGrad(_Ocean_Map4, u / _Ocean_GridSizes.w, dux / _Ocean_GridSizes.w, duy / _Ocean_GridSizes.w, _Ocean_MapSize).zw;\n\n\t\t\t\t\t//\t\t\t\t\tdP.z += tex2Dlod(_Ocean_Map0, float4( u / _Ocean_GridSizes.x, 0.0, 0.0)).x;\n\t\t\t\t\t//\t\t\t\t\tdP.z += tex2Dlod(_Ocean_Map0, float4( u / _Ocean_GridSizes.y, 0.0, 0.0)).y;\n\t\t\t\t\t//\t\t\t\t\tdP.z += tex2Dlod(_Ocean_Map0, float4( u / _Ocean_GridSizes.z, 0.0, 0.0)).z;\n\t\t\t\t\t//\t\t\t\t\tdP.z += tex2Dlod(_Ocean_Map0, float4( u / _Ocean_GridSizes.w, 0.0, 0.0)).w;\n\t\t\t\t\t//\n\t\t\t\t\t//\t\t\t\t\tdP.xy += _Ocean_Choppyness.x * tex2Dlod(_Ocean_Map3, float4( u / _Ocean_GridSizes.x, 0.0, 0.0)).xy;\n\t\t\t\t\t//\t\t\t\t\tdP.xy += _Ocean_Choppyness.y * tex2Dlod(_Ocean_Map3, float4( u / _Ocean_GridSizes.y, 0.0, 0.0)).zw;\n\t\t\t\t\t//\t\t\t\t\tdP.xy += _Ocean_Choppyness.z * tex2Dlod(_Ocean_Map4, float4( u / _Ocean_GridSizes.z, 0.0, 0.0)).xy;\n\t\t\t\t\t//\t\t\t\t\tdP.xy += _Ocean_Choppyness.w * tex2Dlod(_Ocean_Map4, float4( u / _Ocean_GridSizes.w, 0.0, 0.0)).zw;\n\t\t\t\t}\n\n\t\t\t\tfloat precisionRequired = 0.00;\n\n\t\t\t\tfloat2 currentPosition = u;\n\t\t\t\tfloat2 displacement = SampleDisplacement (currentPosition);\n\t\t\t\tfloat2 resultingPosition = currentPosition + displacement;\n\n\t\t\t\tfor (int i = 0; i < 50; i++)\n\t\t\t\t{\n\t\t\t\t\tif (length(resultingPosition - u) <= precisionRequired)\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tfloat2 newPosition = currentPosition - (resultingPosition - u);\n\t\t\t\t\tfloat2 newDisplacement = SampleDisplacement (newPosition);\n\t\t\t\t\tfloat2 newResultingPosition = newPosition + newDisplacement;\n\n\t\t\t\t\tcurrentPosition = newPosition;\n\t\t\t\t\tresultingPosition = newResultingPosition;\n\t\t\t\t}\n\n\t\t\t\tu = currentPosition; //t, cameraDir and oceanDir need to be recalculated here\n\n//\t\t\t\tdP.z += tex2Dlod(_Ocean_Map0, float4( u / _Ocean_GridSizes.x, 0.0, 0.0)).x;\n//\t\t\t\tdP.z += tex2Dlod(_Ocean_Map0, float4( u / _Ocean_GridSizes.y, 0.0, 0.0)).y;\n//\t\t\t\tdP.z += tex2Dlod(_Ocean_Map0, float4( u / _Ocean_GridSizes.z, 0.0, 0.0)).z;\n//\t\t\t\tdP.z += tex2Dlod(_Ocean_Map0, float4( u / _Ocean_GridSizes.w, 0.0, 0.0)).w;\n\n\t\t\t\t//HACK, dux and duy no longer match u but might end up looking ok still\n\t\t\t\tdP.z += Tex2DGrad(_Ocean_Map0, u / _Ocean_GridSizes.x, dux / _Ocean_GridSizes.x, duy / _Ocean_GridSizes.x, _Ocean_MapSize).x;\n\t\t\t\tdP.z += Tex2DGrad(_Ocean_Map0, u / _Ocean_GridSizes.y, dux / _Ocean_GridSizes.y, duy / _Ocean_GridSizes.y, _Ocean_MapSize).y;\n\t\t\t\tdP.z += Tex2DGrad(_Ocean_Map0, u / _Ocean_GridSizes.z, dux / _Ocean_GridSizes.z, duy / _Ocean_GridSizes.z, _Ocean_MapSize).z;\n\t\t\t\tdP.z += Tex2DGrad(_Ocean_Map0, u / _Ocean_GridSizes.w, dux / _Ocean_GridSizes.w, duy / _Ocean_GridSizes.w, _Ocean_MapSize).w;\n\n\t\t\t\t//still can see edges somehow?\n\t\t\t\t//even though only displacing up can still see edges, need the stuff that is behind the camera to be displaced up to come into view when tilted\n\t\t\t\t//need the projector to cover from the camera position to where it's far plane intersects the horizon (you know what I mean)\n\t\t\t\t//then combine that with my search method (though it seems buggy here somehow?)\n\n\t\t\t\tv2f OUT;\n\n\t\t\t\tfloat3x3 otoc = _Ocean_OceanToCamera;\n\t\t\t\tfloat tClamped = clamp(t*0.25, 0.0, 1.0);\n\n\t\t\t\t#if defined (UNDERWATER_ON)\n\t\t\t\tdP = lerp(float3(0.0,0.0,0.1),dP,tClamped);  //prevents projected grid intersecting near plane\n\t\t\t\t#else\n\t\t\t\tdP = lerp(float3(0.0,0.0,-0.1),dP,tClamped);  //prevents projected grid intersecting near plane\n\t\t\t\t#endif\n//\t\t\t\tfloat4 screenP = float4(t * cameraDir + mul(otoc, dP), 1.0);   //position in camera space\n//\t\t\t\tfloat3 oceanP = t * oceanDir + dP + float3(0.0, 0.0, _Ocean_CameraPos.z);\n\n\t\t\t\tfloat3 oceanP = float3(u-_Ocean_CameraPos.xy, dP.z);\n\t\t\t\tfloat4 screenP = mul(_Ocean_OceanToCamera, float4(oceanP,1.0));   //position in camera space\n\n\n\t\t\t\toutpos = mul(UNITY_MATRIX_P, screenP);\n\n\t\t\t\tOUT.oceanU = u;\n\t\t\t\tOUT.oceanP = oceanP;\n\n\t\t\t\tOUT.screenPos = ComputeScreenPos(outpos);\n\t\t\t\tOUT.worldPos=mul(_Globals_CameraToWorld , screenP);\n\n\t\t\t\tOUT.viewPos = screenP;\n\n\t\t\t\toutpos\t= (_PlanetOpacity == 0.0) ? float4(2.0, 2.0, 2.0, 1.0) : outpos; //cull when completely transparent\n\n\t\t\t\treturn OUT;\n\t\t\t}\n\n\t\t\tfloat4 frag(v2f IN, UNITY_VPOS_TYPE screenPos : VPOS) : SV_Target\n\t\t\t{\n\n\t\t\t\tfloat3 L = _Ocean_SunDir;\n\t\t\t\tfloat radius = _Ocean_Radius;\n\t\t\t\tfloat2 u = IN.oceanU;\n\t\t\t\tfloat3 oceanP = IN.oceanP;\n\n\t\t\t\tfloat3 oceanCamera = float3(0.0, 0.0, _Ocean_CameraPos.z);\n\n\t\t\t\tfloat3 V = normalize(oceanCamera - oceanP);\n\n\t\t\t\tfloat2 slopes = float2(0,0);\n\t\t\t\tslopes += tex2D(_Ocean_Map1, u / _Ocean_GridSizes.x).xy;\n\t\t\t\tslopes += tex2D(_Ocean_Map1, u / _Ocean_GridSizes.y).zw;\n\t\t\t\tslopes += tex2D(_Ocean_Map2, u / _Ocean_GridSizes.z).xy;\n\t\t\t\tslopes += tex2D(_Ocean_Map2, u / _Ocean_GridSizes.w).zw;\n\n\t\t\t\tslopes -= oceanP.xy / (radius + oceanP.z);\n\n\t\t\t\tfloat3 N = normalize(float3(-slopes.x, -slopes.y, 1.0));\n\n\t\t\t\tfloat Jxx = ddx(u.x);\n\t\t\t\tfloat Jxy = ddy(u.x);\n\t\t\t\tfloat Jyx = ddx(u.y);\n\t\t\t\tfloat Jyy = ddy(u.y);\n\t\t\t\tfloat A = Jxx * Jxx + Jyx * Jyx;\n\t\t\t\tfloat B = Jxx * Jxy + Jyx * Jyy;\n\t\t\t\tfloat C = Jxy * Jxy + Jyy * Jyy;\n\t\t\t\tconst float SCALE = 10.0;\n\t\t\t\tfloat ua = pow(A / SCALE, 0.25);\n\t\t\t\tfloat ub = 0.5 + 0.5 * B / sqrt(A * C);\n\t\t\t\tfloat uc = pow(C / SCALE, 0.25);\n\t\t\t\tfloat sigmaSq = tex3D(_Ocean_Variance, float3(ua, ub, uc)).x * _VarianceMax.x;\n\n\t\t\t\tsigmaSq = max(sigmaSq, 2e-5);\n\n\t\t\t\t// extract mean and variance of the jacobian matrix determinant\n\t\t\t\tfloat2 jm1 = tex2D(_Ocean_Foam0, u / _Ocean_GridSizes.x).xy;\n\t\t\t\tfloat2 jm2 = tex2D(_Ocean_Foam0, u / _Ocean_GridSizes.y).zw;\n\t\t\t\tfloat2 jm3 = tex2D(_Ocean_Foam1, u / _Ocean_GridSizes.z).xy;\n\t\t\t\tfloat2 jm4 = tex2D(_Ocean_Foam1, u / _Ocean_GridSizes.w).zw;\n\t\t\t\tfloat2 jm  = jm1+jm2+jm3+jm4;\n\t\t\t\tfloat jSigma2 = max(jm.y - (jm1.x*jm1.x + jm2.x*jm2.x + jm3.x*jm3.x + jm4.x*jm4.x), 0.0);\n\n\t\t\t\tfloat3 earthP = normalize(oceanP + float3(0.0, 0.0, radius)) * (radius + 10.0);\n\n\t\t\t\tfloat3 sunL, skyE, Lsky;\n\t\t\t\tSunRadianceAndSkyIrradiance(earthP, N, L, _sunColor, sunL, skyE); //only thing I can think of that could potebtially be moved to vertex shader without a significant loss of quality?\n\n\t\t\t\thalf shadowTerm = 1.0;\n\t\t\t\t#if defined (OCEAN_SHADOWS_HARD) || defined (OCEAN_SHADOWS_SOFT)\n\t\t\t\tshadowTerm = getOceanShadow (IN.worldPos, -IN.viewPos.z);\n\t\t\t\t#endif\n\n\t\t\t\tfloat fresnel = getFresnel(V, N, sigmaSq);\n\t\t\t\tLsky = getSkyColor(fresnel, V, N, L, earthP, skyE, shadowTerm, radius, _sunColor, 1.0);\n\t\t\t\tfloat3 Lsea = getOceanColor(fresnel, V, N, L, earthP, skyE, shadowTerm, _sunColor);\n\n\t\t\t\tfloat oceanDistance = length(IN.viewPos);\n\n\t\t\t\t#if defined (REFRACTIONS_AND_TRANSPARENCY_ON)\n\t\t\t\tfloat fragDistance, depth;\n\t\t\t\tfloat2 uv = getPerturbedUVsAndDepth(IN.screenPos.xy / IN.screenPos.w, N, oceanDistance, fragDistance, depth);\n\n\t\t\t\t_Ocean_WhiteCapStr = adjustWhiteCapStrengthWithDepth(_Ocean_WhiteCapStr, shoreFoam, depth);\n\t\t\t\tfloat transparencyAlpha = getTransparencyAlpha(depth);\n\t\t\t\t#else\n\t\t\t\tfloat transparencyAlpha=1.0;\n\t\t\t\t#endif\n\t\t\t\tfloat outWhiteCapStr=applyFarWhiteCapStrength(oceanDistance, alphaRadius, _Ocean_WhiteCapStr, farWhiteCapStr);\n\t\t\t\tfloat3 R_ftot = getTotalWhiteCapRadiance(outWhiteCapStr, jm.x, jSigma2, sunL, N, L, skyE, shadowTerm, 1.0);\n\n\t\t\t\tfloat3 Lsun = ReflectedSunRadiance(L, V, N, sigmaSq) * sunL * shadowTerm;\n\n\t\t\t\t#if defined (UNDERWATER_ON)\n\t\t\t\tfloat3 surfaceColor = hdr(abs(Lsea + R_ftot),_ScatteringExposure);\n\t\t\t\t#else\n\t\t\t\tfloat3 surfaceColor = hdr(abs(Lsun + Lsea + R_ftot),_ScatteringExposure);\n\t\t\t\tLsky = _Alpha_Global*hdr(Lsky,_SkyExposure);\n\t\t\t\tsurfaceColor = surfaceColor + (1.0-surfaceColor) * Lsky;\n\t\t\t\t#endif\n\t\t\t\tfloat3 LsunTotal = Lsun; float3 R_ftotTotal = R_ftot; float3 LseaTotal = Lsea; float3 LskyTotal = Lsky;\n//\t\t\t\t#if defined (PLANETSHINE_ON)\n//\n//\t\t\t\tgetPlanetShineContribution(LsunTotal, R_ftotTotal, LseaTotal, LskyTotal);\n//\t\t\t\t#endif\n\n\t\t\t\tbool insideClippingRange = oceanFragmentInsideOfClippingRange(-IN.viewPos.z/IN.viewPos.w);\n\n\t\t\t\t#if defined (REFRACTIONS_AND_TRANSPARENCY_ON)\n\t\t\t\ttransparencyAlpha = max(hdr(LsunTotal + R_ftotTotal,_ScatteringExposure), fresnel+transparencyAlpha) ; //seems about perfect\n\t\t\t\ttransparencyAlpha = min(transparencyAlpha, 1.0);\n\n\t\t\t\t#if SHADER_API_D3D11 || SHADER_API_D3D9 || SHADER_API_D3D || SHADER_API_D3D12\n\t\t\t\tfloat3 backGrnd = tex2D(ScattererScreenCopy, (_ProjectionParams.x == 1.0) ? float2(uv.x,1.0-uv.y): uv  );\n\t\t\t\t#else\n\t\t\t\tfloat3 backGrnd = tex2D(ScattererScreenCopy, uv );\n\t\t\t\t#endif\n\t\t\t\t#endif\n\n\t\t\t\t#if defined (UNDERWATER_ON)\n\t\t\t\tLsky = _Alpha_Global*hdr(Lsky,_SkyExposure);\n\t\t\t\tfloat3 transmittance =  hdr(R_ftot, _ScatteringExposure);\n\t\t\t\ttransmittance = clamp(transmittance, float3(0.0,0.0,0.0), float3(1.0,1.0,1.0));\n\t\t\t\ttransmittance = transmittance + (1.0-transmittance) * Lsky;\n\n\t\t\t\tfloat3 finalColor = lerp(transmittance,Lsea, 1-fresnel);\t//consider not using transmittance but instead background texture, change the refraction angle to have something matching what you would see from underwater\n\n\n\t\t\t\t#if defined (REFRACTIONS_AND_TRANSPARENCY_ON)\n\t\t\t\tbackGrnd+=hdr(R_ftotTotal,_ScatteringExposure)*(1-backGrnd); //make foam visible from below as well\n\t\t\t\tfinalColor = (fragDistance < 750000.0) ? backGrnd : finalColor;\n\t\t\t\t#endif\n\n\t\t\t\tfloat3 Vworld = mul ( _Globals_OceanToWorld, float4(V,0.0));\n\t\t\t\tfloat3 Lworld = mul ( _Globals_OceanToWorld, float4(L,0.0));\n\n\t\t\t\tfloat3 earthCamPos = normalize(float3(_Ocean_CameraPos.xy,0.0) + float3(0.0, 0.0, radius)) * (radius + 10.0);\n\n\t\t\t\tfloat underwaterDepth = lerp(1.0,0.0,-_Ocean_CameraPos.z / darknessDepth);\n\n\t\t\t\tfloat waterLightExtinction = length(getSkyExtinction(earthCamPos, L));\n\t\t\t\tfloat3 _camPos = _WorldSpaceCameraPos - _planetPos;\n\n\t\t\t\tfloat3 oceanCol = underwaterDepth * hdrNoExposure(waterLightExtinction * _sunColor * oceanColor(-Vworld,Lworld,normalize(_camPos))); //add planetshine loop here over Ls\n\n\t\t\t\tfinalColor= clamp(finalColor, float3(0.0,0.0,0.0),float3(1.0,1.0,1.0));\n\t\t\t\tfinalColor= lerp(finalColor, oceanCol, min(length(oceanCamera - oceanP)/transparencyDepth,1.0));\n\n\t\t\t\treturn float4(dither(finalColor, screenPos),insideClippingRange);\n\t\t\t\t#else\n\t\t\t\t#if defined (REFRACTIONS_AND_TRANSPARENCY_ON)\n\t\t\t\tfloat3 finalColor = lerp(backGrnd, surfaceColor, transparencyAlpha);\t//refraction on and not underwater\n\t\t\t\t#else\n\t\t\t\tfloat3 finalColor = surfaceColor;  \t\t\t\t\t//refraction off and not underwater\n\t\t\t\t#endif\n\n\t\t\t\tif (_PlanetOpacity == 1.0)\n\t\t\t\t{\n\t\t\t\t\tfloat3 worldPos= IN.worldPos - _planetPos;\n\t\t\t\t\tworldPos = (length(worldPos) < (Rg + _openglThreshold)) ? (Rg + _openglThreshold) * normalize(worldPos) : worldPos ; //artifacts fix\n\t\t\t\t\tfloat3 _camPos = _WorldSpaceCameraPos - _planetPos;\n\n\t\t\t\t\tfloat minDistance = length(worldPos-_camPos);\n\n\t\t\t\t#if defined (GODRAYS_ON)\n\t\t\t\tfloat2 godrayUV = IN.screenPos.xy / IN.screenPos.w;\n\t\t\t\tfloat godrayDepth = 0.0;\n\t\t\t\tgodrayDepth = sampleGodrayDepth(_godrayDepthTexture, godrayUV, 1.0);\n\n\t\t\t\t//trying to find the optical depth from the terrain level\n\t\t\t\tfloat muTerrain = dot(normalize(worldPos), normalize(_camPos - worldPos));\n\n\t\t\t\tgodrayDepth = _godrayStrength * DistanceFromOpticalDepth((Rt-Rg) * 0.5, length(worldPos), muTerrain, godrayDepth, minDistance);\n\n\t\t\t\tworldPos = worldPos - godrayDepth * normalize(worldPos-_camPos);\n\t\t\t\t#endif\n\n\t\t\t\t\tfloat3 inscatter=0.0;float3 extinction=1.0;\n\t\t\t\t\tinscatter = InScattering(_camPos, worldPos, SUN_DIR, _sunColor, extinction);\n\n\t\t\t\t\tinscatter*= (minDistance <= _global_depth) ? (1 - exp(-1 * (4 * minDistance / _global_depth))) : 1.0 ; //somehow the shader compiler for OpenGL behaves differently around braces            \t\t\t\t\n\t\t\t\t\tinscatter = hdr(inscatter,_ScatteringExposure) *_global_alpha;\n\n\t\t\t\t\tfloat average=(extinction.r+extinction.g+extinction.b)/3;\n\n\t\t\t\t\t//lerped manually because of an issue with opengl or whatever\n\t\t\t\t\textinction = _Post_Extinction_Tint * extinction + (1-_Post_Extinction_Tint) * float3(average,average,average);\n\n\t\t\t\t\textinction= max(float3(0.0,0.0,0.0), (float3(1.0,1.0,1.0)*(1-extinctionThickness) + extinctionThickness*extinction) );\n\n\t\t\t\t\tfinalColor*= extinction;\n\t\t\t\t\tfinalColor = inscatter*(1-finalColor) + finalColor;\n\t\t\t\t}\n\n\t\t\t\tinsideClippingRange = (transparencyAlpha == 1.0) ? 1.0 : insideClippingRange;     //if no transparency -> render normally, if transparency play with the overlap to hide seams between cameras\n\t\t\t\treturn float4(dither(finalColor,screenPos), _PlanetOpacity*insideClippingRange);\n\t\t\t\t#endif\n\t\t\t}\n\n\t\t\tENDCG\n\t\t}\n\n\t}\n}\n\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/OceanWhiteCapsModProj3VertexSearch.shader.meta",
    "content": "fileFormatVersion: 2\nguid: 1a7a541ac0259ac4e8570ac8c3510dfe\nShaderImporter:\n  externalObjects: {}\n  defaultTextures: []\n  nonModifiableTextures: []\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/ReadData.compute",
    "content": "﻿\n//NOTE - Not every kernel has been tested\n\nuint _Width;\nuint _Height;\nuint _Depth;\n\nuint _IdxX;\nuint _IdxY;\nuint _IdxZ;\n\nfloat4 _UV;\n\nTexture2D _Tex2D;\nTexture3D _Tex3D;\n\nSamplerState _LinearClamp;\n\n//-----------------------------------------------------------------------//\n\n//-- read from 1 channel 2D render texture --//\n\n#pragma kernel read2DC1\n\nRWStructuredBuffer<float> _Buffer2DC1;\n\n[numthreads(8,8,1)]\nvoid read2DC1(uint3 id : SV_DispatchThreadID)\n{\n\n    int idx = id.x + id.y * _Width;\n\n\tif(id.x < _Width && id.y < _Height)\n   \t\t_Buffer2DC1[idx] = _Tex2D[id.xy].x;\n\n}\n\n//-- read from 2 channel 2D render texture --//\n\n#pragma kernel read2DC2\n\nRWStructuredBuffer<float2> _Buffer2DC2;\n\n[numthreads(8,8,1)]\nvoid read2DC2(uint3 id : SV_DispatchThreadID)\n{\n\n    int idx = id.x + id.y * _Width;\n\t\n\tif(id.x < _Width && id.y < _Height)\n    \t_Buffer2DC2[idx] = _Tex2D[id.xy].xy;\n\n}\n\n//-- read from 3 channel 2D render texture --//\n\n#pragma kernel read2DC3\n\nRWStructuredBuffer<float3> _Buffer2DC3;\n\n[numthreads(8,8,1)]\nvoid read2DC3(uint3 id : SV_DispatchThreadID)\n{\n\n    int idx = id.x + id.y * _Width;\n\n\tif(id.x < _Width && id.y < _Height)\n    \t_Buffer2DC3[idx] = _Tex2D[id.xy].xyz;\n\n}\n\n//-- read from 4 channel 2D render texture --//\n\n#pragma kernel read2DC4\n\nRWStructuredBuffer<float4> _Buffer2DC4;\n\n[numthreads(8,8,1)]\nvoid read2DC4(uint3 id : SV_DispatchThreadID)\n{\n\n    int idx = id.x + id.y * _Width;\n\n\tif(id.x < _Width && id.y < _Height)\n    \t_Buffer2DC4[idx] = _Tex2D[id.xy];\n\n}\n\n//-- read single pixel from 2D render texure. Always reads all 4 channes --//\n\n#pragma kernel readSingle2D\n\nRWStructuredBuffer<float4> _BufferSingle2D;\n\n[numthreads(1,1,1)]\nvoid readSingle2D(uint3 id : SV_DispatchThreadID)\n{\n\n    _BufferSingle2D[0] = _Tex2D[uint2(_IdxX,_IdxY)];\n\n}\n\n//-- read single pixel from 2D render texure using bilinear filtering. Always reads all 4 channes --//\n\n#pragma kernel readSingleBilinear2D\n\n[numthreads(1,1,1)]\nvoid readSingleBilinear2D(uint3 id : SV_DispatchThreadID)\n{\n\n    _BufferSingle2D[0] = _Tex2D.SampleLevel(_LinearClamp, _UV.xy, 0);\n\n}\n\n//-----------------------------------------------------------------------//\n\n//-- read from 1 channel 3D render texture --//\n\n#pragma kernel read3DC1\n\nRWStructuredBuffer<float> _Buffer3DC1;\n\n[numthreads(8,8,8)]\nvoid read3DC1(uint3 id : SV_DispatchThreadID)\n{\n\n    int idx = id.x + id.y * _Width + id.z * _Width * _Height;\n\n\tif(id.x < _Width && id.y < _Height && id.z < _Depth)\n    \t_Buffer3DC1[idx] = _Tex3D[id].x;\n\n}\n\n//-- read from 2 channel 3D render texture --//\n\n#pragma kernel read3DC2\n\nRWStructuredBuffer<float2> _Buffer3DC2;\n\n[numthreads(8,8,8)]\nvoid read3DC2(uint3 id : SV_DispatchThreadID)\n{\n\n    int idx = id.x + id.y * _Width + id.z * _Width * _Height;\n\n\tif(id.x < _Width && id.y < _Height && id.z < _Depth)\n    \t_Buffer3DC2[idx] = _Tex3D[id].xy;\n\n}\n\n//-- read from 3 channel 3D render texture --//\n\n#pragma kernel read3DC3\n\nRWStructuredBuffer<float3> _Buffer3DC3;\n\n[numthreads(8,8,8)]\nvoid read3DC3(uint3 id : SV_DispatchThreadID)\n{\n\n    int idx = id.x + id.y * _Width + id.z * _Width * _Height;\n\n\tif(id.x < _Width && id.y < _Height && id.z < _Depth)\n    \t_Buffer3DC3[idx] = _Tex3D[id].xyz;\n\n}\n\n//-- read from 4 channel 3D render texture --//\n\n#pragma kernel read3DC4\n\nRWStructuredBuffer<float4> _Buffer3DC4;\n\n[numthreads(8,8,8)]\nvoid read3DC4(uint3 id : SV_DispatchThreadID)\n{\n\n    int idx = id.x + id.y * _Width + id.z * _Width * _Height;\n\n\tif(id.x < _Width && id.y < _Height && id.z < _Depth)\n    \t_Buffer3DC4[idx] = _Tex3D[id];\n\n}\n\n//-- read single pixel from 3D render texure. Always reads all 4 channes --//\n\n#pragma kernel readSingle3D\n\nRWStructuredBuffer<float4> _BufferSingle3D;\n\n[numthreads(1,1,1)]\nvoid readSingle3D(uint3 id : SV_DispatchThreadID)\n{\n    _BufferSingle3D[0] = _Tex3D[uint3(_IdxX,_IdxY,_IdxZ)];\n\n}\n\n//-- read single pixel from 3D render texure using bilinear filtering. Always reads all 4 channes --//\n\n#pragma kernel readSingleBilinear3D\n\n[numthreads(1,1,1)]\nvoid readSingleBilinear3D(uint3 id : SV_DispatchThreadID)\n{\n    _BufferSingle3D[0] = _Tex3D.SampleLevel(_LinearClamp, _UV.xyz, 0);\n\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/ReadData.compute.meta",
    "content": "fileFormatVersion: 2\nguid: ecc396d20671d454e8020aa864197779\nComputeShaderImporter:\n  externalObjects: {}\n  currentAPIMask: 4\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/SlopeVariance.compute",
    "content": "#pragma kernel CSMain\n\nTexture2D _Spectrum01;\nTexture2D _Spectrum23;\nfloat4 _GridSizes;\nfloat _SlopeVarianceDelta;\nfloat _Size;\nfloat _VarianceSize;\n\nRWTexture3D<float> des;\n\nfloat getSlopeVariances(float2 k, float A, float B, float C, float2 spectrumSample) \n{\n    float w = 1.0 - exp(A * k.x * k.x + B * k.x * k.y + C * k.y * k.y);\n    float2 kw = k * w;\n    return dot(kw, kw) * dot(spectrumSample, spectrumSample) * 2.0;\n}\n\n[numthreads(4,4,4)]\nvoid CSMain (uint3 id : SV_DispatchThreadID)\n{\n    const float SCALE = 10.0;\n    const float M_PI = 3.14159265;\n    \n    float a = id.x;\n    float b = id.y;\n    float c = id.z;\n    \n    float A = pow(a / (_VarianceSize - 1.0), 4.0) * SCALE;\n    float C = pow(c / (_VarianceSize - 1.0), 4.0) * SCALE;\n    float B = (2.0 * b / (_VarianceSize - 1.0) - 1.0) * sqrt(A * C);\n    A = -0.5 * A;\n    B = -B;\n    C = -0.5 * C;\n    \n    float slopeVariances = _SlopeVarianceDelta;\n    \n    int size = _Size;\n    for (int x = 0; x < size; x++) \n    {\n        for (int y = 0; y < size; y++)\n         {\n            int i = x >= _Size / 2.0 ? x - size : x;\n            int j = y >= _Size / 2.0 ? y - size : y;\n            float2 k = 2.0 * M_PI * float2(i, j);\n\n            float4 spectrum01 = _Spectrum01[uint2(x,y)];\n            float4 spectrum23 = _Spectrum23[uint2(x,y)];\n\n            slopeVariances += getSlopeVariances(k / _GridSizes.x, A, B, C, spectrum01.xy);\n            slopeVariances += getSlopeVariances(k / _GridSizes.y, A, B, C, spectrum01.zw);\n            slopeVariances += getSlopeVariances(k / _GridSizes.z, A, B, C, spectrum23.xy);\n            slopeVariances += getSlopeVariances(k / _GridSizes.w, A, B, C, spectrum23.zw);\n        }\n    }\n    \n  \n    des[id] = slopeVariances;\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/SlopeVariance.compute.meta",
    "content": "fileFormatVersion: 2\nguid: 7004c8cc6d477784e8d85fbad56de5f8\nComputeShaderImporter:\n  externalObjects: {}\n  currentAPIMask: 131076\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/UnderwaterDepthBuffer.shader",
    "content": "﻿Shader \"Scatterer/UnderwaterScatterDepthBuffer\" {\n\tSubShader {\n\t\tTags {\"Queue\" = \"Transparent-499\" \"IgnoreProjector\" = \"True\" \"RenderType\" = \"Transparent\"}\n\n\t\tPass {\n\t\t\tCull Off\n\t\t\tZTest Off\n\n\t\t\tBlend SrcAlpha OneMinusSrcAlpha\n\n\t\t\tCGPROGRAM\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\t\t\t#pragma target 3.0\n\t\t\t#include \"UnityCG.cginc\"\n\t\t\t#include \"../CommonAtmosphere.cginc\"\n\t\t\t#include \"../DepthCommon.cginc\"\n\n\t\t\tuniform sampler2D ScattererScreenCopy;\n\t\t\tuniform sampler2D ScattererDepthCopy;\n\t\t\tfloat4x4 CameraToWorld;\n\n\t\t\t#pragma multi_compile DITHERING_OFF DITHERING_ON\n\n\t\t\tuniform float3 _planetPos;\n\n\t\t\tuniform float3 _Underwater_Color;\n\n\t\t\tuniform float transparencyDepth;\n\t\t\tuniform float darknessDepth;\n\n\t\t\tstruct v2f\n\t\t\t{\n\t\t\t\tfloat4 screenPos : TEXCOORD0;\n\t\t\t\tfloat waterLightExtinction : TEXCOORD1;\n\t\t\t};\n\n\t\t\tv2f vert(appdata_base v, out float4 outpos: SV_POSITION)\n\t\t\t{\n\t\t\t\tv2f o;\n\n#if defined(SHADER_API_GLES) || defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE)\n\t\t\t\toutpos = float4(2.0 * v.vertex.x, 2.0 * v.vertex.y *_ProjectionParams.x, -1.0 , 1.0);\n#else\n\t\t\t\toutpos = float4(2.0 * v.vertex.x, 2.0 * v.vertex.y, 0.0 , 1.0);\n#endif\n\t\t\t\to.screenPos = ComputeScreenPos(outpos);\n\n\t\t\t\tfloat3 _camPos = _WorldSpaceCameraPos - _planetPos;\n\t\t\t\to.waterLightExtinction = length(getSkyExtinction(normalize(_camPos + 10.0) * Rg , SUN_DIR));\n\n\t\t\t\treturn o;\n\t\t\t}\n\n\t\t\tfloat3 oceanColor(float3 viewDir, float3 lightDir, float3 surfaceDir)\n\t\t\t{\n\t\t\t\tfloat angleToLightDir = (dot(viewDir, surfaceDir) + 1 )* 0.5;\n\t\t\t\tfloat3 waterColor = pow(_Underwater_Color, 4.0 *(-1.0 * angleToLightDir + 1.0));\n\t\t\t\treturn waterColor;\n\t\t\t}\n\n\t\t\tstruct fout\n\t\t\t{\n\t\t\t\tfloat4 color : COLOR;\n\t\t\t\tfloat depth : DEPTH;\n\t\t\t};\n\n\t\t\tfout frag(v2f i, UNITY_VPOS_TYPE screenPos : VPOS)\n\t\t\t{\n\t\t\t\tfloat2 uv = i.screenPos.xy / i.screenPos.w;\n\n#if SHADER_API_D3D11 || SHADER_API_D3D || SHADER_API_D3D12\n\t\t\t\tif (_ProjectionParams.x > 0) {uv.y = 1.0 - uv.y;}\n#endif\n\n\t\t\t\tfloat zdepth = tex2Dlod(ScattererDepthCopy, float4(uv,0,0));\n\n\t\t\t\tfloat3 worldPosRelCam = getPreciseWorldPosFromDepth(i.screenPos.xy / i.screenPos.w, zdepth, CameraToWorld) - _WorldSpaceCameraPos;\n\n\t\t\t\tfloat fragDistance = length(worldPosRelCam);\n\t\t\t\tfloat3 worldViewDir = worldPosRelCam / fragDistance;\n\n\t\t\t\tfloat3 _camPos = _WorldSpaceCameraPos - _planetPos;\n\t\t\t\tfloat underwaterDepth = Rg - length(_camPos);\n\n\t\t\t\tunderwaterDepth = lerp(1.0,0.0,underwaterDepth / darknessDepth);\n\n\t\t\t\tfloat3 waterColor= underwaterDepth * hdrNoExposure(i.waterLightExtinction * _sunColor * oceanColor(worldViewDir,SUN_DIR,normalize(_camPos)));\n\t\t\t\tfloat alpha = min(fragDistance/transparencyDepth,1.0);\n\n\t\t\t\tfloat3 backGrnd = tex2Dlod(ScattererScreenCopy, float4(uv.x, uv.y,0.0,0.0));\n\n\t\t\t\tbackGrnd = dither(waterColor, screenPos) * alpha + (1.0 - alpha) * backGrnd;\n\n\t\t\t\tfout output;\n\t\t\t\toutput.color = float4(backGrnd,1.0);\n\t\t\t\toutput.depth = zdepth;\n\t\t\t\treturn output;\n\t\t\t}\n\n\t\t\tENDCG\n\t\t}\n\t}\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/UnderwaterDepthBuffer.shader.meta",
    "content": "fileFormatVersion: 2\nguid: a132bd53f9677ee489dac2f1da2b05ea\nShaderImporter:\n  externalObjects: {}\n  defaultTextures: []\n  nonModifiableTextures: []\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/UnderwaterProjector.shader",
    "content": "﻿\nShader \"Scatterer/UnderwaterScatterProjector\" {\n\tSubShader {\n\t\tTags {\"Queue\" = \"Transparent-5\" \"IgnoreProjector\" = \"True\" \"RenderType\" = \"Transparent\"}\n\n\t\tPass {\n\t\t\t//Cull Front\n\t\t\tCull Back\n\t\t\tZTest LEqual\n\t\t\tZWrite Off\n\n\t\t\tBlend SrcAlpha OneMinusSrcAlpha\n\n\t\t\tCGPROGRAM\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\t\t\t#pragma target 3.0\n\t\t\t#include \"UnityCG.cginc\"\n\t\t\t#include \"../CommonAtmosphere.cginc\"\n\n\t\t\t#pragma multi_compile DITHERING_OFF DITHERING_ON\n\t\t\t\n\t\t\tuniform float3 _planetPos;\n\n\t\t\tuniform float3 _Underwater_Color;\n\n\t\t\tuniform float transparencyDepth;\n\t\t\tuniform float darknessDepth;\n\t\t\t\n\t\t\tstruct v2f\n\t\t\t{\n\t\t\t\tfloat3 viewPos:TEXCOORD0;\n\t\t\t\tfloat3 viewDir:TEXCOORD1;\n\t\t\t\tfloat3 worldPos:TEXCOORD2;\n\t\t\t};\n\n\t\t\tv2f vert(appdata_base v, out float4 outpos: SV_POSITION)\n\t\t\t{\n\t\t\t\tv2f o;\n\t\t\t\toutpos =  UnityObjectToClipPos(v.vertex);\n\t\t\t\to.viewPos =  UnityObjectToViewPos(v.vertex.xyz);\n\t\t\t\to.worldPos = mul(unity_ObjectToWorld,v.vertex).xyz;\n\t\t\t\to.viewDir = o.worldPos - _WorldSpaceCameraPos;\n\t\t\t\to.worldPos = o.worldPos - _planetPos;\n\t\t\t\treturn o;\n\t\t\t}\n\n\t\t\tfloat3 oceanColor(float3 viewDir, float3 lightDir, float3 surfaceDir)\n\t\t\t{\n\t\t\t\tfloat angleToLightDir = (dot(viewDir, surfaceDir) + 1 )* 0.5;\n\t\t\t\tfloat3 waterColor = pow(_Underwater_Color, 4.0 *(-1.0 * angleToLightDir + 1.0));\n\t\t\t\treturn waterColor;\n\t\t\t}\n\n\t\t\thalf4 frag(v2f i, UNITY_VPOS_TYPE screenPos : VPOS) : SV_Target\n\t\t\t{\n\t\t\t\tfloat fragDistance = length(i.viewPos);                \n\n\t\t\t\tfloat3 rayDir=normalize(i.viewDir);\n\n\t\t\t\tfloat3 _camPos = _WorldSpaceCameraPos - _planetPos;\n\t\t\t\tfloat waterLightExtinction = length(getSkyExtinction(normalize(_camPos + 10.0) * Rg , SUN_DIR));\n\n\t\t\t\tfloat underwaterDepth = Rg - length(_camPos);\n\n\t\t\t\tunderwaterDepth = lerp(1.0,0.0,underwaterDepth / darknessDepth);\n\n\t\t\t\tfloat3 waterColor= underwaterDepth * hdrNoExposure( waterLightExtinction * _sunColor * oceanColor(rayDir,SUN_DIR,normalize(_camPos)));\n\t\t\t\tfloat alpha = min(fragDistance/transparencyDepth,1.0);\n\t\t\t\treturn float4(dither(waterColor, screenPos), alpha);\n\t\t\t}\n\n\t\t\tENDCG\n\t\t}\n\t}\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/UnderwaterProjector.shader.meta",
    "content": "fileFormatVersion: 2\nguid: f1c6f7ed858be004eb1c56dada7ee838\ntimeCreated: 1550574813\nlicenseType: Free\nShaderImporter:\n  defaultTextures: []\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/WhiteCapsPrecompute0.shader",
    "content": "// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'\n\nShader \"Proland/Ocean/WhiteCapsPrecompute0\" \n{\n\tSubShader \n\t{\n\t\tPass \n\t\t{\n\t\t\tZTest Always Cull Off ZWrite Off\n\t\t\tFog { Mode off }\n\n\t\t\tCGPROGRAM\n\t\t\t#include \"UnityCG.cginc\"\n\t\t\t#pragma target 3.0\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\n\t\t\tuniform sampler2D _Map5, _Map6, _Map7;\n\t\t\tuniform float4 _Choppyness;\n\n\t\t\tstruct v2f \n\t\t\t{\n\t\t\t\tfloat4  pos : SV_POSITION;\n\t\t\t\tfloat2  uv : TEXCOORD0;\n\t\t\t};\n\n\n\t\t\tv2f vert(appdata_base v)\n\t\t\t{\n\t\t\t\tv2f OUT;\n\t\t\t\tOUT.pos = UnityObjectToClipPos(v.vertex);\n\t\t\t\tOUT.uv = v.texcoord;\n\t\t\t\treturn OUT;\n\t\t\t}\n\n\t\t\tfloat4 frag(v2f IN): COLOR\n\t\t\t{ \n\t\t\t\tfloat2 uv = IN.uv;\n\n\t\t\t\t// store Jacobian coeff value and variance\n\t\t\t\tfloat4 Jxx = _Choppyness*tex2D(_Map5, uv);\n\t\t\t\tfloat4 Jyy = _Choppyness*tex2D(_Map6, uv);\n\t\t\t\tfloat4 Jxy = _Choppyness*_Choppyness*tex2D(_Map7, uv);\n\n\t\t\t\t// Store partial jacobians\n\t\t\t\tfloat4 res = 0.25 + Jxx + Jyy + _Choppyness*Jxx*Jyy - Jxy*Jxy;\n\t\t\t\tfloat4 res2 = res*res;\n\n\n\t\t\t\tfloat4 col0 = float4(res.x, res2.x, res.y, res2.y);\n\t\t\t\t//\t\t\t\tOUT.col1 = float4(res.z, res2.z, res.w, res2.w);\n\n\n\n\t\t\t\treturn col0;\n\t\t\t}\n\n\t\t\tENDCG\n\t\t}\n\n\n\n\n\t\tPass \n\t\t{\n\t\t\tZTest Always Cull Off ZWrite Off\n\t\t\tFog { Mode off }\n\n\t\t\tCGPROGRAM\n\t\t\t#include \"UnityCG.cginc\"\n\t\t\t#pragma target 3.0\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\n\t\t\tuniform sampler2D _Map5, _Map6, _Map7;\n\t\t\tuniform float4 _Choppyness;\n\n\t\t\tstruct v2f \n\t\t\t{\n\t\t\t\tfloat4  pos : SV_POSITION;\n\t\t\t\tfloat2  uv : TEXCOORD0;\n\t\t\t};\n\n\n\t\t\tv2f vert(appdata_base v)\n\t\t\t{\n\t\t\t\tv2f OUT;\n\t\t\t\tOUT.pos = UnityObjectToClipPos(v.vertex);\n\t\t\t\tOUT.uv = v.texcoord;\n\t\t\t\treturn OUT;\n\t\t\t}\n\n\t\t\tfloat4 frag(v2f IN): COLOR\n\t\t\t{ \n\t\t\t\tfloat2 uv = IN.uv;\n\n\t\t\t\t// store Jacobian coeff value and variance\n\t\t\t\tfloat4 Jxx = _Choppyness*tex2D(_Map5, uv);\n\t\t\t\tfloat4 Jyy = _Choppyness*tex2D(_Map6, uv);\n\t\t\t\tfloat4 Jxy = _Choppyness*_Choppyness*tex2D(_Map7, uv);\n\n\t\t\t\t// Store partial jacobians\n\t\t\t\tfloat4 res = 0.25 + Jxx + Jyy + _Choppyness*Jxx*Jyy - Jxy*Jxy;\n\t\t\t\tfloat4 res2 = res*res;\n\n\n\t\t\t\t//\t\t\t\tfloat4 col0 = float4(res.x, res2.x, res.y, res2.y);\n\t\t\t\tfloat4 col1 = float4(res.z, res2.z, res.w, res2.w);\n\n\n\t\t\t\treturn col1;\n\t\t\t}\n\n\t\t\tENDCG\n\n\t\t}\n\n\t}\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean/WhiteCapsPrecompute0.shader.meta",
    "content": "fileFormatVersion: 2\nguid: 725600e98a048ad46aacb96a8bb155cd\ntimeCreated: 1459689357\nlicenseType: Free\nShaderImporter:\n  defaultTextures: []\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Ocean.meta",
    "content": "fileFormatVersion: 2\nguid: 1cd98b0d17936ed43bed805e1a150a88\nfolderAsset: yes\ntimeCreated: 1541842604\nlicenseType: Free\nDefaultImporter:\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/RingCommon.cginc",
    "content": "﻿uniform sampler2D ringTexture;\nuniform float ringInnerRadius;\nuniform float ringOuterRadius;\nuniform float3 ringNormal;\n\n//only supporting Kopernicus linear rings for now (no support for tiled rings or rings with thickness)\n//rgb channels are returned modulated by alpha value (used for sunflare)\n//alpha value returned is actually 1-alpha (used for ring shadow on atmosphere/planet)\ninline float4 getLinearRingColor(float3 worldPos, float3 sunDir, float3 planetAndRingOrigin)\n{\n\tfloat parallel = 0.0;\n\tfloat3 ringIntersectPt = LinePlaneIntersection(worldPos, sunDir, ringNormal, planetAndRingOrigin, parallel);\n\n\t//calculate ring texture position on intersect\n\tfloat distance = length (ringIntersectPt - planetAndRingOrigin);\n\tfloat ringTexturePosition = (distance - ringInnerRadius) / (ringOuterRadius - ringInnerRadius); //inner and outer radiuses are converted to local space coords on plugin side\n\tringTexturePosition = 1 - ringTexturePosition; //flip to match UVs\n\n\tfloat4 ringColor = tex2D(ringTexture, float2(ringTexturePosition,ringTexturePosition));\n\tringColor.a = 1-ringColor.a;\n\n\tringColor.xyz*=ringColor.a;\n\n\t//don't apply any shadows if intersect point is not between inner and outer radius or line and plane are parallel\n\tringColor = (ringTexturePosition > 1 || ringTexturePosition < 0 || parallel == 1.0 ) ? float4(1.0,1.0,1.0,1.0) : ringColor;\n\treturn ringColor;\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/RingCommon.cginc.meta",
    "content": "fileFormatVersion: 2\nguid: 29b7e99efaf64b949afd3d5b830c72aa\ntimeCreated: 1542896604\nlicenseType: Free\nShaderImporter:\n  defaultTextures: []\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/RingCommon.cgincBAK",
    "content": "﻿uniform sampler2D ringTexture;\nuniform float ringInnerRadius;\nuniform float ringOuterRadius;\nuniform float3 ringNormal;\n\n//only supporting Kopernicus linear rings for now (no support for tiled rings or rings with thickness)\n//rgb channels are returned modulated by alpha value (used for sunflare)\n//alpha value returned is actually 1-alpha (used for ring shadow on atmosphere/planet)\ninline float4 getLinearRingColor(float3 worldPos, float3 sunDir, float3 planetAndRingOrigin)\n{\n\tfloat parallel = 0.0;\n\tfloat3 ringIntersectPt = LinePlaneIntersection(worldPos, sunDir, ringNormal, planetAndRingOrigin, parallel);\n\n\t//calculate ring texture position on intersect\n\tfloat distance = length (ringIntersectPt - planetAndRingOrigin);\n\tfloat ringTexturePosition = (distance - ringInnerRadius) / (ringOuterRadius - ringInnerRadius); //inner and outer radiuses are converted to local space coords on plugin side\n\tringTexturePosition = 1 - ringTexturePosition; //flip to match UVs\n\n\tfloat4 ringColor = tex2D(ringTexture, float2(ringTexturePosition,ringTexturePosition));\n\tringColor.a = 1-ringColor.a;\n\n\tringColor.xyz*=ringColor.a;\n\n\t//don't apply any shadows if intersect point is not between inner and outer radius or line and plane are parallel\n\tringColor = (ringTexturePosition > 1 || ringTexturePosition < 0 || parallel == 1.0 ) ? float4(1.0,1.0,1.0,1.0) : ringColor;\n\treturn ringColor;\n}\n\ninline float4 getLinearRingColorLod0(float3 worldPos, float3 sunDir, float3 planetAndRingOrigin)\n{\n\tfloat parallel = 0.0;\n\tfloat3 ringIntersectPt = LinePlaneIntersection(worldPos, sunDir, ringNormal, planetAndRingOrigin, parallel);\n\n\t//calculate ring texture position on intersect\n\tfloat distance = length (ringIntersectPt - planetAndRingOrigin);\n\tfloat ringTexturePosition = (distance - ringInnerRadius) / (ringOuterRadius - ringInnerRadius); //inner and outer radiuses are converted to local space coords on plugin side\n\tringTexturePosition = 1 - ringTexturePosition; //flip to match UVs\n\n\tfloat4 ringColor = tex2Dlod(ringTexture, float4(ringTexturePosition,ringTexturePosition,0.0,0.0));\n\tringColor.a = 1-ringColor.a;\n\n\tringColor.xyz*=ringColor.a;\n\n\t//don't apply any shadows if intersect point is not between inner and outer radius or line and plane are parallel\n\tringColor = (ringTexturePosition > 1 || ringTexturePosition < 0 || parallel == 1.0 ) ? float4(1.0,1.0,1.0,1.0) : ringColor;\n\treturn ringColor;\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/RingCommon.cgincBAK.meta",
    "content": "fileFormatVersion: 2\nguid: 5b60206b4b7ac1043ba19efe7ecfd5be\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Shadows/DoublePrecisionEmulation.cginc",
    "content": "﻿float times_frc(float a, float b) {\n\treturn lerp(0.0, a * b, b != 0.0 ? 1.0 : 0.0);\n}\n\nfloat div_frc(float a, float b) {\n\treturn lerp(0.0, a / b, b != 0.0 ? 1.0 : 0.0);\n}\n\nfloat plus_frc(float a, float b) {\n\treturn lerp(a, a + b, b != 0.0 ? 1.0 : 0.0);\n}\n\nfloat minus_frc(float a, float b) {\n\treturn lerp(a, a - b, b != 0.0 ? 1.0 : 0.0);\n}\n\n// create double-single number from float\nfloat2 ds_set(float a) {\n\treturn float2(a, 0.0);\n}\n\n// Double emulation based on GLSL Mandelbrot Shader by Henry Thasler (www.thasler.org/blog)\n//\n// Emulation based on Fortran-90 double-single package. See http://crd.lbl.gov/~dhbailey/mpdist/\n// Substract: res = ds_add(a, b) => res = a + b\nfloat2 ds_add (float2 dsa, float2 dsb) {\n\tfloat2 dsc;\n\tfloat t1, t2, e;\n\n\tt1 = plus_frc(dsa.x, dsb.x);\n\te = minus_frc(t1, dsa.x);\n\tt2 = plus_frc(plus_frc(plus_frc(minus_frc(dsb.x, e), minus_frc(dsa.x, minus_frc(t1, e))), dsa.y), dsb.y);\n\tdsc.x = plus_frc(t1, t2);\n\tdsc.y = minus_frc(t2, minus_frc(dsc.x, t1));\n\treturn dsc;\n}\n\n// Substract: res = ds_sub(a, b) => res = a - b\nfloat2 ds_sub (float2 dsa, float2 dsb) {\n\tfloat2 dsc;\n\tfloat e, t1, t2;\n\n\tt1 = minus_frc(dsa.x, dsb.x);\n\te = minus_frc(t1, dsa.x);\n\tt2 = minus_frc(plus_frc(plus_frc(minus_frc(minus_frc(0.0, dsb.x), e), minus_frc(dsa.x, minus_frc(t1, e))), dsa.y), dsb.y);\n\n\tdsc.x = plus_frc(t1, t2);\n\tdsc.y = minus_frc(t2, minus_frc(dsc.x, t1));\n\treturn dsc;\n}\n\n// Compare: res = -1 if a < b\n//              = 0 if a == b\n//              = 1 if a > b\nfloat ds_cmp(float2 dsa, float2 dsb) {\n\tif (dsa.x < dsb.x) {\n\t\treturn -1.;\n\t}\n\tif (dsa.x > dsb.x) {\n\t\treturn 1.;\n\t}\n\tif (dsa.y < dsb.y) {\n\t\treturn -1.;\n\t}\n\tif (dsa.y > dsb.y) {\n\t\treturn 1.;\n\t}\n\treturn 0.;\n}\n\n// Multiply: res = ds_mul(a, b) => res = a * b\nfloat2 ds_mul (float2 dsa, float2 dsb) {\n\tfloat2 dsc;\n\tfloat c11, c21, c2, e, t1, t2;\n\tfloat a1, a2, b1, b2, cona, conb, split = 8193.;\n\n\tcona = times_frc(dsa.x, split);\n\tconb = times_frc(dsb.x, split);\n\ta1 = minus_frc(cona, minus_frc(cona, dsa.x));\n\tb1 = minus_frc(conb, minus_frc(conb, dsb.x));\n\ta2 = minus_frc(dsa.x, a1);\n\tb2 = minus_frc(dsb.x, b1);\n\n\tc11 = times_frc(dsa.x, dsb.x);\n\tc21 = plus_frc(times_frc(a2, b2), plus_frc(times_frc(a2, b1), plus_frc(times_frc(a1, b2), minus_frc(times_frc(a1, b1), c11))));\n\n\tc2 = plus_frc(times_frc(dsa.x, dsb.y), times_frc(dsa.y, dsb.x));\n\n\tt1 = plus_frc(c11, c2);\n\te = minus_frc(t1, c11);\n\tt2 = plus_frc(plus_frc(times_frc(dsa.y, dsb.y), plus_frc(minus_frc(c2, e), minus_frc(c11, minus_frc(t1, e)))), c21);\n\n\tdsc.x = plus_frc(t1, t2);\n\tdsc.y = minus_frc(t2, minus_frc(dsc.x, t1));\n\n\treturn dsc;\n}\n\n// Divide: res = ds_div(a, b) => res = a / b\nfloat2 ds_div (float2 dsa, float2 dsb) {\n\tfloat2 dsc;\n\tfloat a1, a2, b1, b2, cona, conb, split = 8193.;\n\tfloat c11, c2, c21, e, s1, s2, t1, t2, t11, t12, t21, t22;\n\n\ts1 = div_frc(dsa.x,dsb.x);\n\n\tcona = times_frc(s1, split);\n\tconb = times_frc(dsb.x, split);\n\n\ta1 = minus_frc(cona, minus_frc(cona, s1));\n\tb1 = minus_frc(conb, minus_frc(conb, dsb.x));\n\n\ta2 = minus_frc(s1, a1);\n\tb2 = minus_frc(dsb.x, b1);\n\n\tc11 = times_frc(s1, dsb.x);\n\tc21 = plus_frc(times_frc(a2, b2), plus_frc(times_frc(a2, b1), plus_frc(times_frc(a1, b2), minus_frc(times_frc(a1, b1), c11))));\n\n\tc2 = times_frc(s1, dsb.y);\n\n\tt1 = plus_frc(c11, c2);\n\te = minus_frc(t1, c11);\n\n\tt2 = plus_frc(plus_frc(minus_frc(c2, e), minus_frc(c11, minus_frc(t1, e))), c21);\n\n\tt12 = plus_frc(t1,t2);\n\tt22 = minus_frc(t2,minus_frc(t12,t1));\n\n\tt11 = minus_frc(dsa.x, t12);\n\te = minus_frc(t11, dsa.x);\n\t\t\n\tt21 = minus_frc(plus_frc( plus_frc(minus_frc(-t12,e),minus_frc(dsa.x,minus_frc(t11,e))) ,dsa.y),t22);\n\n\ts2 = div_frc(plus_frc(t11,t21), dsb.x);\n\n\tdsc.x = plus_frc(s1, s2);\n\tdsc.y = minus_frc(s2, minus_frc(dsc.x, s1));\n\n\treturn dsc;\n}\n\n\nfloat2 ds_sqrt (float2 dsa) {\n\tfloat2 dsb;\n\n\tfloat t1, t2, t3;\n\tfloat2 f, s0, s1;\n\n\tif (dsa.x == 0.0)\n\t{\n\t\treturn float2(0.0,0.0);\n\t}\n\n\tt1 = div_frc(1.0, sqrt(dsa.x));\n\tt2 = times_frc(dsa.x, t1);\n\n\ts0 = ds_mul(ds_set(t2),ds_set(t2));\n\ts1 = ds_sub(dsa, s0);\n\n\tt3 = times_frc(0.5, times_frc(s1.x,t1));\n\n\ts0.x = t2;\n\ts0.y = 0.0;\n\ts1.x = t3;\n\ts1.y = 0.0;\n\n\tdsb = ds_add(s0, s1);\n\n\treturn dsb;\n}\n\n\n// Couldn't get this to work\n// Sets B to the integer part of the DS number A and sets C equal to the\n// fractional part of A.  Note that if A = -3.3, then B = -3 and C = -0.3.\nfloat4 ds_infr(float2 dsa) {\n\tint ic;\n\tfloat2 dsb, dsc, con, f, s0, s1;\n\tfloat t47, t23;\n\n\tt47 = pow(2,47);\n\tt23 = pow(2,23);\n\n\tcon = float2(t47, t23); //not sure about this, data operator\n\n\tif (dsa.x == 0.0)\n\t\treturn 0.0;\n\n\t//omitted dsa < 2^47 check here, should be fine\n\n\tf = float2(1.0,0.0);\n\n\tif (dsa.x > 0.0)\n\t{\n\t\ts0 = ds_add(dsa, con);\n\t\tdsb = ds_sub(s0,con);\n\t\tic = ds_cmp(dsa, dsb);\n\n\t\tif (ic >= 0.0)\n\t\t{\n\t\t\tdsc = ds_sub(dsa,dsb);\n\t\t}\n\t\telse\n\t\t{\n\t\t\ts1 = ds_sub(dsb,f);\n\t\t\tdsb = s1;\n\t\t\tdsc = ds_sub(dsa,dsb);\n\t\t}\n\t}\n\telse\n\t{\n\t\ts0 = ds_sub(dsa,con);\n\t\tdsb = ds_add(s0,con);\n\t\tic = ds_cmp(dsa,dsb);\n\t\tif (ic <= 0.0)\n\t\t{\n\t\t\tdsc = ds_sub(dsa,dsb);\n\t\t}\n\t\telse\n\t\t{\n\t\t\ts1 = ds_add(dsb,f);\n\t\t\tdsb = s1;\n\t\t\tdsc = ds_sub(dsa,dsb);\n\t\t}\n\t}\n\n\treturn float4(dsb, dsc);\n}\n\n//Couldn't get this to work either, maybe something wrong with t47 and t23?\n//   This sets B equal to the integer nearest to the DS number A.\nfloat2 dsn_int (float2 dsa)\n{\n\tfloat2 dsb, con, s0;\n\tfloat t47, t23;\n\n\tt47 = pow(2,47);\n\tt23 = pow(2,23);\n\n\tcon = float2(t47, t23); //not sure about this, data operator, it may do something low-level, in which case this is screwed\n\n\tif (dsa.x == 0.0)\n\t{\n\t\treturn float2(0.0,0.0);\n\t}\n\n\tif (dsa.x > 0.0)\n\t{\n\t\ts0  = ds_add(dsa, con);\n\t\tdsb = ds_sub(s0, con);\n\t}\n\telse\n\t{\n\t\ts0  = ds_sub(dsa,con);\n\t\tdsb = ds_add(s0,con);\n\t}\n\n\treturn dsb;\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Shadows/DoublePrecisionEmulation.cginc.meta",
    "content": "fileFormatVersion: 2\nguid: 1a34c77a67cf21c4b8523a435293645b\nShaderImporter:\n  externalObjects: {}\n  defaultTextures: []\n  nonModifiableTextures: []\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Shadows/FixedScreenSpaceShadows.cginc",
    "content": "﻿// Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)\n\n// Essentially a modified version of the unity screenSpace shadow collector shader\n// 1) Always use INV_PROJECTION because it offers better precision than the ray method when far/near ratio is very high\n// 2) Add a very small receiverPlaneDepthBias based on z value, to avoid shadow acne, jittering and other artifacts\n\nUNITY_DECLARE_SHADOWMAP(_ShadowMapTexture);\nfloat4 _ShadowMapTexture_TexelSize;\n#define SHADOWMAPSAMPLER_AND_TEXELSIZE_DEFINED\nsampler2D _ODSWorldTexture;\n\n// ------------------------------------------------------------------\n//  Helpers\n// ------------------------------------------------------------------\nUNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n\n#include \"../ShadowsCommon.cginc\"\n\nstruct appdata {\n    float4 vertex : POSITION;\n    float2 texcoord : TEXCOORD0;\n#ifdef UNITY_STEREO_INSTANCING_ENABLED\n    float3 ray0 : TEXCOORD1;\n    float3 ray1 : TEXCOORD2;\n#else\n    float3 ray : TEXCOORD1;\n#endif\n    UNITY_VERTEX_INPUT_INSTANCE_ID\n};\n\nstruct v2f {\n\n    float4 pos : SV_POSITION;\n\n    // xy uv / zw screenpos\n    float4 uv : TEXCOORD0;\n    // View space ray, for perspective case\n    float3 ray : TEXCOORD1;\n    // Orthographic view space positions (need xy as well for oblique matrices)\n    float3 orthoPosNear : TEXCOORD2;\n    float3 orthoPosFar  : TEXCOORD3;\n    UNITY_VERTEX_INPUT_INSTANCE_ID\n    UNITY_VERTEX_OUTPUT_STEREO\n};\n\nv2f vert (appdata v)\n{\n    v2f o;\n    UNITY_SETUP_INSTANCE_ID(v);\n    UNITY_TRANSFER_INSTANCE_ID(v, o);\n    UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);\n    float4 clipPos;\n#if defined(STEREO_CUBEMAP_RENDER_ON)\n    clipPos = mul(UNITY_MATRIX_VP, mul(unity_ObjectToWorld, v.vertex));\n#else\n    clipPos = UnityObjectToClipPos(v.vertex);\n#endif\n    o.pos = clipPos;\n    o.uv.xy = v.texcoord;\n\n    // unity_CameraInvProjection at the PS level.\n    o.uv.zw = ComputeNonStereoScreenPos(clipPos);\n\n    // Perspective case\n#ifdef UNITY_STEREO_INSTANCING_ENABLED\n    o.ray = unity_StereoEyeIndex == 0 ? v.ray0 : v.ray1;\n#else\n    o.ray = v.ray;\n#endif\n\n    // To compute view space position from Z buffer for orthographic case,\n    // we need different code than for perspective case. We want to avoid\n    // doing matrix multiply in the pixel shader: less operations, and less\n    // constant registers used. Particularly with constant registers, having\n    // unity_CameraInvProjection in the pixel shader would push the PS over SM2.0\n    // limits.\n    clipPos.y *= _ProjectionParams.x;\n    float3 orthoPosNear = mul(unity_CameraInvProjection, float4(clipPos.x,clipPos.y,-1,1)).xyz;\n    float3 orthoPosFar  = mul(unity_CameraInvProjection, float4(clipPos.x,clipPos.y, 1,1)).xyz;\n    orthoPosNear.z *= -1;\n    orthoPosFar.z *= -1;\n    o.orthoPosNear = orthoPosNear;\n    o.orthoPosFar = orthoPosFar;\n\n    return o;\n}\n\n/**\n* Get camera space coord from depth and inv projection matrices\n*/\ninline float3 computeCameraSpacePosFromDepthAndInvProjMat(v2f i)\n{\n    float zdepth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv.xy);\n\n    #if defined(UNITY_REVERSED_Z)\n        zdepth = 1 - zdepth;\n    #endif\n\n    // View position calculation for oblique clipped projection case.\n    // this will not be as precise nor as fast as the other method\n    // (which computes it from interpolated ray & depth) but will work\n    // with funky projections.\n    float4 clipPos = float4(i.uv.zw, zdepth, 1.0);\n    clipPos.xyz = 2.0f * clipPos.xyz - 1.0f;\n    float4 camPos = mul(unity_CameraInvProjection, clipPos);\n    camPos.xyz /= camPos.w;\n    camPos.z *= -1;\n    return camPos.xyz;\n}\n\n/**\n* Get camera space coord from depth and info from VS\n*/\ninline float3 computeCameraSpacePosFromDepthAndVSInfo(v2f i)\n{\n    float zdepth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv.xy);\n\n    // 0..1 linear depth, 0 at camera, 1 at far plane.\n    float depth = Linear01Depth(zdepth);\n\n#if defined(UNITY_REVERSED_Z)\n    zdepth = 1 - zdepth;\n#endif\n    float3 adjustedRay = i.ray;\n\n    float3 vposPersp = adjustedRay * depth;\n\n    float3 camPos = vposPersp;\n    return camPos.xyz;\n}\n\ninline float3 computeCameraSpacePosFromDepth(v2f i);\n\n/**\n *  Hard shadow\n */\nfixed4 frag_hard (v2f i) : SV_Target\n{\n    UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); // required for sampling the correct slice of the shadow map render texture array\n    float4 wpos;\n    float3 vpos;\n\n#if defined(STEREO_CUBEMAP_RENDER_ON)\n    wpos.xyz = tex2D(_ODSWorldTexture, i.uv.xy).xyz;\n    wpos.w = 1.0f;\n    vpos = mul(unity_WorldToCamera, wpos).xyz;\n#else\n    vpos = computeCameraSpacePosFromDepth(i);\n    wpos = mul (unity_CameraToWorld, float4(vpos,1));\n#endif\n    fixed4 cascadeWeights = GET_CASCADE_WEIGHTS (wpos, vpos.z);\n    float4 shadowCoord = GET_SHADOW_COORDINATES(wpos, cascadeWeights);\n\n    //1 tap hard shadow\n    fixed shadow = UNITY_SAMPLE_SHADOW(_ShadowMapTexture, shadowCoord);\n    shadow = lerp(_LightShadowData.r, 1.0, shadow);\n\n    fixed4 res = shadow;\n    return res;\n}\n\n/**\n *  Soft Shadow (SM 3.0)\n */\nfixed4 frag_pcfSoft(v2f i) : SV_Target\n{\n    UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); // required for sampling the correct slice of the shadow map render texture array\n    float4 wpos;\n    float3 vpos;\n\n#if defined(STEREO_CUBEMAP_RENDER_ON)\n    wpos.xyz = tex2D(_ODSWorldTexture, i.uv.xy).xyz;\n    wpos.w = 1.0f;\n    vpos = mul(unity_WorldToCamera, wpos).xyz;\n#else\n    vpos = computeCameraSpacePosFromDepth(i);\n\n    // sample the cascade the pixel belongs to\n    wpos = mul(unity_CameraToWorld, float4(vpos,1));\n#endif\n    fixed4 cascadeWeights = GET_CASCADE_WEIGHTS(wpos, vpos.z);\n    float4 coord = GET_SHADOW_COORDINATES(wpos, cascadeWeights);\n    \t\n    float zdepth2 = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv.xy);\n\n\n//    float3 receiverPlaneDepthBias = float3(0.0,0.0,0.5*Linear01Depth(zdepth2));\t//my best or worst hack yet?\n\t\t\t\t\t\t\t\t\t\t\t//seems to fix all issues, no peter-panning either\n\t\t\t\t\t\t\t\t\t\t\t//perfect for 5000 shadowDistance\n\t\t\t\t\t\t\t\t\t\t\t//Holds up to 8000-9000 shadow distance and gets swimmy after\n\n     float3 receiverPlaneDepthBias = float3(0.0,0.0,2.0 * Linear01Depth(zdepth2));\t//With the new hybrid reconstruction method this isn't needed anymore but what Parallax renders to depth buffer is slightly offset so use agressive bias\n\n#ifdef UNITY_USE_RECEIVER_PLANE_BIAS\n    // Reveiver plane depth bias: need to calculate it based on shadow coordinate\n    // as it would be in first cascade; otherwise derivatives\n    // at cascade boundaries will be all wrong. So compute\n    // it from cascade 0 UV, and scale based on which cascade we're in.\n    float3 coordCascade0 = getShadowCoord_SingleCascade(wpos);\n    float biasMultiply = dot(cascadeWeights,unity_ShadowCascadeScales);\n    receiverPlaneDepthBias = UnityGetReceiverPlaneDepthBias(coordCascade0.xyz, biasMultiply);\n#endif\n\n#if defined(SHADER_API_MOBILE)\n    half shadow = UnitySampleShadowmap_PCF5x5(coord, receiverPlaneDepthBias);\n#else\n    half shadow = UnitySampleShadowmap_PCF7x7(coord, receiverPlaneDepthBias);\n#endif\n    shadow = lerp(_LightShadowData.r, 1.0f, shadow);\n\n    // Blend between shadow cascades if enabled\n    //\n    // Not working yet with split spheres, and no need when 1 cascade\n#if UNITY_USE_CASCADE_BLENDING && !defined(SHADOWS_SPLIT_SPHERES) && !defined(SHADOWS_SINGLE_CASCADE)\n    half4 z4 = (float4(vpos.z,vpos.z,vpos.z,vpos.z) - _LightSplitsNear) / (_LightSplitsFar - _LightSplitsNear);\n    half alpha = dot(z4 * cascadeWeights, half4(1,1,1,1));\n\n    UNITY_BRANCH\n        if (alpha > 1 - UNITY_CASCADE_BLEND_DISTANCE)\n        {\n            // get alpha to 0..1 range over the blend distance\n            alpha = (alpha - (1 - UNITY_CASCADE_BLEND_DISTANCE)) / UNITY_CASCADE_BLEND_DISTANCE;\n\n            // sample next cascade\n            cascadeWeights = fixed4(0, cascadeWeights.xyz);\n            coord = GET_SHADOW_COORDINATES(wpos, cascadeWeights);\n\n#ifdef UNITY_USE_RECEIVER_PLANE_BIAS\n            biasMultiply = dot(cascadeWeights,unity_ShadowCascadeScales);\n            receiverPlaneDepthBias = UnityGetReceiverPlaneDepthBias(coordCascade0.xyz, biasMultiply);\n#endif\n\n            half shadowNextCascade = UnitySampleShadowmap_PCF3x3(coord, receiverPlaneDepthBias);\n            shadowNextCascade = lerp(_LightShadowData.r, 1.0f, shadowNextCascade);\n            shadow = lerp(shadow, shadowNextCascade, alpha);\n        }\n#endif\n\n    return shadow;\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Shadows/FixedScreenSpaceShadows.cginc.meta",
    "content": "fileFormatVersion: 2\nguid: 7895e41fc42ee304cbd33be552917a5a\nShaderImporter:\n  externalObjects: {}\n  defaultTextures: []\n  nonModifiableTextures: []\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Shadows/FixedScreenSpaceShadows.shader",
    "content": "﻿// This shader is now deprecated as the long distance version is now better in every way without adding a performance hit\n\n// Essentially a modified version of the unity screenSpace shadow collector shader\n// 1) Always use INV_PROJECTION because it offers better precision than the ray method when far/near ratio is very high\n// 2) Add a very small receiverPlaneDepthBias based on z value, to avoid shadow acne, jittering and other artifacts\nShader \"Scatterer/fixedScreenSpaceShadows\" {\nProperties {\n    _ShadowMapTexture (\"\", any) = \"\" {}\n    _ODSWorldTexture(\"\", 2D) = \"\" {}\n}\n\nCGINCLUDE\n#include \"FixedScreenSpaceShadows.cginc\"\nENDCG\n\n//// ----------------------------------------------------------------------------------------\n//// Subshader for hard shadows:\n//// Just collect shadows into the buffer. Used on pre-SM3 GPUs and when hard shadows are picked.\n//\n//SubShader {\n//    Tags{ \"ShadowmapFilter\" = \"HardShadow\" }\n//    Pass {\n//        ZWrite Off ZTest Always Cull Off\n//\n//        CGPROGRAM\n//        #pragma vertex vert\n//        #pragma fragment frag_hard\n//        #pragma multi_compile_shadowcollector\n//\n//        inline float3 computeCameraSpacePosFromDepth(v2f i)\n//        {\n//            return computeCameraSpacePosFromDepthAndVSInfo(i);\n//        }\n//        ENDCG\n//    }\n//}\n\n// ----------------------------------------------------------------------------------------\n// Subshader for hard shadows:\n// Just collect shadows into the buffer. Used on pre-SM3 GPUs and when hard shadows are picked.\n// This version does inv projection at the PS level, slower and less precise however more general.\n\nSubShader {\n//    Tags{ \"ShadowmapFilter\" = \"HardShadow_FORCE_INV_PROJECTION_IN_PS\" }\n      Tags{ \"ShadowmapFilter\" = \"HardShadow\" }\n    Pass{\n        ZWrite Off ZTest Always Cull Off\n\n        CGPROGRAM\n        #pragma vertex vert\n        #pragma fragment frag_hard\n        #pragma multi_compile_shadowcollector\n\n        inline float3 computeCameraSpacePosFromDepth(v2f i)\n        {\n            return computeCameraSpacePosFromDepthAndInvProjMat(i);\n        }\n        ENDCG\n    }\n}\n\n//// ----------------------------------------------------------------------------------------\n//// Subshader that does soft PCF filtering while collecting shadows.\n//// Requires SM3 GPU.\n//\n//Subshader {\n//    Tags {\"ShadowmapFilter\" = \"PCF_SOFT\"}\n//    Pass {\n//        ZWrite Off ZTest Always Cull Off\n//\n//        CGPROGRAM\n//        #pragma vertex vert\n//        #pragma fragment frag_pcfSoft\n//        #pragma multi_compile_shadowcollector\n//        #pragma target 3.0\n//\n//        inline float3 computeCameraSpacePosFromDepth(v2f i)\n//        {\n//            return computeCameraSpacePosFromDepthAndVSInfo(i);\n//        }\n//        ENDCG\n//    }\n//}\n\n// ----------------------------------------------------------------------------------------\n// Subshader that does soft PCF filtering while collecting shadows.\n// Requires SM3 GPU.\n// This version does inv projection at the PS level, slower and less precise however more general.\n// \n\nSubshader{\n    //Tags{ \"ShadowmapFilter\" = \"PCF_SOFT_FORCE_INV_PROJECTION_IN_PS\" }\n    Tags {\"ShadowmapFilter\" = \"PCF_SOFT\"}\n    Pass{\n        ZWrite Off ZTest Always Cull Off\n\n        CGPROGRAM\n        #pragma vertex vert\n        #pragma fragment frag_pcfSoft\n        #pragma multi_compile_shadowcollector\n        #pragma target 3.0\n\n        inline float3 computeCameraSpacePosFromDepth(v2f i)\n        {\n            return computeCameraSpacePosFromDepthAndInvProjMat(i);\n        }\n        ENDCG\n    }\n}\n\nFallback Off\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Shadows/FixedScreenSpaceShadows.shader.meta",
    "content": "fileFormatVersion: 2\nguid: e7719e74d14c6ca45a8d38ed1a32e5d9\nShaderImporter:\n  externalObjects: {}\n  defaultTextures: []\n  nonModifiableTextures: []\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Shadows/LongDistanceScreenSpaceShadows.shader",
    "content": "﻿// Same as fixedScreenSpaceShadows shader but uses the enhanced ray/projection method to calculate accurate position\n// Some other experimentes are kept in this file but no longer used: Including dual-depth method, binary search method, double precision method\nShader \"Scatterer/customScreenSpaceShadows\" {\nProperties {\n    _ShadowMapTexture (\"\", any) = \"\" {}\n    _ODSWorldTexture(\"\", 2D) = \"\" {}\n}\n\nCGINCLUDE\n#include \"FixedScreenSpaceShadows.cginc\"\n#include \"DoublePrecisionEmulation.cginc\"\n\nUNITY_DECLARE_DEPTH_TEXTURE(AdditionalDepthBuffer);\nfloat4x4  ScattererAdditionalInvProjection;\n\n/**\n* Get camera space coord from depth and inv projection matrices\n* No longer needed, deprecated in favor of hybrid ray/matrix method below\n*/\ninline float3 computeCameraSpacePosFromDualDepthAndInvProjMat(v2f i)\n{\n    float zdepth  = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv.xy);\n    float zdepth2 = SAMPLE_DEPTH_TEXTURE(AdditionalDepthBuffer, i.uv.xy);\n\n    #if defined(UNITY_REVERSED_Z)\n        zdepth  = 1 - zdepth;\n        zdepth2 = 1 - zdepth2;\n    #endif\n\n    float4 clipPos = float4(i.uv.zw, zdepth, 1.0);\n    clipPos.xyz = 2.0f * clipPos.xyz - 1.0f;\n    float4 camPos = mul(unity_CameraInvProjection, clipPos);\n    camPos.xyz /= camPos.w;\n    camPos.z *= -1;\n\n    float4 clipPos2 = float4(i.uv.zw, zdepth2, 1.0);\n    clipPos2.xyz = 2.0f * clipPos2.xyz - 1.0f;\n    float4 camPos2 = mul(ScattererAdditionalInvProjection, clipPos2);\n    camPos2.xyz /= camPos2.w;\n    camPos2.z *= -1;\n\n    return length(camPos.xyz) < 8000 ? camPos.xyz : camPos2.xyz ;\n}\n\n//Refines the inaccurate worldPos from invprojection with a search algorithm\n//Apparently overshoots here even though it worked well for scattering shader\nfloat getRefinedDistanceFromDepth(float unrefinedDistance, float zdepth, float3 viewDir)\n{\n\tconst int maxIterations = 30; //seems about perfect\n\tint iteration = 0;\n\n\tfloat maxSearchDistance = unrefinedDistance * 1.30;\n\tfloat minSearchDistance = unrefinedDistance * 0.70;\n\n\tfloat mid = 0;\n\tfloat3 camPos0 = float3(0.0,0.0,0.0);\n\tfloat4 clipPos = float4(0.0,0.0,0.0,1.0);\n\tfloat depth = -10.0;\n\n\twhile ((iteration < maxIterations) && (depth != zdepth))\n\t{\n\t\tmid = 0.5 * (maxSearchDistance + minSearchDistance);\n\n\t\tcamPos0 =  viewDir * mid;\n\n\t\tclipPos = mul(UNITY_MATRIX_P, float4(camPos0,1.0));\n\t\tdepth = clipPos.z/clipPos.w;\n\n\t\tmaxSearchDistance = (depth < zdepth) ? mid : maxSearchDistance;\n\t\tminSearchDistance = (depth > zdepth) ? mid : minSearchDistance;\n\n\t\titeration++;\n\t}\n\n\treturn mid;\n}\n\n// Binary search method, worked well for the scattering shader but seems to overshoot here\ninline float3 computeEnhancedCameraSpacePosFromDepthAndInvProjMat(v2f i)\n{\n\tfloat textureZdepth  = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv.xy);\n\n\tfloat zdepth = textureZdepth;\n\t\n\t#if defined(UNITY_REVERSED_Z)\n\tzdepth  = 1 - zdepth;\n\t#endif\n\n\tfloat4 clipPos = float4(i.uv.zw, zdepth, 1.0);\n\tclipPos.xyz = 2.0f * clipPos.xyz - 1.0f;\n\tfloat4 camPos = mul(unity_CameraInvProjection, clipPos);\n\tcamPos.xyz /= camPos.w;\n\tcamPos.z *= -1;\n\n\tfloat invDepthLength = length(camPos.xyz);\n\tfloat3 viewDir = camPos.xyz / invDepthLength;\n\n\t//now refine the inaccurate distance\n\tfloat distance = invDepthLength;\n\n//\tif (distance > 8000.0)\n\t{\n\t\tdistance = getRefinedDistanceFromDepth(distance, textureZdepth, viewDir); //seems like my method is overshooting actually, or something else is wrong with these params, to investigate, maybe the projection matrix, maybe the direction is flipped\n\t}\n\t\t\t\n\tcamPos.xyz = distance * viewDir;\n\n\treturn camPos.xyz;\n}\n\n//after implementing this it seems like this isn't even the source of the issue, but rather the ray direction that unity passes, good job unity wtf\ninline float2 Linear01DepthDoublePrecision( float z )\n{\n\t//return 1.0 / (_ZBufferParams.x * z + _ZBufferParams.y);\n\n\tfloat2 doubleZBufferParamsY = ds_sub(ds_set(1.0), ds_div(ds_set(_ProjectionParams.y), ds_set(_ProjectionParams.z)));\n\tfloat2 doubleWhateverElse   = ds_mul(ds_div(ds_set(_ProjectionParams.z), ds_set(_ProjectionParams.y)), ds_set(z));\n\n\tfloat2 doubleResultLower = ds_add(doubleZBufferParamsY, doubleWhateverElse);\n\tfloat2 doubleResult = ds_div(ds_set(1.0), doubleResultLower);\n\treturn doubleResult;\n}\n\n//This is the same ray method but calculations are done in emulated double precision\n//This ended up being useless, the source of the problem is the ray direction passed by unity\ninline float3 computeCameraSpacePosFromDepthAndVSInfoDoublePrecision(v2f i)\n{\n\tfloat zdepth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv.xy);\n\n\t// 0..1 linear depth, 0 at camera, 1 at far plane.\n\tfloat2 doublePrecisionDepth = Linear01DepthDoublePrecision(zdepth);\n\n\tfloat3 adjustedRay = i.ray;\n\tfloat3 rayDirection = normalize(i.ray);\n\n\tfloat3 vposPersp = adjustedRay * doublePrecisionDepth.x;\n\n\treturn vposPersp;\n}\n\n/**\n* Use the ray method to find position, except use the ray direction calculated with the invProj method because it's more accurate\n* Kind of a hybrid of the two methods\n*/\ninline float3 computeCameraSpacePosFromLinearDepthAndInvProjMat(v2f i)\n{\n\tfloat zdepth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv.xy);\n\n#if SHADER_API_D3D11 || SHADER_API_D3D || SHADER_API_D3D12\n\tif (zdepth == 0.0) {discard;}\n#else\n\tif (zdepth == 1.0) {discard;}\n#endif\n\n\tfloat depth = Linear01Depth(zdepth);\n\n\t//float3 rayDirection = normalize(i.ray); //this ray is imprecise and can't be trusted\n\t\t\t\t\t\t  //calculate our own ray direction using the inverse projection matrix method\n\n#if defined(UNITY_REVERSED_Z)\n\tzdepth = 1 - zdepth;\n#endif\n\n\tfloat4 clipPos = float4(i.uv.zw, zdepth, 1.0);\n\tclipPos.xyz = 2.0f * clipPos.xyz - 1.0f;\n\tfloat4 camPos = mul(unity_CameraInvProjection, clipPos);\n\tcamPos.xyz /= camPos.w;\n\tcamPos.z *= -1;\n\n\tfloat3 rayDirection = normalize(camPos.xyz);\n\n\tfloat3 cameraForwardDir = float3(0,0,1);\n\tfloat aa = dot(rayDirection, cameraForwardDir);\n\n\tfloat3 vposPersp = rayDirection * depth/aa * _ProjectionParams.z;\n\treturn vposPersp;\n}\n\nENDCG\n\n\n// ----------------------------------------------------------------------------------------\n// Subshader for hard shadows:\n// Just collect shadows into the buffer. Used on pre-SM3 GPUs and when hard shadows are picked.\n// This version does inv projection at the PS level, slower and less precise however more general.\n\nSubShader {\n      Tags{ \"ShadowmapFilter\" = \"HardShadow\" }\n    Pass{\n        ZWrite Off ZTest Always Cull Off\n\n        CGPROGRAM\n        #pragma vertex vert\n        #pragma fragment frag_hard\n        #pragma multi_compile_shadowcollector\n\n        inline float3 computeCameraSpacePosFromDepth(v2f i)\n        {\n\t\treturn computeCameraSpacePosFromLinearDepthAndInvProjMat(i);\n        }\n        ENDCG\n    }\n}\n\n// ----------------------------------------------------------------------------------------\n// Subshader that does soft PCF filtering while collecting shadows.\n// Requires SM3 GPU.\n// This version does inv projection at the PS level, slower and less precise however more general.\n// \n\nSubshader{\n    Tags {\"ShadowmapFilter\" = \"PCF_SOFT\"}\n    Pass{\n        ZWrite Off ZTest Always Cull Off\n\n        CGPROGRAM\n        #pragma vertex vert\n        #pragma fragment frag_pcfSoft\n        #pragma multi_compile_shadowcollector\n        #pragma target 3.0\n\n        inline float3 computeCameraSpacePosFromDepth(v2f i)\n        {\n\t\treturn computeCameraSpacePosFromLinearDepthAndInvProjMat(i);\n        }\n\n        ENDCG\n    }\n}\n\nFallback Off\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Shadows/LongDistanceScreenSpaceShadows.shader.meta",
    "content": "fileFormatVersion: 2\nguid: 02e622e7baa59ac449d2c5f5bc992795\nShaderImporter:\n  externalObjects: {}\n  defaultTextures: []\n  nonModifiableTextures: []\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Shadows.meta",
    "content": "fileFormatVersion: 2\nguid: 5bcb408b7b5e4d346aeb4860ab1d9d9b\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/ShadowsCommon.cginc",
    "content": "﻿#include \"UnityCG.cginc\"\n#include \"UnityShadowLibrary.cginc\"\n\n// Configuration\n\n\n// Should receiver plane bias be used? This estimates receiver slope using derivatives,\n// and tries to tilt the PCF kernel along it. However, since we're doing it in screenspace\n// from the depth texture, the derivatives are wrong on edges or intersections of objects,\n// leading to possible shadow artifacts. So it's disabled by default.\n// See also UnityGetReceiverPlaneDepthBias in UnityShadowLibrary.cginc.\n//#define UNITY_USE_RECEIVER_PLANE_BIAS\n\n\n// Blend between shadow cascades to hide the transition seams?\n#define UNITY_USE_CASCADE_BLENDING 0\n#define UNITY_CASCADE_BLEND_DISTANCE 0.1\n\n// sizes of cascade projections, relative to first one\nfloat4 unity_ShadowCascadeScales;\n\n//\n// Keywords based defines\n//\n#if defined (SHADOWS_SPLIT_SPHERES)\n#define GET_CASCADE_WEIGHTS(wpos, z)    getCascadeWeights_splitSpheres(wpos)\n#else\n#define GET_CASCADE_WEIGHTS(wpos, z)    getCascadeWeights( wpos, z )\n#endif\n\n#if defined (SHADOWS_SINGLE_CASCADE)\n#define GET_SHADOW_COORDINATES(wpos,cascadeWeights) getShadowCoord_SingleCascade(wpos)\n#else\n#define GET_SHADOW_COORDINATES(wpos,cascadeWeights) getShadowCoord(wpos,cascadeWeights)\n#endif\n\n\n/**\n * Gets the cascade weights based on the world position of the fragment.\n * Returns a float4 with only one component set that corresponds to the appropriate cascade.\n */\ninline fixed4 getCascadeWeights(float3 wpos, float z)\n{\n\tfixed4 zNear = float4( z >= _LightSplitsNear );\n\tfixed4 zFar = float4( z < _LightSplitsFar );\n\tfixed4 weights = zNear * zFar;\n\treturn weights;\n}\n\n/**\n * Gets the cascade weights based on the world position of the fragment and the poisitions of the split spheres for each cascade.\n * Returns a float4 with only one component set that corresponds to the appropriate cascade.\n */\ninline fixed4 getCascadeWeights_splitSpheres(float3 wpos)\n{\n\tfloat3 fromCenter0 = wpos.xyz - unity_ShadowSplitSpheres[0].xyz;\n\tfloat3 fromCenter1 = wpos.xyz - unity_ShadowSplitSpheres[1].xyz;\n\tfloat3 fromCenter2 = wpos.xyz - unity_ShadowSplitSpheres[2].xyz;\n\tfloat3 fromCenter3 = wpos.xyz - unity_ShadowSplitSpheres[3].xyz;\n\tfloat4 distances2 = float4(dot(fromCenter0,fromCenter0), dot(fromCenter1,fromCenter1), dot(fromCenter2,fromCenter2), dot(fromCenter3,fromCenter3));\n\tfixed4 weights = float4(distances2 < unity_ShadowSplitSqRadii);\n\tweights.yzw = saturate(weights.yzw - weights.xyz);\n\treturn weights;\n}\n\n/**\n * Returns the shadowmap coordinates for the given fragment based on the world position and z-depth.\n * These coordinates belong to the shadowmap atlas that contains the maps for all cascades.\n */\ninline float4 getShadowCoord( float4 wpos, fixed4 cascadeWeights )\n{\n\tfloat3 sc0 = mul (unity_WorldToShadow[0], wpos).xyz;\n\tfloat3 sc1 = mul (unity_WorldToShadow[1], wpos).xyz;\n\tfloat3 sc2 = mul (unity_WorldToShadow[2], wpos).xyz;\n\tfloat3 sc3 = mul (unity_WorldToShadow[3], wpos).xyz;\n\tfloat4 shadowMapCoordinate = float4(sc0 * cascadeWeights[0] + sc1 * cascadeWeights[1] + sc2 * cascadeWeights[2] + sc3 * cascadeWeights[3], 1);\n\t#if defined(UNITY_REVERSED_Z)\n\tfloat  noCascadeWeights = 1 - dot(cascadeWeights, float4(1, 1, 1, 1));\n\tshadowMapCoordinate.z += noCascadeWeights;\n\t#endif\n\treturn shadowMapCoordinate;\n}\n\n/**\n * Same as the getShadowCoord; but optimized for single cascade\n */\ninline float4 getShadowCoord_SingleCascade( float4 wpos )\n{\n\treturn float4( mul (unity_WorldToShadow[0], wpos).xyz, 0);\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/ShadowsCommon.cginc.meta",
    "content": "fileFormatVersion: 2\nguid: 06bfdc59aae5325499d5beef3aa3d013\nShaderImporter:\n  externalObjects: {}\n  defaultTextures: []\n  nonModifiableTextures: []\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/SunFlare/SunFlare.shader",
    "content": "﻿Shader \"Scatterer/sunFlare\" \n{\n\tCGINCLUDE\n\n\t#include \"UnityCG.cginc\"\n\t#include \"../CommonAtmosphere.cginc\"\n\t#include \"../DepthCommon.cginc\"\n\n\tuniform float sunGlareScale;\n\tuniform float sunGlareFade;\n\n\tuniform sampler2D sunSpikes;\n\tuniform sampler2D sunFlare;\n\tuniform sampler2D sunGhost1;\n\tuniform sampler2D sunGhost2;\n\tuniform sampler2D sunGhost3;\n\n\tuniform float3 flareColor;\n\n\tuniform sampler2D extinctionTexture;\n\n\tuniform float3 flareSettings;\t\t//intensity, aspect ratio, scale\n\tuniform float3 spikesSettings;\n\n\tuniform float4x4 ghost1Settings1;\t//each row is an instance of a ghost\n\tuniform float4x4 ghost1Settings2;\t//for each row: intensity, aspect ratio, scale, position on sun-screenCenter line. Intensity of 0 means nothing defined\n\n\tuniform float4x4 ghost2Settings1;\n\tuniform float4x4 ghost2Settings2;\n\n\tuniform float4x4 ghost3Settings1;\n\tuniform float4x4 ghost3Settings2;\n\n\tuniform float3 sunViewPortPos;\n\tuniform float aspectRatio;\n\n\tuniform float renderSunFlare;\n\tuniform float renderOnCurrentCamera;\n\tuniform float useDbufferOnCamera;\t\n\n\tstruct v2f \n\t{\n\t\tfloat4 pos: SV_POSITION;\n\t\tfloat2 uv : TEXCOORD0;\n\t\tfloat3 color : TEXCOORD1;\n\t};\n\n\tv2f flareVertexShader(appdata_base v, float3 sunViewPortPos, float3 settings)\n\t{\n\t\tv2f OUT;\n\n\t\tfloat drawFlare = (useDbufferOnCamera < 1.0) ? 1.0 : checkDepthBufferEmpty(sunViewPortPos.xy);  //if there's something in the way don't render the flare\n\n\t\tsunViewPortPos.xy = 2.0 * sunViewPortPos.xy - float2(1.0,1.0);\n\t\tsunViewPortPos.y *= _ProjectionParams.x;\n\n\t\tv.vertex.xy = sunViewPortPos.xy + v.vertex.xy / (settings.z * sunGlareScale * float2(aspectRatio * settings.y, 1.0)); //change this so it no longer has to do a division\n\n\t\tOUT.pos = float4(v.vertex.xy, 1.0, 1.0);\n\n\t\tOUT.pos = (settings.x > 0.0) && (renderSunFlare == 1.0) && (_ProjectionParams.y < 200.0) && (renderOnCurrentCamera == 1.0) && (drawFlare ==1.0) ? OUT.pos : float4(2.0,2.0,2.0,1.0);\t//if we don't need to render the sunflare, cull vertexes by placing them outside clip space\n\t\t//also use near plane to not render on far camera\n\t\tOUT.uv = v.texcoord.xy;\n\n\t\tOUT.color = settings.x * sunGlareFade * flareColor * tex2Dlod(extinctionTexture,float4(0.0,0.0,0.0,0.0)).rgb;\n\n\t\treturn OUT;\n\t}\n\n\tstruct v2g\n\t{\n\t\tfloat4 pos: SV_POSITION;\n\t\tfloat2 uv : TEXCOORD0;\n\t\tfloat3 color : TEXCOORD1;\n\t};\n\n\tstruct g2f\n\t{\n\t\tfloat4 pos: SV_POSITION;\n\t\tfloat2 uv : TEXCOORD0;\n\t\tfloat3 color : TEXCOORD1;\n\t};\n\n\tv2g ghostVertexShader (appdata_base v, float3 sunViewPortPos, float ghostFade)\n\t{\n\t\tv2g OUT;\n\n\t\tOUT.pos = float4(v.vertex.xy, 1.0, 1.0);\n\t\tOUT.uv = v.texcoord.xy;\n\n\t\tfloat2 toScreenCenter=sunViewPortPos.xy-0.5;\n\t\tOUT.color = ghostFade * smoothstep(0,1.0,1.0-length(toScreenCenter)) * sunGlareFade * flareColor * tex2Dlod(extinctionTexture,float4(0.0,0.0,0.0,0.0)).rgb;\n\n\t\treturn OUT;\n\t}\n\n\tg2f buildGhostVertex(v2g input, float4 ghostSettings, float3 sunViewPortPos)\n\t{\n\t\tg2f tri;\n\n\t\ttri.pos = input.pos;\n\t\ttri.pos.xy = sunViewPortPos.xy - sunViewPortPos.xy * ghostSettings.w + tri.pos.xy / (ghostSettings.z * float2(aspectRatio * ghostSettings.y, 1.0)); //change this so it no longer has to do a division\n\t\ttri.uv = input.uv;\n\t\ttri.color = input.color * ghostSettings.x ;\n\n\t\treturn tri;\n\t}\n\n\t//geometry shader\n\t//for every triangle of the input, create a max of 8 triangles, (max 8 possible instances of each ghost)\n\tinline void ghostGeometryShader(v2g input[3], inout TriangleStream<g2f> outStream, float4x4 settings1, float4x4 settings2, float3 sunViewPortPos)\n\t{\n\t\tfloat drawFlare = (useDbufferOnCamera < 1.0) ? 1.0 : checkDepthBufferEmpty(sunViewPortPos.xy);\n\t\tdrawFlare = (renderSunFlare == 1.0) && (_ProjectionParams.y < 200.0) && (renderOnCurrentCamera == 1.0) && (drawFlare ==1.0) ? 1.0 : 0.0;\n\n\t\tsunViewPortPos.xy = 2.0 * sunViewPortPos.xy - float2(1.0,1.0);\n\t\tsunViewPortPos.y *= _ProjectionParams.x;\n\n\t\tfor (int i=0; i<4; ++i)\n\t\t{\n\t\t\tif ((settings1[i].x == 0) || (drawFlare < 1.0))\n\t\t\t\tbreak;\n\n\t\t\toutStream.Append(buildGhostVertex(input[0], settings1[i], sunViewPortPos));\n\t\t\toutStream.Append(buildGhostVertex(input[1], settings1[i], sunViewPortPos));\n\t\t\toutStream.Append(buildGhostVertex(input[2], settings1[i], sunViewPortPos));\n\n\t\t\toutStream.RestartStrip();\n\t\t}\n\n\t\tfor (i=0; i<4; ++i)\n\t\t{\n\t\t\tif ((settings2[i].x == 0) || (drawFlare < 1.0))\n\t\t\t\tbreak;\n\n\t\t\toutStream.Append(buildGhostVertex(input[0], settings2[i], sunViewPortPos));\n\t\t\toutStream.Append(buildGhostVertex(input[1], settings2[i], sunViewPortPos));\n\t\t\toutStream.Append(buildGhostVertex(input[2], settings2[i], sunViewPortPos));\n\n\t\t\toutStream.RestartStrip();\n\t\t}\n\t}\n\n\tENDCG\n\n\tSubShader \n\t{\n\t\tTags {\"Queue\" = \"Transparent\" \"IgnoreProjector\"=\"True\" \"RenderType\"=\"Transparent\"}\n\n\t\t//Pass 0: flare 1\n\t\tPass \n\t\t{\n\t\t\tZWrite Off\n\t\t\tZTest Off\n\t\t\tcull off\n\n\t\t\tBlend One OneMinusSrcColor  //\"reverse\" soft-additive\n\n\t\t\tCGPROGRAM\n\t\t\t#pragma target 3.0\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\t\t\t#pragma glsl\n\n\t\t\tv2f vert(appdata_base v)\n\t\t\t{\n\t\t\t\treturn flareVertexShader(v, sunViewPortPos, flareSettings);\n\t\t\t}\n\n\t\t\tfloat4 frag(v2f IN) : SV_Target\n\t\t\t{\n\t\t\t\tfloat3 sunColor= IN.color * tex2Dlod (sunFlare,float4(IN.uv.xy,0,0)).rgb;\n\t\t\t\treturn float4(sunColor,1.0);\n\t\t\t}\n\t\t\tENDCG\n\t\t}\n\n\t\t//Pass 1: flare2\n\t\tPass \n\t\t{\n\t\t\tZWrite Off\n\t\t\tZTest Off\n\t\t\tcull off\n\n\t\t\tBlend One OneMinusSrcColor\n\n\t\t\tCGPROGRAM\n\t\t\t#pragma target 3.0\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\t\t\t#pragma glsl\n\n\t\t\tv2f vert(appdata_base v)\n\t\t\t{\n\t\t\t\treturn flareVertexShader(v, sunViewPortPos, spikesSettings);\n\t\t\t}\n\t\t\t\t\n\t\t\tfloat4 frag(v2f IN) : SV_Target\n\t\t\t{\n\t\t\t\tfloat3 sunColor= IN.color *  tex2Dlod (sunSpikes,float4(IN.uv.xy,0,0)).rgb;\n\t\t\t\treturn float4(sunColor,1.0);\n\t\t\t}\n\t\t\tENDCG\n\t\t}\n\n\t\t//Pass 2: ghost 1\n\t\tPass \n\t\t{\n\t\t\tZWrite Off\n\t\t\tZTest Off\n\t\t\tcull off\n\n\t\t\tBlend One OneMinusSrcColor\n\n\t\t\tCGPROGRAM\n\t\t\t#pragma vertex vert\n\t\t\t#pragma geometry geom\n\t\t\t#pragma fragment frag\n\t\t\t#pragma glsl\n\n\t\t\tuniform float ghost1Fade;\n\n\t\t\tv2g vert(appdata_base v)\n\t\t\t{\n\t\t\t\treturn ghostVertexShader(v, sunViewPortPos, ghost1Fade);\n\t\t\t}\n\n\t\t\t[maxvertexcount(24)]\n\t\t\tvoid geom(triangle v2g input[3], inout TriangleStream<g2f> outStream)\n\t\t\t{\n\t\t\t\tghostGeometryShader(input, outStream, ghost1Settings1, ghost1Settings2, sunViewPortPos);\n\t\t\t}\n\n\n\t\t\tfloat4 frag(g2f IN) : SV_Target\n\t\t\t{\n\t\t\t\tfloat3 sunColor= IN.color * tex2Dlod (sunGhost1,float4(IN.uv.xy,0,0)).rgb;\n\t\t\t\treturn float4(sunColor,1.0);\n\t\t\t}\n\t\t\tENDCG\n\t\t}\n\n\t\t//Pass 3: ghost 2\n\t\tPass \n\t\t{\n\t\t\tZWrite Off\n\t\t\tZTest Off\n\t\t\tcull off\n\n\t\t\tBlend One OneMinusSrcColor\n\n\t\t\tCGPROGRAM\n\t\t\t#pragma vertex vert\n\t\t\t#pragma geometry geom\n\t\t\t#pragma fragment frag\n\t\t\t#pragma glsl\n\n\t\t\tuniform float ghost2Fade;\n\n\t\t\tv2g vert(appdata_base v)\n\t\t\t{\n\t\t\t\treturn ghostVertexShader(v, sunViewPortPos, ghost2Fade);\n\t\t\t}\n\n\t\t\t[maxvertexcount(24)]\n\t\t\tvoid geom(triangle v2g input[3], inout TriangleStream<g2f> outStream)\n\t\t\t{\n\t\t\t\tghostGeometryShader(input, outStream, ghost2Settings1, ghost2Settings2, sunViewPortPos);\n\t\t\t}\n\n\n\t\t\tfloat4 frag(g2f IN) : SV_Target\n\t\t\t{\n\t\t\t\tfloat3 sunColor= IN.color * tex2Dlod (sunGhost2,float4(IN.uv.xy,0,0)).rgb;\n\t\t\t\treturn float4(sunColor,1.0);\n\t\t\t}\n\t\t\tENDCG\n\t\t}\n\n\t\t//Pass 4: ghost 3\n\t\tPass \n\t\t{\n\t\t\tZWrite Off\n\t\t\tZTest Off\n\t\t\tcull off\n\n\t\t\tBlend One OneMinusSrcColor\n\n\t\t\tCGPROGRAM\n\t\t\t#pragma vertex vert\n\t\t\t#pragma geometry geom\n\t\t\t#pragma fragment frag\n\t\t\t#pragma glsl\n\n\t\t\tuniform float ghost3Fade;\n\n\t\t\tv2g vert(appdata_base v)\n\t\t\t{\n\t\t\t\treturn ghostVertexShader(v, sunViewPortPos, ghost3Fade);\n\t\t\t}\n\t\t\t\t\n\t\t\t[maxvertexcount(24)]\n\t\t\tvoid geom(triangle v2g input[3], inout TriangleStream<g2f> outStream)\n\t\t\t{\n\t\t\t\tghostGeometryShader(input, outStream, ghost3Settings1, ghost3Settings2, sunViewPortPos);\n\t\t\t}\n\n\n\t\t\tfloat4 frag(g2f IN) : SV_Target\n\t\t\t{\n\t\t\t\tfloat3 sunColor= IN.color * tex2Dlod (sunGhost3,float4(IN.uv.xy,0,0)).rgb;\n\t\t\t\treturn float4(sunColor,1.0);\n\t\t\t}\n\t\t\tENDCG\n\t\t}\n\t}\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/SunFlare/SunFlare.shader.meta",
    "content": "fileFormatVersion: 2\nguid: 34f9419ac53fdb44fa9676a451481931\nShaderImporter:\n  defaultTextures: []\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/SunFlare/SunFlareExtinction.shader",
    "content": "// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'\n\nShader \"Scatterer/sunFlareExtinction\" \n{\n\tSubShader \n\t{\n\t\tPass //pass 0 - atmospheric extinction\n\t\t{\n\t\t\tZWrite Off\n\t\t\tZTest Off\n\t\t\tcull off\n\n\t\t\tBlend DstColor Zero  //multiplicative blending\n\n\t\t\tCGPROGRAM\n\t\t\t#include \"UnityCG.cginc\"\n\t\t\t#pragma target 3.0\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\t\t\t#pragma multi_compile DISABLE_UNDERWATER_OFF DISABLE_UNDERWATER_ON\n\n\t\t\tuniform float Rg;\n\t\t\tuniform float Rt;\n\t\t\tuniform sampler2D _Sky_Transmittance;\n\n\t\t\tuniform float3 _Sun_WorldSunDir;\n\t\t\tuniform float3 _Globals_WorldCameraPos;\n\t\t\tuniform float _experimentalAtmoScale;\n\n\t\t\tstruct v2f \n\t\t\t{\n\t\t\t\tfloat4  pos : SV_POSITION;\n\t\t\t\tfloat2  uv : TEXCOORD0;\n\t\t\t};\n\n\t\t\tv2f vert(appdata_base v)\n\t\t\t{\n\t\t\t\tv2f OUT;\n\t\t\t\tOUT.pos = UnityObjectToClipPos(v.vertex);\n\t\t\t\tOUT.uv = v.texcoord;\n\n\t\t\t\treturn OUT;\n\t\t\t}\n\n\t\t\tfloat2 GetTransmittanceUV(float r, float mu)\n\t\t\t{\n\t\t\t\tfloat uR, uMu;\n\t\t\t\tuR = sqrt((r - Rg) / (Rt - Rg));\n\t\t\t\tuMu = atan((mu + 0.15) / (1.0 + 0.15) * tan(1.5)) / 1.5;\n\t\t\t\treturn float2(uMu, uR);\n\t\t\t}\n\n\t\t\tfloat3 Transmittance(float r, float mu) \n\t\t\t{\n\t\t\t\tfloat2 uv = GetTransmittanceUV(r, mu);\n\t\t\t\treturn tex2Dlod(_Sky_Transmittance, float4(uv,0,0)).rgb;\n\t\t\t}\n\n\t\t\tfloat SQRT(float f, float err)\n\t\t\t{\n\t\t\t\treturn f >= 0.0 ? sqrt(f) : err;\n\t\t\t}\n\n\t\t\tfloat3 getExtinction(float3 camera, float3 viewdir)\n\t\t\t{\n\t\t\t\tfloat3 extinction = float3(1,1,1);\n\n\t\t\t\tRt=Rg+(Rt-Rg)*_experimentalAtmoScale;\n\n\t\t\t\tfloat r = length(camera);\n\t\t\t\tfloat rMu = dot(camera, viewdir);\n\t\t\t\tfloat mu = rMu / r;\n\n\t\t\t\t//float deltaSq = sqrt(rMu * rMu - r * r + Rt*Rt);\n\t\t\t\tfloat deltaSq = SQRT(rMu * rMu - r * r + Rt*Rt,0.000001);\n\n\n\t\t\t\tfloat din = max(-rMu - deltaSq, 0.0);\n\t\t\t\tif (din > 0.0)\n\t\t\t\t{\n\t\t\t\t\tcamera += din * viewdir;\n\t\t\t\t\trMu += din;\n\t\t\t\t\tmu = rMu / Rt;\n\t\t\t\t\tr = Rt;\n\t\t\t\t}\n\n\t\t\t\textinction = (r > Rt) ? float3(1,1,1) : Transmittance(r, mu);\n\n\t\t\t\treturn extinction;\n\t\t\t}\n\n\t\t\tfloat4 frag(v2f IN): COLOR\n\t\t\t{\n\t\t\t\tfloat3 WSD = _Sun_WorldSunDir;\n\t\t\t\tfloat3 WCP = _Globals_WorldCameraPos;\n\n\t\t\t\tfloat3 extinction = getExtinction(WCP,WSD);\n\n#if defined (DISABLE_UNDERWATER_ON) //disable when underwater\n\t\t\t\textinction = (length(WCP) >= Rg ) ? extinction : float4(0.0,0.0,0.0,1.0);\n#endif\n\n\t\t\t\treturn float4(extinction,1.0);\n\t\t\t}\n\n\t\t\tENDCG\n\t\t}\n\n\n\t\tPass //pass 1 - ring extinction\n\t\t{\n\t\t\tZWrite Off\n\t\t\tZTest Off\n\t\t\tcull off\n\n\t\t\tBlend DstColor Zero  //multiplicative blending\n\n\t\t\tCGPROGRAM\n\t\t\t#include \"UnityCG.cginc\"\n\t\t\t#include \"../IntersectCommon.cginc\"\n\t\t\t#include \"../RingCommon.cginc\"\n\t\t\t#pragma target 3.0\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\n\t\t\tuniform float3 _Sun_WorldSunDir;\n\t\t\tuniform float3 _Globals_WorldCameraPos;\n\n\t\t\tstruct v2f \n\t\t\t{\n\t\t\t\tfloat4  pos : SV_POSITION;\n\t\t\t\tfloat2  uv : TEXCOORD0;\n\t\t\t};\n\n\t\t\tv2f vert(appdata_base v)\n\t\t\t{\n\t\t\t\tv2f OUT;\n\t\t\t\tOUT.pos = UnityObjectToClipPos(v.vertex);\n\t\t\t\tOUT.uv = v.texcoord;\n\t\t\t\treturn OUT;\n\t\t\t}\n\n\t\t\tfloat4 frag(v2f IN): COLOR\n\t\t\t{\n\t\t\t\tfloat3 WCP = _Globals_WorldCameraPos;\n\n\t\t\t\tfloat4 ringColor = getLinearRingColor(WCP,_Sun_WorldSunDir,float3(0,0,0));\n\n\t\t\t\treturn float4(ringColor.xyz,1.0);\n\t\t\t}\n\n\t\t\tENDCG\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/SunFlare/SunFlareExtinction.shader.meta",
    "content": "fileFormatVersion: 2\nguid: 357e9aeae0d19c148b2437b05c8b3361\ntimeCreated: 1485103617\nlicenseType: Free\nShaderImporter:\n  defaultTextures: []\n  userData: \n  assetBundleName: scatterershaders\n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/SunFlare.meta",
    "content": "fileFormatVersion: 2\nguid: 1b0a41d64d4e9534481f804049080fbb\nfolderAsset: yes\ntimeCreated: 1541842621\nlicenseType: Free\nDefaultImporter:\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Utility.cginc",
    "content": "float mod(float x, float y) { return x - y * floor(x/y); }\n\nfloat3 hdr(float3 L, float exposure) \n{\n\tL = L * exposure;\n\tL.r = L.r < 1.413 ? pow(L.r * 0.38317, 1.0 / 2.2) : 1.0 - exp(-L.r);\n\tL.g = L.g < 1.413 ? pow(L.g * 0.38317, 1.0 / 2.2) : 1.0 - exp(-L.g);\n\tL.b = L.b < 1.413 ? pow(L.b * 0.38317, 1.0 / 2.2) : 1.0 - exp(-L.b);\n\treturn L;\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/Shaders/Utility.cginc.meta",
    "content": "fileFormatVersion: 2\nguid: cb5112bfbee0a8545af567d810945a2a\nShaderImporter:\n  defaultTextures: []\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/TestScenes.meta",
    "content": "fileFormatVersion: 2\nguid: 15225778e2107e44bb700adf9df97a60\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Assets/shaders.meta",
    "content": "fileFormatVersion: 2\nguid: 980daac0955b74442b91df43f0f1b776\nfolderAsset: yes\ntimeCreated: 1459687924\nlicenseType: Free\nDefaultImporter:\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/AssetImportState",
    "content": "19;0;4;0;0"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/BuildPlayer.prefs",
    "content": ""
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/CurrentLayout-default.dwlt",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!114 &1\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12004, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_PixelRect:\n    serializedVersion: 2\n    x: 0\n    y: 43\n    width: 2560\n    height: 1357\n  m_ShowMode: 4\n  m_Title: \n  m_RootView: {fileID: 6}\n  m_MinSize: {x: 950, y: 300}\n  m_MaxSize: {x: 10000, y: 10000}\n--- !u!114 &2\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12010, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Children:\n  - {fileID: 9}\n  - {fileID: 3}\n  m_Position:\n    serializedVersion: 2\n    x: 0\n    y: 30\n    width: 2560\n    height: 1307\n  m_MinSize: {x: 683, y: 494}\n  m_MaxSize: {x: 14004, y: 14044}\n  vertical: 0\n  controlID: 61\n--- !u!114 &3\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Children: []\n  m_Position:\n    serializedVersion: 2\n    x: 1957\n    y: 0\n    width: 603\n    height: 1307\n  m_MinSize: {x: 277, y: 72}\n  m_MaxSize: {x: 4002, y: 4022}\n  m_ActualView: {fileID: 14}\n  m_Panes:\n  - {fileID: 14}\n  m_Selected: 0\n  m_LastSelected: 0\n--- !u!114 &4\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Children: []\n  m_Position:\n    serializedVersion: 2\n    x: 0\n    y: 0\n    width: 539\n    height: 702\n  m_MinSize: {x: 202, y: 222}\n  m_MaxSize: {x: 4002, y: 4022}\n  m_ActualView: {fileID: 15}\n  m_Panes:\n  - {fileID: 15}\n  m_Selected: 0\n  m_LastSelected: 0\n--- !u!114 &5\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: ConsoleWindow\n  m_EditorClassIdentifier: \n  m_Children: []\n  m_Position:\n    serializedVersion: 2\n    x: 0\n    y: 702\n    width: 1957\n    height: 605\n  m_MinSize: {x: 232, y: 272}\n  m_MaxSize: {x: 10002, y: 10022}\n  m_ActualView: {fileID: 13}\n  m_Panes:\n  - {fileID: 13}\n  - {fileID: 18}\n  m_Selected: 0\n  m_LastSelected: 1\n--- !u!114 &6\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12008, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Children:\n  - {fileID: 7}\n  - {fileID: 2}\n  - {fileID: 8}\n  m_Position:\n    serializedVersion: 2\n    x: 0\n    y: 0\n    width: 2560\n    height: 1357\n  m_MinSize: {x: 950, y: 300}\n  m_MaxSize: {x: 10000, y: 10000}\n--- !u!114 &7\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12011, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Children: []\n  m_Position:\n    serializedVersion: 2\n    x: 0\n    y: 0\n    width: 2560\n    height: 30\n  m_MinSize: {x: 0, y: 0}\n  m_MaxSize: {x: 0, y: 0}\n  m_LastLoadedLayoutName: \n--- !u!114 &8\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12042, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Children: []\n  m_Position:\n    serializedVersion: 2\n    x: 0\n    y: 1337\n    width: 2560\n    height: 20\n  m_MinSize: {x: 0, y: 0}\n  m_MaxSize: {x: 0, y: 0}\n--- !u!114 &9\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12010, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Children:\n  - {fileID: 10}\n  - {fileID: 5}\n  m_Position:\n    serializedVersion: 2\n    x: 0\n    y: 0\n    width: 1957\n    height: 1307\n  m_MinSize: {x: 406, y: 494}\n  m_MaxSize: {x: 10002, y: 14044}\n  vertical: 1\n  controlID: 105\n--- !u!114 &10\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12010, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Children:\n  - {fileID: 4}\n  - {fileID: 11}\n  m_Position:\n    serializedVersion: 2\n    x: 0\n    y: 0\n    width: 1957\n    height: 702\n  m_MinSize: {x: 406, y: 222}\n  m_MaxSize: {x: 8006, y: 4022}\n  vertical: 0\n  controlID: 106\n--- !u!114 &11\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Children: []\n  m_Position:\n    serializedVersion: 2\n    x: 539\n    y: 0\n    width: 1418\n    height: 702\n  m_MinSize: {x: 204, y: 222}\n  m_MaxSize: {x: 4004, y: 4022}\n  m_ActualView: {fileID: 17}\n  m_Panes:\n  - {fileID: 16}\n  - {fileID: 17}\n  - {fileID: 12}\n  m_Selected: 1\n  m_LastSelected: 0\n--- !u!114 &12\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12111, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_MinSize: {x: 400, y: 100}\n  m_MaxSize: {x: 2048, y: 2048}\n  m_TitleContent:\n    m_Text: Asset Store\n    m_Image: {fileID: 357073275683767465, guid: 0000000000000000d000000000000000,\n      type: 0}\n    m_Tooltip: \n  m_Pos:\n    serializedVersion: 2\n    x: 468\n    y: 181\n    width: 973\n    height: 501\n  m_ViewDataDictionary: {fileID: 0}\n--- !u!114 &13\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12014, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_MinSize: {x: 230, y: 250}\n  m_MaxSize: {x: 10000, y: 10000}\n  m_TitleContent:\n    m_Text: Project\n    m_Image: {fileID: -7501376956915960154, guid: 0000000000000000d000000000000000,\n      type: 0}\n    m_Tooltip: \n  m_Pos:\n    serializedVersion: 2\n    x: 0\n    y: 775\n    width: 1957\n    height: 586\n  m_ViewDataDictionary: {fileID: 0}\n  m_SearchFilter:\n    m_NameFilter: \n    m_ClassNames: []\n    m_AssetLabels: []\n    m_AssetBundleNames: []\n    m_VersionControlStates: []\n    m_SoftLockControlStates: []\n    m_ReferencingInstanceIDs: \n    m_SceneHandles: \n    m_ShowAllHits: 0\n    m_SkipHidden: 0\n    m_SearchArea: 1\n    m_Folders:\n    - Assets/Shaders/AA\n  m_ViewMode: 1\n  m_StartGridSize: 64\n  m_LastFolders:\n  - Assets/Shaders/AA\n  m_LastFoldersGridSize: -1\n  m_LastProjectPath: C:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\n  m_LockTracker:\n    m_IsLocked: 0\n  m_FolderTreeState:\n    scrollPos: {x: 0, y: 0}\n    m_SelectedIDs: 942e0000\n    m_LastClickedID: 11924\n    m_ExpandedIDs: 00000000fe2c0000302d000000ca9a3b\n    m_RenameOverlay:\n      m_UserAcceptedRename: 0\n      m_Name: SunFlare\n      m_OriginalName: SunFlare\n      m_EditFieldRect:\n        serializedVersion: 2\n        x: 0\n        y: 0\n        width: 0\n        height: 0\n      m_UserData: 11838\n      m_IsWaitingForDelay: 0\n      m_IsRenaming: 0\n      m_OriginalEventType: 0\n      m_IsRenamingFilename: 1\n      m_ClientGUIView: {fileID: 5}\n    m_SearchString: \n    m_CreateAssetUtility:\n      m_EndAction: {fileID: 0}\n      m_InstanceID: 0\n      m_Path: \n      m_Icon: {fileID: 0}\n      m_ResourceFile: \n  m_AssetTreeState:\n    scrollPos: {x: 0, y: 0}\n    m_SelectedIDs: \n    m_LastClickedID: 0\n    m_ExpandedIDs: 00000000fe2c0000302d0000ba2d0000\n    m_RenameOverlay:\n      m_UserAcceptedRename: 0\n      m_Name: \n      m_OriginalName: \n      m_EditFieldRect:\n        serializedVersion: 2\n        x: 0\n        y: 0\n        width: 0\n        height: 0\n      m_UserData: 0\n      m_IsWaitingForDelay: 0\n      m_IsRenaming: 0\n      m_OriginalEventType: 11\n      m_IsRenamingFilename: 1\n      m_ClientGUIView: {fileID: 0}\n    m_SearchString: \n    m_CreateAssetUtility:\n      m_EndAction: {fileID: 0}\n      m_InstanceID: 0\n      m_Path: \n      m_Icon: {fileID: 0}\n      m_ResourceFile: \n  m_ListAreaState:\n    m_SelectedInstanceIDs: \n    m_LastClickedInstanceID: 0\n    m_HadKeyboardFocusLastEvent: 1\n    m_ExpandedInstanceIDs: c623000000000000\n    m_RenameOverlay:\n      m_UserAcceptedRename: 0\n      m_Name: \n      m_OriginalName: \n      m_EditFieldRect:\n        serializedVersion: 2\n        x: 0\n        y: 0\n        width: 0\n        height: 0\n      m_UserData: 0\n      m_IsWaitingForDelay: 0\n      m_IsRenaming: 0\n      m_OriginalEventType: 11\n      m_IsRenamingFilename: 1\n      m_ClientGUIView: {fileID: 5}\n    m_CreateAssetUtility:\n      m_EndAction: {fileID: 0}\n      m_InstanceID: 0\n      m_Path: \n      m_Icon: {fileID: 0}\n      m_ResourceFile: \n    m_NewAssetIndexInList: -1\n    m_ScrollPosition: {x: 0, y: 0}\n    m_GridSize: 64\n  m_SkipHiddenPackages: 0\n  m_DirectoriesAreaWidth: 283\n--- !u!114 &14\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12019, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_MinSize: {x: 275, y: 50}\n  m_MaxSize: {x: 4000, y: 4000}\n  m_TitleContent:\n    m_Text: Inspector\n    m_Image: {fileID: -6905738622615590433, guid: 0000000000000000d000000000000000,\n      type: 0}\n    m_Tooltip: \n  m_Pos:\n    serializedVersion: 2\n    x: 1957\n    y: 73\n    width: 601\n    height: 1288\n  m_ViewDataDictionary: {fileID: 0}\n  m_OpenAddComponentMenu: 0\n  m_ObjectsLockedBeforeSerialization: []\n  m_InstanceIDsLockedBeforeSerialization: \n  m_LockTracker:\n    m_IsLocked: 0\n  m_PreviewResizer:\n    m_CachedPref: 160\n    m_ControlHash: -371814159\n    m_PrefName: Preview_InspectorPreview\n  m_PreviewWindow: {fileID: 0}\n  m_LastInspectedObjectInstanceID: -1\n  m_LastVerticalScrollValue: 0\n--- !u!114 &15\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12061, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_MinSize: {x: 200, y: 200}\n  m_MaxSize: {x: 4000, y: 4000}\n  m_TitleContent:\n    m_Text: Hierarchy\n    m_Image: {fileID: -590624980919486359, guid: 0000000000000000d000000000000000,\n      type: 0}\n    m_Tooltip: \n  m_Pos:\n    serializedVersion: 2\n    x: 0\n    y: 73\n    width: 539\n    height: 683\n  m_ViewDataDictionary: {fileID: 0}\n  m_SceneHierarchy:\n    m_TreeViewState:\n      scrollPos: {x: 0, y: 0}\n      m_SelectedIDs: b0010000\n      m_LastClickedID: 0\n      m_ExpandedIDs: 76fbffff\n      m_RenameOverlay:\n        m_UserAcceptedRename: 0\n        m_Name: \n        m_OriginalName: \n        m_EditFieldRect:\n          serializedVersion: 2\n          x: 0\n          y: 0\n          width: 0\n          height: 0\n        m_UserData: 0\n        m_IsWaitingForDelay: 0\n        m_IsRenaming: 0\n        m_OriginalEventType: 11\n        m_IsRenamingFilename: 0\n        m_ClientGUIView: {fileID: 4}\n      m_SearchString: \n    m_ExpandedScenes: []\n    m_CurrenRootInstanceID: 0\n    m_LockTracker:\n      m_IsLocked: 0\n    m_CurrentSortingName: TransformSorting\n  m_WindowGUID: d2da7c7f6b6a12f4db008859d58f4b06\n--- !u!114 &16\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12013, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_MinSize: {x: 200, y: 200}\n  m_MaxSize: {x: 4000, y: 4000}\n  m_TitleContent:\n    m_Text: Scene\n    m_Image: {fileID: 2318424515335265636, guid: 0000000000000000d000000000000000,\n      type: 0}\n    m_Tooltip: \n  m_Pos:\n    serializedVersion: 2\n    x: 407\n    y: 73\n    width: 1216\n    height: 777\n  m_ViewDataDictionary: {fileID: 0}\n  m_ShowContextualTools: 0\n  m_WindowGUID: e16c040b0f7d1444f814c10b57524ecd\n  m_Gizmos: 1\n  m_SceneIsLit: 1\n  m_SceneLighting: 1\n  m_2DMode: 0\n  m_isRotationLocked: 0\n  m_PlayAudio: 0\n  m_AudioPlay: 0\n  m_Position:\n    m_Target: {x: 2.5099688, y: 2.2473466, z: -3.8579397}\n    speed: 2\n    m_Value: {x: 2.5099688, y: 2.2473466, z: -3.8579397}\n  m_RenderMode: 0\n  m_CameraMode:\n    drawMode: 0\n    name: Shaded\n    section: Shading Mode\n  m_ValidateTrueMetals: 0\n  m_DoValidateTrueMetals: 0\n  m_SceneViewState:\n    showFog: 1\n    showMaterialUpdate: 0\n    showSkybox: 1\n    showFlares: 1\n    showImageEffects: 1\n    showParticleSystems: 1\n  grid:\n    xGrid:\n      m_Target: 0\n      speed: 2\n      m_Value: 0\n    yGrid:\n      m_Target: 0\n      speed: 2\n      m_Value: 0\n    zGrid:\n      m_Target: 0\n      speed: 2\n      m_Value: 0\n  m_Rotation:\n    m_Target: {x: -0.09469341, y: 0.6731113, z: -0.08752819, w: -0.72821313}\n    speed: 2\n    m_Value: {x: -0.09469341, y: 0.6731113, z: -0.0875282, w: -0.72821313}\n  m_Size:\n    m_Target: 15.153814\n    speed: 2\n    m_Value: 15.153814\n  m_Ortho:\n    m_Target: 0\n    speed: 2\n    m_Value: 0\n  m_CameraSettings:\n    m_Speed: 1\n    m_SpeedNormalized: 0.5\n    m_SpeedMin: 0.01\n    m_SpeedMax: 2\n    m_EasingEnabled: 1\n    m_EasingDuration: 0.4\n    m_AccelerationEnabled: 1\n    m_FieldOfView: 90\n    m_NearClip: 0.03\n    m_FarClip: 10000\n    m_DynamicClip: 1\n    m_OcclusionCulling: 0\n  m_ShowGlobalGrid: 1\n  m_LastSceneViewRotation: {x: 0, y: 0, z: 0, w: 0}\n  m_LastSceneViewOrtho: 0\n  m_ReplacementShader: {fileID: 0}\n  m_ReplacementString: \n  m_SceneVisActive: 1\n  m_LastLockedObject: {fileID: 0}\n  m_ViewIsLockedToObject: 0\n--- !u!114 &17\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12015, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_MinSize: {x: 200, y: 200}\n  m_MaxSize: {x: 4000, y: 4000}\n  m_TitleContent:\n    m_Text: Game\n    m_Image: {fileID: -2087823869225018852, guid: 0000000000000000d000000000000000,\n      type: 0}\n    m_Tooltip: \n  m_Pos:\n    serializedVersion: 2\n    x: 539\n    y: 73\n    width: 1416\n    height: 683\n  m_ViewDataDictionary: {fileID: 0}\n  m_VSyncEnabled: 0\n  m_MaximizeOnPlay: 0\n  m_Gizmos: 0\n  m_Stats: 0\n  m_SelectedSizes: 00000000000000000000000000000000000000000000000000000000000000000000000000000000\n  m_TargetDisplay: 0\n  m_ZoomArea:\n    m_HRangeLocked: 0\n    m_VRangeLocked: 0\n    hZoomLockedByDefault: 0\n    vZoomLockedByDefault: 0\n    m_HBaseRangeMin: -708\n    m_HBaseRangeMax: 708\n    m_VBaseRangeMin: -333\n    m_VBaseRangeMax: 333\n    m_HAllowExceedBaseRangeMin: 1\n    m_HAllowExceedBaseRangeMax: 1\n    m_VAllowExceedBaseRangeMin: 1\n    m_VAllowExceedBaseRangeMax: 1\n    m_ScaleWithWindow: 0\n    m_HSlider: 0\n    m_VSlider: 0\n    m_IgnoreScrollWheelUntilClicked: 0\n    m_EnableMouseInput: 1\n    m_EnableSliderZoomHorizontal: 0\n    m_EnableSliderZoomVertical: 0\n    m_UniformScale: 1\n    m_UpDirection: 1\n    m_DrawArea:\n      serializedVersion: 2\n      x: 0\n      y: 17\n      width: 1416\n      height: 666\n    m_Scale: {x: 1, y: 1}\n    m_Translation: {x: 708, y: 333}\n    m_MarginLeft: 0\n    m_MarginRight: 0\n    m_MarginTop: 0\n    m_MarginBottom: 0\n    m_LastShownAreaInsideMargins:\n      serializedVersion: 2\n      x: -708\n      y: -333\n      width: 1416\n      height: 666\n    m_MinimalGUI: 1\n  m_defaultScale: 1\n  m_TargetTexture: {fileID: 0}\n  m_CurrentColorSpace: 0\n  m_LastWindowPixelSize: {x: 1416, y: 683}\n  m_ClearInEditMode: 1\n  m_NoCameraWarning: 1\n  m_LowResolutionForAspectRatios: 00000000000000000000\n  m_XRRenderMode: 0\n--- !u!114 &18\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12003, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_MinSize: {x: 100, y: 100}\n  m_MaxSize: {x: 4000, y: 4000}\n  m_TitleContent:\n    m_Text: Console\n    m_Image: {fileID: 111653112392082826, guid: 0000000000000000d000000000000000,\n      type: 0}\n    m_Tooltip: \n  m_Pos:\n    serializedVersion: 2\n    x: 0\n    y: 776\n    width: 1957\n    height: 585\n  m_ViewDataDictionary: {fileID: 0}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/CurrentLayout.dwlt",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!114 &1\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_PrefabParentObject: {fileID: 0}\n  m_PrefabInternal: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12004, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_PixelRect:\n    serializedVersion: 2\n    x: 0\n    y: 43\n    width: 1920\n    height: 997\n  m_ShowMode: 4\n  m_Title: \n  m_RootView: {fileID: 6}\n  m_MinSize: {x: 950, y: 300}\n  m_MaxSize: {x: 10000, y: 10000}\n--- !u!114 &2\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_PrefabParentObject: {fileID: 0}\n  m_PrefabInternal: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12010, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Children:\n  - {fileID: 9}\n  - {fileID: 3}\n  m_Position:\n    serializedVersion: 2\n    x: 0\n    y: 30\n    width: 1920\n    height: 947\n  m_MinSize: {x: 683, y: 492}\n  m_MaxSize: {x: 14004, y: 14042}\n  vertical: 0\n  controlID: 112\n--- !u!114 &3\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_PrefabParentObject: {fileID: 0}\n  m_PrefabInternal: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Children: []\n  m_Position:\n    serializedVersion: 2\n    x: 1146\n    y: 0\n    width: 774\n    height: 947\n  m_MinSize: {x: 275, y: 50}\n  m_MaxSize: {x: 4000, y: 4000}\n  m_ActualView: {fileID: 13}\n  m_Panes:\n  - {fileID: 13}\n  m_Selected: 0\n  m_LastSelected: 0\n--- !u!114 &4\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_PrefabParentObject: {fileID: 0}\n  m_PrefabInternal: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Children: []\n  m_Position:\n    serializedVersion: 2\n    x: 0\n    y: 0\n    width: 285\n    height: 560\n  m_MinSize: {x: 202, y: 221}\n  m_MaxSize: {x: 4002, y: 4021}\n  m_ActualView: {fileID: 14}\n  m_Panes:\n  - {fileID: 14}\n  m_Selected: 0\n  m_LastSelected: 0\n--- !u!114 &5\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_PrefabParentObject: {fileID: 0}\n  m_PrefabInternal: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Children: []\n  m_Position:\n    serializedVersion: 2\n    x: 0\n    y: 560\n    width: 1146\n    height: 387\n  m_MinSize: {x: 232, y: 271}\n  m_MaxSize: {x: 10002, y: 10021}\n  m_ActualView: {fileID: 12}\n  m_Panes:\n  - {fileID: 12}\n  - {fileID: 17}\n  m_Selected: 0\n  m_LastSelected: 1\n--- !u!114 &6\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_PrefabParentObject: {fileID: 0}\n  m_PrefabInternal: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12008, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Children:\n  - {fileID: 7}\n  - {fileID: 2}\n  - {fileID: 8}\n  m_Position:\n    serializedVersion: 2\n    x: 0\n    y: 0\n    width: 1920\n    height: 997\n  m_MinSize: {x: 950, y: 300}\n  m_MaxSize: {x: 10000, y: 10000}\n--- !u!114 &7\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_PrefabParentObject: {fileID: 0}\n  m_PrefabInternal: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12011, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Children: []\n  m_Position:\n    serializedVersion: 2\n    x: 0\n    y: 0\n    width: 1920\n    height: 30\n  m_MinSize: {x: 0, y: 0}\n  m_MaxSize: {x: 0, y: 0}\n  m_LastLoadedLayoutName: \n--- !u!114 &8\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_PrefabParentObject: {fileID: 0}\n  m_PrefabInternal: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12042, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Children: []\n  m_Position:\n    serializedVersion: 2\n    x: 0\n    y: 977\n    width: 1920\n    height: 20\n  m_MinSize: {x: 0, y: 0}\n  m_MaxSize: {x: 0, y: 0}\n--- !u!114 &9\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_PrefabParentObject: {fileID: 0}\n  m_PrefabInternal: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12010, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Children:\n  - {fileID: 10}\n  - {fileID: 5}\n  m_Position:\n    serializedVersion: 2\n    x: 0\n    y: 0\n    width: 1146\n    height: 947\n  m_MinSize: {x: 406, y: 492}\n  m_MaxSize: {x: 10002, y: 14042}\n  vertical: 1\n  controlID: 69\n--- !u!114 &10\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_PrefabParentObject: {fileID: 0}\n  m_PrefabInternal: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12010, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Children:\n  - {fileID: 4}\n  - {fileID: 11}\n  m_Position:\n    serializedVersion: 2\n    x: 0\n    y: 0\n    width: 1146\n    height: 560\n  m_MinSize: {x: 406, y: 221}\n  m_MaxSize: {x: 8006, y: 4021}\n  vertical: 0\n  controlID: 45\n--- !u!114 &11\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_PrefabParentObject: {fileID: 0}\n  m_PrefabInternal: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Children: []\n  m_Position:\n    serializedVersion: 2\n    x: 285\n    y: 0\n    width: 861\n    height: 560\n  m_MinSize: {x: 200, y: 200}\n  m_MaxSize: {x: 4000, y: 4000}\n  m_ActualView: {fileID: 15}\n  m_Panes:\n  - {fileID: 15}\n  - {fileID: 16}\n  m_Selected: 0\n  m_LastSelected: 0\n--- !u!114 &12\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_PrefabParentObject: {fileID: 0}\n  m_PrefabInternal: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12014, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_AutoRepaintOnSceneChange: 0\n  m_MinSize: {x: 230, y: 250}\n  m_MaxSize: {x: 10000, y: 10000}\n  m_TitleContent:\n    m_Text: Project\n    m_Image: {fileID: -7501376956915960154, guid: 0000000000000000d000000000000000,\n      type: 0}\n    m_Tooltip: \n  m_DepthBufferBits: 0\n  m_Pos:\n    serializedVersion: 2\n    x: 0\n    y: 652\n    width: 1144\n    height: 366\n  m_SearchFilter:\n    m_NameFilter: \n    m_ClassNames: []\n    m_AssetLabels: []\n    m_AssetBundleNames: []\n    m_VersionControlStates: []\n    m_SoftLockControlStates: []\n    m_ReferencingInstanceIDs: \n    m_ScenePaths: []\n    m_ShowAllHits: 0\n    m_SearchArea: 0\n    m_Folders:\n    - Assets/shaders/Instancing\n  m_ViewMode: 1\n  m_StartGridSize: 64\n  m_LastFolders:\n  - Assets/shaders/Instancing\n  m_LastFoldersGridSize: -1\n  m_LastProjectPath: E:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\n  m_IsLocked: 0\n  m_FolderTreeState:\n    scrollPos: {x: 0, y: 0}\n    m_SelectedIDs: 02270000\n    m_LastClickedID: 9986\n    m_ExpandedIDs: 00000000aa260000b826000000ca9a3bffffff7f\n    m_RenameOverlay:\n      m_UserAcceptedRename: 0\n      m_Name: \n      m_OriginalName: \n      m_EditFieldRect:\n        serializedVersion: 2\n        x: 0\n        y: 0\n        width: 0\n        height: 0\n      m_UserData: 0\n      m_IsWaitingForDelay: 0\n      m_IsRenaming: 0\n      m_OriginalEventType: 11\n      m_IsRenamingFilename: 1\n      m_ClientGUIView: {fileID: 5}\n    m_SearchString: \n    m_CreateAssetUtility:\n      m_EndAction: {fileID: 0}\n      m_InstanceID: 0\n      m_Path: \n      m_Icon: {fileID: 0}\n      m_ResourceFile: \n  m_AssetTreeState:\n    scrollPos: {x: 0, y: 0}\n    m_SelectedIDs: \n    m_LastClickedID: 0\n    m_ExpandedIDs: 00000000aa260000b8260000\n    m_RenameOverlay:\n      m_UserAcceptedRename: 0\n      m_Name: \n      m_OriginalName: \n      m_EditFieldRect:\n        serializedVersion: 2\n        x: 0\n        y: 0\n        width: 0\n        height: 0\n      m_UserData: 0\n      m_IsWaitingForDelay: 0\n      m_IsRenaming: 0\n      m_OriginalEventType: 11\n      m_IsRenamingFilename: 1\n      m_ClientGUIView: {fileID: 0}\n    m_SearchString: \n    m_CreateAssetUtility:\n      m_EndAction: {fileID: 0}\n      m_InstanceID: 0\n      m_Path: \n      m_Icon: {fileID: 0}\n      m_ResourceFile: \n  m_ListAreaState:\n    m_SelectedInstanceIDs: \n    m_LastClickedInstanceID: 0\n    m_HadKeyboardFocusLastEvent: 1\n    m_ExpandedInstanceIDs: 76230000602300004a22000060220000542200005e220000322200001c22000000000000\n    m_RenameOverlay:\n      m_UserAcceptedRename: 0\n      m_Name: \n      m_OriginalName: \n      m_EditFieldRect:\n        serializedVersion: 2\n        x: 0\n        y: 0\n        width: 0\n        height: 0\n      m_UserData: 0\n      m_IsWaitingForDelay: 0\n      m_IsRenaming: 0\n      m_OriginalEventType: 11\n      m_IsRenamingFilename: 1\n      m_ClientGUIView: {fileID: 5}\n    m_CreateAssetUtility:\n      m_EndAction: {fileID: 0}\n      m_InstanceID: 0\n      m_Path: \n      m_Icon: {fileID: 0}\n      m_ResourceFile: \n    m_NewAssetIndexInList: -1\n    m_ScrollPosition: {x: 0, y: 0}\n    m_GridSize: 64\n  m_DirectoriesAreaWidth: 305\n--- !u!114 &13\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_PrefabParentObject: {fileID: 0}\n  m_PrefabInternal: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12019, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_AutoRepaintOnSceneChange: 0\n  m_MinSize: {x: 275, y: 50}\n  m_MaxSize: {x: 4000, y: 4000}\n  m_TitleContent:\n    m_Text: Inspector\n    m_Image: {fileID: -6905738622615590433, guid: 0000000000000000d000000000000000,\n      type: 0}\n    m_Tooltip: \n  m_DepthBufferBits: 0\n  m_Pos:\n    serializedVersion: 2\n    x: 1148\n    y: 92\n    width: 772\n    height: 926\n  m_ScrollPosition: {x: 0, y: 822.9551}\n  m_InspectorMode: 0\n  m_PreviewResizer:\n    m_CachedPref: 160\n    m_ControlHash: -371814159\n    m_PrefName: Preview_InspectorPreview\n  m_PreviewWindow: {fileID: 0}\n--- !u!114 &14\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_PrefabParentObject: {fileID: 0}\n  m_PrefabInternal: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12061, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_AutoRepaintOnSceneChange: 0\n  m_MinSize: {x: 200, y: 200}\n  m_MaxSize: {x: 4000, y: 4000}\n  m_TitleContent:\n    m_Text: Hierarchy\n    m_Image: {fileID: -590624980919486359, guid: 0000000000000000d000000000000000,\n      type: 0}\n    m_Tooltip: \n  m_DepthBufferBits: 0\n  m_Pos:\n    serializedVersion: 2\n    x: 0\n    y: 92\n    width: 283\n    height: 539\n  m_TreeViewState:\n    scrollPos: {x: 0, y: 0}\n    m_SelectedIDs: ea010000\n    m_LastClickedID: 0\n    m_ExpandedIDs: 1afcffff00000000\n    m_RenameOverlay:\n      m_UserAcceptedRename: 0\n      m_Name: \n      m_OriginalName: \n      m_EditFieldRect:\n        serializedVersion: 2\n        x: 0\n        y: 0\n        width: 0\n        height: 0\n      m_UserData: 0\n      m_IsWaitingForDelay: 0\n      m_IsRenaming: 0\n      m_OriginalEventType: 11\n      m_IsRenamingFilename: 0\n      m_ClientGUIView: {fileID: 0}\n    m_SearchString: \n  m_ExpandedScenes:\n  - \n  m_CurrenRootInstanceID: 0\n  m_Locked: 0\n  m_CurrentSortingName: TransformSorting\n--- !u!114 &15\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_PrefabParentObject: {fileID: 0}\n  m_PrefabInternal: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12013, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_AutoRepaintOnSceneChange: 1\n  m_MinSize: {x: 200, y: 200}\n  m_MaxSize: {x: 4000, y: 4000}\n  m_TitleContent:\n    m_Text: Scene\n    m_Image: {fileID: 2318424515335265636, guid: 0000000000000000d000000000000000,\n      type: 0}\n    m_Tooltip: \n  m_DepthBufferBits: 32\n  m_Pos:\n    serializedVersion: 2\n    x: 287\n    y: 92\n    width: 857\n    height: 539\n  m_SceneLighting: 0\n  lastFramingTime: 0\n  m_2DMode: 0\n  m_isRotationLocked: 0\n  m_AudioPlay: 0\n  m_Position:\n    m_Target: {x: 0, y: 0, z: 0}\n    speed: 2\n    m_Value: {x: 0, y: 0, z: 0}\n  m_RenderMode: 0\n  m_ValidateTrueMetals: 0\n  m_SceneViewState:\n    showFog: 1\n    showMaterialUpdate: 0\n    showSkybox: 1\n    showFlares: 1\n    showImageEffects: 1\n  grid:\n    xGrid:\n      m_Target: 0\n      speed: 2\n      m_Value: 0\n    yGrid:\n      m_Target: 1\n      speed: 2\n      m_Value: 1\n    zGrid:\n      m_Target: 0\n      speed: 2\n      m_Value: 0\n  m_Rotation:\n    m_Target: {x: -0.08717229, y: 0.89959055, z: -0.21045254, w: -0.3726226}\n    speed: 2\n    m_Value: {x: -0.08717229, y: 0.89959055, z: -0.21045254, w: -0.3726226}\n  m_Size:\n    m_Target: 8.301052\n    speed: 2\n    m_Value: 8.301052\n  m_Ortho:\n    m_Target: 0\n    speed: 2\n    m_Value: 0\n  m_LastSceneViewRotation: {x: 0, y: 0, z: 0, w: 0}\n  m_LastSceneViewOrtho: 0\n  m_ReplacementShader: {fileID: 0}\n  m_ReplacementString: \n  m_LastLockedObject: {fileID: 0}\n  m_ViewIsLockedToObject: 0\n--- !u!114 &16\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_PrefabParentObject: {fileID: 0}\n  m_PrefabInternal: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12015, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_AutoRepaintOnSceneChange: 1\n  m_MinSize: {x: 200, y: 200}\n  m_MaxSize: {x: 4000, y: 4000}\n  m_TitleContent:\n    m_Text: Game\n    m_Image: {fileID: -2087823869225018852, guid: 0000000000000000d000000000000000,\n      type: 0}\n    m_Tooltip: \n  m_DepthBufferBits: 32\n  m_Pos:\n    serializedVersion: 2\n    x: 366\n    y: 17\n    width: 518\n    height: 205\n  m_MaximizeOnPlay: 0\n  m_Gizmos: 0\n  m_Stats: 0\n  m_SelectedSizes: 00000000000000000000000000000000000000000000000000000000000000000000000000000000\n  m_TargetDisplay: 0\n  m_ZoomArea:\n    m_HRangeLocked: 0\n    m_VRangeLocked: 0\n    m_HBaseRangeMin: -259\n    m_HBaseRangeMax: 259\n    m_VBaseRangeMin: -94\n    m_VBaseRangeMax: 94\n    m_HAllowExceedBaseRangeMin: 1\n    m_HAllowExceedBaseRangeMax: 1\n    m_VAllowExceedBaseRangeMin: 1\n    m_VAllowExceedBaseRangeMax: 1\n    m_ScaleWithWindow: 0\n    m_HSlider: 1\n    m_VSlider: 1\n    m_IgnoreScrollWheelUntilClicked: 0\n    m_EnableMouseInput: 1\n    m_EnableSliderZoom: 0\n    m_UniformScale: 1\n    m_UpDirection: 1\n    m_DrawArea:\n      serializedVersion: 2\n      x: 0\n      y: 17\n      width: 518\n      height: 188\n    m_Scale: {x: 1, y: 1}\n    m_Translation: {x: 259, y: 94}\n    m_MarginLeft: 0\n    m_MarginRight: 0\n    m_MarginTop: 0\n    m_MarginBottom: 0\n    m_LastShownAreaInsideMargins:\n      serializedVersion: 2\n      x: -259\n      y: -94\n      width: 518\n      height: 188\n    m_MinimalGUI: 1\n  m_defaultScale: 1\n  m_TargetTexture: {fileID: 0}\n  m_CurrentColorSpace: -1\n  m_LastWindowPixelSize: {x: 518, y: 205}\n  m_ClearInEditMode: 1\n  m_NoCameraWarning: 1\n  m_LowResolutionForAspectRatios: 01000000000100000100\n--- !u!114 &17\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_PrefabParentObject: {fileID: 0}\n  m_PrefabInternal: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12003, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_AutoRepaintOnSceneChange: 0\n  m_MinSize: {x: 100, y: 100}\n  m_MaxSize: {x: 4000, y: 4000}\n  m_TitleContent:\n    m_Text: Console\n    m_Image: {fileID: 111653112392082826, guid: 0000000000000000d000000000000000,\n      type: 0}\n    m_Tooltip: \n  m_DepthBufferBits: 0\n  m_Pos:\n    serializedVersion: 2\n    x: 0\n    y: 652\n    width: 1496\n    height: 366\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/CurrentMaximizeLayout.dwlt",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!114 &1\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12010, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Children:\n  - {fileID: 3}\n  - {fileID: 7}\n  - {fileID: 9}\n  - {fileID: 11}\n  m_Position:\n    serializedVersion: 2\n    x: 0\n    y: 30\n    width: 1920\n    height: 987\n  m_MinSize: {x: 911, y: 422}\n  m_MaxSize: {x: 22006, y: 10022}\n  vertical: 0\n  controlID: 9359\n--- !u!114 &2\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12015, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_MinSize: {x: 200, y: 200}\n  m_MaxSize: {x: 4000, y: 4000}\n  m_TitleContent:\n    m_Text: Game\n    m_Image: {fileID: -2087823869225018852, guid: 0000000000000000d000000000000000,\n      type: 0}\n    m_Tooltip: \n  m_Pos:\n    serializedVersion: 2\n    x: 0\n    y: 579\n    width: 1118\n    height: 462\n  m_ViewDataDictionary: {fileID: 0}\n  m_VSyncEnabled: 0\n  m_MaximizeOnPlay: 1\n  m_Gizmos: 0\n  m_Stats: 0\n  m_SelectedSizes: 00000000000000000000000000000000000000000000000000000000000000000000000000000000\n  m_TargetDisplay: 0\n  m_ZoomArea:\n    m_HRangeLocked: 0\n    m_VRangeLocked: 0\n    hZoomLockedByDefault: 0\n    vZoomLockedByDefault: 0\n    m_HBaseRangeMin: -559\n    m_HBaseRangeMax: 559\n    m_VBaseRangeMin: -222.5\n    m_VBaseRangeMax: 222.5\n    m_HAllowExceedBaseRangeMin: 1\n    m_HAllowExceedBaseRangeMax: 1\n    m_VAllowExceedBaseRangeMin: 1\n    m_VAllowExceedBaseRangeMax: 1\n    m_ScaleWithWindow: 0\n    m_HSlider: 0\n    m_VSlider: 0\n    m_IgnoreScrollWheelUntilClicked: 0\n    m_EnableMouseInput: 1\n    m_EnableSliderZoomHorizontal: 0\n    m_EnableSliderZoomVertical: 0\n    m_UniformScale: 1\n    m_UpDirection: 1\n    m_DrawArea:\n      serializedVersion: 2\n      x: 0\n      y: 17\n      width: 1118\n      height: 445\n    m_Scale: {x: 1, y: 1}\n    m_Translation: {x: 559, y: 222.5}\n    m_MarginLeft: 0\n    m_MarginRight: 0\n    m_MarginTop: 0\n    m_MarginBottom: 0\n    m_LastShownAreaInsideMargins:\n      serializedVersion: 2\n      x: -559\n      y: -222.5\n      width: 1118\n      height: 445\n    m_MinimalGUI: 1\n  m_defaultScale: 1\n  m_TargetTexture: {fileID: 0}\n  m_CurrentColorSpace: 0\n  m_LastWindowPixelSize: {x: 1118, y: 462}\n  m_ClearInEditMode: 1\n  m_NoCameraWarning: 1\n  m_LowResolutionForAspectRatios: 00000000000000000000\n  m_XRRenderMode: 0\n--- !u!114 &3\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12010, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Children:\n  - {fileID: 4}\n  - {fileID: 6}\n  m_Position:\n    serializedVersion: 2\n    x: 0\n    y: 0\n    width: 1118\n    height: 987\n  m_MinSize: {x: 202, y: 422}\n  m_MaxSize: {x: 4002, y: 8022}\n  vertical: 1\n  controlID: 9339\n--- !u!114 &4\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Children: []\n  m_Position:\n    serializedVersion: 2\n    x: 0\n    y: 0\n    width: 1118\n    height: 506\n  m_MinSize: {x: 200, y: 200}\n  m_MaxSize: {x: 4000, y: 4000}\n  m_ActualView: {fileID: 5}\n  m_Panes:\n  - {fileID: 5}\n  m_Selected: 0\n  m_LastSelected: 0\n--- !u!114 &5\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12013, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_MinSize: {x: 200, y: 200}\n  m_MaxSize: {x: 4000, y: 4000}\n  m_TitleContent:\n    m_Text: Scene\n    m_Image: {fileID: 2318424515335265636, guid: 0000000000000000d000000000000000,\n      type: 0}\n    m_Tooltip: \n  m_Pos:\n    serializedVersion: 2\n    x: 0\n    y: 73\n    width: 1118\n    height: 487\n  m_ViewDataDictionary: {fileID: 0}\n  m_ShowContextualTools: 0\n  m_WindowGUID: 417d2720dfd54b04e8c7f277f5480c5b\n  m_Gizmos: 1\n  m_SceneIsLit: 1\n  m_SceneLighting: 1\n  m_2DMode: 0\n  m_isRotationLocked: 0\n  m_PlayAudio: 0\n  m_AudioPlay: 0\n  m_Position:\n    m_Target: {x: 0, y: 0, z: 0}\n    speed: 2\n    m_Value: {x: 0, y: 0, z: 0}\n  m_RenderMode: 0\n  m_CameraMode:\n    drawMode: 0\n    name: Shaded\n    section: Shading Mode\n  m_ValidateTrueMetals: 0\n  m_DoValidateTrueMetals: 0\n  m_SceneViewState:\n    showFog: 1\n    showMaterialUpdate: 0\n    showSkybox: 1\n    showFlares: 1\n    showImageEffects: 1\n    showParticleSystems: 1\n  grid:\n    xGrid:\n      m_Target: 0\n      speed: 2\n      m_Value: 0\n    yGrid:\n      m_Target: 1\n      speed: 2\n      m_Value: 1\n    zGrid:\n      m_Target: 0\n      speed: 2\n      m_Value: 0\n  m_Rotation:\n    m_Target: {x: -0.08717229, y: 0.89959055, z: -0.21045254, w: -0.3726226}\n    speed: 2\n    m_Value: {x: -0.08717229, y: 0.89959055, z: -0.21045254, w: -0.3726226}\n  m_Size:\n    m_Target: 24.136803\n    speed: 2\n    m_Value: 24.136803\n  m_Ortho:\n    m_Target: 0\n    speed: 2\n    m_Value: 0\n  m_CameraSettings:\n    m_Speed: 1\n    m_SpeedNormalized: 0.5\n    m_SpeedMin: 0.01\n    m_SpeedMax: 2\n    m_EasingEnabled: 1\n    m_EasingDuration: 0.4\n    m_AccelerationEnabled: 1\n    m_FieldOfView: 90\n    m_NearClip: 0.03\n    m_FarClip: 10000\n    m_DynamicClip: 1\n    m_OcclusionCulling: 0\n  m_ShowGlobalGrid: 1\n  m_LastSceneViewRotation: {x: 0, y: 0, z: 0, w: 0}\n  m_LastSceneViewOrtho: 0\n  m_ReplacementShader: {fileID: 0}\n  m_ReplacementString: \n  m_SceneVisActive: 1\n  m_LastLockedObject: {fileID: 0}\n  m_ViewIsLockedToObject: 0\n--- !u!114 &6\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Children: []\n  m_Position:\n    serializedVersion: 2\n    x: 0\n    y: 506\n    width: 1118\n    height: 481\n  m_MinSize: {x: 200, y: 200}\n  m_MaxSize: {x: 4000, y: 4000}\n  m_ActualView: {fileID: 2}\n  m_Panes:\n  - {fileID: 2}\n  m_Selected: 0\n  m_LastSelected: 0\n--- !u!114 &7\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Children: []\n  m_Position:\n    serializedVersion: 2\n    x: 1118\n    y: 0\n    width: 291\n    height: 987\n  m_MinSize: {x: 200, y: 200}\n  m_MaxSize: {x: 4000, y: 4000}\n  m_ActualView: {fileID: 8}\n  m_Panes:\n  - {fileID: 8}\n  m_Selected: 0\n  m_LastSelected: 0\n--- !u!114 &8\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12061, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_MinSize: {x: 200, y: 200}\n  m_MaxSize: {x: 4000, y: 4000}\n  m_TitleContent:\n    m_Text: Hierarchy\n    m_Image: {fileID: -590624980919486359, guid: 0000000000000000d000000000000000,\n      type: 0}\n    m_Tooltip: \n  m_Pos:\n    serializedVersion: 2\n    x: 1118\n    y: 73\n    width: 289\n    height: 968\n  m_ViewDataDictionary: {fileID: 0}\n  m_SceneHierarchy:\n    m_TreeViewState:\n      scrollPos: {x: 0, y: 0}\n      m_SelectedIDs: \n      m_LastClickedID: 0\n      m_ExpandedIDs: 76fbffff\n      m_RenameOverlay:\n        m_UserAcceptedRename: 0\n        m_Name: \n        m_OriginalName: \n        m_EditFieldRect:\n          serializedVersion: 2\n          x: 0\n          y: 0\n          width: 0\n          height: 0\n        m_UserData: 0\n        m_IsWaitingForDelay: 0\n        m_IsRenaming: 0\n        m_OriginalEventType: 11\n        m_IsRenamingFilename: 0\n        m_ClientGUIView: {fileID: 0}\n      m_SearchString: \n    m_ExpandedScenes: []\n    m_CurrenRootInstanceID: 0\n    m_LockTracker:\n      m_IsLocked: 0\n    m_CurrentSortingName: TransformSorting\n  m_WindowGUID: df32a1043b8c1ff428dc088186916235\n--- !u!114 &9\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Children: []\n  m_Position:\n    serializedVersion: 2\n    x: 1409\n    y: 0\n    width: 234\n    height: 987\n  m_MinSize: {x: 230, y: 250}\n  m_MaxSize: {x: 10000, y: 10000}\n  m_ActualView: {fileID: 10}\n  m_Panes:\n  - {fileID: 10}\n  m_Selected: 0\n  m_LastSelected: 0\n--- !u!114 &10\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12014, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_MinSize: {x: 230, y: 250}\n  m_MaxSize: {x: 10000, y: 10000}\n  m_TitleContent:\n    m_Text: Project\n    m_Image: {fileID: -7501376956915960154, guid: 0000000000000000d000000000000000,\n      type: 0}\n    m_Tooltip: \n  m_Pos:\n    serializedVersion: 2\n    x: 1409\n    y: 73\n    width: 232\n    height: 968\n  m_ViewDataDictionary: {fileID: 0}\n  m_SearchFilter:\n    m_NameFilter: \n    m_ClassNames: []\n    m_AssetLabels: []\n    m_AssetBundleNames: []\n    m_VersionControlStates: []\n    m_SoftLockControlStates: []\n    m_ReferencingInstanceIDs: \n    m_SceneHandles: \n    m_ShowAllHits: 0\n    m_SkipHidden: 0\n    m_SearchArea: 1\n    m_Folders:\n    - Assets/Shaders/Ocean/Caustics\n  m_ViewMode: 1\n  m_StartGridSize: 64\n  m_LastFolders:\n  - Assets/Shaders/Ocean/Caustics\n  m_LastFoldersGridSize: -1\n  m_LastProjectPath: E:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\n  m_LockTracker:\n    m_IsLocked: 0\n  m_FolderTreeState:\n    scrollPos: {x: 0, y: 0}\n    m_SelectedIDs: c22d0000\n    m_LastClickedID: 11714\n    m_ExpandedIDs: 000000003a2d00006e2d0000cc2f0000d42f000000ca9a3b\n    m_RenameOverlay:\n      m_UserAcceptedRename: 0\n      m_Name: \n      m_OriginalName: \n      m_EditFieldRect:\n        serializedVersion: 2\n        x: 0\n        y: 0\n        width: 0\n        height: 0\n      m_UserData: 0\n      m_IsWaitingForDelay: 0\n      m_IsRenaming: 0\n      m_OriginalEventType: 11\n      m_IsRenamingFilename: 1\n      m_ClientGUIView: {fileID: 0}\n    m_SearchString: \n    m_CreateAssetUtility:\n      m_EndAction: {fileID: 0}\n      m_InstanceID: 0\n      m_Path: \n      m_Icon: {fileID: 0}\n      m_ResourceFile: \n  m_AssetTreeState:\n    scrollPos: {x: 0, y: 0}\n    m_SelectedIDs: \n    m_LastClickedID: 0\n    m_ExpandedIDs: 000000003a2d00006e2d0000cc2f0000d42f000000ca9a3b\n    m_RenameOverlay:\n      m_UserAcceptedRename: 0\n      m_Name: \n      m_OriginalName: \n      m_EditFieldRect:\n        serializedVersion: 2\n        x: 0\n        y: 0\n        width: 0\n        height: 0\n      m_UserData: 0\n      m_IsWaitingForDelay: 0\n      m_IsRenaming: 0\n      m_OriginalEventType: 11\n      m_IsRenamingFilename: 1\n      m_ClientGUIView: {fileID: 0}\n    m_SearchString: \n    m_CreateAssetUtility:\n      m_EndAction: {fileID: 0}\n      m_InstanceID: 0\n      m_Path: \n      m_Icon: {fileID: 0}\n      m_ResourceFile: \n  m_ListAreaState:\n    m_SelectedInstanceIDs: 2a310000\n    m_LastClickedInstanceID: 12586\n    m_HadKeyboardFocusLastEvent: 0\n    m_ExpandedInstanceIDs: \n    m_RenameOverlay:\n      m_UserAcceptedRename: 0\n      m_Name: \n      m_OriginalName: \n      m_EditFieldRect:\n        serializedVersion: 2\n        x: 0\n        y: 0\n        width: 0\n        height: 0\n      m_UserData: 0\n      m_IsWaitingForDelay: 0\n      m_IsRenaming: 0\n      m_OriginalEventType: 11\n      m_IsRenamingFilename: 1\n      m_ClientGUIView: {fileID: 0}\n    m_CreateAssetUtility:\n      m_EndAction: {fileID: 0}\n      m_InstanceID: 0\n      m_Path: \n      m_Icon: {fileID: 0}\n      m_ResourceFile: \n    m_NewAssetIndexInList: -1\n    m_ScrollPosition: {x: 0, y: 298}\n    m_GridSize: 64\n  m_SkipHiddenPackages: 0\n  m_DirectoriesAreaWidth: 112\n--- !u!114 &11\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Children: []\n  m_Position:\n    serializedVersion: 2\n    x: 1643\n    y: 0\n    width: 277\n    height: 987\n  m_MinSize: {x: 275, y: 50}\n  m_MaxSize: {x: 4000, y: 4000}\n  m_ActualView: {fileID: 12}\n  m_Panes:\n  - {fileID: 12}\n  m_Selected: 0\n  m_LastSelected: 0\n--- !u!114 &12\nMonoBehaviour:\n  m_ObjectHideFlags: 52\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 1\n  m_Script: {fileID: 12019, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_MinSize: {x: 275, y: 50}\n  m_MaxSize: {x: 4000, y: 4000}\n  m_TitleContent:\n    m_Text: Inspector\n    m_Image: {fileID: -6905738622615590433, guid: 0000000000000000d000000000000000,\n      type: 0}\n    m_Tooltip: \n  m_Pos:\n    serializedVersion: 2\n    x: 1643\n    y: 73\n    width: 275\n    height: 968\n  m_ViewDataDictionary: {fileID: 0}\n  m_OpenAddComponentMenu: 0\n  m_ObjectsLockedBeforeSerialization: []\n  m_InstanceIDsLockedBeforeSerialization: \n  m_LockTracker:\n    m_IsLocked: 0\n  m_PreviewResizer:\n    m_CachedPref: -160\n    m_ControlHash: -371814159\n    m_PrefName: Preview_InspectorPreview\n  m_PreviewWindow: {fileID: 0}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/EditorOnlyScriptingSettings.json",
    "content": "{\"m_DefineSymbols\":[{\"first\":1,\"second\":\"UNITY_POST_PROCESSING_STACK_V2\"},{\"first\":7,\"second\":\"UNITY_POST_PROCESSING_STACK_V2\"},{\"first\":13,\"second\":\"UNITY_POST_PROCESSING_STACK_V2\"},{\"first\":19,\"second\":\"UNITY_POST_PROCESSING_STACK_V2\"},{\"first\":21,\"second\":\"UNITY_POST_PROCESSING_STACK_V2\"},{\"first\":25,\"second\":\"UNITY_POST_PROCESSING_STACK_V2\"},{\"first\":26,\"second\":\"UNITY_POST_PROCESSING_STACK_V2\"},{\"first\":27,\"second\":\"UNITY_POST_PROCESSING_STACK_V2\"},{\"first\":28,\"second\":\"UNITY_POST_PROCESSING_STACK_V2\"},{\"first\":29,\"second\":\"UNITY_POST_PROCESSING_STACK_V2\"}],\"m_AllowUnsafeCode\":false}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/EditorOnlyScriptingUserSettings.json",
    "content": "{\"m_ScriptingRuntimeVersion\":1,\"m_DefineSymbols\":[],\"m_AllowUnsafeCode\":false}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/EditorSnapSettings.asset",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!114 &1\nMonoBehaviour:\n  m_ObjectHideFlags: 61\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 13954, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_SnapEnabled: 0\n  m_SnapSettings:\n    m_SnapValue: {x: 0.25, y: 0.25, z: 0.25}\n    m_SnapMultiplier: {x: 2048, y: 2048, z: 2048}\n    m_Rotation: 15\n    m_Scale: 1\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/LastSceneManagerSetup.txt",
    "content": "sceneSetups:\n- path: Assets/Shaders/Ocean/Caustics/CausticsScene.unity\n  isLoaded: 1\n  isActive: 1\n  isSubScene: 0\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/LibraryFormatVersion.txt",
    "content": "unityRebuildLibraryVersion: 11\nunityForwardCompatibleVersion: 40\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/.npmignore",
    "content": "\nautomation/**\nutr_output/**\n.Editor/**\n.yamato/**\n*.zip*"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/CHANGELOG.md",
    "content": "# Changelog\nAll notable changes to this package will be documented in this file.\n\nThe format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)\nand this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).\n\n## [1.2.16] - 2019-02-11\nUpdate stylesheet to pass USS validation\n\n## [1.2.15] - 2018-11-16\nAdded support for non-experimental UIElements.\n\n## [1.2.11] - 2018-09-04\nMade some performance improvements to reduce impact on ReloadAssemblies.\n\n## [1.2.9] - 2018-08-13\nTest issues for the Collab History Window are now fixed.\n\n## [1.2.7] - 2018-08-07\nToolbar drop-down will no longer show up when package is uninstalled.\n\n## [1.2.6] - 2018-06-15\nFixed an issue where Collab's History window wouldn't load properly.\n\n## [1.2.5] - 2018-05-21\nThis is the first release of *Unity Package CollabProxy*.\n\n### Added\n- Collab history and toolbar windows\n- Collab view and presenter classes\n- Collab Editor tests for view and presenter\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/CHANGELOG.md.meta",
    "content": "fileFormatVersion: 2\nguid: 782c49e6e68074dc7ba12c95537825ce\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/DEPENDENCIES.md",
    "content": "<?xml version=\"1.0\"?>\n<package xmlns=\"http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd\">\n    <metadata>\n    <id>Unity.CollabProxy.Dependencies</id>\n    <version>1.1.0-experimental</version>\n    <authors>Rohit Garg</authors>\n    <description>Dependencies for the CollabProxy package</description>\n    </metadata>\n</package>\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/DEPENDENCIES.md.meta",
    "content": "fileFormatVersion: 2\nguid: 470530e667ad4475786b28fa3187ce95\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Documentation~/collab-proxy.md",
    "content": "# About Unity Collaborate\n\nCollaborate is a simple way for teams to save, share, and sync their Unity project.\n\nPlease refer to the online documentation [here.](https://docs.unity3d.com/Manual/UnityCollaborate.html)"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/AssemblyInfo.cs",
    "content": "using System.Runtime.CompilerServices;\nusing UnityEngine;\n\n[assembly: InternalsVisibleTo(\"Unity.CollabProxy.EditorTests\")]\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/AssemblyInfo.cs.meta",
    "content": "fileFormatVersion: 2\nguid: d4ef26aa386b44923b61c9c4b505a67c\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Bootstrap.cs",
    "content": "﻿using UnityEditor;\nusing UnityEditor.Collaboration;\nusing UnityEngine;\n\nnamespace CollabProxy.UI\n{\n    [InitializeOnLoad]\n    public class Bootstrap\n    {\n        private const float kCollabToolbarButtonWidth = 78.0f;\n        \n        static Bootstrap()\n        {\n            Collab.ShowHistoryWindow = CollabHistoryWindow.ShowHistoryWindow;\n            Collab.ShowToolbarAtPosition = CollabToolbarWindow.ShowCenteredAtPosition;\n            Collab.IsToolbarVisible = CollabToolbarWindow.IsVisible;\n            Collab.CloseToolbar = CollabToolbarWindow.CloseToolbar;\n            Toolbar.AddSubToolbar(new CollabToolbarButton\n            {\n                Width = kCollabToolbarButtonWidth\n            });\n        }\n    }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Bootstrap.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 8aa8171e088f94069bbd1978a053f7dd\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabAnalytics.cs",
    "content": "using System;\n\nnamespace UnityEditor.Collaboration\n{\n    internal static class CollabAnalytics\n    {\n        [Serializable]\n        private struct CollabUserActionAnalyticsEvent\n        {\n            public string category;\n            public string action;\n        }\n\n        public static void SendUserAction(string category, string action)\n        {\n            EditorAnalytics.SendCollabUserAction(new CollabUserActionAnalyticsEvent() { category = category, action = action });\n        }\n\n        public static readonly string historyCategoryString = \"History\";\n    };\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabAnalytics.cs.meta",
    "content": "fileFormatVersion: 2\nguid: f944311c8fff2479fa3ba741f6039fc8\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabHistoryWindow.cs",
    "content": "using System;\nusing System.Linq;\nusing System.Collections.Generic;\nusing UnityEditor.Collaboration;\n\n#if UNITY_2019_1_OR_NEWER\nusing UnityEditor.UIElements;\nusing UnityEngine.UIElements;\n#else\nusing UnityEditor.Experimental.UIElements;\nusing UnityEngine.Experimental.UIElements;\nusing UnityEngine.Experimental.UIElements.StyleEnums;\n#endif\n\nusing UnityEngine;\nusing UnityEditor.Connect;\n\nnamespace UnityEditor\n{\n    internal class CollabHistoryWindow : EditorWindow, ICollabHistoryWindow\n    {\n#if UNITY_2019_1_OR_NEWER\n                private const string ResourcesPath = \"Packages/com.unity.collab-proxy/Editor/Resources/Styles/\";\n#else\n                private const string ResourcesPath = \"StyleSheets/\";\n#endif\n\n\n        const string kWindowTitle = \"Collab History\";\n        const string kServiceUrl = \"developer.cloud.unity3d.com\";\n\n        [MenuItem(\"Window/Asset Management/Collab History\", false, 1)]\n        public static void ShowHistoryWindow()\n        {\n            EditorWindow.GetWindow<CollabHistoryWindow>(kWindowTitle);\n        }\n\n        [MenuItem(\"Window/Asset Management/Collab History\", true)]\n        public static bool ValidateShowHistoryWindow()\n        {\n            return Collab.instance.IsCollabEnabledForCurrentProject();\n        }\n\n        CollabHistoryPresenter m_Presenter;\n        Dictionary<HistoryState, VisualElement> m_Views;\n        List<CollabHistoryItem> m_HistoryItems = new List<CollabHistoryItem>();\n        HistoryState m_State;\n        VisualElement m_Container;\n        PagedListView m_Pager;\n        ScrollView m_HistoryView;\n        int m_ItemsPerPage = 5;\n        string m_InProgressRev;\n        bool m_RevisionActionsEnabled;\n\n        public CollabHistoryWindow()\n        {\n            minSize = new Vector2(275, 50);\n        }\n\n        public void OnEnable()\n        {\n            SetupGUI();\n            name = \"CollabHistory\";\n\n            if (m_Presenter == null)\n            {\n                m_Presenter = new CollabHistoryPresenter(this, new CollabHistoryItemFactory(), new RevisionsService(Collab.instance, UnityConnect.instance));\n            }\n            m_Presenter.OnWindowEnabled();\n        }\n\n        public void OnDisable()\n        {\n            m_Presenter.OnWindowDisabled();\n        }\n\n        public bool revisionActionsEnabled\n        {\n            get { return m_RevisionActionsEnabled; }\n            set\n            {\n                if (m_RevisionActionsEnabled == value)\n                    return;\n\n                m_RevisionActionsEnabled = value;\n                foreach (var historyItem in m_HistoryItems)\n                {\n                    historyItem.RevisionActionsEnabled = value;\n                }\n            }\n        }\n\n        private void AddStyleSheetPath(VisualElement root, string path)\n        {\n#if UNITY_2019_1_OR_NEWER\n            root.styleSheets.Add(EditorGUIUtility.Load(path) as StyleSheet);\n#else\n            root.AddStyleSheetPath(path);\n#endif\n        }\n\n\n        public void SetupGUI()\n        {\n#if UNITY_2019_1_OR_NEWER\n            var root = this.rootVisualElement;\n#else\n            var root = this.GetRootVisualContainer();\n#endif\n            AddStyleSheetPath(root, ResourcesPath + \"CollabHistoryCommon.uss\");\n            if (EditorGUIUtility.isProSkin)\n            {\n                AddStyleSheetPath(root, ResourcesPath + \"CollabHistoryDark.uss\");\n            }\n            else\n            {\n                AddStyleSheetPath(root, ResourcesPath + \"CollabHistoryLight.uss\");\n            }\n\n            m_Container = new VisualElement();\n            m_Container.StretchToParentSize();\n            root.Add(m_Container);\n\n            m_Pager = new PagedListView()\n            {\n                name = \"PagedElement\",\n                pageSize = m_ItemsPerPage\n            };\n\n            var errorView = new StatusView()\n            {\n                message = \"An Error Occurred\",\n                icon = EditorGUIUtility.LoadIconRequired(\"Collab.Warning\") as Texture,\n            };\n\n            var noInternetView = new StatusView()\n            {\n                message = \"No Internet Connection\",\n                icon = EditorGUIUtility.LoadIconRequired(\"Collab.NoInternet\") as Texture,\n            };\n\n            var maintenanceView = new StatusView()\n            {\n                message = \"Maintenance\",\n            };\n\n            var loginView = new StatusView()\n            {\n                message = \"Sign in to access Collaborate\",\n                buttonText = \"Sign in...\",\n                callback = SignInClick,\n            };\n\n            var noSeatView = new StatusView()\n            {\n                message = \"Ask your project owner for access to Unity Teams\",\n                buttonText = \"Learn More\",\n                callback = NoSeatClick,\n            };\n\n            var waitingView = new StatusView()\n            {\n                message = \"Updating...\",\n            };\n\n            m_HistoryView = new ScrollView() { name = \"HistoryContainer\", showHorizontal = false};\n            m_HistoryView.contentContainer.StretchToParentWidth();\n            m_HistoryView.Add(m_Pager);\n\n            m_Views = new Dictionary<HistoryState, VisualElement>()\n            {\n                {HistoryState.Error,       errorView},\n                {HistoryState.Offline,     noInternetView},\n                {HistoryState.Maintenance, maintenanceView},\n                {HistoryState.LoggedOut,   loginView},\n                {HistoryState.NoSeat,      noSeatView},\n                {HistoryState.Waiting,     waitingView},\n                {HistoryState.Ready,       m_HistoryView}\n            };\n        }\n\n        public void UpdateState(HistoryState state, bool force)\n        {\n            if (state == m_State && !force)\n                return;\n\n            m_State = state;\n            switch (state)\n            {\n                case HistoryState.Ready:\n                    UpdateHistoryView(m_Pager);\n                    break;\n                case HistoryState.Disabled:\n                    Close();\n                    return;\n            }\n\n            m_Container.Clear();\n            m_Container.Add(m_Views[m_State]);\n        }\n\n        public void UpdateRevisions(IEnumerable<RevisionData> datas, string tip, int totalRevisions, int currentPage)\n        {\n            var elements = new List<VisualElement>();\n            var isFullDateObtained = false; // Has everything from this date been obtained?\n            m_HistoryItems.Clear();\n\n            if (datas != null)\n            {\n                DateTime currentDate = DateTime.MinValue;\n                foreach (var data in datas)\n                {\n                    if (data.timeStamp.Date != currentDate.Date)\n                    {\n                        elements.Add(new CollabHistoryRevisionLine(data.timeStamp, isFullDateObtained));\n                        currentDate = data.timeStamp;\n                    }\n\n                    var item = new CollabHistoryItem(data);\n                    m_HistoryItems.Add(item);\n\n                    var container = new VisualElement();\n                    container.style.flexDirection = FlexDirection.Row;\n                    if (data.current)\n                    {\n                        isFullDateObtained = true;\n                        container.AddToClassList(\"currentRevision\");\n                        container.AddToClassList(\"obtainedRevision\");\n                    }\n                    else if (data.obtained)\n                    {\n                        container.AddToClassList(\"obtainedRevision\");\n                    }\n                    else\n                    {\n                        container.AddToClassList(\"absentRevision\");\n                    }\n                    // If we use the index as-is, the latest commit will become #1, but we want it to be last\n                    container.Add(new CollabHistoryRevisionLine(data.index));\n                    container.Add(item);\n                    elements.Add(container);\n                }\n            }\n\n            m_HistoryView.scrollOffset = new Vector2(0, 0);\n            m_Pager.totalItems = totalRevisions;\n            m_Pager.curPage = currentPage;\n            m_Pager.items = elements;\n        }\n\n        public string inProgressRevision\n        {\n            get { return m_InProgressRev; }\n            set\n            {\n                m_InProgressRev = value;\n                foreach (var historyItem in m_HistoryItems)\n                {\n                    historyItem.SetInProgressStatus(value);\n                }\n            }\n        }\n\n        public int itemsPerPage\n        {\n            set\n            {\n                if (m_ItemsPerPage == value)\n                    return;\n                m_Pager.pageSize = m_ItemsPerPage;\n            }\n        }\n\n        public PageChangeAction OnPageChangeAction\n        {\n            set { m_Pager.OnPageChanged = value; }\n        }\n\n        public RevisionAction OnGoBackAction\n        {\n            set { CollabHistoryItem.s_OnGoBack = value; }\n        }\n\n        public RevisionAction OnUpdateAction\n        {\n            set { CollabHistoryItem.s_OnUpdate = value; }\n        }\n\n        public RevisionAction OnRestoreAction\n        {\n            set { CollabHistoryItem.s_OnRestore = value; }\n        }\n\n        public ShowBuildAction OnShowBuildAction\n        {\n            set { CollabHistoryItem.s_OnShowBuild = value; }\n        }\n\n        public Action OnShowServicesAction\n        {\n            set { CollabHistoryItem.s_OnShowServices = value; }\n        }\n\n        void UpdateHistoryView(VisualElement history)\n        {\n        }\n\n        void NoSeatClick()\n        {\n            var connection = UnityConnect.instance;\n            var env = connection.GetEnvironment();\n            // Map environment to url - prod is special\n            if (env == \"production\")\n                env = \"\";\n            else\n                env += \"-\";\n\n            var url = \"https://\" + env + kServiceUrl\n                + \"/orgs/\" + connection.GetOrganizationId()\n                + \"/projects/\" + connection.GetProjectName()\n                + \"/unity-teams/\";\n            Application.OpenURL(url);\n        }\n\n        void SignInClick()\n        {\n            UnityConnect.instance.ShowLogin();\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabHistoryWindow.cs.meta",
    "content": "fileFormatVersion: 2\nguid: fed9dda667cab45d398d06402bba03f4\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabToolbarButton.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing UnityEditor.Collaboration;\nusing UnityEditor.Connect;\nusing UnityEditor.Web;\nusing UnityEngine;\n\nnamespace UnityEditor\n{\n    internal class CollabToolbarButton : SubToolbar, IDisposable\n    {\n        // Must match s_CollabIcon array\n        enum CollabToolbarState\n        {\n            NeedToEnableCollab,\n            UpToDate,\n            Conflict,\n            OperationError,\n            ServerHasChanges,\n            FilesToPush,\n            InProgress,\n            Disabled,\n            Offline\n        }\n\n        private class CollabToolbarContent\n        {\n            readonly string m_iconName;\n            readonly string m_toolTip;\n            readonly CollabToolbarState m_state;\n            \n            static Dictionary<CollabToolbarContent, GUIContent> m_CollabIcons;\n\n            public CollabToolbarState RegisteredForState\n            {\n                get { return m_state; }\n            }\n\n            public GUIContent GuiContent\n            {\n                get\n                {\n                    if (m_CollabIcons == null)\n                    {\n                        m_CollabIcons = new Dictionary<CollabToolbarContent, GUIContent>();\n                    }\n            \n                    if (!m_CollabIcons.ContainsKey(this))\n                    {\n                        m_CollabIcons.Add(this, EditorGUIUtility.TrTextContentWithIcon(\"Collab\", m_toolTip, m_iconName));\n                    }\n            \n                    return m_CollabIcons[this];\n                }\n            }\n\n            public CollabToolbarContent(CollabToolbarState state, string iconName, string toolTip)\n            {\n                m_state = state;\n                m_iconName = iconName;\n                m_toolTip = toolTip;\n            }\n        }\n\n        CollabToolbarContent[] m_toolbarContents;\n        CollabToolbarState m_CollabToolbarState = CollabToolbarState.UpToDate;\n        const float kCollabButtonWidth = 78.0f;\n        ButtonWithAnimatedIconRotation m_CollabButton;\n        string m_DynamicTooltip;\n        static bool m_ShowCollabTooltip = false;\n\n        private GUIContent currentCollabContent\n        {\n            get\n            {\n                CollabToolbarContent toolbarContent =\n                    m_toolbarContents.FirstOrDefault(c => c.RegisteredForState.Equals(m_CollabToolbarState));\n                GUIContent content = new GUIContent(toolbarContent == null? m_toolbarContents.First().GuiContent : toolbarContent.GuiContent);\n                if (!m_ShowCollabTooltip)\n                {\n                    content.tooltip = null;\n                }\n                else if (m_DynamicTooltip != \"\")\n                {\n                    content.tooltip = m_DynamicTooltip;\n                }\n\n                if (Collab.instance.AreTestsRunning())\n                {\n                    content.text = \"CTF\";\n                }\n\n                return content;\n            }\n        }\n        \n        public CollabToolbarButton()\n        {\n            m_toolbarContents = new[]\n            {\n                new CollabToolbarContent(CollabToolbarState.NeedToEnableCollab, \"CollabNew\", \" You need to enable collab.\"),\n                new CollabToolbarContent(CollabToolbarState.UpToDate, \"Collab\", \" You are up to date.\"),\n                new CollabToolbarContent(CollabToolbarState.Conflict, \"CollabConflict\", \" Please fix your conflicts prior to publishing.\"),\n                new CollabToolbarContent(CollabToolbarState.OperationError, \"CollabError\", \" Last operation failed. Please retry later.\"),\n                new CollabToolbarContent(CollabToolbarState.ServerHasChanges, \"CollabPull\", \" Please update, there are server changes.\"),\n                new CollabToolbarContent(CollabToolbarState.FilesToPush, \"CollabPush\", \" You have files to publish.\"),\n                new CollabToolbarContent(CollabToolbarState.InProgress, \"CollabProgress\", \" Operation in progress.\"),\n                new CollabToolbarContent(CollabToolbarState.Disabled, \"CollabNew\", \" Collab is disabled.\"),\n                new CollabToolbarContent(CollabToolbarState.Offline, \"CollabNew\", \" Please check your network connection.\")\n            };\n            \n            Collab.instance.StateChanged += OnCollabStateChanged;\n            UnityConnect.instance.StateChanged += OnUnityConnectStateChanged;\n            UnityConnect.instance.UserStateChanged += OnUnityConnectUserStateChanged;\n        }\n\n        void OnUnityConnectUserStateChanged(UserInfo state)\n        {\n            UpdateCollabToolbarState();\n        }\n\n        void OnUnityConnectStateChanged(ConnectInfo state)\n        {\n            UpdateCollabToolbarState();\n        }\n\n        public override void OnGUI(Rect rect)\n        {\n            DoCollabDropDown(rect);\n        }\n\n        Rect GUIToScreenRect(Rect guiRect)\n        {\n            Vector2 screenPoint = GUIUtility.GUIToScreenPoint(new Vector2(guiRect.x, guiRect.y));\n            guiRect.x = screenPoint.x;\n            guiRect.y = screenPoint.y;\n            return guiRect;\n        }\n        \n        void ShowPopup(Rect rect)\n        {\n            // window should be centered on the button\n            ReserveRight(kCollabButtonWidth / 2, ref rect);\n            ReserveBottom(5, ref rect);\n            // calculate screen rect before saving assets since it might open the AssetSaveDialog window\n            var screenRect = GUIToScreenRect(rect);\n            // save all the assets\n            AssetDatabase.SaveAssets();\n            if (Collab.ShowToolbarAtPosition != null && Collab.ShowToolbarAtPosition(screenRect))\n            {\n                GUIUtility.ExitGUI();\n            }\n        }\n\n        void DoCollabDropDown(Rect rect)\n        {\n            UpdateCollabToolbarState();\n            GUIStyle collabButtonStyle = \"OffsetDropDown\";\n            bool showPopup = Toolbar.requestShowCollabToolbar;\n            Toolbar.requestShowCollabToolbar = false;\n\n            bool enable = !EditorApplication.isPlaying;\n\n            using (new EditorGUI.DisabledScope(!enable))\n            {\n                bool animate = m_CollabToolbarState == CollabToolbarState.InProgress;\n\n                EditorGUIUtility.SetIconSize(new Vector2(12, 12));\n                if (GetCollabButton().OnGUI(rect, currentCollabContent, animate, collabButtonStyle))\n                {\n                    showPopup = true;\n                }\n                EditorGUIUtility.SetIconSize(Vector2.zero);\n            }\n\n            if (m_CollabToolbarState == CollabToolbarState.Disabled)\n                return;\n\n            if (showPopup)\n            {\n                ShowPopup(rect);\n            }\n        }\n\n        public void OnCollabStateChanged(CollabInfo info)\n        {\n            UpdateCollabToolbarState();\n        }\n\n        public void UpdateCollabToolbarState()\n        {\n            var currentCollabState = CollabToolbarState.UpToDate;\n            bool networkAvailable = UnityConnect.instance.connectInfo.online && UnityConnect.instance.connectInfo.loggedIn;\n            m_DynamicTooltip = \"\";\n\n            if (UnityConnect.instance.isDisableCollabWindow)\n            {\n                currentCollabState = CollabToolbarState.Disabled;\n            }\n            else if (networkAvailable)\n            {\n                Collab collab = Collab.instance;\n                CollabInfo currentInfo = collab.collabInfo;\n                UnityErrorInfo errInfo;\n                bool error = false;\n                if (collab.GetError((UnityConnect.UnityErrorFilter.ByContext | UnityConnect.UnityErrorFilter.ByChild), out errInfo))\n                {\n                    error = (errInfo.priority <= (int)UnityConnect.UnityErrorPriority.Error);\n                    m_DynamicTooltip = errInfo.shortMsg;\n                }\n\n                if (!currentInfo.ready)\n                {\n                    currentCollabState = CollabToolbarState.InProgress;\n                }\n                else if (error)\n                {\n                    currentCollabState = CollabToolbarState.OperationError;\n                }\n                else if (currentInfo.inProgress)\n                {\n                    currentCollabState = CollabToolbarState.InProgress;\n                }\n                else\n                {\n                    bool collabEnable = Collab.instance.IsCollabEnabledForCurrentProject();\n\n                    if (UnityConnect.instance.projectInfo.projectBound == false || !collabEnable)\n                    {\n                        currentCollabState = CollabToolbarState.NeedToEnableCollab;\n                    }\n                    else if (currentInfo.update)\n                    {\n                        currentCollabState = CollabToolbarState.ServerHasChanges;\n                    }\n                    else if (currentInfo.conflict)\n                    {\n                        currentCollabState = CollabToolbarState.Conflict;\n                    }\n                    else if (currentInfo.publish)\n                    {\n                        currentCollabState = CollabToolbarState.FilesToPush;\n                    }\n                }\n            }\n            else\n            {\n                currentCollabState = CollabToolbarState.Offline;\n            }\n\n            if (Collab.IsToolbarVisible != null)\n            {\n                if (currentCollabState != m_CollabToolbarState ||\n                    Collab.IsToolbarVisible() == m_ShowCollabTooltip)\n                {\n                    m_CollabToolbarState = currentCollabState;\n                    m_ShowCollabTooltip = !Collab.IsToolbarVisible();\n                    Toolbar.RepaintToolbar();\n                }\n            }\n        }\n        \n        void ReserveRight(float width, ref Rect pos)\n        {\n            pos.x += width;\n        }\n\n        void ReserveBottom(float height, ref Rect pos)\n        {\n            pos.y += height;\n        }\n\n        ButtonWithAnimatedIconRotation GetCollabButton()\n        {\n            if (m_CollabButton == null)\n            {\n                const int repaintsPerSecond = 20;\n                const float animSpeed = 500f;\n                const bool mouseDownButton = true;\n                m_CollabButton = new ButtonWithAnimatedIconRotation(() => (float)EditorApplication.timeSinceStartup * animSpeed, Toolbar.RepaintToolbar, repaintsPerSecond, mouseDownButton);\n            }\n\n            return m_CollabButton;\n        }\n\n        public void Dispose()\n        {\n            Collab.instance.StateChanged -= OnCollabStateChanged;\n            UnityConnect.instance.StateChanged -= OnUnityConnectStateChanged;\n            UnityConnect.instance.UserStateChanged -= OnUnityConnectUserStateChanged;\n\n            if (m_CollabButton != null)\n                m_CollabButton.Clear();\n        }\n    }\n} // namespace"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabToolbarButton.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 882f1a4147a284f028899b9c018e63eb\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabToolbarWindow.cs",
    "content": "using UnityEngine;\nusing UnityEditor.Collaboration;\nusing UnityEditor.Web;\nusing UnityEditor.Connect;\n\nnamespace UnityEditor\n{\n    [InitializeOnLoad]\n    internal class WebViewStatic : ScriptableSingleton<WebViewStatic>\n    {\n        [SerializeField]\n        WebView m_WebView;\n\n        static public WebView GetWebView()\n        {\n            return instance.m_WebView;\n        }\n\n        static public void SetWebView(WebView webView)\n        {\n            instance.m_WebView = webView;\n        }\n    }\n\n    [InitializeOnLoad]\n    internal class CollabToolbarWindow : WebViewEditorStaticWindow, IHasCustomMenu\n    {\n        internal override WebView webView\n        {\n            get {return WebViewStatic.GetWebView(); }\n            set {WebViewStatic.SetWebView(value); }\n        }\n\n        private const string kWindowName = \"Unity Collab Toolbar\";\n\n        private static long s_LastClosedTime;\n        private static CollabToolbarWindow s_CollabToolbarWindow;\n\n        public static bool s_ToolbarIsVisible = false;\n\n        const int kWindowWidth = 320;\n        const int kWindowHeight = 350;\n\n        public static void CloseToolbar()\n        {\n            foreach (CollabToolbarWindow window in Resources.FindObjectsOfTypeAll<CollabToolbarWindow>())\n                window.Close();\n        }\n\n        [MenuItem(\"Window/Asset Management/Collab Toolbar\", false /*IsValidateFunction*/, 2, true /* IsInternalMenu */)]\n        public static CollabToolbarWindow ShowToolbarWindow()\n        {\n            //Create a new window if it does not exist\n            if (s_CollabToolbarWindow == null)\n            {\n                s_CollabToolbarWindow = GetWindow<CollabToolbarWindow>(false, kWindowName) as CollabToolbarWindow;\n            }\n\n            return s_CollabToolbarWindow;\n        }\n\n        [MenuItem(\"Window/Asset Management/Collab Toolbar\", true /*IsValidateFunction*/)]\n        public static bool ValidateShowToolbarWindow()\n        {\n            return true;\n        }\n\n        public static bool IsVisible()\n        {\n            return s_ToolbarIsVisible;\n        }\n\n        public static bool ShowCenteredAtPosition(Rect buttonRect)\n        {\n            buttonRect.x -= kWindowWidth / 2;\n            // We could not use realtimeSinceStartUp since it is set to 0 when entering/exitting playmode, we assume an increasing time when comparing time.\n            long nowMilliSeconds = System.DateTime.Now.Ticks / System.TimeSpan.TicksPerMillisecond;\n            bool justClosed = nowMilliSeconds < s_LastClosedTime + 50;\n            if (!justClosed)\n            {\n                // Method may have been triggered programmatically, without a user event to consume.\n                if (Event.current.type != EventType.Layout)\n                {\n                    Event.current.Use();\n                }\n                if (s_CollabToolbarWindow == null)\n                    s_CollabToolbarWindow = CreateInstance<CollabToolbarWindow>() as CollabToolbarWindow;\n                var windowSize = new Vector2(kWindowWidth, kWindowHeight);\n                s_CollabToolbarWindow.initialOpenUrl = \"file:///\" + EditorApplication.userJavascriptPackagesPath + \"unityeditor-collab-toolbar/dist/index.html\";\n                s_CollabToolbarWindow.Init();\n                s_CollabToolbarWindow.ShowAsDropDown(buttonRect, windowSize);\n                s_CollabToolbarWindow.OnFocus();\n                return true;\n            }\n            return false;\n        }\n\n        // Receives HTML title\n        public void OnReceiveTitle(string title)\n        {\n            titleContent.text = title;\n        }\n\n        public new void OnInitScripting()\n        {\n            base.OnInitScripting();\n        }\n\n        public override void OnEnable()\n        {\n            minSize = new Vector2(kWindowWidth, kWindowHeight);\n            maxSize = new Vector2(kWindowWidth, kWindowHeight);\n            initialOpenUrl = \"file:///\" + EditorApplication.userJavascriptPackagesPath + \"unityeditor-collab-toolbar/dist/index.html\";\n            base.OnEnable();\n            s_ToolbarIsVisible = true;\n        }\n\n        internal new void OnDisable()\n        {\n            s_LastClosedTime = System.DateTime.Now.Ticks / System.TimeSpan.TicksPerMillisecond;\n            if (s_CollabToolbarWindow)\n            {\n                s_ToolbarIsVisible = false;\n                NotifyVisibility(s_ToolbarIsVisible);\n            }\n            s_CollabToolbarWindow = null;\n\n            base.OnDisable();\n        }\n\n        public new void OnDestroy()\n        {\n            OnLostFocus();\n            base.OnDestroy();\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabToolbarWindow.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 6f516f1ec21a54a59a92bf99db2d9535\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Presenters/CollabHistoryPresenter.cs",
    "content": "using System.Collections.Generic;\nusing UnityEditor.Connect;\nusing UnityEditor.Web;\n\nnamespace UnityEditor.Collaboration\n{\n    internal class CollabHistoryPresenter\n    {\n        public const int ItemsPerPage = 5;\n        ICollabHistoryWindow m_Window;\n        ICollabHistoryItemFactory m_Factory;\n        IRevisionsService m_Service;\n        ConnectInfo m_ConnectState;\n        CollabInfo m_CollabState;\n        bool m_IsCollabError;\n        int m_TotalRevisions;\n        int m_CurrentPage;\n        int m_RequestedPage;\n        bool m_FetchInProgress;\n\n        BuildAccess m_BuildAccess;\n        string m_ProgressRevision;\n        public bool BuildServiceEnabled {get; set; }\n\n        public CollabHistoryPresenter(ICollabHistoryWindow window, ICollabHistoryItemFactory factory, IRevisionsService service)\n        {\n            m_Window = window;\n            m_Factory = factory;\n            m_Service = service;\n            m_CurrentPage = 0;\n            m_BuildAccess = new BuildAccess();\n            m_Service.FetchRevisionsCallback += OnFetchRevisions;\n        }\n\n        public void OnWindowEnabled()\n        {\n            UnityConnect.instance.StateChanged += OnConnectStateChanged;\n            Collab.instance.StateChanged += OnCollabStateChanged;\n            Collab.instance.RevisionUpdated += OnCollabRevisionUpdated;\n            Collab.instance.JobsCompleted += OnCollabJobsCompleted;\n            Collab.instance.ErrorOccurred += OnCollabError;\n            Collab.instance.ErrorCleared += OnCollabErrorCleared;\n            EditorApplication.playModeStateChanged += OnPlayModeStateChanged;\n            m_ConnectState = UnityConnect.instance.GetConnectInfo();\n            m_CollabState = Collab.instance.GetCollabInfo();\n\n            m_Window.revisionActionsEnabled = !EditorApplication.isPlayingOrWillChangePlaymode;\n\n            // Setup window callbacks\n            m_Window.OnPageChangeAction = OnUpdatePage;\n            m_Window.OnUpdateAction = OnUpdate;\n            m_Window.OnRestoreAction = OnRestore;\n            m_Window.OnGoBackAction = OnGoBack;\n            m_Window.OnShowBuildAction = ShowBuildForCommit;\n            m_Window.OnShowServicesAction = ShowServicePage;\n            m_Window.itemsPerPage = ItemsPerPage;\n\n            // Initialize data\n            UpdateBuildServiceStatus();\n            var state = RecalculateState();\n            // Only try to load the page if we're ready\n            if (state == HistoryState.Ready)\n                OnUpdatePage(m_CurrentPage);\n            m_Window.UpdateState(state, true);\n        }\n\n        public void OnWindowDisabled()\n        {\n            UnityConnect.instance.StateChanged -= OnConnectStateChanged;\n            Collab.instance.StateChanged -= OnCollabStateChanged;\n            Collab.instance.RevisionUpdated -= OnCollabRevisionUpdated;\n            Collab.instance.JobsCompleted -= OnCollabJobsCompleted;\n            EditorApplication.playModeStateChanged -= OnPlayModeStateChanged;\n        }\n\n        private void OnConnectStateChanged(ConnectInfo state)\n        {\n            m_ConnectState = state;\n\n            m_Window.UpdateState(RecalculateState(), false);\n        }\n\n        private void OnCollabStateChanged(CollabInfo state)\n        {\n            // Sometimes a collab state change will trigger even though everything is the same\n            if (m_CollabState.Equals(state))\n                return;\n\n            if (m_CollabState.tip != state.tip)\n                OnUpdatePage(m_CurrentPage);\n\n            m_CollabState = state;\n            m_Window.UpdateState(RecalculateState(), false);\n            if (state.inProgress)\n            {\n                m_Window.inProgressRevision = m_ProgressRevision;\n            }\n            else\n            {\n                m_Window.inProgressRevision = null;\n            }\n        }\n\n        private void OnCollabRevisionUpdated(CollabInfo state)\n        {\n            OnUpdatePage(m_CurrentPage);\n        }\n\n        private void OnCollabJobsCompleted(CollabInfo state)\n        {\n            m_ProgressRevision = null;\n        }\n\n        private void OnCollabError()\n        {\n            m_IsCollabError = true;\n            m_Window.UpdateState(RecalculateState(), false);\n        }\n\n        private void OnCollabErrorCleared()\n        {\n            m_IsCollabError = false;\n            m_FetchInProgress = true;\n            m_Service.GetRevisions(m_CurrentPage * ItemsPerPage, ItemsPerPage);\n            m_Window.UpdateState(RecalculateState(), false);\n        }\n\n        private void OnPlayModeStateChanged(PlayModeStateChange stateChange)\n        {\n            // If entering play mode, disable\n            if (stateChange == PlayModeStateChange.ExitingEditMode ||\n                stateChange == PlayModeStateChange.EnteredPlayMode)\n            {\n                m_Window.revisionActionsEnabled = false;\n            }\n            // If exiting play mode, enable!\n            else if (stateChange == PlayModeStateChange.EnteredEditMode ||\n                     stateChange == PlayModeStateChange.ExitingPlayMode)\n            {\n                m_Window.revisionActionsEnabled = true;\n            }\n        }\n\n        private HistoryState RecalculateState()\n        {\n            if (!m_ConnectState.online)\n                return HistoryState.Offline;\n            if (m_ConnectState.maintenance || m_CollabState.maintenance)\n                return HistoryState.Maintenance;\n            if (!m_ConnectState.loggedIn)\n                return HistoryState.LoggedOut;\n            if (!m_CollabState.seat)\n                return HistoryState.NoSeat;\n            if (!Collab.instance.IsCollabEnabledForCurrentProject())\n                return HistoryState.Disabled;\n            if (!Collab.instance.IsConnected() || !m_CollabState.ready || m_FetchInProgress)\n                return HistoryState.Waiting;\n            if (m_ConnectState.error || m_IsCollabError)\n                return HistoryState.Error;\n\n            return HistoryState.Ready;\n        }\n\n        // TODO: Eventually this can be a listener on the build service status\n        public void UpdateBuildServiceStatus()\n        {\n            foreach (var service in UnityConnectServiceCollection.instance.GetAllServiceInfos())\n            {\n                if (service.name.Equals(\"Build\"))\n                {\n                    BuildServiceEnabled = service.enabled;\n                }\n            }\n        }\n\n        public void ShowBuildForCommit(string revisionID)\n        {\n            m_BuildAccess.ShowBuildForCommit(revisionID);\n        }\n\n        public void ShowServicePage()\n        {\n            m_BuildAccess.ShowServicePage();\n        }\n\n        public void OnUpdatePage(int page)\n        {\n            m_FetchInProgress = true;\n            m_Service.GetRevisions(page * ItemsPerPage, ItemsPerPage);\n            m_Window.UpdateState(RecalculateState(), false);\n            m_RequestedPage = page;\n        }\n\n        private void OnFetchRevisions(RevisionsResult data)\n        {\n            m_FetchInProgress = false;\n            IEnumerable<RevisionData> items = null;\n            if (data != null)\n            {\n                m_CurrentPage = m_RequestedPage;\n                m_TotalRevisions = data.RevisionsInRepo;\n                items = m_Factory.GenerateElements(data.Revisions, m_TotalRevisions, m_CurrentPage * ItemsPerPage, m_Service.tipRevision, m_Window.inProgressRevision, m_Window.revisionActionsEnabled, BuildServiceEnabled, m_Service.currentUser);\n            }\n\n            // State must be recalculated prior to inserting items\n            m_Window.UpdateState(RecalculateState(), false);\n            m_Window.UpdateRevisions(items, m_Service.tipRevision, m_TotalRevisions, m_CurrentPage);\n        }\n\n        private void OnRestore(string revisionId, bool updatetorevision)\n        {\n            m_ProgressRevision = revisionId;\n            Collab.instance.ResyncToRevision(revisionId);\n        }\n\n        private void OnGoBack(string revisionId, bool updatetorevision)\n        {\n            m_ProgressRevision = revisionId;\n            Collab.instance.GoBackToRevision(revisionId, false);\n        }\n\n        private void OnUpdate(string revisionId, bool updatetorevision)\n        {\n            m_ProgressRevision = revisionId;\n            Collab.instance.Update(revisionId, updatetorevision);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Presenters/CollabHistoryPresenter.cs.meta",
    "content": "fileFormatVersion: 2\nguid: a7c91a123806d41a0873fcdcb629b1c4\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Presenters.meta",
    "content": "fileFormatVersion: 2\nguid: d437fe60bb34f45728664a5d930c1635\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/BuildStatusButton.cs",
    "content": "using System;\nusing UnityEditor;\nusing UnityEditor.Collaboration;\nusing UnityEngine;\n\n#if UNITY_2019_1_OR_NEWER\nusing UnityEngine.UIElements;\n#else\nusing UnityEngine.Experimental.UIElements;\n#endif\n\nnamespace UnityEditor.Collaboration\n{\n    internal class BuildStatusButton : Button\n    {\n        private readonly string iconPrefix = \"Icons/Collab.Build\";\n        private readonly string iconSuffix = \".png\";\n        Label labelElement = new Label();\n        Image iconElement = new Image() {name = \"BuildIcon\"};\n\n        public BuildStatusButton(Action clickEvent) : base(clickEvent)\n        {\n            iconElement.image = EditorGUIUtility.Load(iconPrefix + iconSuffix) as Texture;\n            labelElement.text = \"Build Now\";\n            Add(iconElement);\n            Add(labelElement);\n        }\n\n        public BuildStatusButton(Action clickEvent, BuildState state, int failures) : base(clickEvent)\n        {\n            switch (state)\n            {\n                case BuildState.InProgress:\n                    iconElement.image = EditorGUIUtility.Load(iconPrefix + iconSuffix) as Texture;\n                    labelElement.text = \"In progress\";\n                    break;\n\n                case BuildState.Failed:\n                    iconElement.image = EditorGUIUtility.Load(iconPrefix + \"Failed\" + iconSuffix) as Texture;\n                    labelElement.text = failures + ((failures == 1) ? \" failure\" : \" failures\");\n                    break;\n\n                case BuildState.Success:\n                    iconElement.image = EditorGUIUtility.Load(iconPrefix + \"Succeeded\" + iconSuffix) as Texture;\n                    labelElement.text = \"success\";\n                    break;\n            }\n\n            Add(iconElement);\n            Add(labelElement);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/BuildStatusButton.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 0217a80286f79419daa202f69409f19b\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryDropDown.cs",
    "content": "using UnityEngine;\nusing System.Collections.Generic;\nusing UnityEditor.Connect;\n\n#if UNITY_2019_1_OR_NEWER\nusing UnityEngine.UIElements;\n#else\nusing UnityEngine.Experimental.UIElements;\n#endif\n\n\nnamespace UnityEditor.Collaboration\n{\n    internal class CollabHistoryDropDown : VisualElement\n    {\n        private readonly VisualElement m_FilesContainer;\n        private readonly Label m_ToggleLabel;\n        private int m_ChangesTotal;\n        private string m_RevisionId;\n\n        public CollabHistoryDropDown(ICollection<ChangeData> changes, int changesTotal, bool changesTruncated, string revisionId)\n        {\n            m_FilesContainer = new VisualElement();\n            m_ChangesTotal = changesTotal;\n            m_RevisionId = revisionId;\n\n            m_ToggleLabel = new Label(ToggleText(false));\n            m_ToggleLabel.AddManipulator(new Clickable(ToggleDropdown));\n            Add(m_ToggleLabel);\n\n            foreach (ChangeData change in changes)\n            {\n                m_FilesContainer.Add(new CollabHistoryDropDownItem(change.path, change.action));\n            }\n\n            if (changesTruncated)\n            {\n                m_FilesContainer.Add(new Button(ShowAllClick)\n                {\n                    text = \"Show all on dashboard\"\n                });\n            }\n        }\n\n        private void ToggleDropdown()\n        {\n            if (Contains(m_FilesContainer))\n            {\n                CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, \"CollapseAssets\");\n                Remove(m_FilesContainer);\n                m_ToggleLabel.text = ToggleText(false);\n            }\n            else\n            {\n                CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, \"ExpandAssets\");\n                Add(m_FilesContainer);\n                m_ToggleLabel.text = ToggleText(true);\n            }\n        }\n\n        private string ToggleText(bool open)\n        {\n            var icon = open ? \"\\u25bc\" : \"\\u25b6\";\n            var change = m_ChangesTotal == 1 ? \"Change\" : \"Changes\";\n            return string.Format(\"{0} {1} Asset {2}\", icon, m_ChangesTotal, change);\n        }\n\n        private void ShowAllClick()\n        {\n            var host = UnityConnect.instance.GetConfigurationURL(CloudConfigUrl.CloudServicesDashboard);\n            var org = UnityConnect.instance.GetOrganizationId();\n            var proj = UnityConnect.instance.GetProjectGUID();\n            var url = string.Format(\"{0}/collab/orgs/{1}/projects/{2}/commits?commit={3}\", host, org, proj, m_RevisionId);\n            CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, \"ShowAllOnDashboard\");\n            Application.OpenURL(url);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryDropDown.cs.meta",
    "content": "fileFormatVersion: 2\nguid: a483595b0257945278dc75c5ff7d82ee\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryDropDownItem.cs",
    "content": "using System;\nusing System.IO;\nusing System.Linq;\nusing UnityEngine;\n\n#if UNITY_2019_1_OR_NEWER\nusing UnityEngine.UIElements;\n#else\nusing UnityEngine.Experimental.UIElements;\n#endif\n\n\nnamespace UnityEditor.Collaboration\n{\n    internal class CollabHistoryDropDownItem : VisualElement\n    {\n        public CollabHistoryDropDownItem(string path, string action)\n        {\n            var fileName = Path.GetFileName(path);\n            var isFolder = Path.GetFileNameWithoutExtension(path).Equals(fileName);\n            var fileIcon = GetIconElement(action, fileName, isFolder);\n            var metaContainer = new VisualElement();\n            var fileNameLabel = new Label\n            {\n                name = \"FileName\",\n                text = fileName\n            };\n            var filePathLabel = new Label\n            {\n                name = \"FilePath\",\n                text = path\n            };\n            metaContainer.Add(fileNameLabel);\n            metaContainer.Add(filePathLabel);\n            Add(fileIcon);\n            Add(metaContainer);\n        }\n\n        private Image GetIconElement(string action, string fileName, bool isFolder)\n        {\n            var prefix = isFolder ? \"Folder\" : \"File\";\n            var actionName = action.First().ToString().ToUpper() + action.Substring(1);\n            // Use the same icon for renamed and moved files\n            actionName = actionName.Equals(\"Renamed\") ? \"Moved\" : actionName;\n            var iconElement = new Image\n            {\n                name = \"FileIcon\",\n                image = EditorGUIUtility.LoadIcon(\"Icons/Collab.\" + prefix + actionName + \".png\")\n            };\n            return iconElement;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryDropDownItem.cs.meta",
    "content": "fileFormatVersion: 2\nguid: d912d4873af534bd4a9d44bf1b52f14e\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryItem.cs",
    "content": "using System;\nusing System.Linq;\nusing System.Security.Cryptography;\nusing UnityEditor.Connect;\nusing UnityEditor.Web;\nusing UnityEngine;\n\n#if UNITY_2019_1_OR_NEWER\nusing UnityEngine.UIElements;\n#else\nusing UnityEngine.Experimental.UIElements;\nusing UnityEngine.Experimental.UIElements.StyleEnums;\n#endif\n\nnamespace UnityEditor.Collaboration\n{\n    internal class CollabHistoryItem : VisualElement\n    {\n        public static RevisionAction s_OnRestore;\n        public static RevisionAction s_OnGoBack;\n        public static RevisionAction s_OnUpdate;\n        public static ShowBuildAction s_OnShowBuild;\n        public static Action s_OnShowServices;\n\n        private readonly string m_RevisionId;\n        private readonly string m_FullDescription;\n        private readonly DateTime m_TimeStamp;\n        private readonly Button m_Button;\n        private readonly HistoryProgressSpinner m_ProgressSpinner;\n        private VisualElement m_ActionsTray;\n        private VisualElement m_Details;\n        private Label m_Description;\n        private Label m_TimeAgo;\n        private readonly Button m_ExpandCollapseButton;\n        private bool m_Expanded;\n\n        private const int kMaxDescriptionChars = 500;\n\n        public bool RevisionActionsEnabled\n        {\n            set\n            {\n                m_Button.SetEnabled(value);\n            }\n        }\n\n        public DateTime timeStamp\n        {\n            get { return m_TimeStamp; }\n        }\n\n        public CollabHistoryItem(RevisionData data)\n        {\n            m_RevisionId = data.id;\n            m_TimeStamp = data.timeStamp;\n            name = \"HistoryItem\";\n            m_ActionsTray = new VisualElement {name = \"HistoryItemActionsTray\"};\n            m_ProgressSpinner = new HistoryProgressSpinner();\n            m_Details = new VisualElement {name = \"HistoryDetail\"};\n            var author = new Label(data.authorName) {name = \"Author\"};\n            m_TimeAgo = new Label(TimeAgo.GetString(m_TimeStamp));\n            m_FullDescription = data.comment;\n            var shouldTruncate = ShouldTruncateDescription(m_FullDescription);\n            if (shouldTruncate)\n            {\n                m_Description = new Label(GetTruncatedDescription(m_FullDescription));\n            }\n            else\n            {\n                m_Description = new Label(m_FullDescription);\n            }\n            m_Description.name = \"RevisionDescription\";\n            var dropdown = new CollabHistoryDropDown(data.changes, data.changesTotal, data.changesTruncated, data.id);\n            if (data.current)\n            {\n                m_Button = new Button(Restore) {name = \"ActionButton\", text = \"Restore\"};\n            }\n            else if (data.obtained)\n            {\n                m_Button = new Button(GoBackTo) {name = \"ActionButton\", text = \"Go back to...\"};\n            }\n            else\n            {\n                m_Button = new Button(UpdateTo) {name = \"ActionButton\", text = \"Update\"};\n            }\n            m_Button.SetEnabled(data.enabled);\n            m_ProgressSpinner.ProgressEnabled = data.inProgress;\n\n            m_ActionsTray.Add(m_ProgressSpinner);\n            m_ActionsTray.Add(m_Button);\n\n            m_Details.Add(author);\n            m_Details.Add(m_TimeAgo);\n            m_Details.Add(m_Description);\n\n            if (shouldTruncate)\n            {\n                m_ExpandCollapseButton = new Button(ToggleDescription) { name = \"ToggleDescription\", text = \"Show More\" };\n                m_Details.Add(m_ExpandCollapseButton);\n            }\n\n            if (data.buildState != BuildState.None)\n            {\n                BuildStatusButton buildButton;\n                if (data.buildState == BuildState.Configure)\n                    buildButton = new BuildStatusButton(ShowServicePage);\n                else\n                    buildButton = new BuildStatusButton(ShowBuildForCommit, data.buildState, data.buildFailures);\n\n                m_Details.Add(buildButton);\n            }\n\n            m_Details.Add(m_ActionsTray);\n            m_Details.Add(dropdown);\n\n            Add(m_Details);\n\n            this.schedule.Execute(UpdateTimeAgo).Every(1000 * 20);\n        }\n\n        public static void SetUpCallbacks(RevisionAction Restore, RevisionAction GoBack, RevisionAction Update)\n        {\n            s_OnRestore = Restore;\n            s_OnGoBack = GoBack;\n            s_OnUpdate = Update;\n        }\n\n        public void SetInProgressStatus(string revisionIdInProgress)\n        {\n            if (String.IsNullOrEmpty(revisionIdInProgress))\n            {\n                m_Button.SetEnabled(true);\n                m_ProgressSpinner.ProgressEnabled = false;\n            }\n            else\n            {\n                m_Button.SetEnabled(false);\n                if (m_RevisionId.Equals(revisionIdInProgress))\n                {\n                    m_ProgressSpinner.ProgressEnabled = true;\n                }\n            }\n        }\n\n        void ShowBuildForCommit()\n        {\n            CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, \"ShowBuild\");\n            if (s_OnShowBuild != null)\n            {\n                s_OnShowBuild(m_RevisionId);\n            }\n        }\n\n        void ShowServicePage()\n        {\n            CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, \"ShowServices\");\n            if (s_OnShowServices != null)\n            {\n                s_OnShowServices();\n            }\n        }\n\n        void Restore()\n        {\n            CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, \"Restore\");\n            if (s_OnRestore != null)\n            {\n                s_OnRestore(m_RevisionId, false);\n            }\n        }\n\n        void GoBackTo()\n        {\n            CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, \"GoBackTo\");\n            if (s_OnGoBack != null)\n            {\n                s_OnGoBack(m_RevisionId, false);\n            }\n        }\n\n        void UpdateTo()\n        {\n            CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, \"Update\");\n            if (s_OnUpdate != null)\n            {\n                s_OnUpdate(m_RevisionId, true);\n            }\n        }\n\n        void UpdateTimeAgo()\n        {\n            m_TimeAgo.text = TimeAgo.GetString(m_TimeStamp);\n        }\n\n        bool ShouldTruncateDescription(string description)\n        {\n            return description.Contains(Environment.NewLine) || description.Length > kMaxDescriptionChars;\n        }\n\n        string GetTruncatedDescription(string description)\n        {\n            string result = description.Contains(Environment.NewLine) ?\n                description.Substring(0, description.IndexOf(Environment.NewLine)) : description;\n            if (result.Length > kMaxDescriptionChars)\n            {\n                result = result.Substring(0, kMaxDescriptionChars) + \"...\";\n            }\n            return result;\n        }\n\n        void ToggleDescription()\n        {\n            if (m_Expanded)\n            {\n                CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, \"CollapseDescription\");\n                m_Expanded = false;\n                m_ExpandCollapseButton.text = \"Show More\";\n                m_Description.text = GetTruncatedDescription(m_FullDescription);\n            }\n            else\n            {\n                CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, \"ExpandDescription\");\n                m_Expanded = true;\n                m_ExpandCollapseButton.text = \"Show Less\";\n                m_Description.text = m_FullDescription;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryItem.cs.meta",
    "content": "fileFormatVersion: 2\nguid: c4c1445ee948a4124bfa9fb818a17e36\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryItemFactory.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing UnityEditor.Collaboration;\nusing UnityEngine;\n\n#if UNITY_2019_1_OR_NEWER\nusing UnityEngine.UIElements;\n#else\nusing UnityEngine.Experimental.UIElements;\nusing UnityEngine.Experimental.UIElements.StyleEnums;\n#endif\n\n\nnamespace UnityEditor.Collaboration\n{\n    internal class CollabHistoryItemFactory : ICollabHistoryItemFactory\n    {\n        const int k_MaxChangesPerRevision = 10;\n\n        public IEnumerable<RevisionData> GenerateElements(IEnumerable<Revision> revisions, int totalRevisions, int startIndex, string tipRev, string inProgressRevision, bool revisionActionsEnabled, bool buildServiceEnabled, string currentUser)\n        {\n            int index = startIndex;\n\n            foreach (var rev in revisions)\n            {\n                index++;\n                var current = rev.revisionID == tipRev;\n\n                // Calculate build status\n                BuildState buildState = BuildState.None;\n                int buildFailures = 0;\n                if (rev.buildStatuses != null && rev.buildStatuses.Length > 0)\n                {\n                    bool inProgress = false;\n                    foreach (CloudBuildStatus buildStatus in rev.buildStatuses)\n                    {\n                        if (buildStatus.complete)\n                        {\n                            if (!buildStatus.success)\n                            {\n                                buildFailures++;\n                            }\n                        }\n                        else\n                        {\n                            inProgress = true;\n                            break;\n                        }\n                    }\n\n                    if (inProgress)\n                    {\n                        buildState = BuildState.InProgress;\n                    }\n                    else if (buildFailures > 0)\n                    {\n                        buildState = BuildState.Failed;\n                    }\n                    else\n                    {\n                        buildState = BuildState.Success;\n                    }\n                }\n                else if (current && !buildServiceEnabled)\n                {\n                    buildState = BuildState.Configure;\n                }\n\n                // Calculate the number of changes performed on files and folders (not meta files)\n                var paths = new Dictionary<string, ChangeData>();\n                foreach (ChangeAction change in rev.entries)\n                {\n                    if (change.path.EndsWith(\".meta\"))\n                    {\n                        var path = change.path.Substring(0, change.path.Length - 5);\n                        // Actions taken on meta files are secondary to any actions taken on the main file\n                        if (!paths.ContainsKey(path))\n                            paths[path] = new ChangeData() {path = path, action = change.action};\n                    }\n                    else\n                    {\n                        paths[change.path] = new ChangeData() {path = change.path, action = change.action};\n                    }\n                }\n\n                var displayName = (rev.author != currentUser) ? rev.authorName : \"You\";\n\n                var item = new RevisionData\n                {\n                    id = rev.revisionID,\n                    index = totalRevisions - index + 1,\n                    timeStamp = TimeStampToDateTime(rev.timeStamp),\n                    authorName = displayName,\n                    comment = rev.comment,\n\n                    obtained = rev.isObtained,\n                    current = current,\n                    inProgress = (rev.revisionID == inProgressRevision),\n                    enabled = revisionActionsEnabled,\n\n                    buildState = buildState,\n                    buildFailures = buildFailures,\n\n                    changes = paths.Values.Take(k_MaxChangesPerRevision).ToList(),\n                    changesTotal = paths.Values.Count,\n                    changesTruncated = paths.Values.Count > k_MaxChangesPerRevision,\n                };\n\n                yield return item;\n            }\n        }\n\n        private static DateTime TimeStampToDateTime(double timeStamp)\n        {\n            DateTime dateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);\n            dateTime = dateTime.AddSeconds(timeStamp).ToLocalTime();\n            return dateTime;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryItemFactory.cs.meta",
    "content": "fileFormatVersion: 2\nguid: fc46f91ea1e8e4ca2ab693fef9156dbe\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryRevisionLine.cs",
    "content": "using System;\nusing UnityEditor;\nusing UnityEditor.Collaboration;\nusing UnityEngine;\n\n#if UNITY_2019_1_OR_NEWER\nusing UnityEngine.UIElements;\n#else\nusing UnityEngine.Experimental.UIElements;\n#endif\n\nnamespace UnityEditor.Collaboration\n{\n    internal class CollabHistoryRevisionLine : VisualElement\n    {\n        public CollabHistoryRevisionLine(int number)\n        {\n            AddNumber(number);\n            AddLine(\"topLine\");\n            AddLine(\"bottomLine\");\n            AddIndicator();\n        }\n\n        public CollabHistoryRevisionLine(DateTime date, bool isFullDateObtained)\n        {\n            AddLine(isFullDateObtained ? \"obtainedDateLine\" : \"absentDateLine\");\n            AddHeader(GetFormattedHeader(date));\n            AddToClassList(\"revisionLineHeader\");\n        }\n\n        private void AddHeader(string content)\n        {\n            Add(new Label\n            {\n                text = content\n            });\n        }\n\n        private void AddIndicator()\n        {\n            Add(new VisualElement\n            {\n                name = \"RevisionIndicator\"\n            });\n        }\n\n        private void AddLine(string className = null)\n        {\n            var line = new VisualElement\n            {\n                name = \"RevisionLine\"\n            };\n            if (!String.IsNullOrEmpty(className))\n            {\n                line.AddToClassList(className);\n            }\n            Add(line);\n        }\n\n        private void AddNumber(int number)\n        {\n            Add(new Label\n            {\n                text = number.ToString(),\n                name = \"RevisionIndex\"\n            });\n        }\n\n        private string GetFormattedHeader(DateTime date)\n        {\n            string result = \"Commits on \" + date.ToString(\"MMM d\");\n            switch (date.Day)\n            {\n                case 1:\n                case 21:\n                case 31:\n                    result += \"st\";\n                    break;\n                case 2:\n                case 22:\n                    result += \"nd\";\n                    break;\n                case 3:\n                case 23:\n                    result += \"rd\";\n                    break;\n                default:\n                    result += \"th\";\n                    break;\n            }\n            return result;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryRevisionLine.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 3c737f7a9d78541d1ab25f28f045dd32\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/HistoryProgressSpinner.cs",
    "content": "using UnityEngine;\n\n#if UNITY_2019_1_OR_NEWER\nusing UnityEngine.UIElements;\n#else\nusing UnityEngine.Experimental.UIElements;\n#endif\n\nnamespace UnityEditor.Collaboration\n{\n    internal class HistoryProgressSpinner : Image\n    {\n        private readonly Texture2D[] m_StatusWheelTextures;\n        private bool m_ProgressEnabled;\n        private IVisualElementScheduledItem m_Animation;\n\n        public bool ProgressEnabled\n        {\n            set\n            {\n                if (m_ProgressEnabled == value)\n                    return;\n\n                m_ProgressEnabled = value;\n                visible = value;\n\n\n                if (value)\n                {\n                    if (m_Animation == null)\n                    {\n                        m_Animation = this.schedule.Execute(AnimateProgress).Every(33);\n                    }\n                    else\n                    {\n                        m_Animation.Resume();\n                    }\n                }\n                else\n                {\n                    if (m_Animation != null)\n                    {\n                        m_Animation.Pause();\n                    }\n                }\n            }\n        }\n\n        public HistoryProgressSpinner()\n        {\n            m_StatusWheelTextures = new Texture2D[12];\n            for (int i = 0; i < 12; i++)\n            {\n                m_StatusWheelTextures[i] = EditorGUIUtility.LoadIcon(\"WaitSpin\" + i.ToString(\"00\"));\n            }\n            image = m_StatusWheelTextures[0];\n            style.width = m_StatusWheelTextures[0].width;\n            style.height = m_StatusWheelTextures[0].height;\n            visible = false;\n        }\n\n        private void AnimateProgress(TimerState obj)\n        {\n            int frame = (int)Mathf.Repeat(Time.realtimeSinceStartup * 10, 11.99f);\n            image = m_StatusWheelTextures[frame];\n            MarkDirtyRepaint();\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/HistoryProgressSpinner.cs.meta",
    "content": "fileFormatVersion: 2\nguid: cf6aca931950a4a6a886e214e9e649c4\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/ICollabHistoryItemFactory.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing UnityEditor.Collaboration;\n\n#if UNITY_2019_1_OR_NEWER\nusing UnityEngine.UIElements;\n#else\nusing UnityEngine.Experimental.UIElements;\n#endif\n\nnamespace UnityEditor.Collaboration\n{\n    internal interface ICollabHistoryItemFactory\n    {\n        IEnumerable<RevisionData> GenerateElements(IEnumerable<Revision> revsRevisions, int mTotalRevisions, int startIndex, string tipRev, string inProgressRevision, bool revisionActionsEnabled, bool buildServiceEnabled, string currentUser);\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/ICollabHistoryItemFactory.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 821f5482c5a3f4389885f4432433f56f\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/PagedListView.cs",
    "content": "using System;\nusing System.Collections.Generic;\n\n#if UNITY_2019_1_OR_NEWER\nusing UnityEngine.UIElements;\n#else\nusing UnityEngine.Experimental.UIElements;\nusing UnityEngine.Experimental.UIElements.StyleEnums;\n#endif\n\nnamespace UnityEditor.Collaboration\n{\n    internal interface IPagerData\n    {\n        int curPage { get; }\n        int totalPages { get; }\n        PageChangeAction OnPageChanged { get; }\n    }\n\n    internal class PagerElement : VisualElement\n    {\n        IPagerData m_Data;\n        readonly Label m_PageText;\n        readonly Button m_DownButton;\n        readonly Button m_UpButton;\n\n        public PagerElement(IPagerData dataSource)\n        {\n            m_Data = dataSource;\n\n            this.style.flexDirection = FlexDirection.Row;\n            this.style.alignSelf = Align.Center;\n\n            Add(m_DownButton = new Button(OnPageDownClicked) {text = \"\\u25c5 Newer\"});\n            m_DownButton.AddToClassList(\"PagerDown\");\n\n            m_PageText = new Label();\n            m_PageText.AddToClassList(\"PagerLabel\");\n            Add(m_PageText);\n\n            Add(m_UpButton = new Button(OnPageUpClicked) {text = \"Older \\u25bb\"});\n            m_UpButton.AddToClassList(\"PagerUp\");\n\n            UpdateControls();\n        }\n\n        void OnPageDownClicked()\n        {\n            CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, \"NewerPage\");\n            m_Data.OnPageChanged(m_Data.curPage - 1);\n        }\n\n        void OnPageUpClicked()\n        {\n            CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, \"OlderPage\");\n            m_Data.OnPageChanged(m_Data.curPage + 1);\n        }\n\n        public void Refresh()\n        {\n            UpdateControls();\n        }\n\n        void UpdateControls()\n        {\n            var curPage = m_Data.curPage;\n            var totalPages = m_Data.totalPages;\n\n            m_PageText.text = (curPage + 1) + \" / \" + totalPages;\n            m_DownButton.SetEnabled(curPage > 0);\n            m_UpButton.SetEnabled(curPage < totalPages - 1);\n        }\n    }\n\n    internal enum PagerLocation\n    {\n        Top,\n        Bottom,\n    }\n\n    internal class PagedListView : VisualElement, IPagerData\n    {\n        public const int DefaultItemsPerPage = 10;\n\n        readonly VisualElement m_ItemContainer;\n        readonly PagerElement m_PagerTop, m_PagerBottom;\n        int m_PageSize = DefaultItemsPerPage;\n        IEnumerable<VisualElement> m_Items;\n        int m_TotalItems;\n        int m_CurPage;\n\n        public int pageSize\n        {\n            set { m_PageSize = value; }\n        }\n\n        public IEnumerable<VisualElement> items\n        {\n            set\n            {\n                m_Items = value;\n                LayoutItems();\n            }\n        }\n\n        public int totalItems\n        {\n            set\n            {\n                if (m_TotalItems == value)\n                    return;\n\n                m_TotalItems = value;\n                UpdatePager();\n            }\n        }\n\n        public PageChangeAction OnPageChanged { get; set; }\n\n        public PagedListView()\n        {\n            m_PagerTop = new PagerElement(this);\n\n            m_ItemContainer = new VisualElement()\n            {\n                name = \"PagerItems\",\n            };\n            Add(m_ItemContainer);\n            m_Items = new List<VisualElement>();\n\n            m_PagerBottom = new PagerElement(this);\n        }\n\n        void LayoutItems()\n        {\n            m_ItemContainer.Clear();\n            foreach (var item in m_Items)\n            {\n                m_ItemContainer.Add(item);\n            }\n        }\n\n        void UpdatePager()\n        {\n            if (m_PagerTop.parent != this && totalPages > 1 && curPage > 0)\n                Insert(0, m_PagerTop);\n            if (m_PagerTop.parent == this && (totalPages <= 1 || curPage == 0))\n                Remove(m_PagerTop);\n\n            if (m_PagerBottom.parent != this && totalPages > 1)\n                Add(m_PagerBottom);\n            if (m_PagerBottom.parent == this && totalPages <= 1)\n                Remove(m_PagerBottom);\n\n            m_PagerTop.Refresh();\n            m_PagerBottom.Refresh();\n        }\n\n        int pageCount\n        {\n            get\n            {\n                var pages = m_TotalItems / m_PageSize;\n                if (m_TotalItems % m_PageSize > 0)\n                    pages++;\n\n                return pages;\n            }\n        }\n\n        public int curPage\n        {\n            get { return m_CurPage; }\n            set\n            {\n                m_CurPage = value;\n                UpdatePager();\n            }\n        }\n\n        public int totalPages\n        {\n            get\n            {\n                var extraPage = 0;\n                if (m_TotalItems % m_PageSize > 0)\n                    extraPage = 1;\n                return m_TotalItems / m_PageSize + extraPage;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/PagedListView.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 50de529b6a28f4a7093045e08810a5df\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/StatusView.cs",
    "content": "using System;\nusing UnityEditor;\nusing UnityEngine;\n\n#if UNITY_2019_1_OR_NEWER\nusing UnityEngine.UIElements;\n#else\nusing UnityEngine.Experimental.UIElements;\nusing UnityEngine.Experimental.UIElements.StyleEnums;\n#endif\n\nnamespace UnityEditor.Collaboration\n{\n    internal class StatusView : VisualElement\n    {\n        Image m_Image;\n        Label m_Message;\n        Button m_Button;\n        Action m_Callback;\n\n        public Texture icon\n        {\n            get { return m_Image.image; }\n            set\n            {\n                m_Image.image = value;\n                m_Image.visible = value != null;\n                // Until \"display: hidden\" is added, this is the only way to hide an element\n                m_Image.style.height = value != null ? 150 : 0;\n            }\n        }\n\n        public string message\n        {\n            get { return m_Message.text; }\n            set\n            {\n                m_Message.text = value;\n                m_Message.visible = value != null;\n            }\n        }\n\n        public string buttonText\n        {\n            get { return m_Button.text; }\n            set\n            {\n                m_Button.text = value;\n                UpdateButton();\n            }\n        }\n\n        public Action callback\n        {\n            get { return m_Callback; }\n            set\n            {\n                m_Callback = value;\n                UpdateButton();\n            }\n        }\n\n        public StatusView()\n        {\n            name = \"StatusView\";\n\n            this.StretchToParentSize();\n\n            m_Image = new Image() { name = \"StatusIcon\", visible = false, style = { height = 0f }};\n            m_Message = new Label() { name = \"StatusMessage\", visible = false};\n            m_Button = new Button(InternalCallaback) { name = \"StatusButton\", visible = false};\n\n            Add(m_Image);\n            Add(m_Message);\n            Add(m_Button);\n        }\n\n        private void UpdateButton()\n        {\n            m_Button.visible = m_Button.text != null && m_Callback != null;\n        }\n\n        private void InternalCallaback()\n        {\n            m_Callback();\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/StatusView.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 08e9894bdf0834710b22d3c0aa245ac0\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views.meta",
    "content": "fileFormatVersion: 2\nguid: fd0a39b4d296d4d509b4f1dbd08d0630\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab.meta",
    "content": "fileFormatVersion: 2\nguid: c18cb9388313e4287ad5895ee735c47d\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryCommon.uss",
    "content": ".unity-button {\n    min-height:0;\n    -unity-text-align:middle-center;\n    margin-left:4px;\n    margin-top:3px;\n    margin-right:4px;\n    margin-bottom:3px;\n    border-left-width:6px;\n    border-top-width:4px;\n    border-right-width:6px;\n    border-bottom-width:4px;\n    padding-left:6px;\n    padding-top:2px;\n    padding-right:6px;\n    padding-bottom:3px;\n}\n\n.unity-label {\n  overflow: hidden;\n    margin-left:4px;\n    margin-top:2px;\n    margin-right:4px;\n    margin-bottom:2px;\n    padding-left:2px;\n    padding-top:1px;\n    min-height: 0;\n}\n\n#HistoryContainer {\n  flex: 1 0 0;\n}\n\n#HistoryItem {\n  flex: 1 0 0;\n  flex-direction: row;\n}\n\n#HistoryDetail {\n  margin-top: 10px;\n  margin-left: 10px;\n  margin-bottom: 10px;\n  margin-right: 10px;\n  padding-top: 4px;\n  flex: 1 0 0;\n}\n\n#Author {\n  -unity-font-style: bold;\n  font-size: 12px;\n}\n\n#HistoryDetail > Button {\n  align-self: flex-end;\n}\n\nCollabHistoryRevisionLine {\n  width: 40px;\n}\n\n#RevisionLine {\n  flex: 1 0 0;\n  margin-left: 35px;\n  width: 1.5px;\n}\n\n#RevisionLine.topLine {\n  height: 20px;\n  flex: 0 0 auto;\n}\n\n#RevisionLine.absentDateLine {\n  background-color: #797676;\n}\n\n.absentRevision #RevisionLine {\n  background-color: #797676;\n}\n\n.currentRevision #RevisionLine.topLine {\n  background-color: #797676;\n}\n\n#RevisionIndex {\n  position: absolute;\n  min-width: 23px;\n  -unity-text-align: middle-right;\n  top: 15.8px;\n  font-size: 9px;\n}\n\n#RevisionIndicator {\n  position: absolute;\n  background-color: #000;\n  border-radius: 3px;\n  width: 8px;\n  height: 8px;\n  border-bottom-width: 2px;\n  border-left-width: 2px;\n  border-right-width: 2px;\n  border-top-width: 2px;\n  top: 20px;\n  left: 32px;\n}\n\n.revisionLineHeader {\n  width: 200px;\n  height: 20px;\n}\n\n.revisionLineHeader > .unity-label {\n  position: absolute;\n  margin-left: 47px;\n  margin-top: 3px;\n}\n\n#PagerItems {\n  flex-direction: column;\n}\n\nPagerElement > .unity-label {\n  margin-top: 8px;\n}\n\n.absentRevision #RevisionIndicator {\n  border-color: #797676;\n}\n\n.absentRevision #RevisionIndex {\n  color: #797676;\n}\n\n.currentRevision #HistoryDetail {\n  border-top-width: 2px;\n}\n\n#HistoryItem #RevisionDescription {\n  white-space: normal;\n}\n\n#HistoryItem #ToggleDescription {\n  align-self: flex-start;\n  padding-top: 0;\n  padding-left: 0;\n  padding-right: 0;\n  padding-bottom: 2px;\n}\n\n#HistoryItem #ActionButton {\n  position: absolute;\n  right: 0;\n}\n\n#HistoryItem #BuildIcon {\n  width: 16px;\n  height: 13px;\n}\n\n#HistoryItemActionsTray {\n  flex: 1 0 0;\n  flex-direction: row;\n  align-items: center;\n  height: 38px;\n  margin-left: 10px;\n  margin-right: 10px;\n}\n\nCollabHistoryDropDown {\n  border-top-width: 1px;\n}\n\nCollabHistoryDropDown > .unity-label {\n  padding-top: 10px;\n  padding-bottom: 10px;\n}\n\nCollabHistoryDropDownItem {\n  flex-direction: row;\n  border-top-width: 1px;\n  overflow: hidden;\n}\n\n#FileIcon {\n  align-self: center;\n  width: 26px;\n  height: 26px;\n}\n\n#FileName {\n  -unity-font-style: bold;\n  padding-bottom: 0;\n  margin-bottom: 0;\n}\n\n#FileIcon {\n  padding-top: 0;\n  margin-top: 0;\n}\n\n#ErrorBar {\n    height: 24px;\n    background-color: #ff0000;\n    color: #000;\n    font-size: 12px;\n}\n\n#ErrorBar > #CloseButton {\n    position: absolute;\n    right: 0;\n    top: 0;\n    width: 24px;\n    height: 24px;\n    color: #000;\n    font-size: 18px;\n    -unity-font-style: bold;\n}\n\n#StatusView {\n    flex-direction: column;\n    justify-content: center;\n    align-self: center;\n    align-items: center;\n    flex: 1 0 0;\n}\n\n#StatusView > #StatusIcon {\n    width: 115px;\n    height: 150px;\n}\n\n#StatusView > #StatusMessage {\n    font-size: 22px;\n    width: 230px;\n    white-space: normal;\n    -unity-text-align: middle-center;\n}\n\n#StatusView > #StatusButton {\n    font-size: 12px;\n    margin-top: 20px;\n    background-image: none;\n    width: 108px;\n    height: 29px;\n}\n\nBuildStatusButton.unity-button {\n    flex-direction: row;\n    align-self: flex-end;\n    align-items: center;\n    margin-right: 10px;\n    padding-left:0;\n    padding-top:0;\n    padding-right:0;\n    padding-bottom:0;\n}\n\nBuildStatusButton.unity-button .unity-label {\n    padding-left: 2px;\n}\n\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryCommon.uss.meta",
    "content": "fileFormatVersion: 2\nguid: 3a2d94c8977984b67984caeff9fa666e\nScriptedImporter:\n  fileIDToRecycleName:\n    11400000: stylesheet\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n  script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryDark.uss",
    "content": "#HistoryContainer {\n  background-color: #292929;\n}\n\n.obtainedRevision #HistoryDetail {\n  background-color: #333;\n}\n\n.absentRevision #HistoryDetail {\n  background-color: #595959;\n}\n\n#StatusView {\n  background-color: #292929;\n}\n\n#StatusView > #StatusMessage {\n    color: #959995;\n}\n\nBuildStatusButton.unity-button {\n    color: #B4B4B4;\n    background-image: resource(\"Builtin Skins/DarkSkin/Images/btn.png\");\n}\n\nBuildStatusButton.unity-button:hover {\n    color: #FFF;\n}\n\nBuildStatusButton.unity-button:hover:active {\n    background-image: resource(\"Builtin Skins/DarkSkin/Images/btn act.png\");\n}\n\nBuildStatusButton.unity-button:checked {\n    color: #F0F0F0;\n    background-image: resource(\"Builtin Skins/DarkSkin/Images/btn on.png\");\n}\n\nBuildStatusButton.unity-button:hover:checked {\n    color: #FFF;\n}\n\nBuildStatusButton.unity-button:hover:active:checked {\n    background-image: resource(\"Builtin Skins/DarkSkin/Images/btn onact.png\");\n}\n\nBuildStatusButton.unity-button:focus:checked {\n    background-image: resource(\"Builtin Skins/DarkSkin/Images/btn on focus.png\");\n}\n\nCollabHistoryDropDown {\n  border-color: #292929;\n}\n\nCollabHistoryDropDownItem {\n  border-color: #292929;\n}\n\n#RevisionLine.obtainedDateLine {\n  background-color: #0cb4cc;\n}\n\n.obtainedRevision #RevisionLine {\n  background-color: #0cb4cc;\n}\n\n#RevisionIndex {\n  color: #0cb4cc;\n}\n\n#RevisionIndicator {\n  border-color: #0cb4cc;\n}\n\n.currentRevision #RevisionIndicator {\n  background-color: #0cb4cc;\n}\n\n.currentRevision #HistoryDetail {\n  border-color: #0cb4cc;\n}\n\n#StatusView > #StatusButton {\n    background-color: #0cb4cc;\n    border-color: #0cb4cc;\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryDark.uss.meta",
    "content": "fileFormatVersion: 2\nguid: 70d4d75a2877243758b0750cbc75b6eb\nScriptedImporter:\n  fileIDToRecycleName:\n    11400000: stylesheet\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n  script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryLight.uss",
    "content": "#HistoryContainer {\n  background-color: #a2a2a2;\n}\n\n.obtainedRevision #HistoryDetail {\n  background-color: #c2c2c2;\n}\n\n.absentRevision #HistoryDetail {\n  background-color: #dedede;\n}\n\n#StatusView {\n  background-color: #a2a2a3;\n}\n\n#StatusView > #StatusMessage {\n  color: #000;\n}\n\nBuildStatusButton.unity-button {\n  color: #111;\n  background-image: resource(\"Builtin Skins/LightSkin/Images/btn.png\");\n}\n\nBuildStatusButton.unity-button:hover {\n  color: #000;\n}\n\nBuildStatusButton.unity-button:hover:active {\n  background-image: resource(\"Builtin Skins/LightSkin/Images/btn act.png\");\n}\n\nBuildStatusButton.unity-button:checked {\n  color: #F0F0F0;\n  background-image: resource(\"Builtin Skins/LightSkin/Images/btn on.png\");\n}\n\nBuildStatusButton.unity-button:hover:checked {\n  color: #000;\n}\n\nBuildStatusButton.unity-button:hover:active:checked {\n  background-image: resource(\"Builtin Skins/LightSkin/Images/btn onact.png\");\n}\n\nBuildStatusButton.unity-button:focus:checked {\n  background-image: resource(\"Builtin Skins/LightSkin/Images/btn on focus.png\");\n}\n\nCollabHistoryDropDown {\n  border-color: #a2a2a2;\n}\n\nCollabHistoryDropDownItem {\n  border-color: #a2a2a2;\n}\n\n#RevisionLine.obtainedDateLine {\n  background-color: #018d98;\n}\n\n.obtainedRevision #RevisionLine {\n  background-color: #018d98;\n}\n\n#RevisionIndex {\n  color: #018d98;\n}\n\n#RevisionIndicator {\n  border-color: #018d98;\n}\n\n.currentRevision #RevisionIndicator {\n  background-color: #018d98;\n}\n\n.currentRevision #HistoryDetail {\n  border-color: #018d98;\n}\n\n#StatusView > #StatusButton {\n    background-color: #018d98;\n    border-color: #018d98;\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryLight.uss.meta",
    "content": "fileFormatVersion: 2\nguid: b52bde26a83564960bcb90217f72b910\nScriptedImporter:\n  fileIDToRecycleName:\n    11400000: stylesheet\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n  script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles.meta",
    "content": "fileFormatVersion: 2\nguid: 6b1ae1e78552c459d9ce27048ff51c7f\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources.meta",
    "content": "fileFormatVersion: 2\nguid: a6ab6fd2b91214e8a9c8ec2224a528de\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Unity.CollabProxy.Editor.asmdef",
    "content": "{\n    \"name\": \"Unity.CollabProxy.Editor\",\n    \"includePlatforms\": [\n        \"Editor\"\n    ],\n    \"excludePlatforms\": []\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Unity.CollabProxy.Editor.asmdef.meta",
    "content": "fileFormatVersion: 2\nguid: 645165c8169474bfbbeb8fb0bcfd26f5\nAssemblyDefinitionImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor.meta",
    "content": "fileFormatVersion: 2\nguid: d31e5d760880a4e52a3a75322481d0d2\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/LICENSE.md",
    "content": "**Unity Companion Package License v1.0 (\"_License_\")**\n\nCopyright © 2017 Unity Technologies ApS (\"**_Unity_**\")\n\nUnity hereby grants to you a worldwide, non-exclusive, no-charge, and royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute the software that is made available with this License (\"**_Software_**\"), subject to the following terms and conditions:\n\n1. *Unity Companion Use Only*. Exercise of the license granted herein is limited to exercise for the creation, use, and/or distribution of applications, software, or other content pursuant to a valid Unity development engine software license (\"**_Engine License_**\"). That means while use of the Software is not limited to use in the software licensed under the Engine License, the Software may not be used for any purpose other than the creation, use, and/or distribution of Engine License-dependent applications, software, or other content. No other exercise of the license granted herein is permitted.\n\n1. *No Modification of Engine License*. Neither this License nor any exercise of the license granted herein modifies the Engine License in any way.\n\n1. *Ownership & Grant Back to You*.\n\n    3.1. You own your content. In this License, \"derivative works\" means derivatives of the Software itself--works derived only from the Software by you under this License (for example, modifying the code of the Software itself to improve its efficacy); “derivative works” of the Software do not include, for example, games, apps, or content that you create using the Software. You keep all right, title, and interest to your own content.\n\n    3.2. Unity owns its content. While you keep all right, title, and interest to your own content per the above, as between Unity and you, Unity will own all right, title, and interest to all intellectual property rights (including patent, trademark, and copyright) in the Software and derivative works of the Software, and you hereby assign and agree to assign all such rights in those derivative works to Unity.\n\n    3.3. You have a license to those derivative works. Subject to this License, Unity grants to you the same worldwide, non-exclusive, no-charge, and royalty-free copyright license to derivative works of the Software you create as is granted to you for the Software under this License.\n\n1. *Trademarks*. You are not granted any right or license under this License to use any trademarks, service marks, trade names, products names, or branding of Unity or its affiliates (\"**_Trademarks_**\"). Descriptive uses of Trademarks are permitted; see, for example, Unity’s Branding Usage Guidelines at [https://unity3d.com/public-relations/brand](https://unity3d.com/public-relations/brand).\n\n1. *Notices & Third-Party Rights*. This License, including the copyright notice above, must be provided in all substantial portions of the Software and derivative works thereof (or, if that is impracticable, in any other location where such notices are customarily placed). Further, if the Software is accompanied by a Unity \"third-party notices\" or similar file, you acknowledge and agree that software identified in that file is governed by those separate license terms.\n\n1. *DISCLAIMER, LIMITATION OF LIABILITY*. THE SOFTWARE AND ANY DERIVATIVE WORKS THEREOF IS PROVIDED ON AN \"AS IS\" BASIS, AND IS PROVIDED WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND/OR NONINFRINGEMENT. IN NO EVENT SHALL ANY COPYRIGHT HOLDER OR AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES (WHETHER DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL, INCLUDING PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, LOSS OF USE, DATA, OR PROFITS, AND BUSINESS INTERRUPTION), OR OTHER LIABILITY WHATSOEVER, WHETHER IN AN ACTION OF CONTRACT, TORT, OR OTHERWISE, ARISING FROM OR OUT OF, OR IN CONNECTION WITH, THE SOFTWARE OR ANY DERIVATIVE WORKS THEREOF OR THE USE OF OR OTHER DEALINGS IN SAME, EVEN WHERE ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n1. *USE IS ACCEPTANCE and License Versions*. Your receipt and use of the Software constitutes your acceptance of this License and its terms and conditions. Software released by Unity under this License may be modified or updated and the License with it; upon any such modification or update, you will comply with the terms of the updated License for any use of any of the Software under the updated License.\n\n1. *Use in Compliance with Law and Termination*. Your exercise of the license granted herein will at all times be in compliance with applicable law and will not infringe any proprietary rights (including intellectual property rights); this License will terminate immediately on any breach by you of this License.\n\n1. *Severability*. If any provision of this License is held to be unenforceable or invalid, that provision will be enforced to the maximum extent possible and the other provisions will remain in full force and effect.\n\n1. *Governing Law and Venue*. This License is governed by and construed in accordance with the laws of Denmark, except for its conflict of laws rules; the United Nations Convention on Contracts for the International Sale of Goods will not apply. If you reside (or your principal place of business is) within the United States, you and Unity agree to submit to the personal and exclusive jurisdiction of and venue in the state and federal courts located in San Francisco County, California concerning any dispute arising out of this License (\"**_Dispute_**\"). If you reside (or your principal place of business is) outside the United States, you and Unity agree to submit to the personal and exclusive jurisdiction of and venue in the courts located in Copenhagen, Denmark concerning any Dispute.\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/LICENSE.md.meta",
    "content": "fileFormatVersion: 2\nguid: c754112a02f354a6696fa4f2b99e95a5\nTextScriptImporter:\n  externalObjects: {}\n  userData:\n  assetBundleName:\n  assetBundleVariant:\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/README.md",
    "content": "# Collab Proxy UPM Package\nThis is the packaged version of Collab, currently limited to containing the History and Toolbar windows, along with supporting classes.\n\n## Development\nCheck this repository out in your {$PROJECT}/Packages/ folder, under the name com.unity.collab-proxy. The classes will be built by Unity.\n\n## Testing\nIn order to run the tests, you will need to add this project to the testables key in your manifest.json - once you have done this, the tests will be picked up by the Unity Test Runner window.\n\n## Building\nYou may build this project using msbuild. The commands to do so can be seen under .gitlab-ci.yml.\n\n## Deploying\nGitlab will automatically build your project when you deploy. You can download the resulting artifact, which will be a dll, and place it in your Editor/bin/ folder. Open the package in Unity to generate the meta files, and then you will be able to publish.\n\nWe're currently looking into a way to avoid this manual process.\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/README.md.meta",
    "content": "fileFormatVersion: 2\nguid: ac281230df7b14becb40b3c479f1b429\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor/HistoryTests.cs",
    "content": "using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\nusing UnityEngine;\nusing UnityEditor.Collaboration;\nusing UnityEngine.TestTools;\nusing NUnit.Framework;\n\nnamespace UnityEditor.Collaboration.Tests\n{\n    [TestFixture]\n    internal class HistoryTests\n    {\n        private TestHistoryWindow _window;\n        private TestRevisionsService _service;\n        private CollabHistoryPresenter _presenter;\n\n        [SetUp]\n        public void SetUp()\n        {\n            _window = new TestHistoryWindow();\n            _service = new TestRevisionsService();\n            _presenter = new CollabHistoryPresenter(_window, new CollabHistoryItemFactory(), _service);\n        }\n\n        [TearDown]\n        public void TearDown()\n        {\n        }\n\n        [Test]\n        public void CollabHistoryPresenter_OnUpdatePage__PropagatesRevisionResult()\n        {\n            _service.result = new RevisionsResult()\n            {\n                Revisions = new List<Revision>()\n                {\n                    new Revision(authorName: \"authorName\", comment: \"comment\", revisionID: \"revisionID\"),\n                }\n            };\n\n            _presenter.OnUpdatePage(0);\n            var item = _window.items.First();\n\n            Assert.AreEqual(\"revisionID\", item.id);\n            Assert.AreEqual(\"authorName\", item.authorName);\n            Assert.AreEqual(\"comment\", item.comment);\n        }\n\n        [Test]\n        public void CollabHistoryPresenter_OnUpdatePage__RevisionNumberingIsInOrder()\n        {\n            _service.result = new RevisionsResult()\n            {\n                RevisionsInRepo = 4,\n                Revisions = new List<Revision>()\n                {\n                    new Revision(revisionID: \"0\"),\n                    new Revision(revisionID: \"1\"),\n                    new Revision(revisionID: \"2\"),\n                    new Revision(revisionID: \"3\"),\n                }\n            };\n\n            _presenter.OnUpdatePage(0);\n            var items = _window.items.ToArray();\n\n            Assert.AreEqual(4, items[0].index);\n            Assert.AreEqual(3, items[1].index);\n            Assert.AreEqual(2, items[2].index);\n            Assert.AreEqual(1, items[3].index);\n        }\n\n        [Test]\n        public void CollabHistoryPresenter_OnUpdatePage__RevisionNumberingChangesForMorePages()\n        {\n            _service.result = new RevisionsResult()\n            {\n                RevisionsInRepo = 12,\n                Revisions = new List<Revision>()\n                {\n                    new Revision(revisionID: \"0\"),\n                    new Revision(revisionID: \"1\"),\n                    new Revision(revisionID: \"2\"),\n                    new Revision(revisionID: \"3\"),\n                    new Revision(revisionID: \"4\"),\n                }\n            };\n\n            _presenter.OnUpdatePage(1);\n            var items = _window.items.ToArray();\n\n            Assert.AreEqual(12, items[0].index);\n            Assert.AreEqual(11, items[1].index);\n            Assert.AreEqual(10, items[2].index);\n            Assert.AreEqual(9, items[3].index);\n            Assert.AreEqual(8, items[4].index);\n        }\n\n        [Test]\n        public void CollabHistoryPresenter_OnUpdatePage__ObtainedIsCalculated()\n        {\n            _service.result = new RevisionsResult()\n            {\n                Revisions = new List<Revision>()\n                {\n                    new Revision(isObtained: false),\n                    new Revision(isObtained: true),\n                }\n            };\n\n            _presenter.OnUpdatePage(0);\n            var items = _window.items.ToArray();\n\n            Assert.IsFalse(items[0].obtained);\n            Assert.IsTrue(items[1].obtained);\n        }\n\n        [Test]\n        public void CollabHistoryPresenter_OnUpdatePage__CurrentIsCalculated()\n        {\n            _service.result = new RevisionsResult()\n            {\n                Revisions = new List<Revision>()\n                {\n                    new Revision(revisionID: \"1\"),\n                    new Revision(revisionID: \"2\"),\n                    new Revision(revisionID: \"3\"),\n                }\n            };\n            _service.tipRevision = \"2\";\n\n            _presenter.OnUpdatePage(0);\n            var items = _window.items.ToArray();\n\n            Assert.AreEqual(false, items[0].current);\n            Assert.AreEqual(true, items[1].current);\n            Assert.AreEqual(false, items[2].current);\n        }\n\n        [Test]\n        public void CollabHistoryPresenter_OnUpdatePage__InProgressIsCalculated()\n        {\n            _service.result = new RevisionsResult()\n            {\n                Revisions = new List<Revision>()\n                {\n                    new Revision(revisionID: \"1\"),\n                    new Revision(revisionID: \"2\"),\n                    new Revision(revisionID: \"3\"),\n                }\n            };\n            _window.inProgressRevision = \"2\";\n\n            _presenter.OnUpdatePage(0);\n            var items = _window.items.ToArray();\n\n            Assert.IsFalse(items[0].inProgress);\n            Assert.IsTrue(items[1].inProgress);\n            Assert.IsFalse(items[2].inProgress);\n        }\n\n        [Test]\n        public void CollabHistoryPresenter_OnUpdatePage__EnabledIsCalculated()\n        {\n            _service.result = new RevisionsResult()\n            {\n                Revisions = new List<Revision>()\n                {\n                    new Revision(revisionID: \"0\"),\n                }\n            };\n            _window.revisionActionsEnabled = true;\n\n            _presenter.OnUpdatePage(0);\n            var item = _window.items.First();\n\n            Assert.AreEqual(true, item.enabled);\n        }\n\n        [Test]\n        public void CollabHistoryPresenter_OnUpdatePage__DisabledIsCalculated()\n        {\n            _service.result = new RevisionsResult()\n            {\n                Revisions = new List<Revision>()\n                {\n                    new Revision(revisionID: \"0\"),\n                }\n            };\n            _window.revisionActionsEnabled = false;\n\n            _presenter.OnUpdatePage(0);\n            var item = _window.items.First();\n\n            Assert.AreEqual(false, item.enabled);\n        }\n\n        [Test]\n        public void CollabHistoryPresenter_OnUpdatePage__BuildStateHasNoneWhenNotTip()\n        {\n            _service.result = new RevisionsResult()\n            {\n                Revisions = new List<Revision>()\n                {\n                    new Revision(revisionID: \"1\"),\n                }\n            };\n            _service.tipRevision = \"0\";\n            _presenter.BuildServiceEnabled = false;\n\n            _presenter.OnUpdatePage(0);\n            var item = _window.items.First();\n\n            Assert.AreEqual(BuildState.None, item.buildState);\n        }\n\n        [Test]\n        public void CollabHistoryPresenter_OnUpdatePage__BuildStateTipHasNoneWhenEnabled()\n        {\n            _service.result = new RevisionsResult()\n            {\n                Revisions = new List<Revision>()\n                {\n                    new Revision(revisionID: \"0\"),\n                }\n            };\n            _service.tipRevision = \"0\";\n            _presenter.BuildServiceEnabled = true;\n\n            _presenter.OnUpdatePage(0);\n            var item = _window.items.First();\n\n            Assert.AreEqual(BuildState.None, item.buildState);\n        }\n\n        [Test]\n        public void CollabHistoryPresenter_OnUpdatePage__BuildStateHasConfigureWhenTip()\n        {\n            _service.result = new RevisionsResult()\n            {\n                Revisions = new List<Revision>()\n                {\n                    new Revision(revisionID: \"0\"),\n                }\n            };\n            _service.tipRevision = \"0\";\n            _presenter.BuildServiceEnabled = false;\n\n            _presenter.OnUpdatePage(0);\n            var item = _window.items.First();\n\n            Assert.AreEqual(BuildState.Configure, item.buildState);\n        }\n\n        [Test]\n        public void CollabHistoryPresenter_OnUpdatePage__BuildStateHasConfigureWhenZeroBuildStatus()\n        {\n            _service.result = new RevisionsResult()\n            {\n                Revisions = new List<Revision>()\n                {\n                    new Revision(revisionID: \"0\"),\n                }\n            };\n            _service.tipRevision = \"0\";\n            _presenter.BuildServiceEnabled = false;\n\n            _presenter.OnUpdatePage(0);\n            var item = _window.items.First();\n\n            Assert.AreEqual(BuildState.Configure, item.buildState);\n        }\n\n        [Test]\n        public void CollabHistoryPresenter_OnUpdatePage__BuildStateHasNoneWhenZeroBuildStatuses()\n        {\n            _service.result = new RevisionsResult()\n            {\n                Revisions = new List<Revision>()\n                {\n                    new Revision(revisionID: \"0\"),\n                }\n            };\n            _service.tipRevision = \"0\";\n            _presenter.BuildServiceEnabled = true;\n\n            _presenter.OnUpdatePage(0);\n            var item = _window.items.First();\n\n            Assert.AreEqual(BuildState.None, item.buildState);\n        }\n\n        [Test]\n        public void CollabHistoryPresenter_OnUpdatePage__BuildStateHasSuccessWhenCompleteAndSucceeded()\n        {\n            _service.result = new RevisionsResult()\n            {\n                Revisions = new List<Revision>()\n                {\n                    new Revision\n                    (\n                        revisionID: \"0\",\n                        buildStatuses: new CloudBuildStatus[1]\n                    {\n                        new CloudBuildStatus(complete: true, success: true),\n                    }\n                    ),\n                }\n            };\n            _service.tipRevision = \"0\";\n            _presenter.BuildServiceEnabled = true;\n\n            _presenter.OnUpdatePage(0);\n            var item = _window.items.First();\n\n            Assert.AreEqual(BuildState.Success, item.buildState);\n        }\n\n        [Test]\n        public void CollabHistoryPresenter_OnUpdatePage__BuildStateHasInProgress()\n        {\n            _service.result = new RevisionsResult()\n            {\n                Revisions = new List<Revision>()\n                {\n                    new Revision\n                    (\n                        revisionID: \"0\",\n                        buildStatuses: new CloudBuildStatus[1]\n                    {\n                        new CloudBuildStatus(complete: false),\n                    }\n                    ),\n                }\n            };\n            _service.tipRevision = \"0\";\n            _presenter.BuildServiceEnabled = true;\n\n            _presenter.OnUpdatePage(0);\n            var item = _window.items.First();\n\n            Assert.AreEqual(BuildState.InProgress, item.buildState);\n        }\n\n        [Test]\n        public void CollabHistoryPresenter_OnUpdatePage__BuildStateHasFailure()\n        {\n            _service.result = new RevisionsResult()\n            {\n                Revisions = new List<Revision>()\n                {\n                    new Revision\n                    (\n                        revisionID: \"0\",\n                        buildStatuses: new CloudBuildStatus[1]\n                    {\n                        new CloudBuildStatus(complete: true, success: false),\n                    }\n                    ),\n                }\n            };\n            _service.tipRevision = \"0\";\n            _presenter.BuildServiceEnabled = true;\n\n            _presenter.OnUpdatePage(0);\n            var item = _window.items.First();\n\n            Assert.AreEqual(BuildState.Failed, item.buildState);\n        }\n\n        [Test]\n        public void CollabHistoryPresenter_OnUpdatePage__BuildStateHasFailureWhenAnyBuildsFail()\n        {\n            _service.result = new RevisionsResult()\n            {\n                Revisions = new List<Revision>()\n                {\n                    new Revision\n                    (\n                        revisionID: \"0\",\n                        buildStatuses: new CloudBuildStatus[3]\n                    {\n                        new CloudBuildStatus(complete: true, success: false),\n                        new CloudBuildStatus(complete: true, success: false),\n                        new CloudBuildStatus(complete: true, success: true),\n                    }\n                    ),\n                }\n            };\n            _service.tipRevision = \"0\";\n            _presenter.BuildServiceEnabled = true;\n\n            _presenter.OnUpdatePage(0);\n            var item = _window.items.First();\n\n            Assert.AreEqual(BuildState.Failed, item.buildState);\n        }\n\n        [Test]\n        public void CollabHistoryPresenter_OnUpdatePage__ChangesPropagateThrough()\n        {\n            _service.result = new RevisionsResult()\n            {\n                Revisions = new List<Revision>()\n                {\n                    new Revision(revisionID: \"0\", entries: GenerateChangeActions(3)),\n                }\n            };\n\n            _presenter.OnUpdatePage(0);\n            var item = _window.items.First();\n            var changes = item.changes.ToList();\n\n            Assert.AreEqual(\"Path0\", changes[0].path);\n            Assert.AreEqual(\"Path1\", changes[1].path);\n            Assert.AreEqual(\"Path2\", changes[2].path);\n        }\n\n        [Test]\n        public void CollabHistoryPresenter_OnUpdatePage__ChangesTotalIsCalculated()\n        {\n            _service.result = new RevisionsResult()\n            {\n                Revisions = new List<Revision>()\n                {\n                    new Revision(revisionID: \"0\", entries: GenerateChangeActions(3)),\n                }\n            };\n\n            _presenter.OnUpdatePage(0);\n            var item = _window.items.First();\n\n            Assert.AreEqual(3, item.changes.Count);\n        }\n\n        [Test]\n        public void CollabHistoryPresenter_OnUpdatePage__ChangesTruncatedIsCalculated()\n        {\n            for (var i = 0; i < 20; i++)\n            {\n                _service.result = new RevisionsResult()\n                {\n                    Revisions = new List<Revision>()\n                    {\n                        new Revision(revisionID: \"0\", entries: GenerateChangeActions(i)),\n                    }\n                };\n\n                _presenter.OnUpdatePage(0);\n                var item = _window.items.First();\n\n                Assert.AreEqual(i > 10, item.changesTruncated);\n            }\n        }\n\n        [Test]\n        public void CollabHistoryPresenter_OnUpdatePage__OnlyKeeps10ChangeActions()\n        {\n            _service.result = new RevisionsResult()\n            {\n                Revisions = new List<Revision>()\n                {\n                    new Revision(authorName: \"Test\", author: \"test\", entries: GenerateChangeActions(12)),\n                }\n            };\n\n            _presenter.OnUpdatePage(1);\n            var item = _window.items.First();\n\n            Assert.AreEqual(10, item.changes.Count);\n            Assert.AreEqual(12, item.changesTotal);\n            Assert.AreEqual(true, item.changesTruncated);\n        }\n\n        [Test]\n        public void CollabHistoryPresenter_OnUpdatePage__DeduplicatesMetaFiles()\n        {\n            _service.result = new RevisionsResult()\n            {\n                Revisions = new List<Revision>()\n                {\n                    new Revision\n                    (\n                        authorName: \"Test\",\n                        author: \"test\",\n                        revisionID: \"\",\n                        entries: new ChangeAction[2]\n                    {\n                        new ChangeAction(path: \"Path1\", action: \"Action1\"),\n                        new ChangeAction(path: \"Path1.meta\", action: \"Action1\"),\n                    }\n                    ),\n                }\n            };\n\n            _presenter.OnUpdatePage(1);\n            var item = _window.items.First();\n\n            Assert.AreEqual(1, item.changes.Count);\n            Assert.AreEqual(1, item.changesTotal);\n            Assert.AreEqual(\"Path1\", item.changes.First().path);\n        }\n\n        [Test]\n        public void CollabHistoryPresenter_OnUpdatePage__FolderMetaFilesAreCounted()\n        {\n            _service.result = new RevisionsResult()\n            {\n                Revisions = new List<Revision>()\n                {\n                    new Revision\n                    (\n                        authorName: \"Test\",\n                        author: \"test\",\n                        entries: new ChangeAction[1]\n                    {\n                        new ChangeAction(path: \"Folder1.meta\", action: \"Action1\"),\n                    }\n                    ),\n                }\n            };\n\n            _presenter.OnUpdatePage(1);\n            var item = _window.items.First();\n\n            Assert.AreEqual(1, item.changes.Count);\n            Assert.AreEqual(1, item.changesTotal);\n            Assert.AreEqual(\"Folder1\", item.changes.First().path);\n        }\n\n        private static ChangeAction[] GenerateChangeActions(int count)\n        {\n            var entries = new ChangeAction[count];\n            for (var i = 0; i < count; i++)\n                entries[i] = new ChangeAction(path: \"Path\" + i, action: \"Action\" + i);\n            return entries;\n        }\n    }\n\n    internal class TestRevisionsService : IRevisionsService\n    {\n        public RevisionsResult result;\n        public event RevisionsDelegate FetchRevisionsCallback;\n\n        public string tipRevision { get; set; }\n        public string currentUser { get; set; }\n\n        public void GetRevisions(int offset, int count)\n        {\n          if(FetchRevisionsCallback != null)\n          {\n            FetchRevisionsCallback(result);\n          }\n        }\n    }\n\n    internal class TestHistoryWindow : ICollabHistoryWindow\n    {\n        public IEnumerable<RevisionData> items;\n\n        public bool revisionActionsEnabled { get; set; }\n        public int itemsPerPage { get; set; }\n        public string errMessage { get; set; }\n        public string inProgressRevision { get; set; }\n        public PageChangeAction OnPageChangeAction { get; set; }\n        public RevisionAction OnGoBackAction { get; set; }\n        public RevisionAction OnUpdateAction { get; set; }\n        public RevisionAction OnRestoreAction { get; set; }\n        public ShowBuildAction OnShowBuildAction { get; set; }\n        public Action OnShowServicesAction { get; set; }\n\n        public void UpdateState(HistoryState state, bool force)\n        {\n        }\n\n        public void UpdateRevisions(IEnumerable<RevisionData> items, string tip, int totalRevisions, int currPage)\n        {\n            this.items = items;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor/HistoryTests.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 23a56a19774ed42b6b65646af08a003c\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor/Unity.CollabProxy.EditorTests.asmdef",
    "content": "{\n    \"name\": \"Unity.CollabProxy.EditorTests\",\n    \"references\": [\n        \"Unity.CollabProxy.Editor\"\n    ],\n    \"optionalUnityReferences\": [\n        \"TestAssemblies\"\n    ],\n    \"includePlatforms\": [\n        \"Editor\"\n    ],\n    \"excludePlatforms\": []\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor/Unity.CollabProxy.EditorTests.asmdef.meta",
    "content": "fileFormatVersion: 2\nguid: 782de34c17796430ba8d0ceddb60944e\nAssemblyDefinitionImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor.meta",
    "content": "fileFormatVersion: 2\nguid: 4506ac79f5b274cb1b249ed7f4abfb9a\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests.meta",
    "content": "fileFormatVersion: 2\nguid: 1369382d2c5e64dc5b2ec0b6b0a94531\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/package.json",
    "content": "{\n  \"name\": \"com.unity.collab-proxy\",\n  \"displayName\": \"Unity Collaborate\",\n  \"version\": \"1.2.16\",\n  \"unity\": \"2018.3\",\n  \"description\": \"Collaborate is a simple way for teams to save, share, and sync their Unity project\",\n  \"keywords\": [\n    \"collab\",\n    \"collaborate\",\n    \"teams\",\n    \"team\",\n    \"cloud\",\n    \"backup\"\n  ],\n  \"dependencies\": {},\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://gitlab.cds.internal.unity3d.com/upm-packages/cloud-services/collab-proxy.git\",\n    \"revision\": \"070e173b6a36e1d6097b1d95e09c08840c23f6ca\"\n  }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.collab-proxy@1.2.16/package.json.meta",
    "content": "fileFormatVersion: 2\nguid: 57b0c806ba25b48aa8a6ecb3345a4a9b\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ext.nunit@1.0.0/.gitlab-ci.yml",
    "content": "image: node:6.10.0\n\nstages:\n  - push_to_packman_staging\n\npush_to_packman_staging:\n  stage: push_to_packman_staging\n  only:\n    - tags\n  script:\n    - sed -i \"s/0.0.1-PLACEHOLDERVERSION/$CI_COMMIT_TAG/g\" package.json\n    - sed -i \"s/PLACEHOLDERSHA/$CI_COMMIT_SHA/g\" package.json\n    - sed -i \"s/0.0.1-PLACEHOLDERVERSION/$CI_COMMIT_TAG/g\" CHANGELOG.md\n    - curl -u $USER_NAME:$API_KEY https://staging-packages.unity.com/auth > .npmrc\n    - npm publish\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ext.nunit@1.0.0/CHANGELOG.md",
    "content": "# Changelog\nAll notable changes to this package will be documented in this file.\n\nThe format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)\nand this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).\n\n## [1.0.0] - 2019-02-21\n\n### This is the first release of *Unity Package com.unity.ext.nunit*.\n\n- Migrated the custom version of nunit from inside of unity.\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ext.nunit@1.0.0/CHANGELOG.md.meta",
    "content": "fileFormatVersion: 2\nguid: f49bbe06ffa5ae24abe32abdab430c24\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ext.nunit@1.0.0/Documentation~/ext.nunit.md",
    "content": "# Custom Nunit build to work with Unity\n\nThis version of nunit works with all platforms, il2cpp and Mono AOT.\n\nFor Nunit Documentation:\nhttps://github.com/nunit/docs/wiki/NUnit-Documentation\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ext.nunit@1.0.0/LICENSE.md",
    "content": "Copyright (c) 2018 Charlie Poole, Rob Prouse\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE."
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ext.nunit@1.0.0/LICENSE.md.meta",
    "content": "fileFormatVersion: 2\nguid: f91a00d2dca52b843b2d50ccf750737d\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ext.nunit@1.0.0/README.md",
    "content": "# Custom Nunit build to work with Unity\n\nThis version of nunit works with all platforms, il2cpp and Mono AOT.\n\nFor Nunit Documentation:\nhttps://github.com/nunit/docs/wiki/NUnit-Documentation\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ext.nunit@1.0.0/README.md.meta",
    "content": "fileFormatVersion: 2\nguid: 5da62a0c1c5218c4aa16b74546a7822d\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom/This is a custom build DONT include.txt",
    "content": "This is a custom nUnit build meant to be used by Unity editor and players. It shoul not be included or referenced from anywhere (unless you know what you're doing)\n\nBuild from this repo\nhttps://github.com/Unity-Technologies/nunit"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom/This is a custom build DONT include.txt.meta",
    "content": "fileFormatVersion: 2\nguid: 3d67ccdf81bed8247ad0db2d5f47a7d1\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom/nunit.framework.dll.mdb.meta",
    "content": "fileFormatVersion: 2\nguid: 6f768c3714a34a549960ea903fbadcc2\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom/nunit.framework.dll.meta",
    "content": "fileFormatVersion: 2\nguid: f1605f5534186904fa2c4c42acbfe01e\nPluginImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  iconMap: {}\n  executionOrder: {}\n  defineConstraints: [\"UNITY_INCLUDE_TESTS\"]\n  isPreloaded: 0\n  isOverridable: 1\n  isExplicitlyReferenced: 1\n  platformData:\n  - first:\n      '': Any\n    second:\n      enabled: 0\n      settings: {}\n  - first:\n      Any:\n    second:\n      enabled: 1\n      settings: {}\n  - first:\n      Editor: Editor\n    second:\n      enabled: 0\n      settings:\n        DefaultValueInitialized: true\n  - first:\n      Windows Store Apps: WindowsStoreApps\n    second:\n      enabled: 0\n      settings:\n        CPU: AnyCPU\n  userData:\n  assetBundleName:\n  assetBundleVariant:\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom/nunit.framework.pdb.meta",
    "content": "fileFormatVersion: 2\nguid: f136f1f122a53c64c9af51baecaa9c96\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom/nunit.framework.xml",
    "content": "<?xml version=\"1.0\"?>\n<doc>\n    <assembly>\n        <name>nunit.framework</name>\n    </assembly>\n    <members>\n        <member name=\"T:NUnit.Framework.StringAssert\">\n            <summary>\n            Basic Asserts on strings.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.StringAssert.Equals(System.Object,System.Object)\">\n            <summary>\n            The Equals method throws an InvalidOperationException. This is done \n            to make sure there is no mistake by calling this function.\n            </summary>\n            <param name=\"a\"></param>\n            <param name=\"b\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.StringAssert.ReferenceEquals(System.Object,System.Object)\">\n            <summary>\n            override the default ReferenceEquals to throw an InvalidOperationException. This \n            implementation makes sure there is no mistake in calling this function \n            as part of Assert. \n            </summary>\n            <param name=\"a\"></param>\n            <param name=\"b\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.StringAssert.Contains(System.String,System.String,System.String,System.Object[])\">\n            <summary>\n            Asserts that a string is found within another string.\n            </summary>\n            <param name=\"expected\">The expected string</param>\n            <param name=\"actual\">The string to be examined</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Arguments used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.StringAssert.Contains(System.String,System.String)\">\n            <summary>\n            Asserts that a string is found within another string.\n            </summary>\n            <param name=\"expected\">The expected string</param>\n            <param name=\"actual\">The string to be examined</param>\n        </member>\n        <member name=\"M:NUnit.Framework.StringAssert.DoesNotContain(System.String,System.String,System.String,System.Object[])\">\n            <summary>\n            Asserts that a string is not found within another string.\n            </summary>\n            <param name=\"expected\">The expected string</param>\n            <param name=\"actual\">The string to be examined</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Arguments used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.StringAssert.DoesNotContain(System.String,System.String)\">\n            <summary>\n            Asserts that a string is found within another string.\n            </summary>\n            <param name=\"expected\">The expected string</param>\n            <param name=\"actual\">The string to be examined</param>\n        </member>\n        <member name=\"M:NUnit.Framework.StringAssert.StartsWith(System.String,System.String,System.String,System.Object[])\">\n            <summary>\n            Asserts that a string starts with another string.\n            </summary>\n            <param name=\"expected\">The expected string</param>\n            <param name=\"actual\">The string to be examined</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Arguments used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.StringAssert.StartsWith(System.String,System.String)\">\n            <summary>\n            Asserts that a string starts with another string.\n            </summary>\n            <param name=\"expected\">The expected string</param>\n            <param name=\"actual\">The string to be examined</param>\n        </member>\n        <member name=\"M:NUnit.Framework.StringAssert.DoesNotStartWith(System.String,System.String,System.String,System.Object[])\">\n            <summary>\n            Asserts that a string does not start with another string.\n            </summary>\n            <param name=\"expected\">The expected string</param>\n            <param name=\"actual\">The string to be examined</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Arguments used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.StringAssert.DoesNotStartWith(System.String,System.String)\">\n            <summary>\n            Asserts that a string does not start with another string.\n            </summary>\n            <param name=\"expected\">The expected string</param>\n            <param name=\"actual\">The string to be examined</param>\n        </member>\n        <member name=\"M:NUnit.Framework.StringAssert.EndsWith(System.String,System.String,System.String,System.Object[])\">\n            <summary>\n            Asserts that a string ends with another string.\n            </summary>\n            <param name=\"expected\">The expected string</param>\n            <param name=\"actual\">The string to be examined</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Arguments used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.StringAssert.EndsWith(System.String,System.String)\">\n            <summary>\n            Asserts that a string ends with another string.\n            </summary>\n            <param name=\"expected\">The expected string</param>\n            <param name=\"actual\">The string to be examined</param>\n        </member>\n        <member name=\"M:NUnit.Framework.StringAssert.DoesNotEndWith(System.String,System.String,System.String,System.Object[])\">\n            <summary>\n            Asserts that a string does not end with another string.\n            </summary>\n            <param name=\"expected\">The expected string</param>\n            <param name=\"actual\">The string to be examined</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Arguments used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.StringAssert.DoesNotEndWith(System.String,System.String)\">\n            <summary>\n            Asserts that a string does not end with another string.\n            </summary>\n            <param name=\"expected\">The expected string</param>\n            <param name=\"actual\">The string to be examined</param>\n        </member>\n        <member name=\"M:NUnit.Framework.StringAssert.AreEqualIgnoringCase(System.String,System.String,System.String,System.Object[])\">\n            <summary>\n            Asserts that two strings are equal, without regard to case.\n            </summary>\n            <param name=\"expected\">The expected string</param>\n            <param name=\"actual\">The actual string</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Arguments used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.StringAssert.AreEqualIgnoringCase(System.String,System.String)\">\n            <summary>\n            Asserts that two strings are equal, without regard to case.\n            </summary>\n            <param name=\"expected\">The expected string</param>\n            <param name=\"actual\">The actual string</param>\n        </member>\n        <member name=\"M:NUnit.Framework.StringAssert.AreNotEqualIgnoringCase(System.String,System.String,System.String,System.Object[])\">\n            <summary>\n            Asserts that two strings are not equal, without regard to case.\n            </summary>\n            <param name=\"expected\">The expected string</param>\n            <param name=\"actual\">The actual string</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Arguments used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.StringAssert.AreNotEqualIgnoringCase(System.String,System.String)\">\n            <summary>\n            Asserts that two strings are not equal, without regard to case.\n            </summary>\n            <param name=\"expected\">The expected string</param>\n            <param name=\"actual\">The actual string</param>\n        </member>\n        <member name=\"M:NUnit.Framework.StringAssert.IsMatch(System.String,System.String,System.String,System.Object[])\">\n            <summary>\n            Asserts that a string matches an expected regular expression pattern.\n            </summary>\n            <param name=\"pattern\">The regex pattern to be matched</param>\n            <param name=\"actual\">The actual string</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Arguments used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.StringAssert.IsMatch(System.String,System.String)\">\n            <summary>\n            Asserts that a string matches an expected regular expression pattern.\n            </summary>\n            <param name=\"pattern\">The regex pattern to be matched</param>\n            <param name=\"actual\">The actual string</param>\n        </member>\n        <member name=\"M:NUnit.Framework.StringAssert.DoesNotMatch(System.String,System.String,System.String,System.Object[])\">\n            <summary>\n            Asserts that a string does not match an expected regular expression pattern.\n            </summary>\n            <param name=\"pattern\">The regex pattern to be used</param>\n            <param name=\"actual\">The actual string</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Arguments used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.StringAssert.DoesNotMatch(System.String,System.String)\">\n            <summary>\n            Asserts that a string does not match an expected regular expression pattern.\n            </summary>\n            <param name=\"pattern\">The regex pattern to be used</param>\n            <param name=\"actual\">The actual string</param>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Filters.AndFilter\">\n            <summary>\n            Combines multiple filters so that a test must pass all \n            of them in order to pass this filter.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Filters.CompositeFilter\">\n            <summary>\n            A base class for multi-part filters\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.TestFilter\">\n            <summary>\n            Interface to be implemented by filters applied to tests.\n            The filter applies when running the test, after it has been\n            loaded, since this is the only time an ITest exists.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Interfaces.ITestFilter\">\n            <summary>\n            Interface to be implemented by filters applied to tests.\n            The filter applies when running the test, after it has been\n            loaded, since this is the only time an ITest exists.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Interfaces.IXmlNodeBuilder\">\n            <summary>\n            An object implementing IXmlNodeBuilder is able to build \n            an XML representation of itself and any children.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.IXmlNodeBuilder.ToXml(System.Boolean)\">\n            <summary>\n            Returns a TNode representing the current object.\n            </summary>\n            <param name=\"recursive\">If true, children are included where applicable</param>\n            <returns>A TNode representing the result</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.IXmlNodeBuilder.AddToXml(NUnit.Framework.Interfaces.TNode,System.Boolean)\">\n            <summary>\n            Returns a TNode representing the current object after \n            adding it as a child of the supplied parent node.\n            </summary>\n            <param name=\"parentNode\">The parent node.</param>\n            <param name=\"recursive\">If true, children are included, where applicable</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.ITestFilter.Pass(NUnit.Framework.Interfaces.ITest)\">\n            <summary>\n            Determine if a particular test passes the filter criteria. Pass\n            may examine the parents and/or descendants of a test, depending\n            on the semantics of the particular filter\n            </summary>\n            <param name=\"test\">The test to which the filter is applied</param>\n            <returns>True if the test passes the filter, otherwise false</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.ITestFilter.IsExplicitMatch(NUnit.Framework.Interfaces.ITest)\">\n            <summary>\n            Determine if a test matches the filter expicitly. That is, it must\n            be a direct match of the test itself or one of it's children.\n            </summary>\n            <param name=\"test\">The test to which the filter is applied</param>\n            <returns>True if the test matches the filter explicityly, otherwise false</returns>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.TestFilter.Empty\">\n            <summary>\n            Unique Empty filter.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestFilter.Pass(NUnit.Framework.Interfaces.ITest)\">\n            <summary>\n            Determine if a particular test passes the filter criteria. The default \n            implementation checks the test itself, its parents and any descendants.\n            \n            Derived classes may override this method or any of the Match methods\n            to change the behavior of the filter.\n            </summary>\n            <param name=\"test\">The test to which the filter is applied</param>\n            <returns>True if the test passes the filter, otherwise false</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestFilter.IsExplicitMatch(NUnit.Framework.Interfaces.ITest)\">\n            <summary>\n            Determine if a test matches the filter expicitly. That is, it must\n            be a direct match of the test itself or one of it's children.\n            </summary>\n            <param name=\"test\">The test to which the filter is applied</param>\n            <returns>True if the test matches the filter explicityly, otherwise false</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestFilter.Match(NUnit.Framework.Interfaces.ITest)\">\n            <summary>\n            Determine whether the test itself matches the filter criteria, without\n            examining either parents or descendants. This is overridden by each\n            different type of filter to perform the necessary tests.\n            </summary>\n            <param name=\"test\">The test to which the filter is applied</param>\n            <returns>True if the filter matches the any parent of the test</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestFilter.MatchParent(NUnit.Framework.Interfaces.ITest)\">\n            <summary>\n            Determine whether any ancestor of the test matches the filter criteria\n            </summary>\n            <param name=\"test\">The test to which the filter is applied</param>\n            <returns>True if the filter matches the an ancestor of the test</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestFilter.MatchDescendant(NUnit.Framework.Interfaces.ITest)\">\n            <summary>\n            Determine whether any descendant of the test matches the filter criteria.\n            </summary>\n            <param name=\"test\">The test to be matched</param>\n            <returns>True if at least one descendant matches the filter criteria</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestFilter.FromXml(System.String)\">\n            <summary>\n            Create a TestFilter instance from an xml representation.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestFilter.FromXml(NUnit.Framework.Interfaces.TNode)\">\n            <summary>\n            Create a TestFilter from it's TNode representation\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestFilter.ToXml(System.Boolean)\">\n            <summary>\n            Adds an XML node\n            </summary>\n            <param name=\"recursive\">True if recursive</param>\n            <returns>The added XML node</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestFilter.AddToXml(NUnit.Framework.Interfaces.TNode,System.Boolean)\">\n            <summary>\n            Adds an XML node\n            </summary>\n            <param name=\"parentNode\">Parent node</param>\n            <param name=\"recursive\">True if recursive</param>\n            <returns>The added XML node</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestFilter.IsEmpty\">\n            <summary>\n            Indicates whether this is the EmptyFilter\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestFilter.TopLevel\">\n            <summary>\n            Indicates whether this is a top-level filter,\n            not contained in any other filter.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.TestFilter.EmptyFilter\">\n            <summary>\n            Nested class provides an empty filter - one that always\n            returns true when called. It never matches explicitly.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Filters.CompositeFilter.#ctor\">\n            <summary>\n            Constructs an empty CompositeFilter\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Filters.CompositeFilter.#ctor(NUnit.Framework.Interfaces.ITestFilter[])\">\n            <summary>\n            Constructs a CompositeFilter from an array of filters\n            </summary>\n            <param name=\"filters\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Filters.CompositeFilter.Add(NUnit.Framework.Interfaces.ITestFilter)\">\n            <summary>\n            Adds a filter to the list of filters\n            </summary>\n            <param name=\"filter\">The filter to be added</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Filters.CompositeFilter.Pass(NUnit.Framework.Interfaces.ITest)\">\n            <summary>\n            Checks whether the CompositeFilter is matched by a test.\n            </summary>\n            <param name=\"test\">The test to be matched</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Filters.CompositeFilter.Match(NUnit.Framework.Interfaces.ITest)\">\n            <summary>\n            Checks whether the CompositeFilter is matched by a test.\n            </summary>\n            <param name=\"test\">The test to be matched</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Filters.CompositeFilter.IsExplicitMatch(NUnit.Framework.Interfaces.ITest)\">\n            <summary>\n            Checks whether the CompositeFilter is explicit matched by a test.\n            </summary>\n            <param name=\"test\">The test to be matched</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Filters.CompositeFilter.AddToXml(NUnit.Framework.Interfaces.TNode,System.Boolean)\">\n            <summary>\n            Adds an XML node\n            </summary>\n            <param name=\"parentNode\">Parent node</param>\n            <param name=\"recursive\">True if recursive</param>\n            <returns>The added XML node</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Filters.CompositeFilter.Filters\">\n            <summary>\n            Return a list of the composing filters.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Filters.CompositeFilter.ElementName\">\n            <summary>\n            Gets the element name\n            </summary>\n            <value>Element name</value>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Filters.AndFilter.#ctor\">\n            <summary>\n            Constructs an empty AndFilter\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Filters.AndFilter.#ctor(NUnit.Framework.Interfaces.ITestFilter[])\">\n            <summary>\n            Constructs an AndFilter from an array of filters\n            </summary>\n            <param name=\"filters\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Filters.AndFilter.Pass(NUnit.Framework.Interfaces.ITest)\">\n            <summary>\n            Checks whether the AndFilter is matched by a test\n            </summary>\n            <param name=\"test\">The test to be matched</param>\n            <returns>True if all the component filters pass, otherwise false</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Filters.AndFilter.Match(NUnit.Framework.Interfaces.ITest)\">\n            <summary>\n            Checks whether the AndFilter is matched by a test\n            </summary>\n            <param name=\"test\">The test to be matched</param>\n            <returns>True if all the component filters match, otherwise false</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Filters.AndFilter.IsExplicitMatch(NUnit.Framework.Interfaces.ITest)\">\n            <summary>\n            Checks whether the AndFilter is explicit matched by a test.\n            </summary>\n            <param name=\"test\">The test to be matched</param>\n            <returns>True if all the component filters explicit match, otherwise false</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Filters.AndFilter.ElementName\">\n            <summary>\n            Gets the element name\n            </summary>\n            <value>Element name</value>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.SubstringConstraint\">\n            <summary>\n            SubstringConstraint can test whether a string contains\n            the expected substring.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.StringConstraint\">\n            <summary>\n            StringConstraint is the abstract base for constraints\n            that operate on strings. It supports the IgnoreCase\n            modifier for string operations.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.Constraint\">\n            <summary>\n            The Constraint class is the base of all built-in constraints\n            within NUnit. It provides the operator overloads used to combine \n            constraints.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.IConstraint\">\n            <summary>\n            Interface for all constraints\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.IResolveConstraint\">\n            <summary>\n            The IResolveConstraint interface is implemented by all\n            complete and resolvable constraints and expressions.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.IResolveConstraint.Resolve\">\n            <summary>\n            Return the top-level constraint for this expression\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.IConstraint.ApplyTo(System.Object)\">\n            <summary>\n            Applies the constraint to an actual value, returning a ConstraintResult.\n            </summary>\n            <param name=\"actual\">The value to be tested</param>\n            <returns>A ConstraintResult</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.IConstraint.ApplyTo``1(NUnit.Framework.Constraints.ActualValueDelegate{``0})\">\n            <summary>\n            Applies the constraint to an ActualValueDelegate that returns \n            the value to be tested. The default implementation simply evaluates \n            the delegate but derived classes may override it to provide for \n            delayed processing.\n            </summary>\n            <param name=\"del\">An ActualValueDelegate</param>\n            <returns>A ConstraintResult</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.IConstraint.ApplyTo``1(``0@)\">\n            <summary>\n            Test whether the constraint is satisfied by a given reference.\n            The default implementation simply dereferences the value but\n            derived classes may override it to provide for delayed processing.\n            </summary>\n            <param name=\"actual\">A reference to the value to be tested</param>\n            <returns>A ConstraintResult</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.IConstraint.DisplayName\">\n            <summary>\n            The display name of this Constraint for use by ToString().\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.IConstraint.Description\">\n            <summary>\n            The Description of what this constraint tests, for\n            use in messages and in the ConstraintResult.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.IConstraint.Arguments\">\n            <summary>\n            Arguments provided to this Constraint, for use in\n            formatting the description.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.IConstraint.Builder\">\n            <summary>\n            The ConstraintBuilder holding this constraint\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.Constraint.#ctor(System.Object[])\">\n            <summary>\n            Construct a constraint with optional arguments\n            </summary>\n            <param name=\"args\">Arguments to be saved</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.Constraint.ApplyTo(System.Object)\">\n            <summary>\n            Applies the constraint to an actual value, returning a ConstraintResult.\n            </summary>\n            <param name=\"actual\">The value to be tested</param>\n            <returns>A ConstraintResult</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.Constraint.ApplyTo``1(NUnit.Framework.Constraints.ActualValueDelegate{``0})\">\n            <summary>\n            Applies the constraint to an ActualValueDelegate that returns \n            the value to be tested. The default implementation simply evaluates \n            the delegate but derived classes may override it to provide for \n            delayed processing.\n            </summary>\n            <param name=\"del\">An ActualValueDelegate</param>\n            <returns>A ConstraintResult</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.Constraint.ApplyTo``1(``0@)\">\n            <summary>\n            Test whether the constraint is satisfied by a given reference.\n            The default implementation simply dereferences the value but\n            derived classes may override it to provide for delayed processing.\n            </summary>\n            <param name=\"actual\">A reference to the value to be tested</param>\n            <returns>A ConstraintResult</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.Constraint.GetTestObject``1(NUnit.Framework.Constraints.ActualValueDelegate{``0})\">\n            <summary>\n            Retrieves the value to be tested from an ActualValueDelegate.\n            The default implementation simply evaluates the delegate but derived\n            classes may override it to provide for delayed processing.\n            </summary>\n            <param name=\"del\">An ActualValueDelegate</param>\n            <returns>Delegate evaluation result</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.Constraint.ToString\">\n            <summary>\n            Default override of ToString returns the constraint DisplayName\n            followed by any arguments within angle brackets.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.Constraint.GetStringRepresentation\">\n            <summary>\n            Returns the string representation of this constraint\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.Constraint.op_BitwiseAnd(NUnit.Framework.Constraints.Constraint,NUnit.Framework.Constraints.Constraint)\">\n            <summary>\n            This operator creates a constraint that is satisfied only if both \n            argument constraints are satisfied.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.Constraint.op_BitwiseOr(NUnit.Framework.Constraints.Constraint,NUnit.Framework.Constraints.Constraint)\">\n            <summary>\n            This operator creates a constraint that is satisfied if either \n            of the argument constraints is satisfied.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.Constraint.op_LogicalNot(NUnit.Framework.Constraints.Constraint)\">\n            <summary>\n            This operator creates a constraint that is satisfied if the \n            argument constraint is not satisfied.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.Constraint.After(System.Int32)\">\n            <summary>\n            Returns a DelayedConstraint with the specified delay time.\n            </summary>\n            <param name=\"delayInMilliseconds\">The delay in milliseconds.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.Constraint.After(System.Int32,System.Int32)\">\n            <summary>\n            Returns a DelayedConstraint with the specified delay time\n            and polling interval.\n            </summary>\n            <param name=\"delayInMilliseconds\">The delay in milliseconds.</param>\n            <param name=\"pollingInterval\">The interval at which to test the constraint.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.Constraint.NUnit#Framework#Constraints#IResolveConstraint#Resolve\">\n            <summary>\n            Resolves any pending operators and returns the resolved constraint.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.Constraint.DisplayName\">\n            <summary>\n            The display name of this Constraint for use by ToString().\n            The default value is the name of the constraint with\n            trailing \"Constraint\" removed. Derived classes may set\n            this to another name in their constructors.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.Constraint.Description\">\n            <summary>\n            The Description of what this constraint tests, for\n            use in messages and in the ConstraintResult.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.Constraint.Arguments\">\n            <summary>\n            Arguments provided to this Constraint, for use in\n            formatting the description.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.Constraint.Builder\">\n            <summary>\n            The ConstraintBuilder holding this constraint\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.Constraint.And\">\n            <summary>\n            Returns a ConstraintExpression by appending And\n            to the current constraint.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.Constraint.With\">\n            <summary>\n            Returns a ConstraintExpression by appending And\n            to the current constraint.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.Constraint.Or\">\n            <summary>\n            Returns a ConstraintExpression by appending Or\n            to the current constraint.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.StringConstraint.expected\">\n            <summary>\n            The expected value\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.StringConstraint.caseInsensitive\">\n            <summary>\n            Indicates whether tests should be case-insensitive\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.StringConstraint.descriptionText\">\n            <summary>\n            Description of this constraint\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.StringConstraint.#ctor\">\n            <summary>\n            Constructs a StringConstraint without an expected value\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.StringConstraint.#ctor(System.String)\">\n            <summary>\n            Constructs a StringConstraint given an expected value\n            </summary>\n            <param name=\"expected\">The expected value</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.StringConstraint.ApplyTo(System.Object)\">\n            <summary>\n            Test whether the constraint is satisfied by a given value\n            </summary>\n            <param name=\"actual\">The value to be tested</param>\n            <returns>True for success, false for failure</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.StringConstraint.Matches(System.String)\">\n            <summary>\n            Test whether the constraint is satisfied by a given string\n            </summary>\n            <param name=\"actual\">The string to be tested</param>\n            <returns>True for success, false for failure</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.StringConstraint.Description\">\n            <summary>\n            The Description of what this constraint tests, for\n            use in messages and in the ConstraintResult.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.StringConstraint.IgnoreCase\">\n            <summary>\n            Modify the constraint to ignore case in matching.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.SubstringConstraint.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Constraints.SubstringConstraint\"/> class.\n            </summary>\n            <param name=\"expected\">The expected.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.SubstringConstraint.Matches(System.String)\">\n            <summary>\n            Test whether the constraint is satisfied by a given value\n            </summary>\n            <param name=\"actual\">The value to be tested</param>\n            <returns>True for success, false for failure</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.PrefixConstraint\">\n            <summary>\n            Abstract base class used for prefixes\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.PrefixConstraint.#ctor(NUnit.Framework.Constraints.IResolveConstraint)\">\n            <summary>\n            Construct given a base constraint\n            </summary>\n            <param name=\"baseConstraint\"></param>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.PrefixConstraint.BaseConstraint\">\n            <summary>\n            The base constraint\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.PrefixConstraint.DescriptionPrefix\">\n            <summary>\n            Prefix used in forming the constraint description\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.PrefixConstraint.Description\">\n            <summary>\n            The Description of what this constraint tests, for\n            use in messages and in the ConstraintResult.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.AssignableToConstraint\">\n            <summary>\n            AssignableToConstraint is used to test that an object\n            can be assigned to a given Type.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.TypeConstraint\">\n            <summary>\n            TypeConstraint is the abstract base for constraints\n            that take a Type as their expected value.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.TypeConstraint.expectedType\">\n            <summary>\n            The expected Type used by the constraint\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.TypeConstraint.actualType\">\n            <summary>\n            The type of the actual argument to which the constraint was applied\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.TypeConstraint.#ctor(System.Type,System.String)\">\n            <summary>\n            Construct a TypeConstraint for a given Type\n            </summary>\n            <param name=\"type\">The expected type for the constraint</param>\n            <param name=\"descriptionPrefix\">Prefix used in forming the constraint description</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.TypeConstraint.ApplyTo(System.Object)\">\n            <summary>\n            Applies the constraint to an actual value, returning a ConstraintResult.\n            </summary>\n            <param name=\"actual\">The value to be tested</param>\n            <returns>A ConstraintResult</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.TypeConstraint.Matches(System.Object)\">\n            <summary>\n            Apply the constraint to an actual value, returning true if it succeeds\n            </summary>\n            <param name=\"actual\">The actual argument</param>\n            <returns>True if the constraint succeeds, otherwise false.</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.AssignableToConstraint.#ctor(System.Type)\">\n            <summary>\n            Construct an AssignableToConstraint for the type provided\n            </summary>\n            <param name=\"type\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.AssignableToConstraint.Matches(System.Object)\">\n            <summary>\n            Apply the constraint to an actual value, returning true if it succeeds\n            </summary>\n            <param name=\"actual\">The actual argument</param>\n            <returns>True if the constraint succeeds, otherwise false.</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.MaxTimeAttribute\">\n            <summary>\n            Summary description for MaxTimeAttribute.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.PropertyAttribute\">\n            <summary>\n            PropertyAttribute is used to attach information to a test as a name/value pair..\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.NUnitAttribute\">\n            <summary>\n            The abstract base class for all custom attributes defined by NUnit.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.NUnitAttribute.#ctor\">\n            <summary>\n            Default constructor\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Interfaces.IApplyToTest\">\n            <summary>\n            The IApplyToTest interface is implemented by self-applying\n            attributes that modify the state of a test in some way.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.IApplyToTest.ApplyToTest(NUnit.Framework.Internal.Test)\">\n            <summary>\n            Modifies a test as defined for the specific attribute.\n            </summary>\n            <param name=\"test\">The test to modify</param>\n        </member>\n        <member name=\"M:NUnit.Framework.PropertyAttribute.#ctor(System.String,System.String)\">\n            <summary>\n            Construct a PropertyAttribute with a name and string value\n            </summary>\n            <param name=\"propertyName\">The name of the property</param>\n            <param name=\"propertyValue\">The property value</param>\n        </member>\n        <member name=\"M:NUnit.Framework.PropertyAttribute.#ctor(System.String,System.Int32)\">\n            <summary>\n            Construct a PropertyAttribute with a name and int value\n            </summary>\n            <param name=\"propertyName\">The name of the property</param>\n            <param name=\"propertyValue\">The property value</param>\n        </member>\n        <member name=\"M:NUnit.Framework.PropertyAttribute.#ctor(System.String,System.Double)\">\n            <summary>\n            Construct a PropertyAttribute with a name and double value\n            </summary>\n            <param name=\"propertyName\">The name of the property</param>\n            <param name=\"propertyValue\">The property value</param>\n        </member>\n        <member name=\"M:NUnit.Framework.PropertyAttribute.#ctor\">\n            <summary>\n            Constructor for derived classes that set the\n            property dictionary directly.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.PropertyAttribute.#ctor(System.Object)\">\n            <summary>\n            Constructor for use by derived classes that use the\n            name of the type as the property name. Derived classes\n            must ensure that the Type of the property value is\n            a standard type supported by the BCL. Any custom\n            types will cause a serialization Exception when\n            in the client.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.PropertyAttribute.ApplyToTest(NUnit.Framework.Internal.Test)\">\n            <summary>\n            Modifies a test by adding properties to it.\n            </summary>\n            <param name=\"test\">The test to modify</param>\n        </member>\n        <member name=\"P:NUnit.Framework.PropertyAttribute.Properties\">\n            <summary>\n            Gets the property dictionary for this attribute\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Interfaces.IWrapSetUpTearDown\">\n            <summary>\n            Objects implementing this interface are used to wrap\n            the entire test, including SetUp and TearDown.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Interfaces.ICommandWrapper\">\n            <summary>\n            ICommandWrapper is implemented by attributes and other\n            objects able to wrap a TestCommand with another command.\n            </summary>\n            <remarks>\n            Attributes or other objects should implement one of the\n            derived interfaces, rather than this one, since they\n            indicate in which part of the command chain the wrapper\n            should be applied.\n            </remarks>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.ICommandWrapper.Wrap(NUnit.Framework.Internal.Commands.TestCommand)\">\n            <summary>\n            Wrap a command and return the result.\n            </summary>\n            <param name=\"command\">The command to be wrapped</param>\n            <returns>The wrapped command</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.MaxTimeAttribute.#ctor(System.Int32)\">\n            <summary>\n            Construct a MaxTimeAttribute, given a time in milliseconds.\n            </summary>\n            <param name=\"milliseconds\">The maximum elapsed time in milliseconds</param>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Randomizer\">\n            <summary>\n            Randomizer returns a set of random _values in a repeatable\n            way, to allow re-running of tests if necessary. It extends\n            the .NET Random class, providing random values for a much\n            wider range of types.\n            \n            The class is used internally by the framework to generate \n            test case data and is also exposed for use by users through \n            the TestContext.Random property.\n            </summary>\n            <remarks>\n            For consistency with the underlying Random Type, methods \n            returning a single value use the prefix \"Next...\" Those\n            without an argument return a non-negative value up to\n            the full positive range of the Type. Overloads are provided\n            for specifying a maximum or a range. Methods that return\n            arrays or strings use the prefix \"Get...\" to avoid \n            confusion with the single-value methods.\n            </remarks>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.Randomizer.DefaultStringChars\">\n            <summary>\n            Default characters for random functions.\n            </summary>\n            <remarks>Default characters are the English alphabet (uppercase &amp; lowercase), arabic numerals, and underscore</remarks>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.GetRandomizer(System.Reflection.MemberInfo)\">\n            <summary>\n            Get a Randomizer for a particular member, returning\n            one that has already been created if it exists.\n            This ensures that the same _values are generated\n            each time the tests are reloaded.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.GetRandomizer(System.Reflection.ParameterInfo)\">\n            <summary>\n            Get a randomizer for a particular parameter, returning\n            one that has already been created if it exists.\n            This ensures that the same values are generated\n            each time the tests are reloaded.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.CreateRandomizer\">\n            <summary>\n            Create a new Randomizer using the next seed\n            available to ensure that each randomizer gives\n            a unique sequence of values.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.#ctor\">\n            <summary>\n            Default constructor\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.#ctor(System.Int32)\">\n            <summary>\n            Construct based on seed value\n            </summary>\n            <param name=\"seed\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.NextUInt\">\n            <summary>\n            Returns a random unsigned int.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.NextUInt(System.UInt32)\">\n            <summary>\n            Returns a random unsigned int less than the specified maximum.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.NextUInt(System.UInt32,System.UInt32)\">\n            <summary>\n            Returns a random unsigned int within a specified range.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.NextShort\">\n            <summary>\n            Returns a non-negative random short.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.NextShort(System.Int16)\">\n            <summary>\n            Returns a non-negative random short less than the specified maximum.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.NextShort(System.Int16,System.Int16)\">\n            <summary>\n            Returns a non-negative random short within a specified range.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.NextUShort\">\n            <summary>\n            Returns a random unsigned short.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.NextUShort(System.UInt16)\">\n            <summary>\n            Returns a random unsigned short less than the specified maximum.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.NextUShort(System.UInt16,System.UInt16)\">\n            <summary>\n            Returns a random unsigned short within a specified range.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.NextLong\">\n            <summary>\n            Returns a random long.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.NextLong(System.Int64)\">\n            <summary>\n            Returns a random long less than the specified maximum.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.NextLong(System.Int64,System.Int64)\">\n            <summary>\n            Returns a non-negative random long within a specified range.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.NextULong\">\n            <summary>\n            Returns a random ulong.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.NextULong(System.UInt64)\">\n            <summary>\n            Returns a random ulong less than the specified maximum.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.NextULong(System.UInt64,System.UInt64)\">\n            <summary>\n            Returns a non-negative random long within a specified range.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.NextByte\">\n            <summary>\n            Returns a random Byte\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.NextByte(System.Byte)\">\n            <summary>\n            Returns a random Byte less than the specified maximum.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.NextByte(System.Byte,System.Byte)\">\n            <summary>\n            Returns a random Byte within a specified range\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.NextSByte\">\n            <summary>\n            Returns a random SByte\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.NextSByte(System.SByte)\">\n            <summary>\n            Returns a random sbyte less than the specified maximum.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.NextSByte(System.SByte,System.SByte)\">\n            <summary>\n            Returns a random sbyte within a specified range\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.NextBool\">\n            <summary>\n            Returns a random bool\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.NextBool(System.Double)\">\n            <summary>\n            Returns a random bool based on the probablility a true result\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.NextDouble(System.Double)\">\n            <summary>\n            Returns a random double between 0.0 and the specified maximum.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.NextDouble(System.Double,System.Double)\">\n            <summary>\n            Returns a random double within a specified range.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.NextFloat\">\n            <summary>\n            Returns a random float.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.NextFloat(System.Single)\">\n            <summary>\n            Returns a random float between 0.0 and the specified maximum.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.NextFloat(System.Single,System.Single)\">\n            <summary>\n            Returns a random float within a specified range.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.NextEnum(System.Type)\">\n            <summary>\n            Returns a random enum value of the specified Type as an object.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.NextEnum``1\">\n            <summary>\n            Returns a random enum value of the specified Type.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.GetString(System.Int32,System.String)\">\n            <summary>\n            Generate a random string based on the characters from the input string.\n            </summary>\n            <param name=\"outputLength\">desired length of output string.</param>\n            <param name=\"allowedChars\">string representing the set of characters from which to construct the resulting string</param>\n            <returns>A random string of arbitrary length</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.GetString(System.Int32)\">\n            <summary>\n            Generate a random string based on the characters from the input string.\n            </summary>\n            <param name=\"outputLength\">desired length of output string.</param>\n            <returns>A random string of arbitrary length</returns>\n            <remarks>Uses <see cref=\"F:NUnit.Framework.Internal.Randomizer.DefaultStringChars\">DefaultStringChars</see> as the input character set </remarks>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.GetString\">\n            <summary>\n            Generate a random string based on the characters from the input string.\n            </summary>\n            <returns>A random string of the default length</returns>\n            <remarks>Uses <see cref=\"F:NUnit.Framework.Internal.Randomizer.DefaultStringChars\">DefaultStringChars</see> as the input character set </remarks>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.NextDecimal\">\n            <summary>\n            Returns a random decimal.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.NextDecimal(System.Decimal)\">\n            <summary>\n            Returns a random decimal between positive zero and the specified maximum.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Randomizer.NextDecimal(System.Decimal,System.Decimal)\">\n            <summary>\n            Returns a random decimal within a specified range, which is not\n            permitted to exceed decimal.MaxVal in the current implementation.\n            </summary>\n            <remarks>\n            A limitation of this implementation is that the range from min\n            to max must not exceed decimal.MaxVal.\n            </remarks>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Randomizer.InitialSeed\">\n            <summary>\n            Initial seed used to create randomizers for this run\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Interfaces.IFixtureBuilder\">\n            <summary>\n            The IFixtureBuilder interface is exposed by a class that knows how to\n            build a TestFixture from one or more Types. In general, it is exposed\n            by an attribute, but may be implemented in a helper class used by the\n            attribute in some cases.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.IFixtureBuilder.BuildFrom(NUnit.Framework.Interfaces.ITypeInfo)\">\n            <summary>\n            Build one or more TestFixtures from type provided. At least one\n            non-null TestSuite must always be returned, since the method is \n            generally called because the user has marked the target class as \n            a fixture. If something prevents the fixture from being used, it\n            will be returned nonetheless, labelled as non-runnable.\n            </summary>\n            <param name=\"typeInfo\">The type info of the fixture to be used.</param>\n            <returns>A TestSuite object or one derived from TestSuite.</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Interfaces.ITestBuilder\">\n            <summary>\n            The ITestBuilder interface is exposed by a class that knows how to\n            build one or more TestMethods from a MethodInfo. In general, it is exposed\n            by an attribute, which has additional information available to provide\n            the necessary test parameters to distinguish the test cases built.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.ITestBuilder.BuildFrom(NUnit.Framework.Interfaces.IMethodInfo,NUnit.Framework.Internal.Test)\">\n            <summary>\n            Build one or more TestMethods from the provided MethodInfo.\n            </summary>\n            <param name=\"method\">The method to be used as a test</param>\n            <param name=\"suite\">The TestSuite to which the method will be added</param>\n            <returns>A TestMethod object</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Interfaces.IReflectionInfo\">\n            <summary>\n            The IReflectionInfo interface is implemented by NUnit wrapper objects that perform reflection.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.IReflectionInfo.GetCustomAttributes``1(System.Boolean)\">\n            <summary>\n            Returns an array of custom attributes of the specified type applied to this object\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.IReflectionInfo.IsDefined``1(System.Boolean)\">\n            <summary>\n            Returns a value indicating whether an attribute of the specified type is defined on this object.\n            </summary>\n        </member>\n        <member name=\"T:System.Threading.SpinWait\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:System.Threading.SpinWait.SpinOnce\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:System.Threading.SpinWait.SpinUntil(System.Func{System.Boolean})\">\n            <summary>\n            \n            </summary>\n            <param name=\"condition\"></param>\n        </member>\n        <member name=\"M:System.Threading.SpinWait.SpinUntil(System.Func{System.Boolean},System.TimeSpan)\">\n            <summary>\n            \n            </summary>\n            <param name=\"condition\"></param>\n            <param name=\"timeout\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:System.Threading.SpinWait.SpinUntil(System.Func{System.Boolean},System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"condition\"></param>\n            <param name=\"millisecondsTimeout\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:System.Threading.SpinWait.Reset\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:System.Threading.SpinWait.NextSpinWillYield\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:System.Threading.SpinWait.Count\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.TestSuiteResult\">\n            <summary>\n            Represents the result of running a test suite\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.TestResult\">\n            <summary>\n            The TestResult class represents the result of a test.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Interfaces.ITestResult\">\n            <summary>\n            The ITestResult interface represents the result of a test.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITestResult.ResultState\">\n            <summary>\n            Gets the ResultState of the test result, which \n            indicates the success or failure of the test.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITestResult.Name\">\n            <summary>\n            Gets the name of the test result\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITestResult.FullName\">\n            <summary>\n            Gets the full name of the test result\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITestResult.Duration\">\n            <summary>\n            Gets the elapsed time for running the test in seconds\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITestResult.StartTime\">\n            <summary>\n            Gets or sets the time the test started running.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITestResult.EndTime\">\n            <summary>\n            Gets or sets the time the test finished running.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITestResult.Message\">\n            <summary>\n            Gets the message associated with a test\n            failure or with not running the test\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITestResult.StackTrace\">\n            <summary>\n            Gets any stacktrace associated with an\n            error or failure. Not available in\n            the Compact Framework 1.0.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITestResult.AssertCount\">\n            <summary>\n            Gets the number of asserts executed\n            when running the test and all its children.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITestResult.FailCount\">\n            <summary>\n            Gets the number of test cases that failed\n            when running the test and all its children.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITestResult.PassCount\">\n            <summary>\n            Gets the number of test cases that passed\n            when running the test and all its children.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITestResult.SkipCount\">\n            <summary>\n            Gets the number of test cases that were skipped\n            when running the test and all its children.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITestResult.InconclusiveCount\">\n            <summary>\n            Gets the number of test cases that were inconclusive\n            when running the test and all its children.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITestResult.HasChildren\">\n            <summary>\n            Indicates whether this result has any child results.\n            Accessing HasChildren should not force creation of the\n            Children collection in classes implementing this interface.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITestResult.Children\">\n            <summary>\n            Gets the the collection of child results.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITestResult.Test\">\n            <summary>\n            Gets the Test to which this result applies.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITestResult.Output\">\n            <summary>\n            Gets any text output written to this result.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.TestResult.MIN_DURATION\">\n            <summary>\n            The minimum duration for tests\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.TestResult.CHILD_ERRORS_MESSAGE\">\n            <summary>\n            Error message for when child tests have errors\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.TestResult.CHILD_IGNORE_MESSAGE\">\n            <summary>\n            Error message for when child tests are ignored\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.TestResult.InternalAssertCount\">\n            <summary>\n            Aggregate assertion count\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestResult.#ctor(NUnit.Framework.Interfaces.ITest)\">\n            <summary>\n            Construct a test result given a Test\n            </summary>\n            <param name=\"test\">The test to be used</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestResult.ToXml(System.Boolean)\">\n            <summary>\n            Returns the Xml representation of the result.\n            </summary>\n            <param name=\"recursive\">If true, descendant results are included</param>\n            <returns>An XmlNode representing the result</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestResult.AddToXml(NUnit.Framework.Interfaces.TNode,System.Boolean)\">\n            <summary>\n            Adds the XML representation of the result as a child of the\n            supplied parent node..\n            </summary>\n            <param name=\"parentNode\">The parent node.</param>\n            <param name=\"recursive\">If true, descendant results are included</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestResult.SetResult(NUnit.Framework.Interfaces.ResultState)\">\n            <summary>\n            Set the result of the test\n            </summary>\n            <param name=\"resultState\">The ResultState to use in the result</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestResult.SetResult(NUnit.Framework.Interfaces.ResultState,System.String)\">\n            <summary>\n            Set the result of the test\n            </summary>\n            <param name=\"resultState\">The ResultState to use in the result</param>\n            <param name=\"message\">A message associated with the result state</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestResult.SetResult(NUnit.Framework.Interfaces.ResultState,System.String,System.String)\">\n            <summary>\n            Set the result of the test\n            </summary>\n            <param name=\"resultState\">The ResultState to use in the result</param>\n            <param name=\"message\">A message associated with the result state</param>\n            <param name=\"stackTrace\">Stack trace giving the location of the command</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestResult.RecordException(System.Exception)\">\n            <summary>\n            Set the test result based on the type of exception thrown\n            </summary>\n            <param name=\"ex\">The exception that was thrown</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestResult.RecordException(System.Exception,NUnit.Framework.Interfaces.FailureSite)\">\n            <summary>\n            Set the test result based on the type of exception thrown\n            </summary>\n            <param name=\"ex\">The exception that was thrown</param>\n            <param name=\"site\">THe FailureSite to use in the result</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestResult.RecordTearDownException(System.Exception)\">\n            <summary>\n            RecordTearDownException appends the message and stacktrace\n            from an exception arising during teardown of the test\n            to any previously recorded information, so that any\n            earlier failure information is not lost. Note that\n            calling Assert.Ignore, Assert.Inconclusive, etc. during\n            teardown is treated as an error. If the current result\n            represents a suite, it may show a teardown error even\n            though all contained tests passed.\n            </summary>\n            <param name=\"ex\">The Exception to be recorded</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestResult.AddReasonElement(NUnit.Framework.Interfaces.TNode)\">\n            <summary>\n            Adds a reason element to a node and returns it.\n            </summary>\n            <param name=\"targetNode\">The target node.</param>\n            <returns>The new reason element.</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestResult.AddFailureElement(NUnit.Framework.Interfaces.TNode)\">\n            <summary>\n            Adds a failure element to a node and returns it.\n            </summary>\n            <param name=\"targetNode\">The target node.</param>\n            <returns>The new failure element.</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestResult.Test\">\n            <summary>\n            Gets the test with which this result is associated.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestResult.ResultState\">\n            <summary>\n            Gets the ResultState of the test result, which \n            indicates the success or failure of the test.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestResult.Name\">\n            <summary>\n            Gets the name of the test result\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestResult.FullName\">\n            <summary>\n            Gets the full name of the test result\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestResult.Duration\">\n            <summary>\n            Gets or sets the elapsed time for running the test in seconds\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestResult.StartTime\">\n            <summary>\n            Gets or sets the time the test started running.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestResult.EndTime\">\n            <summary>\n            Gets or sets the time the test finished running.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestResult.Message\">\n            <summary>\n            Gets the message associated with a test\n            failure or with not running the test\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestResult.StackTrace\">\n            <summary>\n            Gets any stacktrace associated with an\n            error or failure.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestResult.AssertCount\">\n            <summary>\n            Gets or sets the count of asserts executed\n            when running the test.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestResult.FailCount\">\n            <summary>\n            Gets the number of test cases that failed\n            when running the test and all its children.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestResult.PassCount\">\n            <summary>\n            Gets the number of test cases that passed\n            when running the test and all its children.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestResult.SkipCount\">\n            <summary>\n            Gets the number of test cases that were skipped\n            when running the test and all its children.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestResult.InconclusiveCount\">\n            <summary>\n            Gets the number of test cases that were inconclusive\n            when running the test and all its children.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestResult.HasChildren\">\n            <summary>\n            Indicates whether this result has any child results.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestResult.Children\">\n            <summary>\n            Gets the collection of child results.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestResult.OutWriter\">\n            <summary>\n            Gets a TextWriter, which will write output to be included in the result.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestResult.Output\">\n            <summary>\n            Gets any text output written to this result.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestSuiteResult.#ctor(NUnit.Framework.Internal.TestSuite)\">\n            <summary>\n            Construct a TestSuiteResult base on a TestSuite\n            </summary>\n            <param name=\"suite\">The TestSuite to which the result applies</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestSuiteResult.AddResult(NUnit.Framework.Interfaces.ITestResult)\">\n            <summary>\n            Adds a child result to this result, setting this result's\n            ResultState to Failure if the child result failed.\n            </summary>\n            <param name=\"result\">The result to be added</param>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestSuiteResult.FailCount\">\n            <summary>\n            Gets the number of test cases that failed\n            when running the test and all its children.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestSuiteResult.PassCount\">\n            <summary>\n            Gets the number of test cases that passed\n            when running the test and all its children.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestSuiteResult.SkipCount\">\n            <summary>\n            Gets the number of test cases that were skipped\n            when running the test and all its children.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestSuiteResult.InconclusiveCount\">\n            <summary>\n            Gets the number of test cases that were inconclusive\n            when running the test and all its children.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestSuiteResult.HasChildren\">\n            <summary>\n            Indicates whether this result has any child results.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestSuiteResult.Children\">\n            <summary>\n            Gets the collection of child results.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.TestSuite\">\n            <summary>\n            TestSuite represents a composite test, which contains other tests.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Test\">\n            <summary>\n            The Test abstract class represents a test within the framework.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Interfaces.ITest\">\n            <summary>\n            Common interface supported by all representations\n            of a test. Only includes informational fields.\n            The Run method is specifically excluded to allow\n            for data-only representations of a test.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITest.Id\">\n            <summary>\n            Gets the id of the test\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITest.Name\">\n            <summary>\n            Gets the name of the test\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITest.FullName\">\n            <summary>\n            Gets the fully qualified name of the test\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITest.ClassName\">\n            <summary>\n            Gets the name of the class containing this test. Returns\n            null if the test is not associated with a class.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITest.MethodName\">\n            <summary>\n            Gets the name of the method implementing this test.\n            Returns null if the test is not implemented as a method.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITest.TypeInfo\">\n            <summary>\n            Gets the Type of the test fixture, if applicable, or\n            null if no fixture type is associated with this test.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITest.Method\">\n            <summary>\n            Gets an IMethod for the method implementing this test.\n            Returns null if the test is not implemented as a method.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITest.RunState\">\n            <summary>\n            Gets the RunState of the test, indicating whether it can be run.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITest.TestCaseCount\">\n            <summary>\n            Count of the test cases ( 1 if this is a test case )\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITest.Properties\">\n            <summary>\n            Gets the properties of the test\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITest.Parent\">\n            <summary>\n            Gets the parent test, if any.\n            </summary>\n            <value>The parent test or null if none exists.</value>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITest.IsSuite\">\n            <summary>\n            Returns true if this is a test suite\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITest.HasChildren\">\n            <summary>\n            Gets a bool indicating whether the current test\n            has any descendant tests.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITest.Tests\">\n            <summary>\n            Gets this test's child tests\n            </summary>\n            <value>A list of child tests</value>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITest.Fixture\">\n            <summary>\n            Gets a fixture object for running this test.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.Test._nextID\">\n            <summary>\n            Static value to seed ids. It's started at 1000 so any\n            uninitialized ids will stand out.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.Test.setUpMethods\">\n            <summary>\n            The SetUp methods.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.Test.tearDownMethods\">\n            <summary>\n            The teardown methods\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.Test.DeclaringTypeInfo\">\n            <summary>\n            Used to cache the declaring type for this MethodInfo\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.Test._method\">\n            <summary>\n            Method property backing field\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Test.#ctor(System.String)\">\n            <summary>\n            Constructs a test given its name\n            </summary>\n            <param name=\"name\">The name of the test</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Test.#ctor(System.String,System.String)\">\n            <summary>\n            Constructs a test given the path through the\n            test hierarchy to its parent and a name.\n            </summary>\n            <param name=\"pathName\">The parent tests full name</param>\n            <param name=\"name\">The name of the test</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Test.#ctor(NUnit.Framework.Interfaces.ITypeInfo)\">\n            <summary>\n             TODO: Documentation needed for constructor\n            </summary>\n            <param name=\"typeInfo\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Test.#ctor(NUnit.Framework.Interfaces.IMethodInfo)\">\n            <summary>\n            Construct a test from a MethodInfo\n            </summary>\n            <param name=\"method\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Test.MakeTestResult\">\n            <summary>\n            Creates a TestResult for this test.\n            </summary>\n            <returns>A TestResult suitable for this type of test.</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Test.ApplyAttributesToTest(System.Reflection.ICustomAttributeProvider)\">\n            <summary>\n            Modify a newly constructed test by applying any of NUnit's common\n            attributes, based on a supplied ICustomAttributeProvider, which is\n            usually the reflection element from which the test was constructed,\n            but may not be in some instances. The attributes retrieved are \n            saved for use in subsequent operations.\n            </summary>\n            <param name=\"provider\">An object implementing ICustomAttributeProvider</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Test.PopulateTestNode(NUnit.Framework.Interfaces.TNode,System.Boolean)\">\n            <summary>\n            Add standard attributes and members to a test node.\n            </summary>\n            <param name=\"thisNode\"></param>\n            <param name=\"recursive\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Test.ToXml(System.Boolean)\">\n            <summary>\n            Returns the Xml representation of the test\n            </summary>\n            <param name=\"recursive\">If true, include child tests recursively</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Test.AddToXml(NUnit.Framework.Interfaces.TNode,System.Boolean)\">\n            <summary>\n            Returns an XmlNode representing the current result after\n            adding it as a child of the supplied parent node.\n            </summary>\n            <param name=\"parentNode\">The parent node.</param>\n            <param name=\"recursive\">If true, descendant results are included</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Test.CompareTo(System.Object)\">\n            <summary>\n            Compares this test to another test for sorting purposes\n            </summary>\n            <param name=\"obj\">The other test</param>\n            <returns>Value of -1, 0 or +1 depending on whether the current test is less than, equal to or greater than the other test</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Test.Id\">\n            <summary>\n            Gets or sets the id of the test\n            </summary>\n            <value></value>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Test.Name\">\n            <summary>\n            Gets or sets the name of the test\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Test.FullName\">\n            <summary>\n            Gets or sets the fully qualified name of the test\n            </summary>\n            <value></value>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Test.ClassName\">\n            <summary>\n            Gets the name of the class where this test was declared.\n            Returns null if the test is not associated with a class.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Test.MethodName\">\n            <summary>\n            Gets the name of the method implementing this test.\n            Returns null if the test is not implemented as a method.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Test.TypeInfo\">\n            <summary>\n            Gets the TypeInfo of the fixture used in running this test\n            or null if no fixture type is associated with it.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Test.Method\">\n            <summary>\n            Gets a MethodInfo for the method implementing this test.\n            Returns null if the test is not implemented as a method.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Test.RunState\">\n            <summary>\n            Whether or not the test should be run\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Test.XmlElementName\">\n            <summary>\n            Gets the name used for the top-level element in the\n            XML representation of this test\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Test.TestType\">\n            <summary>\n            Gets a string representing the type of test. Used as an attribute\n            value in the XML representation of a test and has no other\n            function in the framework.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Test.TestCaseCount\">\n            <summary>\n            Gets a count of test cases represented by\n            or contained under this test.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Test.Properties\">\n            <summary>\n            Gets the properties for this test\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Test.IsSuite\">\n            <summary>\n            Returns true if this is a TestSuite\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Test.HasChildren\">\n            <summary>\n            Gets a bool indicating whether the current test\n            has any descendant tests.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Test.Parent\">\n            <summary>\n            Gets the parent as a Test object.\n            Used by the core to set the parent.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Test.Tests\">\n            <summary>\n            Gets this test's child tests\n            </summary>\n            <value>A list of child tests</value>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Test.Fixture\">\n            <summary>\n            Gets or sets a fixture object for running this test.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Test.IdPrefix\">\n            <summary>\n            Static prefix used for ids in this AppDomain.\n            Set by FrameworkController.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Test.Seed\">\n            <summary>\n            Gets or Sets the Int value representing the seed for the RandomGenerator\n            </summary>\n            <value></value>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.TestSuite.tests\">\n            <summary>\n            Our collection of child tests\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestSuite.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Internal.TestSuite\"/> class.\n            </summary>\n            <param name=\"name\">The name of the suite.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestSuite.#ctor(System.String,System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Internal.TestSuite\"/> class.\n            </summary>\n            <param name=\"parentSuiteName\">Name of the parent suite.</param>\n            <param name=\"name\">The name of the suite.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestSuite.#ctor(NUnit.Framework.Interfaces.ITypeInfo)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Internal.TestSuite\"/> class.\n            </summary>\n            <param name=\"fixtureType\">Type of the fixture.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestSuite.#ctor(System.Type)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Internal.TestSuite\"/> class.\n            </summary>\n            <param name=\"fixtureType\">Type of the fixture.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestSuite.Sort\">\n            <summary>\n            Sorts tests under this suite.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestSuite.Add(NUnit.Framework.Internal.Test)\">\n            <summary>\n            Adds a test to the suite.\n            </summary>\n            <param name=\"test\">The test.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestSuite.MakeTestResult\">\n            <summary>\n            Overridden to return a TestSuiteResult.\n            </summary>\n            <returns>A TestResult for this test.</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestSuite.AddToXml(NUnit.Framework.Interfaces.TNode,System.Boolean)\">\n            <summary>\n            Returns an XmlNode representing the current result after\n            adding it as a child of the supplied parent node.\n            </summary>\n            <param name=\"parentNode\">The parent node.</param>\n            <param name=\"recursive\">If true, descendant results are included</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestSuite.CheckSetUpTearDownMethods(System.Type)\">\n            <summary>\n            Check that setup and teardown methods marked by certain attributes\n            meet NUnit's requirements and mark the tests not runnable otherwise.\n            </summary>\n            <param name=\"attrType\">The attribute type to check for</param>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestSuite.Tests\">\n            <summary>\n            Gets this test's child tests\n            </summary>\n            <value>The list of child tests</value>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestSuite.TestCaseCount\">\n            <summary>\n            Gets a count of test cases represented by\n            or contained under this test.\n            </summary>\n            <value></value>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestSuite.Arguments\">\n            <summary>\n            The arguments to use in creating the fixture\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestSuite.MaintainTestOrder\">\n            <summary>\n            Set to true to suppress sorting this suite's contents\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestSuite.HasChildren\">\n            <summary>\n            Gets a bool indicating whether the current test\n            has any descendant tests.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestSuite.XmlElementName\">\n            <summary>\n            Gets the name used for the top-level element in the\n            XML representation of this test\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.PropertyBag\">\n            <summary>\n            A PropertyBag represents a collection of name value pairs\n            that allows duplicate entries with the same key. Methods\n            are provided for adding a new pair as well as for setting\n            a key to a single value. All keys are strings but _values\n            may be of any type. Null _values are not permitted, since\n            a null entry represents the absence of the key.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Interfaces.IPropertyBag\">\n            <summary>\n            A PropertyBag represents a collection of name/value pairs\n            that allows duplicate entries with the same key. Methods\n            are provided for adding a new pair as well as for setting\n            a key to a single value. All keys are strings but _values\n            may be of any type. Null _values are not permitted, since\n            a null entry represents the absence of the key.\n            \n            The entries in a PropertyBag are of two kinds: those that\n            take a single value and those that take multiple _values.\n            However, the PropertyBag has no knowledge of which entries\n            fall into each category and the distinction is entirely\n            up to the code using the PropertyBag.\n            \n            When working with multi-valued properties, client code\n            should use the Add method to add name/value pairs and \n            indexing to retrieve a list of all _values for a given\n            key. For example:\n            \n                bag.Add(\"Tag\", \"one\");\n                bag.Add(\"Tag\", \"two\");\n                Assert.That(bag[\"Tag\"],\n                  Is.EqualTo(new string[] { \"one\", \"two\" })); \n            \n            When working with single-valued propeties, client code\n            should use the Set method to set the value and Get to\n            retrieve the value. The GetSetting methods may also be\n            used to retrieve the value in a type-safe manner while\n            also providing  default. For example:\n            \n                bag.Set(\"Priority\", \"low\");\n                bag.Set(\"Priority\", \"high\"); // replaces value\n                Assert.That(bag.Get(\"Priority\"),\n                  Is.EqualTo(\"high\"));\n                Assert.That(bag.GetSetting(\"Priority\", \"low\"),\n                  Is.EqualTo(\"high\"));\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.IPropertyBag.Add(System.String,System.Object)\">\n            <summary>\n            Adds a key/value pair to the property bag\n            </summary>\n            <param name=\"key\">The key</param>\n            <param name=\"value\">The value</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.IPropertyBag.Set(System.String,System.Object)\">\n            <summary>\n            Sets the value for a key, removing any other\n            _values that are already in the property set.\n            </summary>\n            <param name=\"key\"></param>\n            <param name=\"value\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.IPropertyBag.Get(System.String)\">\n            <summary>\n            Gets a single value for a key, using the first\n            one if multiple _values are present and returning\n            null if the value is not found.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.IPropertyBag.ContainsKey(System.String)\">\n            <summary>\n            Gets a flag indicating whether the specified key has\n            any entries in the property set.\n            </summary>\n            <param name=\"key\">The key to be checked</param>\n            <returns>True if their are _values present, otherwise false</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.IPropertyBag.Item(System.String)\">\n            <summary>\n            Gets or sets the list of _values for a particular key\n            </summary>\n            <param name=\"key\">The key for which the _values are to be retrieved or set</param>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.IPropertyBag.Keys\">\n            <summary>\n            Gets a collection containing all the keys in the property set\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.PropertyBag.Add(System.String,System.Object)\">\n            <summary>\n            Adds a key/value pair to the property set\n            </summary>\n            <param name=\"key\">The key</param>\n            <param name=\"value\">The value</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.PropertyBag.Set(System.String,System.Object)\">\n            <summary>\n            Sets the value for a key, removing any other\n            _values that are already in the property set.\n            </summary>\n            <param name=\"key\"></param>\n            <param name=\"value\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.PropertyBag.Get(System.String)\">\n            <summary>\n            Gets a single value for a key, using the first\n            one if multiple _values are present and returning\n            null if the value is not found.\n            </summary>\n            <param name=\"key\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.PropertyBag.ContainsKey(System.String)\">\n            <summary>\n            Gets a flag indicating whether the specified key has\n            any entries in the property set.\n            </summary>\n            <param name=\"key\">The key to be checked</param>\n            <returns>\n            True if their are _values present, otherwise false\n            </returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.PropertyBag.ToXml(System.Boolean)\">\n            <summary>\n            Returns an XmlNode representating the current PropertyBag.\n            </summary>\n            <param name=\"recursive\">Not used</param>\n            <returns>An XmlNode representing the PropertyBag</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.PropertyBag.AddToXml(NUnit.Framework.Interfaces.TNode,System.Boolean)\">\n            <summary>\n            Returns an XmlNode representing the PropertyBag after\n            adding it as a child of the supplied parent node.\n            </summary>\n            <param name=\"parentNode\">The parent node.</param>\n            <param name=\"recursive\">Not used</param>\n            <returns></returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.PropertyBag.Keys\">\n            <summary>\n            Gets a collection containing all the keys in the property set\n            </summary>\n            <value></value>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.PropertyBag.Item(System.String)\">\n            <summary>\n            Gets or sets the list of _values for a particular key\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.NUnitException\">\n            <summary>\n            Thrown when an assertion failed. Here to preserve the inner\n            exception and hence its stack trace.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.NUnitException.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Internal.NUnitException\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.NUnitException.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Internal.NUnitException\"/> class.\n            </summary>\n            <param name=\"message\">The error message that explains \n            the reason for the exception</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.NUnitException.#ctor(System.String,System.Exception)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Internal.NUnitException\"/> class.\n            </summary>\n            <param name=\"message\">The error message that explains \n            the reason for the exception</param>\n            <param name=\"inner\">The exception that caused the \n            current exception</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.NUnitException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)\">\n            <summary>\n            Serialization Constructor\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Filters.FullNameFilter\">\n            <summary>\n            FullName filter selects tests based on their FullName\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Filters.ValueMatchFilter\">\n            <summary>\n            ValueMatchFilter selects tests based on some value, which\n            is expected to be contained in the test.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Filters.ValueMatchFilter.#ctor(System.String)\">\n            <summary>\n            Construct a ValueMatchFilter for a single value.\n            </summary>\n            <param name=\"expectedValue\">The value to be included.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Filters.ValueMatchFilter.Match(System.String)\">\n            <summary>\n            Match the input provided by the derived class\n            </summary>\n            <param name=\"input\">The value to be matchedT</param>\n            <returns>True for a match, false otherwise.</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Filters.ValueMatchFilter.AddToXml(NUnit.Framework.Interfaces.TNode,System.Boolean)\">\n            <summary>\n            Adds an XML node\n            </summary>\n            <param name=\"parentNode\">Parent node</param>\n            <param name=\"recursive\">True if recursive</param>\n            <returns>The added XML node</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Filters.ValueMatchFilter.ExpectedValue\">\n            <summary>\n            Returns the value matched by the filter - used for testing\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Filters.ValueMatchFilter.IsRegex\">\n            <summary>\n            Indicates whether the value is a regular expression\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Filters.ValueMatchFilter.ElementName\">\n            <summary>\n            Gets the element name\n            </summary>\n            <value>Element name</value>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Filters.FullNameFilter.#ctor(System.String)\">\n            <summary>\n            Construct a FullNameFilter for a single name\n            </summary>\n            <param name=\"expectedValue\">The name the filter will recognize.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Filters.FullNameFilter.Match(NUnit.Framework.Interfaces.ITest)\">\n            <summary>\n            Match a test against a single value.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Filters.FullNameFilter.ElementName\">\n            <summary>\n            Gets the element name\n            </summary>\n            <value>Element name</value>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Filters.NotFilter\">\n            <summary>\n            NotFilter negates the operation of another filter\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Filters.NotFilter.#ctor(NUnit.Framework.Internal.TestFilter)\">\n            <summary>\n            Construct a not filter on another filter\n            </summary>\n            <param name=\"baseFilter\">The filter to be negated</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Filters.NotFilter.Pass(NUnit.Framework.Interfaces.ITest)\">\n            <summary>\n            Determine if a particular test passes the filter criteria. The default \n            implementation checks the test itself, its parents and any descendants.\n            \n            Derived classes may override this method or any of the Match methods\n            to change the behavior of the filter.\n            </summary>\n            <param name=\"test\">The test to which the filter is applied</param>\n            <returns>True if the test passes the filter, otherwise false</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Filters.NotFilter.Match(NUnit.Framework.Interfaces.ITest)\">\n            <summary>\n            Check whether the filter matches a test\n            </summary>\n            <param name=\"test\">The test to be matched</param>\n            <returns>True if it matches, otherwise false</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Filters.NotFilter.IsExplicitMatch(NUnit.Framework.Interfaces.ITest)\">\n            <summary>\n            Determine if a test matches the filter expicitly. That is, it must\n            be a direct match of the test itself or one of it's children.\n            </summary>\n            <param name=\"test\">The test to which the filter is applied</param>\n            <returns>True if the test matches the filter explicityly, otherwise false</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Filters.NotFilter.AddToXml(NUnit.Framework.Interfaces.TNode,System.Boolean)\">\n            <summary>\n            Adds an XML node\n            </summary>\n            <param name=\"parentNode\">Parent node</param>\n            <param name=\"recursive\">True if recursive</param>\n            <returns>The added XML node</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Filters.NotFilter.BaseFilter\">\n            <summary>\n            Gets the base filter\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Builders.SequentialStrategy\">\n            <summary>\n            SequentialStrategy creates test cases by using all of the\n            parameter data sources in parallel, substituting <c>null</c>\n            when any of them run out of data.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Interfaces.ICombiningStrategy\">\n            <summary>\n            CombiningStrategy is the abstract base for classes that\n            know how to combine values provided for individual test\n            parameters to create a set of test cases.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.ICombiningStrategy.GetTestCases(System.Collections.IEnumerable[])\">\n            <summary>\n            Gets the test cases generated by the CombiningStrategy.\n            </summary>\n            <returns>The test cases.</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Builders.SequentialStrategy.GetTestCases(System.Collections.IEnumerable[])\">\n            <summary>\n            Gets the test cases generated by the CombiningStrategy.\n            </summary>\n            <returns>The test cases.</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Builders.NUnitTestFixtureBuilder\">\n            <summary>\n            NUnitTestFixtureBuilder is able to build a fixture given\n            a class marked with a TestFixtureAttribute or an unmarked\n            class containing test methods. In the first case, it is\n            called by the attribute and in the second directly by\n            NUnitSuiteBuilder.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Builders.NUnitTestFixtureBuilder.BuildFrom(NUnit.Framework.Interfaces.ITypeInfo)\">\n            <summary>\n            Build a TestFixture from type provided. A non-null TestSuite\n            must always be returned, since the method is generally called\n            because the user has marked the target class as a fixture.\n            If something prevents the fixture from being used, it should\n            be returned nonetheless, labelled as non-runnable.\n            </summary>\n            <param name=\"typeInfo\">An ITypeInfo for the fixture to be used.</param>\n            <returns>A TestSuite object or one derived from TestSuite.</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Builders.NUnitTestFixtureBuilder.BuildFrom(NUnit.Framework.Interfaces.ITypeInfo,NUnit.Framework.Interfaces.ITestFixtureData)\">\n            <summary>\n            Overload of BuildFrom called by tests that have arguments.\n            Builds a fixture using the provided type and information \n            in the ITestFixtureData object.\n            </summary>\n            <param name=\"typeInfo\">The TypeInfo for which to construct a fixture.</param>\n            <param name=\"testFixtureData\">An object implementing ITestFixtureData or null.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Builders.NUnitTestFixtureBuilder.AddTestCasesToFixture(NUnit.Framework.Internal.TestFixture)\">\n            <summary>\n            Method to add test cases to the newly constructed fixture.\n            </summary>\n            <param name=\"fixture\">The fixture to which cases should be added</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Builders.NUnitTestFixtureBuilder.BuildTestCase(NUnit.Framework.Interfaces.IMethodInfo,NUnit.Framework.Internal.TestSuite)\">\n            <summary>\n            Method to create a test case from a MethodInfo and add\n            it to the fixture being built. It first checks to see if\n            any global TestCaseBuilder addin wants to build the\n            test case. If not, it uses the internal builder\n            collection maintained by this fixture builder.\n            \n            The default implementation has no test case builders.\n            Derived classes should add builders to the collection\n            in their constructor.\n            </summary>\n            <param name=\"method\">The method for which a test is to be created</param>\n            <param name=\"suite\">The test suite being built.</param>\n            <returns>A newly constructed Test</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.UniqueItemsConstraint\">\n            <summary>\n            UniqueItemsConstraint tests whether all the items in a \n            collection are unique.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.CollectionItemsEqualConstraint\">\n            <summary>\n            CollectionItemsEqualConstraint is the abstract base class for all\n            collection constraints that apply some notion of item equality\n            as a part of their operation.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.CollectionConstraint\">\n            <summary>\n            CollectionConstraint is the abstract base class for\n            constraints that operate on collections.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.CollectionConstraint.#ctor\">\n            <summary>\n            Construct an empty CollectionConstraint\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.CollectionConstraint.#ctor(System.Object)\">\n            <summary>\n            Construct a CollectionConstraint\n            </summary>\n            <param name=\"arg\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.CollectionConstraint.IsEmpty(System.Collections.IEnumerable)\">\n            <summary>\n            Determines whether the specified enumerable is empty.\n            </summary>\n            <param name=\"enumerable\">The enumerable.</param>\n            <returns>\n            <c>true</c> if the specified enumerable is empty; otherwise, <c>false</c>.\n            </returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.CollectionConstraint.ApplyTo(System.Object)\">\n            <summary>\n            Test whether the constraint is satisfied by a given value\n            </summary>\n            <param name=\"actual\">The value to be tested</param>\n            <returns>True for success, false for failure</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.CollectionConstraint.Matches(System.Collections.IEnumerable)\">\n            <summary>\n            Protected method to be implemented by derived classes\n            </summary>\n            <param name=\"collection\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.CollectionItemsEqualConstraint.#ctor\">\n            <summary>\n            Construct an empty CollectionConstraint\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.CollectionItemsEqualConstraint.#ctor(System.Object)\">\n            <summary>\n            Construct a CollectionConstraint\n            </summary>\n            <param name=\"arg\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.CollectionItemsEqualConstraint.Using(System.Collections.IComparer)\">\n            <summary>\n            Flag the constraint to use the supplied IComparer object.\n            </summary>\n            <param name=\"comparer\">The IComparer object to use.</param>\n            <returns>Self.</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.CollectionItemsEqualConstraint.Using``1(System.Collections.Generic.IComparer{``0})\">\n            <summary>\n            Flag the constraint to use the supplied IComparer object.\n            </summary>\n            <param name=\"comparer\">The IComparer object to use.</param>\n            <returns>Self.</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.CollectionItemsEqualConstraint.Using``1(System.Comparison{``0})\">\n            <summary>\n            Flag the constraint to use the supplied Comparison object.\n            </summary>\n            <param name=\"comparer\">The IComparer object to use.</param>\n            <returns>Self.</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.CollectionItemsEqualConstraint.Using(System.Collections.IEqualityComparer)\">\n            <summary>\n            Flag the constraint to use the supplied IEqualityComparer object.\n            </summary>\n            <param name=\"comparer\">The IComparer object to use.</param>\n            <returns>Self.</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.CollectionItemsEqualConstraint.Using``1(System.Collections.Generic.IEqualityComparer{``0})\">\n            <summary>\n            Flag the constraint to use the supplied IEqualityComparer object.\n            </summary>\n            <param name=\"comparer\">The IComparer object to use.</param>\n            <returns>Self.</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.CollectionItemsEqualConstraint.ItemsEqual(System.Object,System.Object)\">\n            <summary>\n            Compares two collection members for equality\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.CollectionItemsEqualConstraint.Tally(System.Collections.IEnumerable)\">\n            <summary>\n            Return a new CollectionTally for use in making tests\n            </summary>\n            <param name=\"c\">The collection to be included in the tally</param>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.CollectionItemsEqualConstraint.IgnoreCase\">\n            <summary>\n            Flag the constraint to ignore case and return self.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.UniqueItemsConstraint.Matches(System.Collections.IEnumerable)\">\n            <summary>\n            Check that all items are unique.\n            </summary>\n            <param name=\"actual\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.UniqueItemsConstraint.Description\">\n            <summary>\n            The Description of what this constraint tests, for\n            use in messages and in the ConstraintResult.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.SamePathOrUnderConstraint\">\n            <summary>\n            SamePathOrUnderConstraint tests that one path is under another\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.PathConstraint\">\n            <summary>\n            PathConstraint serves as the abstract base of constraints\n            that operate on paths and provides several helper methods.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.PathConstraint.#ctor(System.String)\">\n            <summary>\n            Construct a PathConstraint for a give expected path\n            </summary>\n            <param name=\"expected\">The expected path</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.PathConstraint.GetStringRepresentation\">\n            <summary>\n            Returns the string representation of this constraint\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.PathConstraint.Canonicalize(System.String)\">\n            <summary>\n            Canonicalize the provided path\n            </summary>\n            <param name=\"path\"></param>\n            <returns>The path in standardized form</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.PathConstraint.IsSubPath(System.String,System.String)\">\n            <summary>\n            Test whether one path in canonical form is a subpath of another path\n            </summary>\n            <param name=\"path1\">The first path - supposed to be the parent path</param>\n            <param name=\"path2\">The second path - supposed to be the child path</param>\n            <returns></returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.PathConstraint.RespectCase\">\n            <summary>\n            Modifies the current instance to be case-sensitive\n            and returns it.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.SamePathOrUnderConstraint.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Constraints.SamePathOrUnderConstraint\"/> class.\n            </summary>\n            <param name=\"expected\">The expected path</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.SamePathOrUnderConstraint.Matches(System.String)\">\n            <summary>\n            Test whether the constraint is satisfied by a given value\n            </summary>\n            <param name=\"actual\">The value to be tested</param>\n            <returns>True for success, false for failure</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.SamePathOrUnderConstraint.Description\">\n            <summary>\n            The Description of what this constraint tests, for\n            use in messages and in the ConstraintResult.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.NoItemConstraint\">\n            <summary>\n            NoItemConstraint applies another constraint to each\n            item in a collection, failing if any of them succeeds.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.NoItemConstraint.#ctor(NUnit.Framework.Constraints.IConstraint)\">\n            <summary>\n            Construct a SomeItemsConstraint on top of an existing constraint\n            </summary>\n            <param name=\"itemConstraint\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.NoItemConstraint.ApplyTo(System.Object)\">\n            <summary>\n            Apply the item constraint to each item in the collection,\n            failing if any item fails.\n            </summary>\n            <param name=\"actual\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.NoItemConstraint.DisplayName\">\n            <summary> \n            The display name of this Constraint for use by ToString().\n            The default value is the name of the constraint with\n            trailing \"Constraint\" removed. Derived classes may set\n            this to another name in their constructors.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.EndsWithConstraint\">\n            <summary>\n            EndsWithConstraint can test whether a string ends\n            with an expected substring.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.EndsWithConstraint.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Constraints.EndsWithConstraint\"/> class.\n            </summary>\n            <param name=\"expected\">The expected string</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.EndsWithConstraint.Matches(System.String)\">\n            <summary>\n            Test whether the constraint is matched by the actual value.\n            This is a template method, which calls the IsMatch method\n            of the derived class.\n            </summary>\n            <param name=\"actual\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"T:NUnit.Framework.ValuesAttribute\">\n            <summary>\n            ValuesAttribute is used to provide literal arguments for\n            an individual parameter of a test.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.DataAttribute\">\n            <summary>\n            The abstract base class for all data-providing attributes \n            defined by NUnit. Used to select all data sources for a \n            method, class or parameter.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.DataAttribute.#ctor\">\n            <summary>\n            Default constructor\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Interfaces.IParameterDataSource\">\n            <summary>\n            The IParameterDataSource interface is implemented by types\n            that can provide data for a test method parameter.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.IParameterDataSource.GetData(NUnit.Framework.Interfaces.IParameterInfo)\">\n            <summary>\n            Gets an enumeration of data items for use as arguments\n            for a test method parameter.\n            </summary>\n            <param name=\"parameter\">The parameter for which data is needed</param>\n            <returns>An enumeration containing individual data items</returns>\n        </member>\n        <member name=\"F:NUnit.Framework.ValuesAttribute.data\">\n            <summary>\n            The collection of data to be returned. Must\n            be set by any derived attribute classes.\n            We use an object[] so that the individual\n            elements may have their type changed in GetData\n            if necessary\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.ValuesAttribute.#ctor\">\n            <summary>\n            Constructs for use with an Enum parameter. Will pass every enum\n            value in to the test.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.ValuesAttribute.#ctor(System.Object)\">\n            <summary>\n            Construct with one argument\n            </summary>\n            <param name=\"arg1\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.ValuesAttribute.#ctor(System.Object,System.Object)\">\n            <summary>\n            Construct with two arguments\n            </summary>\n            <param name=\"arg1\"></param>\n            <param name=\"arg2\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.ValuesAttribute.#ctor(System.Object,System.Object,System.Object)\">\n            <summary>\n            Construct with three arguments\n            </summary>\n            <param name=\"arg1\"></param>\n            <param name=\"arg2\"></param>\n            <param name=\"arg3\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.ValuesAttribute.#ctor(System.Object[])\">\n            <summary>\n            Construct with an array of arguments\n            </summary>\n            <param name=\"args\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.ValuesAttribute.GetData(NUnit.Framework.Interfaces.IParameterInfo)\">\n            <summary>\n            Get the collection of _values to be used as arguments\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.PairwiseAttribute\">\n            <summary>\n            Marks a test to use a pairwise join of any argument \n            data provided. Arguments will be combined in such a\n            way that all possible pairs of arguments are used.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.CombiningStrategyAttribute\">\n            <summary>\n            Marks a test to use a particular CombiningStrategy to join\n            any parameter data provided. Since this is the default, the\n            attribute is optional.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.CombiningStrategyAttribute.#ctor(NUnit.Framework.Interfaces.ICombiningStrategy,NUnit.Framework.Interfaces.IParameterDataProvider)\">\n            <summary>\n            Construct a CombiningStrategyAttribute incorporating an\n            ICombiningStrategy and an IParamterDataProvider.\n            </summary>\n            <param name=\"strategy\">Combining strategy to be used in combining data</param>\n            <param name=\"provider\">An IParameterDataProvider to supply data</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CombiningStrategyAttribute.#ctor(System.Object,System.Object)\">\n            <summary>\n            Construct a CombiningStrategyAttribute incorporating an object\n            that implements ICombiningStrategy and an IParameterDataProvider.\n            This constructor is provided for CLS compliance.\n            </summary>\n            <param name=\"strategy\">Combining strategy to be used in combining data</param>\n            <param name=\"provider\">An IParameterDataProvider to supply data</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CombiningStrategyAttribute.BuildFrom(NUnit.Framework.Interfaces.IMethodInfo,NUnit.Framework.Internal.Test)\">\n            <summary>\n            Construct one or more TestMethods from a given MethodInfo,\n            using available parameter data.\n            </summary>\n            <param name=\"method\">The MethodInfo for which tests are to be constructed.</param>\n            <param name=\"suite\">The suite to which the tests will be added.</param>\n            <returns>One or more TestMethods</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.CombiningStrategyAttribute.ApplyToTest(NUnit.Framework.Internal.Test)\">\n            <summary>\n            Modify the test by adding the name of the combining strategy\n            to the properties.\n            </summary>\n            <param name=\"test\">The test to modify</param>\n        </member>\n        <member name=\"M:NUnit.Framework.PairwiseAttribute.#ctor\">\n            <summary>\n            Default constructor\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.CultureAttribute\">\n            <summary>\n            CultureAttribute is used to mark a test fixture or an\n            individual method as applying to a particular Culture only.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.IncludeExcludeAttribute\">\n            <summary>\n            Abstract base for Attributes that are used to include tests\n            in the test run based on environmental settings.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.IncludeExcludeAttribute.#ctor\">\n            <summary>\n            Constructor with no included items specified, for use\n            with named property syntax.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.IncludeExcludeAttribute.#ctor(System.String)\">\n            <summary>\n            Constructor taking one or more included items\n            </summary>\n            <param name=\"include\">Comma-delimited list of included items</param>\n        </member>\n        <member name=\"P:NUnit.Framework.IncludeExcludeAttribute.Include\">\n            <summary>\n            Name of the item that is needed in order for\n            a test to run. Multiple items may be given,\n            separated by a comma.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.IncludeExcludeAttribute.Exclude\">\n            <summary>\n            Name of the item to be excluded. Multiple items\n            may be given, separated by a comma.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.IncludeExcludeAttribute.Reason\">\n            <summary>\n            The reason for including or excluding the test\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.CultureAttribute.#ctor\">\n            <summary>\n            Constructor with no cultures specified, for use\n            with named property syntax.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.CultureAttribute.#ctor(System.String)\">\n            <summary>\n            Constructor taking one or more cultures\n            </summary>\n            <param name=\"cultures\">Comma-deliminted list of cultures</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CultureAttribute.ApplyToTest(NUnit.Framework.Internal.Test)\">\n            <summary>\n            Causes a test to be skipped if this CultureAttribute is not satisfied.\n            </summary>\n            <param name=\"test\">The test to modify</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CultureAttribute.IsCultureSupported\">\n            <summary>\n            Tests to determine if the current culture is supported\n            based on the properties of this attribute.\n            </summary>\n            <returns>True, if the current culture is supported</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.CultureAttribute.IsCultureSupported(System.String)\">\n            <summary>\n            Test to determine if the a particular culture or comma-\n            delimited set of cultures is in use.\n            </summary>\n            <param name=\"culture\">Name of the culture or comma-separated list of culture ids</param>\n            <returns>True if the culture is in use on the system</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.CultureAttribute.IsCultureSupported(System.String[])\">\n            <summary>\n            Test to determine if one of a collection of cultures\n            is being used currently.\n            </summary>\n            <param name=\"cultures\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Execution.WorkItemState\">\n            <summary>\n            The current state of a work item\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.Execution.WorkItemState.Ready\">\n            <summary>\n            Ready to run or continue\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.Execution.WorkItemState.Running\">\n            <summary>\n            Work Item is executing\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.Execution.WorkItemState.Complete\">\n            <summary>\n            Complete\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Execution.WorkItem\">\n             <summary>\n             A WorkItem may be an individual test case, a fixture or\n             a higher level grouping of tests. All WorkItems inherit\n             from the abstract WorkItem class, which uses the template\n             pattern to allow derived classes to perform work in\n             whatever way is needed.\n            \n             A WorkItem is created with a particular TestExecutionContext\n             and is responsible for re-establishing that context in the\n             current thread before it begins or resumes execution.\n             </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Execution.WorkItem.CreateWorkItem(NUnit.Framework.Interfaces.ITest,NUnit.Framework.Interfaces.ITestFilter)\">\n            <summary>\n            Creates a work item.\n            </summary>\n            <param name=\"test\">The test for which this WorkItem is being created.</param>\n            <param name=\"filter\">The filter to be used in selecting any child Tests.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Execution.WorkItem.#ctor(NUnit.Framework.Internal.Test)\">\n            <summary>\n            Construct a WorkItem for a particular test.\n            </summary>\n            <param name=\"test\">The test that the WorkItem will run</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Execution.WorkItem.InitializeContext(NUnit.Framework.Internal.TestExecutionContext)\">\n            <summary>\n            Initialize the TestExecutionContext. This must be done\n            before executing the WorkItem.\n            </summary>\n            <remarks>\n            Originally, the context was provided in the constructor\n            but delaying initialization of the context until the item\n            is about to be dispatched allows changes in the parent\n            context during OneTimeSetUp to be reflected in the child.\n            </remarks>\n            <param name=\"context\">The TestExecutionContext to use</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Execution.WorkItem.Execute\">\n            <summary>\n            Execute the current work item, including any\n            child work items.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Execution.WorkItem.Cancel(System.Boolean)\">\n            <summary>\n            Cancel (abort or stop) a WorkItem\n            </summary>\n            <param name=\"force\">true if the WorkItem should be aborted, false if it should run to completion</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Execution.WorkItem.PerformWork\">\n            <summary>\n            Method that performs actually performs the work. It should\n            set the State to WorkItemState.Complete when done.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Execution.WorkItem.WorkItemComplete\">\n            <summary>\n            Method called by the derived class when all work is complete\n            </summary>\n        </member>\n        <member name=\"E:NUnit.Framework.Internal.Execution.WorkItem.Completed\">\n            <summary>\n            Event triggered when the item is complete\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Execution.WorkItem.State\">\n            <summary>\n            Gets the current state of the WorkItem\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Execution.WorkItem.Test\">\n            <summary>\n            The test being executed by the work item\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Execution.WorkItem.Context\">\n            <summary>\n            The execution context\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Execution.WorkItem.WorkerId\">\n            <summary>\n            The unique id of the worker executing this item.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Execution.WorkItem.Actions\">\n            <summary>\n            The test actions to be performed before and after this test\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Execution.WorkItem.Result\">\n            <summary>\n            The test result\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Commands.MaxTimeCommand\">\n            <summary>\n            TODO: Documentation needed for class\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Commands.DelegatingTestCommand\">\n            <summary>\n            TODO: Documentation needed for class\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Commands.TestCommand\">\n            <summary>\n            TestCommand is the abstract base class for all test commands\n            in the framework. A TestCommand represents a single stage in\n            the execution of a test, e.g.: SetUp/TearDown, checking for\n            Timeout, verifying the returned result from a method, etc.\n            \n            TestCommands may decorate other test commands so that the\n            execution of a lower-level command is nested within that\n            of a higher level command. All nested commands are executed\n            synchronously, as a single unit. Scheduling test execution\n            on separate threads is handled at a higher level, using the\n            task dispatcher.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Commands.TestCommand.#ctor(NUnit.Framework.Internal.Test)\">\n            <summary>\n            Construct a TestCommand for a test.\n            </summary>\n            <param name=\"test\">The test to be executed</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Commands.TestCommand.Execute(NUnit.Framework.Internal.ITestExecutionContext)\">\n            <summary>\n            Runs the test in a specified context, returning a TestResult.\n            </summary>\n            <param name=\"context\">The TestExecutionContext to be used for running the test.</param>\n            <returns>A TestResult</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Commands.TestCommand.Test\">\n            <summary>\n            Gets the test associated with this command.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.Commands.DelegatingTestCommand.innerCommand\">\n            <summary>TODO: Documentation needed for field</summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Commands.DelegatingTestCommand.GetInnerCommand\">\n            <summary>TODO: Documentation needed for method</summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Commands.DelegatingTestCommand.#ctor(NUnit.Framework.Internal.Commands.TestCommand)\">\n            <summary>\n            TODO: Documentation needed for constructor\n            </summary>\n            <param name=\"innerCommand\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Commands.MaxTimeCommand.#ctor(NUnit.Framework.Internal.Commands.TestCommand,System.Int32)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Internal.Commands.MaxTimeCommand\"/> class.\n            </summary>\n            <param name=\"innerCommand\">The inner command.</param>\n            <param name=\"maxTime\">The max time allowed in milliseconds</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Commands.MaxTimeCommand.Execute(NUnit.Framework.Internal.ITestExecutionContext)\">\n            <summary>\n            Runs the test, saving a TestResult in the supplied TestExecutionContext\n            </summary>\n            <param name=\"context\">The context in which the test should run.</param>\n            <returns>A TestResult</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Interfaces.ITestListener\">\n            <summary>\n            The ITestListener interface is used internally to receive \n            notifications of significant events while a test is being \n            run. The events are propagated to clients by means of an\n            AsyncCallback. NUnit extensions may also monitor these events.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.ITestListener.TestStarted(NUnit.Framework.Interfaces.ITest)\">\n            <summary>\n            Called when a test has just started\n            </summary>\n            <param name=\"test\">The test that is starting</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.ITestListener.TestFinished(NUnit.Framework.Interfaces.ITestResult)\">\n            <summary>\n            Called when a test has finished\n            </summary>\n            <param name=\"result\">The result of the test</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.ITestListener.TestOutput(NUnit.Framework.Interfaces.TestOutput)\">\n            <summary>\n            Called when a test produces output for immediate display\n            </summary>\n            <param name=\"output\">A TestOutput object containing the text to display</param>\n        </member>\n        <member name=\"T:NUnit.Framework.Api.ITestAssemblyBuilder\">\n            <summary>\n            The ITestAssemblyBuilder interface is implemented by a class\n            that is able to build a suite of tests given an assembly or \n            an assembly filename.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.ITestAssemblyBuilder.Build(System.Reflection.Assembly,System.Collections.Generic.IDictionary{System.String,System.Object})\">\n            <summary>\n            Build a suite of tests from a provided assembly\n            </summary>\n            <param name=\"assembly\">The assembly from which tests are to be built</param>\n            <param name=\"options\">A dictionary of options to use in building the suite</param>\n            <returns>A TestSuite containing the tests found in the assembly</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.ITestAssemblyBuilder.Build(System.String,System.Collections.Generic.IDictionary{System.String,System.Object})\">\n            <summary>\n            Build a suite of tests given the filename of an assembly\n            </summary>\n            <param name=\"assemblyName\">The filename of the assembly from which tests are to be built</param>\n            <param name=\"options\">A dictionary of options to use in building the suite</param>\n            <returns>A TestSuite containing the tests found in the assembly</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.InternalTrace\">\n            <summary>\n            InternalTrace provides facilities for tracing the execution\n            of the NUnit framework. Tests and classes under test may make use \n            of Console writes, System.Diagnostics.Trace or various loggers and\n            NUnit itself traps and processes each of them. For that reason, a\n            separate internal trace is needed.\n            \n            Note:\n            InternalTrace uses a global lock to allow multiple threads to write\n            trace messages. This can easily make it a bottleneck so it must be \n            used sparingly. Keep the trace Level as low as possible and only\n            insert InternalTrace writes where they are needed.\n            TODO: add some buffering and a separate writer thread as an option.\n            TODO: figure out a way to turn on trace in specific classes only.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.InternalTrace.Initialize(System.String,NUnit.Framework.Internal.InternalTraceLevel)\">\n            <summary>\n            Initialize the internal trace facility using the name of the log\n            to be written to and the trace level.\n            </summary>\n            <param name=\"logName\">The log name</param>\n            <param name=\"level\">The trace level</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.InternalTrace.Initialize(System.IO.TextWriter,NUnit.Framework.Internal.InternalTraceLevel)\">\n            <summary>\n            Initialize the internal trace using a provided TextWriter and level\n            </summary>\n            <param name=\"writer\">A TextWriter</param>\n            <param name=\"level\">The InternalTraceLevel</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.InternalTrace.GetLogger(System.String)\">\n            <summary>\n            Get a named Logger\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.InternalTrace.GetLogger(System.Type)\">\n            <summary>\n            Get a logger named for a particular Type.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.InternalTrace.Initialized\">\n            <summary>\n            Gets a flag indicating whether the InternalTrace is initialized\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Interfaces.ITypeInfo\">\n            <summary>\n            The ITypeInfo interface is an abstraction of a .NET Type\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.ITypeInfo.IsType(System.Type)\">\n            <summary>\n            Returns true if the Type wrapped is equal to the argument\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.ITypeInfo.GetDisplayName\">\n            <summary>\n            Get the display name for this typeInfo.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.ITypeInfo.GetDisplayName(System.Object[])\">\n            <summary>\n            Get the display name for an oject of this type, constructed with specific arguments\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.ITypeInfo.GetGenericTypeDefinition\">\n            <summary>\n            Returns a Type representing a generic type definition from which this Type can be constructed.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.ITypeInfo.MakeGenericType(System.Type[])\">\n            <summary>\n            Returns a new ITypeInfo representing an instance of this generic Type using the supplied Type arguments\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.ITypeInfo.HasMethodWithAttribute(System.Type)\">\n            <summary>\n            Returns a value indicating whether this type has a method with a specified public attribute\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.ITypeInfo.GetMethods(System.Reflection.BindingFlags)\">\n            <summary>\n            Returns an array of IMethodInfos for methods of this Type\n            that match the specified flags.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.ITypeInfo.GetConstructor(System.Type[])\">\n            <summary>\n            Gets the public constructor taking the specified argument Types\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.ITypeInfo.HasConstructor(System.Type[])\">\n            <summary>\n            Returns a value indicating whether this Type has a public constructor taking the specified argument Types.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.ITypeInfo.Construct(System.Object[])\">\n            <summary>\n            Construct an object of this Type, using the specified arguments.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITypeInfo.Type\">\n            <summary>\n            Gets the underlying Type on which this ITypeInfo is based\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITypeInfo.BaseType\">\n            <summary>\n            Gets the base type of this type as an ITypeInfo\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITypeInfo.Name\">\n            <summary>\n            Gets the Name of the Type\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITypeInfo.FullName\">\n            <summary>\n            Gets the FullName of the Type\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITypeInfo.Assembly\">\n            <summary>\n            Gets the assembly in which the type is declared\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITypeInfo.Namespace\">\n            <summary>\n            Gets the Namespace of the Type\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITypeInfo.IsAbstract\">\n            <summary>\n            Gets a value indicating whether the type is abstract.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITypeInfo.IsGenericType\">\n            <summary>\n            Gets a value indicating whether the Type is a generic Type\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITypeInfo.ContainsGenericParameters\">\n            <summary>\n            Gets a value indicating whether the Type has generic parameters that have not been replaced by specific Types.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITypeInfo.IsGenericTypeDefinition\">\n            <summary>\n            Gets a value indicating whether the Type is a generic Type definition\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITypeInfo.IsSealed\">\n            <summary>\n            Gets a value indicating whether the type is sealed.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITypeInfo.IsStaticClass\">\n            <summary>\n            Gets a value indicating whether this type is a static class.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ExceptionNotThrownConstraint.ApplyTo(System.Object)\">\n            <summary>\n            Applies the constraint to an actual value, returning a ConstraintResult.\n            </summary>\n            <param name=\"actual\">The value to be tested</param>\n            <returns>A ConstraintResult</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ExceptionNotThrownConstraint.Description\">\n            <summary>\n            The Description of what this constraint tests, for\n            use in messages and in the ConstraintResult.\n            </summary>\n        </member>\n        <member name=\"T:System.Collections.Concurrent.IProducerConsumerCollection`1\">\n            <summary>\n            Defines methods to manipulate thread-safe collections intended for producer/consumer usage.\n            </summary>\n            <typeparam name=\"T\">Specifies the type of elements in the collection.</typeparam>\n            <remarks>\n            All implementations of this interface must enable all members of this interface\n            to be used concurrently from multiple threads.\n            </remarks>\n        </member>\n        <member name=\"M:System.Collections.Concurrent.IProducerConsumerCollection`1.TryAdd(`0)\">\n            <summary>\n            Attempts to add an object to the <see cref=\"T:System.Collections.Concurrent.IProducerConsumerCollection`1\"/>.\n            </summary>\n            <param name=\"item\">The object to add to the <see cref=\"T:System.Collections.Concurrent.IProducerConsumerCollection`1\"/>.</param>\n            <returns>true if the object was added successfully; otherwise, false.</returns>\n            <exception cref=\"T:System.ArgumentException\">The <paramref name=\"item\"/> was invalid for this collection.</exception>\n        </member>\n        <member name=\"M:System.Collections.Concurrent.IProducerConsumerCollection`1.TryTake(`0@)\">\n            <summary>\n            Attempts to remove and return an object from the <see cref=\"T:System.Collections.Concurrent.IProducerConsumerCollection`1\"/>.\n            </summary>\n            <param name=\"item\">\n            When this method returns, if the object was removed and returned successfully, <paramref name=\"item\"/> contains the removed object. If no object was available to be removed, the value is\n            unspecified.\n            </param>\n            <returns>true if an object was removed and returned successfully; otherwise, false.</returns>\n        </member>\n        <member name=\"M:System.Collections.Concurrent.IProducerConsumerCollection`1.ToArray\">\n            <summary>\n            Copies the elements contained in the <see cref=\"T:System.Collections.Concurrent.IProducerConsumerCollection`1\"/> to a new array.\n            </summary>\n            <returns>A new array containing the elements copied from the <see cref=\"T:System.Collections.Concurrent.IProducerConsumerCollection`1\"/>.</returns>\n        </member>\n        <member name=\"M:System.Collections.Concurrent.IProducerConsumerCollection`1.CopyTo(`0[],System.Int32)\">\n            <summary>\n            Copies the elements of the <see cref=\"T:System.Collections.Concurrent.IProducerConsumerCollection`1\"/> to\n            an\n            <see cref=\"T:System.Array\"/>, starting at a specified index.\n            </summary>\n            <param name=\"array\">The one-dimensional <see cref=\"T:System.Array\"/> that is the destination of\n            the elements copied from the <see cref=\"T:System.Collections.Concurrent.IProducerConsumerCollection`1\"/>.\n            The array must have zero-based indexing.</param>\n            <param name=\"index\">The zero-based index in <paramref name=\"array\"/> at which copying\n            begins.</param>\n            <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"array\"/> is a null reference (Nothing in\n            Visual Basic).</exception>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\"><paramref name=\"index\"/> is less than\n            zero.</exception>\n            <exception cref=\"T:System.ArgumentException\"><paramref name=\"index\"/> is equal to or greater than the\n            length of the <paramref name=\"array\"/>\n            -or- The number of elements in the source <see cref=\"T:System.Collections.Concurrent.ConcurrentQueue`1\"/> is greater than the\n            available space from <paramref name=\"index\"/> to the end of the destination <paramref name=\"array\"/>.\n            </exception>\n        </member>\n        <member name=\"T:NUnit.Framework.TestContext\">\n            <summary>\n            Provide the context information of the current test.\n            This is an adapter for the internal ExecutionContext\n            class, hiding the internals from the user test.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.TestContext.CurrentTestExecutionContext\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestContext.#ctor(NUnit.Framework.Internal.ITestExecutionContext)\">\n            <summary>\n            Construct a TestContext for an ExecutionContext\n            </summary>\n            <param name=\"testExecutionContext\">The ExecutionContext to adapt</param>\n        </member>\n        <member name=\"F:NUnit.Framework.TestContext.Error\">\n            <summary>\n            Gets a TextWriter that will send output directly to Console.Error\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.TestContext.Progress\">\n            <summary>\n            Gets a TextWriter for use in displaying immediate progress messages\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.TestContext.Parameters\">\n            <summary>\n            TestParameters object holds parameters for the test run, if any are specified\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestContext.Write(System.Boolean)\">\n            <summary>Write the string representation of a boolean value to the current result</summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestContext.Write(System.Char)\">\n            <summary>Write a char to the current result</summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestContext.Write(System.Char[])\">\n            <summary>Write a char array to the current result</summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestContext.Write(System.Double)\">\n            <summary>Write the string representation of a double to the current result</summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestContext.Write(System.Int32)\">\n            <summary>Write the string representation of an Int32 value to the current result</summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestContext.Write(System.Int64)\">\n            <summary>Write the string representation of an Int64 value to the current result</summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestContext.Write(System.Decimal)\">\n            <summary>Write the string representation of a decimal value to the current result</summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestContext.Write(System.Object)\">\n            <summary>Write the string representation of an object to the current result</summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestContext.Write(System.Single)\">\n            <summary>Write the string representation of a Single value to the current result</summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestContext.Write(System.String)\">\n            <summary>Write a string to the current result</summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestContext.Write(System.UInt32)\">\n            <summary>Write the string representation of a UInt32 value to the current result</summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestContext.Write(System.UInt64)\">\n            <summary>Write the string representation of a UInt64 value to the current result</summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestContext.Write(System.String,System.Object)\">\n            <summary>Write a formatted string to the current result</summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestContext.Write(System.String,System.Object,System.Object)\">\n            <summary>Write a formatted string to the current result</summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestContext.Write(System.String,System.Object,System.Object,System.Object)\">\n            <summary>Write a formatted string to the current result</summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestContext.Write(System.String,System.Object[])\">\n            <summary>Write a formatted string to the current result</summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestContext.WriteLine\">\n            <summary>Write a line terminator to the current result</summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestContext.WriteLine(System.Boolean)\">\n            <summary>Write the string representation of a boolean value to the current result followed by a line terminator</summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestContext.WriteLine(System.Char)\">\n            <summary>Write a char to the current result followed by a line terminator</summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestContext.WriteLine(System.Char[])\">\n            <summary>Write a char array to the current result followed by a line terminator</summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestContext.WriteLine(System.Double)\">\n            <summary>Write the string representation of a double to the current result followed by a line terminator</summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestContext.WriteLine(System.Int32)\">\n            <summary>Write the string representation of an Int32 value to the current result followed by a line terminator</summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestContext.WriteLine(System.Int64)\">\n            <summary>Write the string representation of an Int64 value to the current result followed by a line terminator</summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestContext.WriteLine(System.Decimal)\">\n            <summary>Write the string representation of a decimal value to the current result followed by a line terminator</summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestContext.WriteLine(System.Object)\">\n            <summary>Write the string representation of an object to the current result followed by a line terminator</summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestContext.WriteLine(System.Single)\">\n            <summary>Write the string representation of a Single value to the current result followed by a line terminator</summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestContext.WriteLine(System.String)\">\n            <summary>Write a string to the current result followed by a line terminator</summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestContext.WriteLine(System.UInt32)\">\n            <summary>Write the string representation of a UInt32 value to the current result followed by a line terminator</summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestContext.WriteLine(System.UInt64)\">\n            <summary>Write the string representation of a UInt64 value to the current result followed by a line terminator</summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestContext.WriteLine(System.String,System.Object)\">\n            <summary>Write a formatted string to the current result followed by a line terminator</summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestContext.WriteLine(System.String,System.Object,System.Object)\">\n            <summary>Write a formatted string to the current result followed by a line terminator</summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestContext.WriteLine(System.String,System.Object,System.Object,System.Object)\">\n            <summary>Write a formatted string to the current result followed by a line terminator</summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestContext.WriteLine(System.String,System.Object[])\">\n            <summary>Write a formatted string to the current result followed by a line terminator</summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestContext.AddFormatter(NUnit.Framework.Constraints.ValueFormatterFactory)\">\n            <summary>\n            This method adds the a new ValueFormatterFactory to the\n            chain of responsibility used for fomatting values in messages.\n            The scope of the change is the current TestContext.\n            </summary>\n            <param name=\"formatterFactory\">The factory delegate</param>\n        </member>\n        <member name=\"M:NUnit.Framework.TestContext.AddFormatter``1(NUnit.Framework.Constraints.ValueFormatter)\">\n            <summary>\n            This method provides a simplified way to add a ValueFormatter\n            delegate to the chain of responsibility, creating the factory\n            delegate internally. It is useful when the Type of the object\n            is the only criterion for selection of the formatter, since\n            it can be used without getting involved with a compould function.\n            </summary>\n            <typeparam name=\"TSUPPORTED\">The type supported by this formatter</typeparam>\n            <param name=\"formatter\">The ValueFormatter delegate</param>\n        </member>\n        <member name=\"P:NUnit.Framework.TestContext.CurrentContext\">\n            <summary>\n            Get the current test context. This is created\n            as needed. The user may save the context for\n            use within a test, but it should not be used\n            outside the test for which it is created.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestContext.Out\">\n            <summary>\n            Gets a TextWriter that will send output to the current test result.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestContext.Test\">\n            <summary>\n            Get a representation of the current test.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestContext.Result\">\n            <summary>\n            Gets a Representation of the TestResult for the current test. \n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestContext.WorkerId\">\n            <summary>\n            Gets the unique name of the  Worker that is executing this test.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestContext.TestDirectory\">\n            <summary>\n            Gets the directory containing the current test assembly.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestContext.WorkDirectory\">\n            <summary>\n            Gets the directory to be used for outputting files created\n            by this test run.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestContext.Random\">\n            <summary>\n            Gets the random generator.\n            </summary>\n            <value>\n            The random generator.\n            </value>\n        </member>\n        <member name=\"T:NUnit.Framework.TestContext.TestAdapter\">\n            <summary>\n            TestAdapter adapts a Test for consumption by\n            the user test code.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestContext.TestAdapter.#ctor(NUnit.Framework.Internal.Test)\">\n            <summary>\n            Construct a TestAdapter for a Test\n            </summary>\n            <param name=\"test\">The Test to be adapted</param>\n        </member>\n        <member name=\"P:NUnit.Framework.TestContext.TestAdapter.ID\">\n            <summary>\n            Gets the unique Id of a test\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestContext.TestAdapter.Name\">\n            <summary>\n            The name of the test, which may or may not be\n            the same as the method name.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestContext.TestAdapter.MethodName\">\n            <summary>\n            The name of the method representing the test.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestContext.TestAdapter.FullName\">\n            <summary>\n            The FullName of the test\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestContext.TestAdapter.ClassName\">\n            <summary>\n            The ClassName of the test\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestContext.TestAdapter.Properties\">\n            <summary>\n            The properties of the test.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.TestContext.ResultAdapter\">\n            <summary>\n            ResultAdapter adapts a TestResult for consumption by\n            the user test code.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestContext.ResultAdapter.#ctor(NUnit.Framework.Internal.TestResult)\">\n            <summary>\n            Construct a ResultAdapter for a TestResult\n            </summary>\n            <param name=\"result\">The TestResult to be adapted</param>\n        </member>\n        <member name=\"P:NUnit.Framework.TestContext.ResultAdapter.Outcome\">\n            <summary>\n            Gets a ResultState representing the outcome of the test.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestContext.ResultAdapter.Message\">\n            <summary>\n            Gets the message associated with a test\n            failure or with not running the test\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestContext.ResultAdapter.StackTrace\">\n            <summary>\n            Gets any stacktrace associated with an\n            error or failure.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestContext.ResultAdapter.FailCount\">\n            <summary>\n            Gets the number of test cases that failed\n            when running the test and all its children.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestContext.ResultAdapter.PassCount\">\n            <summary>\n            Gets the number of test cases that passed\n            when running the test and all its children.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestContext.ResultAdapter.SkipCount\">\n            <summary>\n            Gets the number of test cases that were skipped\n            when running the test and all its children.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestContext.ResultAdapter.InconclusiveCount\">\n            <summary>\n            Gets the number of test cases that were inconclusive\n            when running the test and all its children.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.ExceptionHelper\">\n            <summary>\n            ExceptionHelper provides static methods for working with exceptions\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.ExceptionHelper.Rethrow(System.Exception)\">\n            <summary>\n            Rethrows an exception, preserving its stack trace\n            </summary>\n            <param name=\"exception\">The exception to rethrow</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.ExceptionHelper.BuildMessage(System.Exception)\">\n            <summary>\n            Builds up a message, using the Message field of the specified exception\n            as well as any InnerExceptions.\n            </summary>\n            <param name=\"exception\">The exception.</param>\n            <returns>A combined message string.</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.ExceptionHelper.BuildStackTrace(System.Exception)\">\n            <summary>\n            Builds up a message, using the Message field of the specified exception\n            as well as any InnerExceptions.\n            </summary>\n            <param name=\"exception\">The exception.</param>\n            <returns>A combined stack trace.</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.ExceptionHelper.GetStackTrace(System.Exception)\">\n            <summary>\n            Gets the stack trace of the exception.\n            </summary>\n            <param name=\"exception\">The exception.</param>\n            <returns>A string representation of the stack trace.</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.CultureDetector\">\n            <summary>\n            CultureDetector is a helper class used by NUnit to determine\n            whether a test should be run based on the current culture.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.CultureDetector.#ctor\">\n            <summary>\n            Default constructor uses the current culture.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.CultureDetector.#ctor(System.String)\">\n            <summary>\n            Construct a CultureDetector for a particular culture for testing.\n            </summary>\n            <param name=\"culture\">The culture to be used</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.CultureDetector.IsCultureSupported(System.String[])\">\n            <summary>\n            Test to determine if one of a collection of cultures\n            is being used currently.\n            </summary>\n            <param name=\"cultures\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.CultureDetector.IsCultureSupported(NUnit.Framework.CultureAttribute)\">\n            <summary>\n            Tests to determine if the current culture is supported\n            based on a culture attribute.\n            </summary>\n            <param name=\"cultureAttribute\">The attribute to examine</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.CultureDetector.IsCultureSupported(System.String)\">\n            <summary>\n            Test to determine if the a particular culture or comma-\n            delimited set of cultures is in use.\n            </summary>\n            <param name=\"culture\">Name of the culture or comma-separated list of culture ids</param>\n            <returns>True if the culture is in use on the system</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.CultureDetector.Reason\">\n            <summary>\n            Return the last failure reason. Results are not\n            defined if called before IsSupported( Attribute )\n            is called.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Builders.PairwiseStrategy\">\n            <summary>\n            PairwiseStrategy creates test cases by combining the parameter\n            data so that all possible pairs of data items are used.\n            </summary>\n            <remarks>\n            <para>\n            The number of test cases that cover all possible pairs of test function\n            parameters values is significantly less than the number of test cases\n            that cover all possible combination of test function parameters values.\n            And because different studies show that most of software failures are\n            caused by combination of no more than two parameters, pairwise testing\n            can be an effective ways to test the system when it's impossible to test\n            all combinations of parameters.\n            </para>\n            <para>\n            The PairwiseStrategy code is based on \"jenny\" tool by Bob Jenkins:\n            http://burtleburtle.net/bob/math/jenny.html\n            </para>\n            </remarks>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Builders.PairwiseStrategy.GetTestCases(System.Collections.IEnumerable[])\">\n            <summary>\n            Gets the test cases generated by this strategy instance.\n            </summary>\n            <returns>A set of test cases.</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Builders.PairwiseStrategy.FleaRand\">\n            <summary>\n            FleaRand is a pseudo-random number generator developed by Bob Jenkins:\n            http://burtleburtle.net/bob/rand/talksmall.html#flea\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Builders.PairwiseStrategy.FleaRand.#ctor(System.UInt32)\">\n            <summary>\n            Initializes a new instance of the FleaRand class.\n            </summary>\n            <param name=\"seed\">The seed.</param>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Builders.PairwiseStrategy.FeatureInfo\">\n            <summary>\n            FeatureInfo represents coverage of a single value of test function\n            parameter, represented as a pair of indices, Dimension and Feature. In\n            terms of unit testing, Dimension is the index of the test parameter and\n            Feature is the index of the supplied value in that parameter's list of\n            sources.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Builders.PairwiseStrategy.FeatureInfo.#ctor(System.Int32,System.Int32)\">\n            <summary>\n            Initializes a new instance of FeatureInfo class.\n            </summary>\n            <param name=\"dimension\">Index of a dimension.</param>\n            <param name=\"feature\">Index of a feature.</param>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Builders.PairwiseStrategy.FeatureTuple\">\n            <summary>\n            A FeatureTuple represents a combination of features, one per test\n            parameter, which should be covered by a test case. In the\n            PairwiseStrategy, we are only trying to cover pairs of features, so the\n            tuples actually may contain only single feature or pair of features, but\n            the algorithm itself works with triplets, quadruples and so on.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Builders.PairwiseStrategy.FeatureTuple.#ctor(NUnit.Framework.Internal.Builders.PairwiseStrategy.FeatureInfo)\">\n            <summary>\n            Initializes a new instance of FeatureTuple class for a single feature.\n            </summary>\n            <param name=\"feature1\">Single feature.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Builders.PairwiseStrategy.FeatureTuple.#ctor(NUnit.Framework.Internal.Builders.PairwiseStrategy.FeatureInfo,NUnit.Framework.Internal.Builders.PairwiseStrategy.FeatureInfo)\">\n            <summary>\n            Initializes a new instance of FeatureTuple class for a pair of features.\n            </summary>\n            <param name=\"feature1\">First feature.</param>\n            <param name=\"feature2\">Second feature.</param>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Builders.PairwiseStrategy.TestCaseInfo\">\n            <summary>\n            TestCase represents a single test case covering a list of features.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Builders.PairwiseStrategy.TestCaseInfo.#ctor(System.Int32)\">\n            <summary>\n            Initializes a new instance of TestCaseInfo class.\n            </summary>\n            <param name=\"length\">A number of features in the test case.</param>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Builders.PairwiseStrategy.PairwiseTestCaseGenerator\">\n            <summary>\n            PairwiseTestCaseGenerator class implements an algorithm which generates\n            a set of test cases which covers all pairs of possible values of test\n            function.\n            </summary>\n            <remarks>\n            <para>\n            The algorithm starts with creating a set of all feature tuples which we\n            will try to cover (see <see cref=\"M:NUnit.Framework.Internal.Builders.PairwiseStrategy.PairwiseTestCaseGenerator.CreateAllTuples\"/> method). This set\n            includes every single feature and all possible pairs of features. We\n            store feature tuples in the 3-D collection (where axes are \"dimension\",\n            \"feature\", and \"all combinations which includes this feature\"), and for\n            every two feature (e.g. \"A\" and \"B\") we generate both (\"A\", \"B\") and\n            (\"B\", \"A\") pairs. This data structure extremely reduces the amount of\n            time needed to calculate coverage for a single test case (this\n            calculation is the most time-consuming part of the algorithm).\n            </para>\n            <para>\n            Then the algorithm picks one tuple from the uncovered tuple, creates a\n            test case that covers this tuple, and then removes this tuple and all\n            other tuples covered by this test case from the collection of uncovered\n            tuples.\n            </para>\n            <para>\n            Picking a tuple to cover\n            </para>\n            <para>\n            There are no any special rules defined for picking tuples to cover. We\n            just pick them one by one, in the order they were generated.\n            </para>\n            <para>\n            Test generation\n            </para>\n            <para>\n            Test generation starts from creating a completely random test case which\n            covers, nevertheless, previously selected tuple. Then the algorithm\n            tries to maximize number of tuples which this test covers.\n            </para>\n            <para>\n            Test generation and maximization process repeats seven times for every\n            selected tuple and then the algorithm picks the best test case (\"seven\"\n            is a magic number which provides good results in acceptable time).\n            </para>\n            <para>Maximizing test coverage</para>\n            <para>\n            To maximize tests coverage, the algorithm walks thru the list of mutable\n            dimensions (mutable dimension is a dimension that are not included in\n            the previously selected tuple). Then for every dimension, the algorithm\n            walks thru the list of features and checks if this feature provides\n            better coverage than randomly selected feature, and if yes keeps this\n            feature.\n            </para>\n            <para>\n            This process repeats while it shows progress. If the last iteration\n            doesn't improve coverage, the process ends.\n            </para>\n            <para>\n            In addition, for better results, before start every iteration, the\n            algorithm \"scrambles\" dimensions - so for every iteration dimension\n            probes in a different order.\n            </para>\n            </remarks>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Builders.PairwiseStrategy.PairwiseTestCaseGenerator.GetTestCases(System.Int32[])\">\n            <summary>\n            Creates a set of test cases for specified dimensions.\n            </summary>\n            <param name=\"dimensions\">\n            An array which contains information about dimensions. Each element of\n            this array represents a number of features in the specific dimension.\n            </param>\n            <returns>\n            A set of test cases.\n            </returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Builders.DatapointProvider\">\n            <summary>\n            Provides data from fields marked with the DatapointAttribute or the\n            DatapointsAttribute.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Interfaces.IParameterDataProvider\">\n            <summary>\n            The IDataPointProvider interface is used by extensions\n            that provide data for a single test parameter.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.IParameterDataProvider.HasDataFor(NUnit.Framework.Interfaces.IParameterInfo)\">\n            <summary>\n            Determine whether any data is available for a parameter.\n            </summary>\n            <param name=\"parameter\">An IParameterInfo representing one\n            argument to a parameterized test</param>\n            <returns>True if any data is available, otherwise false.</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.IParameterDataProvider.GetDataFor(NUnit.Framework.Interfaces.IParameterInfo)\">\n            <summary>\n            Return an IEnumerable providing data for use with the\n            supplied parameter.\n            </summary>\n            <param name=\"parameter\">An IParameterInfo representing one\n            argument to a parameterized test</param>\n            <returns>An IEnumerable providing the required data</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Builders.DatapointProvider.HasDataFor(NUnit.Framework.Interfaces.IParameterInfo)\">\n            <summary>\n            Determine whether any data is available for a parameter.\n            </summary>\n            <param name=\"parameter\">A ParameterInfo representing one\n            argument to a parameterized test</param>\n            <returns>\n            True if any data is available, otherwise false.\n            </returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Builders.DatapointProvider.GetDataFor(NUnit.Framework.Interfaces.IParameterInfo)\">\n            <summary>\n            Return an IEnumerable providing data for use with the\n            supplied parameter.\n            </summary>\n            <param name=\"parameter\">A ParameterInfo representing one\n            argument to a parameterized test</param>\n            <returns>\n            An IEnumerable providing the required data\n            </returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Builders.CombinatorialStrategy\">\n            <summary>\n            CombinatorialStrategy creates test cases by using all possible\n            combinations of the parameter data.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Builders.CombinatorialStrategy.GetTestCases(System.Collections.IEnumerable[])\">\n            <summary>\n            Gets the test cases generated by the CombiningStrategy.\n            </summary>\n            <returns>The test cases.</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.ThrowsNothingConstraint\">\n            <summary>\n            ThrowsNothingConstraint tests that a delegate does not\n            throw an exception.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ThrowsNothingConstraint.ApplyTo(System.Object)\">\n            <summary>\n            Test whether the constraint is satisfied by a given value\n            </summary>\n            <param name=\"actual\">The value to be tested</param>\n            <returns>True if no exception is thrown, otherwise false</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ThrowsNothingConstraint.ApplyTo``1(NUnit.Framework.Constraints.ActualValueDelegate{``0})\">\n            <summary>\n            Applies the constraint to an ActualValueDelegate that returns \n            the value to be tested. The default implementation simply evaluates \n            the delegate but derived classes may override it to provide for \n            delayed processing.\n            </summary>\n            <param name=\"del\">An ActualValueDelegate</param>\n            <returns>A ConstraintResult</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ThrowsNothingConstraint.Description\">\n            <summary>\n            Gets text describing a constraint\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.OrOperator\">\n            <summary>\n            Operator that requires at least one of it's arguments to succeed\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.BinaryOperator\">\n            <summary>\n            Abstract base class for all binary operators\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.ConstraintOperator\">\n            <summary>\n            The ConstraintOperator class is used internally by a\n            ConstraintBuilder to represent an operator that \n            modifies or combines constraints. \n            \n            Constraint operators use left and right precedence\n            _values to determine whether the top operator on the\n            stack should be reduced before pushing a new operator.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.ConstraintOperator.left_precedence\">\n            <summary>\n            The precedence value used when the operator\n            is about to be pushed to the stack.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.ConstraintOperator.right_precedence\">\n            <summary>\n            The precedence value used when the operator\n            is on the top of the stack.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintOperator.Reduce(NUnit.Framework.Constraints.ConstraintBuilder.ConstraintStack)\">\n            <summary>\n            Reduce produces a constraint from the operator and \n            any arguments. It takes the arguments from the constraint \n            stack and pushes the resulting constraint on it.\n            </summary>\n            <param name=\"stack\"></param>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintOperator.LeftContext\">\n            <summary>\n            The syntax element preceding this operator\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintOperator.RightContext\">\n            <summary>\n            The syntax element following this operator\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintOperator.LeftPrecedence\">\n            <summary>\n            The precedence value used when the operator\n            is about to be pushed to the stack.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintOperator.RightPrecedence\">\n            <summary>\n            The precedence value used when the operator\n            is on the top of the stack.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.BinaryOperator.Reduce(NUnit.Framework.Constraints.ConstraintBuilder.ConstraintStack)\">\n            <summary>\n            Reduce produces a constraint from the operator and \n            any arguments. It takes the arguments from the constraint \n            stack and pushes the resulting constraint on it.\n            </summary>\n            <param name=\"stack\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.BinaryOperator.ApplyOperator(NUnit.Framework.Constraints.IConstraint,NUnit.Framework.Constraints.IConstraint)\">\n            <summary>\n            Abstract method that produces a constraint by applying\n            the operator to its left and right constraint arguments.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.BinaryOperator.LeftPrecedence\">\n            <summary>\n            Gets the left precedence of the operator\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.BinaryOperator.RightPrecedence\">\n            <summary>\n            Gets the right precedence of the operator\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.OrOperator.#ctor\">\n            <summary>\n            Construct an OrOperator\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.OrOperator.ApplyOperator(NUnit.Framework.Constraints.IConstraint,NUnit.Framework.Constraints.IConstraint)\">\n            <summary>\n            Apply the operator to produce an OrConstraint\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.Numerics\">\n            <summary>\n            The Numerics class contains common operations on numeric _values.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.Numerics.IsNumericType(System.Object)\">\n            <summary>\n            Checks the type of the object, returning true if\n            the object is a numeric type.\n            </summary>\n            <param name=\"obj\">The object to check</param>\n            <returns>true if the object is a numeric type</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.Numerics.IsFloatingPointNumeric(System.Object)\">\n            <summary>\n            Checks the type of the object, returning true if\n            the object is a floating point numeric type.\n            </summary>\n            <param name=\"obj\">The object to check</param>\n            <returns>true if the object is a floating point numeric type</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.Numerics.IsFixedPointNumeric(System.Object)\">\n            <summary>\n            Checks the type of the object, returning true if\n            the object is a fixed point numeric type.\n            </summary>\n            <param name=\"obj\">The object to check</param>\n            <returns>true if the object is a fixed point numeric type</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.Numerics.AreEqual(System.Object,System.Object,NUnit.Framework.Constraints.Tolerance@)\">\n            <summary>\n            Test two numeric _values for equality, performing the usual numeric \n            conversions and using a provided or default tolerance. If the tolerance \n            provided is Empty, this method may set it to a default tolerance.\n            </summary>\n            <param name=\"expected\">The expected value</param>\n            <param name=\"actual\">The actual value</param>\n            <param name=\"tolerance\">A reference to the tolerance in effect</param>\n            <returns>True if the _values are equal</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.Numerics.Compare(System.Object,System.Object)\">\n            <summary>\n            Compare two numeric _values, performing the usual numeric conversions.\n            </summary>\n            <param name=\"expected\">The expected value</param>\n            <param name=\"actual\">The actual value</param>\n            <returns>The relationship of the _values to each other</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.FalseConstraint\">\n            <summary>\n            FalseConstraint tests that the actual value is false\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.FalseConstraint.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Constraints.FalseConstraint\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.FalseConstraint.ApplyTo(System.Object)\">\n            <summary>\n            Test whether the constraint is satisfied by a given value\n            </summary>\n            <param name=\"actual\">The value to be tested</param>\n            <returns>True for success, false for failure</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.TestFixtureAttribute\">\n            <summary>\n            TestFixtureAttribute is used to mark a class that represents a TestFixture.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Interfaces.ITestFixtureData\">\n            <summary>\n            The ITestCaseData interface is implemented by a class\n            that is able to return the data required to create an\n            instance of a parameterized test fixture.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Interfaces.ITestData\">\n            <summary>\n            The ITestData interface is implemented by a class that\n            represents a single instance of a parameterized test.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITestData.TestName\">\n            <summary>\n            Gets the name to be used for the test\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITestData.RunState\">\n            <summary>\n            Gets the RunState for this test case.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITestData.Arguments\">\n            <summary>\n            Gets the argument list to be provided to the test\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITestData.Properties\">\n            <summary>\n            Gets the property dictionary for the test case\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITestFixtureData.TypeArgs\">\n            <summary>\n            Get the TypeArgs if separately set\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestFixtureAttribute.#ctor\">\n            <summary>\n            Default constructor\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestFixtureAttribute.#ctor(System.Object[])\">\n            <summary>\n            Construct with a object[] representing a set of arguments. \n            In .NET 2.0, the arguments may later be separated into\n            type arguments and constructor arguments.\n            </summary>\n            <param name=\"arguments\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.TestFixtureAttribute.BuildFrom(NUnit.Framework.Interfaces.ITypeInfo)\">\n            <summary>\n            Build a fixture from type provided. Normally called for a Type\n            on which the attribute has been placed.\n            </summary>\n            <param name=\"typeInfo\">The type info of the fixture to be used.</param>\n            <returns>A an IEnumerable holding one TestFixture object.</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.TestFixtureAttribute.TestName\">\n            <summary>\n            Gets or sets the name of the test.\n            </summary>\n            <value>The name of the test.</value>\n        </member>\n        <member name=\"P:NUnit.Framework.TestFixtureAttribute.RunState\">\n            <summary>\n            Gets or sets the RunState of this test fixture.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestFixtureAttribute.Arguments\">\n            <summary>\n            The arguments originally provided to the attribute\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestFixtureAttribute.Properties\">\n            <summary>\n            Properties pertaining to this fixture\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestFixtureAttribute.TypeArgs\">\n            <summary>\n            Get or set the type arguments. If not set\n            explicitly, any leading arguments that are\n            Types are taken as type arguments.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestFixtureAttribute.Description\">\n            <summary>\n            Descriptive text for this fixture\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestFixtureAttribute.Author\">\n            <summary>\n            The author of this fixture\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestFixtureAttribute.TestOf\">\n            <summary>\n            The type that this fixture is testing\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestFixtureAttribute.Ignore\">\n            <summary>\n            Gets or sets the ignore reason. May set RunState as a side effect.\n            </summary>\n            <value>The ignore reason.</value>\n        </member>\n        <member name=\"P:NUnit.Framework.TestFixtureAttribute.Reason\">\n            <summary>\n            Gets or sets the reason for not running the fixture.\n            </summary>\n            <value>The reason.</value>\n        </member>\n        <member name=\"P:NUnit.Framework.TestFixtureAttribute.IgnoreReason\">\n            <summary>\n            Gets or sets the ignore reason. When set to a non-null\n            non-empty value, the test is marked as ignored.\n            </summary>\n            <value>The ignore reason.</value>\n        </member>\n        <member name=\"P:NUnit.Framework.TestFixtureAttribute.Explicit\">\n            <summary>\n            Gets or sets a value indicating whether this <see cref=\"T:NUnit.Framework.TestFixtureAttribute\"/> is explicit.\n            </summary>\n            <value>\n            <c>true</c> if explicit; otherwise, <c>false</c>.\n            </value>\n        </member>\n        <member name=\"P:NUnit.Framework.TestFixtureAttribute.Category\">\n            <summary>\n            Gets and sets the category for this fixture.\n            May be a comma-separated list of categories.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.TestCaseAttribute\">\n            <summary>\n            TestCaseAttribute is used to mark parameterized test cases\n            and provide them with their arguments.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Interfaces.ITestCaseData\">\n            <summary>\n            The ITestCaseData interface is implemented by a class\n            that is able to return complete testcases for use by\n            a parameterized test method.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITestCaseData.ExpectedResult\">\n            <summary>\n            Gets the expected result of the test case\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ITestCaseData.HasExpectedResult\">\n            <summary>\n            Returns true if an expected result has been set\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Interfaces.IImplyFixture\">\n            <summary>\n            IImplyFixture is an empty marker interface used by attributes like\n            TestAttribute that cause the class where they are used to be treated\n            as a TestFixture even without a TestFixtureAttribute.\n            \n            Marker interfaces are not usually considered a good practice, but\n            we use it here to avoid cluttering the attribute hierarchy with \n            classes that don't contain any extra implementation.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestCaseAttribute.#ctor(System.Object[])\">\n            <summary>\n            Construct a TestCaseAttribute with a list of arguments.\n            This constructor is not CLS-Compliant\n            </summary>\n            <param name=\"arguments\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.TestCaseAttribute.#ctor(System.Object)\">\n            <summary>\n            Construct a TestCaseAttribute with a single argument\n            </summary>\n            <param name=\"arg\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.TestCaseAttribute.#ctor(System.Object,System.Object)\">\n            <summary>\n            Construct a TestCaseAttribute with a two arguments\n            </summary>\n            <param name=\"arg1\"></param>\n            <param name=\"arg2\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.TestCaseAttribute.#ctor(System.Object,System.Object,System.Object)\">\n            <summary>\n            Construct a TestCaseAttribute with a three arguments\n            </summary>\n            <param name=\"arg1\"></param>\n            <param name=\"arg2\"></param>\n            <param name=\"arg3\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.TestCaseAttribute.PerformSpecialConversions(System.Object[],NUnit.Framework.Interfaces.IParameterInfo[])\">\n            <summary>\n            Performs several special conversions allowed by NUnit in order to\n            permit arguments with types that cannot be used in the constructor\n            of an Attribute such as TestCaseAttribute or to simplify their use.\n            </summary>\n            <param name=\"arglist\">The arguments to be converted</param>\n            <param name=\"parameters\">The ParameterInfo array for the method</param>\n        </member>\n        <member name=\"M:NUnit.Framework.TestCaseAttribute.BuildFrom(NUnit.Framework.Interfaces.IMethodInfo,NUnit.Framework.Internal.Test)\">\n            <summary>\n            Construct one or more TestMethods from a given MethodInfo,\n            using available parameter data.\n            </summary>\n            <param name=\"method\">The MethodInfo for which tests are to be constructed.</param>\n            <param name=\"suite\">The suite to which the tests will be added.</param>\n            <returns>One or more TestMethods</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.TestCaseAttribute.TestName\">\n            <summary>\n            Gets or sets the name of the test.\n            </summary>\n            <value>The name of the test.</value>\n        </member>\n        <member name=\"P:NUnit.Framework.TestCaseAttribute.RunState\">\n            <summary>\n            Gets or sets the RunState of this test case.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestCaseAttribute.Arguments\">\n            <summary>\n            Gets the list of arguments to a test case\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestCaseAttribute.Properties\">\n            <summary>\n            Gets the properties of the test case\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestCaseAttribute.ExpectedResult\">\n            <summary>\n            Gets or sets the expected result.\n            </summary>\n            <value>The result.</value>\n        </member>\n        <member name=\"P:NUnit.Framework.TestCaseAttribute.HasExpectedResult\">\n            <summary>\n            Returns true if the expected result has been set\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestCaseAttribute.Description\">\n            <summary>\n            Gets or sets the description.\n            </summary>\n            <value>The description.</value>\n        </member>\n        <member name=\"P:NUnit.Framework.TestCaseAttribute.Author\">\n            <summary>\n            The author of this test\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestCaseAttribute.TestOf\">\n            <summary>\n            The type that this test is testing\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestCaseAttribute.Ignore\">\n            <summary>\n            Gets or sets the reason for ignoring the test\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestCaseAttribute.Explicit\">\n            <summary>\n            Gets or sets a value indicating whether this <see cref=\"T:NUnit.Framework.TestCaseAttribute\"/> is explicit.\n            </summary>\n            <value>\n            <c>true</c> if explicit; otherwise, <c>false</c>.\n            </value>\n        </member>\n        <member name=\"P:NUnit.Framework.TestCaseAttribute.Reason\">\n            <summary>\n            Gets or sets the reason for not running the test.\n            </summary>\n            <value>The reason.</value>\n        </member>\n        <member name=\"P:NUnit.Framework.TestCaseAttribute.IgnoreReason\">\n            <summary>\n            Gets or sets the ignore reason. When set to a non-null\n            non-empty value, the test is marked as ignored.\n            </summary>\n            <value>The ignore reason.</value>\n        </member>\n        <member name=\"P:NUnit.Framework.TestCaseAttribute.IncludePlatform\">\n            <summary>\n            Comma-delimited list of platforms to run the test for\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestCaseAttribute.ExcludePlatform\">\n            <summary>\n            Comma-delimited list of platforms to not run the test for\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestCaseAttribute.Category\">\n            <summary>\n            Gets and sets the category for this test case.\n            May be a comma-separated list of categories.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.GenericMethodHelper\">\n            <summary>\n            GenericMethodHelper is able to deduce the Type arguments for\n            a generic method from the actual arguments provided.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.GenericMethodHelper.#ctor(System.Reflection.MethodInfo)\">\n            <summary>\n            Construct a GenericMethodHelper for a method\n            </summary>\n            <param name=\"method\">MethodInfo for the method to examine</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.GenericMethodHelper.GetTypeArguments(System.Object[])\">\n            <summary>\n            Return the type argments for the method, deducing them\n            from the arguments actually provided.\n            </summary>\n            <param name=\"argList\">The arguments to the method</param>\n            <returns>An array of type arguments.</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Commands.TestActionCommand\">\n            <summary>\n            TestActionCommand runs the BeforeTest actions for a test,\n            then runs the test and finally runs the AfterTestActions.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Commands.TestActionCommand.#ctor(NUnit.Framework.Internal.Commands.TestCommand)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Internal.Commands.TestActionCommand\"/> class.\n            </summary>\n            <param name=\"innerCommand\">The inner command.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Commands.TestActionCommand.Execute(NUnit.Framework.Internal.ITestExecutionContext)\">\n            <summary>\n            Runs the test, saving a TestResult in the supplied TestExecutionContext.\n            </summary>\n            <param name=\"context\">The context in which the test should run.</param>\n            <returns>A TestResult</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Logger\">\n            <summary>\n            Provides internal logging to the NUnit framework\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.ILogger\">\n            <summary>\n            Interface for logging within the engine\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.ILogger.Error(System.String)\">\n            <summary>\n            Logs the specified message at the error level.\n            </summary>\n            <param name=\"message\">The message.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.ILogger.Error(System.String,System.Object[])\">\n            <summary>\n            Logs the specified message at the error level.\n            </summary>\n            <param name=\"message\">The message.</param>\n            <param name=\"args\">The arguments.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.ILogger.Warning(System.String)\">\n            <summary>\n            Logs the specified message at the warning level.\n            </summary>\n            <param name=\"message\">The message.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.ILogger.Warning(System.String,System.Object[])\">\n            <summary>\n            Logs the specified message at the warning level.\n            </summary>\n            <param name=\"message\">The message.</param>\n            <param name=\"args\">The arguments.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.ILogger.Info(System.String)\">\n            <summary>\n            Logs the specified message at the info level.\n            </summary>\n            <param name=\"message\">The message.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.ILogger.Info(System.String,System.Object[])\">\n            <summary>\n            Logs the specified message at the info level.\n            </summary>\n            <param name=\"message\">The message.</param>\n            <param name=\"args\">The arguments.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.ILogger.Debug(System.String)\">\n            <summary>\n            Logs the specified message at the debug level.\n            </summary>\n            <param name=\"message\">The message.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.ILogger.Debug(System.String,System.Object[])\">\n            <summary>\n            Logs the specified message at the debug level.\n            </summary>\n            <param name=\"message\">The message.</param>\n            <param name=\"args\">The arguments.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Logger.#ctor(System.String,NUnit.Framework.Internal.InternalTraceLevel,System.IO.TextWriter)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Internal.Logger\"/> class.\n            </summary>\n            <param name=\"name\">The name.</param>\n            <param name=\"level\">The log level.</param>\n            <param name=\"writer\">The writer where logs are sent.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Logger.Error(System.String)\">\n            <summary>\n            Logs the message at error level.\n            </summary>\n            <param name=\"message\">The message.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Logger.Error(System.String,System.Object[])\">\n            <summary>\n            Logs the message at error level.\n            </summary>\n            <param name=\"message\">The message.</param>\n            <param name=\"args\">The message arguments.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Logger.Warning(System.String)\">\n            <summary>\n            Logs the message at warm level.\n            </summary>\n            <param name=\"message\">The message.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Logger.Warning(System.String,System.Object[])\">\n            <summary>\n            Logs the message at warning level.\n            </summary>\n            <param name=\"message\">The message.</param>\n            <param name=\"args\">The message arguments.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Logger.Info(System.String)\">\n            <summary>\n            Logs the message at info level.\n            </summary>\n            <param name=\"message\">The message.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Logger.Info(System.String,System.Object[])\">\n            <summary>\n            Logs the message at info level.\n            </summary>\n            <param name=\"message\">The message.</param>\n            <param name=\"args\">The message arguments.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Logger.Debug(System.String)\">\n            <summary>\n            Logs the message at debug level.\n            </summary>\n            <param name=\"message\">The message.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Logger.Debug(System.String,System.Object[])\">\n            <summary>\n            Logs the message at debug level.\n            </summary>\n            <param name=\"message\">The message.</param>\n            <param name=\"args\">The message arguments.</param>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Filters.ClassNameFilter\">\n            <summary>\n            ClassName filter selects tests based on the class FullName\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Filters.ClassNameFilter.#ctor(System.String)\">\n            <summary>\n            Construct a FullNameFilter for a single name\n            </summary>\n            <param name=\"expectedValue\">The name the filter will recognize.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Filters.ClassNameFilter.Match(NUnit.Framework.Interfaces.ITest)\">\n            <summary>\n            Match a test against a single value.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Filters.ClassNameFilter.ElementName\">\n            <summary>\n            Gets the element name\n            </summary>\n            <value>Element name</value>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Filters.PropertyFilter\">\n            <summary>\n            PropertyFilter is able to select or exclude tests\n            based on their properties.\n            </summary>\n            \n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Filters.PropertyFilter.#ctor(System.String,System.String)\">\n            <summary>\n            Construct a PropertyFilter using a property name and expected value\n            </summary>\n            <param name=\"propertyName\">A property name</param>\n            <param name=\"expectedValue\">The expected value of the property</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Filters.PropertyFilter.Match(NUnit.Framework.Interfaces.ITest)\">\n            <summary>\n            Check whether the filter matches a test\n            </summary>\n            <param name=\"test\">The test to be matched</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Filters.PropertyFilter.AddToXml(NUnit.Framework.Interfaces.TNode,System.Boolean)\">\n            <summary>\n            Adds an XML node\n            </summary>\n            <param name=\"parentNode\">Parent node</param>\n            <param name=\"recursive\">True if recursive</param>\n            <returns>The added XML node</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Filters.PropertyFilter.ElementName\">\n            <summary>\n            Gets the element name\n            </summary>\n            <value>Element name</value>\n        </member>\n        <member name=\"T:NUnit.Env\">\n            <summary>\n            Env is a static class that provides some of the features of\n            System.Environment that are not available under all runtimes\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Env.NewLine\">\n            <summary>\n            The newline sequence in the current environment.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Env.DocumentFolder\">\n            <summary>\n            Path to the 'My Documents' folder\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Env.DefaultWorkDirectory\">\n            <summary>\n            Directory used for file output if not specified on commandline.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Assert\">\n            <summary>\n            The Assert class contains a collection of static methods that\n            implement the most common assertions used in NUnit.\n            </summary>\n            <summary>\n            The Assert class contains a collection of static methods that\n            implement the most common assertions used in NUnit.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.True(System.Nullable{System.Boolean},System.String,System.Object[])\">\n            <summary>\n            Asserts that a condition is true. If the condition is false the method throws\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/>.\n            </summary>\n            <param name=\"condition\">The evaluated condition</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.True(System.Boolean,System.String,System.Object[])\">\n            <summary>\n            Asserts that a condition is true. If the condition is false the method throws\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/>.\n            </summary>\n            <param name=\"condition\">The evaluated condition</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.True(System.Nullable{System.Boolean})\">\n            <summary>\n            Asserts that a condition is true. If the condition is false the method throws\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/>.\n            </summary>\n            <param name=\"condition\">The evaluated condition</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.True(System.Boolean)\">\n            <summary>\n            Asserts that a condition is true. If the condition is false the method throws\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/>.\n            </summary>\n            <param name=\"condition\">The evaluated condition</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.IsTrue(System.Nullable{System.Boolean},System.String,System.Object[])\">\n            <summary>\n            Asserts that a condition is true. If the condition is false the method throws\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/>.\n            </summary>\n            <param name=\"condition\">The evaluated condition</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.IsTrue(System.Boolean,System.String,System.Object[])\">\n            <summary>\n            Asserts that a condition is true. If the condition is false the method throws\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/>.\n            </summary>\n            <param name=\"condition\">The evaluated condition</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.IsTrue(System.Nullable{System.Boolean})\">\n            <summary>\n            Asserts that a condition is true. If the condition is false the method throws\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/>.\n            </summary>\n            <param name=\"condition\">The evaluated condition</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.IsTrue(System.Boolean)\">\n            <summary>\n            Asserts that a condition is true. If the condition is false the method throws\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/>.\n            </summary>\n            <param name=\"condition\">The evaluated condition</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.False(System.Nullable{System.Boolean},System.String,System.Object[])\">\n            <summary>\n            Asserts that a condition is false. If the condition is true the method throws\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/>.\n            </summary> \n            <param name=\"condition\">The evaluated condition</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.False(System.Boolean,System.String,System.Object[])\">\n            <summary>\n            Asserts that a condition is false. If the condition is true the method throws\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/>.\n            </summary> \n            <param name=\"condition\">The evaluated condition</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.False(System.Nullable{System.Boolean})\">\n            <summary>\n            Asserts that a condition is false. If the condition is true the method throws\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/>.\n            </summary> \n            <param name=\"condition\">The evaluated condition</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.False(System.Boolean)\">\n            <summary>\n            Asserts that a condition is false. If the condition is true the method throws\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/>.\n            </summary> \n            <param name=\"condition\">The evaluated condition</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.IsFalse(System.Nullable{System.Boolean},System.String,System.Object[])\">\n            <summary>\n            Asserts that a condition is false. If the condition is true the method throws\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/>.\n            </summary> \n            <param name=\"condition\">The evaluated condition</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.IsFalse(System.Boolean,System.String,System.Object[])\">\n            <summary>\n            Asserts that a condition is false. If the condition is true the method throws\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/>.\n            </summary> \n            <param name=\"condition\">The evaluated condition</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.IsFalse(System.Nullable{System.Boolean})\">\n            <summary>\n            Asserts that a condition is false. If the condition is true the method throws\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/>.\n            </summary> \n            <param name=\"condition\">The evaluated condition</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.IsFalse(System.Boolean)\">\n            <summary>\n            Asserts that a condition is false. If the condition is true the method throws\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/>.\n            </summary> \n            <param name=\"condition\">The evaluated condition</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.NotNull(System.Object,System.String,System.Object[])\">\n            <summary>\n            Verifies that the object that is passed in is not equal to <code>null</code>\n            If the object is <code>null</code> then an <see cref=\"T:NUnit.Framework.AssertionException\"/>\n            is thrown.\n            </summary>\n            <param name=\"anObject\">The object that is to be tested</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.NotNull(System.Object)\">\n            <summary>\n            Verifies that the object that is passed in is not equal to <code>null</code>\n            If the object is <code>null</code> then an <see cref=\"T:NUnit.Framework.AssertionException\"/>\n            is thrown.\n            </summary>\n            <param name=\"anObject\">The object that is to be tested</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.IsNotNull(System.Object,System.String,System.Object[])\">\n            <summary>\n            Verifies that the object that is passed in is not equal to <code>null</code>\n            If the object is <code>null</code> then an <see cref=\"T:NUnit.Framework.AssertionException\"/>\n            is thrown.\n            </summary>\n            <param name=\"anObject\">The object that is to be tested</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.IsNotNull(System.Object)\">\n            <summary>\n            Verifies that the object that is passed in is not equal to <code>null</code>\n            If the object is <code>null</code> then an <see cref=\"T:NUnit.Framework.AssertionException\"/>\n            is thrown.\n            </summary>\n            <param name=\"anObject\">The object that is to be tested</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Null(System.Object,System.String,System.Object[])\">\n            <summary>\n            Verifies that the object that is passed in is equal to <code>null</code>\n            If the object is not <code>null</code> then an <see cref=\"T:NUnit.Framework.AssertionException\"/>\n            is thrown.\n            </summary>\n            <param name=\"anObject\">The object that is to be tested</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Null(System.Object)\">\n            <summary>\n            Verifies that the object that is passed in is equal to <code>null</code>\n            If the object is not <code>null</code> then an <see cref=\"T:NUnit.Framework.AssertionException\"/>\n            is thrown.\n            </summary>\n            <param name=\"anObject\">The object that is to be tested</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.IsNull(System.Object,System.String,System.Object[])\">\n            <summary>\n            Verifies that the object that is passed in is equal to <code>null</code>\n            If the object is not <code>null</code> then an <see cref=\"T:NUnit.Framework.AssertionException\"/>\n            is thrown.\n            </summary>\n            <param name=\"anObject\">The object that is to be tested</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.IsNull(System.Object)\">\n            <summary>\n            Verifies that the object that is passed in is equal to <code>null</code>\n            If the object is not <code>null</code> then an <see cref=\"T:NUnit.Framework.AssertionException\"/>\n            is thrown.\n            </summary>\n            <param name=\"anObject\">The object that is to be tested</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.IsNaN(System.Double,System.String,System.Object[])\">\n            <summary>\n            Verifies that the double that is passed in is an <code>NaN</code> value.\n            If the object is not <code>NaN</code> then an <see cref=\"T:NUnit.Framework.AssertionException\"/>\n            is thrown.\n            </summary>\n            <param name=\"aDouble\">The value that is to be tested</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.IsNaN(System.Double)\">\n            <summary>\n            Verifies that the double that is passed in is an <code>NaN</code> value.\n            If the object is not <code>NaN</code> then an <see cref=\"T:NUnit.Framework.AssertionException\"/>\n            is thrown.\n            </summary>\n            <param name=\"aDouble\">The value that is to be tested</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.IsNaN(System.Nullable{System.Double},System.String,System.Object[])\">\n            <summary>\n            Verifies that the double that is passed in is an <code>NaN</code> value.\n            If the object is not <code>NaN</code> then an <see cref=\"T:NUnit.Framework.AssertionException\"/>\n            is thrown.\n            </summary>\n            <param name=\"aDouble\">The value that is to be tested</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.IsNaN(System.Nullable{System.Double})\">\n            <summary>\n            Verifies that the double that is passed in is an <code>NaN</code> value.\n            If the object is not <code>NaN</code> then an <see cref=\"T:NUnit.Framework.AssertionException\"/>\n            is thrown.\n            </summary>\n            <param name=\"aDouble\">The value that is to be tested</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.IsEmpty(System.String,System.String,System.Object[])\">\n            <summary>\n            Assert that a string is empty - that is equal to string.Empty\n            </summary>\n            <param name=\"aString\">The string to be tested</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.IsEmpty(System.String)\">\n            <summary>\n            Assert that a string is empty - that is equal to string.Empty\n            </summary>\n            <param name=\"aString\">The string to be tested</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.IsEmpty(System.Collections.IEnumerable,System.String,System.Object[])\">\n            <summary>\n            Assert that an array, list or other collection is empty\n            </summary>\n            <param name=\"collection\">An array, list or other collection implementing ICollection</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.IsEmpty(System.Collections.IEnumerable)\">\n            <summary>\n            Assert that an array, list or other collection is empty\n            </summary>\n            <param name=\"collection\">An array, list or other collection implementing ICollection</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.IsNotEmpty(System.String,System.String,System.Object[])\">\n            <summary>\n            Assert that a string is not empty - that is not equal to string.Empty\n            </summary>\n            <param name=\"aString\">The string to be tested</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.IsNotEmpty(System.String)\">\n            <summary>\n            Assert that a string is not empty - that is not equal to string.Empty\n            </summary>\n            <param name=\"aString\">The string to be tested</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.IsNotEmpty(System.Collections.IEnumerable,System.String,System.Object[])\">\n            <summary>\n            Assert that an array, list or other collection is not empty\n            </summary>\n            <param name=\"collection\">An array, list or other collection implementing ICollection</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.IsNotEmpty(System.Collections.IEnumerable)\">\n            <summary>\n            Assert that an array, list or other collection is not empty\n            </summary>\n            <param name=\"collection\">An array, list or other collection implementing ICollection</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Zero(System.Int32)\">\n            <summary>\n            Asserts that an int is zero.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Zero(System.Int32,System.String,System.Object[])\">\n            <summary>\n            Asserts that an int is zero.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Zero(System.UInt32)\">\n            <summary>\n            Asserts that an unsigned int is zero.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Zero(System.UInt32,System.String,System.Object[])\">\n            <summary>\n            Asserts that an unsigned int is zero.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Zero(System.Int64)\">\n            <summary>\n            Asserts that a Long is zero.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Zero(System.Int64,System.String,System.Object[])\">\n            <summary>\n            Asserts that a Long is zero.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Zero(System.UInt64)\">\n            <summary>\n            Asserts that an unsigned Long is zero.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Zero(System.UInt64,System.String,System.Object[])\">\n            <summary>\n            Asserts that an unsigned Long is zero.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Zero(System.Decimal)\">\n            <summary>\n            Asserts that a decimal is zero.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Zero(System.Decimal,System.String,System.Object[])\">\n            <summary>\n            Asserts that a decimal is zero.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Zero(System.Double)\">\n            <summary>\n            Asserts that a double is zero.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Zero(System.Double,System.String,System.Object[])\">\n            <summary>\n            Asserts that a double is zero.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Zero(System.Single)\">\n            <summary>\n            Asserts that a float is zero.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Zero(System.Single,System.String,System.Object[])\">\n            <summary>\n            Asserts that a float is zero.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.NotZero(System.Int32)\">\n            <summary>\n            Asserts that an int is not zero.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.NotZero(System.Int32,System.String,System.Object[])\">\n            <summary>\n            Asserts that an int is not zero.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.NotZero(System.UInt32)\">\n            <summary>\n            Asserts that an unsigned int is not zero.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.NotZero(System.UInt32,System.String,System.Object[])\">\n            <summary>\n            Asserts that an unsigned int is not zero.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.NotZero(System.Int64)\">\n            <summary>\n            Asserts that a Long is not zero.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.NotZero(System.Int64,System.String,System.Object[])\">\n            <summary>\n            Asserts that a Long is not zero.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.NotZero(System.UInt64)\">\n            <summary>\n            Asserts that an unsigned Long is not zero.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.NotZero(System.UInt64,System.String,System.Object[])\">\n            <summary>\n            Asserts that an unsigned Long is not zero.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.NotZero(System.Decimal)\">\n            <summary>\n            Asserts that a decimal is zero.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.NotZero(System.Decimal,System.String,System.Object[])\">\n            <summary>\n            Asserts that a decimal is zero.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.NotZero(System.Double)\">\n            <summary>\n            Asserts that a double is zero.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.NotZero(System.Double,System.String,System.Object[])\">\n            <summary>\n            Asserts that a double is zero.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.NotZero(System.Single)\">\n            <summary>\n            Asserts that a float is zero.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.NotZero(System.Single,System.String,System.Object[])\">\n            <summary>\n            Asserts that a float is zero.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Positive(System.Int32)\">\n            <summary>\n            Asserts that an int is negative.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Positive(System.Int32,System.String,System.Object[])\">\n            <summary>\n            Asserts that an int is negative.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Positive(System.UInt32)\">\n            <summary>\n            Asserts that an unsigned int is negative.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Positive(System.UInt32,System.String,System.Object[])\">\n            <summary>\n            Asserts that an unsigned int is negative.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Positive(System.Int64)\">\n            <summary>\n            Asserts that a Long is negative.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Positive(System.Int64,System.String,System.Object[])\">\n            <summary>\n            Asserts that a Long is negative.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Positive(System.UInt64)\">\n            <summary>\n            Asserts that an unsigned Long is negative.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Positive(System.UInt64,System.String,System.Object[])\">\n            <summary>\n            Asserts that an unsigned Long is negative.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Positive(System.Decimal)\">\n            <summary>\n            Asserts that a decimal is negative.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Positive(System.Decimal,System.String,System.Object[])\">\n            <summary>\n            Asserts that a decimal is negative.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Positive(System.Double)\">\n            <summary>\n            Asserts that a double is negative.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Positive(System.Double,System.String,System.Object[])\">\n            <summary>\n            Asserts that a double is negative.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Positive(System.Single)\">\n            <summary>\n            Asserts that a float is negative.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Positive(System.Single,System.String,System.Object[])\">\n            <summary>\n            Asserts that a float is negative.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Negative(System.Int32)\">\n            <summary>\n            Asserts that an int is negative.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Negative(System.Int32,System.String,System.Object[])\">\n            <summary>\n            Asserts that an int is negative.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Negative(System.UInt32)\">\n            <summary>\n            Asserts that an unsigned int is negative.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Negative(System.UInt32,System.String,System.Object[])\">\n            <summary>\n            Asserts that an unsigned int is negative.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Negative(System.Int64)\">\n            <summary>\n            Asserts that a Long is negative.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Negative(System.Int64,System.String,System.Object[])\">\n            <summary>\n            Asserts that a Long is negative.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Negative(System.UInt64)\">\n            <summary>\n            Asserts that an unsigned Long is negative.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Negative(System.UInt64,System.String,System.Object[])\">\n            <summary>\n            Asserts that an unsigned Long is negative.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Negative(System.Decimal)\">\n            <summary>\n            Asserts that a decimal is negative.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Negative(System.Decimal,System.String,System.Object[])\">\n            <summary>\n            Asserts that a decimal is negative.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Negative(System.Double)\">\n            <summary>\n            Asserts that a double is negative.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Negative(System.Double,System.String,System.Object[])\">\n            <summary>\n            Asserts that a double is negative.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Negative(System.Single)\">\n            <summary>\n            Asserts that a float is negative.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Negative(System.Single,System.String,System.Object[])\">\n            <summary>\n            Asserts that a float is negative.\n            </summary>\n            <param name=\"actual\">The number to be examined</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.IsAssignableFrom(System.Type,System.Object,System.String,System.Object[])\">\n            <summary>\n            Asserts that an object may be assigned a  value of a given Type.\n            </summary>\n            <param name=\"expected\">The expected Type.</param>\n            <param name=\"actual\">The object under examination</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.IsAssignableFrom(System.Type,System.Object)\">\n            <summary>\n            Asserts that an object may be assigned a  value of a given Type.\n            </summary>\n            <param name=\"expected\">The expected Type.</param>\n            <param name=\"actual\">The object under examination</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.IsAssignableFrom``1(System.Object,System.String,System.Object[])\">\n            <summary>\n            Asserts that an object may be assigned a  value of a given Type.\n            </summary>\n            <typeparam name=\"TExpected\">The expected Type.</typeparam>\n            <param name=\"actual\">The object under examination</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.IsAssignableFrom``1(System.Object)\">\n            <summary>\n            Asserts that an object may be assigned a  value of a given Type.\n            </summary>\n            <typeparam name=\"TExpected\">The expected Type.</typeparam>\n            <param name=\"actual\">The object under examination</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.IsNotAssignableFrom(System.Type,System.Object,System.String,System.Object[])\">\n            <summary>\n            Asserts that an object may not be assigned a  value of a given Type.\n            </summary>\n            <param name=\"expected\">The expected Type.</param>\n            <param name=\"actual\">The object under examination</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.IsNotAssignableFrom(System.Type,System.Object)\">\n            <summary>\n            Asserts that an object may not be assigned a  value of a given Type.\n            </summary>\n            <param name=\"expected\">The expected Type.</param>\n            <param name=\"actual\">The object under examination</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.IsNotAssignableFrom``1(System.Object,System.String,System.Object[])\">\n            <summary>\n            Asserts that an object may not be assigned a  value of a given Type.\n            </summary>\n            <typeparam name=\"TExpected\">The expected Type.</typeparam>\n            <param name=\"actual\">The object under examination</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.IsNotAssignableFrom``1(System.Object)\">\n            <summary>\n            Asserts that an object may not be assigned a  value of a given Type.\n            </summary>\n            <typeparam name=\"TExpected\">The expected Type.</typeparam>\n            <param name=\"actual\">The object under examination</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.IsInstanceOf(System.Type,System.Object,System.String,System.Object[])\">\n            <summary>\n            Asserts that an object is an instance of a given type.\n            </summary>\n            <param name=\"expected\">The expected Type</param>\n            <param name=\"actual\">The object being examined</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.IsInstanceOf(System.Type,System.Object)\">\n            <summary>\n            Asserts that an object is an instance of a given type.\n            </summary>\n            <param name=\"expected\">The expected Type</param>\n            <param name=\"actual\">The object being examined</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.IsInstanceOf``1(System.Object,System.String,System.Object[])\">\n            <summary>\n            Asserts that an object is an instance of a given type.\n            </summary>\n            <typeparam name=\"TExpected\">The expected Type</typeparam>\n            <param name=\"actual\">The object being examined</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.IsInstanceOf``1(System.Object)\">\n            <summary>\n            Asserts that an object is an instance of a given type.\n            </summary>\n            <typeparam name=\"TExpected\">The expected Type</typeparam>\n            <param name=\"actual\">The object being examined</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.IsNotInstanceOf(System.Type,System.Object,System.String,System.Object[])\">\n            <summary>\n            Asserts that an object is not an instance of a given type.\n            </summary>\n            <param name=\"expected\">The expected Type</param>\n            <param name=\"actual\">The object being examined</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.IsNotInstanceOf(System.Type,System.Object)\">\n            <summary>\n            Asserts that an object is not an instance of a given type.\n            </summary>\n            <param name=\"expected\">The expected Type</param>\n            <param name=\"actual\">The object being examined</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.IsNotInstanceOf``1(System.Object,System.String,System.Object[])\">\n            <summary>\n            Asserts that an object is not an instance of a given type.\n            </summary>\n            <typeparam name=\"TExpected\">The expected Type</typeparam>\n            <param name=\"actual\">The object being examined</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.IsNotInstanceOf``1(System.Object)\">\n            <summary>\n            Asserts that an object is not an instance of a given type.\n            </summary>\n            <typeparam name=\"TExpected\">The expected Type</typeparam>\n            <param name=\"actual\">The object being examined</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Throws(NUnit.Framework.Constraints.IResolveConstraint,NUnit.Framework.TestDelegate,System.String,System.Object[])\">\n            <summary>\n            Verifies that a delegate throws a particular exception when called.\n            </summary>\n            <param name=\"expression\">A constraint to be satisfied by the exception</param>\n            <param name=\"code\">A TestSnippet delegate</param>\n            <param name=\"message\">The message that will be displayed on failure</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Throws(NUnit.Framework.Constraints.IResolveConstraint,NUnit.Framework.TestDelegate)\">\n            <summary>\n            Verifies that a delegate throws a particular exception when called.\n            </summary>\n            <param name=\"expression\">A constraint to be satisfied by the exception</param>\n            <param name=\"code\">A TestSnippet delegate</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Throws(System.Type,NUnit.Framework.TestDelegate,System.String,System.Object[])\">\n            <summary>\n            Verifies that a delegate throws a particular exception when called.\n            </summary>\n            <param name=\"expectedExceptionType\">The exception Type expected</param>\n            <param name=\"code\">A TestDelegate</param>\n            <param name=\"message\">The message that will be displayed on failure</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Throws(System.Type,NUnit.Framework.TestDelegate)\">\n            <summary>\n            Verifies that a delegate throws a particular exception when called.\n            </summary>\n            <param name=\"expectedExceptionType\">The exception Type expected</param>\n            <param name=\"code\">A TestDelegate</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Throws``1(NUnit.Framework.TestDelegate,System.String,System.Object[])\">\n            <summary>\n            Verifies that a delegate throws a particular exception when called.\n            </summary>\n            <typeparam name=\"TActual\">Type of the expected exception</typeparam>\n            <param name=\"code\">A TestDelegate</param>\n            <param name=\"message\">The message that will be displayed on failure</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Throws``1(NUnit.Framework.TestDelegate)\">\n            <summary>\n            Verifies that a delegate throws a particular exception when called.\n            </summary>\n            <typeparam name=\"TActual\">Type of the expected exception</typeparam>\n            <param name=\"code\">A TestDelegate</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Catch(NUnit.Framework.TestDelegate,System.String,System.Object[])\">\n            <summary>\n            Verifies that a delegate throws an exception when called\n            and returns it.\n            </summary>\n            <param name=\"code\">A TestDelegate</param>\n            <param name=\"message\">The message that will be displayed on failure</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Catch(NUnit.Framework.TestDelegate)\">\n            <summary>\n            Verifies that a delegate throws an exception when called\n            and returns it.\n            </summary>\n            <param name=\"code\">A TestDelegate</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Catch(System.Type,NUnit.Framework.TestDelegate,System.String,System.Object[])\">\n            <summary>\n            Verifies that a delegate throws an exception of a certain Type\n            or one derived from it when called and returns it.\n            </summary>\n            <param name=\"expectedExceptionType\">The expected Exception Type</param>\n            <param name=\"code\">A TestDelegate</param>\n            <param name=\"message\">The message that will be displayed on failure</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Catch(System.Type,NUnit.Framework.TestDelegate)\">\n            <summary>\n            Verifies that a delegate throws an exception of a certain Type\n            or one derived from it when called and returns it.\n            </summary>\n            <param name=\"expectedExceptionType\">The expected Exception Type</param>\n            <param name=\"code\">A TestDelegate</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Catch``1(NUnit.Framework.TestDelegate,System.String,System.Object[])\">\n            <summary>\n            Verifies that a delegate throws an exception of a certain Type\n            or one derived from it when called and returns it.\n            </summary>\n            <param name=\"code\">A TestDelegate</param>\n            <param name=\"message\">The message that will be displayed on failure</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Catch``1(NUnit.Framework.TestDelegate)\">\n            <summary>\n            Verifies that a delegate throws an exception of a certain Type\n            or one derived from it when called and returns it.\n            </summary>\n            <param name=\"code\">A TestDelegate</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.DoesNotThrow(NUnit.Framework.TestDelegate,System.String,System.Object[])\">\n            <summary>\n            Verifies that a delegate does not throw an exception\n            </summary>\n            <param name=\"code\">A TestDelegate</param>\n            <param name=\"message\">The message that will be displayed on failure</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.DoesNotThrow(NUnit.Framework.TestDelegate)\">\n            <summary>\n            Verifies that a delegate does not throw an exception.\n            </summary>\n            <param name=\"code\">A TestDelegate</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.That(System.Boolean,System.String,System.Object[])\">\n            <summary>\n            Asserts that a condition is true. If the condition is false the method throws\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/>.\n            </summary> \n            <param name=\"condition\">The evaluated condition</param>\n            <param name=\"message\">The message to display if the condition is false</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.That(System.Boolean)\">\n            <summary>\n            Asserts that a condition is true. If the condition is false the method throws\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/>.\n            </summary>\n            <param name=\"condition\">The evaluated condition</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.That(System.Boolean,System.Func{System.String})\">\n            <summary>\n            Asserts that a condition is true. If the condition is false the method throws\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/>.\n            </summary> \n            <param name=\"condition\">The evaluated condition</param>\n            <param name=\"getExceptionMessage\">A function to build the message included with the Exception</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.That(System.Func{System.Boolean},System.String,System.Object[])\">\n            <summary>\n            Asserts that a condition is true. If the condition is false the method throws\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/>.\n            </summary> \n            <param name=\"condition\">A lambda that returns a Boolean</param>\n            <param name=\"message\">The message to display if the condition is false</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.That(System.Func{System.Boolean})\">\n            <summary>\n            Asserts that a condition is true. If the condition is false the method throws\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/>.\n            </summary>\n            <param name=\"condition\">A lambda that returns a Boolean</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.That(System.Func{System.Boolean},System.Func{System.String})\">\n            <summary>\n            Asserts that a condition is true. If the condition is false the method throws\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/>.\n            </summary> \n            <param name=\"condition\">A lambda that returns a Boolean</param>\n            <param name=\"getExceptionMessage\">A function to build the message included with the Exception</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.That``1(NUnit.Framework.Constraints.ActualValueDelegate{``0},NUnit.Framework.Constraints.IResolveConstraint)\">\n            <summary>\n            Apply a constraint to an actual value, succeeding if the constraint\n            is satisfied and throwing an assertion exception on failure.\n            </summary>\n            <typeparam name=\"TActual\">The Type being compared.</typeparam>\n            <param name=\"del\">An ActualValueDelegate returning the value to be tested</param>\n            <param name=\"expr\">A Constraint expression to be applied</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.That``1(NUnit.Framework.Constraints.ActualValueDelegate{``0},NUnit.Framework.Constraints.IResolveConstraint,System.String,System.Object[])\">\n            <summary>\n            Apply a constraint to an actual value, succeeding if the constraint\n            is satisfied and throwing an assertion exception on failure.\n            </summary>\n            <typeparam name=\"TActual\">The Type being compared.</typeparam>\n            <param name=\"del\">An ActualValueDelegate returning the value to be tested</param>\n            <param name=\"expr\">A Constraint expression to be applied</param>\n            <param name=\"message\">The message that will be displayed on failure</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.That``1(NUnit.Framework.Constraints.ActualValueDelegate{``0},NUnit.Framework.Constraints.IResolveConstraint,System.Func{System.String})\">\n            <summary>\n            Apply a constraint to an actual value, succeeding if the constraint\n            is satisfied and throwing an assertion exception on failure.\n            </summary>\n            <typeparam name=\"TActual\">The Type being compared.</typeparam>\n            <param name=\"del\">An ActualValueDelegate returning the value to be tested</param>\n            <param name=\"expr\">A Constraint expression to be applied</param>\n            <param name=\"getExceptionMessage\">A function to build the message included with the Exception</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.That(NUnit.Framework.TestDelegate,NUnit.Framework.Constraints.IResolveConstraint)\">\n            <summary>\n            Asserts that the code represented by a delegate throws an exception\n            that satisfies the constraint provided.\n            </summary>\n            <param name=\"code\">A TestDelegate to be executed</param>\n            <param name=\"constraint\">A ThrowsConstraint used in the test</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.That(NUnit.Framework.TestDelegate,NUnit.Framework.Constraints.IResolveConstraint,System.String,System.Object[])\">\n            <summary>\n            Asserts that the code represented by a delegate throws an exception\n            that satisfies the constraint provided.\n            </summary>\n            <param name=\"code\">A TestDelegate to be executed</param>\n            <param name=\"constraint\">A ThrowsConstraint used in the test</param>\n            <param name=\"message\">The message that will be displayed on failure</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.That(NUnit.Framework.TestDelegate,NUnit.Framework.Constraints.IResolveConstraint,System.Func{System.String})\">\n            <summary>\n            Asserts that the code represented by a delegate throws an exception\n            that satisfies the constraint provided.\n            </summary>\n            <param name=\"code\">A TestDelegate to be executed</param>\n            <param name=\"constraint\">A ThrowsConstraint used in the test</param>\n            <param name=\"getExceptionMessage\">A function to build the message included with the Exception</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.That``1(``0,NUnit.Framework.Constraints.IResolveConstraint)\">\n            <summary>\n            Apply a constraint to an actual value, succeeding if the constraint\n            is satisfied and throwing an assertion exception on failure.\n            </summary>\n            <typeparam name=\"TActual\">The Type being compared.</typeparam>\n            <param name=\"actual\">The actual value to test</param>\n            <param name=\"expression\">A Constraint to be applied</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.That``1(``0,NUnit.Framework.Constraints.IResolveConstraint,System.String,System.Object[])\">\n            <summary>\n            Apply a constraint to an actual value, succeeding if the constraint\n            is satisfied and throwing an assertion exception on failure.\n            </summary>\n            <typeparam name=\"TActual\">The Type being compared.</typeparam>\n            <param name=\"actual\">The actual value to test</param>\n            <param name=\"expression\">A Constraint expression to be applied</param>\n            <param name=\"message\">The message that will be displayed on failure</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.That``1(``0,NUnit.Framework.Constraints.IResolveConstraint,System.Func{System.String})\">\n            <summary>\n            Apply a constraint to an actual value, succeeding if the constraint\n            is satisfied and throwing an assertion exception on failure.\n            </summary>\n            <typeparam name=\"TActual\">The Type being compared.</typeparam>\n            <param name=\"actual\">The actual value to test</param>\n            <param name=\"expression\">A Constraint expression to be applied</param>\n            <param name=\"getExceptionMessage\">A function to build the message included with the Exception</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.ByVal(System.Object,NUnit.Framework.Constraints.IResolveConstraint)\">\n            <summary>\n            Apply a constraint to an actual value, succeeding if the constraint\n            is satisfied and throwing an assertion exception on failure.\n            Used as a synonym for That in rare cases where a private setter \n            causes a Visual Basic compilation error.\n            </summary>\n            <param name=\"actual\">The actual value to test</param>\n            <param name=\"expression\">A Constraint to be applied</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.ByVal(System.Object,NUnit.Framework.Constraints.IResolveConstraint,System.String,System.Object[])\">\n            <summary>\n            Apply a constraint to an actual value, succeeding if the constraint\n            is satisfied and throwing an assertion exception on failure. \n            Used as a synonym for That in rare cases where a private setter \n            causes a Visual Basic compilation error.\n            </summary>\n            <remarks>\n            This method is provided for use by VB developers needing to test\n            the value of properties with private setters.\n            </remarks>\n            <param name=\"actual\">The actual value to test</param>\n            <param name=\"expression\">A Constraint expression to be applied</param>\n            <param name=\"message\">The message that will be displayed on failure</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.#ctor\">\n            <summary>\n            We don't actually want any instances of this object, but some people\n            like to inherit from it to add other static methods. Hence, the\n            protected constructor disallows any instances of this object. \n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Equals(System.Object,System.Object)\">\n            <summary>\n            The Equals method throws an InvalidOperationException. This is done \n            to make sure there is no mistake by calling this function.\n            </summary>\n            <param name=\"a\"></param>\n            <param name=\"b\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.ReferenceEquals(System.Object,System.Object)\">\n            <summary>\n            override the default ReferenceEquals to throw an InvalidOperationException. This \n            implementation makes sure there is no mistake in calling this function \n            as part of Assert. \n            </summary>\n            <param name=\"a\"></param>\n            <param name=\"b\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Pass(System.String,System.Object[])\">\n            <summary>\n            Throws a <see cref=\"T:NUnit.Framework.SuccessException\"/> with the message and arguments \n            that are passed in. This allows a test to be cut short, with a result\n            of success returned to NUnit.\n            </summary>\n            <param name=\"message\">The message to initialize the <see cref=\"T:NUnit.Framework.AssertionException\"/> with.</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Pass(System.String)\">\n            <summary>\n            Throws a <see cref=\"T:NUnit.Framework.SuccessException\"/> with the message and arguments \n            that are passed in. This allows a test to be cut short, with a result\n            of success returned to NUnit.\n            </summary>\n            <param name=\"message\">The message to initialize the <see cref=\"T:NUnit.Framework.AssertionException\"/> with.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Pass\">\n            <summary>\n            Throws a <see cref=\"T:NUnit.Framework.SuccessException\"/> with the message and arguments \n            that are passed in. This allows a test to be cut short, with a result\n            of success returned to NUnit.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Fail(System.String,System.Object[])\">\n            <summary>\n            Throws an <see cref=\"T:NUnit.Framework.AssertionException\"/> with the message and arguments \n            that are passed in. This is used by the other Assert functions. \n            </summary>\n            <param name=\"message\">The message to initialize the <see cref=\"T:NUnit.Framework.AssertionException\"/> with.</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Fail(System.String)\">\n            <summary>\n            Throws an <see cref=\"T:NUnit.Framework.AssertionException\"/> with the message that is \n            passed in. This is used by the other Assert functions. \n            </summary>\n            <param name=\"message\">The message to initialize the <see cref=\"T:NUnit.Framework.AssertionException\"/> with.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Fail\">\n            <summary>\n            Throws an <see cref=\"T:NUnit.Framework.AssertionException\"/>. \n            This is used by the other Assert functions. \n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Ignore(System.String,System.Object[])\">\n            <summary>\n            Throws an <see cref=\"T:NUnit.Framework.IgnoreException\"/> with the message and arguments \n            that are passed in.  This causes the test to be reported as ignored.\n            </summary>\n            <param name=\"message\">The message to initialize the <see cref=\"T:NUnit.Framework.AssertionException\"/> with.</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Ignore(System.String)\">\n            <summary>\n            Throws an <see cref=\"T:NUnit.Framework.IgnoreException\"/> with the message that is \n            passed in. This causes the test to be reported as ignored. \n            </summary>\n            <param name=\"message\">The message to initialize the <see cref=\"T:NUnit.Framework.AssertionException\"/> with.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Ignore\">\n            <summary>\n            Throws an <see cref=\"T:NUnit.Framework.IgnoreException\"/>. \n            This causes the test to be reported as ignored. \n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Inconclusive(System.String,System.Object[])\">\n            <summary>\n            Throws an <see cref=\"T:NUnit.Framework.InconclusiveException\"/> with the message and arguments \n            that are passed in.  This causes the test to be reported as inconclusive.\n            </summary>\n            <param name=\"message\">The message to initialize the <see cref=\"T:NUnit.Framework.InconclusiveException\"/> with.</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Inconclusive(System.String)\">\n            <summary>\n            Throws an <see cref=\"T:NUnit.Framework.InconclusiveException\"/> with the message that is \n            passed in. This causes the test to be reported as inconclusive. \n            </summary>\n            <param name=\"message\">The message to initialize the <see cref=\"T:NUnit.Framework.InconclusiveException\"/> with.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Inconclusive\">\n            <summary>\n            Throws an <see cref=\"T:NUnit.Framework.InconclusiveException\"/>. \n            This causes the test to be reported as Inconclusive. \n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Contains(System.Object,System.Collections.ICollection,System.String,System.Object[])\">\n            <summary>\n            Asserts that an object is contained in a list.\n            </summary>\n            <param name=\"expected\">The expected object</param>\n            <param name=\"actual\">The list to be examined</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Contains(System.Object,System.Collections.ICollection)\">\n            <summary>\n            Asserts that an object is contained in a list.\n            </summary>\n            <param name=\"expected\">The expected object</param>\n            <param name=\"actual\">The list to be examined</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Greater(System.Int32,System.Int32,System.String,System.Object[])\">\n            <summary>\n            Verifies that the first int is greater than the second\n            int. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be greater</param>\n            <param name=\"arg2\">The second value, expected to be less</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Greater(System.Int32,System.Int32)\">\n            <summary>\n            Verifies that the first int is greater than the second\n            int. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be greater</param>\n            <param name=\"arg2\">The second value, expected to be less</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Greater(System.UInt32,System.UInt32,System.String,System.Object[])\">\n            <summary>\n            Verifies that the first value is greater than the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be greater</param>\n            <param name=\"arg2\">The second value, expected to be less</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Greater(System.UInt32,System.UInt32)\">\n            <summary>\n            Verifies that the first value is greater than the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be greater</param>\n            <param name=\"arg2\">The second value, expected to be less</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Greater(System.Int64,System.Int64,System.String,System.Object[])\">\n            <summary>\n            Verifies that the first value is greater than the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be greater</param>\n            <param name=\"arg2\">The second value, expected to be less</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Greater(System.Int64,System.Int64)\">\n            <summary>\n            Verifies that the first value is greater than the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be greater</param>\n            <param name=\"arg2\">The second value, expected to be less</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Greater(System.UInt64,System.UInt64,System.String,System.Object[])\">\n            <summary>\n            Verifies that the first value is greater than the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be greater</param>\n            <param name=\"arg2\">The second value, expected to be less</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Greater(System.UInt64,System.UInt64)\">\n            <summary>\n            Verifies that the first value is greater than the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be greater</param>\n            <param name=\"arg2\">The second value, expected to be less</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Greater(System.Decimal,System.Decimal,System.String,System.Object[])\">\n            <summary>\n            Verifies that the first value is greater than the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be greater</param>\n            <param name=\"arg2\">The second value, expected to be less</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Greater(System.Decimal,System.Decimal)\">\n            <summary>\n            Verifies that the first value is greater than the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be greater</param>\n            <param name=\"arg2\">The second value, expected to be less</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Greater(System.Double,System.Double,System.String,System.Object[])\">\n            <summary>\n            Verifies that the first value is greater than the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be greater</param>\n            <param name=\"arg2\">The second value, expected to be less</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Greater(System.Double,System.Double)\">\n            <summary>\n            Verifies that the first value is greater than the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be greater</param>\n            <param name=\"arg2\">The second value, expected to be less</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Greater(System.Single,System.Single,System.String,System.Object[])\">\n            <summary>\n            Verifies that the first value is greater than the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be greater</param>\n            <param name=\"arg2\">The second value, expected to be less</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Greater(System.Single,System.Single)\">\n            <summary>\n            Verifies that the first value is greater than the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be greater</param>\n            <param name=\"arg2\">The second value, expected to be less</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Greater(System.IComparable,System.IComparable,System.String,System.Object[])\">\n            <summary>\n            Verifies that the first value is greater than the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be greater</param>\n            <param name=\"arg2\">The second value, expected to be less</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Greater(System.IComparable,System.IComparable)\">\n            <summary>\n            Verifies that the first value is greater than the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be greater</param>\n            <param name=\"arg2\">The second value, expected to be less</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Less(System.Int32,System.Int32,System.String,System.Object[])\">\n            <summary>\n            Verifies that the first value is less than the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be less</param>\n            <param name=\"arg2\">The second value, expected to be greater</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Less(System.Int32,System.Int32)\">\n            <summary>\n            Verifies that the first value is less than the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be less</param>\n            <param name=\"arg2\">The second value, expected to be greater</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Less(System.UInt32,System.UInt32,System.String,System.Object[])\">\n            <summary>\n            Verifies that the first value is less than the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be less</param>\n            <param name=\"arg2\">The second value, expected to be greater</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Less(System.UInt32,System.UInt32)\">\n            <summary>\n            Verifies that the first value is less than the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be less</param>\n            <param name=\"arg2\">The second value, expected to be greater</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Less(System.Int64,System.Int64,System.String,System.Object[])\">\n            <summary>\n            Verifies that the first value is less than the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be less</param>\n            <param name=\"arg2\">The second value, expected to be greater</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Less(System.Int64,System.Int64)\">\n            <summary>\n            Verifies that the first value is less than the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be less</param>\n            <param name=\"arg2\">The second value, expected to be greater</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Less(System.UInt64,System.UInt64,System.String,System.Object[])\">\n            <summary>\n            Verifies that the first value is less than the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be less</param>\n            <param name=\"arg2\">The second value, expected to be greater</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Less(System.UInt64,System.UInt64)\">\n            <summary>\n            Verifies that the first value is less than the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be less</param>\n            <param name=\"arg2\">The second value, expected to be greater</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Less(System.Decimal,System.Decimal,System.String,System.Object[])\">\n            <summary>\n            Verifies that the first value is less than the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be less</param>\n            <param name=\"arg2\">The second value, expected to be greater</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Less(System.Decimal,System.Decimal)\">\n            <summary>\n            Verifies that the first value is less than the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be less</param>\n            <param name=\"arg2\">The second value, expected to be greater</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Less(System.Double,System.Double,System.String,System.Object[])\">\n            <summary>\n            Verifies that the first value is less than the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be less</param>\n            <param name=\"arg2\">The second value, expected to be greater</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Less(System.Double,System.Double)\">\n            <summary>\n            Verifies that the first value is less than the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be less</param>\n            <param name=\"arg2\">The second value, expected to be greater</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Less(System.Single,System.Single,System.String,System.Object[])\">\n            <summary>\n            Verifies that the first value is less than the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be less</param>\n            <param name=\"arg2\">The second value, expected to be greater</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Less(System.Single,System.Single)\">\n            <summary>\n            Verifies that the first value is less than the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be less</param>\n            <param name=\"arg2\">The second value, expected to be greater</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Less(System.IComparable,System.IComparable,System.String,System.Object[])\">\n            <summary>\n            Verifies that the first value is less than the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be less</param>\n            <param name=\"arg2\">The second value, expected to be greater</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.Less(System.IComparable,System.IComparable)\">\n            <summary>\n            Verifies that the first value is less than the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be less</param>\n            <param name=\"arg2\">The second value, expected to be greater</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.GreaterOrEqual(System.Int32,System.Int32,System.String,System.Object[])\">\n            <summary>\n            Verifies that the first value is greater than or equal to the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be greater</param>\n            <param name=\"arg2\">The second value, expected to be less</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.GreaterOrEqual(System.Int32,System.Int32)\">\n            <summary>\n            Verifies that the first value is greater than or equal to the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be greater</param>\n            <param name=\"arg2\">The second value, expected to be less</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.GreaterOrEqual(System.UInt32,System.UInt32,System.String,System.Object[])\">\n            <summary>\n            Verifies that the first value is greater than or equal to the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be greater</param>\n            <param name=\"arg2\">The second value, expected to be less</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.GreaterOrEqual(System.UInt32,System.UInt32)\">\n            <summary>\n            Verifies that the first value is greater than or equal to the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be greater</param>\n            <param name=\"arg2\">The second value, expected to be less</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.GreaterOrEqual(System.Int64,System.Int64,System.String,System.Object[])\">\n            <summary>\n            Verifies that the first value is greater than or equal to the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be greater</param>\n            <param name=\"arg2\">The second value, expected to be less</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.GreaterOrEqual(System.Int64,System.Int64)\">\n            <summary>\n            Verifies that the first value is greater than or equal to the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be greater</param>\n            <param name=\"arg2\">The second value, expected to be less</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.GreaterOrEqual(System.UInt64,System.UInt64,System.String,System.Object[])\">\n            <summary>\n            Verifies that the first value is greater than or equal to the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be greater</param>\n            <param name=\"arg2\">The second value, expected to be less</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.GreaterOrEqual(System.UInt64,System.UInt64)\">\n            <summary>\n            Verifies that the first value is greater than or equal to the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be greater</param>\n            <param name=\"arg2\">The second value, expected to be less</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.GreaterOrEqual(System.Decimal,System.Decimal,System.String,System.Object[])\">\n            <summary>\n            Verifies that the first value is greater than or equal to the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be greater</param>\n            <param name=\"arg2\">The second value, expected to be less</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.GreaterOrEqual(System.Decimal,System.Decimal)\">\n            <summary>\n            Verifies that the first value is greater than or equal to the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be greater</param>\n            <param name=\"arg2\">The second value, expected to be less</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.GreaterOrEqual(System.Double,System.Double,System.String,System.Object[])\">\n            <summary>\n            Verifies that the first value is greater than or equal to the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be greater</param>\n            <param name=\"arg2\">The second value, expected to be less</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.GreaterOrEqual(System.Double,System.Double)\">\n            <summary>\n            Verifies that the first value is greater than or equal to the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be greater</param>\n            <param name=\"arg2\">The second value, expected to be less</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.GreaterOrEqual(System.Single,System.Single,System.String,System.Object[])\">\n            <summary>\n            Verifies that the first value is greater than or equal to the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be greater</param>\n            <param name=\"arg2\">The second value, expected to be less</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.GreaterOrEqual(System.Single,System.Single)\">\n            <summary>\n            Verifies that the first value is greater than or equal to the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be greater</param>\n            <param name=\"arg2\">The second value, expected to be less</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.GreaterOrEqual(System.IComparable,System.IComparable,System.String,System.Object[])\">\n            <summary>\n            Verifies that the first value is greater than or equal to the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be greater</param>\n            <param name=\"arg2\">The second value, expected to be less</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.GreaterOrEqual(System.IComparable,System.IComparable)\">\n            <summary>\n            Verifies that the first value is greater than or equal to the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be greater</param>\n            <param name=\"arg2\">The second value, expected to be less</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.LessOrEqual(System.Int32,System.Int32,System.String,System.Object[])\">\n            <summary>\n            Verifies that the first value is less than or equal to the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be less</param>\n            <param name=\"arg2\">The second value, expected to be greater</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.LessOrEqual(System.Int32,System.Int32)\">\n            <summary>\n            Verifies that the first value is less than or equal to the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be less</param>\n            <param name=\"arg2\">The second value, expected to be greater</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.LessOrEqual(System.UInt32,System.UInt32,System.String,System.Object[])\">\n            <summary>\n            Verifies that the first value is less than or equal to the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be less</param>\n            <param name=\"arg2\">The second value, expected to be greater</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.LessOrEqual(System.UInt32,System.UInt32)\">\n            <summary>\n            Verifies that the first value is less than or equal to the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be less</param>\n            <param name=\"arg2\">The second value, expected to be greater</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.LessOrEqual(System.Int64,System.Int64,System.String,System.Object[])\">\n            <summary>\n            Verifies that the first value is less than or equal to the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be less</param>\n            <param name=\"arg2\">The second value, expected to be greater</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.LessOrEqual(System.Int64,System.Int64)\">\n            <summary>\n            Verifies that the first value is less than or equal to the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be less</param>\n            <param name=\"arg2\">The second value, expected to be greater</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.LessOrEqual(System.UInt64,System.UInt64,System.String,System.Object[])\">\n            <summary>\n            Verifies that the first value is less than or equal to the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be less</param>\n            <param name=\"arg2\">The second value, expected to be greater</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.LessOrEqual(System.UInt64,System.UInt64)\">\n            <summary>\n            Verifies that the first value is less than or equal to the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be less</param>\n            <param name=\"arg2\">The second value, expected to be greater</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.LessOrEqual(System.Decimal,System.Decimal,System.String,System.Object[])\">\n            <summary>\n            Verifies that the first value is less than or equal to the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be less</param>\n            <param name=\"arg2\">The second value, expected to be greater</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.LessOrEqual(System.Decimal,System.Decimal)\">\n            <summary>\n            Verifies that the first value is less than or equal to the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be less</param>\n            <param name=\"arg2\">The second value, expected to be greater</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.LessOrEqual(System.Double,System.Double,System.String,System.Object[])\">\n            <summary>\n            Verifies that the first value is less than or equal to the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be less</param>\n            <param name=\"arg2\">The second value, expected to be greater</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.LessOrEqual(System.Double,System.Double)\">\n            <summary>\n            Verifies that the first value is less than or equal to the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be less</param>\n            <param name=\"arg2\">The second value, expected to be greater</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.LessOrEqual(System.Single,System.Single,System.String,System.Object[])\">\n            <summary>\n            Verifies that the first value is less than or equal to the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be less</param>\n            <param name=\"arg2\">The second value, expected to be greater</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.LessOrEqual(System.Single,System.Single)\">\n            <summary>\n            Verifies that the first value is less than or equal to the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be less</param>\n            <param name=\"arg2\">The second value, expected to be greater</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.LessOrEqual(System.IComparable,System.IComparable,System.String,System.Object[])\">\n            <summary>\n            Verifies that the first value is less than or equal to the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be less</param>\n            <param name=\"arg2\">The second value, expected to be greater</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.LessOrEqual(System.IComparable,System.IComparable)\">\n            <summary>\n            Verifies that the first value is less than or equal to the second\n            value. If it is not, then an\n            <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown. \n            </summary>\n            <param name=\"arg1\">The first value, expected to be less</param>\n            <param name=\"arg2\">The second value, expected to be greater</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.AreEqual(System.Double,System.Double,System.Double,System.String,System.Object[])\">\n            <summary>\n            Verifies that two doubles are equal considering a delta. If the\n            expected value is infinity then the delta value is ignored. If \n            they are not equal then an <see cref=\"T:NUnit.Framework.AssertionException\"/> is\n            thrown.\n            </summary>\n            <param name=\"expected\">The expected value</param>\n            <param name=\"actual\">The actual value</param>\n            <param name=\"delta\">The maximum acceptable difference between the\n            the expected and the actual</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.AreEqual(System.Double,System.Double,System.Double)\">\n            <summary>\n            Verifies that two doubles are equal considering a delta. If the\n            expected value is infinity then the delta value is ignored. If \n            they are not equal then an <see cref=\"T:NUnit.Framework.AssertionException\"/> is\n            thrown.\n            </summary>\n            <param name=\"expected\">The expected value</param>\n            <param name=\"actual\">The actual value</param>\n            <param name=\"delta\">The maximum acceptable difference between the\n            the expected and the actual</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.AreEqual(System.Double,System.Nullable{System.Double},System.Double,System.String,System.Object[])\">\n            <summary>\n            Verifies that two doubles are equal considering a delta. If the\n            expected value is infinity then the delta value is ignored. If \n            they are not equal then an <see cref=\"T:NUnit.Framework.AssertionException\"/> is\n            thrown.\n            </summary>\n            <param name=\"expected\">The expected value</param>\n            <param name=\"actual\">The actual value</param>\n            <param name=\"delta\">The maximum acceptable difference between the\n            the expected and the actual</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.AreEqual(System.Double,System.Nullable{System.Double},System.Double)\">\n            <summary>\n            Verifies that two doubles are equal considering a delta. If the\n            expected value is infinity then the delta value is ignored. If \n            they are not equal then an <see cref=\"T:NUnit.Framework.AssertionException\"/> is\n            thrown.\n            </summary>\n            <param name=\"expected\">The expected value</param>\n            <param name=\"actual\">The actual value</param>\n            <param name=\"delta\">The maximum acceptable difference between the\n            the expected and the actual</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.AreEqual(System.Object,System.Object,System.String,System.Object[])\">\n            <summary>\n            Verifies that two objects are equal.  Two objects are considered\n            equal if both are null, or if both have the same value. NUnit\n            has special semantics for some object types.\n            If they are not equal an <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown.\n            </summary>\n            <param name=\"expected\">The value that is expected</param>\n            <param name=\"actual\">The actual value</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.AreEqual(System.Object,System.Object)\">\n            <summary>\n            Verifies that two objects are equal.  Two objects are considered\n            equal if both are null, or if both have the same value. NUnit\n            has special semantics for some object types.\n            If they are not equal an <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown.\n            </summary>\n            <param name=\"expected\">The value that is expected</param>\n            <param name=\"actual\">The actual value</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.AreNotEqual(System.Object,System.Object,System.String,System.Object[])\">\n            <summary>\n            Verifies that two objects are not equal.  Two objects are considered\n            equal if both are null, or if both have the same value. NUnit\n            has special semantics for some object types.\n            If they are equal an <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown.\n            </summary>\n            <param name=\"expected\">The value that is expected</param>\n            <param name=\"actual\">The actual value</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.AreNotEqual(System.Object,System.Object)\">\n            <summary>\n            Verifies that two objects are not equal.  Two objects are considered\n            equal if both are null, or if both have the same value. NUnit\n            has special semantics for some object types.\n            If they are equal an <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown.\n            </summary>\n            <param name=\"expected\">The value that is expected</param>\n            <param name=\"actual\">The actual value</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.AreSame(System.Object,System.Object,System.String,System.Object[])\">\n            <summary>\n            Asserts that two objects refer to the same object. If they\n            are not the same an <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown.\n            </summary>\n            <param name=\"expected\">The expected object</param>\n            <param name=\"actual\">The actual object</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.AreSame(System.Object,System.Object)\">\n            <summary>\n            Asserts that two objects refer to the same object. If they\n            are not the same an <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown.\n            </summary>\n            <param name=\"expected\">The expected object</param>\n            <param name=\"actual\">The actual object</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.AreNotSame(System.Object,System.Object,System.String,System.Object[])\">\n            <summary>\n            Asserts that two objects do not refer to the same object. If they\n            are the same an <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown.\n            </summary>\n            <param name=\"expected\">The expected object</param>\n            <param name=\"actual\">The actual object</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.AreNotSame(System.Object,System.Object)\">\n            <summary>\n            Asserts that two objects do not refer to the same object. If they\n            are the same an <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown.\n            </summary>\n            <param name=\"expected\">The expected object</param>\n            <param name=\"actual\">The actual object</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assert.AssertDoublesAreEqual(System.Double,System.Double,System.Double,System.String,System.Object[])\">\n            <summary>\n            Helper for Assert.AreEqual(double expected, double actual, ...)\n            allowing code generation to work consistently.\n            </summary>\n            <param name=\"expected\">The expected value</param>\n            <param name=\"actual\">The actual value</param>\n            <param name=\"delta\">The maximum acceptable difference between the\n            the expected and the actual</param>\n            <param name=\"message\">The message to display in case of failure</param>\n            <param name=\"args\">Array of objects to be used in formatting the message</param>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.AllOperator\">\n            <summary>\n            Represents a constraint that succeeds if all the \n            members of a collection match a base constraint.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.CollectionOperator\">\n            <summary>\n            Abstract base for operators that indicate how to\n            apply a constraint to items in a collection.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.PrefixOperator\">\n            <summary>\n            PrefixOperator takes a single constraint and modifies\n            it's action in some way.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.PrefixOperator.Reduce(NUnit.Framework.Constraints.ConstraintBuilder.ConstraintStack)\">\n            <summary>\n            Reduce produces a constraint from the operator and \n            any arguments. It takes the arguments from the constraint \n            stack and pushes the resulting constraint on it.\n            </summary>\n            <param name=\"stack\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.PrefixOperator.ApplyPrefix(NUnit.Framework.Constraints.IConstraint)\">\n            <summary>\n            Returns the constraint created by applying this\n            prefix to another constraint.\n            </summary>\n            <param name=\"constraint\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.CollectionOperator.#ctor\">\n            <summary>\n            Constructs a CollectionOperator\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.AllOperator.ApplyPrefix(NUnit.Framework.Constraints.IConstraint)\">\n            <summary>\n            Returns a constraint that will apply the argument\n            to the members of a collection, succeeding if\n            they all succeed.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.FileExistsConstraint\">\n            <summary>\n            FileExistsConstraint is used to determine if a file exists\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.FileOrDirectoryExistsConstraint\">\n            <summary>\n            FileOrDirectoryExistsConstraint is used to determine if a file or directory exists\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.FileOrDirectoryExistsConstraint.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Constraints.FileOrDirectoryExistsConstraint\"/> class that\n            will check files and directories.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.FileOrDirectoryExistsConstraint.#ctor(System.Boolean)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Constraints.FileOrDirectoryExistsConstraint\"/> class that\n            will only check files if ignoreDirectories is true.\n            </summary>\n            <param name=\"ignoreDirectories\">if set to <c>true</c> [ignore directories].</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.FileOrDirectoryExistsConstraint.ApplyTo(System.Object)\">\n            <summary>\n            Applies the constraint to an actual value, returning a ConstraintResult.\n            </summary>\n            <param name=\"actual\">The value to be tested</param>\n            <returns>A ConstraintResult</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.FileOrDirectoryExistsConstraint.IgnoreDirectories\">\n            <summary>\n            If true, the constraint will only check if files exist, not directories\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.FileOrDirectoryExistsConstraint.IgnoreFiles\">\n            <summary>\n            If true, the constraint will only check if directories exist, not files\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.FileOrDirectoryExistsConstraint.Description\">\n            <summary>\n            The Description of what this constraint tests, for\n            use in messages and in the ConstraintResult.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.FileExistsConstraint.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Constraints.FileExistsConstraint\"/> class.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.FileExistsConstraint.Description\">\n            <summary>\n            The Description of what this constraint tests, for\n            use in messages and in the ConstraintResult.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.TestAssemblyDirectoryResolveAttribute\">\n            <summary>\n            TestAssemblyDirectoryResolveAttribute is used to mark a test assembly as needing a\n            special assembly resolution hook that will explicitly search the test assembly's\n            directory for dependent assemblies. This works around a conflict between mixed-mode\n            assembly initialization and tests running in their own AppDomain in some cases.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Reflect\">\n            <summary>\n            Helper methods for inspecting a type by reflection. \n            \n            Many of these methods take ICustomAttributeProvider as an \n            argument to avoid duplication, even though certain attributes can \n            only appear on specific types of members, like MethodInfo or Type.\n            \n            In the case where a type is being examined for the presence of\n            an attribute, interface or named member, the Reflect methods\n            operate with the full name of the member being sought. This\n            removes the necessity of the caller having a reference to the\n            assembly that defines the item being sought and allows the\n            NUnit core to inspect assemblies that reference an older\n            version of the NUnit framework.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Reflect.GetMethodsWithAttribute(System.Type,System.Type,System.Boolean)\">\n            <summary>\n            Examine a fixture type and return an array of methods having a \n            particular attribute. The array is order with base methods first.\n            </summary>\n            <param name=\"fixtureType\">The type to examine</param>\n            <param name=\"attributeType\">The attribute Type to look for</param>\n            <param name=\"inherit\">Specifies whether to search the fixture type inheritance chain</param>\n            <returns>The array of methods found</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Reflect.HasMethodWithAttribute(System.Type,System.Type)\">\n            <summary>\n            Examine a fixture type and return true if it has a method with\n            a particular attribute. \n            </summary>\n            <param name=\"fixtureType\">The type to examine</param>\n            <param name=\"attributeType\">The attribute Type to look for</param>\n            <returns>True if found, otherwise false</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Reflect.Construct(System.Type)\">\n            <summary>\n            Invoke the default constructor on a Type\n            </summary>\n            <param name=\"type\">The Type to be constructed</param>\n            <returns>An instance of the Type</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Reflect.Construct(System.Type,System.Object[])\">\n            <summary>\n            Invoke a constructor on a Type with arguments\n            </summary>\n            <param name=\"type\">The Type to be constructed</param>\n            <param name=\"arguments\">Arguments to the constructor</param>\n            <returns>An instance of the Type</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Reflect.GetTypeArray(System.Object[])\">\n            <summary>\n            Returns an array of types from an array of objects.\n            Used because the compact framework doesn't support\n            Type.GetTypeArray()\n            </summary>\n            <param name=\"objects\">An array of objects</param>\n            <returns>An array of Types</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Reflect.InvokeMethod(System.Reflection.MethodInfo,System.Object)\">\n            <summary>\n            Invoke a parameterless method returning void on an object.\n            </summary>\n            <param name=\"method\">A MethodInfo for the method to be invoked</param>\n            <param name=\"fixture\">The object on which to invoke the method</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Reflect.InvokeMethod(System.Reflection.MethodInfo,System.Object,System.Object[])\">\n            <summary>\n            Invoke a method, converting any TargetInvocationException to an NUnitException.\n            </summary>\n            <param name=\"method\">A MethodInfo for the method to be invoked</param>\n            <param name=\"fixture\">The object on which to invoke the method</param>\n            <param name=\"args\">The argument list for the method</param>\n            <returns>The return value from the invoked method</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Reflect.MethodCallWrapper\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Reflect.ConstructorCallWrapper\">\n            <summary>\n            Constructor delegate, makes it possible to use a factory to create objects\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.InvalidTestFixtureException\">\n            <summary>\n            InvalidTestFixtureException is thrown when an appropriate test\n            fixture constructor using the provided arguments cannot be found.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.InvalidTestFixtureException.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Internal.InvalidTestFixtureException\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.InvalidTestFixtureException.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Internal.InvalidTestFixtureException\"/> class.\n            </summary>\n            <param name=\"message\">The message.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.InvalidTestFixtureException.#ctor(System.String,System.Exception)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Internal.InvalidTestFixtureException\"/> class.\n            </summary>\n            <param name=\"message\">The message.</param>\n            <param name=\"inner\">The inner.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.InvalidTestFixtureException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)\">\n            <summary>\n            Serialization Constructor\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Builders.DefaultTestCaseBuilder\">\n            <summary>\n            Class to build ether a parameterized or a normal NUnitTestMethod.\n            There are four cases that the builder must deal with:\n              1. The method needs no params and none are provided\n              2. The method needs params and they are provided\n              3. The method needs no params but they are provided in error\n              4. The method needs params but they are not provided\n            This could have been done using two different builders, but it\n            turned out to be simpler to have just one. The BuildFrom method\n            takes a different branch depending on whether any parameters are\n            provided, but all four cases are dealt with in lower-level methods\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Interfaces.ITestCaseBuilder\">\n            <summary>\n            The ITestCaseBuilder interface is exposed by a class that knows how to\n            build a test case from certain methods. \n            </summary>\n            <remarks>\n            This interface is not the same as the ITestCaseBuilder interface in NUnit 2.x.\n            We have reused the name because the two products don't interoperate at all.\n            </remarks>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.ITestCaseBuilder.CanBuildFrom(NUnit.Framework.Interfaces.IMethodInfo,NUnit.Framework.Internal.Test)\">\n            <summary>\n            Examine the method and determine if it is suitable for\n            this builder to use in building a TestCase to be\n            included in the suite being populated.\n            \n            Note that returning false will cause the method to be ignored \n            in loading the tests. If it is desired to load the method\n            but label it as non-runnable, ignored, etc., then this\n            method must return true.\n            </summary>\n            <param name=\"method\">The test method to examine</param>\n            <param name=\"suite\">The suite being populated</param>\n            <returns>True is the builder can use this method</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.ITestCaseBuilder.BuildFrom(NUnit.Framework.Interfaces.IMethodInfo,NUnit.Framework.Internal.Test)\">\n            <summary>\n            Build a TestCase from the provided MethodInfo for\n            inclusion in the suite being constructed.\n            </summary>\n            <param name=\"method\">The method to be used as a test case</param>\n            <param name=\"suite\">The test suite being populated, or null</param>\n            <returns>A TestCase or null</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Builders.DefaultTestCaseBuilder.CanBuildFrom(NUnit.Framework.Interfaces.IMethodInfo)\">\n            <summary>\n            Determines if the method can be used to build an NUnit test\n            test method of some kind. The method must normally be marked\n            with an identifying attribute for this to be true.\n            \n            Note that this method does not check that the signature\n            of the method for validity. If we did that here, any\n            test methods with invalid signatures would be passed\n            over in silence in the test run. Since we want such\n            methods to be reported, the check for validity is made\n            in BuildFrom rather than here.\n            </summary>\n            <param name=\"method\">An IMethodInfo for the method being used as a test method</param>\n            <returns>True if the builder can create a test case from this method</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Builders.DefaultTestCaseBuilder.BuildFrom(NUnit.Framework.Interfaces.IMethodInfo)\">\n            <summary>\n            Build a Test from the provided MethodInfo. Depending on\n            whether the method takes arguments and on the availability\n            of test case data, this method may return a single test\n            or a group of tests contained in a ParameterizedMethodSuite.\n            </summary>\n            <param name=\"method\">The method for which a test is to be built</param>\n            <returns>A Test representing one or more method invocations</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Builders.DefaultTestCaseBuilder.CanBuildFrom(NUnit.Framework.Interfaces.IMethodInfo,NUnit.Framework.Internal.Test)\">\n            <summary>\n            Determines if the method can be used to build an NUnit test\n            test method of some kind. The method must normally be marked\n            with an identifying attribute for this to be true.\n            \n            Note that this method does not check that the signature\n            of the method for validity. If we did that here, any\n            test methods with invalid signatures would be passed\n            over in silence in the test run. Since we want such\n            methods to be reported, the check for validity is made\n            in BuildFrom rather than here.\n            </summary>\n            <param name=\"method\">An IMethodInfo for the method being used as a test method</param>\n            <param name=\"parentSuite\">The test suite being built, to which the new test would be added</param>\n            <returns>True if the builder can create a test case from this method</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Builders.DefaultTestCaseBuilder.BuildFrom(NUnit.Framework.Interfaces.IMethodInfo,NUnit.Framework.Internal.Test)\">\n            <summary>\n            Build a Test from the provided MethodInfo. Depending on\n            whether the method takes arguments and on the availability\n            of test case data, this method may return a single test\n            or a group of tests contained in a ParameterizedMethodSuite.\n            </summary>\n            <param name=\"method\">The method for which a test is to be built</param>\n            <param name=\"parentSuite\">The test fixture being populated, or null</param>\n            <returns>A Test representing one or more method invocations</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Builders.DefaultTestCaseBuilder.BuildParameterizedMethodSuite(NUnit.Framework.Interfaces.IMethodInfo,System.Collections.Generic.IEnumerable{NUnit.Framework.Internal.TestMethod})\">\n            <summary>\n            Builds a ParameterizedMethodSuite containing individual test cases.\n            </summary>\n            <param name=\"method\">The method for which a test is to be built.</param>\n            <param name=\"tests\">The list of test cases to include.</param>\n            <returns>A ParameterizedMethodSuite populated with test cases</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Builders.DefaultTestCaseBuilder.BuildSingleTestMethod(NUnit.Framework.Interfaces.IMethodInfo,NUnit.Framework.Internal.Test)\">\n            <summary>\n            Build a simple, non-parameterized TestMethod for this method.\n            </summary>\n            <param name=\"method\">The MethodInfo for which a test is to be built</param>\n            <param name=\"suite\">The test suite for which the method is being built</param>\n            <returns>A TestMethod.</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.SelfResolvingOperator\">\n            <summary>\n            Abstract base class for operators that are able to reduce to a \n            constraint whether or not another syntactic element follows.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.NUnitEqualityComparer\">\n            <summary>\n            NUnitEqualityComparer encapsulates NUnit's handling of\n            equality tests between objects.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.NUnitEqualityComparer.caseInsensitive\">\n            <summary>\n            If true, all string comparisons will ignore case\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.NUnitEqualityComparer.compareAsCollection\">\n            <summary>\n            If true, arrays will be treated as collections, allowing\n            those of different dimensions to be compared\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.NUnitEqualityComparer.externalComparers\">\n            <summary>\n            Comparison objects used in comparisons for some constraints.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.NUnitEqualityComparer.failurePoints\">\n            <summary>\n            List of points at which a failure occurred.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.NUnitEqualityComparer.AreEqual(System.Object,System.Object,NUnit.Framework.Constraints.Tolerance@)\">\n            <summary>\n            Compares two objects for equality within a tolerance.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.NUnitEqualityComparer.ArraysEqual(System.Array,System.Array,NUnit.Framework.Constraints.Tolerance@)\">\n            <summary>\n            Helper method to compare two arrays\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.NUnitEqualityComparer.DirectoriesEqual(System.IO.DirectoryInfo,System.IO.DirectoryInfo)\">\n            <summary>\n            Method to compare two DirectoryInfo objects\n            </summary>\n            <param name=\"x\">first directory to compare</param>\n            <param name=\"y\">second directory to compare</param>\n            <returns>true if equivalent, false if not</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.NUnitEqualityComparer.Default\">\n            <summary>\n            Returns the default NUnitEqualityComparer\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.NUnitEqualityComparer.IgnoreCase\">\n            <summary>\n            Gets and sets a flag indicating whether case should\n            be ignored in determining equality.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.NUnitEqualityComparer.CompareAsCollection\">\n            <summary>\n            Gets and sets a flag indicating that arrays should be\n            compared as collections, without regard to their shape.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.NUnitEqualityComparer.ExternalComparers\">\n            <summary>\n            Gets the list of external comparers to be used to\n            test for equality. They are applied to members of\n            collections, in place of NUnit's own logic.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.NUnitEqualityComparer.FailurePoints\">\n            <summary>\n            Gets the list of failure points for the last Match performed.\n            The list consists of objects to be interpreted by the caller.\n            This generally means that the caller may only make use of\n            objects it has placed on the list at a particular depthy.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.NUnitEqualityComparer.WithSameOffset\">\n            <summary>\n            Flags the comparer to include <see cref=\"P:System.DateTimeOffset.Offset\"/>\n            property in comparison of two <see cref=\"T:System.DateTimeOffset\"/> values.\n            </summary>\n            <remarks>\n            Using this modifier does not allow to use the <see cref=\"T:NUnit.Framework.Constraints.Tolerance\"/>\n            modifier.\n            </remarks>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.NUnitEqualityComparer.FailurePoint\">\n            <summary>\n            FailurePoint class represents one point of failure\n            in an equality test.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.NUnitEqualityComparer.FailurePoint.Position\">\n            <summary>\n            The location of the failure\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.NUnitEqualityComparer.FailurePoint.ExpectedValue\">\n            <summary>\n            The expected value\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.NUnitEqualityComparer.FailurePoint.ActualValue\">\n            <summary>\n            The actual value\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.NUnitEqualityComparer.FailurePoint.ExpectedHasData\">\n            <summary>\n            Indicates whether the expected value is valid\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.NUnitEqualityComparer.FailurePoint.ActualHasData\">\n            <summary>\n            Indicates whether the actual value is valid\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.NullConstraint\">\n            <summary>\n            NullConstraint tests that the actual value is null\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.NullConstraint.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Constraints.NullConstraint\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.NullConstraint.ApplyTo(System.Object)\">\n            <summary>\n            Applies the constraint to an actual value, returning a ConstraintResult.\n            </summary>\n            <param name=\"actual\">The value to be tested</param>\n            <returns>A ConstraintResult</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.CollectionSubsetConstraint\">\n            <summary>\n            CollectionSubsetConstraint is used to determine whether\n            one collection is a subset of another\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.CollectionSubsetConstraint.#ctor(System.Collections.IEnumerable)\">\n            <summary>\n            Construct a CollectionSubsetConstraint\n            </summary>\n            <param name=\"expected\">The collection that the actual value is expected to be a subset of</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.CollectionSubsetConstraint.Matches(System.Collections.IEnumerable)\">\n            <summary>\n            Test whether the actual collection is a subset of \n            the expected collection provided.\n            </summary>\n            <param name=\"actual\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.CollectionSubsetConstraint.Using``2(System.Func{``0,``1,System.Boolean})\">\n            <summary>\n            Flag the constraint to use the supplied predicate function\n            </summary>\n            <param name=\"comparison\">The comparison function to use.</param>\n            <returns>Self.</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.CollectionSubsetConstraint.DisplayName\">\n            <summary> \n            The display name of this Constraint for use by ToString().\n            The default value is the name of the constraint with\n            trailing \"Constraint\" removed. Derived classes may set\n            this to another name in their constructors.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.CollectionSubsetConstraint.Description\">\n            <summary>\n            The Description of what this constraint tests, for\n            use in messages and in the ConstraintResult.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.AndConstraint\">\n            <summary>\n            AndConstraint succeeds only if both members succeed.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.BinaryConstraint\">\n            <summary>\n            BinaryConstraint is the abstract base of all constraints\n            that combine two other constraints in some fashion.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.BinaryConstraint.Left\">\n            <summary>\n            The first constraint being combined\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.BinaryConstraint.Right\">\n            <summary>\n            The second constraint being combined\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.BinaryConstraint.#ctor(NUnit.Framework.Constraints.IConstraint,NUnit.Framework.Constraints.IConstraint)\">\n            <summary>\n            Construct a BinaryConstraint from two other constraints\n            </summary>\n            <param name=\"left\">The first constraint</param>\n            <param name=\"right\">The second constraint</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.AndConstraint.#ctor(NUnit.Framework.Constraints.IConstraint,NUnit.Framework.Constraints.IConstraint)\">\n            <summary>\n            Create an AndConstraint from two other constraints\n            </summary>\n            <param name=\"left\">The first constraint</param>\n            <param name=\"right\">The second constraint</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.AndConstraint.ApplyTo(System.Object)\">\n            <summary>\n            Apply both member constraints to an actual value, succeeding \n            succeeding only if both of them succeed.\n            </summary>\n            <param name=\"actual\">The actual value</param>\n            <returns>True if the constraints both succeeded</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.AndConstraint.Description\">\n            <summary>\n            Gets text describing a constraint\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.ConstraintResult\">\n            <summary>\n            Contain the result of matching a <see cref=\"T:NUnit.Framework.Constraints.Constraint\"/> against an actual value.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintResult.#ctor(NUnit.Framework.Constraints.IConstraint,System.Object)\">\n            <summary>\n            Constructs a <see cref=\"T:NUnit.Framework.Constraints.ConstraintResult\"/> for a particular <see cref=\"T:NUnit.Framework.Constraints.Constraint\"/>.\n            </summary>\n            <param name=\"constraint\">The Constraint to which this result applies.</param>\n            <param name=\"actualValue\">The actual value to which the Constraint was applied.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintResult.#ctor(NUnit.Framework.Constraints.IConstraint,System.Object,NUnit.Framework.Constraints.ConstraintStatus)\">\n            <summary>\n            Constructs a <see cref=\"T:NUnit.Framework.Constraints.ConstraintResult\"/> for a particular <see cref=\"T:NUnit.Framework.Constraints.Constraint\"/>.\n            </summary>\n            <param name=\"constraint\">The Constraint to which this result applies.</param>\n            <param name=\"actualValue\">The actual value to which the Constraint was applied.</param>\n            <param name=\"status\">The status of the new ConstraintResult.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintResult.#ctor(NUnit.Framework.Constraints.IConstraint,System.Object,System.Boolean)\">\n            <summary>\n            Constructs a <see cref=\"T:NUnit.Framework.Constraints.ConstraintResult\"/> for a particular <see cref=\"T:NUnit.Framework.Constraints.Constraint\"/>.\n            </summary>\n            <param name=\"constraint\">The Constraint to which this result applies.</param>\n            <param name=\"actualValue\">The actual value to which the Constraint was applied.</param>\n            <param name=\"isSuccess\">If true, applies a status of Success to the result, otherwise Failure.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintResult.WriteMessageTo(NUnit.Framework.Constraints.MessageWriter)\">\n            <summary>\n            Write the failure message to the MessageWriter provided\n            as an argument. The default implementation simply passes\n            the result and the actual value to the writer, which\n            then displays the constraint description and the value.\n            \n            Constraints that need to provide additional details,\n            such as where the error occured can override this.\n            </summary>\n            <param name=\"writer\">The MessageWriter on which to display the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintResult.WriteActualValueTo(NUnit.Framework.Constraints.MessageWriter)\">\n            <summary>\n            Write the actual value for a failing constraint test to a\n            MessageWriter. The default implementation simply writes\n            the raw value of actual, leaving it to the writer to\n            perform any formatting.\n            </summary>\n            <param name=\"writer\">The writer on which the actual value is displayed</param>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintResult.ActualValue\">\n            <summary>\n            The actual value that was passed to the <see cref=\"M:NUnit.Framework.Constraints.Constraint.ApplyTo(System.Object)\"/> method.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintResult.Status\">\n            <summary>\n            Gets and sets the ResultStatus for this result.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintResult.IsSuccess\">\n            <summary>\n            True if actual value meets the Constraint criteria otherwise false.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintResult.Name\">\n            <summary>\n            Display friendly name of the constraint.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintResult.Description\">\n            <summary>\n            Description of the constraint may be affected by the state the constraint had\n            when <see cref=\"M:NUnit.Framework.Constraints.Constraint.ApplyTo(System.Object)\"/> was performed against the actual value.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.AndConstraint.AndConstraintResult.WriteActualValueTo(NUnit.Framework.Constraints.MessageWriter)\">\n            <summary>\n            Write the actual value for a failing constraint test to a\n            MessageWriter. The default implementation simply writes\n            the raw value of actual, leaving it to the writer to\n            perform any formatting.\n            </summary>\n            <param name=\"writer\">The writer on which the actual value is displayed</param>\n        </member>\n        <member name=\"T:NUnit.Framework.TestFixtureTearDownAttribute\">\n            <summary>\n            Attribute used to identify a method that is called after\n            all the tests in a fixture have run. The method is \n            guaranteed to be called, even if an exception is thrown.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.OneTimeTearDownAttribute\">\n            <summary>\n            Attribute used to identify a method that is called once\n            after all the child tests have run. The method is \n            guaranteed to be called, even if an exception is thrown.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.PlatformAttribute\">\n            <summary>\n            PlatformAttribute is used to mark a test fixture or an\n            individual method as applying to a particular platform only.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.PlatformAttribute.#ctor\">\n            <summary>\n            Constructor with no platforms specified, for use\n            with named property syntax.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.PlatformAttribute.#ctor(System.String)\">\n            <summary>\n            Constructor taking one or more platforms\n            </summary>\n            <param name=\"platforms\">Comma-delimited list of platforms</param>\n        </member>\n        <member name=\"M:NUnit.Framework.PlatformAttribute.ApplyToTest(NUnit.Framework.Internal.Test)\">\n            <summary>\n            Causes a test to be skipped if this PlatformAttribute is not satisfied.\n            </summary>\n            <param name=\"test\">The test to modify</param>\n        </member>\n        <member name=\"T:NUnit.Framework.IgnoreAttribute\">\n            <summary>\n            Attribute used to mark a test that is to be ignored.\n            Ignored tests result in a warning message when the\n            tests are run.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.IgnoreAttribute.#ctor(System.String)\">\n            <summary>\n            Constructs the attribute giving a reason for ignoring the test\n            </summary>GetActionsFromAttributeProvider\n            <param name=\"reason\">The reason for ignoring the test</param>\n        </member>\n        <member name=\"M:NUnit.Framework.IgnoreAttribute.ApplyToTest(NUnit.Framework.Internal.Test)\">\n            <summary>\n            Modifies a test by marking it as Ignored.\n            </summary>\n            <param name=\"test\">The test to modify</param>\n        </member>\n        <member name=\"P:NUnit.Framework.IgnoreAttribute.Reason\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.IgnoreAttribute.Until\">\n            <summary>\n            The date in the future to stop ignoring the test as a string in UTC time. \n            For example for a date and time, \"2014-12-25 08:10:00Z\" or for just a date,\n            \"2014-12-25\". If just a date is given, the Ignore will expire at midnight UTC.\n            </summary>\n            <remarks>\n            Once the ignore until date has passed, the test will be marked\n            as runnable. Tests with an ignore until date will have an IgnoreUntilDate\n            property set which will appear in the test results.\n            </remarks>\n            <exception cref=\"T:System.FormatException\">The string does not contain a valid string representation of a date and time.</exception> \n        </member>\n        <member name=\"T:NUnit.Framework.Interfaces.IApplyToContext\">\n            <summary>\n            The IApplyToContext interface is implemented by attributes\n            that want to make changes to the execution context before\n            a test is run.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.IApplyToContext.ApplyToContext(NUnit.Framework.Internal.ITestExecutionContext)\">\n            <summary>\n            Apply changes to the execution context\n            </summary>\n            <param name=\"context\">The execution context</param>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Execution.SimpleWorkItem\">\n            <summary>\n            A SimpleWorkItem represents a single test case and is\n            marked as completed immediately upon execution. This\n            class is also used for skipped or ignored test suites.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Execution.SimpleWorkItem.#ctor(NUnit.Framework.Internal.TestMethod,NUnit.Framework.Interfaces.ITestFilter)\">\n            <summary>\n            Construct a simple work item for a test.\n            </summary>\n            <param name=\"test\">The test to be executed</param>\n            <param name=\"filter\">The filter used to select this test</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Execution.SimpleWorkItem.PerformWork\">\n            <summary>\n            Method that performs actually performs the work.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Commands.ApplyChangesToContextCommand\">\n            <summary>\n            ContextSettingsCommand applies specified changes to the\n            TestExecutionContext prior to running a test. No special\n            action is needed after the test runs, since the prior\n            context will be restored automatically.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Commands.ApplyChangesToContextCommand.#ctor(NUnit.Framework.Internal.Commands.TestCommand,System.Collections.Generic.IEnumerable{NUnit.Framework.Interfaces.IApplyToContext})\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Internal.Commands.ApplyChangesToContextCommand\" /> class.\n            </summary>\n            <param name=\"innerCommand\"></param>\n            <param name=\"changes\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Commands.ApplyChangesToContextCommand.ApplyChanges(NUnit.Framework.Internal.ITestExecutionContext)\">\n            <summary>\n            \n            </summary>\n            <param name=\"context\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Commands.ApplyChangesToContextCommand.Execute(NUnit.Framework.Internal.ITestExecutionContext)\">\n            <summary>\n            \n            </summary>\n            <param name=\"context\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Interfaces.RunState\">\n            <summary>\n            The RunState enum indicates whether a test can be executed. \n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Interfaces.RunState.NotRunnable\">\n            <summary>\n            The test is not runnable.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Interfaces.RunState.Runnable\">\n            <summary>\n            The test is runnable. \n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Interfaces.RunState.Explicit\">\n            <summary>\n            The test can only be run explicitly\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Interfaces.RunState.Skipped\">\n            <summary>\n            The test has been skipped. This value may\n            appear on a Test when certain attributes\n            are used to skip the test.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Interfaces.RunState.Ignored\">\n            <summary>\n            The test has been ignored. May appear on\n            a Test, when the IgnoreAttribute is used.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Does\">\n            <summary>\n            Helper class with properties and methods that supply\n            a number of constraints used in Asserts.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Does.Contain(System.Object)\">\n            <summary>\n            Returns a new CollectionContainsConstraint checking for the\n            presence of a particular object in the collection.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Does.Contain(System.String)\">\n            <summary>\n            Returns a new ContainsConstraint. This constraint\n            will, in turn, make use of the appropriate second-level\n            constraint, depending on the type of the actual argument. \n            This overload is only used if the item sought is a string,\n            since any other type implies that we are looking for a \n            collection member.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Does.StartWith(System.String)\">\n            <summary>\n            Returns a constraint that succeeds if the actual\n            value starts with the substring supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Does.EndWith(System.String)\">\n            <summary>\n            Returns a constraint that succeeds if the actual\n            value ends with the substring supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Does.Match(System.String)\">\n            <summary>\n            Returns a constraint that succeeds if the actual\n            value matches the regular expression supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Does.Not\">\n            <summary>\n            Returns a ConstraintExpression that negates any\n            following constraint.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Does.Exist\">\n            <summary>\n            Returns a constraint that succeeds if the value\n            is a file or directory and it exists.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.AssemblyHelper\">\n            <summary>\n            AssemblyHelper provides static methods for working\n            with assemblies.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.AssemblyHelper.GetAssemblyPath(System.Reflection.Assembly)\">\n            <summary>\n            Gets the path from which an assembly was loaded.\n            For builds where this is not possible, returns\n            the name of the assembly.\n            </summary>\n            <param name=\"assembly\">The assembly.</param>\n            <returns>The path.</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.AssemblyHelper.GetDirectoryName(System.Reflection.Assembly)\">\n            <summary>\n            Gets the path to the directory from which an assembly was loaded.\n            </summary>\n            <param name=\"assembly\">The assembly.</param>\n            <returns>The path.</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.AssemblyHelper.GetAssemblyName(System.Reflection.Assembly)\">\n            <summary>\n            Gets the AssemblyName of an assembly.\n            </summary>\n            <param name=\"assembly\">The assembly</param>\n            <returns>An AssemblyName</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.AssemblyHelper.Load(System.String)\">\n            <summary>\n            Loads an assembly given a string, which may be the \n            path to the assembly or the AssemblyName\n            </summary>\n            <param name=\"nameOrPath\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.AssemblyHelper.GetAssemblyPathFromCodeBase(System.String)\">\n            <summary>\n            Gets the assembly path from code base.\n            </summary>\n            <remarks>Public for testing purposes</remarks>\n            <param name=\"codeBase\">The code base.</param>\n            <returns></returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Api.FrameworkController\">\n            <summary>\n            FrameworkController provides a facade for use in loading, browsing \n            and running tests without requiring a reference to the NUnit \n            framework. All calls are encapsulated in constructors for\n            this class and its nested classes, which only require the\n            types of the Common Type System as arguments.\n            \n            The controller supports four actions: Load, Explore, Count and Run.\n            They are intended to be called by a driver, which should allow for\n            proper sequencing of calls. Load must be called before any of the \n            other actions. The driver may support other actions, such as\n            reload on run, by combining these calls.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Compatibility.LongLivedMarshalByRefObject\">\n            <summary>\n            A MarshalByRefObject that lives forever\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Compatibility.LongLivedMarshalByRefObject.InitializeLifetimeService\">\n            <summary>\n            Obtains a lifetime service object to control the lifetime policy for this instance.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.FrameworkController.#ctor(System.String,System.String,System.Collections.IDictionary)\">\n            <summary>\n            Construct a FrameworkController using the default builder and runner.\n            </summary>\n            <param name=\"assemblyNameOrPath\">The AssemblyName or path to the test assembly</param>\n            <param name=\"idPrefix\">A prefix used for all test ids created under this controller.</param>\n            <param name=\"settings\">A Dictionary of settings to use in loading and running the tests</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.FrameworkController.#ctor(System.Reflection.Assembly,System.String,System.Collections.IDictionary)\">\n            <summary>\n            Construct a FrameworkController using the default builder and runner.\n            </summary>\n            <param name=\"assembly\">The test assembly</param>\n            <param name=\"idPrefix\">A prefix used for all test ids created under this controller.</param>\n            <param name=\"settings\">A Dictionary of settings to use in loading and running the tests</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.FrameworkController.#ctor(System.String,System.String,System.Collections.IDictionary,System.String,System.String)\">\n            <summary>\n            Construct a FrameworkController, specifying the types to be used\n            for the runner and builder. This constructor is provided for\n            purposes of development.\n            </summary>\n            <param name=\"assemblyNameOrPath\">The full AssemblyName or the path to the test assembly</param>\n            <param name=\"idPrefix\">A prefix used for all test ids created under this controller.</param>\n            <param name=\"settings\">A Dictionary of settings to use in loading and running the tests</param>\n            <param name=\"runnerType\">The Type of the test runner</param>\n            <param name=\"builderType\">The Type of the test builder</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.FrameworkController.#ctor(System.Reflection.Assembly,System.String,System.Collections.IDictionary,System.String,System.String)\">\n            <summary>\n            Construct a FrameworkController, specifying the types to be used\n            for the runner and builder. This constructor is provided for\n            purposes of development.\n            </summary>\n            <param name=\"assembly\">The test assembly</param>\n            <param name=\"idPrefix\">A prefix used for all test ids created under this controller.</param>\n            <param name=\"settings\">A Dictionary of settings to use in loading and running the tests</param>\n            <param name=\"runnerType\">The Type of the test runner</param>\n            <param name=\"builderType\">The Type of the test builder</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.FrameworkController.LoadTests\">\n            <summary>\n            Loads the tests in the assembly\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.FrameworkController.ExploreTests(System.String)\">\n            <summary>\n            Returns info about the tests in an assembly\n            </summary>\n            <param name=\"filter\">A string containing the XML representation of the filter to use</param>\n            <returns>The XML result of exploring the tests</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.FrameworkController.RunTests(System.String)\">\n            <summary>\n            Runs the tests in an assembly\n            </summary>\n            <param name=\"filter\">A string containing the XML representation of the filter to use</param>\n            <returns>The XML result of the test run</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.FrameworkController.RunTests(System.Action{System.String},System.String)\">\n            <summary>\n            Runs the tests in an assembly syncronously reporting back the test results through the callback\n            or through the return value\n            </summary>\n            <param name=\"callback\">The callback that receives the test results</param>\n            <param name=\"filter\">A string containing the XML representation of the filter to use</param>\n            <returns>The XML result of the test run</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.FrameworkController.RunAsync(System.Action{System.String},System.String)\">\n            <summary>\n            Runs the tests in an assembly asyncronously reporting back the test results through the callback\n            </summary>\n            <param name=\"callback\">The callback that receives the test results</param>\n            <param name=\"filter\">A string containing the XML representation of the filter to use</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.FrameworkController.StopRun(System.Boolean)\">\n            <summary>\n            Stops the test run\n            </summary>\n            <param name=\"force\">True to force the stop, false for a cooperative stop</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.FrameworkController.CountTests(System.String)\">\n            <summary>\n            Counts the number of test cases in the loaded TestSuite\n            </summary>\n            <param name=\"filter\">A string containing the XML representation of the filter to use</param>\n            <returns>The number of tests</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.FrameworkController.InsertEnvironmentElement(NUnit.Framework.Interfaces.TNode)\">\n            <summary>\n            Inserts environment element\n            </summary>\n            <param name=\"targetNode\">Target node</param>\n            <returns>The new node</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.FrameworkController.InsertSettingsElement(NUnit.Framework.Interfaces.TNode,System.Collections.Generic.IDictionary{System.String,System.Object})\">\n            <summary>\n            Inserts settings element\n            </summary>\n            <param name=\"targetNode\">Target node</param>\n            <param name=\"settings\">Settings dictionary</param>\n            <returns>The new node</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Api.FrameworkController.Builder\">\n            <summary>\n            Gets the ITestAssemblyBuilder used by this controller instance.\n            </summary>\n            <value>The builder.</value>\n        </member>\n        <member name=\"P:NUnit.Framework.Api.FrameworkController.Runner\">\n            <summary>\n            Gets the ITestAssemblyRunner used by this controller instance.\n            </summary>\n            <value>The runner.</value>\n        </member>\n        <member name=\"P:NUnit.Framework.Api.FrameworkController.AssemblyNameOrPath\">\n            <summary>\n            Gets the AssemblyName or the path for which this FrameworkController was created\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Api.FrameworkController.Assembly\">\n            <summary>\n            Gets the Assembly for which this\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Api.FrameworkController.Settings\">\n            <summary>\n            Gets a dictionary of settings for the FrameworkController\n            </summary>\n        </member>\n        <member name=\"T:System.Web.UI.ICallbackEventHandler\">\n            <summary>\n            A shim of the .NET interface for platforms that do not support it.\n            Used to indicate that a control can be the target of a callback event on the server.\n            </summary>\n        </member>\n        <member name=\"M:System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent(System.String)\">\n            <summary>\n            Processes a callback event that targets a control.\n            </summary>\n            <param name=\"report\"></param>\n        </member>\n        <member name=\"M:System.Web.UI.ICallbackEventHandler.GetCallbackResult\">\n            <summary>\n            Returns the results of a callback event that targets a control.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Api.FrameworkController.FrameworkControllerAction\">\n            <summary>\n            FrameworkControllerAction is the base class for all actions\n            performed against a FrameworkController.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Api.FrameworkController.LoadTestsAction\">\n            <summary>\n            LoadTestsAction loads a test into the FrameworkController\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.FrameworkController.LoadTestsAction.#ctor(NUnit.Framework.Api.FrameworkController,System.Object)\">\n            <summary>\n            LoadTestsAction loads the tests in an assembly.\n            </summary>\n            <param name=\"controller\">The controller.</param>\n            <param name=\"handler\">The callback handler.</param>\n        </member>\n        <member name=\"T:NUnit.Framework.Api.FrameworkController.ExploreTestsAction\">\n            <summary>\n            ExploreTestsAction returns info about the tests in an assembly\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.FrameworkController.ExploreTestsAction.#ctor(NUnit.Framework.Api.FrameworkController,System.String,System.Object)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Api.FrameworkController.ExploreTestsAction\"/> class.\n            </summary>\n            <param name=\"controller\">The controller for which this action is being performed.</param>\n            <param name=\"filter\">Filter used to control which tests are included (NYI)</param>\n            <param name=\"handler\">The callback handler.</param>\n        </member>\n        <member name=\"T:NUnit.Framework.Api.FrameworkController.CountTestsAction\">\n            <summary>\n            CountTestsAction counts the number of test cases in the loaded TestSuite\n            held by the FrameworkController.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.FrameworkController.CountTestsAction.#ctor(NUnit.Framework.Api.FrameworkController,System.String,System.Object)\">\n            <summary>\n            Construct a CountsTestAction and perform the count of test cases.\n            </summary>\n            <param name=\"controller\">A FrameworkController holding the TestSuite whose cases are to be counted</param>\n            <param name=\"filter\">A string containing the XML representation of the filter to use</param>\n            <param name=\"handler\">A callback handler used to report results</param>\n        </member>\n        <member name=\"T:NUnit.Framework.Api.FrameworkController.RunTestsAction\">\n            <summary>\n            RunTestsAction runs the loaded TestSuite held by the FrameworkController.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.FrameworkController.RunTestsAction.#ctor(NUnit.Framework.Api.FrameworkController,System.String,System.Object)\">\n            <summary>\n            Construct a RunTestsAction and run all tests in the loaded TestSuite.\n            </summary>\n            <param name=\"controller\">A FrameworkController holding the TestSuite to run</param>\n            <param name=\"filter\">A string containing the XML representation of the filter to use</param>\n            <param name=\"handler\">A callback handler used to report results</param>\n        </member>\n        <member name=\"T:NUnit.Framework.Api.FrameworkController.RunAsyncAction\">\n            <summary>\n            RunAsyncAction initiates an asynchronous test run, returning immediately\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.FrameworkController.RunAsyncAction.#ctor(NUnit.Framework.Api.FrameworkController,System.String,System.Object)\">\n            <summary>\n            Construct a RunAsyncAction and run all tests in the loaded TestSuite.\n            </summary>\n            <param name=\"controller\">A FrameworkController holding the TestSuite to run</param>\n            <param name=\"filter\">A string containing the XML representation of the filter to use</param>\n            <param name=\"handler\">A callback handler used to report results</param>\n        </member>\n        <member name=\"T:NUnit.Framework.Api.FrameworkController.StopRunAction\">\n            <summary>\n            StopRunAction stops an ongoing run.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.FrameworkController.StopRunAction.#ctor(NUnit.Framework.Api.FrameworkController,System.Boolean,System.Object)\">\n            <summary>\n            Construct a StopRunAction and stop any ongoing run. If no\n            run is in process, no error is raised.\n            </summary>\n            <param name=\"controller\">The FrameworkController for which a run is to be stopped.</param>\n            <param name=\"force\">True the stop should be forced, false for a cooperative stop.</param>\n            <param name=\"handler\">>A callback handler used to report results</param>\n            <remarks>A forced stop will cause threads and processes to be killed as needed.</remarks>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.ExceptionTypeConstraint\">\n            <summary>\n            ExceptionTypeConstraint is a special version of ExactTypeConstraint\n            used to provided detailed info about the exception thrown in\n            an error message.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.ExactTypeConstraint\">\n            <summary>\n            ExactTypeConstraint is used to test that an object\n            is of the exact type provided in the constructor\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ExactTypeConstraint.#ctor(System.Type)\">\n            <summary>\n            Construct an ExactTypeConstraint for a given Type\n            </summary>\n            <param name=\"type\">The expected Type.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ExactTypeConstraint.Matches(System.Object)\">\n            <summary>\n            Apply the constraint to an actual value, returning true if it succeeds\n            </summary>\n            <param name=\"actual\">The actual argument</param>\n            <returns>True if the constraint succeeds, otherwise false.</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ExactTypeConstraint.DisplayName\">\n            <summary> \n            The display name of this Constraint for use by ToString().\n            The default value is the name of the constraint with\n            trailing \"Constraint\" removed. Derived classes may set\n            this to another name in their constructors.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ExceptionTypeConstraint.#ctor(System.Type)\">\n            <summary>\n            Constructs an ExceptionTypeConstraint\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ExceptionTypeConstraint.ApplyTo(System.Object)\">\n            <summary>\n            Applies the constraint to an actual value, returning a ConstraintResult.\n            </summary>\n            <param name=\"actual\">The value to be tested</param>\n            <returns>A ConstraintResult</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.TestProgressReporter\">\n            <summary>\n            TestProgressReporter translates ITestListener events into\n            the async callbacks that are used to inform the client\n            software about the progress of a test run.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestProgressReporter.#ctor(System.Web.UI.ICallbackEventHandler)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Internal.TestProgressReporter\"/> class.\n            </summary>\n            <param name=\"handler\">The callback handler to be used for reporting progress.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestProgressReporter.TestStarted(NUnit.Framework.Interfaces.ITest)\">\n            <summary>\n            Called when a test has just started\n            </summary>\n            <param name=\"test\">The test that is starting</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestProgressReporter.TestFinished(NUnit.Framework.Interfaces.ITestResult)\">\n            <summary>\n            Called when a test has finished. Sends a result summary to the callback.\n            to \n            </summary>\n            <param name=\"result\">The result of the test</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestProgressReporter.TestOutput(NUnit.Framework.Interfaces.TestOutput)\">\n            <summary>\n            Called when a test produces output for immediate display\n            </summary>\n            <param name=\"output\">A TestOutput object containing the text to display</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestProgressReporter.GetParent(NUnit.Framework.Interfaces.ITest)\">\n            <summary>\n            Returns the parent test item for the targer test item if it exists\n            </summary>\n            <param name=\"test\"></param>\n            <returns>parent test item</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestProgressReporter.FormatAttributeValue(System.String)\">\n            <summary>\n            Makes a string safe for use as an attribute, replacing\n            characters characters that can't be used with their\n            corresponding xml representations.\n            </summary>\n            <param name=\"original\">The string to be used</param>\n            <returns>A new string with the _values replaced</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.PropOperator\">\n            <summary>\n            Operator used to test for the presence of a named Property\n            on an object and optionally apply further tests to the\n            value of that property.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.PropOperator.#ctor(System.String)\">\n            <summary>\n            Constructs a PropOperator for a particular named property\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.PropOperator.Reduce(NUnit.Framework.Constraints.ConstraintBuilder.ConstraintStack)\">\n            <summary>\n            Reduce produces a constraint from the operator and \n            any arguments. It takes the arguments from the constraint \n            stack and pushes the resulting constraint on it.\n            </summary>\n            <param name=\"stack\"></param>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.PropOperator.Name\">\n            <summary>\n            Gets the name of the property to which the operator applies\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.NaNConstraint\">\n            <summary>\n            NaNConstraint tests that the actual value is a double or float NaN\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.NaNConstraint.ApplyTo(System.Object)\">\n            <summary>\n            Test that the actual value is an NaN\n            </summary>\n            <param name=\"actual\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.NaNConstraint.Description\">\n            <summary>\n            The Description of what this constraint tests, for\n            use in messages and in the ConstraintResult.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.CollectionContainsConstraint\">\n            <summary>\n            CollectionContainsConstraint is used to test whether a collection\n            contains an expected object as a member.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.CollectionContainsConstraint.#ctor(System.Object)\">\n            <summary>\n            Construct a CollectionContainsConstraint\n            </summary>\n            <param name=\"expected\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.CollectionContainsConstraint.Matches(System.Collections.IEnumerable)\">\n            <summary>\n            Test whether the expected item is contained in the collection\n            </summary>\n            <param name=\"actual\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.CollectionContainsConstraint.Using``2(System.Func{``0,``1,System.Boolean})\">\n            <summary>\n            Flag the constraint to use the supplied predicate function\n            </summary>\n            <param name=\"comparison\">The comparison function to use.</param>\n            <returns>Self.</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.CollectionContainsConstraint.DisplayName\">\n            <summary> \n            The display name of this Constraint for use by ToString().\n            The default value is the name of the constraint with\n            trailing \"Constraint\" removed. Derived classes may set\n            this to another name in their constructors.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.CollectionContainsConstraint.Description\">\n            <summary>\n            The Description of what this constraint tests, for\n            use in messages and in the ConstraintResult.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.CollectionContainsConstraint.Expected\">\n            <summary>\n            Gets the expected object\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.SetUpAttribute\">\n            <summary>\n            Attribute used to mark a class that contains one-time SetUp \n            and/or TearDown methods that apply to all the tests in a\n            namespace or an assembly.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.PreTestAttribute\">\n            <summary>\n            Attribute used to mark a class that contains one-time SetUp \n            and/or TearDown methods that apply to all the tests in a\n            namespace or an assembly.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.PostTestAttribute\">\n            <summary>\n            Attribute used to mark a class that contains one-time SetUp \n            and/or TearDown methods that apply to all the tests in a\n            namespace or an assembly.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.RepeatAttribute\">\n            <summary>\n            RepeatAttribute may be applied to test case in order\n            to run it multiple times.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.RepeatAttribute.#ctor(System.Int32)\">\n            <summary>\n            Construct a RepeatAttribute\n            </summary>\n            <param name=\"count\">The number of times to run the test</param>\n        </member>\n        <member name=\"M:NUnit.Framework.RepeatAttribute.Wrap(NUnit.Framework.Internal.Commands.TestCommand)\">\n            <summary>\n            Wrap a command and return the result.\n            </summary>\n            <param name=\"command\">The command to be wrapped</param>\n            <returns>The wrapped command</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.RepeatAttribute.RepeatedTestCommand\">\n            <summary>\n            The test command for the RepeatAttribute\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.RepeatAttribute.RepeatedTestCommand.#ctor(NUnit.Framework.Internal.Commands.TestCommand,System.Int32)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.RepeatAttribute.RepeatedTestCommand\"/> class.\n            </summary>\n            <param name=\"innerCommand\">The inner command.</param>\n            <param name=\"repeatCount\">The number of repetitions</param>\n        </member>\n        <member name=\"M:NUnit.Framework.RepeatAttribute.RepeatedTestCommand.Execute(NUnit.Framework.Internal.ITestExecutionContext)\">\n            <summary>\n            Runs the test, saving a TestResult in the supplied TestExecutionContext.\n            </summary>\n            <param name=\"context\">The context in which the test should run.</param>\n            <returns>A TestResult</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Execution.CountdownEvent\">\n            <summary>\n            A simplified implementation of .NET 4 CountdownEvent\n            for use in earlier versions of .NET. Only the methods\n            used by NUnit are implemented.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Execution.CountdownEvent.#ctor(System.Int32)\">\n            <summary>\n            Construct a CountdownEvent\n            </summary>\n            <param name=\"initialCount\">The initial count</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Execution.CountdownEvent.Signal\">\n            <summary>\n            Decrement the count by one\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Execution.CountdownEvent.Wait\">\n            <summary>\n            Block the thread until the count reaches zero\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Execution.CountdownEvent.InitialCount\">\n            <summary>\n            Gets the initial count established for the CountdownEvent\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Execution.CountdownEvent.CurrentCount\">\n            <summary>\n            Gets the current count remaining for the CountdownEvent\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Commands.TheoryResultCommand\">\n            <summary>\n            TheoryResultCommand adjusts the result of a Theory so that\n            it fails if all the results were inconclusive.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Commands.TheoryResultCommand.#ctor(NUnit.Framework.Internal.Commands.TestCommand)\">\n            <summary>\n            Constructs a TheoryResultCommand \n            </summary>\n            <param name=\"command\">The command to be wrapped by this one</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Commands.TheoryResultCommand.Execute(NUnit.Framework.Internal.ITestExecutionContext)\">\n            <summary>\n            Overridden to call the inner command and adjust the result\n            in case all chlid results were inconclusive.\n            </summary>\n            <param name=\"context\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Builders.NUnitTestCaseBuilder\">\n            <summary>\n            NUnitTestCaseBuilder is a utility class used by attributes\n            that build test cases.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Builders.NUnitTestCaseBuilder.#ctor\">\n            <summary>\n            Constructs an <see cref=\"T:NUnit.Framework.Internal.Builders.NUnitTestCaseBuilder\"/>\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Builders.NUnitTestCaseBuilder.BuildTestMethod(NUnit.Framework.Interfaces.IMethodInfo,NUnit.Framework.Internal.Test,NUnit.Framework.Internal.TestCaseParameters)\">\n            <summary>\n            Builds a single NUnitTestMethod, either as a child of the fixture\n            or as one of a set of test cases under a ParameterizedTestMethodSuite.\n            </summary>\n            <param name=\"method\">The MethodInfo from which to construct the TestMethod</param>\n            <param name=\"parentSuite\">The suite or fixture to which the new test will be added</param>\n            <param name=\"parms\">The ParameterSet to be used, or null</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Builders.NUnitTestCaseBuilder.CheckTestMethodSignature(NUnit.Framework.Internal.TestMethod,NUnit.Framework.Internal.TestCaseParameters)\">\n             <summary>\n             Helper method that checks the signature of a TestMethod and\n             any supplied parameters to determine if the test is valid.\n            \n             Currently, NUnitTestMethods are required to be public,\n             non-abstract methods, either static or instance,\n             returning void. They may take arguments but the _values must\n             be provided or the TestMethod is not considered runnable.\n            \n             Methods not meeting these criteria will be marked as\n             non-runnable and the method will return false in that case.\n             </summary>\n             <param name=\"testMethod\">The TestMethod to be checked. If it\n             is found to be non-runnable, it will be modified.</param>\n             <param name=\"parms\">Parameters to be used for this test, or null</param>\n             <returns>True if the method signature is valid, false if not</returns>\n             <remarks>\n             The return value is no longer used internally, but is retained\n             for testing purposes.\n             </remarks>\n        </member>\n        <member name=\"T:NUnit.Framework.Interfaces.TestStatus\">\n            <summary>\n            The TestStatus enum indicates the result of running a test\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Interfaces.TestStatus.Inconclusive\">\n            <summary>\n            The test was inconclusive\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Interfaces.TestStatus.Skipped\">\n            <summary>\n            The test has skipped \n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Interfaces.TestStatus.Passed\">\n            <summary>\n            The test succeeded\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Interfaces.TestStatus.Failed\">\n            <summary>\n            The test failed\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.ActionsHelper\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.ActionsHelper.ExecuteBeforeActions(System.Collections.Generic.IEnumerable{NUnit.Framework.ITestAction},NUnit.Framework.Interfaces.ITest)\">\n            <summary>\n            \n            </summary>\n            <param name=\"actions\"></param>\n            <param name=\"test\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.ActionsHelper.ExecuteAfterActions(System.Collections.Generic.IEnumerable{NUnit.Framework.ITestAction},NUnit.Framework.Interfaces.ITest)\">\n            <summary>\n            \n            </summary>\n            <param name=\"actions\"></param>\n            <param name=\"test\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.ActionsHelper.GetActionsFromTestAssembly(NUnit.Framework.Internal.TestAssembly)\">\n            <summary>\n            \n            </summary>\n            <param name=\"testAssembly\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.ActionsHelper.GetActionsFromTestMethodInfo(NUnit.Framework.Interfaces.IMethodInfo)\">\n            <summary>\n            \n            </summary>\n            <param name=\"testAssembly\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.ActionsHelper.GetActionsFromAttributeProvider(System.Reflection.ICustomAttributeProvider)\">\n            <summary>\n            \n            </summary>\n            <param name=\"attributeProvider\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.ActionsHelper.GetActionsFromTypesAttributes(System.Type)\">\n            <summary>\n            \n            </summary>\n            <param name=\"type\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.TestNameGenerator\">\n            <summary>\n            TestNameGenerator is able to create test names according to\n            a coded pattern.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.TestNameGenerator.DefaultTestNamePattern\">\n            <summary>\n            Default pattern used to generate names\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestNameGenerator.#ctor\">\n            <summary>\n            Construct a TestNameGenerator\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestNameGenerator.#ctor(System.String)\">\n            <summary>\n            Construct a TestNameGenerator\n            </summary>\n            <param name=\"pattern\">The pattern used by this generator.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestNameGenerator.GetDisplayName(NUnit.Framework.Internal.TestMethod)\">\n            <summary>\n            Get the display name for a TestMethod and it's arguments\n            </summary>\n            <param name=\"testMethod\">A TestMethod</param>\n            <returns>The display name</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestNameGenerator.GetDisplayName(NUnit.Framework.Internal.TestMethod,System.Object[])\">\n            <summary>\n            Get the display name for a TestMethod and it's arguments\n            </summary>\n            <param name=\"testMethod\">A TestMethod</param>\n            <param name=\"args\">Arguments to be used</param>\n            <returns>The display name</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.EqualConstraintResult\">\n            <summary>\n            The EqualConstraintResult class is tailored for formatting\n            and displaying the result of an EqualConstraint. \n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.EqualConstraintResult.#ctor(NUnit.Framework.Constraints.EqualConstraint,System.Object,System.Boolean)\">\n            <summary>\n            Construct an EqualConstraintResult\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.EqualConstraintResult.WriteMessageTo(NUnit.Framework.Constraints.MessageWriter)\">\n            <summary>\n            Write a failure message. Overridden to provide custom \n            failure messages for EqualConstraint.\n            </summary>\n            <param name=\"writer\">The MessageWriter to write to</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.EqualConstraintResult.DisplayCollectionDifferences(NUnit.Framework.Constraints.MessageWriter,System.Collections.ICollection,System.Collections.ICollection,System.Int32)\">\n            <summary>\n            Display the failure information for two collections that did not match.\n            </summary>\n            <param name=\"writer\">The MessageWriter on which to display</param>\n            <param name=\"expected\">The expected collection.</param>\n            <param name=\"actual\">The actual collection</param>\n            <param name=\"depth\">The depth of this failure in a set of nested collections</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.EqualConstraintResult.DisplayTypesAndSizes(NUnit.Framework.Constraints.MessageWriter,System.Collections.IEnumerable,System.Collections.IEnumerable,System.Int32)\">\n            <summary>\n            Displays a single line showing the types and sizes of the expected\n            and actual collections or arrays. If both are identical, the value is \n            only shown once.\n            </summary>\n            <param name=\"writer\">The MessageWriter on which to display</param>\n            <param name=\"expected\">The expected collection or array</param>\n            <param name=\"actual\">The actual collection or array</param>\n            <param name=\"indent\">The indentation level for the message line</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.EqualConstraintResult.DisplayFailurePoint(NUnit.Framework.Constraints.MessageWriter,System.Collections.IEnumerable,System.Collections.IEnumerable,NUnit.Framework.Constraints.NUnitEqualityComparer.FailurePoint,System.Int32)\">\n            <summary>\n            Displays a single line showing the point in the expected and actual\n            arrays at which the comparison failed. If the arrays have different\n            structures or dimensions, both _values are shown.\n            </summary>\n            <param name=\"writer\">The MessageWriter on which to display</param>\n            <param name=\"expected\">The expected array</param>\n            <param name=\"actual\">The actual array</param>\n            <param name=\"failurePoint\">Index of the failure point in the underlying collections</param>\n            <param name=\"indent\">The indentation level for the message line</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.EqualConstraintResult.DisplayEnumerableDifferences(NUnit.Framework.Constraints.MessageWriter,System.Collections.IEnumerable,System.Collections.IEnumerable,System.Int32)\">\n            <summary>\n            Display the failure information for two IEnumerables that did not match.\n            </summary>\n            <param name=\"writer\">The MessageWriter on which to display</param>\n            <param name=\"expected\">The expected enumeration.</param>\n            <param name=\"actual\">The actual enumeration</param>\n            <param name=\"depth\">The depth of this failure in a set of nested collections</param>\n        </member>\n        <member name=\"T:NUnit.Compatibility.TypeExtensions\">\n            <summary>\n            Provides NUnit specific extensions to aid in Reflection\n            across multiple frameworks\n            </summary>\n            <remarks>\n            This version of the class supplies GetTypeInfo() on platforms\n            that don't support it.\n            </remarks>\n        </member>\n        <member name=\"M:NUnit.Compatibility.TypeExtensions.GetTypeInfo(System.Type)\">\n            <summary>\n            GetTypeInfo gives access to most of the Type information we take for granted\n            on .NET Core and Windows Runtime. Rather than #ifdef different code for different\n            platforms, it is easiest to just code all platforms as if they worked this way,\n            thus the simple passthrough.\n            </summary>\n            <param name=\"type\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"T:NUnit.Compatibility.AssemblyExtensions\">\n            <summary>\n            Extensions for Assembly that are not available in pre-4.5 .NET releases\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Compatibility.AssemblyExtensions.GetCustomAttribute``1(System.Reflection.Assembly)\">\n            <summary>\n            An easy way to get a single custom attribute from an assembly\n            </summary>\n            <typeparam name=\"T\">The attribute Type</typeparam>\n            <param name=\"assembly\">The assembly</param>\n            <returns>An attribute of Type T</returns>\n        </member>\n        <member name=\"T:NUnit.Compatibility.AdditionalTypeExtensions\">\n            <summary>\n            Type extensions that apply to all target frameworks\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Compatibility.AdditionalTypeExtensions.ParametersMatch(System.Reflection.ParameterInfo[],System.Type[])\">\n            <summary>\n            Determines if the given <see cref=\"T:System.Type\"/> array is castable/matches the <see cref=\"T:System.Reflection.ParameterInfo\"/> array.\n            </summary>\n            <param name=\"pinfos\"></param>\n            <param name=\"ptypes\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Compatibility.AdditionalTypeExtensions.IsCastableFrom(System.Type,System.Type)\">\n            <summary>\n            Determines if one type can be implicitly converted from another\n            </summary>\n            <param name=\"to\"></param>\n            <param name=\"from\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"T:NUnit.Compatibility.NUnitNullType\">\n            <summary>\n            This class is used as a flag when we get a parameter list for a method/constructor, but\n            we do not know one of the types because null was passed in.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.TestCaseData\">\n            <summary>\n            The TestCaseData class represents a set of arguments\n            and other parameter info to be used for a parameterized\n            test case. It is derived from TestCaseParameters and adds a\n            fluent syntax for use in initializing the test case.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.TestCaseParameters\">\n            <summary>\n            The TestCaseParameters class encapsulates method arguments and\n            other selected parameters needed for constructing\n            a parameterized test case.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.TestParameters\">\n            <summary>\n            TestParameters is the abstract base class for all classes\n            that know how to provide data for constructing a test.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestParameters.#ctor\">\n            <summary>\n            Default Constructor creates an empty parameter set\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestParameters.#ctor(System.Object[])\">\n            <summary>\n            Construct a parameter set with a list of arguments\n            </summary>\n            <param name=\"args\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestParameters.#ctor(System.Exception)\">\n            <summary>\n            Construct a non-runnable ParameterSet, specifying\n            the provider exception that made it invalid.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestParameters.#ctor(NUnit.Framework.Interfaces.ITestData)\">\n            <summary>\n            Construct a ParameterSet from an object implementing ITestData\n            </summary>\n            <param name=\"data\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestParameters.ApplyToTest(NUnit.Framework.Internal.Test)\">\n            <summary>\n            Applies ParameterSet _values to the test itself.\n            </summary>\n            <param name=\"test\">A test.</param>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestParameters.RunState\">\n            <summary>\n            The RunState for this set of parameters.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestParameters.Arguments\">\n            <summary>\n            The arguments to be used in running the test,\n            which must match the method signature.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestParameters.TestName\">\n            <summary>\n            A name to be used for this test case in lieu\n            of the standard generated name containing\n            the argument list.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestParameters.Properties\">\n            <summary>\n            Gets the property dictionary for this test\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestParameters.OriginalArguments\">\n            <summary>\n            The original arguments provided by the user,\n            used for display purposes.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.TestCaseParameters._expectedResult\">\n            <summary>\n            The expected result to be returned\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestCaseParameters.#ctor\">\n            <summary>\n            Default Constructor creates an empty parameter set\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestCaseParameters.#ctor(System.Exception)\">\n            <summary>\n            Construct a non-runnable ParameterSet, specifying\n            the provider exception that made it invalid.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestCaseParameters.#ctor(System.Object[])\">\n            <summary>\n            Construct a parameter set with a list of arguments\n            </summary>\n            <param name=\"args\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestCaseParameters.#ctor(NUnit.Framework.Interfaces.ITestCaseData)\">\n            <summary>\n            Construct a ParameterSet from an object implementing ITestCaseData\n            </summary>\n            <param name=\"data\"></param>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestCaseParameters.ExpectedResult\">\n            <summary>\n            The expected result of the test, which\n            must match the method return type.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestCaseParameters.HasExpectedResult\">\n            <summary>\n            Gets a value indicating whether an expected result was specified.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestCaseData.#ctor(System.Object[])\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.TestCaseData\"/> class.\n            </summary>\n            <param name=\"args\">The arguments.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.TestCaseData.#ctor(System.Object)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.TestCaseData\"/> class.\n            </summary>\n            <param name=\"arg\">The argument.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.TestCaseData.#ctor(System.Object,System.Object)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.TestCaseData\"/> class.\n            </summary>\n            <param name=\"arg1\">The first argument.</param>\n            <param name=\"arg2\">The second argument.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.TestCaseData.#ctor(System.Object,System.Object,System.Object)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.TestCaseData\"/> class.\n            </summary>\n            <param name=\"arg1\">The first argument.</param>\n            <param name=\"arg2\">The second argument.</param>\n            <param name=\"arg3\">The third argument.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.TestCaseData.Returns(System.Object)\">\n            <summary>\n            Sets the expected result for the test\n            </summary>\n            <param name=\"result\">The expected result</param>\n            <returns>A modified TestCaseData</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.TestCaseData.SetName(System.String)\">\n            <summary>\n            Sets the name of the test case\n            </summary>\n            <returns>The modified TestCaseData instance</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.TestCaseData.SetDescription(System.String)\">\n            <summary>\n            Sets the description for the test case\n            being constructed.\n            </summary>\n            <param name=\"description\">The description.</param>\n            <returns>The modified TestCaseData instance.</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.TestCaseData.SetCategory(System.String)\">\n            <summary>\n            Applies a category to the test\n            </summary>\n            <param name=\"category\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.TestCaseData.SetProperty(System.String,System.String)\">\n            <summary>\n            Applies a named property to the test\n            </summary>\n            <param name=\"propName\"></param>\n            <param name=\"propValue\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.TestCaseData.SetProperty(System.String,System.Int32)\">\n            <summary>\n            Applies a named property to the test\n            </summary>\n            <param name=\"propName\"></param>\n            <param name=\"propValue\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.TestCaseData.SetProperty(System.String,System.Double)\">\n            <summary>\n            Applies a named property to the test\n            </summary>\n            <param name=\"propName\"></param>\n            <param name=\"propValue\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.TestCaseData.Explicit\">\n            <summary>\n            Marks the test case as explicit.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestCaseData.Explicit(System.String)\">\n            <summary>\n            Marks the test case as explicit, specifying the reason.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestCaseData.Ignore(System.String)\">\n            <summary>\n            Ignores this TestCase, specifying the reason.\n            </summary>\n            <param name=\"reason\">The reason.</param>\n            <returns></returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.ITestExecutionContext\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.ITestExecutionContext.IncrementAssertCount\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.ITestExecutionContext.AddFormatter(NUnit.Framework.Constraints.ValueFormatterFactory)\">\n            <summary>\n            \n            </summary>\n            <param name=\"formatterFactory\"></param>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.ITestExecutionContext.CurrentTest\">\n            <summary>\n            Gets or sets the current test\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.ITestExecutionContext.StartTime\">\n            <summary>\n            The time the current test started execution\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.ITestExecutionContext.StartTicks\">\n            <summary>\n            The time the current test started in Ticks\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.ITestExecutionContext.CurrentResult\">\n            <summary>\n            Gets or sets the current test result\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.ITestExecutionContext.OutWriter\">\n            <summary>\n            Gets a TextWriter that will send output to the current test result.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.ITestExecutionContext.TestObject\">\n            <summary>\n            The current test object - that is the user fixture\n            object on which tests are being executed.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.ITestExecutionContext.WorkDirectory\">\n            <summary>\n            Get or set the working directory\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.ITestExecutionContext.StopOnError\">\n            <summary>\n            Get or set indicator that run should stop on the first error\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.ITestExecutionContext.ExecutionStatus\">\n            <summary>\n            Gets an enum indicating whether a stop has been requested.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.ITestExecutionContext.Dispatcher\">\n            <summary>\n            The current WorkItemDispatcher. Made public for \n            use by nunitlite.tests\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.ITestExecutionContext.ParallelScope\">\n            <summary>\n            The ParallelScope to be used by tests running in this context.\n            For builds with out the parallel feature, it has no effect.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.ITestExecutionContext.WorkerId\">\n            <summary>\n            The unique name of the worker that spawned the context.\n            For builds with out the parallel feature, it is null.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.ITestExecutionContext.RandomGenerator\">\n            <summary>\n            Gets the RandomGenerator specific to this Test\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.ITestExecutionContext.TestCaseTimeout\">\n            <summary>\n            Gets or sets the test case timeout value\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.ITestExecutionContext.UpstreamActions\">\n            <summary>\n            Gets a list of ITestActions set by upstream tests\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.ITestExecutionContext.CurrentCulture\">\n            <summary>\n            Saves or restores the CurrentCulture\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.ITestExecutionContext.CurrentUICulture\">\n            <summary>\n            Saves or restores the CurrentUICulture\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.ITestExecutionContext.CurrentValueFormatter\">\n            <summary>\n            The current head of the ValueFormatter chain, copied from MsgUtils.ValueFormatter\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.ITestExecutionContext.IsSingleThreaded\">\n            <summary>\n            If true, all tests must run on the same thread. No new thread may be spawned.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.TestExecutionContext\">\n             <summary>\n             Helper class used to save and restore certain static or\n             singleton settings in the environment that affect tests\n             or which might be changed by the user tests.\n            \n             An internal class is used to hold settings and a stack\n             of these objects is pushed and popped as Save and Restore\n             are called.\n             </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.TestExecutionContext._priorContext\">\n            <summary>\n            Link to a prior saved context\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.TestExecutionContext._executionStatus\">\n            <summary>\n            Indicates that a stop has been requested\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.TestExecutionContext._listener\">\n            <summary>\n            The event listener currently receiving notifications\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.TestExecutionContext._assertCount\">\n            <summary>\n            The number of assertions for the current test\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.TestExecutionContext._currentCulture\">\n            <summary>\n            The current culture\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.TestExecutionContext._currentUICulture\">\n            <summary>\n            The current UI culture\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.TestExecutionContext._currentResult\">\n            <summary>\n            The current test result\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.TestExecutionContext._currentPrincipal\">\n            <summary>\n            The current Principal.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestExecutionContext.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Internal.TestExecutionContext\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestExecutionContext.#ctor(NUnit.Framework.Internal.TestExecutionContext)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Internal.TestExecutionContext\"/> class.\n            </summary>\n            <param name=\"other\">An existing instance of TestExecutionContext.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestExecutionContext.GetTestExecutionContext\">\n            <summary>\n            Get the current context or return null if none is found.\n            </summary>\n            <remarks></remarks>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestExecutionContext.ClearCurrentContext\">\n            <summary>\n            Clear the current context. This is provided to\n            prevent \"leakage\" of the CallContext containing\n            the current context back to any runners.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestExecutionContext.UpdateContextFromEnvironment\">\n            <summary>\n            Record any changes in the environment made by\n            the test code in the execution context so it\n            will be passed on to lower level tests.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestExecutionContext.EstablishExecutionEnvironment\">\n            <summary>\n            Set up the execution environment to match a context.\n            Note that we may be running on the same thread where the\n            context was initially created or on a different thread.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestExecutionContext.IncrementAssertCount\">\n            <summary>\n            Increments the assert count by one.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestExecutionContext.IncrementAssertCount(System.Int32)\">\n            <summary>\n            Increments the assert count by a specified amount.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestExecutionContext.AddFormatter(NUnit.Framework.Constraints.ValueFormatterFactory)\">\n            <summary>\n            Adds a new ValueFormatterFactory to the chain of formatters\n            </summary>\n            <param name=\"formatterFactory\">The new factory</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestExecutionContext.InitializeLifetimeService\">\n            <summary>\n            Obtain lifetime service object\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestExecutionContext.CurrentContext\">\n            <summary>\n            Gets and sets the current context.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestExecutionContext.CurrentTest\">\n            <summary>\n            Gets or sets the current test\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestExecutionContext.StartTime\">\n            <summary>\n            The time the current test started execution\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestExecutionContext.StartTicks\">\n            <summary>\n            The time the current test started in Ticks\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestExecutionContext.CurrentResult\">\n            <summary>\n            Gets or sets the current test result\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestExecutionContext.OutWriter\">\n            <summary>\n            Gets a TextWriter that will send output to the current test result.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestExecutionContext.TestObject\">\n            <summary>\n            The current test object - that is the user fixture\n            object on which tests are being executed.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestExecutionContext.WorkDirectory\">\n            <summary>\n            Get or set the working directory\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestExecutionContext.StopOnError\">\n            <summary>\n            Get or set indicator that run should stop on the first error\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestExecutionContext.ExecutionStatus\">\n            <summary>\n            Gets an enum indicating whether a stop has been requested.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestExecutionContext.Listener\">\n            <summary>\n            The current test event listener\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestExecutionContext.Dispatcher\">\n            <summary>\n            The current WorkItemDispatcher. Made public for \n            use by nunitlite.tests\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestExecutionContext.ParallelScope\">\n            <summary>\n            The ParallelScope to be used by tests running in this context.\n            For builds with out the parallel feature, it has no effect.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestExecutionContext.WorkerId\">\n            <summary>\n            The unique name of the worker that spawned the context.\n            For builds with out the parallel feature, it is null.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestExecutionContext.RandomGenerator\">\n            <summary>\n            Gets the RandomGenerator specific to this Test\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestExecutionContext.AssertCount\">\n            <summary>\n            Gets the assert count.\n            </summary>\n            <value>The assert count.</value>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestExecutionContext.TestCaseTimeout\">\n            <summary>\n            Gets or sets the test case timeout value\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestExecutionContext.UpstreamActions\">\n            <summary>\n            Gets a list of ITestActions set by upstream tests\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestExecutionContext.CurrentCulture\">\n            <summary>\n            Saves or restores the CurrentCulture\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestExecutionContext.CurrentUICulture\">\n            <summary>\n            Saves or restores the CurrentUICulture\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestExecutionContext.CurrentPrincipal\">\n            <summary>\n            Gets or sets the current <see cref=\"T:System.Security.Principal.IPrincipal\"/> for the Thread.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestExecutionContext.CurrentValueFormatter\">\n            <summary>\n            The current head of the ValueFormatter chain, copied from MsgUtils.ValueFormatter\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestExecutionContext.IsSingleThreaded\">\n            <summary>\n            If true, all tests must run on the same thread. No new thread may be spawned.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.InconclusiveException\">\n            <summary>\n            Thrown when a test executes inconclusively.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.ResultStateException\">\n            <summary>\n            Abstract base for Exceptions that terminate a test and provide a ResultState.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.ResultStateException.#ctor(System.String)\">\n            <param name=\"message\">The error message that explains \n            the reason for the exception</param>\n        </member>\n        <member name=\"M:NUnit.Framework.ResultStateException.#ctor(System.String,System.Exception)\">\n            <param name=\"message\">The error message that explains \n            the reason for the exception</param>\n            <param name=\"inner\">The exception that caused the \n            current exception</param>\n        </member>\n        <member name=\"M:NUnit.Framework.ResultStateException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)\">\n            <summary>\n            Serialization Constructor\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.ResultStateException.ResultState\">\n            <summary>\n            Gets the ResultState provided by this exception\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.InconclusiveException.#ctor(System.String)\">\n            <param name=\"message\">The error message that explains \n            the reason for the exception</param>\n        </member>\n        <member name=\"M:NUnit.Framework.InconclusiveException.#ctor(System.String,System.Exception)\">\n            <param name=\"message\">The error message that explains \n            the reason for the exception</param>\n            <param name=\"inner\">The exception that caused the \n            current exception</param>\n        </member>\n        <member name=\"M:NUnit.Framework.InconclusiveException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)\">\n            <summary>\n            Serialization Constructor\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.InconclusiveException.ResultState\">\n            <summary>\n            Gets the ResultState provided by this exception\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Contains\">\n            <summary>\n            Helper class with properties and methods that supply\n            a number of constraints used in Asserts.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Contains.Item(System.Object)\">\n            <summary>\n            Returns a new CollectionContainsConstraint checking for the\n            presence of a particular object in the collection.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Contains.Key(System.Object)\">\n            <summary>\n            Returns a new DictionaryContainsKeyConstraint checking for the\n            presence of a particular key in the dictionary.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Contains.Value(System.Object)\">\n            <summary>\n            Returns a new DictionaryContainsValueConstraint checking for the\n            presence of a particular value in the dictionary.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Contains.Substring(System.String)\">\n            <summary>\n            Returns a constraint that succeeds if the actual\n            value contains the substring supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.EqualConstraint\">\n            <summary>\n            EqualConstraint is able to compare an actual value with the\n            expected value provided in its constructor. Two objects are \n            considered equal if both are null, or if both have the same \n            value. NUnit has special semantics for some object types.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.EqualConstraint._comparer\">\n            <summary>\n            NUnitEqualityComparer used to test equality.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.EqualConstraint.#ctor(System.Object)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Constraints.EqualConstraint\"/> class.\n            </summary>\n            <param name=\"expected\">The expected value.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.EqualConstraint.Within(System.Object)\">\n            <summary>\n            Flag the constraint to use a tolerance when determining equality.\n            </summary>\n            <param name=\"amount\">Tolerance value to be used</param>\n            <returns>Self.</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.EqualConstraint.Using(System.Collections.IComparer)\">\n            <summary>\n            Flag the constraint to use the supplied IComparer object.\n            </summary>\n            <param name=\"comparer\">The IComparer object to use.</param>\n            <returns>Self.</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.EqualConstraint.Using``1(System.Collections.Generic.IComparer{``0})\">\n            <summary>\n            Flag the constraint to use the supplied IComparer object.\n            </summary>\n            <param name=\"comparer\">The IComparer object to use.</param>\n            <returns>Self.</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.EqualConstraint.Using``1(System.Comparison{``0})\">\n            <summary>\n            Flag the constraint to use the supplied Comparison object.\n            </summary>\n            <param name=\"comparer\">The IComparer object to use.</param>\n            <returns>Self.</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.EqualConstraint.Using(System.Collections.IEqualityComparer)\">\n            <summary>\n            Flag the constraint to use the supplied IEqualityComparer object.\n            </summary>\n            <param name=\"comparer\">The IComparer object to use.</param>\n            <returns>Self.</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.EqualConstraint.Using``1(System.Collections.Generic.IEqualityComparer{``0})\">\n            <summary>\n            Flag the constraint to use the supplied IEqualityComparer object.\n            </summary>\n            <param name=\"comparer\">The IComparer object to use.</param>\n            <returns>Self.</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.EqualConstraint.ApplyTo(System.Object)\">\n            <summary>\n            Test whether the constraint is satisfied by a given value\n            </summary>\n            <param name=\"actual\">The value to be tested</param>\n            <returns>True for success, false for failure</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.EqualConstraint.Tolerance\">\n            <summary>\n            Gets the tolerance for this comparison.\n            </summary>\n            <value>\n            The tolerance.\n            </value>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.EqualConstraint.CaseInsensitive\">\n            <summary>\n            Gets a value indicating whether to compare case insensitive.\n            </summary>\n            <value>\n              <c>true</c> if comparing case insensitive; otherwise, <c>false</c>.\n            </value>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.EqualConstraint.ClipStrings\">\n            <summary>\n            Gets a value indicating whether or not to clip strings.\n            </summary>\n            <value>\n              <c>true</c> if set to clip strings otherwise, <c>false</c>.\n            </value>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.EqualConstraint.FailurePoints\">\n            <summary>\n            Gets the failure points.\n            </summary>\n            <value>\n            The failure points.\n            </value>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.EqualConstraint.IgnoreCase\">\n            <summary>\n            Flag the constraint to ignore case and return self.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.EqualConstraint.NoClip\">\n            <summary>\n            Flag the constraint to suppress string clipping \n            and return self.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.EqualConstraint.AsCollection\">\n            <summary>\n            Flag the constraint to compare arrays as collections\n            and return self.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.EqualConstraint.WithSameOffset\">\n            <summary>\n            Flags the constraint to include <see cref=\"P:System.DateTimeOffset.Offset\"/>\n            property in comparison of two <see cref=\"T:System.DateTimeOffset\"/> values.\n            </summary>\n            <remarks>\n            Using this modifier does not allow to use the <see cref=\"M:NUnit.Framework.Constraints.EqualConstraint.Within(System.Object)\"/>\n            constraint modifier.\n            </remarks>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.EqualConstraint.Ulps\">\n            <summary>\n            Switches the .Within() modifier to interpret its tolerance as\n            a distance in representable _values (see remarks).\n            </summary>\n            <returns>Self.</returns>\n            <remarks>\n            Ulp stands for \"unit in the last place\" and describes the minimum\n            amount a given value can change. For any integers, an ulp is 1 whole\n            digit. For floating point _values, the accuracy of which is better\n            for smaller numbers and worse for larger numbers, an ulp depends\n            on the size of the number. Using ulps for comparison of floating\n            point results instead of fixed tolerances is safer because it will\n            automatically compensate for the added inaccuracy of larger numbers.\n            </remarks>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.EqualConstraint.Percent\">\n            <summary>\n            Switches the .Within() modifier to interpret its tolerance as\n            a percentage that the actual _values is allowed to deviate from\n            the expected value.\n            </summary>\n            <returns>Self</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.EqualConstraint.Days\">\n            <summary>\n            Causes the tolerance to be interpreted as a TimeSpan in days.\n            </summary>\n            <returns>Self</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.EqualConstraint.Hours\">\n            <summary>\n            Causes the tolerance to be interpreted as a TimeSpan in hours.\n            </summary>\n            <returns>Self</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.EqualConstraint.Minutes\">\n            <summary>\n            Causes the tolerance to be interpreted as a TimeSpan in minutes.\n            </summary>\n            <returns>Self</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.EqualConstraint.Seconds\">\n            <summary>\n            Causes the tolerance to be interpreted as a TimeSpan in seconds.\n            </summary>\n            <returns>Self</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.EqualConstraint.Milliseconds\">\n            <summary>\n            Causes the tolerance to be interpreted as a TimeSpan in milliseconds.\n            </summary>\n            <returns>Self</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.EqualConstraint.Ticks\">\n            <summary>\n            Causes the tolerance to be interpreted as a TimeSpan in clock ticks.\n            </summary>\n            <returns>Self</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.EqualConstraint.Description\">\n            <summary>\n            The Description of what this constraint tests, for\n            use in messages and in the ConstraintResult.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.DelayedConstraint\">\n            <summary>\n             Applies a delay to the match so that a match can be evaluated in the future.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.DelayedConstraint.#ctor(NUnit.Framework.Constraints.IConstraint,System.Int32)\">\n            <summary>\n             Creates a new DelayedConstraint\n            </summary>\n            <param name=\"baseConstraint\">The inner constraint to decorate</param>\n            <param name=\"delayInMilliseconds\">The time interval after which the match is performed</param>\n            <exception cref=\"T:System.InvalidOperationException\">If the value of <paramref name=\"delayInMilliseconds\"/> is less than 0</exception>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.DelayedConstraint.#ctor(NUnit.Framework.Constraints.IConstraint,System.Int32,System.Int32)\">\n            <summary>\n             Creates a new DelayedConstraint\n            </summary>\n            <param name=\"baseConstraint\">The inner constraint to decorate</param>\n            <param name=\"delayInMilliseconds\">The time interval after which the match is performed, in milliseconds</param>\n            <param name=\"pollingInterval\">The time interval used for polling, in milliseconds</param>\n            <exception cref=\"T:System.InvalidOperationException\">If the value of <paramref name=\"delayInMilliseconds\"/> is less than 0</exception>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.DelayedConstraint.ApplyTo(System.Object)\">\n            <summary>\n            Test whether the constraint is satisfied by a given value\n            </summary>\n            <param name=\"actual\">The value to be tested</param>\n            <returns>True for if the base constraint fails, false if it succeeds</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.DelayedConstraint.ApplyTo``1(NUnit.Framework.Constraints.ActualValueDelegate{``0})\">\n            <summary>\n            Test whether the constraint is satisfied by a delegate\n            </summary>\n            <param name=\"del\">The delegate whose value is to be tested</param>\n            <returns>A ConstraintResult</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.DelayedConstraint.ApplyTo``1(``0@)\">\n            <summary>\n            Test whether the constraint is satisfied by a given reference.\n            Overridden to wait for the specified delay period before\n            calling the base constraint with the dereferenced value.\n            </summary>\n            <param name=\"actual\">A reference to the value to be tested</param>\n            <returns>True for success, false for failure</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.DelayedConstraint.GetStringRepresentation\">\n            <summary>\n            Returns the string representation of the constraint.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.DelayedConstraint.TimestampOffset(System.Int64,System.TimeSpan)\">\n            <summary>\n            Adjusts a Timestamp by a given TimeSpan\n            </summary>\n            <param name=\"timestamp\"></param>\n            <param name=\"offset\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.DelayedConstraint.TimestampDiff(System.Int64,System.Int64)\">\n            <summary>\n            Returns the difference between two Timestamps as a TimeSpan\n            </summary>\n            <param name=\"timestamp1\"></param>\n            <param name=\"timestamp2\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.DelayedConstraint.Description\">\n            <summary>\n            Gets text describing a constraint\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.CollectionOrderedConstraint\">\n            <summary>\n            CollectionOrderedConstraint is used to test whether a collection is ordered.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.CollectionOrderedConstraint.#ctor\">\n            <summary>\n            Construct a CollectionOrderedConstraint\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.CollectionOrderedConstraint.Using(System.Collections.IComparer)\">\n            <summary>\n            Modifies the constraint to use an <see cref=\"T:System.Collections.IComparer\"/> and returns self.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.CollectionOrderedConstraint.Using``1(System.Collections.Generic.IComparer{``0})\">\n            <summary>\n            Modifies the constraint to use an <see cref=\"T:System.Collections.Generic.IComparer`1\"/> and returns self.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.CollectionOrderedConstraint.Using``1(System.Comparison{``0})\">\n            <summary>\n            Modifies the constraint to use a <see cref=\"T:System.Comparison`1\"/> and returns self.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.CollectionOrderedConstraint.By(System.String)\">\n            <summary>\n            Modifies the constraint to test ordering by the value of\n            a specified property and returns self.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.CollectionOrderedConstraint.Matches(System.Collections.IEnumerable)\">\n            <summary>\n            Test whether the collection is ordered\n            </summary>\n            <param name=\"actual\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.CollectionOrderedConstraint.GetStringRepresentation\">\n            <summary>\n            Returns the string representation of the constraint.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.CollectionOrderedConstraint.DisplayName\">\n            <summary> \n            The display name of this Constraint for use by ToString().\n            The default value is the name of the constraint with\n            trailing \"Constraint\" removed. Derived classes may set\n            this to another name in their constructors.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.CollectionOrderedConstraint.Ascending\">\n            <summary>\n             If used performs a default ascending comparison\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.CollectionOrderedConstraint.Descending\">\n            <summary>\n             If used performs a reverse comparison\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.CollectionOrderedConstraint.Then\">\n            <summary>\n            Then signals a break between two ordering steps\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.CollectionOrderedConstraint.Description\">\n            <summary>\n            The Description of what this constraint tests, for\n            use in messages and in the ConstraintResult.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.CollectionOrderedConstraint.OrderingStep\">\n            <summary>\n            An OrderingStep represents one stage of the sort\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.DescriptionAttribute\">\n            <summary>\n            Attribute used to provide descriptive text about a \n            test case or fixture.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.DescriptionAttribute.#ctor(System.String)\">\n            <summary>\n            Construct a description Attribute\n            </summary>\n            <param name=\"description\">The text of the description</param>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.InvalidDataSourceException\">\n            <summary>\n            InvalidTestFixtureException is thrown when an appropriate test\n            fixture constructor using the provided arguments cannot be found.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.InvalidDataSourceException.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Internal.InvalidTestFixtureException\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.InvalidDataSourceException.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Internal.InvalidTestFixtureException\"/> class.\n            </summary>\n            <param name=\"message\">The message.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.InvalidDataSourceException.#ctor(System.String,System.Exception)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Internal.InvalidTestFixtureException\"/> class.\n            </summary>\n            <param name=\"message\">The message.</param>\n            <param name=\"inner\">The inner.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.InvalidDataSourceException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)\">\n            <summary>\n            Serialization Constructor\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Execution.CompositeWorkItem\">\n            <summary>\n            A CompositeWorkItem represents a test suite and\n            encapsulates the execution of the suite as well\n            as all its child tests.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.Execution.CompositeWorkItem._countOrder\">\n            <summary>\n            A count of how many tests in the work item have a value for the Order Property\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Execution.CompositeWorkItem.#ctor(NUnit.Framework.Internal.TestSuite,NUnit.Framework.Interfaces.ITestFilter)\">\n            <summary>\n            Construct a CompositeWorkItem for executing a test suite\n            using a filter to select child tests.\n            </summary>\n            <param name=\"suite\">The TestSuite to be executed</param>\n            <param name=\"childFilter\">A filter used to select child tests</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Execution.CompositeWorkItem.PerformWork\">\n            <summary>\n            Method that actually performs the work. Overridden\n            in CompositeWorkItem to do setup, run all child\n            items and then do teardown.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Execution.CompositeWorkItem.SortChildren\">\n            <summary>\n            Sorts tests under this suite.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Execution.CompositeWorkItem.Cancel(System.Boolean)\">\n            <summary>\n            Cancel (abort or stop) a CompositeWorkItem and all of its children\n            </summary>\n            <param name=\"force\">true if the CompositeWorkItem and all of its children should be aborted, false if it should allow all currently running tests to complete</param>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Execution.CompositeWorkItem.Children\">\n            <summary>\n            List of Child WorkItems\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Execution.CompositeWorkItem.WorkItemOrderComparer.Compare(NUnit.Framework.Internal.Execution.WorkItem,NUnit.Framework.Internal.Execution.WorkItem)\">\n            <summary>\n            Compares two objects and returns a value indicating whether one is less than, equal to, or greater than the other.\n            </summary>\n            <returns>\n            A signed integer that indicates the relative values of <paramref name=\"x\"/> and <paramref name=\"y\"/>, as shown in the following table.Value Meaning Less than zero<paramref name=\"x\"/> is less than <paramref name=\"y\"/>.Zero<paramref name=\"x\"/> equals <paramref name=\"y\"/>.Greater than zero<paramref name=\"x\"/> is greater than <paramref name=\"y\"/>.\n            </returns>\n            <param name=\"x\">The first object to compare.</param><param name=\"y\">The second object to compare.</param>\n        </member>\n        <member name=\"T:NUnit.Framework.Interfaces.ISimpleTestBuilder\">\n            <summary>\n            The ISimpleTestBuilder interface is exposed by a class that knows how to\n            build a single TestMethod from a suitable MethodInfo Types. In general, \n            it is exposed by an attribute, but may be implemented in a helper class \n            used by the attribute in some cases.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.ISimpleTestBuilder.BuildFrom(NUnit.Framework.Interfaces.IMethodInfo,NUnit.Framework.Internal.Test)\">\n            <summary>\n            Build a TestMethod from the provided MethodInfo.\n            </summary>\n            <param name=\"method\">The method to be used as a test</param>\n            <param name=\"suite\">The TestSuite to which the method will be added</param>\n            <returns>A TestMethod object</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.TypeWrapper\">\n            <summary>\n            The TypeWrapper class wraps a Type so it may be used in\n            a platform-independent manner.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TypeWrapper.#ctor(System.Type)\">\n            <summary>\n            Construct a TypeWrapper for a specified Type.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TypeWrapper.IsType(System.Type)\">\n            <summary>\n            Returns true if the Type wrapped is T\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TypeWrapper.GetDisplayName\">\n            <summary>\n            Get the display name for this type\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TypeWrapper.GetDisplayName(System.Object[])\">\n            <summary>\n            Get the display name for an object of this type, constructed with the specified args.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TypeWrapper.MakeGenericType(System.Type[])\">\n            <summary>\n            Returns a new ITypeInfo representing an instance of this generic Type using the supplied Type arguments\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TypeWrapper.GetGenericTypeDefinition\">\n            <summary>\n            Returns a Type representing a generic type definition from which this Type can be constructed.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TypeWrapper.GetCustomAttributes``1(System.Boolean)\">\n            <summary>\n            Returns an array of custom attributes of the specified type applied to this type\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TypeWrapper.IsDefined``1(System.Boolean)\">\n            <summary>\n            Returns a value indicating whether the type has an attribute of the specified type.\n            </summary>\n            <typeparam name=\"T\"></typeparam>\n            <param name=\"inherit\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TypeWrapper.HasMethodWithAttribute(System.Type)\">\n            <summary>\n            Returns a flag indicating whether this type has a method with an attribute of the specified type.\n            </summary>\n            <param name=\"attributeType\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TypeWrapper.GetMethods(System.Reflection.BindingFlags)\">\n            <summary>\n            Returns an array of IMethodInfos for methods of this Type\n            that match the specified flags.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TypeWrapper.GetConstructor(System.Type[])\">\n            <summary>\n            Gets the public constructor taking the specified argument Types\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TypeWrapper.HasConstructor(System.Type[])\">\n            <summary>\n            Returns a value indicating whether this Type has a public constructor taking the specified argument Types.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TypeWrapper.Construct(System.Object[])\">\n            <summary>\n            Construct an object of this Type, using the specified arguments.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TypeWrapper.ToString\">\n            <summary>\n            Override ToString() so that error messages in NUnit's own tests make sense\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TypeWrapper.Type\">\n            <summary>\n            Gets the underlying Type on which this TypeWrapper is based.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TypeWrapper.BaseType\">\n            <summary>\n            Gets the base type of this type as an ITypeInfo\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TypeWrapper.Name\">\n            <summary>\n            Gets the Name of the Type\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TypeWrapper.FullName\">\n            <summary>\n            Gets the FullName of the Type\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TypeWrapper.Assembly\">\n            <summary>\n            Gets the assembly in which the type is declared\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TypeWrapper.Namespace\">\n            <summary>\n            Gets the namespace of the Type\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TypeWrapper.IsAbstract\">\n            <summary>\n            Gets a value indicating whether the type is abstract.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TypeWrapper.IsGenericType\">\n            <summary>\n            Gets a value indicating whether the Type is a generic Type\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TypeWrapper.ContainsGenericParameters\">\n            <summary>\n            Gets a value indicating whether the Type has generic parameters that have not been replaced by specific Types.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TypeWrapper.IsGenericTypeDefinition\">\n            <summary>\n            Gets a value indicating whether the Type is a generic Type definition\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TypeWrapper.IsSealed\">\n            <summary>\n            Gets a value indicating whether the type is sealed.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TypeWrapper.IsStaticClass\">\n            <summary>\n            Gets a value indicating whether this type represents a static class.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.DictionaryContainsValueConstraint\">\n            <summary>\n            DictionaryContainsValueConstraint is used to test whether a dictionary\n            contains an expected object as a value.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.DictionaryContainsValueConstraint.#ctor(System.Object)\">\n            <summary>\n            Construct a DictionaryContainsValueConstraint\n            </summary>\n            <param name=\"expected\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.DictionaryContainsValueConstraint.Matches(System.Collections.IEnumerable)\">\n            <summary>\n            Test whether the expected value is contained in the dictionary\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.DictionaryContainsValueConstraint.DisplayName\">\n            <summary> \n            The display name of this Constraint for use by ToString().\n            The default value is the name of the constraint with\n            trailing \"Constraint\" removed. Derived classes may set\n            this to another name in their constructors.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.DictionaryContainsValueConstraint.Description\">\n            <summary>\n            The Description of what this constraint tests, for\n            use in messages and in the ConstraintResult.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.TestFixtureSourceAttribute\">\n            <summary>\n            TestCaseSourceAttribute indicates the source to be used to\n            provide test fixture instances for a test class.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.TestFixtureSourceAttribute.MUST_BE_STATIC\">\n            <summary>\n            Error message string is public so the tests can use it\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestFixtureSourceAttribute.#ctor(System.String)\">\n            <summary>\n            Construct with the name of the method, property or field that will provide data\n            </summary>\n            <param name=\"sourceName\">The name of a static method, property or field that will provide data.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.TestFixtureSourceAttribute.#ctor(System.Type,System.String)\">\n            <summary>\n            Construct with a Type and name\n            </summary>\n            <param name=\"sourceType\">The Type that will provide data</param>\n            <param name=\"sourceName\">The name of a static method, property or field that will provide data.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.TestFixtureSourceAttribute.#ctor(System.Type)\">\n            <summary>\n            Construct with a Type\n            </summary>\n            <param name=\"sourceType\">The type that will provide data</param>\n        </member>\n        <member name=\"M:NUnit.Framework.TestFixtureSourceAttribute.BuildFrom(NUnit.Framework.Interfaces.ITypeInfo)\">\n            <summary>\n            Construct one or more TestFixtures from a given Type,\n            using available parameter data.\n            </summary>\n            <param name=\"typeInfo\">The TypeInfo for which fixures are to be constructed.</param>\n            <returns>One or more TestFixtures as TestSuite</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.TestFixtureSourceAttribute.GetParametersFor(System.Type)\">\n            <summary>\n            Returns a set of ITestFixtureData items for use as arguments\n            to a parameterized test fixture.\n            </summary>\n            <param name=\"sourceType\">The type for which data is needed.</param>\n            <returns></returns>\n        </member>\n        <member name=\"P:NUnit.Framework.TestFixtureSourceAttribute.SourceName\">\n            <summary>\n            The name of a the method, property or fiend to be used as a source\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestFixtureSourceAttribute.SourceType\">\n            <summary>\n            A Type to be used as a source\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestFixtureSourceAttribute.Category\">\n            <summary>\n            Gets or sets the category associated with every fixture created from \n            this attribute. May be a single category or a comma-separated list.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.OneTimeSetUpAttribute\">\n            <summary>\n            Attribute used to identify a method that is called once\n            to perform setup before any child tests are run.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.AuthorAttribute\">\n            <summary>\n            Provides the Author of a test or test fixture. \n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.AuthorAttribute.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.AuthorAttribute\"/> class.\n            </summary>\n            <param name=\"name\">The name of the author.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.AuthorAttribute.#ctor(System.String,System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.AuthorAttribute\"/> class.\n            </summary>\n            <param name=\"name\">The name of the author.</param>\n            <param name=\"email\">The email address of the author.</param>\n        </member>\n        <member name=\"T:NUnit.Framework.ActionTargets\">\n            <summary>\n            The different targets a test action attribute can be applied to\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.ActionTargets.Default\">\n            <summary>\n            Default target, which is determined by where the action attribute is attached\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.ActionTargets.Test\">\n            <summary>\n            Target a individual test case\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.ActionTargets.Suite\">\n            <summary>\n            Target a suite of test cases\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.TestListener\">\n            <summary>\n            TestListener provides an implementation of ITestListener that\n            does nothing. It is used only through its NULL property.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestListener.TestStarted(NUnit.Framework.Interfaces.ITest)\">\n            <summary>\n            Called when a test has just started\n            </summary>\n            <param name=\"test\">The test that is starting</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestListener.TestFinished(NUnit.Framework.Interfaces.ITestResult)\">\n            <summary>\n            Called when a test case has finished\n            </summary>\n            <param name=\"result\">The result of the test</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestListener.TestOutput(NUnit.Framework.Interfaces.TestOutput)\">\n            <summary>\n            Called when a test produces output for immediate display\n            </summary>\n            <param name=\"output\">A TestOutput object containing the text to display</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestListener.#ctor\">\n            <summary>\n            Construct a new TestListener - private so it may not be used.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestListener.NULL\">\n            <summary>\n            Get a listener that does nothing\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.PlatformHelper\">\n            <summary>\n            PlatformHelper class is used by the PlatformAttribute class to \n            determine whether a platform is supported.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.PlatformHelper.OSPlatforms\">\n            <summary>\n            Comma-delimited list of all supported OS platform constants\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.PlatformHelper.RuntimePlatforms\">\n            <summary>\n            Comma-delimited list of all supported Runtime platform constants\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.PlatformHelper.#ctor\">\n            <summary>\n            Default constructor uses the operating system and\n            common language runtime of the system.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.PlatformHelper.#ctor(NUnit.Framework.Internal.OSPlatform,NUnit.Framework.Internal.RuntimeFramework)\">\n            <summary>\n            Construct a PlatformHelper for a particular operating\n            system and common language runtime. Used in testing.\n            </summary>\n            <param name=\"os\">OperatingSystem to be used</param>\n            <param name=\"rt\">RuntimeFramework to be used</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.PlatformHelper.IsPlatformSupported(System.String[])\">\n            <summary>\n            Test to determine if one of a collection of platforms\n            is being used currently.\n            </summary>\n            <param name=\"platforms\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.PlatformHelper.IsPlatformSupported(NUnit.Framework.PlatformAttribute)\">\n            <summary>\n            Tests to determine if the current platform is supported\n            based on a platform attribute.\n            </summary>\n            <param name=\"platformAttribute\">The attribute to examine</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.PlatformHelper.IsPlatformSupported(NUnit.Framework.TestCaseAttribute)\">\n            <summary>\n            Tests to determine if the current platform is supported\n            based on a platform attribute.\n            </summary>\n            <param name=\"testCaseAttribute\">The attribute to examine</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.PlatformHelper.IsPlatformSupported(System.String)\">\n            <summary>\n            Test to determine if the a particular platform or comma-\n            delimited set of platforms is in use.\n            </summary>\n            <param name=\"platform\">Name of the platform or comma-separated list of platform ids</param>\n            <returns>True if the platform is in use on the system</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.PlatformHelper.Reason\">\n            <summary>\n            Return the last failure reason. Results are not\n            defined if called before IsSupported( Attribute )\n            is called.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Api.DefaultTestAssemblyBuilder\">\n            <summary>\n            DefaultTestAssemblyBuilder loads a single assembly and builds a TestSuite\n            containing test fixtures present in the assembly.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Api.DefaultTestAssemblyBuilder._defaultSuiteBuilder\">\n            <summary>\n            The default suite builder used by the test assembly builder.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.DefaultTestAssemblyBuilder.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Api.DefaultTestAssemblyBuilder\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.DefaultTestAssemblyBuilder.Build(System.Reflection.Assembly,System.Collections.Generic.IDictionary{System.String,System.Object})\">\n            <summary>\n            Build a suite of tests from a provided assembly\n            </summary>\n            <param name=\"assembly\">The assembly from which tests are to be built</param>\n            <param name=\"options\">A dictionary of options to use in building the suite</param>\n            <returns>\n            A TestSuite containing the tests found in the assembly\n            </returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.DefaultTestAssemblyBuilder.Build(System.String,System.Collections.Generic.IDictionary{System.String,System.Object})\">\n            <summary>\n            Build a suite of tests given the filename of an assembly\n            </summary>\n            <param name=\"assemblyName\">The filename of the assembly from which tests are to be built</param>\n            <param name=\"options\">A dictionary of options to use in building the suite</param>\n            <returns>\n            A TestSuite containing the tests found in the assembly\n            </returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Has\">\n            <summary>\n            Helper class with properties and methods that supply\n            a number of constraints used in Asserts.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Has.Exactly(System.Int32)\">\n            <summary>\n            Returns a ConstraintExpression, which will apply\n            the following constraint to all members of a collection,\n            succeeding only if a specified number of them succeed.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Has.Property(System.String)\">\n            <summary>\n            Returns a new PropertyConstraintExpression, which will either\n            test for the existence of the named property on the object\n            being tested or apply any following constraint to that property.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Has.Attribute(System.Type)\">\n            <summary>\n            Returns a new AttributeConstraint checking for the\n            presence of a particular attribute on an object.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Has.Attribute``1\">\n            <summary>\n            Returns a new AttributeConstraint checking for the\n            presence of a particular attribute on an object.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Has.Member(System.Object)\">\n            <summary>\n            Returns a new CollectionContainsConstraint checking for the\n            presence of a particular object in the collection.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Has.No\">\n            <summary>\n            Returns a ConstraintExpression that negates any\n            following constraint.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Has.All\">\n            <summary>\n            Returns a ConstraintExpression, which will apply\n            the following constraint to all members of a collection,\n            succeeding if all of them succeed.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Has.Some\">\n            <summary>\n            Returns a ConstraintExpression, which will apply\n            the following constraint to all members of a collection,\n            succeeding if at least one of them succeeds.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Has.None\">\n            <summary>\n            Returns a ConstraintExpression, which will apply\n            the following constraint to all members of a collection,\n            succeeding if all of them fail.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Has.Length\">\n            <summary>\n            Returns a new ConstraintExpression, which will apply the following\n            constraint to the Length property of the object being tested.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Has.Count\">\n            <summary>\n            Returns a new ConstraintExpression, which will apply the following\n            constraint to the Count property of the object being tested.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Has.Message\">\n            <summary>\n            Returns a new ConstraintExpression, which will apply the following\n            constraint to the Message property of the object being tested.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Has.InnerException\">\n            <summary>\n            Returns a new ConstraintExpression, which will apply the following\n            constraint to the InnerException property of the object being tested.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.EmptyConstraint\">\n            <summary>\n            EmptyConstraint tests a whether a string or collection is empty,\n            postponing the decision about which test is applied until the\n            type of the actual argument is known.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.EmptyConstraint.ApplyTo(System.Object)\">\n            <summary>\n            Test whether the constraint is satisfied by a given value\n            </summary>\n            <param name=\"actual\">The value to be tested</param>\n            <returns>True for success, false for failure</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.EmptyConstraint.Description\">\n            <summary>\n            The Description of what this constraint tests, for\n            use in messages and in the ConstraintResult.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.ComparisonAdapter\">\n            <summary>\n            ComparisonAdapter class centralizes all comparisons of\n            _values in NUnit, adapting to the use of any provided\n            <see cref=\"T:System.Collections.IComparer\"/>, <see cref=\"T:System.Collections.Generic.IComparer`1\"/>\n            or <see cref=\"T:System.Comparison`1\"/>.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ComparisonAdapter.For(System.Collections.IComparer)\">\n            <summary>\n            Returns a ComparisonAdapter that wraps an <see cref=\"T:System.Collections.IComparer\"/>\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ComparisonAdapter.For``1(System.Collections.Generic.IComparer{``0})\">\n            <summary>\n            Returns a ComparisonAdapter that wraps an <see cref=\"T:System.Collections.Generic.IComparer`1\"/>\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ComparisonAdapter.For``1(System.Comparison{``0})\">\n            <summary>\n            Returns a ComparisonAdapter that wraps a <see cref=\"T:System.Comparison`1\"/>\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ComparisonAdapter.Compare(System.Object,System.Object)\">\n            <summary>\n            Compares two objects\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ComparisonAdapter.Default\">\n            <summary>\n            Gets the default ComparisonAdapter, which wraps an\n            NUnitComparer object.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ComparisonAdapter.ComparerAdapter.#ctor(System.Collections.IComparer)\">\n            <summary>\n            Construct a ComparisonAdapter for an <see cref=\"T:System.Collections.IComparer\"/>\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ComparisonAdapter.ComparerAdapter.Compare(System.Object,System.Object)\">\n            <summary>\n            Compares two objects\n            </summary>\n            <param name=\"expected\"></param>\n            <param name=\"actual\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ComparisonAdapter.DefaultComparisonAdapter.#ctor\">\n            <summary>\n            Construct a default ComparisonAdapter\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.ComparisonAdapter.ComparerAdapter`1\">\n            <summary>\n            ComparerAdapter extends <see cref=\"T:NUnit.Framework.Constraints.ComparisonAdapter\"/> and\n            allows use of an <see cref=\"T:System.Collections.Generic.IComparer`1\"/> or <see cref=\"T:System.Comparison`1\"/>\n            to actually perform the comparison.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ComparisonAdapter.ComparerAdapter`1.#ctor(System.Collections.Generic.IComparer{`0})\">\n            <summary>\n            Construct a ComparisonAdapter for an <see cref=\"T:System.Collections.Generic.IComparer`1\"/>\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ComparisonAdapter.ComparerAdapter`1.Compare(System.Object,System.Object)\">\n            <summary>\n            Compare a Type T to an object\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ComparisonAdapter.ComparisonAdapterForComparison`1.#ctor(System.Comparison{`0})\">\n            <summary>\n            Construct a ComparisonAdapter for a <see cref=\"T:System.Comparison`1\"/>\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ComparisonAdapter.ComparisonAdapterForComparison`1.Compare(System.Object,System.Object)\">\n            <summary>\n            Compare a Type T to an object\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.AssignableFromConstraint\">\n            <summary>\n            AssignableFromConstraint is used to test that an object\n            can be assigned from a given Type.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.AssignableFromConstraint.#ctor(System.Type)\">\n            <summary>\n            Construct an AssignableFromConstraint for the type provided\n            </summary>\n            <param name=\"type\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.AssignableFromConstraint.Matches(System.Object)\">\n            <summary>\n            Apply the constraint to an actual value, returning true if it succeeds\n            </summary>\n            <param name=\"actual\">The actual argument</param>\n            <returns>True if the constraint succeeds, otherwise false.</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.SequentialAttribute\">\n            <summary>\n            Marks a test to use a Sequential join of any argument \n            data provided. Arguments will be combined into test cases,\n            taking the next value of each argument until all are used.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.SequentialAttribute.#ctor\">\n            <summary>\n            Default constructor\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.RangeAttribute\">\n            <summary>\n            RangeAttribute is used to supply a range of _values to an\n            individual parameter of a parameterized test.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.RangeAttribute.#ctor(System.Int32,System.Int32)\">\n            <summary>\n            Construct a range of ints using default step of 1\n            </summary>\n            <param name=\"from\"></param>\n            <param name=\"to\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.RangeAttribute.#ctor(System.Int32,System.Int32,System.Int32)\">\n            <summary>\n            Construct a range of ints specifying the step size \n            </summary>\n            <param name=\"from\"></param>\n            <param name=\"to\"></param>\n            <param name=\"step\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.RangeAttribute.#ctor(System.UInt32,System.UInt32)\">\n            <summary>\n            Construct a range of unsigned ints using default step of 1\n            </summary>\n            <param name=\"from\"></param>\n            <param name=\"to\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.RangeAttribute.#ctor(System.UInt32,System.UInt32,System.UInt32)\">\n            <summary>\n            Construct a range of unsigned ints specifying the step size \n            </summary>\n            <param name=\"from\"></param>\n            <param name=\"to\"></param>\n            <param name=\"step\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.RangeAttribute.#ctor(System.Int64,System.Int64)\">\n            <summary>\n            Construct a range of longs using a default step of 1\n            </summary>\n            <param name=\"from\"></param>\n            <param name=\"to\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.RangeAttribute.#ctor(System.Int64,System.Int64,System.Int64)\">\n            <summary>\n            Construct a range of longs\n            </summary>\n            <param name=\"from\"></param>\n            <param name=\"to\"></param>\n            <param name=\"step\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.RangeAttribute.#ctor(System.UInt64,System.UInt64)\">\n            <summary>\n            Construct a range of unsigned longs using default step of 1\n            </summary>\n            <param name=\"from\"></param>\n            <param name=\"to\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.RangeAttribute.#ctor(System.UInt64,System.UInt64,System.UInt64)\">\n            <summary>\n            Construct a range of unsigned longs specifying the step size \n            </summary>\n            <param name=\"from\"></param>\n            <param name=\"to\"></param>\n            <param name=\"step\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.RangeAttribute.#ctor(System.Double,System.Double,System.Double)\">\n            <summary>\n            Construct a range of doubles\n            </summary>\n            <param name=\"from\"></param>\n            <param name=\"to\"></param>\n            <param name=\"step\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.RangeAttribute.#ctor(System.Single,System.Single,System.Single)\">\n            <summary>\n            Construct a range of floats\n            </summary>\n            <param name=\"from\"></param>\n            <param name=\"to\"></param>\n            <param name=\"step\"></param>\n        </member>\n        <member name=\"T:NUnit.Framework.DatapointSourceAttribute\">\n            <summary>\n            Used to mark a field, property or method providing a set of datapoints to \n            be used in executing any theories within the same fixture that require an \n            argument of the Type provided. The data source may provide an array of\n            the required Type or an <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/>.\n            Synonymous with DatapointsAttribute.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.StackFilter\">\n            <summary>\n            StackFilter class is used to remove internal NUnit\n            entries from a stack trace so that the resulting\n            trace provides better information about the test.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.StackFilter.Filter(System.String)\">\n            <summary>\n            Filters a raw stack trace and returns the result.\n            </summary>\n            <param name=\"rawTrace\">The original stack trace</param>\n            <returns>A filtered stack trace</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Execution.CommandBuilder\">\n            <summary>\n            A utility class to create TestCommands\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Execution.CommandBuilder.MakeOneTimeSetUpCommand(NUnit.Framework.Internal.TestSuite,System.Collections.Generic.List{NUnit.Framework.Internal.Commands.SetUpTearDownItem},System.Collections.Generic.List{NUnit.Framework.Internal.Commands.TestActionItem})\">\n            <summary>\n            Gets the command to be executed before any of\n            the child tests are run.\n            </summary>\n            <returns>A TestCommand</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Execution.CommandBuilder.MakeOneTimeTearDownCommand(NUnit.Framework.Internal.TestSuite,System.Collections.Generic.List{NUnit.Framework.Internal.Commands.SetUpTearDownItem},System.Collections.Generic.List{NUnit.Framework.Internal.Commands.TestActionItem})\">\n            <summary>\n            Gets the command to be executed after all of the\n            child tests are run.\n            </summary>\n            <returns>A TestCommand</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Execution.CommandBuilder.MakeTestCommand(NUnit.Framework.Internal.TestMethod)\">\n            <summary>\n            Creates a test command for use in running this test.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Execution.CommandBuilder.MakeSkipCommand(NUnit.Framework.Internal.Test)\">\n            <summary>\n            Creates a command for skipping a test. The result returned will\n            depend on the test RunState.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Execution.CommandBuilder.BuildSetUpTearDownList(System.Type,System.Type,System.Type)\">\n            <summary>\n            Builds the set up tear down list.\n            </summary>\n            <param name=\"fixtureType\">Type of the fixture.</param>\n            <param name=\"setUpType\">Type of the set up attribute.</param>\n            <param name=\"tearDownType\">Type of the tear down attribute.</param>\n            <returns>A list of SetUpTearDownItems</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.ParameterWrapper\">\n            <summary>\n            The ParameterWrapper class wraps a ParameterInfo so that it may\n            be used in a platform-independent manner.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Interfaces.IParameterInfo\">\n            <summary>\n            The IParameterInfo interface is an abstraction of a .NET parameter.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.IParameterInfo.IsOptional\">\n            <summary>\n            Gets a value indicating whether the parameter is optional\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.IParameterInfo.Method\">\n            <summary>\n            Gets an IMethodInfo representing the method for which this is a parameter\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.IParameterInfo.ParameterInfo\">\n            <summary>\n            Gets the underlying .NET ParameterInfo\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.IParameterInfo.ParameterType\">\n            <summary>\n            Gets the Type of the parameter\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.ParameterWrapper.#ctor(NUnit.Framework.Interfaces.IMethodInfo,System.Reflection.ParameterInfo)\">\n            <summary>\n            Construct a ParameterWrapper for a given method and parameter\n            </summary>\n            <param name=\"method\"></param>\n            <param name=\"parameterInfo\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.ParameterWrapper.GetCustomAttributes``1(System.Boolean)\">\n            <summary>\n            Returns an array of custom attributes of the specified type applied to this method\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.ParameterWrapper.IsDefined``1(System.Boolean)\">\n            <summary>\n            Gets a value indicating whether one or more attributes of the specified type are defined on the parameter.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.ParameterWrapper.IsOptional\">\n            <summary>\n            Gets a value indicating whether the parameter is optional\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.ParameterWrapper.Method\">\n            <summary>\n            Gets an IMethodInfo representing the method for which this is a parameter.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.ParameterWrapper.ParameterInfo\">\n            <summary>\n            Gets the underlying ParameterInfo\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.ParameterWrapper.ParameterType\">\n            <summary>\n            Gets the Type of the parameter\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.InternalTraceWriter\">\n            <summary>\n            A trace listener that writes to a separate file per domain\n            and process using it.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.InternalTraceWriter.#ctor(System.String)\">\n            <summary>\n            Construct an InternalTraceWriter that writes to a file.\n            </summary>\n            <param name=\"logPath\">Path to the file to use</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.InternalTraceWriter.#ctor(System.IO.TextWriter)\">\n            <summary>\n            Construct an InternalTraceWriter that writes to a \n            TextWriter provided by the caller.\n            </summary>\n            <param name=\"writer\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.InternalTraceWriter.Write(System.Char)\">\n            <summary>\n            Writes a character to the text string or stream.\n            </summary>\n            <param name=\"value\">The character to write to the text stream.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.InternalTraceWriter.Write(System.String)\">\n            <summary>\n            Writes a string to the text string or stream.\n            </summary>\n            <param name=\"value\">The string to write.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.InternalTraceWriter.WriteLine(System.String)\">\n            <summary>\n            Writes a string followed by a line terminator to the text string or stream.\n            </summary>\n            <param name=\"value\">The string to write. If <paramref name=\"value\" /> is null, only the line terminator is written.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.InternalTraceWriter.Dispose(System.Boolean)\">\n            <summary>\n            Releases the unmanaged resources used by the <see cref=\"T:System.IO.TextWriter\" /> and optionally releases the managed resources.\n            </summary>\n            <param name=\"disposing\">true to release both managed and unmanaged resources; false to release only unmanaged resources.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.InternalTraceWriter.Flush\">\n            <summary>\n            Clears all buffers for the current writer and causes any buffered data to be written to the underlying device.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.InternalTraceWriter.Encoding\">\n            <summary>\n            Returns the character encoding in which the output is written.\n            </summary>\n            <returns>The character encoding in which the output is written.</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Filters.MethodNameFilter\">\n            <summary>\n            FullName filter selects tests based on their FullName\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Filters.MethodNameFilter.#ctor(System.String)\">\n            <summary>\n            Construct a MethodNameFilter for a single name\n            </summary>\n            <param name=\"expectedValue\">The name the filter will recognize.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Filters.MethodNameFilter.Match(NUnit.Framework.Interfaces.ITest)\">\n            <summary>\n            Match a test against a single value.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Filters.MethodNameFilter.ElementName\">\n            <summary>\n            Gets the element name\n            </summary>\n            <value>Element name</value>\n        </member>\n        <member name=\"T:System.Lazy`1\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"T\"></typeparam>\n        </member>\n        <member name=\"M:System.Lazy`1.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:System.Lazy`1.#ctor(System.Func{`0})\">\n            <summary>\n            \n            </summary>\n            <param name=\"valueFactory\"></param>\n        </member>\n        <member name=\"M:System.Lazy`1.#ctor(System.Boolean)\">\n            <summary>\n            \n            </summary>\n            <param name=\"isThreadSafe\"></param>\n        </member>\n        <member name=\"M:System.Lazy`1.#ctor(System.Func{`0},System.Boolean)\">\n            <summary>\n            \n            </summary>\n            <param name=\"valueFactory\"></param>\n            <param name=\"isThreadSafe\"></param>\n        </member>\n        <member name=\"M:System.Lazy`1.#ctor(System.Threading.LazyThreadSafetyMode)\">\n            <summary>\n            \n            </summary>\n            <param name=\"mode\"></param>\n        </member>\n        <member name=\"M:System.Lazy`1.#ctor(System.Func{`0},System.Threading.LazyThreadSafetyMode)\">\n            <summary>\n            \n            </summary>\n            <param name=\"valueFactory\"></param>\n            <param name=\"mode\"></param>\n        </member>\n        <member name=\"M:System.Lazy`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"P:System.Lazy`1.Value\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:System.Lazy`1.IsValueCreated\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"T:NUnit.Compatibility.AttributeHelper\">\n            <summary>\n            Provides a platform-independent methods for getting attributes\n            for use by AttributeConstraint and AttributeExistsConstraint.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Compatibility.AttributeHelper.GetCustomAttributes(System.Object,System.Type,System.Boolean)\">\n            <summary>\n            Gets the custom attributes from the given object.\n            </summary>\n            <remarks>Portable libraries do not have an ICustomAttributeProvider, so we need to cast to each of\n            it's direct subtypes and try to get attributes off those instead.</remarks>\n            <param name=\"actual\">The actual.</param>\n            <param name=\"attributeType\">Type of the attribute.</param>\n            <param name=\"inherit\">if set to <c>true</c> [inherit].</param>\n            <returns>A list of the given attribute on the given object.</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.SpecialValue\">\n            <summary>\n            The SpecialValue enum is used to represent TestCase arguments\n            that cannot be used as arguments to an Attribute.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.SpecialValue.Null\">\n            <summary>\n            Null represents a null value, which cannot be used as an \n            argument to an attriute under .NET 1.x\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.TypeHelper\">\n            <summary>\n            TypeHelper provides static methods that operate on Types.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.TypeHelper.NonmatchingType\">\n            <summary>\n            A special value, which is used to indicate that BestCommonType() method\n            was unable to find a common type for the specified arguments.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TypeHelper.GetDisplayName(System.Type)\">\n            <summary>\n            Gets the display name for a Type as used by NUnit.\n            </summary>\n            <param name=\"type\">The Type for which a display name is needed.</param>\n            <returns>The display name for the Type</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TypeHelper.GetDisplayName(System.Type,System.Object[])\">\n            <summary>\n            Gets the display name for a Type as used by NUnit.\n            </summary>\n            <param name=\"type\">The Type for which a display name is needed.</param>\n            <param name=\"arglist\">The arglist provided.</param>\n            <returns>The display name for the Type</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TypeHelper.BestCommonType(System.Type,System.Type)\">\n            <summary>\n            Returns the best fit for a common type to be used in\n            matching actual arguments to a methods Type parameters.\n            </summary>\n            <param name=\"type1\">The first type.</param>\n            <param name=\"type2\">The second type.</param>\n            <returns>Either type1 or type2, depending on which is more general.</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TypeHelper.IsNumeric(System.Type)\">\n            <summary>\n            Determines whether the specified type is numeric.\n            </summary>\n            <param name=\"type\">The type to be examined.</param>\n            <returns>\n            \t<c>true</c> if the specified type is numeric; otherwise, <c>false</c>.\n            </returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TypeHelper.ConvertArgumentList(System.Object[],NUnit.Framework.Interfaces.IParameterInfo[])\">\n            <summary>\n            Convert an argument list to the required parameter types.\n            Currently, only widening numeric conversions are performed.\n            </summary>\n            <param name=\"arglist\">An array of args to be converted</param>\n            <param name=\"parameters\">A ParameterInfo[] whose types will be used as targets</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TypeHelper.CanDeduceTypeArgsFromArgs(System.Type,System.Object[],System.Type[]@)\">\n            <summary>\n            Determines whether this instance can deduce type args for a generic type from the supplied arguments.\n            </summary>\n            <param name=\"type\">The type to be examined.</param>\n            <param name=\"arglist\">The arglist.</param>\n            <param name=\"typeArgsOut\">The type args to be used.</param>\n            <returns>\n            \t<c>true</c> if this the provided args give sufficient information to determine the type args to be used; otherwise, <c>false</c>.\n            </returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TypeHelper.GetEnumValues(System.Type)\">\n            <summary>\n            Gets the _values for an enumeration, using Enum.GetTypes\n            where available, otherwise through reflection.\n            </summary>\n            <param name=\"enumType\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TypeHelper.GetEnumNames(System.Type)\">\n            <summary>\n            Gets the ids of the _values for an enumeration, \n            using Enum.GetNames where available, otherwise\n            through reflection.\n            </summary>\n            <param name=\"enumType\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.ThreadUtility\">\n            <summary>\n            ThreadUtility provides a set of static methods convenient\n            for working with threads.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.ThreadUtility.Kill(System.Threading.Thread)\">\n            <summary>\n            Do our best to Kill a thread\n            </summary>\n            <param name=\"thread\">The thread to kill</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.ThreadUtility.Kill(System.Threading.Thread,System.Object)\">\n            <summary>\n            Do our best to kill a thread, passing state info\n            </summary>\n            <param name=\"thread\">The thread to kill</param>\n            <param name=\"stateInfo\">Info for the ThreadAbortException handler</param>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.TestFixture\">\n            <summary>\n            TestFixture is a surrogate for a user test fixture class,\n            containing one or more tests.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Interfaces.IDisposableFixture\">\n            <summary>\n            Any ITest that implements this interface is at a level that the implementing\n            class should be disposed at the end of the test run\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestFixture.#ctor(NUnit.Framework.Interfaces.ITypeInfo)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Internal.TestFixture\"/> class.\n            </summary>\n            <param name=\"fixtureType\">Type of the fixture.</param>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.PredicateConstraint`1\">\n            <summary>\n            Predicate constraint wraps a Predicate in a constraint,\n            returning success if the predicate is true.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.PredicateConstraint`1.#ctor(System.Predicate{`0})\">\n            <summary>\n            Construct a PredicateConstraint from a predicate\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.PredicateConstraint`1.ApplyTo(System.Object)\">\n            <summary>\n            Determines whether the predicate succeeds when applied\n            to the actual value.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.PredicateConstraint`1.Description\">\n            <summary>\n            Gets text describing a constraint\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.NotConstraint\">\n            <summary>\n            NotConstraint negates the effect of some other constraint\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.NotConstraint.#ctor(NUnit.Framework.Constraints.IConstraint)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Constraints.NotConstraint\"/> class.\n            </summary>\n            <param name=\"baseConstraint\">The base constraint to be negated.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.NotConstraint.ApplyTo(System.Object)\">\n            <summary>\n            Test whether the constraint is satisfied by a given value\n            </summary>\n            <param name=\"actual\">The value to be tested</param>\n            <returns>True for if the base constraint fails, false if it succeeds</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.ValueFormatter\">\n            <summary>\n            Custom value formatter function\n            </summary>\n            <param name=\"val\">The value</param>\n            <returns></returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.ValueFormatterFactory\">\n            <summary>\n            Custom value formatter factory function\n            </summary>\n            <param name=\"next\">The next formatter function</param>\n            <returns>ValueFormatter</returns>\n            <remarks>If the given formatter is unable to handle a certain format, it must call the next formatter in the chain</remarks>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.MsgUtils\">\n            <summary>\n            Static methods used in creating messages\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.MsgUtils.ELLIPSIS\">\n            <summary>\n            Static string used when strings are clipped\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.MsgUtils.Fmt_Null\">\n            <summary>\n            Formatting strings used for expected and actual _values\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.MsgUtils.AddFormatter(NUnit.Framework.Constraints.ValueFormatterFactory)\">\n            <summary>\n            Add a formatter to the chain of responsibility.\n            </summary>\n            <param name=\"formatterFactory\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.MsgUtils.FormatValue(System.Object)\">\n            <summary>\n            Formats text to represent a generalized value.\n            </summary>\n            <param name=\"val\">The value</param>\n            <returns>The formatted text</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.MsgUtils.FormatCollection(System.Collections.IEnumerable,System.Int64,System.Int32)\">\n            <summary>\n            Formats text for a collection value,\n            starting at a particular point, to a max length\n            </summary>\n            <param name=\"collection\">The collection containing elements to write.</param>\n            <param name=\"start\">The starting point of the elements to write</param>\n            <param name=\"max\">The maximum number of elements to write</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.MsgUtils.GetTypeRepresentation(System.Object)\">\n            <summary>\n            Returns the representation of a type as used in NUnitLite.\n            This is the same as Type.ToString() except for arrays,\n            which are displayed with their declared sizes.\n            </summary>\n            <param name=\"obj\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.MsgUtils.EscapeControlChars(System.String)\">\n            <summary>\n            Converts any control characters in a string \n            to their escaped representation.\n            </summary>\n            <param name=\"s\">The string to be converted</param>\n            <returns>The converted string</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.MsgUtils.EscapeNullCharacters(System.String)\">\n            <summary>\n            Converts any null characters in a string \n            to their escaped representation.\n            </summary>\n            <param name=\"s\">The string to be converted</param>\n            <returns>The converted string</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.MsgUtils.GetArrayIndicesAsString(System.Int32[])\">\n            <summary>\n            Return the a string representation for a set of indices into an array\n            </summary>\n            <param name=\"indices\">Array of indices for which a string is needed</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.MsgUtils.GetArrayIndicesFromCollectionIndex(System.Collections.IEnumerable,System.Int64)\">\n            <summary>\n            Get an array of indices representing the point in a collection or\n            array corresponding to a single int index into the collection.\n            </summary>\n            <param name=\"collection\">The collection to which the indices apply</param>\n            <param name=\"index\">Index in the collection</param>\n            <returns>Array of indices</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.MsgUtils.ClipString(System.String,System.Int32,System.Int32)\">\n            <summary>\n            Clip a string to a given length, starting at a particular offset, returning the clipped\n            string with ellipses representing the removed parts\n            </summary>\n            <param name=\"s\">The string to be clipped</param>\n            <param name=\"maxStringLength\">The maximum permitted length of the result string</param>\n            <param name=\"clipStart\">The point at which to start clipping</param>\n            <returns>The clipped string</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.MsgUtils.ClipExpectedAndActual(System.String@,System.String@,System.Int32,System.Int32)\">\n            <summary>\n            Clip the expected and actual strings in a coordinated fashion, \n            so that they may be displayed together.\n            </summary>\n            <param name=\"expected\"></param>\n            <param name=\"actual\"></param>\n            <param name=\"maxDisplayLength\"></param>\n            <param name=\"mismatch\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.MsgUtils.FindMismatchPosition(System.String,System.String,System.Int32,System.Boolean)\">\n            <summary>\n            Shows the position two strings start to differ.  Comparison \n            starts at the start index.\n            </summary>\n            <param name=\"expected\">The expected string</param>\n            <param name=\"actual\">The actual string</param>\n            <param name=\"istart\">The index in the strings at which comparison should start</param>\n            <param name=\"ignoreCase\">Boolean indicating whether case should be ignored</param>\n            <returns>-1 if no mismatch found, or the index where mismatch found</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.MsgUtils.DefaultValueFormatter\">\n            <summary>\n            Current head of chain of value formatters. Public for testing.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.TheoryAttribute\">\n            <summary>\n            Adding this attribute to a method within a <seealso cref=\"T:NUnit.Framework.TestFixtureAttribute\"/> \n            class makes the method callable from the NUnit test runner. There is a property \n            called Description which is optional which you can provide a more detailed test\n            description. This class cannot be inherited.\n            </summary>\n            \n            <example>\n            [TestFixture]\n            public class Fixture\n            {\n              [Test]\n              public void MethodToTest()\n              {}\n              \n              [Test(Description = \"more detailed description\")]\n              public void TestDescriptionMethod()\n              {}\n            }\n            </example>\n            \n        </member>\n        <member name=\"M:NUnit.Framework.TheoryAttribute.#ctor\">\n            <summary>\n            Construct the attribute, specifying a combining strategy and source of parameter data.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.TestExecutionStatus\">\n            <summary>\n            Enumeration indicating whether the tests are \n            running normally or being cancelled.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.TestExecutionStatus.Running\">\n            <summary>\n            Running normally with no stop requested\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.TestExecutionStatus.StopRequested\">\n            <summary>\n            A graceful stop has been requested\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.TestExecutionStatus.AbortRequested\">\n            <summary>\n            A forced stop has been requested\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.TestFixtureParameters\">\n            <summary>\n            The TestCaseParameters class encapsulates method arguments and\n            other selected parameters needed for constructing\n            a parameterized test case.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestFixtureParameters.#ctor\">\n            <summary>\n            Default Constructor creates an empty parameter set\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestFixtureParameters.#ctor(System.Exception)\">\n            <summary>\n            Construct a non-runnable ParameterSet, specifying\n            the provider exception that made it invalid.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestFixtureParameters.#ctor(System.Object[])\">\n            <summary>\n            Construct a parameter set with a list of arguments\n            </summary>\n            <param name=\"args\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestFixtureParameters.#ctor(NUnit.Framework.Interfaces.ITestFixtureData)\">\n            <summary>\n            Construct a ParameterSet from an object implementing ITestCaseData\n            </summary>\n            <param name=\"data\"></param>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestFixtureParameters.TypeArgs\">\n            <summary>\n            Type arguments used to create a generic fixture instance\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.StringUtil\">\n            <summary>\n            Provides methods to support legacy string comparison methods.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.StringUtil.Compare(System.String,System.String,System.Boolean)\">\n            <summary>\n            Compares two strings for equality, ignoring case if requested.\n            </summary>\n            <param name=\"strA\">The first string.</param>\n            <param name=\"strB\">The second string..</param>\n            <param name=\"ignoreCase\">if set to <c>true</c>, the case of the letters in the strings is ignored.</param>\n            <returns>Zero if the strings are equivalent, a negative number if strA is sorted first, a positive number if\n            strB is sorted first</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.StringUtil.StringsEqual(System.String,System.String,System.Boolean)\">\n            <summary>\n            Compares two strings for equality, ignoring case if requested.\n            </summary>\n            <param name=\"strA\">The first string.</param>\n            <param name=\"strB\">The second string..</param>\n            <param name=\"ignoreCase\">if set to <c>true</c>, the case of the letters in the strings is ignored.</param>\n            <returns>True if the strings are equivalent, false if not.</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Commands.OneTimeSetUpCommand\">\n            <summary>\n            OneTimeSetUpCommand runs any one-time setup methods for a suite,\n            constructing the user test object if necessary.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Commands.OneTimeSetUpCommand.#ctor(NUnit.Framework.Internal.TestSuite,System.Collections.Generic.List{NUnit.Framework.Internal.Commands.SetUpTearDownItem},System.Collections.Generic.List{NUnit.Framework.Internal.Commands.TestActionItem})\">\n            <summary>\n            Constructs a OneTimeSetUpCommand for a suite\n            </summary>\n            <param name=\"suite\">The suite to which the command applies</param>\n            <param name=\"setUpTearDown\">A SetUpTearDownList for use by the command</param>\n            <param name=\"actions\">A List of TestActionItems to be run after Setup</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Commands.OneTimeSetUpCommand.Execute(NUnit.Framework.Internal.ITestExecutionContext)\">\n            <summary>\n            Overridden to run the one-time setup for a suite.\n            </summary>\n            <param name=\"context\">The TestExecutionContext to be used.</param>\n            <returns>A TestResult</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Interfaces.TestOutput\">\n            <summary>\n            The TestOutput class holds a unit of output from \n            a test to a specific output stream\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.TestOutput.#ctor(System.String,System.String,System.String)\">\n            <summary>\n            Construct with text, ouput destination type and\n            the name of the test that produced the output.\n            </summary>\n            <param name=\"text\">Text to be output</param>\n            <param name=\"stream\">Name of the stream or channel to which the text should be written</param>\n            <param name=\"testName\">FullName of test that produced the output</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.TestOutput.ToString\">\n            <summary>\n            Return string representation of the object for debugging\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.TestOutput.ToXml\">\n            <summary>\n            Convert the TestOutput object to an XML string\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.TestOutput.Text\">\n            <summary>\n            Get the text \n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.TestOutput.Stream\">\n            <summary>\n            Get the output type\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.TestOutput.TestName\">\n            <summary>\n            Get the name of the test that created the output\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Interfaces.IMethodInfo\">\n            <summary>\n            The IMethodInfo class is used to encapsulate information\n            about a method in a platform-independent manner.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.IMethodInfo.GetParameters\">\n            <summary>\n            Gets the parameters of the method.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.IMethodInfo.GetGenericArguments\">\n            <summary>\n            Returns the Type arguments of a generic method or the Type parameters of a generic method definition.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.IMethodInfo.MakeGenericMethod(System.Type[])\">\n            <summary>\n            Replaces the type parameters of the method with the array of types provided and returns a new IMethodInfo.\n            </summary>\n            <param name=\"typeArguments\">The type arguments to be used</param>\n            <returns>A new IMethodInfo with the type arguments replaced</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.IMethodInfo.Invoke(System.Object,System.Object[])\">\n            <summary>\n            Invokes the method, converting any TargetInvocationException to an NUnitException.\n            </summary>\n            <param name=\"fixture\">The object on which to invoke the method</param>\n            <param name=\"args\">The argument list for the method</param>\n            <returns>The return value from the invoked method</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.IMethodInfo.TypeInfo\">\n            <summary>\n            Gets the Type from which this method was reflected.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.IMethodInfo.MethodInfo\">\n            <summary>\n            Gets the MethodInfo for this method.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.IMethodInfo.Name\">\n            <summary>\n            Gets the name of the method.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.IMethodInfo.IsAbstract\">\n            <summary>\n            Gets a value indicating whether the method is abstract.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.IMethodInfo.IsPublic\">\n            <summary>\n            Gets a value indicating whether the method is public.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.IMethodInfo.ContainsGenericParameters\">\n            <summary>\n            Gets a value indicating whether the method contains unassigned generic type parameters.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.IMethodInfo.IsGenericMethod\">\n            <summary>\n            Gets a value indicating whether the method is a generic method.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.IMethodInfo.IsGenericMethodDefinition\">\n            <summary>\n            Gets a value indicating whether the MethodInfo represents the definition of a generic method.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.IMethodInfo.ReturnType\">\n            <summary>\n            Gets the return Type of the method.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.ThrowsExceptionConstraint\">\n            <summary>\n            ThrowsExceptionConstraint tests that an exception has\n            been thrown, without any further tests.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ThrowsExceptionConstraint.ApplyTo(System.Object)\">\n            <summary>\n            Executes the code and returns success if an exception is thrown.\n            </summary>\n            <param name=\"actual\">A delegate representing the code to be tested</param>\n            <returns>True if an exception is thrown, otherwise false</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ThrowsExceptionConstraint.GetTestObject``1(NUnit.Framework.Constraints.ActualValueDelegate{``0})\">\n            <summary>\n            Returns the ActualValueDelegate itself as the value to be tested.\n            </summary>\n            <param name=\"del\">A delegate representing the code to be tested</param>\n            <returns>The delegate itself</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ThrowsExceptionConstraint.Description\">\n            <summary>\n            The Description of what this constraint tests, for\n            use in messages and in the ConstraintResult.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.LevelOfParallelismAttribute\">\n            <summary>\n            LevelOfParallelismAttribute is used to set the number of worker threads\n            that may be allocated by the framework for running tests.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.LevelOfParallelismAttribute.#ctor(System.Int32)\">\n            <summary>\n            Construct a LevelOfParallelismAttribute.\n            </summary>\n            <param name=\"level\">The number of worker threads to be created by the framework.</param>\n        </member>\n        <member name=\"T:NUnit.Framework.RetryAttribute\">\n            <summary>\n            RepeatAttribute may be applied to test case in order\n            to run it multiple times.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.RetryAttribute.#ctor(System.Int32)\">\n            <summary>\n            Construct a RepeatAttribute\n            </summary>\n            <param name=\"count\">The number of times to run the test</param>\n        </member>\n        <member name=\"M:NUnit.Framework.RetryAttribute.Wrap(NUnit.Framework.Internal.Commands.TestCommand)\">\n            <summary>\n            Wrap a command and return the result.\n            </summary>\n            <param name=\"command\">The command to be wrapped</param>\n            <returns>The wrapped command</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.RetryAttribute.RetryCommand\">\n            <summary>\n            The test command for the RetryAttribute\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.RetryAttribute.RetryCommand.#ctor(NUnit.Framework.Internal.Commands.TestCommand,System.Int32)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.RetryAttribute.RetryCommand\"/> class.\n            </summary>\n            <param name=\"innerCommand\">The inner command.</param>\n            <param name=\"retryCount\">The number of repetitions</param>\n        </member>\n        <member name=\"M:NUnit.Framework.RetryAttribute.RetryCommand.Execute(NUnit.Framework.Internal.ITestExecutionContext)\">\n            <summary>\n            Runs the test, saving a TestResult in the supplied TestExecutionContext.\n            </summary>\n            <param name=\"context\">The context in which the test should run.</param>\n            <returns>A TestResult</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.TestCaseResult\">\n            <summary>\n            Represents the result of running a single test case.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestCaseResult.#ctor(NUnit.Framework.Internal.TestMethod)\">\n            <summary>\n            Construct a TestCaseResult based on a TestMethod\n            </summary>\n            <param name=\"test\">A TestMethod to which the result applies.</param>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestCaseResult.FailCount\">\n            <summary>\n            Gets the number of test cases that failed\n            when running the test and all its children.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestCaseResult.PassCount\">\n            <summary>\n            Gets the number of test cases that passed\n            when running the test and all its children.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestCaseResult.SkipCount\">\n            <summary>\n            Gets the number of test cases that were skipped\n            when running the test and all its children.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestCaseResult.InconclusiveCount\">\n            <summary>\n            Gets the number of test cases that were inconclusive\n            when running the test and all its children.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestCaseResult.HasChildren\">\n            <summary>\n            Indicates whether this result has any child results.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestCaseResult.Children\">\n            <summary>\n            Gets the collection of child results.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.TestParameters\">\n            <summary>\n            TestParameters class holds any named parameters supplied to the test run\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestParameters.Exists(System.String)\">\n            <summary>\n            Gets a flag indicating whether a parameter with the specified name exists.N\n            </summary>\n            <param name=\"name\">Name of the parameter</param>\n            <returns>True if it exists, otherwise false</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.TestParameters.Get(System.String)\">\n            <summary>\n            Get method is a simple alternative to the indexer\n            </summary>\n            <param name=\"name\">Name of the paramter</param>\n            <returns>Value of the parameter or null if not present</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.TestParameters.Get(System.String,System.String)\">\n            <summary>\n            Get the value of a parameter or a default string\n            </summary>\n            <param name=\"name\">Name of the parameter</param>\n            <param name=\"defaultValue\">Default value of the parameter</param>\n            <returns>Value of the parameter or default value if not present</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.TestParameters.Get``1(System.String,``0)\">\n            <summary>\n            Get the value of a parameter or return a default\n            </summary>\n            <typeparam name=\"T\">The return Type</typeparam>\n            <param name=\"name\">Name of the parameter</param>\n            <param name=\"defaultValue\">Default value of the parameter</param>\n            <returns>Value of the parameter or default value if not present</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.TestParameters.Add(System.String,System.String)\">\n            <summary>\n            Adds a parameter to the list\n            </summary>\n            <param name=\"name\">Name of the parameter</param>\n            <param name=\"value\">Value of the parameter</param>\n        </member>\n        <member name=\"P:NUnit.Framework.TestParameters.Count\">\n            <summary>\n            Gets the number of test parameters\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestParameters.Names\">\n            <summary>\n            Gets a collection of the test parameter names\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestParameters.Item(System.String)\">\n            <summary>\n            Indexer provides access to the internal dictionary\n            </summary>\n            <param name=\"name\">Name of the parameter</param>\n            <returns>Value of the parameter or null if not present</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Builders.ParameterDataSourceProvider\">\n            <summary>\n            ParameterDataSourceProvider supplies individual argument _values for\n            single parameters using attributes implementing IParameterDataSource.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Builders.ParameterDataSourceProvider.HasDataFor(NUnit.Framework.Interfaces.IParameterInfo)\">\n            <summary>\n            Determine whether any data is available for a parameter.\n            </summary>\n            <param name=\"parameter\">A ParameterInfo representing one\n            argument to a parameterized test</param>\n            <returns>\n            True if any data is available, otherwise false.\n            </returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Builders.ParameterDataSourceProvider.GetDataFor(NUnit.Framework.Interfaces.IParameterInfo)\">\n            <summary>\n            Return an IEnumerable providing data for use with the\n            supplied parameter.\n            </summary>\n            <param name=\"parameter\">An IParameterInfo representing one\n            argument to a parameterized test</param>\n            <returns>\n            An IEnumerable providing the required data\n            </returns>\n        </member>\n        <member name=\"T:NUnit.Framework.SuccessException\">\n            <summary>\n            Thrown when an assertion failed.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.SuccessException.#ctor(System.String)\">\n            <param name=\"message\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.SuccessException.#ctor(System.String,System.Exception)\">\n            <param name=\"message\">The error message that explains \n            the reason for the exception</param>\n            <param name=\"inner\">The exception that caused the \n            current exception</param>\n        </member>\n        <member name=\"M:NUnit.Framework.SuccessException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)\">\n            <summary>\n            Serialization Constructor\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.SuccessException.ResultState\">\n            <summary>\n            Gets the ResultState provided by this exception\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.OrConstraint\">\n            <summary>\n            OrConstraint succeeds if either member succeeds\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.OrConstraint.#ctor(NUnit.Framework.Constraints.IConstraint,NUnit.Framework.Constraints.IConstraint)\">\n            <summary>\n            Create an OrConstraint from two other constraints\n            </summary>\n            <param name=\"left\">The first constraint</param>\n            <param name=\"right\">The second constraint</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.OrConstraint.ApplyTo(System.Object)\">\n            <summary>\n            Apply the member constraints to an actual value, succeeding \n            succeeding as soon as one of them succeeds.\n            </summary>\n            <param name=\"actual\">The actual value</param>\n            <returns>True if either constraint succeeded</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.OrConstraint.Description\">\n            <summary>\n            Gets text describing a constraint\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.AttributeOperator\">\n            <summary>\n            Operator that tests for the presence of a particular attribute\n            on a type and optionally applies further tests to the attribute.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.AttributeOperator.#ctor(System.Type)\">\n            <summary>\n            Construct an AttributeOperator for a particular Type\n            </summary>\n            <param name=\"type\">The Type of attribute tested</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.AttributeOperator.Reduce(NUnit.Framework.Constraints.ConstraintBuilder.ConstraintStack)\">\n            <summary>\n            Reduce produces a constraint from the operator and \n            any arguments. It takes the arguments from the constraint \n            stack and pushes the resulting constraint on it.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.MessageWriter\">\n            <summary>\n            MessageWriter is the abstract base for classes that write\n            constraint descriptions and messages in some form. The\n            class has separate methods for writing various components\n            of a message, allowing implementations to tailor the\n            presentation as needed.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.MessageWriter.#ctor\">\n            <summary>\n            Construct a MessageWriter given a culture\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.MessageWriter.WriteMessageLine(System.String,System.Object[])\">\n            <summary>\n            Method to write single line  message with optional args, usually\n            written to precede the general failure message.\n            </summary>\n            <param name=\"message\">The message to be written</param>\n            <param name=\"args\">Any arguments used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.MessageWriter.WriteMessageLine(System.Int32,System.String,System.Object[])\">\n            <summary>\n            Method to write single line  message with optional args, usually\n            written to precede the general failure message, at a givel \n            indentation level.\n            </summary>\n            <param name=\"level\">The indentation level of the message</param>\n            <param name=\"message\">The message to be written</param>\n            <param name=\"args\">Any arguments used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.MessageWriter.DisplayDifferences(NUnit.Framework.Constraints.ConstraintResult)\">\n            <summary>\n            Display Expected and Actual lines for a constraint. This\n            is called by MessageWriter's default implementation of \n            WriteMessageTo and provides the generic two-line display. \n            </summary>\n            <param name=\"result\">The failing constraint result</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.MessageWriter.DisplayDifferences(System.Object,System.Object)\">\n            <summary>\n            Display Expected and Actual lines for given _values. This\n            method may be called by constraints that need more control over\n            the display of actual and expected _values than is provided\n            by the default implementation.\n            </summary>\n            <param name=\"expected\">The expected value</param>\n            <param name=\"actual\">The actual value causing the failure</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.MessageWriter.DisplayDifferences(System.Object,System.Object,NUnit.Framework.Constraints.Tolerance)\">\n            <summary>\n            Display Expected and Actual lines for given _values, including\n            a tolerance value on the Expected line.\n            </summary>\n            <param name=\"expected\">The expected value</param>\n            <param name=\"actual\">The actual value causing the failure</param>\n            <param name=\"tolerance\">The tolerance within which the test was made</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.MessageWriter.DisplayStringDifferences(System.String,System.String,System.Int32,System.Boolean,System.Boolean)\">\n            <summary>\n            Display the expected and actual string _values on separate lines.\n            If the mismatch parameter is >=0, an additional line is displayed\n            line containing a caret that points to the mismatch point.\n            </summary>\n            <param name=\"expected\">The expected string value</param>\n            <param name=\"actual\">The actual string value</param>\n            <param name=\"mismatch\">The point at which the strings don't match or -1</param>\n            <param name=\"ignoreCase\">If true, case is ignored in locating the point where the strings differ</param>\n            <param name=\"clipping\">If true, the strings should be clipped to fit the line</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.MessageWriter.WriteActualValue(System.Object)\">\n            <summary>\n            Writes the text for an actual value.\n            </summary>\n            <param name=\"actual\">The actual value.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.MessageWriter.WriteValue(System.Object)\">\n            <summary>\n            Writes the text for a generalized value.\n            </summary>\n            <param name=\"val\">The value.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.MessageWriter.WriteCollectionElements(System.Collections.IEnumerable,System.Int64,System.Int32)\">\n            <summary>\n            Writes the text for a collection value,\n            starting at a particular point, to a max length\n            </summary>\n            <param name=\"collection\">The collection containing elements to write.</param>\n            <param name=\"start\">The starting point of the elements to write</param>\n            <param name=\"max\">The maximum number of elements to write</param>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.MessageWriter.MaxLineLength\">\n            <summary>\n            Abstract method to get the max line length\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.LessThanConstraint\">\n            <summary>\n            Tests whether a value is less than the value supplied to its constructor\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.ComparisonConstraint\">\n            <summary>\n            Abstract base class for constraints that compare _values to\n            determine if one is greater than, equal to or less than\n            the other.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.ComparisonConstraint.expected\">\n            <summary>\n            The value against which a comparison is to be made\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.ComparisonConstraint.lessComparisonResult\">\n            <summary>\n            If true, less than returns success\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.ComparisonConstraint.equalComparisonResult\">\n            <summary>\n            if true, equal returns success\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.ComparisonConstraint.greaterComparisonResult\">\n            <summary>\n            if true, greater than returns success\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.ComparisonConstraint.comparer\">\n            <summary>\n            ComparisonAdapter to be used in making the comparison\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ComparisonConstraint.#ctor(System.Object,System.Boolean,System.Boolean,System.Boolean,System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Constraints.ComparisonConstraint\"/> class.\n            </summary>\n            <param name=\"value\">The value against which to make a comparison.</param>\n            <param name=\"lessComparisonResult\">if set to <c>true</c> less succeeds.</param>\n            <param name=\"equalComparisonResult\">if set to <c>true</c> equal succeeds.</param>\n            <param name=\"greaterComparisonResult\">if set to <c>true</c> greater succeeds.</param>\n            <param name=\"predicate\">String used in describing the constraint.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ComparisonConstraint.ApplyTo(System.Object)\">\n            <summary>\n            Test whether the constraint is satisfied by a given value\n            </summary>\n            <param name=\"actual\">The value to be tested</param>\n            <returns>True for success, false for failure</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ComparisonConstraint.Using(System.Collections.IComparer)\">\n            <summary>\n            Modifies the constraint to use an <see cref=\"T:System.Collections.IComparer\"/> and returns self\n            </summary>\n            <param name=\"comparer\">The comparer used for comparison tests</param>\n            <returns>A constraint modified to use the given comparer</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ComparisonConstraint.Using``1(System.Collections.Generic.IComparer{``0})\">\n            <summary>\n            Modifies the constraint to use an <see cref=\"T:System.Collections.Generic.IComparer`1\"/> and returns self\n            </summary>\n            <param name=\"comparer\">The comparer used for comparison tests</param>\n            <returns>A constraint modified to use the given comparer</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ComparisonConstraint.Using``1(System.Comparison{``0})\">\n            <summary>\n            Modifies the constraint to use a <see cref=\"T:System.Comparison`1\"/> and returns self\n            </summary>\n            <param name=\"comparer\">The comparer used for comparison tests</param>\n            <returns>A constraint modified to use the given comparer</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.LessThanConstraint.#ctor(System.Object)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Constraints.LessThanConstraint\"/> class.\n            </summary>\n            <param name=\"expected\">The expected value.</param>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.EmptyStringConstraint\">\n            <summary>\n            EmptyStringConstraint tests whether a string is empty.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.EmptyStringConstraint.Matches(System.String)\">\n            <summary>\n            Test whether the constraint is satisfied by a given value\n            </summary>\n            <param name=\"actual\">The value to be tested</param>\n            <returns>True for success, false for failure</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.EmptyStringConstraint.Description\">\n            <summary>\n            The Description of what this constraint tests, for\n            use in messages and in the ConstraintResult.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.EmptyDirectoryConstraint\">\n            <summary>\n            EmptyDirectoryConstraint is used to test that a directory is empty\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.EmptyDirectoryConstraint.ApplyTo(System.Object)\">\n            <summary>\n            Test whether the constraint is satisfied by a given value\n            </summary>\n            <param name=\"actual\">The value to be tested</param>\n            <returns>True for success, false for failure</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.EmptyDirectoryConstraint.Description\">\n            <summary>\n            The Description of what this constraint tests, for\n            use in messages and in the ConstraintResult.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.ConstraintBuilder\">\n            <summary>\n            ConstraintBuilder maintains the stacks that are used in\n            processing a ConstraintExpression. An OperatorStack\n            is used to hold operators that are waiting for their\n            operands to be reorganized. a ConstraintStack holds \n            input constraints as well as the results of each\n            operator applied.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintBuilder.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Constraints.ConstraintBuilder\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintBuilder.Append(NUnit.Framework.Constraints.ConstraintOperator)\">\n            <summary>\n            Appends the specified operator to the expression by first\n            reducing the operator stack and then pushing the new\n            operator on the stack.\n            </summary>\n            <param name=\"op\">The operator to push.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintBuilder.Append(NUnit.Framework.Constraints.Constraint)\">\n            <summary>\n            Appends the specified constraint to the expression by pushing\n            it on the constraint stack.\n            </summary>\n            <param name=\"constraint\">The constraint to push.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintBuilder.SetTopOperatorRightContext(System.Object)\">\n            <summary>\n            Sets the top operator right context.\n            </summary>\n            <param name=\"rightContext\">The right context.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintBuilder.ReduceOperatorStack(System.Int32)\">\n            <summary>\n            Reduces the operator stack until the topmost item\n            precedence is greater than or equal to the target precedence.\n            </summary>\n            <param name=\"targetPrecedence\">The target precedence.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintBuilder.Resolve\">\n            <summary>\n            Resolves this instance, returning a Constraint. If the Builder\n            is not currently in a resolvable state, an exception is thrown.\n            </summary>\n            <returns>The resolved constraint</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintBuilder.IsResolvable\">\n            <summary>\n            Gets a value indicating whether this instance is resolvable.\n            </summary>\n            <value>\n            \t<c>true</c> if this instance is resolvable; otherwise, <c>false</c>.\n            </value>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.ConstraintBuilder.OperatorStack\">\n            <summary>\n            OperatorStack is a type-safe stack for holding ConstraintOperators\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintBuilder.OperatorStack.#ctor(NUnit.Framework.Constraints.ConstraintBuilder)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Constraints.ConstraintBuilder.OperatorStack\"/> class.\n            </summary>\n            <param name=\"builder\">The ConstraintBuilder using this stack.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintBuilder.OperatorStack.Push(NUnit.Framework.Constraints.ConstraintOperator)\">\n            <summary>\n            Pushes the specified operator onto the stack.\n            </summary>\n            <param name=\"op\">The operator to put onto the stack.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintBuilder.OperatorStack.Pop\">\n            <summary>\n            Pops the topmost operator from the stack.\n            </summary>\n            <returns>The topmost operator on the stack</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintBuilder.OperatorStack.Empty\">\n            <summary>\n            Gets a value indicating whether this <see cref=\"T:NUnit.Framework.Constraints.ConstraintBuilder.OperatorStack\"/> is empty.\n            </summary>\n            <value><c>true</c> if empty; otherwise, <c>false</c>.</value>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintBuilder.OperatorStack.Top\">\n            <summary>\n            Gets the topmost operator without modifying the stack.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.ConstraintBuilder.ConstraintStack\">\n            <summary>\n            ConstraintStack is a type-safe stack for holding Constraints\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintBuilder.ConstraintStack.#ctor(NUnit.Framework.Constraints.ConstraintBuilder)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Constraints.ConstraintBuilder.ConstraintStack\"/> class.\n            </summary>\n            <param name=\"builder\">The ConstraintBuilder using this stack.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintBuilder.ConstraintStack.Push(NUnit.Framework.Constraints.IConstraint)\">\n            <summary>\n            Pushes the specified constraint. As a side effect,\n            the constraint's Builder field is set to the \n            ConstraintBuilder owning this stack.\n            </summary>\n            <param name=\"constraint\">The constraint to put onto the stack</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintBuilder.ConstraintStack.Pop\">\n            <summary>\n            Pops this topmost constraint from the stack.\n            As a side effect, the constraint's Builder\n            field is set to null.\n            </summary>\n            <returns>The topmost contraint on the stack</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintBuilder.ConstraintStack.Empty\">\n            <summary>\n            Gets a value indicating whether this <see cref=\"T:NUnit.Framework.Constraints.ConstraintBuilder.ConstraintStack\"/> is empty.\n            </summary>\n            <value><c>true</c> if empty; otherwise, <c>false</c>.</value>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.CollectionEquivalentConstraint\">\n            <summary>\n            CollectionEquivalentConstraint is used to determine whether two\n            collections are equivalent.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.CollectionEquivalentConstraint.#ctor(System.Collections.IEnumerable)\">\n            <summary>\n            Construct a CollectionEquivalentConstraint\n            </summary>\n            <param name=\"expected\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.CollectionEquivalentConstraint.Matches(System.Collections.IEnumerable)\">\n            <summary>\n            Test whether two collections are equivalent\n            </summary>\n            <param name=\"actual\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.CollectionEquivalentConstraint.Using``2(System.Func{``0,``1,System.Boolean})\">\n            <summary>\n            Flag the constraint to use the supplied predicate function\n            </summary>\n            <param name=\"comparison\">The comparison function to use.</param>\n            <returns>Self.</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.CollectionEquivalentConstraint.DisplayName\">\n            <summary> \n            The display name of this Constraint for use by ToString().\n            The default value is the name of the constraint with\n            trailing \"Constraint\" removed. Derived classes may set\n            this to another name in their constructors.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.CollectionEquivalentConstraint.Description\">\n            <summary>\n            The Description of what this constraint tests, for\n            use in messages and in the ConstraintResult.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.AttributeExistsConstraint\">\n            <summary>\n            AttributeExistsConstraint tests for the presence of a\n            specified attribute on  a Type.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.AttributeExistsConstraint.#ctor(System.Type)\">\n            <summary>\n            Constructs an AttributeExistsConstraint for a specific attribute Type\n            </summary>\n            <param name=\"type\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.AttributeExistsConstraint.ApplyTo(System.Object)\">\n            <summary>\n            Tests whether the object provides the expected attribute.\n            </summary>\n            <param name=\"actual\">A Type, MethodInfo, or other ICustomAttributeProvider</param>\n            <returns>True if the expected attribute is present, otherwise false</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.AttributeExistsConstraint.Description\">\n            <summary>\n            The Description of what this constraint tests, for\n            use in messages and in the ConstraintResult.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.RequiresThreadAttribute\">\n            <summary>\n            Marks a test that must run on a separate thread.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.RequiresThreadAttribute.#ctor\">\n            <summary>\n            Construct a RequiresThreadAttribute\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.RequiresThreadAttribute.#ctor(System.Threading.ApartmentState)\">\n            <summary>\n            Construct a RequiresThreadAttribute, specifying the apartment\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.ExplicitAttribute\">\n            <summary>\n            ExplicitAttribute marks a test or test fixture so that it will\n            only be run if explicitly executed from the gui or command line\n            or if it is included by use of a filter. The test will not be\n            run simply because an enclosing suite is run.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.ExplicitAttribute.#ctor\">\n            <summary>\n            Default constructor\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.ExplicitAttribute.#ctor(System.String)\">\n            <summary>\n            Constructor with a reason\n            </summary>\n            <param name=\"reason\">The reason test is marked explicit</param>\n        </member>\n        <member name=\"M:NUnit.Framework.ExplicitAttribute.ApplyToTest(NUnit.Framework.Internal.Test)\">\n            <summary>\n            Modifies a test by marking it as explicit.\n            </summary>\n            <param name=\"test\">The test to modify</param>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Commands.OneTimeTearDownCommand\">\n            <summary>\n            OneTimeTearDownCommand performs any teardown actions\n            specified for a suite and calls Dispose on the user\n            test object, if any.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Commands.OneTimeTearDownCommand.#ctor(NUnit.Framework.Internal.TestSuite,System.Collections.Generic.List{NUnit.Framework.Internal.Commands.SetUpTearDownItem},System.Collections.Generic.List{NUnit.Framework.Internal.Commands.TestActionItem})\">\n            <summary>\n            Construct a OneTimeTearDownCommand\n            </summary>\n            <param name=\"suite\">The test suite to which the command applies</param>\n            <param name=\"setUpTearDownItems\">A SetUpTearDownList for use by the command</param>\n            <param name=\"actions\">A List of TestActionItems to be run before teardown.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Commands.OneTimeTearDownCommand.Execute(NUnit.Framework.Internal.ITestExecutionContext)\">\n            <summary>\n            Overridden to run the teardown methods specified on the test.\n            </summary>\n            <param name=\"context\">The TestExecutionContext to be used.</param>\n            <returns>A TestResult</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Builders.NamespaceTreeBuilder\">\n            <summary>\n            Class that can build a tree of automatic namespace\n            suites from a group of fixtures.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.Builders.NamespaceTreeBuilder.namespaceSuites\">\n            <summary>\n            NamespaceDictionary of all test suites we have created to represent \n            namespaces. Used to locate namespace parent suites for fixtures.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.Builders.NamespaceTreeBuilder.rootSuite\">\n            <summary>\n            The root of the test suite being created by this builder.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Builders.NamespaceTreeBuilder.#ctor(NUnit.Framework.Internal.TestSuite)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Internal.Builders.NamespaceTreeBuilder\"/> class.\n            </summary>\n            <param name=\"rootSuite\">The root suite.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Builders.NamespaceTreeBuilder.Add(System.Collections.Generic.IList{NUnit.Framework.Internal.Test})\">\n            <summary>\n            Adds the specified fixtures to the tree.\n            </summary>\n            <param name=\"fixtures\">The fixtures to be added.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Builders.NamespaceTreeBuilder.Add(NUnit.Framework.Internal.TestSuite)\">\n            <summary>\n            Adds the specified fixture to the tree.\n            </summary>\n            <param name=\"fixture\">The fixture to be added.</param>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Builders.NamespaceTreeBuilder.RootSuite\">\n            <summary>\n            Gets the root entry in the tree created by the NamespaceTreeBuilder.\n            </summary>\n            <value>The root suite.</value>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Builders.DefaultSuiteBuilder\">\n            <summary>\n            Built-in SuiteBuilder for all types of test classes.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Interfaces.ISuiteBuilder\">\n            <summary>\n            The ISuiteBuilder interface is exposed by a class that knows how to\n            build a suite from one or more Types. \n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.ISuiteBuilder.CanBuildFrom(NUnit.Framework.Interfaces.ITypeInfo)\">\n            <summary>\n            Examine the type and determine if it is suitable for\n            this builder to use in building a TestSuite.\n            \n            Note that returning false will cause the type to be ignored \n            in loading the tests. If it is desired to load the suite\n            but label it as non-runnable, ignored, etc., then this\n            method must return true.\n            </summary>\n            <param name=\"typeInfo\">The type of the fixture to be used</param>\n            <returns>True if the type can be used to build a TestSuite</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.ISuiteBuilder.BuildFrom(NUnit.Framework.Interfaces.ITypeInfo)\">\n            <summary>\n            Build a TestSuite from type provided.\n            </summary>\n            <param name=\"typeInfo\">The type of the fixture to be used</param>\n            <returns>A TestSuite</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Builders.DefaultSuiteBuilder.CanBuildFrom(NUnit.Framework.Interfaces.ITypeInfo)\">\n            <summary>\n            Checks to see if the provided Type is a fixture.\n            To be considered a fixture, it must be a non-abstract\n            class with one or more attributes implementing the\n            IFixtureBuilder interface or one or more methods\n            marked as tests.\n            </summary>\n            <param name=\"typeInfo\">The fixture type to check</param>\n            <returns>True if the fixture can be built, false if not</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Builders.DefaultSuiteBuilder.BuildFrom(NUnit.Framework.Interfaces.ITypeInfo)\">\n            <summary>\n            Build a TestSuite from TypeInfo provided.\n            </summary>\n            <param name=\"typeInfo\">The fixture type to build</param>\n            <returns>A TestSuite built from that type</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Builders.DefaultSuiteBuilder.GetFixtureBuilderAttributes(NUnit.Framework.Interfaces.ITypeInfo)\">\n            <summary>\n            We look for attributes implementing IFixtureBuilder at one level \n            of inheritance at a time. Attributes on base classes are not used \n            unless there are no fixture builder attributes at all on the derived\n            class. This is by design.\n            </summary>\n            <param name=\"typeInfo\">The type being examined for attributes</param>\n            <returns>A list of the attributes found.</returns>\n        </member>\n        <member name=\"T:System.Threading.LazyThreadSafetyMode\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"F:System.Threading.LazyThreadSafetyMode.None\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"F:System.Threading.LazyThreadSafetyMode.PublicationOnly\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"F:System.Threading.LazyThreadSafetyMode.ExecutionAndPublication\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.TestActionAttribute\">\n            <summary>\n            Provide actions to execute before and after tests.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.ITestAction\">\n            <summary>\n            When implemented by an attribute, this interface implemented to provide actions to execute before and after tests.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.ITestAction.BeforeTest(NUnit.Framework.Interfaces.ITest)\">\n            <summary>\n            Executed before each test is run\n            </summary>\n            <param name=\"test\">The test that is going to be run.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.ITestAction.AfterTest(NUnit.Framework.Interfaces.ITest)\">\n            <summary>\n            Executed after each test is run\n            </summary>\n            <param name=\"test\">The test that has just been run.</param>\n        </member>\n        <member name=\"P:NUnit.Framework.ITestAction.Targets\">\n            <summary>\n            Provides the target for the action attribute\n            </summary>\n            <returns>The target for the action attribute</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.TestActionAttribute.BeforeTest(NUnit.Framework.Interfaces.ITest)\">\n            <summary>\n            Executed before each test is run\n            </summary>\n            <param name=\"test\">The test that is going to be run.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.TestActionAttribute.AfterTest(NUnit.Framework.Interfaces.ITest)\">\n            <summary>\n            Executed after each test is run\n            </summary>\n            <param name=\"test\">The test that has just been run.</param>\n        </member>\n        <member name=\"P:NUnit.Framework.TestActionAttribute.Targets\">\n            <summary>\n            Provides the target for the action attribute\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.ApartmentAttribute\">\n            <summary>\n            Marks a test that must run in a particular threading apartment state, causing it\n            to run in a separate thread if necessary.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.ApartmentAttribute.#ctor(System.Threading.ApartmentState)\">\n            <summary>\n            Construct an ApartmentAttribute\n            </summary>\n            <param name=\"apartmentState\">The apartment state that this test must be run under. You must pass in a valid apartment state.</param>\n        </member>\n        <member name=\"T:NUnit.Framework.Iz\">\n            <summary>\n            The Iz class is a synonym for Is intended for use in VB,\n            which regards Is as a keyword.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Is\">\n            <summary>\n            Helper class with properties and methods that supply\n            a number of constraints used in Asserts.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Is.EqualTo(System.Object)\">\n            <summary>\n            Returns a constraint that tests two items for equality\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Is.SameAs(System.Object)\">\n            <summary>\n            Returns a constraint that tests that two references are the same object\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Is.GreaterThan(System.Object)\">\n            <summary>\n            Returns a constraint that tests whether the\n            actual value is greater than the supplied argument\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Is.GreaterThanOrEqualTo(System.Object)\">\n            <summary>\n            Returns a constraint that tests whether the\n            actual value is greater than or equal to the supplied argument\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Is.AtLeast(System.Object)\">\n            <summary>\n            Returns a constraint that tests whether the\n            actual value is greater than or equal to the supplied argument\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Is.LessThan(System.Object)\">\n            <summary>\n            Returns a constraint that tests whether the\n            actual value is less than the supplied argument\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Is.LessThanOrEqualTo(System.Object)\">\n            <summary>\n            Returns a constraint that tests whether the\n            actual value is less than or equal to the supplied argument\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Is.AtMost(System.Object)\">\n            <summary>\n            Returns a constraint that tests whether the\n            actual value is less than or equal to the supplied argument\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Is.TypeOf(System.Type)\">\n            <summary>\n            Returns a constraint that tests whether the actual\n            value is of the exact type supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Is.TypeOf``1\">\n            <summary>\n            Returns a constraint that tests whether the actual\n            value is of the exact type supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Is.InstanceOf(System.Type)\">\n            <summary>\n            Returns a constraint that tests whether the actual value\n            is of the type supplied as an argument or a derived type.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Is.InstanceOf``1\">\n            <summary>\n            Returns a constraint that tests whether the actual value\n            is of the type supplied as an argument or a derived type.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Is.AssignableFrom(System.Type)\">\n            <summary>\n            Returns a constraint that tests whether the actual value\n            is assignable from the type supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Is.AssignableFrom``1\">\n            <summary>\n            Returns a constraint that tests whether the actual value\n            is assignable from the type supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Is.AssignableTo(System.Type)\">\n            <summary>\n            Returns a constraint that tests whether the actual value\n            is assignable to the type supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Is.AssignableTo``1\">\n            <summary>\n            Returns a constraint that tests whether the actual value\n            is assignable to the type supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Is.EquivalentTo(System.Collections.IEnumerable)\">\n            <summary>\n            Returns a constraint that tests whether the actual value\n            is a collection containing the same elements as the \n            collection supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Is.SubsetOf(System.Collections.IEnumerable)\">\n            <summary>\n            Returns a constraint that tests whether the actual value\n            is a subset of the collection supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Is.SupersetOf(System.Collections.IEnumerable)\">\n            <summary>\n            Returns a constraint that tests whether the actual value\n            is a superset of the collection supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Is.StringContaining(System.String)\">\n            <summary>\n            Returns a constraint that succeeds if the actual\n            value contains the substring supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Is.StringStarting(System.String)\">\n            <summary>\n            Returns a constraint that succeeds if the actual\n            value starts with the substring supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Is.StringEnding(System.String)\">\n            <summary>\n            Returns a constraint that succeeds if the actual\n            value ends with the substring supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Is.StringMatching(System.String)\">\n            <summary>\n            Returns a constraint that succeeds if the actual\n            value matches the regular expression supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Is.SamePath(System.String)\">\n            <summary>\n            Returns a constraint that tests whether the path provided \n            is the same as an expected path after canonicalization.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Is.SubPathOf(System.String)\">\n            <summary>\n            Returns a constraint that tests whether the path provided \n            is a subpath of the expected path after canonicalization.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Is.SamePathOrUnder(System.String)\">\n            <summary>\n            Returns a constraint that tests whether the path provided \n            is the same path or under an expected path after canonicalization.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Is.InRange(System.IComparable,System.IComparable)\">\n            <summary>\n            Returns a constraint that tests whether the actual value falls\n            inclusively within a specified range.\n            </summary>\n            <remarks>from must be less than or equal to true</remarks> \n            <param name=\"from\">Inclusive beginning of the range. Must be less than or equal to to.</param>\n            <param name=\"to\">Inclusive end of the range. Must be greater than or equal to from.</param>\n            <returns></returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Is.Not\">\n            <summary>\n            Returns a ConstraintExpression that negates any\n            following constraint.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Is.All\">\n            <summary>\n            Returns a ConstraintExpression, which will apply\n            the following constraint to all members of a collection,\n            succeeding if all of them succeed.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Is.Null\">\n            <summary>\n            Returns a constraint that tests for null\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Is.True\">\n            <summary>\n            Returns a constraint that tests for True\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Is.False\">\n            <summary>\n            Returns a constraint that tests for False\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Is.Positive\">\n            <summary>\n            Returns a constraint that tests for a positive value\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Is.Negative\">\n            <summary>\n            Returns a constraint that tests for a negative value\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Is.Zero\">\n            <summary>\n            Returns a constraint that tests for equality with zero\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Is.NaN\">\n            <summary>\n            Returns a constraint that tests for NaN\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Is.Empty\">\n            <summary>\n            Returns a constraint that tests for empty\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Is.Unique\">\n            <summary>\n            Returns a constraint that tests whether a collection \n            contains all unique items.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Is.BinarySerializable\">\n            <summary>\n            Returns a constraint that tests whether an object graph is serializable in binary format.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Is.XmlSerializable\">\n            <summary>\n            Returns a constraint that tests whether an object graph is serializable in xml format.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Is.Ordered\">\n            <summary>\n            Returns a constraint that tests whether a collection is ordered\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Interfaces.IWrapTestMethod\">\n            <summary>\n            Objects implementing this interface are used to wrap\n            the TestMethodCommand itself. They apply after SetUp\n            has been run and before TearDown.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Commands.CommandStage\">\n            <summary>\n            The CommandStage enumeration represents the defined stages\n            of execution for a series of TestCommands. The int _values\n            of the enum are used to apply decorators in the proper \n            order. Lower _values are applied first and are therefore\n            \"closer\" to the actual test execution.\n            </summary>\n            <remarks>\n            No CommandStage is defined for actual invocation of the test or\n            for creation of the context. Execution may be imagined as \n            proceeding from the bottom of the list upwards, with cleanup\n            after the test running in the opposite order.\n            </remarks>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.Commands.CommandStage.Default\">\n            <summary>\n            Use an application-defined default value.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.Commands.CommandStage.BelowSetUpTearDown\">\n            <summary>\n            Make adjustments needed before and after running\n            the raw test - that is, after any SetUp has run\n            and before TearDown.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.Commands.CommandStage.SetUpTearDown\">\n            <summary>\n            Run SetUp and TearDown for the test.  This stage is used\n            internally by NUnit and should not normally appear\n            in user-defined decorators.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.Commands.CommandStage.AboveSetUpTearDown\">\n            <summary>\n            Make adjustments needed before and after running \n            the entire test - including SetUp and TearDown.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.ThrowsConstraint\">\n            <summary>\n            ThrowsConstraint is used to test the exception thrown by \n            a delegate by applying a constraint to it.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ThrowsConstraint.#ctor(NUnit.Framework.Constraints.IConstraint)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Constraints.ThrowsConstraint\"/> class,\n            using a constraint to be applied to the exception.\n            </summary>\n            <param name=\"baseConstraint\">A constraint to apply to the caught exception.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ThrowsConstraint.ApplyTo(System.Object)\">\n            <summary>\n            Executes the code of the delegate and captures any exception.\n            If a non-null base constraint was provided, it applies that\n            constraint to the exception.\n            </summary>\n            <param name=\"actual\">A delegate representing the code to be tested</param>\n            <returns>True if an exception is thrown and the constraint succeeds, otherwise false</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ThrowsConstraint.ApplyTo``1(NUnit.Framework.Constraints.ActualValueDelegate{``0})\">\n            <summary>\n            Converts an ActualValueDelegate to a TestDelegate\n            before calling the primary overload.\n            </summary>\n            <param name=\"del\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ThrowsConstraint.ActualException\">\n            <summary>\n            Get the actual exception thrown - used by Assert.Throws.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ThrowsConstraint.Description\">\n            <summary>\n            Gets text describing a constraint\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ThrowsConstraint.ThrowsConstraintResult.WriteActualValueTo(NUnit.Framework.Constraints.MessageWriter)\">\n            <summary>\n            Write the actual value for a failing constraint test to a\n            MessageWriter. This override only handles the special message\n            used when an exception is expected but none is thrown.\n            </summary>\n            <param name=\"writer\">The writer on which the actual value is displayed</param>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.SamePathConstraint\">\n            <summary>\n            Summary description for SamePathConstraint.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.SamePathConstraint.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Constraints.SamePathConstraint\"/> class.\n            </summary>\n            <param name=\"expected\">The expected path</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.SamePathConstraint.Matches(System.String)\">\n            <summary>\n            Test whether the constraint is satisfied by a given value\n            </summary>\n            <param name=\"actual\">The value to be tested</param>\n            <returns>True for success, false for failure</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.SamePathConstraint.Description\">\n            <summary>\n            The Description of what this constraint tests, for\n            use in messages and in the ConstraintResult.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.AndOperator\">\n            <summary>\n            Operator that requires both it's arguments to succeed\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.AndOperator.#ctor\">\n            <summary>\n            Construct an AndOperator\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.AndOperator.ApplyOperator(NUnit.Framework.Constraints.IConstraint,NUnit.Framework.Constraints.IConstraint)\">\n            <summary>\n            Apply the operator to produce an AndConstraint\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Assume\">\n            <summary>\n            Provides static methods to express the assumptions\n            that must be met for a test to give a meaningful\n            result. If an assumption is not met, the test\n            should produce an inconclusive result.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Assume.Equals(System.Object,System.Object)\">\n            <summary>\n            The Equals method throws an InvalidOperationException. This is done \n            to make sure there is no mistake by calling this function.\n            </summary>\n            <param name=\"a\">The left object.</param>\n            <param name=\"b\">The right object.</param>\n            <returns>Not applicable</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Assume.ReferenceEquals(System.Object,System.Object)\">\n            <summary>\n            override the default ReferenceEquals to throw an InvalidOperationException. This \n            implementation makes sure there is no mistake in calling this function \n            as part of Assert. \n            </summary>\n            <param name=\"a\">The left object.</param>\n            <param name=\"b\">The right object.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assume.That``1(NUnit.Framework.Constraints.ActualValueDelegate{``0},NUnit.Framework.Constraints.IResolveConstraint)\">\n            <summary>\n            Apply a constraint to an actual value, succeeding if the constraint\n            is satisfied and throwing an InconclusiveException on failure.\n            </summary>\n            <typeparam name=\"TActual\">The Type being compared.</typeparam>\n            <param name=\"del\">An ActualValueDelegate returning the value to be tested</param>\n            <param name=\"expr\">A Constraint expression to be applied</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assume.That``1(NUnit.Framework.Constraints.ActualValueDelegate{``0},NUnit.Framework.Constraints.IResolveConstraint,System.String,System.Object[])\">\n            <summary>\n            Apply a constraint to an actual value, succeeding if the constraint\n            is satisfied and throwing an InconclusiveException on failure.\n            </summary>\n            <typeparam name=\"TActual\">The Type being compared.</typeparam>\n            <param name=\"del\">An ActualValueDelegate returning the value to be tested</param>\n            <param name=\"expr\">A Constraint expression to be applied</param>\n            <param name=\"message\">The message that will be displayed on failure</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assume.That``1(NUnit.Framework.Constraints.ActualValueDelegate{``0},NUnit.Framework.Constraints.IResolveConstraint,System.Func{System.String})\">\n            <summary>\n            Apply a constraint to an actual value, succeeding if the constraint\n            is satisfied and throwing an InconclusiveException on failure.\n            </summary>\n            <typeparam name=\"TActual\">The Type being compared.</typeparam>\n            <param name=\"del\">An ActualValueDelegate returning the value to be tested</param>\n            <param name=\"expr\">A Constraint expression to be applied</param>\n            <param name=\"getExceptionMessage\">A function to build the message included with the Exception</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assume.That(System.Boolean,System.String,System.Object[])\">\n            <summary>\n            Asserts that a condition is true. If the condition is false the method throws\n            an <see cref=\"T:NUnit.Framework.InconclusiveException\"/>.\n            </summary> \n            <param name=\"condition\">The evaluated condition</param>\n            <param name=\"message\">The message to display if the condition is false</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assume.That(System.Boolean)\">\n            <summary>\n            Asserts that a condition is true. If the condition is false the \n            method throws an <see cref=\"T:NUnit.Framework.InconclusiveException\"/>.\n            </summary>\n            <param name=\"condition\">The evaluated condition</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assume.That(System.Boolean,System.Func{System.String})\">\n            <summary>\n            Asserts that a condition is true. If the condition is false the method throws\n            an <see cref=\"T:NUnit.Framework.InconclusiveException\"/>.\n            </summary> \n            <param name=\"condition\">The evaluated condition</param>\n            <param name=\"getExceptionMessage\">A function to build the message included with the Exception</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assume.That(System.Func{System.Boolean},System.String,System.Object[])\">\n            <summary>\n            Asserts that a condition is true. If the condition is false the method throws\n            an <see cref=\"T:NUnit.Framework.InconclusiveException\"/>.\n            </summary> \n            <param name=\"condition\">A lambda that returns a Boolean</param>\n            <param name=\"message\">The message to display if the condition is false</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assume.That(System.Func{System.Boolean})\">\n            <summary>\n            Asserts that a condition is true. If the condition is false the method throws\n            an <see cref=\"T:NUnit.Framework.InconclusiveException\"/>.\n            </summary>\n            <param name=\"condition\">A lambda that returns a Boolean</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assume.That(System.Func{System.Boolean},System.Func{System.String})\">\n            <summary>\n            Asserts that a condition is true. If the condition is false the method throws\n            an <see cref=\"T:NUnit.Framework.InconclusiveException\"/>.\n            </summary> \n            <param name=\"condition\">A lambda that returns a Boolean</param>\n            <param name=\"getExceptionMessage\">A function to build the message included with the Exception</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assume.That(NUnit.Framework.TestDelegate,NUnit.Framework.Constraints.IResolveConstraint)\">\n            <summary>\n            Asserts that the code represented by a delegate throws an exception\n            that satisfies the constraint provided.\n            </summary>\n            <param name=\"code\">A TestDelegate to be executed</param>\n            <param name=\"constraint\">A ThrowsConstraint used in the test</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assume.That``1(``0,NUnit.Framework.Constraints.IResolveConstraint)\">\n            <summary>\n            Apply a constraint to an actual value, succeeding if the constraint\n            is satisfied and throwing an InconclusiveException on failure.\n            </summary>\n            <typeparam name=\"TActual\">The Type being compared.</typeparam>\n            <param name=\"actual\">The actual value to test</param>\n            <param name=\"expression\">A Constraint to be applied</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assume.That``1(``0,NUnit.Framework.Constraints.IResolveConstraint,System.String,System.Object[])\">\n            <summary>\n            Apply a constraint to an actual value, succeeding if the constraint\n            is satisfied and throwing an InconclusiveException on failure.\n            </summary>\n            <typeparam name=\"TActual\">The Type being compared.</typeparam>\n            <param name=\"actual\">The actual value to test</param>\n            <param name=\"expression\">A Constraint expression to be applied</param>\n            <param name=\"message\">The message that will be displayed on failure</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Assume.That``1(``0,NUnit.Framework.Constraints.IResolveConstraint,System.Func{System.String})\">\n            <summary>\n            Apply a constraint to an actual value, succeeding if the constraint\n            is satisfied and throwing an InconclusiveException on failure.\n            </summary>\n            <typeparam name=\"TActual\">The Type being compared.</typeparam>\n            <param name=\"actual\">The actual value to test</param>\n            <param name=\"expression\">A Constraint to be applied</param>\n            <param name=\"getExceptionMessage\">A function to build the message included with the Exception</param>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Commands.SkipCommand\">\n            <summary>\n            TODO: Documentation needed for class\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Commands.SkipCommand.#ctor(NUnit.Framework.Internal.Test)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Internal.Commands.SkipCommand\"/> class.\n            </summary>\n            <param name=\"test\">The test being skipped.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Commands.SkipCommand.Execute(NUnit.Framework.Internal.ITestExecutionContext)\">\n            <summary>\n            Overridden to simply set the CurrentResult to the\n            appropriate Skipped state.\n            </summary>\n            <param name=\"context\">The execution context for the test</param>\n            <returns>A TestResult</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Execution.TextCapture\">\n            <summary>\n            The TextCapture class intercepts console output and writes it\n            to the current execution context, if one is present on the thread.\n            If no execution context is found, the output is written to a\n            default destination, normally the original destination of the\n            intercepted output.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Execution.TextCapture.#ctor(System.IO.TextWriter)\">\n            <summary>\n            Construct a TextCapture object\n            </summary>\n            <param name=\"defaultWriter\">The default destination for non-intercepted output</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Execution.TextCapture.Write(System.Char)\">\n            <summary>\n            Writes a single character\n            </summary>\n            <param name=\"value\">The char to write</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Execution.TextCapture.Write(System.String)\">\n            <summary>\n            Writes a string\n            </summary>\n            <param name=\"value\">The string to write</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Execution.TextCapture.WriteLine(System.String)\">\n            <summary>\n            Writes a string followed by a line terminator\n            </summary>\n            <param name=\"value\">The string to write</param>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Execution.TextCapture.Encoding\">\n            <summary>\n            Gets the Encoding in use by this TextWriter\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Execution.SimpleWorkItemDispatcher\">\n            <summary>\n            SimpleWorkItemDispatcher handles execution of WorkItems by\n            directly executing them. It is provided so that a dispatcher\n            is always available in the context, thereby simplifying the\n            code needed to run child tests.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Execution.IWorkItemDispatcher\">\n            <summary>\n            An IWorkItemDispatcher handles execution of work items.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Execution.IWorkItemDispatcher.Dispatch(NUnit.Framework.Internal.Execution.WorkItem)\">\n            <summary>\n            Dispatch a single work item for execution. The first\n            work item dispatched is saved as the top-level\n            work item and used when stopping the run.\n            </summary>\n            <param name=\"work\">The item to dispatch</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Execution.IWorkItemDispatcher.CancelRun(System.Boolean)\">\n            <summary>\n            Cancel the ongoing run completely.\n            If no run is in process, the call has no effect.\n            </summary>\n            <param name=\"force\">true if the IWorkItemDispatcher should abort all currently running WorkItems, false if it should allow all currently running WorkItems to complete</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Execution.SimpleWorkItemDispatcher.Dispatch(NUnit.Framework.Internal.Execution.WorkItem)\">\n            <summary>\n            Dispatch a single work item for execution. The first\n            work item dispatched is saved as the top-level\n            work item and a thread is created on which to\n            run it. Subsequent calls come from the top level\n            item or its descendants on the proper thread.\n            </summary>\n            <param name=\"work\">The item to dispatch</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Execution.SimpleWorkItemDispatcher.CancelRun(System.Boolean)\">\n            <summary>\n            Cancel (abort or stop) the ongoing run.\n            If no run is in process, the call has no effect.\n            </summary>\n            <param name=\"force\">true if the run should be aborted, false if it should allow its currently running test to complete</param>\n        </member>\n        <member name=\"T:NUnit.Framework.DirectoryAssert\">\n            <summary>\n            Asserts on Directories\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.DirectoryAssert.Equals(System.Object,System.Object)\">\n            <summary>\n            The Equals method throws an InvalidOperationException. This is done \n            to make sure there is no mistake by calling this function.\n            </summary>\n            <param name=\"a\"></param>\n            <param name=\"b\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.DirectoryAssert.ReferenceEquals(System.Object,System.Object)\">\n            <summary>\n            override the default ReferenceEquals to throw an InvalidOperationException. This \n            implementation makes sure there is no mistake in calling this function \n            as part of Assert. \n            </summary>\n            <param name=\"a\"></param>\n            <param name=\"b\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.DirectoryAssert.AreEqual(System.IO.DirectoryInfo,System.IO.DirectoryInfo,System.String,System.Object[])\">\n            <summary>\n            Verifies that two directories are equal.  Two directories are considered\n            equal if both are null, or if both point to the same directory.\n            If they are not equal an <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown.\n            </summary>\n            <param name=\"expected\">A directory containing the value that is expected</param>\n            <param name=\"actual\">A directory containing the actual value</param>\n            <param name=\"message\">The message to display if the directories are not equal</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.DirectoryAssert.AreEqual(System.IO.DirectoryInfo,System.IO.DirectoryInfo)\">\n            <summary>\n            Verifies that two directories are equal.  Two directories are considered\n            equal if both are null, or if both point to the same directory.\n            If they are not equal an <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown.\n            </summary>\n            <param name=\"expected\">A directory containing the value that is expected</param>\n            <param name=\"actual\">A directory containing the actual value</param>\n        </member>\n        <member name=\"M:NUnit.Framework.DirectoryAssert.AreNotEqual(System.IO.DirectoryInfo,System.IO.DirectoryInfo,System.String,System.Object[])\">\n            <summary>\n            Asserts that two directories are not equal. If they are equal\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown.\n            </summary>\n            <param name=\"expected\">A directory containing the value that is expected</param>\n            <param name=\"actual\">A directory containing the actual value</param>\n            <param name=\"message\">The message to display if directories are not equal</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.DirectoryAssert.AreNotEqual(System.IO.DirectoryInfo,System.IO.DirectoryInfo)\">\n            <summary>\n            Asserts that two directories are not equal. If they are equal\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown.\n            </summary>\n            <param name=\"expected\">A directory containing the value that is expected</param>\n            <param name=\"actual\">A directory containing the actual value</param>\n        </member>\n        <member name=\"M:NUnit.Framework.DirectoryAssert.Exists(System.IO.DirectoryInfo,System.String,System.Object[])\">\n            <summary>\n            Asserts that the directory exists. If it does not exist\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown.\n            </summary>\n            <param name=\"actual\">A directory containing the actual value</param>\n            <param name=\"message\">The message to display if directories are not equal</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.DirectoryAssert.Exists(System.IO.DirectoryInfo)\">\n            <summary>\n            Asserts that the directory exists. If it does not exist\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown.\n            </summary>\n            <param name=\"actual\">A directory containing the actual value</param>\n        </member>\n        <member name=\"M:NUnit.Framework.DirectoryAssert.Exists(System.String,System.String,System.Object[])\">\n            <summary>\n            Asserts that the directory exists. If it does not exist\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown.\n            </summary>\n            <param name=\"actual\">The path to a directory containing the actual value</param>\n            <param name=\"message\">The message to display if directories are not equal</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.DirectoryAssert.Exists(System.String)\">\n            <summary>\n            Asserts that the directory exists. If it does not exist\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown.\n            </summary>\n            <param name=\"actual\">The path to a directory containing the actual value</param>\n        </member>\n        <member name=\"M:NUnit.Framework.DirectoryAssert.DoesNotExist(System.IO.DirectoryInfo,System.String,System.Object[])\">\n            <summary>\n            Asserts that the directory does not exist. If it does exist\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown.\n            </summary>\n            <param name=\"actual\">A directory containing the actual value</param>\n            <param name=\"message\">The message to display if directories are not equal</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.DirectoryAssert.DoesNotExist(System.IO.DirectoryInfo)\">\n            <summary>\n            Asserts that the directory does not exist. If it does exist\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown.\n            </summary>\n            <param name=\"actual\">A directory containing the actual value</param>\n        </member>\n        <member name=\"M:NUnit.Framework.DirectoryAssert.DoesNotExist(System.String,System.String,System.Object[])\">\n            <summary>\n            Asserts that the directory does not exist. If it does exist\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown.\n            </summary>\n            <param name=\"actual\">The path to a directory containing the actual value</param>\n            <param name=\"message\">The message to display if directories are not equal</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.DirectoryAssert.DoesNotExist(System.String)\">\n            <summary>\n            Asserts that the directory does not exist. If it does exist\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown.\n            </summary>\n            <param name=\"actual\">The path to a directory containing the actual value</param>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Filters.TestNameFilter\">\n            <summary>\n            TestName filter selects tests based on their Name\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Filters.TestNameFilter.#ctor(System.String)\">\n            <summary>\n            Construct a TestNameFilter for a single name\n            </summary>\n            <param name=\"expectedValue\">The name the filter will recognize.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Filters.TestNameFilter.Match(NUnit.Framework.Interfaces.ITest)\">\n            <summary>\n            Match a test against a single value.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Filters.TestNameFilter.ElementName\">\n            <summary>\n            Gets the element name\n            </summary>\n            <value>Element name</value>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Builders.ParameterDataProvider\">\n            <summary>\n            The ParameterDataProvider class implements IParameterDataProvider\n            and hosts one or more individual providers.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Builders.ParameterDataProvider.#ctor(NUnit.Framework.Interfaces.IParameterDataProvider[])\">\n            <summary>\n            Construct with a collection of individual providers\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Builders.ParameterDataProvider.HasDataFor(NUnit.Framework.Interfaces.IParameterInfo)\">\n            <summary>\n            Determine whether any data is available for a parameter.\n            </summary>\n            <param name=\"parameter\">An IParameterInfo representing one\n            argument to a parameterized test</param>\n            <returns>True if any data is available, otherwise false.</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Builders.ParameterDataProvider.GetDataFor(NUnit.Framework.Interfaces.IParameterInfo)\">\n            <summary>\n            Return an IEnumerable providing data for use with the\n            supplied parameter.\n            </summary>\n            <param name=\"parameter\">An IParameterInfo representing one\n            argument to a parameterized test</param>\n            <returns>An IEnumerable providing the required data</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.ExactCountConstraint\">\n            <summary>\n            ExactCountConstraint applies another constraint to each\n            item in a collection, succeeding only if a specified\n            number of items succeed.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ExactCountConstraint.#ctor(System.Int32,NUnit.Framework.Constraints.IConstraint)\">\n            <summary>\n            Construct an ExactCountConstraint on top of an existing constraint\n            </summary>\n            <param name=\"expectedCount\"></param>\n            <param name=\"itemConstraint\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ExactCountConstraint.ApplyTo(System.Object)\">\n            <summary>\n            Apply the item constraint to each item in the collection,\n            succeeding only if the expected number of items pass.\n            </summary>\n            <param name=\"actual\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"T:NUnit.Framework.AssertionException\">\n            <summary>\n            Thrown when an assertion failed.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.AssertionException.#ctor(System.String)\">\n            <param name=\"message\">The error message that explains \n            the reason for the exception</param>\n        </member>\n        <member name=\"M:NUnit.Framework.AssertionException.#ctor(System.String,System.Exception)\">\n            <param name=\"message\">The error message that explains \n            the reason for the exception</param>\n            <param name=\"inner\">The exception that caused the \n            current exception</param>\n        </member>\n        <member name=\"M:NUnit.Framework.AssertionException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)\">\n            <summary>\n            Serialization Constructor\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.AssertionException.ResultState\">\n            <summary>\n            Gets the ResultState provided by this exception\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.XmlSerializableConstraint\">\n            <summary>\n            XmlSerializableConstraint tests whether \n            an object is serializable in xml format.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.XmlSerializableConstraint.ApplyTo(System.Object)\">\n            <summary>\n            Test whether the constraint is satisfied by a given value\n            </summary>\n            <param name=\"actual\">The value to be tested</param>\n            <returns>True for success, false for failure</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.XmlSerializableConstraint.GetStringRepresentation\">\n            <summary>\n            Returns the string representation of this constraint\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.XmlSerializableConstraint.Description\">\n            <summary>\n            Gets text describing a constraint\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.FloatingPointNumerics\">\n            <summary>Helper routines for working with floating point numbers</summary>\n            <remarks>\n              <para>\n                The floating point comparison code is based on this excellent article:\n                http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm\n              </para>\n              <para>\n                \"ULP\" means Unit in the Last Place and in the context of this library refers to\n                the distance between two adjacent floating point numbers. IEEE floating point\n                numbers can only represent a finite subset of natural numbers, with greater\n                accuracy for smaller numbers and lower accuracy for very large numbers.\n              </para>\n              <para>\n                If a comparison is allowed \"2 ulps\" of deviation, that means the _values are\n                allowed to deviate by up to 2 adjacent floating point _values, which might be\n                as low as 0.0000001 for small numbers or as high as 10.0 for large numbers.\n              </para>\n            </remarks>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.FloatingPointNumerics.AreAlmostEqualUlps(System.Single,System.Single,System.Int32)\">\n            <summary>Compares two floating point _values for equality</summary>\n            <param name=\"left\">First floating point value to be compared</param>\n            <param name=\"right\">Second floating point value t be compared</param>\n            <param name=\"maxUlps\">\n              Maximum number of representable floating point _values that are allowed to\n              be between the left and the right floating point _values\n            </param>\n            <returns>True if both numbers are equal or close to being equal</returns>\n            <remarks>\n              <para>\n                Floating point _values can only represent a finite subset of natural numbers.\n                For example, the _values 2.00000000 and 2.00000024 can be stored in a float,\n                but nothing inbetween them.\n              </para>\n              <para>\n                This comparison will count how many possible floating point _values are between\n                the left and the right number. If the number of possible _values between both\n                numbers is less than or equal to maxUlps, then the numbers are considered as\n                being equal.\n              </para>\n              <para>\n                Implementation partially follows the code outlined here:\n                http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/\n              </para>\n            </remarks>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.FloatingPointNumerics.AreAlmostEqualUlps(System.Double,System.Double,System.Int64)\">\n            <summary>Compares two double precision floating point _values for equality</summary>\n            <param name=\"left\">First double precision floating point value to be compared</param>\n            <param name=\"right\">Second double precision floating point value t be compared</param>\n            <param name=\"maxUlps\">\n              Maximum number of representable double precision floating point _values that are\n              allowed to be between the left and the right double precision floating point _values\n            </param>\n            <returns>True if both numbers are equal or close to being equal</returns>\n            <remarks>\n              <para>\n                Double precision floating point _values can only represent a limited series of\n                natural numbers. For example, the _values 2.0000000000000000 and 2.0000000000000004\n                can be stored in a double, but nothing inbetween them.\n              </para>\n              <para>\n                This comparison will count how many possible double precision floating point\n                _values are between the left and the right number. If the number of possible\n                _values between both numbers is less than or equal to maxUlps, then the numbers\n                are considered as being equal.\n              </para>\n              <para>\n                Implementation partially follows the code outlined here:\n                http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/\n              </para>\n            </remarks>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.FloatingPointNumerics.ReinterpretAsInt(System.Single)\">\n            <summary>\n              Reinterprets the memory contents of a floating point value as an integer value\n            </summary>\n            <param name=\"value\">\n              Floating point value whose memory contents to reinterpret\n            </param>\n            <returns>\n              The memory contents of the floating point value interpreted as an integer\n            </returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.FloatingPointNumerics.ReinterpretAsLong(System.Double)\">\n            <summary>\n              Reinterprets the memory contents of a double precision floating point\n              value as an integer value\n            </summary>\n            <param name=\"value\">\n              Double precision floating point value whose memory contents to reinterpret\n            </param>\n            <returns>\n              The memory contents of the double precision floating point value\n              interpreted as an integer\n            </returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.FloatingPointNumerics.ReinterpretAsFloat(System.Int32)\">\n            <summary>\n              Reinterprets the memory contents of an integer as a floating point value\n            </summary>\n            <param name=\"value\">Integer value whose memory contents to reinterpret</param>\n            <returns>\n              The memory contents of the integer value interpreted as a floating point value\n            </returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.FloatingPointNumerics.ReinterpretAsDouble(System.Int64)\">\n            <summary>\n              Reinterprets the memory contents of an integer value as a double precision\n              floating point value\n            </summary>\n            <param name=\"value\">Integer whose memory contents to reinterpret</param>\n            <returns>\n              The memory contents of the integer interpreted as a double precision\n              floating point value\n            </returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.FloatingPointNumerics.FloatIntUnion\">\n            <summary>Union of a floating point variable and an integer</summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.FloatingPointNumerics.FloatIntUnion.Float\">\n            <summary>The union's value as a floating point variable</summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.FloatingPointNumerics.FloatIntUnion.Int\">\n            <summary>The union's value as an integer</summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.FloatingPointNumerics.FloatIntUnion.UInt\">\n            <summary>The union's value as an unsigned integer</summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.FloatingPointNumerics.DoubleLongUnion\">\n            <summary>Union of a double precision floating point variable and a long</summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.FloatingPointNumerics.DoubleLongUnion.Double\">\n            <summary>The union's value as a double precision floating point variable</summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.FloatingPointNumerics.DoubleLongUnion.Long\">\n            <summary>The union's value as a long</summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.FloatingPointNumerics.DoubleLongUnion.ULong\">\n            <summary>The union's value as an unsigned long</summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.EqualityAdapter\">\n            <summary>\n            EqualityAdapter class handles all equality comparisons\n            that use an <see cref=\"T:System.Collections.IEqualityComparer\"/>, <see cref=\"T:System.Collections.Generic.IEqualityComparer`1\"/>\n            or a <see cref=\"T:NUnit.Framework.Constraints.ComparisonAdapter\"/>.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.EqualityAdapter.AreEqual(System.Object,System.Object)\">\n            <summary>\n            Compares two objects, returning true if they are equal\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.EqualityAdapter.CanCompare(System.Object,System.Object)\">\n            <summary>\n            Returns true if the two objects can be compared by this adapter.\n            The base adapter cannot handle IEnumerables except for strings.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.EqualityAdapter.For(System.Collections.IComparer)\">\n            <summary>\n            Returns an <see cref=\"T:NUnit.Framework.Constraints.EqualityAdapter\"/> that wraps an <see cref=\"T:System.Collections.IComparer\"/>.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.EqualityAdapter.For(System.Collections.IEqualityComparer)\">\n            <summary>\n            Returns an <see cref=\"T:NUnit.Framework.Constraints.EqualityAdapter\"/> that wraps an <see cref=\"T:System.Collections.IEqualityComparer\"/>.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.EqualityAdapter.For``2(System.Func{``0,``1,System.Boolean})\">\n            <summary>\n            Returns an EqualityAdapter that uses a predicate function for items comparison.\n            </summary>\n            <typeparam name=\"TExpected\"></typeparam>\n            <typeparam name=\"TActual\"></typeparam>\n            <param name=\"comparison\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.EqualityAdapter.For``1(System.Collections.Generic.IEqualityComparer{``0})\">\n            <summary>\n            Returns an <see cref=\"T:NUnit.Framework.Constraints.EqualityAdapter\"/> that wraps an <see cref=\"T:System.Collections.Generic.IEqualityComparer`1\"/>.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.EqualityAdapter.For``1(System.Collections.Generic.IComparer{``0})\">\n            <summary>\n            Returns an <see cref=\"T:NUnit.Framework.Constraints.EqualityAdapter\"/> that wraps an <see cref=\"T:System.Collections.Generic.IComparer`1\"/>.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.EqualityAdapter.For``1(System.Comparison{``0})\">\n            <summary>\n            Returns an <see cref=\"T:NUnit.Framework.Constraints.EqualityAdapter\"/> that wraps a <see cref=\"T:System.Comparison`1\"/>.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.EqualityAdapter.ComparerAdapter\">\n            <summary>\n            <see cref=\"T:NUnit.Framework.Constraints.EqualityAdapter\"/> that wraps an <see cref=\"T:System.Collections.IComparer\"/>.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.EqualityAdapter.PredicateEqualityAdapter`2.CanCompare(System.Object,System.Object)\">\n            <summary>\n            Returns true if the two objects can be compared by this adapter.\n            The base adapter cannot handle IEnumerables except for strings.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.EqualityAdapter.PredicateEqualityAdapter`2.AreEqual(System.Object,System.Object)\">\n            <summary>\n            Compares two objects, returning true if they are equal\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.EqualityAdapter.GenericEqualityAdapter`1.CanCompare(System.Object,System.Object)\">\n            <summary>\n            Returns true if the two objects can be compared by this adapter.\n            Generic adapter requires objects of the specified type.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.EqualityAdapter.ComparerAdapter`1\">\n            <summary>\n            <see cref=\"T:NUnit.Framework.Constraints.EqualityAdapter\"/> that wraps an <see cref=\"T:System.Collections.IComparer\"/>.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.EmptyCollectionConstraint\">\n            <summary>\n            EmptyCollectionConstraint tests whether a collection is empty. \n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.EmptyCollectionConstraint.Matches(System.Collections.IEnumerable)\">\n            <summary>\n            Check that the collection is empty\n            </summary>\n            <param name=\"collection\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.EmptyCollectionConstraint.Description\">\n            <summary>\n            The Description of what this constraint tests, for\n            use in messages and in the ConstraintResult.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.ConstraintFactory\">\n            <summary>\n            Helper class with properties and methods that supply\n            a number of constraints used in Asserts.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.Exactly(System.Int32)\">\n            <summary>\n            Returns a ConstraintExpression, which will apply\n            the following constraint to all members of a collection,\n            succeeding only if a specified number of them succeed.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.Property(System.String)\">\n            <summary>\n            Returns a new PropertyConstraintExpression, which will either\n            test for the existence of the named property on the object\n            being tested or apply any following constraint to that property.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.Attribute(System.Type)\">\n            <summary>\n            Returns a new AttributeConstraint checking for the\n            presence of a particular attribute on an object.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.Attribute``1\">\n            <summary>\n            Returns a new AttributeConstraint checking for the\n            presence of a particular attribute on an object.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.EqualTo(System.Object)\">\n            <summary>\n            Returns a constraint that tests two items for equality\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.SameAs(System.Object)\">\n            <summary>\n            Returns a constraint that tests that two references are the same object\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.GreaterThan(System.Object)\">\n            <summary>\n            Returns a constraint that tests whether the\n            actual value is greater than the supplied argument\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.GreaterThanOrEqualTo(System.Object)\">\n            <summary>\n            Returns a constraint that tests whether the\n            actual value is greater than or equal to the supplied argument\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.AtLeast(System.Object)\">\n            <summary>\n            Returns a constraint that tests whether the\n            actual value is greater than or equal to the supplied argument\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.LessThan(System.Object)\">\n            <summary>\n            Returns a constraint that tests whether the\n            actual value is less than the supplied argument\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.LessThanOrEqualTo(System.Object)\">\n            <summary>\n            Returns a constraint that tests whether the\n            actual value is less than or equal to the supplied argument\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.AtMost(System.Object)\">\n            <summary>\n            Returns a constraint that tests whether the\n            actual value is less than or equal to the supplied argument\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.TypeOf(System.Type)\">\n            <summary>\n            Returns a constraint that tests whether the actual\n            value is of the exact type supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.TypeOf``1\">\n            <summary>\n            Returns a constraint that tests whether the actual\n            value is of the exact type supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.InstanceOf(System.Type)\">\n            <summary>\n            Returns a constraint that tests whether the actual value\n            is of the type supplied as an argument or a derived type.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.InstanceOf``1\">\n            <summary>\n            Returns a constraint that tests whether the actual value\n            is of the type supplied as an argument or a derived type.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.AssignableFrom(System.Type)\">\n            <summary>\n            Returns a constraint that tests whether the actual value\n            is assignable from the type supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.AssignableFrom``1\">\n            <summary>\n            Returns a constraint that tests whether the actual value\n            is assignable from the type supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.AssignableTo(System.Type)\">\n            <summary>\n            Returns a constraint that tests whether the actual value\n            is assignable from the type supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.AssignableTo``1\">\n            <summary>\n            Returns a constraint that tests whether the actual value\n            is assignable from the type supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.EquivalentTo(System.Collections.IEnumerable)\">\n            <summary>\n            Returns a constraint that tests whether the actual value\n            is a collection containing the same elements as the \n            collection supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.SubsetOf(System.Collections.IEnumerable)\">\n            <summary>\n            Returns a constraint that tests whether the actual value\n            is a subset of the collection supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.SupersetOf(System.Collections.IEnumerable)\">\n            <summary>\n            Returns a constraint that tests whether the actual value\n            is a superset of the collection supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.Member(System.Object)\">\n            <summary>\n            Returns a new CollectionContainsConstraint checking for the\n            presence of a particular object in the collection.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.Contains(System.Object)\">\n            <summary>\n            Returns a new CollectionContainsConstraint checking for the\n            presence of a particular object in the collection.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.Contains(System.String)\">\n            <summary>\n            Returns a new ContainsConstraint. This constraint\n            will, in turn, make use of the appropriate second-level\n            constraint, depending on the type of the actual argument. \n            This overload is only used if the item sought is a string,\n            since any other type implies that we are looking for a \n            collection member.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.StringContaining(System.String)\">\n            <summary>\n            Returns a constraint that succeeds if the actual\n            value contains the substring supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.ContainsSubstring(System.String)\">\n            <summary>\n            Returns a constraint that succeeds if the actual\n            value contains the substring supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.DoesNotContain(System.String)\">\n            <summary>\n            Returns a constraint that fails if the actual\n            value contains the substring supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.StartWith(System.String)\">\n            <summary>\n            Returns a constraint that succeeds if the actual\n            value starts with the substring supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.StartsWith(System.String)\">\n            <summary>\n            Returns a constraint that succeeds if the actual\n            value starts with the substring supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.StringStarting(System.String)\">\n            <summary>\n            Returns a constraint that succeeds if the actual\n            value starts with the substring supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.DoesNotStartWith(System.String)\">\n            <summary>\n            Returns a constraint that fails if the actual\n            value starts with the substring supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.EndWith(System.String)\">\n            <summary>\n            Returns a constraint that succeeds if the actual\n            value ends with the substring supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.EndsWith(System.String)\">\n            <summary>\n            Returns a constraint that succeeds if the actual\n            value ends with the substring supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.StringEnding(System.String)\">\n            <summary>\n            Returns a constraint that succeeds if the actual\n            value ends with the substring supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.DoesNotEndWith(System.String)\">\n            <summary>\n            Returns a constraint that fails if the actual\n            value ends with the substring supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.Match(System.String)\">\n            <summary>\n            Returns a constraint that succeeds if the actual\n            value matches the regular expression supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.Matches(System.String)\">\n            <summary>\n            Returns a constraint that succeeds if the actual\n            value matches the regular expression supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.StringMatching(System.String)\">\n            <summary>\n            Returns a constraint that succeeds if the actual\n            value matches the regular expression supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.DoesNotMatch(System.String)\">\n            <summary>\n            Returns a constraint that fails if the actual\n            value matches the pattern supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.SamePath(System.String)\">\n            <summary>\n            Returns a constraint that tests whether the path provided \n            is the same as an expected path after canonicalization.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.SubPathOf(System.String)\">\n            <summary>\n            Returns a constraint that tests whether the path provided \n            is a subpath of the expected path after canonicalization.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.SamePathOrUnder(System.String)\">\n            <summary>\n            Returns a constraint that tests whether the path provided \n            is the same path or under an expected path after canonicalization.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintFactory.InRange(System.IComparable,System.IComparable)\">\n            <summary>\n            Returns a constraint that tests whether the actual value falls \n            within a specified range.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintFactory.Not\">\n            <summary>\n            Returns a ConstraintExpression that negates any\n            following constraint.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintFactory.No\">\n            <summary>\n            Returns a ConstraintExpression that negates any\n            following constraint.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintFactory.All\">\n            <summary>\n            Returns a ConstraintExpression, which will apply\n            the following constraint to all members of a collection,\n            succeeding if all of them succeed.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintFactory.Some\">\n            <summary>\n            Returns a ConstraintExpression, which will apply\n            the following constraint to all members of a collection,\n            succeeding if at least one of them succeeds.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintFactory.None\">\n            <summary>\n            Returns a ConstraintExpression, which will apply\n            the following constraint to all members of a collection,\n            succeeding if all of them fail.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintFactory.Length\">\n            <summary>\n            Returns a new ConstraintExpression, which will apply the following\n            constraint to the Length property of the object being tested.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintFactory.Count\">\n            <summary>\n            Returns a new ConstraintExpression, which will apply the following\n            constraint to the Count property of the object being tested.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintFactory.Message\">\n            <summary>\n            Returns a new ConstraintExpression, which will apply the following\n            constraint to the Message property of the object being tested.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintFactory.InnerException\">\n            <summary>\n            Returns a new ConstraintExpression, which will apply the following\n            constraint to the InnerException property of the object being tested.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintFactory.Null\">\n            <summary>\n            Returns a constraint that tests for null\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintFactory.True\">\n            <summary>\n            Returns a constraint that tests for True\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintFactory.False\">\n            <summary>\n            Returns a constraint that tests for False\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintFactory.Positive\">\n            <summary>\n            Returns a constraint that tests for a positive value\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintFactory.Negative\">\n            <summary>\n            Returns a constraint that tests for a negative value\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintFactory.Zero\">\n            <summary>\n            Returns a constraint that tests for equality with zero\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintFactory.NaN\">\n            <summary>\n            Returns a constraint that tests for NaN\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintFactory.Empty\">\n            <summary>\n            Returns a constraint that tests for empty\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintFactory.Unique\">\n            <summary>\n            Returns a constraint that tests whether a collection \n            contains all unique items.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintFactory.BinarySerializable\">\n            <summary>\n            Returns a constraint that tests whether an object graph is serializable in binary format.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintFactory.XmlSerializable\">\n            <summary>\n            Returns a constraint that tests whether an object graph is serializable in xml format.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintFactory.Ordered\">\n            <summary>\n            Returns a constraint that tests whether a collection is ordered\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.BinarySerializableConstraint\">\n            <summary>\n            BinarySerializableConstraint tests whether \n            an object is serializable in binary format.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.BinarySerializableConstraint.ApplyTo(System.Object)\">\n            <summary>\n            Test whether the constraint is satisfied by a given value\n            </summary>\n            <param name=\"actual\">The value to be tested</param>\n            <returns>True for success, false for failure</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.BinarySerializableConstraint.GetStringRepresentation\">\n            <summary>\n            Returns the string representation\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.BinarySerializableConstraint.Description\">\n            <summary>\n            The Description of what this constraint tests, for\n            use in messages and in the ConstraintResult.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.TimeoutAttribute\">\n            <summary>\n            Used on a method, marks the test with a timeout value in milliseconds. \n            The test will be run in a separate thread and is cancelled if the timeout \n            is exceeded. Used on a class or assembly, sets the default timeout \n            for all contained test methods.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TimeoutAttribute.#ctor(System.Int32)\">\n            <summary>\n            Construct a TimeoutAttribute given a time in milliseconds\n            </summary>\n            <param name=\"timeout\">The timeout value in milliseconds</param>\n        </member>\n        <member name=\"T:NUnit.Framework.TestAttribute\">\n            <summary>\n            Adding this attribute to a method within a <seealso cref=\"T:NUnit.Framework.TestFixtureAttribute\"/> \n            class makes the method callable from the NUnit test runner. There is a property \n            called Description which is optional which you can provide a more detailed test\n            description. This class cannot be inherited.\n            </summary>\n            \n            <example>\n            [TestFixture]\n            public class Fixture\n            {\n              [Test]\n              public void MethodToTest()\n              {}\n              \n              [Test(Description = \"more detailed description\")]\n              public void TestDescriptionMethod()\n              {}\n            }\n            </example>\n            \n        </member>\n        <member name=\"M:NUnit.Framework.TestAttribute.ApplyToTest(NUnit.Framework.Internal.Test)\">\n            <summary>\n            Modifies a test by adding a description, if not already set.\n            </summary>\n            <param name=\"test\">The test to modify</param>\n        </member>\n        <member name=\"M:NUnit.Framework.TestAttribute.BuildFrom(NUnit.Framework.Interfaces.IMethodInfo,NUnit.Framework.Internal.Test)\">\n            <summary>\n            Construct a TestMethod from a given method.\n            </summary>\n            <param name=\"method\">The method for which a test is to be constructed.</param>\n            <param name=\"suite\">The suite to which the test will be added.</param>\n            <returns>A TestMethod</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.TestAttribute.Description\">\n            <summary>\n            Descriptive text for this test\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestAttribute.Author\">\n            <summary>\n            The author of this test\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestAttribute.TestOf\">\n            <summary>\n            The type that this test is testing\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestAttribute.ExpectedResult\">\n            <summary>\n            Gets or sets the expected result.\n            </summary>\n            <value>The result.</value>\n        </member>\n        <member name=\"P:NUnit.Framework.TestAttribute.HasExpectedResult\">\n            <summary>\n            Returns true if an expected result has been set\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.SetUICultureAttribute\">\n            <summary>\n            Summary description for SetUICultureAttribute.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.SetUICultureAttribute.#ctor(System.String)\">\n            <summary>\n            Construct given the name of a culture\n            </summary>\n            <param name=\"culture\"></param>\n        </member>\n        <member name=\"T:NUnit.Framework.RequiresSTAAttribute\">\n            <summary>\n            Marks a test that must run in the STA, causing it\n            to run in a separate thread if necessary.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.RequiresSTAAttribute.#ctor\">\n            <summary>\n            Construct a RequiresSTAAttribute\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.DatapointsAttribute\">\n            <summary>\n            Used to mark a field, property or method providing a set of datapoints to \n            be used in executing any theories within the same fixture that require an \n            argument of the Type provided. The data source may provide an array of\n            the required Type or an <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/>.\n            Synonymous with DatapointSourceAttribute.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Commands.TestActionItem\">\n            <summary>\n            TestActionItem represents a single execution of an\n            ITestAction. It is used to track whether the BeforeTest\n            method has been called and suppress calling the\n            AfterTest method if it has not.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Commands.TestActionItem.#ctor(NUnit.Framework.ITestAction)\">\n            <summary>\n            Construct a TestActionItem\n            </summary>\n            <param name=\"action\">The ITestAction to be included</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Commands.TestActionItem.BeforeTest(NUnit.Framework.Interfaces.ITest)\">\n            <summary>\n            Run the BeforeTest method of the action and remember that it has been run.\n            </summary>\n            <param name=\"test\">The test to which the action applies</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Commands.TestActionItem.AfterTest(NUnit.Framework.Interfaces.ITest)\">\n            <summary>\n            Run the AfterTest action, but only if the BeforeTest\n            action was actually run.\n            </summary>\n            <param name=\"test\">The test to which the action applies</param>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.InternalTraceLevel\">\n            <summary>\n            InternalTraceLevel is an enumeration controlling the\n            level of detailed presented in the internal log.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.InternalTraceLevel.Default\">\n            <summary>\n            Use the default settings as specified by the user.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.InternalTraceLevel.Off\">\n            <summary>\n            Do not display any trace messages\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.InternalTraceLevel.Error\">\n            <summary>\n            Display Error messages only\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.InternalTraceLevel.Warning\">\n            <summary>\n            Display Warning level and higher messages\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.InternalTraceLevel.Info\">\n            <summary>\n            Display informational and higher messages\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.InternalTraceLevel.Debug\">\n            <summary>\n            Display debug messages and higher - i.e. all messages\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.InternalTraceLevel.Verbose\">\n            <summary>\n            Display debug messages and higher - i.e. all messages\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.ParallelScope\">\n            <summary>\n            The ParallelScope enumeration permits specifying the degree to\n            which a test and its descendants may be run in parallel.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.ParallelScope.None\">\n            <summary>\n            No Parallelism is permitted\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.ParallelScope.Self\">\n            <summary>\n            The test itself may be run in parallel with others at the same level\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.ParallelScope.Children\">\n            <summary>\n            Descendants of the test may be run in parallel with one another\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.ParallelScope.Fixtures\">\n            <summary>\n            Descendants of the test down to the level of TestFixtures may be run in parallel\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.ListMapper\">\n            <summary>\n            ListMapper is used to transform a collection used as an actual argument\n            producing another collection to be used in the assertion.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.ListMapper.#ctor(System.Collections.ICollection)\">\n            <summary>\n            Construct a ListMapper based on a collection\n            </summary>\n            <param name=\"original\">The collection to be transformed</param>\n        </member>\n        <member name=\"M:NUnit.Framework.ListMapper.Property(System.String)\">\n            <summary>\n            Produces a collection containing all the _values of a property\n            </summary>\n            <param name=\"name\">The collection of property _values</param>\n            <returns></returns>\n        </member>\n        <member name=\"T:NUnit.Framework.List\">\n            <summary>\n            The List class is a helper class with properties and methods\n            that supply a number of constraints used with lists and collections.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.List.Map(System.Collections.ICollection)\">\n            <summary>\n            List.Map returns a ListMapper, which can be used to map\n            the original collection to another collection.\n            </summary>\n            <param name=\"actual\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.TestAssembly\">\n            <summary>\n            TestAssembly is a TestSuite that represents the execution\n            of tests in a managed assembly.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestAssembly.#ctor(System.Reflection.Assembly,System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Internal.TestAssembly\"/> class\n            specifying the Assembly and the path from which it was loaded.\n            </summary>\n            <param name=\"assembly\">The assembly this test represents.</param>\n            <param name=\"path\">The path used to load the assembly.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestAssembly.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Internal.TestAssembly\"/> class\n            for a path which could not be loaded.\n            </summary>\n            <param name=\"path\">The path used to load the assembly.</param>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestAssembly.Assembly\">\n            <summary>\n            Gets the Assembly represented by this instance.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestAssembly.TestType\">\n            <summary>\n            Gets the name used for the top-level element in the\n            XML representation of this test\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.SetUpFixture\">\n            <summary>\n            SetUpFixture extends TestSuite and supports\n            Setup and TearDown methods.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.SetUpFixture.#ctor(NUnit.Framework.Interfaces.ITypeInfo)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Internal.SetUpFixture\"/> class.\n            </summary>\n            <param name=\"type\">The type.</param>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.TrueConstraint\">\n            <summary>\n            TrueConstraint tests that the actual value is true\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.TrueConstraint.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Constraints.TrueConstraint\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.TrueConstraint.ApplyTo(System.Object)\">\n            <summary>\n            Test whether the constraint is satisfied by a given value\n            </summary>\n            <param name=\"actual\">The value to be tested</param>\n            <returns>True for success, false for failure</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.Tolerance\">\n            <summary>\n            The Tolerance class generalizes the notion of a tolerance\n            within which an equality test succeeds. Normally, it is\n            used with numeric types, but it can be used with any\n            type that supports taking a difference between two \n            objects and comparing that difference to a value.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.Tolerance.#ctor(System.Object)\">\n            <summary>\n            Constructs a linear tolerance of a specified amount\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.Tolerance.#ctor(System.Object,NUnit.Framework.Constraints.ToleranceMode)\">\n            <summary>\n            Constructs a tolerance given an amount and <see cref=\"T:NUnit.Framework.Constraints.ToleranceMode\"/>\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.Tolerance.CheckLinearAndNumeric\">\n            <summary>\n            Tests that the current Tolerance is linear with a \n            numeric value, throwing an exception if it is not.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.Tolerance.Default\">\n            <summary>\n            Returns a default Tolerance object, equivalent to \n            specifying an exact match unless <see cref=\"F:NUnit.Framework.GlobalSettings.DefaultFloatingPointTolerance\"/>\n            is set, in which case, the <see cref=\"F:NUnit.Framework.GlobalSettings.DefaultFloatingPointTolerance\"/>\n            will be used.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.Tolerance.Exact\">\n            <summary>\n            Returns an empty Tolerance object, equivalent to \n            specifying an exact match even if \n            <see cref=\"F:NUnit.Framework.GlobalSettings.DefaultFloatingPointTolerance\"/> is set.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.Tolerance.Mode\">\n            <summary>\n            Gets the <see cref=\"T:NUnit.Framework.Constraints.ToleranceMode\"/> for the current Tolerance\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.Tolerance.Value\">\n            <summary>\n            Gets the value of the current Tolerance instance.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.Tolerance.Percent\">\n            <summary>\n            Returns a new tolerance, using the current amount as a percentage.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.Tolerance.Ulps\">\n            <summary>\n            Returns a new tolerance, using the current amount in Ulps\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.Tolerance.Days\">\n            <summary>\n            Returns a new tolerance with a <see cref=\"T:System.TimeSpan\"/> as the amount, using \n            the current amount as a number of days.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.Tolerance.Hours\">\n            <summary>\n            Returns a new tolerance with a <see cref=\"T:System.TimeSpan\"/> as the amount, using \n            the current amount as a number of hours.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.Tolerance.Minutes\">\n            <summary>\n            Returns a new tolerance with a <see cref=\"T:System.TimeSpan\"/> as the amount, using \n            the current amount as a number of minutes.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.Tolerance.Seconds\">\n            <summary>\n            Returns a new tolerance with a <see cref=\"T:System.TimeSpan\"/> as the amount, using \n            the current amount as a number of seconds.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.Tolerance.Milliseconds\">\n            <summary>\n            Returns a new tolerance with a <see cref=\"T:System.TimeSpan\"/> as the amount, using \n            the current amount as a number of milliseconds.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.Tolerance.Ticks\">\n            <summary>\n            Returns a new tolerance with a <see cref=\"T:System.TimeSpan\"/> as the amount, using \n            the current amount as a number of clock ticks.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.Tolerance.IsUnsetOrDefault\">\n            <summary>\n            Returns true if the current tolerance has not been set or is using the .\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.StartsWithConstraint\">\n            <summary>\n            StartsWithConstraint can test whether a string starts\n            with an expected substring.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.StartsWithConstraint.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Constraints.StartsWithConstraint\"/> class.\n            </summary>\n            <param name=\"expected\">The expected string</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.StartsWithConstraint.Matches(System.String)\">\n            <summary>\n            Test whether the constraint is matched by the actual value.\n            This is a template method, which calls the IsMatch method\n            of the derived class.\n            </summary>\n            <param name=\"actual\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.ThrowsOperator\">\n            <summary>\n            Operator that tests that an exception is thrown and\n            optionally applies further tests to the exception.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ThrowsOperator.#ctor\">\n            <summary>\n            Construct a ThrowsOperator\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ThrowsOperator.Reduce(NUnit.Framework.Constraints.ConstraintBuilder.ConstraintStack)\">\n            <summary>\n            Reduce produces a constraint from the operator and \n            any arguments. It takes the arguments from the constraint \n            stack and pushes the resulting constraint on it.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.ConstraintExpression\">\n            <summary>\n            ConstraintExpression represents a compound constraint in the \n            process of being constructed from a series of syntactic elements.\n            \n            Individual elements are appended to the expression as they are\n            reorganized. When a constraint is appended, it is returned as the\n            value of the operation so that modifiers may be applied. However,\n            any partially built expression is attached to the constraint for\n            later resolution. When an operator is appended, the partial\n            expression is returned. If it's a self-resolving operator, then\n            a ResolvableConstraintExpression is returned.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.ConstraintExpression.builder\">\n            <summary>\n            The ConstraintBuilder holding the elements recognized so far\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Constraints.ConstraintExpression\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.#ctor(NUnit.Framework.Constraints.ConstraintBuilder)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Constraints.ConstraintExpression\"/> \n            class passing in a ConstraintBuilder, which may be pre-populated.\n            </summary>\n            <param name=\"builder\">The builder.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.ToString\">\n            <summary>\n            Returns a string representation of the expression as it\n            currently stands. This should only be used for testing,\n            since it has the side-effect of resolving the expression.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.Append(NUnit.Framework.Constraints.ConstraintOperator)\">\n            <summary>\n            Appends an operator to the expression and returns the\n            resulting expression itself.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.Append(NUnit.Framework.Constraints.SelfResolvingOperator)\">\n            <summary>\n            Appends a self-resolving operator to the expression and\n            returns a new ResolvableConstraintExpression.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.Append(NUnit.Framework.Constraints.Constraint)\">\n            <summary>\n            Appends a constraint to the expression and returns that\n            constraint, which is associated with the current state\n            of the expression being built. Note that the constraint\n            is not reduced at this time. For example, if there \n            is a NotOperator on the stack we don't reduce and\n            return a NotConstraint. The original constraint must\n            be returned because it may support modifiers that\n            are yet to be applied.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.Exactly(System.Int32)\">\n            <summary>\n            Returns a ConstraintExpression, which will apply\n            the following constraint to all members of a collection,\n            succeeding only if a specified number of them succeed.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.Property(System.String)\">\n            <summary>\n            Returns a new PropertyConstraintExpression, which will either\n            test for the existence of the named property on the object\n            being tested or apply any following constraint to that property.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.Attribute(System.Type)\">\n            <summary>\n            Returns a new AttributeConstraint checking for the\n            presence of a particular attribute on an object.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.Attribute``1\">\n            <summary>\n            Returns a new AttributeConstraint checking for the\n            presence of a particular attribute on an object.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.Matches(NUnit.Framework.Constraints.IResolveConstraint)\">\n            <summary>\n            Returns the constraint provided as an argument - used to allow custom\n            custom constraints to easily participate in the syntax.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.Matches``1(System.Predicate{``0})\">\n            <summary>\n            Returns the constraint provided as an argument - used to allow custom\n            custom constraints to easily participate in the syntax.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.EqualTo(System.Object)\">\n            <summary>\n            Returns a constraint that tests two items for equality\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.SameAs(System.Object)\">\n            <summary>\n            Returns a constraint that tests that two references are the same object\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.GreaterThan(System.Object)\">\n            <summary>\n            Returns a constraint that tests whether the\n            actual value is greater than the supplied argument\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.GreaterThanOrEqualTo(System.Object)\">\n            <summary>\n            Returns a constraint that tests whether the\n            actual value is greater than or equal to the supplied argument\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.AtLeast(System.Object)\">\n            <summary>\n            Returns a constraint that tests whether the\n            actual value is greater than or equal to the supplied argument\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.LessThan(System.Object)\">\n            <summary>\n            Returns a constraint that tests whether the\n            actual value is less than the supplied argument\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.LessThanOrEqualTo(System.Object)\">\n            <summary>\n            Returns a constraint that tests whether the\n            actual value is less than or equal to the supplied argument\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.AtMost(System.Object)\">\n            <summary>\n            Returns a constraint that tests whether the\n            actual value is less than or equal to the supplied argument\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.TypeOf(System.Type)\">\n            <summary>\n            Returns a constraint that tests whether the actual\n            value is of the exact type supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.TypeOf``1\">\n            <summary>\n            Returns a constraint that tests whether the actual\n            value is of the exact type supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.InstanceOf(System.Type)\">\n            <summary>\n            Returns a constraint that tests whether the actual value\n            is of the type supplied as an argument or a derived type.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.InstanceOf``1\">\n            <summary>\n            Returns a constraint that tests whether the actual value\n            is of the type supplied as an argument or a derived type.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.AssignableFrom(System.Type)\">\n            <summary>\n            Returns a constraint that tests whether the actual value\n            is assignable from the type supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.AssignableFrom``1\">\n            <summary>\n            Returns a constraint that tests whether the actual value\n            is assignable from the type supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.AssignableTo(System.Type)\">\n            <summary>\n            Returns a constraint that tests whether the actual value\n            is assignable from the type supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.AssignableTo``1\">\n            <summary>\n            Returns a constraint that tests whether the actual value\n            is assignable from the type supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.EquivalentTo(System.Collections.IEnumerable)\">\n            <summary>\n            Returns a constraint that tests whether the actual value\n            is a collection containing the same elements as the \n            collection supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.SubsetOf(System.Collections.IEnumerable)\">\n            <summary>\n            Returns a constraint that tests whether the actual value\n            is a subset of the collection supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.SupersetOf(System.Collections.IEnumerable)\">\n            <summary>\n            Returns a constraint that tests whether the actual value\n            is a superset of the collection supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.Member(System.Object)\">\n            <summary>\n            Returns a new CollectionContainsConstraint checking for the\n            presence of a particular object in the collection.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.Contains(System.Object)\">\n            <summary>\n            Returns a new CollectionContainsConstraint checking for the\n            presence of a particular object in the collection.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.Contains(System.String)\">\n            <summary>\n            Returns a new ContainsConstraint. This constraint\n            will, in turn, make use of the appropriate second-level\n            constraint, depending on the type of the actual argument. \n            This overload is only used if the item sought is a string,\n            since any other type implies that we are looking for a \n            collection member.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.Contain(System.String)\">\n            <summary>\n            Returns a new ContainsConstraint. This constraint\n            will, in turn, make use of the appropriate second-level\n            constraint, depending on the type of the actual argument. \n            This overload is only used if the item sought is a string,\n            since any other type implies that we are looking for a \n            collection member.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.StringContaining(System.String)\">\n            <summary>\n            Returns a constraint that succeeds if the actual\n            value contains the substring supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.ContainsSubstring(System.String)\">\n            <summary>\n            Returns a constraint that succeeds if the actual\n            value contains the substring supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.StartWith(System.String)\">\n            <summary>\n            Returns a constraint that succeeds if the actual\n            value starts with the substring supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.StartsWith(System.String)\">\n            <summary>\n            Returns a constraint that succeeds if the actual\n            value starts with the substring supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.StringStarting(System.String)\">\n            <summary>\n            Returns a constraint that succeeds if the actual\n            value starts with the substring supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.EndWith(System.String)\">\n            <summary>\n            Returns a constraint that succeeds if the actual\n            value ends with the substring supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.EndsWith(System.String)\">\n            <summary>\n            Returns a constraint that succeeds if the actual\n            value ends with the substring supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.StringEnding(System.String)\">\n            <summary>\n            Returns a constraint that succeeds if the actual\n            value ends with the substring supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.Match(System.String)\">\n            <summary>\n            Returns a constraint that succeeds if the actual\n            value matches the regular expression supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.Matches(System.String)\">\n            <summary>\n            Returns a constraint that succeeds if the actual\n            value matches the regular expression supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.StringMatching(System.String)\">\n            <summary>\n            Returns a constraint that succeeds if the actual\n            value matches the regular expression supplied as an argument.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.SamePath(System.String)\">\n            <summary>\n            Returns a constraint that tests whether the path provided \n            is the same as an expected path after canonicalization.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.SubPathOf(System.String)\">\n            <summary>\n            Returns a constraint that tests whether the path provided \n            is the a subpath of the expected path after canonicalization.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.SamePathOrUnder(System.String)\">\n            <summary>\n            Returns a constraint that tests whether the path provided \n            is the same path or under an expected path after canonicalization.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ConstraintExpression.InRange(System.IComparable,System.IComparable)\">\n            <summary>\n            Returns a constraint that tests whether the actual value falls \n            within a specified range.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintExpression.Not\">\n            <summary>\n            Returns a ConstraintExpression that negates any\n            following constraint.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintExpression.No\">\n            <summary>\n            Returns a ConstraintExpression that negates any\n            following constraint.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintExpression.All\">\n            <summary>\n            Returns a ConstraintExpression, which will apply\n            the following constraint to all members of a collection,\n            succeeding if all of them succeed.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintExpression.Some\">\n            <summary>\n            Returns a ConstraintExpression, which will apply\n            the following constraint to all members of a collection,\n            succeeding if at least one of them succeeds.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintExpression.None\">\n            <summary>\n            Returns a ConstraintExpression, which will apply\n            the following constraint to all members of a collection,\n            succeeding if all of them fail.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintExpression.Length\">\n            <summary>\n            Returns a new ConstraintExpression, which will apply the following\n            constraint to the Length property of the object being tested.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintExpression.Count\">\n            <summary>\n            Returns a new ConstraintExpression, which will apply the following\n            constraint to the Count property of the object being tested.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintExpression.Message\">\n            <summary>\n            Returns a new ConstraintExpression, which will apply the following\n            constraint to the Message property of the object being tested.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintExpression.InnerException\">\n            <summary>\n            Returns a new ConstraintExpression, which will apply the following\n            constraint to the InnerException property of the object being tested.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintExpression.With\">\n            <summary>\n            With is currently a NOP - reserved for future use.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintExpression.Null\">\n            <summary>\n            Returns a constraint that tests for null\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintExpression.True\">\n            <summary>\n            Returns a constraint that tests for True\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintExpression.False\">\n            <summary>\n            Returns a constraint that tests for False\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintExpression.Positive\">\n            <summary>\n            Returns a constraint that tests for a positive value\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintExpression.Negative\">\n            <summary>\n            Returns a constraint that tests for a negative value\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintExpression.Zero\">\n            <summary>\n            Returns a constraint that tests if item is equal to zero\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintExpression.NaN\">\n            <summary>\n            Returns a constraint that tests for NaN\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintExpression.Empty\">\n            <summary>\n            Returns a constraint that tests for empty\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintExpression.Unique\">\n            <summary>\n            Returns a constraint that tests whether a collection \n            contains all unique items.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintExpression.BinarySerializable\">\n            <summary>\n            Returns a constraint that tests whether an object graph is serializable in binary format.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintExpression.XmlSerializable\">\n            <summary>\n            Returns a constraint that tests whether an object graph is serializable in xml format.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintExpression.Ordered\">\n            <summary>\n            Returns a constraint that tests whether a collection is ordered\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ConstraintExpression.Exist\">\n            <summary>\n            Returns a constraint that succeeds if the value\n            is a file or directory and it exists.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.CategoryAttribute\">\n            <summary>\n            Attribute used to apply a category to a test\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.CategoryAttribute.categoryName\">\n            <summary>\n            The name of the category\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.CategoryAttribute.#ctor(System.String)\">\n            <summary>\n            Construct attribute for a given category based on\n            a name. The name may not contain the characters ',',\n            '+', '-' or '!'. However, this is not checked in the\n            constructor since it would cause an error to arise at\n            as the test was loaded without giving a clear indication\n            of where the problem is located. The error is handled\n            in NUnitFramework.cs by marking the test as not\n            runnable.\n            </summary>\n            <param name=\"name\">The name of the category</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CategoryAttribute.#ctor\">\n            <summary>\n            Protected constructor uses the Type name as the name\n            of the category.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.CategoryAttribute.ApplyToTest(NUnit.Framework.Internal.Test)\">\n            <summary>\n            Modifies a test by adding a category to it.\n            </summary>\n            <param name=\"test\">The test to modify</param>\n        </member>\n        <member name=\"P:NUnit.Framework.CategoryAttribute.Name\">\n            <summary>\n            The name of the category\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Filters.IdFilter\">\n            <summary>\n            IdFilter selects tests based on their id\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Filters.IdFilter.#ctor(System.String)\">\n            <summary>\n            Construct an IdFilter for a single value\n            </summary>\n            <param name=\"id\">The id the filter will recognize.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Filters.IdFilter.Match(NUnit.Framework.Interfaces.ITest)\">\n            <summary>\n            Match a test against a single value.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Filters.IdFilter.ElementName\">\n            <summary>\n            Gets the element name\n            </summary>\n            <value>Element name</value>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.NoneOperator\">\n            <summary>\n            Represents a constraint that succeeds if none of the \n            members of a collection match a base constraint.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.NoneOperator.ApplyPrefix(NUnit.Framework.Constraints.IConstraint)\">\n            <summary>\n            Returns a constraint that will apply the argument\n            to the members of a collection, succeeding if\n            none of them succeed.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.TestOfAttribute\">\n            <summary>\n            Indicates which class the test or test fixture is testing\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestOfAttribute.#ctor(System.Type)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.TestOfAttribute\"/> class.\n            </summary>\n            <param name=\"type\">The type that is being tested.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.TestOfAttribute.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.TestOfAttribute\"/> class.\n            </summary>\n            <param name=\"typeName\">The type that is being tested.</param>\n        </member>\n        <member name=\"T:NUnit.Framework.OrderAttribute\">\n            <summary>\n            Defines the order that the test will run in\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.OrderAttribute.Order\">\n            <summary>\n            Defines the order that the test will run in\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.OrderAttribute.#ctor(System.Int32)\">\n            <summary>\n            Defines the order that the test will run in\n            </summary>\n            <param name=\"order\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.OrderAttribute.ApplyToTest(NUnit.Framework.Internal.Test)\">\n            <summary>\n            Modifies a test as defined for the specific attribute.\n            </summary>\n            <param name=\"test\">The test to modify</param>\n        </member>\n        <member name=\"T:NUnit.Framework.SingleThreadedAttribute\">\n            <summary>\n            SingleThreadedAttribute applies to a test fixture and indicates\n            that all the child tests must be run on the same thread as the\n            OneTimeSetUp and OneTimeTearDown. It sets a flag in the\n            TestExecutionContext and forces all tests to be run sequentially\n            on the current thread. Any ParallelScope setting is ignored.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.SingleThreadedAttribute.ApplyToContext(NUnit.Framework.Internal.ITestExecutionContext)\">\n            <summary>\n            Apply changes to the TestExecutionContext\n            </summary>\n            <param name=\"context\">The TestExecutionContext</param>\n        </member>\n        <member name=\"T:NUnit.FrameworkPackageSettings\">\n            <summary>\n            FrameworkPackageSettings is a static class containing constant values that\n            are used as keys in setting up a TestPackage. These values are used in\n            the framework, and set in the runner. Setting values may be a string, int or bool.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.FrameworkPackageSettings.DebugTests\">\n            <summary>\n            Flag (bool) indicating whether tests are being debugged.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.FrameworkPackageSettings.PauseBeforeRun\">\n            <summary>\n            Flag (bool) indicating whether to pause execution of tests to allow\n            the user to attache a debugger.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.FrameworkPackageSettings.InternalTraceLevel\">\n            <summary>\n            The InternalTraceLevel for this run. Values are: \"Default\",\n            \"Off\", \"Error\", \"Warning\", \"Info\", \"Debug\", \"Verbose\".\n            Default is \"Off\". \"Debug\" and \"Verbose\" are synonyms.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.FrameworkPackageSettings.WorkDirectory\">\n            <summary>\n            Full path of the directory to be used for work and result files.\n            This path is provided to tests by the frameowrk TestContext.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.FrameworkPackageSettings.DefaultTimeout\">\n            <summary>\n            Integer value in milliseconds for the default timeout value\n            for test cases. If not specified, there is no timeout except\n            as specified by attributes on the tests themselves.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.FrameworkPackageSettings.InternalTraceWriter\">\n            <summary>\n            A TextWriter to which the internal trace will be sent.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.FrameworkPackageSettings.LOAD\">\n            <summary>\n            A list of tests to be loaded. \n            </summary>\n        </member>\n        <member name=\"F:NUnit.FrameworkPackageSettings.NumberOfTestWorkers\">\n            <summary>\n            The number of test threads to run for the assembly. If set to\n            1, a single queue is used. If set to 0, tests are executed\n            directly, without queuing.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.FrameworkPackageSettings.RandomSeed\">\n            <summary>\n            The random seed to be used for this assembly. If specified\n            as the value reported from a prior run, the framework should\n            generate identical random values for tests as were used for\n            that run, provided that no change has been made to the test\n            assembly. Default is a random value itself.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.FrameworkPackageSettings.StopOnError\">\n            <summary>\n            If true, execution stops after the first error or failure.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.FrameworkPackageSettings.SynchronousEvents\">\n            <summary>\n            If true, use of the event queue is suppressed and test events are synchronous.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.FrameworkPackageSettings.DefaultTestNamePattern\">\n            <summary>\n            The default naming pattern used in generating test names\n            </summary>\n        </member>\n        <member name=\"F:NUnit.FrameworkPackageSettings.TestParameters\">\n            <summary>\n            Parameters to be passed on to the test\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.ExactCountOperator\">\n            <summary>\n            Represents a constraint that succeeds if the specified \n            count of members of a collection match a base constraint.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ExactCountOperator.#ctor(System.Int32)\">\n            <summary>\n            Construct an ExactCountOperator for a specified count\n            </summary>\n            <param name=\"expectedCount\">The expected count</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ExactCountOperator.ApplyPrefix(NUnit.Framework.Constraints.IConstraint)\">\n            <summary>\n            Returns a constraint that will apply the argument\n            to the members of a collection, succeeding if\n            none of them succeed.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.ParameterizedFixtureSuite\">\n            <summary>\n            ParameterizedFixtureSuite serves as a container for the set of test \n            fixtures created from a given Type using various parameters.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.ParameterizedFixtureSuite.#ctor(NUnit.Framework.Interfaces.ITypeInfo)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Internal.ParameterizedFixtureSuite\"/> class.\n            </summary>\n            <param name=\"typeInfo\">The ITypeInfo for the type that represents the suite.</param>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.ParameterizedFixtureSuite.TestType\">\n            <summary>\n            Gets a string representing the type of test\n            </summary>\n            <value></value>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.ReusableConstraint\">\n            <summary>\n            ReusableConstraint wraps a constraint expression after\n            resolving it so that it can be reused consistently.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ReusableConstraint.#ctor(NUnit.Framework.Constraints.IResolveConstraint)\">\n            <summary>\n            Construct a ReusableConstraint from a constraint expression\n            </summary>\n            <param name=\"c\">The expression to be resolved and reused</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ReusableConstraint.op_Implicit(NUnit.Framework.Constraints.Constraint)~NUnit.Framework.Constraints.ReusableConstraint\">\n            <summary>\n            Converts a constraint to a ReusableConstraint\n            </summary>\n            <param name=\"c\">The constraint to be converted</param>\n            <returns>A ReusableConstraint</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ReusableConstraint.ToString\">\n            <summary>\n            Returns a <see cref=\"T:System.String\"/> that represents this instance.\n            </summary>\n            <returns>\n            A <see cref=\"T:System.String\"/> that represents this instance.\n            </returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ReusableConstraint.Resolve\">\n            <summary>\n            Return the top-level constraint for this expression\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.PropertyExistsConstraint\">\n            <summary>\n            PropertyExistsConstraint tests that a named property\n            exists on the object provided through Match.\n            \n            Originally, PropertyConstraint provided this feature\n            in addition to making optional tests on the value\n            of the property. The two constraints are now separate.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.PropertyExistsConstraint.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Constraints.PropertyExistsConstraint\"/> class.\n            </summary>\n            <param name=\"name\">The name of the property.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.PropertyExistsConstraint.ApplyTo(System.Object)\">\n            <summary>\n            Test whether the property exists for a given object\n            </summary>\n            <param name=\"actual\">The object to be tested</param>\n            <returns>True for success, false for failure</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.PropertyExistsConstraint.GetStringRepresentation\">\n            <summary>\n            Returns the string representation of the constraint.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.PropertyExistsConstraint.Description\">\n            <summary>\n            The Description of what this constraint tests, for\n            use in messages and in the ConstraintResult.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.PropertyConstraint\">\n            <summary>\n            PropertyConstraint extracts a named property and uses\n            its value as the actual value for a chained constraint.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.PropertyConstraint.#ctor(System.String,NUnit.Framework.Constraints.IConstraint)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Constraints.PropertyConstraint\"/> class.\n            </summary>\n            <param name=\"name\">The name.</param>\n            <param name=\"baseConstraint\">The constraint to apply to the property.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.PropertyConstraint.ApplyTo(System.Object)\">\n            <summary>\n            Test whether the constraint is satisfied by a given value\n            </summary>\n            <param name=\"actual\">The value to be tested</param>\n            <returns>True for success, false for failure</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.PropertyConstraint.GetStringRepresentation\">\n            <summary>\n            Returns the string representation of the constraint.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.WithOperator\">\n            <summary>\n            Represents a constraint that simply wraps the\n            constraint provided as an argument, without any\n            further functionality, but which modifies the\n            order of evaluation because of its precedence.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.WithOperator.#ctor\">\n            <summary>\n            Constructor for the WithOperator\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.WithOperator.ApplyPrefix(NUnit.Framework.Constraints.IConstraint)\">\n            <summary>\n            Returns a constraint that wraps its argument\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.NUnitComparer\">\n            <summary>\n            NUnitComparer encapsulates NUnit's default behavior\n            in comparing two objects.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.NUnitComparer.Compare(System.Object,System.Object)\">\n            <summary>\n            Compares two objects\n            </summary>\n            <param name=\"x\"></param>\n            <param name=\"y\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.NUnitComparer.Default\">\n            <summary>\n            Returns the default NUnitComparer.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.LessThanOrEqualConstraint\">\n            <summary>\n            Tests whether a value is less than or equal to the value supplied to its constructor\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.LessThanOrEqualConstraint.#ctor(System.Object)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Constraints.LessThanOrEqualConstraint\"/> class.\n            </summary>\n            <param name=\"expected\">The expected value.</param>\n        </member>\n        <member name=\"T:NUnit.Framework.TestFixtureSetUpAttribute\">\n            <summary>\n            Attribute used to identify a method that is \n            called before any tests in a fixture are run.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.DatapointAttribute\">\n            <summary>\n            Used to mark a field for use as a datapoint when executing a theory\n            within the same fixture that requires an argument of the field's Type.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.AssertionHelper\">\n            <summary>\n            AssertionHelper is an optional base class for user tests,\n            allowing the use of shorter ids for constraints and\n            asserts and avoiding conflict with the definition of \n            <see cref=\"T:NUnit.Framework.Is\"/>, from which it inherits much of its\n            behavior, in certain mock object frameworks.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.AssertionHelper.Expect(System.Boolean,System.String,System.Object[])\">\n            <summary>\n            Asserts that a condition is true. If the condition is false the method throws\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/>. Works Identically to \n            <see cref=\"M:NUnit.Framework.Assert.That(System.Boolean,System.String,System.Object[])\"/>.\n            </summary> \n            <param name=\"condition\">The evaluated condition</param>\n            <param name=\"message\">The message to display if the condition is false</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.AssertionHelper.Expect(System.Boolean)\">\n            <summary>\n            Asserts that a condition is true. If the condition is false the method throws\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/>. Works Identically to <see cref=\"M:NUnit.Framework.Assert.That(System.Boolean)\"/>.\n            </summary>\n            <param name=\"condition\">The evaluated condition</param>\n        </member>\n        <member name=\"M:NUnit.Framework.AssertionHelper.Expect``1(NUnit.Framework.Constraints.ActualValueDelegate{``0},NUnit.Framework.Constraints.IResolveConstraint)\">\n            <summary>\n            Apply a constraint to an actual value, succeeding if the constraint\n            is satisfied and throwing an assertion exception on failure.\n            </summary>\n            <param name=\"expr\">A Constraint expression to be applied</param>\n            <param name=\"del\">An ActualValueDelegate returning the value to be tested</param>\n        </member>\n        <member name=\"M:NUnit.Framework.AssertionHelper.Expect``1(NUnit.Framework.Constraints.ActualValueDelegate{``0},NUnit.Framework.Constraints.IResolveConstraint,System.String,System.Object[])\">\n            <summary>\n            Apply a constraint to an actual value, succeeding if the constraint\n            is satisfied and throwing an assertion exception on failure.\n            </summary>\n            <param name=\"del\">An ActualValueDelegate returning the value to be tested</param>\n            <param name=\"expr\">A Constraint expression to be applied</param>\n            <param name=\"message\">The message that will be displayed on failure</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.AssertionHelper.Expect(NUnit.Framework.TestDelegate,NUnit.Framework.Constraints.IResolveConstraint)\">\n            <summary>\n            Asserts that the code represented by a delegate throws an exception\n            that satisfies the constraint provided.\n            </summary>\n            <param name=\"code\">A TestDelegate to be executed</param>\n            <param name=\"constraint\">A ThrowsConstraint used in the test</param>\n        </member>\n        <member name=\"M:NUnit.Framework.AssertionHelper.Expect``1(``0,NUnit.Framework.Constraints.IResolveConstraint)\">\n            <summary>\n            Apply a constraint to an actual value, succeeding if the constraint\n            is satisfied and throwing an assertion exception on failure.\n            </summary>\n            <param name=\"expression\">A Constraint to be applied</param>\n            <param name=\"actual\">The actual value to test</param>\n        </member>\n        <member name=\"M:NUnit.Framework.AssertionHelper.Expect``1(``0,NUnit.Framework.Constraints.IResolveConstraint,System.String,System.Object[])\">\n            <summary>\n            Apply a constraint to an actual value, succeeding if the constraint\n            is satisfied and throwing an assertion exception on failure.\n            </summary>\n            <param name=\"expression\">A Constraint expression to be applied</param>\n            <param name=\"actual\">The actual value to test</param>\n            <param name=\"message\">The message that will be displayed on failure</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.AssertionHelper.Map(System.Collections.ICollection)\">\n            <summary>\n            Returns a ListMapper based on a collection.\n            </summary>\n            <param name=\"original\">The original collection</param>\n            <returns></returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.TextMessageWriter\">\n            <summary>\n            TextMessageWriter writes constraint descriptions and messages\n            in displayable form as a text stream. It tailors the display\n            of individual message components to form the standard message\n            format of NUnit assertion failure messages.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.TextMessageWriter.Pfx_Expected\">\n            <summary>\n            Prefix used for the expected value line of a message\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.TextMessageWriter.Pfx_Actual\">\n            <summary>\n            Prefix used for the actual value line of a message\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.TextMessageWriter.PrefixLength\">\n            <summary>\n            Length of a message prefix\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TextMessageWriter.#ctor\">\n            <summary>\n            Construct a TextMessageWriter\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TextMessageWriter.#ctor(System.String,System.Object[])\">\n            <summary>\n            Construct a TextMessageWriter, specifying a user message\n            and optional formatting arguments.\n            </summary>\n            <param name=\"userMessage\"></param>\n            <param name=\"args\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TextMessageWriter.WriteMessageLine(System.Int32,System.String,System.Object[])\">\n            <summary>\n            Method to write single line  message with optional args, usually\n            written to precede the general failure message, at a given \n            indentation level.\n            </summary>\n            <param name=\"level\">The indentation level of the message</param>\n            <param name=\"message\">The message to be written</param>\n            <param name=\"args\">Any arguments used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TextMessageWriter.DisplayDifferences(NUnit.Framework.Constraints.ConstraintResult)\">\n            <summary>\n            Display Expected and Actual lines for a constraint. This\n            is called by MessageWriter's default implementation of \n            WriteMessageTo and provides the generic two-line display. \n            </summary>\n            <param name=\"result\">The result of the constraint that failed</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TextMessageWriter.DisplayDifferences(System.Object,System.Object)\">\n            <summary>\n            Display Expected and Actual lines for given _values. This\n            method may be called by constraints that need more control over\n            the display of actual and expected _values than is provided\n            by the default implementation.\n            </summary>\n            <param name=\"expected\">The expected value</param>\n            <param name=\"actual\">The actual value causing the failure</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TextMessageWriter.DisplayDifferences(System.Object,System.Object,NUnit.Framework.Constraints.Tolerance)\">\n            <summary>\n            Display Expected and Actual lines for given _values, including\n            a tolerance value on the expected line.\n            </summary>\n            <param name=\"expected\">The expected value</param>\n            <param name=\"actual\">The actual value causing the failure</param>\n            <param name=\"tolerance\">The tolerance within which the test was made</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TextMessageWriter.DisplayStringDifferences(System.String,System.String,System.Int32,System.Boolean,System.Boolean)\">\n            <summary>\n            Display the expected and actual string _values on separate lines.\n            If the mismatch parameter is >=0, an additional line is displayed\n            line containing a caret that points to the mismatch point.\n            </summary>\n            <param name=\"expected\">The expected string value</param>\n            <param name=\"actual\">The actual string value</param>\n            <param name=\"mismatch\">The point at which the strings don't match or -1</param>\n            <param name=\"ignoreCase\">If true, case is ignored in string comparisons</param>\n            <param name=\"clipping\">If true, clip the strings to fit the max line length</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TextMessageWriter.WriteActualValue(System.Object)\">\n            <summary>\n            Writes the text for an actual value.\n            </summary>\n            <param name=\"actual\">The actual value.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TextMessageWriter.WriteValue(System.Object)\">\n            <summary>\n            Writes the text for a generalized value.\n            </summary>\n            <param name=\"val\">The value.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TextMessageWriter.WriteCollectionElements(System.Collections.IEnumerable,System.Int64,System.Int32)\">\n            <summary>\n            Writes the text for a collection value,\n            starting at a particular point, to a max length\n            </summary>\n            <param name=\"collection\">The collection containing elements to write.</param>\n            <param name=\"start\">The starting point of the elements to write</param>\n            <param name=\"max\">The maximum number of elements to write</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TextMessageWriter.WriteExpectedLine(NUnit.Framework.Constraints.ConstraintResult)\">\n            <summary>\n            Write the generic 'Expected' line for a constraint\n            </summary>\n            <param name=\"result\">The constraint that failed</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TextMessageWriter.WriteExpectedLine(System.Object)\">\n            <summary>\n            Write the generic 'Expected' line for a given value\n            </summary>\n            <param name=\"expected\">The expected value</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TextMessageWriter.WriteExpectedLine(System.Object,NUnit.Framework.Constraints.Tolerance)\">\n            <summary>\n            Write the generic 'Expected' line for a given value\n            and tolerance.\n            </summary>\n            <param name=\"expected\">The expected value</param>\n            <param name=\"tolerance\">The tolerance within which the test was made</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TextMessageWriter.WriteActualLine(NUnit.Framework.Constraints.ConstraintResult)\">\n            <summary>\n            Write the generic 'Actual' line for a constraint\n            </summary>\n            <param name=\"result\">The ConstraintResult for which the actual value is to be written</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TextMessageWriter.WriteActualLine(System.Object)\">\n            <summary>\n            Write the generic 'Actual' line for a given value\n            </summary>\n            <param name=\"actual\">The actual value causing a failure</param>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TextMessageWriter.MaxLineLength\">\n            <summary>\n            Gets or sets the maximum line length for this writer\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Execution.EventListenerTextWriter\">\n            <summary>\n            EventListenerTextWriter sends text output to the currently active\n            ITestEventListener in the form of a TestOutput object. If no event \n            listener is active in the contet, or if there is no context,\n            the output is forwarded to the supplied default writer.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Execution.EventListenerTextWriter.#ctor(System.String,System.IO.TextWriter)\">\n            <summary>\n            Construct an EventListenerTextWriter\n            </summary>\n            <param name=\"streamName\">The name of the stream to use for events</param>\n            <param name=\"defaultWriter\">The default writer to use if no listener is available</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Execution.EventListenerTextWriter.Write(System.Char)\">\n            <summary>\n            Write a single char\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Execution.EventListenerTextWriter.Write(System.String)\">\n            <summary>\n            Write a string\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Execution.EventListenerTextWriter.WriteLine(System.String)\">\n            <summary>\n            Write a string followed by a newline\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Execution.EventListenerTextWriter.Encoding\">\n            <summary>\n            Get the Encoding for this TextWriter\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.CollectionSupersetConstraint\">\n            <summary>\n            CollectionSupersetConstraint is used to determine whether\n            one collection is a superset of another\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.CollectionSupersetConstraint.#ctor(System.Collections.IEnumerable)\">\n            <summary>\n            Construct a CollectionSupersetConstraint\n            </summary>\n            <param name=\"expected\">The collection that the actual value is expected to be a superset of</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.CollectionSupersetConstraint.Matches(System.Collections.IEnumerable)\">\n            <summary>\n            Test whether the actual collection is a superset of \n            the expected collection provided.\n            </summary>\n            <param name=\"actual\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.CollectionSupersetConstraint.Using``2(System.Func{``0,``1,System.Boolean})\">\n            <summary>\n            Flag the constraint to use the supplied predicate function\n            </summary>\n            <param name=\"comparison\">The comparison function to use.</param>\n            <returns>Self.</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.CollectionSupersetConstraint.DisplayName\">\n            <summary> \n            The display name of this Constraint for use by ToString().\n            The default value is the name of the constraint with\n            trailing \"Constraint\" removed. Derived classes may set\n            this to another name in their constructors.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.CollectionSupersetConstraint.Description\">\n            <summary>\n            The Description of what this constraint tests, for\n            use in messages and in the ConstraintResult.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.ParameterizedMethodSuite\">\n            <summary>\n            ParameterizedMethodSuite holds a collection of individual\n            TestMethods with their arguments applied.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.ParameterizedMethodSuite.#ctor(NUnit.Framework.Interfaces.IMethodInfo)\">\n            <summary>\n            Construct from a MethodInfo\n            </summary>\n            <param name=\"method\"></param>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.ParameterizedMethodSuite.TestType\">\n            <summary>\n            Gets a string representing the type of test\n            </summary>\n            <value></value>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.OSPlatform\">\n            <summary>\n            OSPlatform represents a particular operating system platform\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.OSPlatform.UnixPlatformID_Microsoft\">\n            <summary>\n            Platform ID for Unix as defined by Microsoft .NET 2.0 and greater\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.OSPlatform.UnixPlatformID_Mono\">\n            <summary>\n            Platform ID for Unix as defined by Mono\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.OSPlatform.XBoxPlatformID\">\n            <summary>\n            Platform ID for XBox as defined by .NET and Mono, but not CF\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.OSPlatform.MacOSXPlatformID\">\n            <summary>\n            Platform ID for MacOSX as defined by .NET and Mono, but not CF\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.OSPlatform.GetWindows81PlusVersion(System.Version)\">\n            <summary>\n            Gets the actual OS Version, not the incorrect value that might be \n            returned for Win 8.1 and Win 10\n            </summary>\n            <remarks>\n            If an application is not manifested as Windows 8.1 or Windows 10,\n            the version returned from Environment.OSVersion will not be 6.3 and 10.0\n            respectively, but will be 6.2 and 6.3. The correct value can be found in\n            the registry.\n            </remarks>\n            <param name=\"version\">The original version</param>\n            <returns>The correct OS version</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.OSPlatform.#ctor(System.PlatformID,System.Version)\">\n            <summary>\n            Construct from a platform ID and version\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.OSPlatform.#ctor(System.PlatformID,System.Version,NUnit.Framework.Internal.OSPlatform.ProductType)\">\n            <summary>\n            Construct from a platform ID, version and product type\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.OSPlatform.CurrentPlatform\">\n            <summary>\n            Get the OSPlatform under which we are currently running\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.OSPlatform.Platform\">\n            <summary>\n            Get the platform ID of this instance\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.OSPlatform.Version\">\n            <summary>\n            Get the Version of this instance\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.OSPlatform.Product\">\n            <summary>\n            Get the Product Type of this instance\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.OSPlatform.IsWindows\">\n            <summary>\n            Return true if this is a windows platform\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.OSPlatform.IsUnix\">\n            <summary>\n            Return true if this is a Unix or Linux platform\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.OSPlatform.IsWin32S\">\n            <summary>\n            Return true if the platform is Win32S\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.OSPlatform.IsWin32Windows\">\n            <summary>\n            Return true if the platform is Win32Windows\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.OSPlatform.IsWin32NT\">\n            <summary>\n             Return true if the platform is Win32NT\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.OSPlatform.IsWinCE\">\n            <summary>\n            Return true if the platform is Windows CE\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.OSPlatform.IsXbox\">\n            <summary>\n            Return true if the platform is Xbox\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.OSPlatform.IsMacOSX\">\n            <summary>\n            Return true if the platform is MacOSX\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.OSPlatform.IsWin95\">\n            <summary>\n            Return true if the platform is Windows 95\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.OSPlatform.IsWin98\">\n            <summary>\n            Return true if the platform is Windows 98\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.OSPlatform.IsWinME\">\n            <summary>\n            Return true if the platform is Windows ME\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.OSPlatform.IsNT3\">\n            <summary>\n            Return true if the platform is NT 3\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.OSPlatform.IsNT4\">\n            <summary>\n            Return true if the platform is NT 4\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.OSPlatform.IsNT5\">\n            <summary>\n            Return true if the platform is NT 5\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.OSPlatform.IsWin2K\">\n            <summary>\n            Return true if the platform is Windows 2000\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.OSPlatform.IsWinXP\">\n            <summary>\n            Return true if the platform is Windows XP\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.OSPlatform.IsWin2003Server\">\n            <summary>\n            Return true if the platform is Windows 2003 Server\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.OSPlatform.IsNT6\">\n            <summary>\n            Return true if the platform is NT 6\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.OSPlatform.IsNT60\">\n            <summary>\n            Return true if the platform is NT 6.0\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.OSPlatform.IsNT61\">\n            <summary>\n            Return true if the platform is NT 6.1\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.OSPlatform.IsNT62\">\n            <summary>\n            Return true if the platform is NT 6.2\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.OSPlatform.IsNT63\">\n            <summary>\n            Return true if the platform is NT 6.3\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.OSPlatform.IsVista\">\n            <summary>\n            Return true if the platform is Vista\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.OSPlatform.IsWin2008Server\">\n            <summary>\n            Return true if the platform is Windows 2008 Server (original or R2)\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.OSPlatform.IsWin2008ServerR1\">\n            <summary>\n            Return true if the platform is Windows 2008 Server (original)\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.OSPlatform.IsWin2008ServerR2\">\n            <summary>\n            Return true if the platform is Windows 2008 Server R2\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.OSPlatform.IsWin2012Server\">\n            <summary>\n            Return true if the platform is Windows 2012 Server (original or R2)\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.OSPlatform.IsWin2012ServerR1\">\n            <summary>\n            Return true if the platform is Windows 2012 Server (original)\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.OSPlatform.IsWin2012ServerR2\">\n            <summary>\n            Return true if the platform is Windows 2012 Server R2\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.OSPlatform.IsWindows7\">\n            <summary>\n            Return true if the platform is Windows 7\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.OSPlatform.IsWindows8\">\n            <summary>\n            Return true if the platform is Windows 8\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.OSPlatform.IsWindows81\">\n            <summary>\n            Return true if the platform is Windows 8.1\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.OSPlatform.IsWindows10\">\n            <summary>\n            Return true if the platform is Windows 10\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.OSPlatform.IsWindowsServer10\">\n            <summary>\n            Return true if the platform is Windows Server. This is named Windows\n            Server 10 to distinguish it from previous versions of Windows Server.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.OSPlatform.ProductType\">\n            <summary>\n            Product Type Enumeration used for Windows\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.OSPlatform.ProductType.Unknown\">\n            <summary>\n            Product type is unknown or unspecified\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.OSPlatform.ProductType.WorkStation\">\n            <summary>\n            Product type is Workstation\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.OSPlatform.ProductType.DomainController\">\n            <summary>\n            Product type is Domain Controller\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.OSPlatform.ProductType.Server\">\n            <summary>\n            Product type is Server\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Filters.OrFilter\">\n            <summary>\n            Combines multiple filters so that a test must pass one \n            of them in order to pass this filter.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Filters.OrFilter.#ctor\">\n            <summary>\n            Constructs an empty OrFilter\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Filters.OrFilter.#ctor(NUnit.Framework.Interfaces.ITestFilter[])\">\n            <summary>\n            Constructs an AndFilter from an array of filters\n            </summary>\n            <param name=\"filters\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Filters.OrFilter.Pass(NUnit.Framework.Interfaces.ITest)\">\n            <summary>\n            Checks whether the OrFilter is matched by a test\n            </summary>\n            <param name=\"test\">The test to be matched</param>\n            <returns>True if any of the component filters pass, otherwise false</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Filters.OrFilter.Match(NUnit.Framework.Interfaces.ITest)\">\n            <summary>\n            Checks whether the OrFilter is matched by a test\n            </summary>\n            <param name=\"test\">The test to be matched</param>\n            <returns>True if any of the component filters match, otherwise false</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Filters.OrFilter.IsExplicitMatch(NUnit.Framework.Interfaces.ITest)\">\n            <summary>\n            Checks whether the OrFilter is explicit matched by a test\n            </summary>\n            <param name=\"test\">The test to be matched</param>\n            <returns>True if any of the component filters explicit match, otherwise false</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Filters.OrFilter.ElementName\">\n            <summary>\n            Gets the element name\n            </summary>\n            <value>Element name</value>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.InstanceOfTypeConstraint\">\n            <summary>\n            InstanceOfTypeConstraint is used to test that an object\n            is of the same type provided or derived from it.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.InstanceOfTypeConstraint.#ctor(System.Type)\">\n            <summary>\n            Construct an InstanceOfTypeConstraint for the type provided\n            </summary>\n            <param name=\"type\">The expected Type</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.InstanceOfTypeConstraint.Matches(System.Object)\">\n            <summary>\n            Apply the constraint to an actual value, returning true if it succeeds\n            </summary>\n            <param name=\"actual\">The actual argument</param>\n            <returns>True if the constraint succeeds, otherwise false.</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.InstanceOfTypeConstraint.DisplayName\">\n            <summary> \n            The display name of this Constraint for use by ToString().\n            The default value is the name of the constraint with\n            trailing \"Constraint\" removed. Derived classes may set\n            this to another name in their constructors.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.GreaterThanConstraint\">\n            <summary>\n            Tests whether a value is greater than the value supplied to its constructor\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.GreaterThanConstraint.#ctor(System.Object)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Constraints.GreaterThanConstraint\"/> class.\n            </summary>\n            <param name=\"expected\">The expected value.</param>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.DictionaryContainsKeyConstraint\">\n            <summary>\n            DictionaryContainsKeyConstraint is used to test whether a dictionary\n            contains an expected object as a key.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.DictionaryContainsKeyConstraint.#ctor(System.Object)\">\n            <summary>\n            Construct a DictionaryContainsKeyConstraint\n            </summary>\n            <param name=\"expected\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.DictionaryContainsKeyConstraint.Matches(System.Collections.IEnumerable)\">\n            <summary>\n            Test whether the expected key is contained in the dictionary\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.DictionaryContainsKeyConstraint.DisplayName\">\n            <summary> \n            The display name of this Constraint for use by ToString().\n            The default value is the name of the constraint with\n            trailing \"Constraint\" removed. Derived classes may set\n            this to another name in their constructors.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.DictionaryContainsKeyConstraint.Description\">\n            <summary>\n            The Description of what this constraint tests, for\n            use in messages and in the ConstraintResult.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.ContainsConstraint\">\n            <summary>\n            ContainsConstraint tests a whether a string contains a substring\n            or a collection contains an object. It postpones the decision of\n            which test to use until the type of the actual argument is known.\n            This allows testing whether a string is contained in a collection\n            or as a substring of another string using the same syntax.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ContainsConstraint.#ctor(System.Object)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Constraints.ContainsConstraint\"/> class.\n            </summary>\n            <param name=\"expected\">The _expected.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ContainsConstraint.ApplyTo(System.Object)\">\n            <summary>\n            Test whether the constraint is satisfied by a given value\n            </summary>\n            <param name=\"actual\">The value to be tested</param>\n            <returns>True for success, false for failure</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ContainsConstraint.Description\">\n            <summary>\n            The Description of what this constraint tests, for\n            use in messages and in the ConstraintResult.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ContainsConstraint.IgnoreCase\">\n            <summary>\n            Flag the constraint to ignore case and return self.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.CollectionTally\">\n            <summary>\n            CollectionTally counts (tallies) the number of\n            occurrences of each object in one or more enumerations.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.CollectionTally.#ctor(NUnit.Framework.Constraints.NUnitEqualityComparer,System.Collections.IEnumerable)\">\n            <summary>\n            Construct a CollectionTally object from a comparer and a collection\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.CollectionTally.TryRemove(System.Object)\">\n            <summary>\n            Try to remove an object from the tally\n            </summary>\n            <param name=\"o\">The object to remove</param>\n            <returns>True if successful, false if the object was not found</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.CollectionTally.TryRemove(System.Collections.IEnumerable)\">\n            <summary>\n            Try to remove a set of objects from the tally\n            </summary>\n            <param name=\"c\">The objects to remove</param>\n            <returns>True if successful, false if any object was not found</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.CollectionTally.Count\">\n            <summary>\n            The number of objects remaining in the tally\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.AllItemsConstraint\">\n            <summary>\n            AllItemsConstraint applies another constraint to each\n            item in a collection, succeeding if they all succeed.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.AllItemsConstraint.#ctor(NUnit.Framework.Constraints.IConstraint)\">\n            <summary>\n            Construct an AllItemsConstraint on top of an existing constraint\n            </summary>\n            <param name=\"itemConstraint\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.AllItemsConstraint.ApplyTo(System.Object)\">\n            <summary>\n            Apply the item constraint to each item in the collection,\n            failing if any item fails.\n            </summary>\n            <param name=\"actual\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.AllItemsConstraint.DisplayName\">\n            <summary> \n            The display name of this Constraint for use by ToString().\n            The default value is the name of the constraint with\n            trailing \"Constraint\" removed. Derived classes may set\n            this to another name in their constructors.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.CollectionAssert\">\n            <summary>\n            A set of Assert methods operating on one or more collections\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.CollectionAssert.Equals(System.Object,System.Object)\">\n            <summary>\n            The Equals method throws an InvalidOperationException. This is done \n            to make sure there is no mistake by calling this function.\n            </summary>\n            <param name=\"a\"></param>\n            <param name=\"b\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.CollectionAssert.ReferenceEquals(System.Object,System.Object)\">\n            <summary>\n            override the default ReferenceEquals to throw an InvalidOperationException. This \n            implementation makes sure there is no mistake in calling this function \n            as part of Assert. \n            </summary>\n            <param name=\"a\"></param>\n            <param name=\"b\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.CollectionAssert.AllItemsAreInstancesOfType(System.Collections.IEnumerable,System.Type)\">\n            <summary>\n            Asserts that all items contained in collection are of the type specified by expectedType.\n            </summary>\n            <param name=\"collection\">IEnumerable containing objects to be considered</param>\n            <param name=\"expectedType\">System.Type that all objects in collection must be instances of</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CollectionAssert.AllItemsAreInstancesOfType(System.Collections.IEnumerable,System.Type,System.String,System.Object[])\">\n            <summary>\n            Asserts that all items contained in collection are of the type specified by expectedType.\n            </summary>\n            <param name=\"collection\">IEnumerable containing objects to be considered</param>\n            <param name=\"expectedType\">System.Type that all objects in collection must be instances of</param>\n            <param name=\"message\">The message that will be displayed on failure</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CollectionAssert.AllItemsAreNotNull(System.Collections.IEnumerable)\">\n            <summary>\n            Asserts that all items contained in collection are not equal to null.\n            </summary>\n            <param name=\"collection\">IEnumerable containing objects to be considered</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CollectionAssert.AllItemsAreNotNull(System.Collections.IEnumerable,System.String,System.Object[])\">\n            <summary>\n            Asserts that all items contained in collection are not equal to null.\n            </summary>\n            <param name=\"collection\">IEnumerable of objects to be considered</param>\n            <param name=\"message\">The message that will be displayed on failure</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CollectionAssert.AllItemsAreUnique(System.Collections.IEnumerable)\">\n            <summary>\n            Ensures that every object contained in collection exists within the collection\n            once and only once.\n            </summary>\n            <param name=\"collection\">IEnumerable of objects to be considered</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CollectionAssert.AllItemsAreUnique(System.Collections.IEnumerable,System.String,System.Object[])\">\n            <summary>\n            Ensures that every object contained in collection exists within the collection\n            once and only once.\n            </summary>\n            <param name=\"collection\">IEnumerable of objects to be considered</param>\n            <param name=\"message\">The message that will be displayed on failure</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CollectionAssert.AreEqual(System.Collections.IEnumerable,System.Collections.IEnumerable)\">\n            <summary>\n            Asserts that expected and actual are exactly equal.  The collections must have the same count, \n            and contain the exact same objects in the same order.\n            </summary>\n            <param name=\"expected\">The first IEnumerable of objects to be considered</param>\n            <param name=\"actual\">The second IEnumerable of objects to be considered</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CollectionAssert.AreEqual(System.Collections.IEnumerable,System.Collections.IEnumerable,System.Collections.IComparer)\">\n            <summary>\n            Asserts that expected and actual are exactly equal.  The collections must have the same count, \n            and contain the exact same objects in the same order.\n            If comparer is not null then it will be used to compare the objects.\n            </summary>\n            <param name=\"expected\">The first IEnumerable of objects to be considered</param>\n            <param name=\"actual\">The second IEnumerable of objects to be considered</param>\n            <param name=\"comparer\">The IComparer to use in comparing objects from each IEnumerable</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CollectionAssert.AreEqual(System.Collections.IEnumerable,System.Collections.IEnumerable,System.String,System.Object[])\">\n            <summary>\n            Asserts that expected and actual are exactly equal.  The collections must have the same count, \n            and contain the exact same objects in the same order.\n            </summary>\n            <param name=\"expected\">The first IEnumerable of objects to be considered</param>\n            <param name=\"actual\">The second IEnumerable of objects to be considered</param>\n            <param name=\"message\">The message that will be displayed on failure</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CollectionAssert.AreEqual(System.Collections.IEnumerable,System.Collections.IEnumerable,System.Collections.IComparer,System.String,System.Object[])\">\n            <summary>\n            Asserts that expected and actual are exactly equal.  The collections must have the same count, \n            and contain the exact same objects in the same order.\n            If comparer is not null then it will be used to compare the objects.\n            </summary>\n            <param name=\"expected\">The first IEnumerable of objects to be considered</param>\n            <param name=\"actual\">The second IEnumerable of objects to be considered</param>\n            <param name=\"comparer\">The IComparer to use in comparing objects from each IEnumerable</param>\n            <param name=\"message\">The message that will be displayed on failure</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CollectionAssert.AreEquivalent(System.Collections.IEnumerable,System.Collections.IEnumerable)\">\n            <summary>\n            Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order.\n            </summary>\n            <param name=\"expected\">The first IEnumerable of objects to be considered</param>\n            <param name=\"actual\">The second IEnumerable of objects to be considered</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CollectionAssert.AreEquivalent(System.Collections.IEnumerable,System.Collections.IEnumerable,System.String,System.Object[])\">\n            <summary>\n            Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order.\n            </summary>\n            <param name=\"expected\">The first IEnumerable of objects to be considered</param>\n            <param name=\"actual\">The second IEnumerable of objects to be considered</param>\n            <param name=\"message\">The message that will be displayed on failure</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CollectionAssert.AreNotEqual(System.Collections.IEnumerable,System.Collections.IEnumerable)\">\n            <summary>\n            Asserts that expected and actual are not exactly equal.\n            </summary>\n            <param name=\"expected\">The first IEnumerable of objects to be considered</param>\n            <param name=\"actual\">The second IEnumerable of objects to be considered</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CollectionAssert.AreNotEqual(System.Collections.IEnumerable,System.Collections.IEnumerable,System.Collections.IComparer)\">\n            <summary>\n            Asserts that expected and actual are not exactly equal.\n            If comparer is not null then it will be used to compare the objects.\n            </summary>\n            <param name=\"expected\">The first IEnumerable of objects to be considered</param>\n            <param name=\"actual\">The second IEnumerable of objects to be considered</param>\n            <param name=\"comparer\">The IComparer to use in comparing objects from each IEnumerable</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CollectionAssert.AreNotEqual(System.Collections.IEnumerable,System.Collections.IEnumerable,System.String,System.Object[])\">\n            <summary>\n            Asserts that expected and actual are not exactly equal.\n            </summary>\n            <param name=\"expected\">The first IEnumerable of objects to be considered</param>\n            <param name=\"actual\">The second IEnumerable of objects to be considered</param>\n            <param name=\"message\">The message that will be displayed on failure</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CollectionAssert.AreNotEqual(System.Collections.IEnumerable,System.Collections.IEnumerable,System.Collections.IComparer,System.String,System.Object[])\">\n            <summary>\n            Asserts that expected and actual are not exactly equal.\n            If comparer is not null then it will be used to compare the objects.\n            </summary>\n            <param name=\"expected\">The first IEnumerable of objects to be considered</param>\n            <param name=\"actual\">The second IEnumerable of objects to be considered</param>\n            <param name=\"comparer\">The IComparer to use in comparing objects from each IEnumerable</param>\n            <param name=\"message\">The message that will be displayed on failure</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CollectionAssert.AreNotEquivalent(System.Collections.IEnumerable,System.Collections.IEnumerable)\">\n            <summary>\n            Asserts that expected and actual are not equivalent.\n            </summary>\n            <param name=\"expected\">The first IEnumerable of objects to be considered</param>\n            <param name=\"actual\">The second IEnumerable of objects to be considered</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CollectionAssert.AreNotEquivalent(System.Collections.IEnumerable,System.Collections.IEnumerable,System.String,System.Object[])\">\n            <summary>\n            Asserts that expected and actual are not equivalent.\n            </summary>\n            <param name=\"expected\">The first IEnumerable of objects to be considered</param>\n            <param name=\"actual\">The second IEnumerable of objects to be considered</param>\n            <param name=\"message\">The message that will be displayed on failure</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CollectionAssert.Contains(System.Collections.IEnumerable,System.Object)\">\n            <summary>\n            Asserts that collection contains actual as an item.\n            </summary>\n            <param name=\"collection\">IEnumerable of objects to be considered</param>\n            <param name=\"actual\">Object to be found within collection</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CollectionAssert.Contains(System.Collections.IEnumerable,System.Object,System.String,System.Object[])\">\n            <summary>\n            Asserts that collection contains actual as an item.\n            </summary>\n            <param name=\"collection\">IEnumerable of objects to be considered</param>\n            <param name=\"actual\">Object to be found within collection</param>\n            <param name=\"message\">The message that will be displayed on failure</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CollectionAssert.DoesNotContain(System.Collections.IEnumerable,System.Object)\">\n            <summary>\n            Asserts that collection does not contain actual as an item.\n            </summary>\n            <param name=\"collection\">IEnumerable of objects to be considered</param>\n            <param name=\"actual\">Object that cannot exist within collection</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CollectionAssert.DoesNotContain(System.Collections.IEnumerable,System.Object,System.String,System.Object[])\">\n            <summary>\n            Asserts that collection does not contain actual as an item.\n            </summary>\n            <param name=\"collection\">IEnumerable of objects to be considered</param>\n            <param name=\"actual\">Object that cannot exist within collection</param>\n            <param name=\"message\">The message that will be displayed on failure</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CollectionAssert.IsNotSubsetOf(System.Collections.IEnumerable,System.Collections.IEnumerable)\">\n            <summary>\n            Asserts that the superset does not contain the subset\n            </summary>\n            <param name=\"subset\">The IEnumerable subset to be considered</param>\n            <param name=\"superset\">The IEnumerable superset to be considered</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CollectionAssert.IsNotSubsetOf(System.Collections.IEnumerable,System.Collections.IEnumerable,System.String,System.Object[])\">\n            <summary>\n            Asserts that the superset does not contain the subset\n            </summary>\n            <param name=\"subset\">The IEnumerable subset to be considered</param>\n            <param name=\"superset\">The IEnumerable superset to be considered</param>\n            <param name=\"message\">The message that will be displayed on failure</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CollectionAssert.IsSubsetOf(System.Collections.IEnumerable,System.Collections.IEnumerable)\">\n            <summary>\n            Asserts that the superset contains the subset.\n            </summary>\n            <param name=\"subset\">The IEnumerable subset to be considered</param>\n            <param name=\"superset\">The IEnumerable superset to be considered</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CollectionAssert.IsSubsetOf(System.Collections.IEnumerable,System.Collections.IEnumerable,System.String,System.Object[])\">\n            <summary>\n            Asserts that the superset contains the subset.\n            </summary>\n            <param name=\"subset\">The IEnumerable subset to be considered</param>\n            <param name=\"superset\">The IEnumerable superset to be considered</param>\n            <param name=\"message\">The message that will be displayed on failure</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CollectionAssert.IsNotSupersetOf(System.Collections.IEnumerable,System.Collections.IEnumerable)\">\n            <summary>\n            Asserts that the subset does not contain the superset\n            </summary>\n            <param name=\"superset\">The IEnumerable superset to be considered</param>\n            <param name=\"subset\">The IEnumerable subset to be considered</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CollectionAssert.IsNotSupersetOf(System.Collections.IEnumerable,System.Collections.IEnumerable,System.String,System.Object[])\">\n            <summary>\n            Asserts that the subset does not contain the superset\n            </summary>\n            <param name=\"superset\">The IEnumerable superset to be considered</param>\n            <param name=\"subset\">The IEnumerable subset to be considered</param>\n            <param name=\"message\">The message that will be displayed on failure</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CollectionAssert.IsSupersetOf(System.Collections.IEnumerable,System.Collections.IEnumerable)\">\n            <summary>\n            Asserts that the subset contains the superset.\n            </summary>\n            <param name=\"superset\">The IEnumerable superset to be considered</param>\n            <param name=\"subset\">The IEnumerable subset to be considered</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CollectionAssert.IsSupersetOf(System.Collections.IEnumerable,System.Collections.IEnumerable,System.String,System.Object[])\">\n            <summary>\n            Asserts that the subset contains the superset.\n            </summary>\n            <param name=\"superset\">The IEnumerable superset to be considered</param>\n            <param name=\"subset\">The IEnumerable subset to be considered</param>\n            <param name=\"message\">The message that will be displayed on failure</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CollectionAssert.IsEmpty(System.Collections.IEnumerable,System.String,System.Object[])\">\n            <summary>\n            Assert that an array, list or other collection is empty\n            </summary>\n            <param name=\"collection\">An array, list or other collection implementing IEnumerable</param>\n            <param name=\"message\">The message to be displayed on failure</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CollectionAssert.IsEmpty(System.Collections.IEnumerable)\">\n            <summary>\n            Assert that an array,list or other collection is empty\n            </summary>\n            <param name=\"collection\">An array, list or other collection implementing IEnumerable</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CollectionAssert.IsNotEmpty(System.Collections.IEnumerable,System.String,System.Object[])\">\n            <summary>\n            Assert that an array, list or other collection is empty\n            </summary>\n            <param name=\"collection\">An array, list or other collection implementing IEnumerable</param>\n            <param name=\"message\">The message to be displayed on failure</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CollectionAssert.IsNotEmpty(System.Collections.IEnumerable)\">\n            <summary>\n            Assert that an array,list or other collection is empty\n            </summary>\n            <param name=\"collection\">An array, list or other collection implementing IEnumerable</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CollectionAssert.IsOrdered(System.Collections.IEnumerable,System.String,System.Object[])\">\n            <summary>\n            Assert that an array, list or other collection is ordered\n            </summary>\n            <param name=\"collection\">An array, list or other collection implementing IEnumerable</param>\n            <param name=\"message\">The message to be displayed on failure</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CollectionAssert.IsOrdered(System.Collections.IEnumerable)\">\n            <summary>\n            Assert that an array, list or other collection is ordered\n            </summary>\n            <param name=\"collection\">An array, list or other collection implementing IEnumerable</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CollectionAssert.IsOrdered(System.Collections.IEnumerable,System.Collections.IComparer,System.String,System.Object[])\">\n            <summary>\n            Assert that an array, list or other collection is ordered\n            </summary>\n            <param name=\"collection\">An array, list or other collection implementing IEnumerable</param>\n            <param name=\"comparer\">A custom comparer to perform the comparisons</param>\n            <param name=\"message\">The message to be displayed on failure</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.CollectionAssert.IsOrdered(System.Collections.IEnumerable,System.Collections.IComparer)\">\n            <summary>\n            Assert that an array, list or other collection is ordered\n            </summary>\n            <param name=\"collection\">An array, list or other collection implementing IEnumerable</param>\n            <param name=\"comparer\">A custom comparer to perform the comparisons</param>\n        </member>\n        <member name=\"T:NUnit.Framework.TestCaseSourceAttribute\">\n            <summary>\n            TestCaseSourceAttribute indicates the source to be used to\n            provide test cases for a test method.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestCaseSourceAttribute.#ctor(System.String)\">\n            <summary>\n            Construct with the name of the method, property or field that will provide data\n            </summary>\n            <param name=\"sourceName\">The name of a static method, property or field that will provide data.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.TestCaseSourceAttribute.#ctor(System.Type,System.String,System.Object[])\">\n            <summary>\n            Construct with a Type and name\n            </summary>\n            <param name=\"sourceType\">The Type that will provide data</param>\n            <param name=\"sourceName\">The name of a static method, property or field that will provide data.</param>\n            <param name=\"methodParams\">A set of parameters passed to the method, works only if the Source Name is a method. \n                                If the source name is a field or property has no effect.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.TestCaseSourceAttribute.#ctor(System.Type,System.String)\">\n            <summary>\n            Construct with a Type and name\n            </summary>\n            <param name=\"sourceType\">The Type that will provide data</param>\n            <param name=\"sourceName\">The name of a static method, property or field that will provide data.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.TestCaseSourceAttribute.#ctor(System.Type)\">\n            <summary>\n            Construct with a Type\n            </summary>\n            <param name=\"sourceType\">The type that will provide data</param>\n        </member>\n        <member name=\"M:NUnit.Framework.TestCaseSourceAttribute.BuildFrom(NUnit.Framework.Interfaces.IMethodInfo,NUnit.Framework.Internal.Test)\">\n            <summary>\n            Construct one or more TestMethods from a given MethodInfo,\n            using available parameter data.\n            </summary>\n            <param name=\"method\">The IMethod for which tests are to be constructed.</param>\n            <param name=\"suite\">The suite to which the tests will be added.</param>\n            <returns>One or more TestMethods</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.TestCaseSourceAttribute.GetTestCasesFor(NUnit.Framework.Interfaces.IMethodInfo)\">\n            <summary>\n            Returns a set of ITestCaseDataItems for use as arguments\n            to a parameterized test method.\n            </summary>\n            <param name=\"method\">The method for which data is needed.</param>\n            <returns></returns>\n        </member>\n        <member name=\"P:NUnit.Framework.TestCaseSourceAttribute.MethodParams\">\n            <summary>\n            A set of parameters passed to the method, works only if the Source Name is a method. \n            If the source name is a field or property has no effect.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestCaseSourceAttribute.SourceName\">\n            <summary>\n            The name of a the method, property or fiend to be used as a source\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestCaseSourceAttribute.SourceType\">\n            <summary>\n            A Type to be used as a source\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.TestCaseSourceAttribute.Category\">\n            <summary>\n            Gets or sets the category associated with every fixture created from\n            this attribute. May be a single category or a comma-separated list.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Commands.TestMethodCommand\">\n            <summary>\n            TestMethodCommand is the lowest level concrete command\n            used to run actual test cases.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Commands.TestMethodCommand.#ctor(NUnit.Framework.Internal.TestMethod)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Internal.Commands.TestMethodCommand\"/> class.\n            </summary>\n            <param name=\"testMethod\">The test.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Commands.TestMethodCommand.Execute(NUnit.Framework.Internal.ITestExecutionContext)\">\n            <summary>\n            Runs the test, saving a TestResult in the execution context, as\n            well as returning it. If the test has an expected result, it\n            is asserts on that value. Since failed tests and errors throw\n            an exception, this command must be wrapped in an outer command,\n            will handle that exception and records the failure. This role\n            is usually played by the SetUpTearDown command.\n            </summary>\n            <param name=\"context\">The execution context</param>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Commands.SetUpTearDownCommand\">\n            <summary>\n            SetUpTearDownCommand runs any SetUp methods for a suite,\n            runs the test and then runs any TearDown methods.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Commands.SetUpTearDownCommand.#ctor(NUnit.Framework.Internal.Commands.TestCommand)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Internal.Commands.SetUpTearDownCommand\"/> class.\n            </summary>\n            <param name=\"innerCommand\">The inner command.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Commands.SetUpTearDownCommand.Execute(NUnit.Framework.Internal.ITestExecutionContext)\">\n            <summary>\n            Runs the test, saving a TestResult in the supplied TestExecutionContext.\n            </summary>\n            <param name=\"context\">The context in which the test should run.</param>\n            <returns>A TestResult</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Commands.SetUpTearDownItem\">\n            <summary>\n            SetUpTearDownItem holds the setup and teardown methods\n            for a single level of the inheritance hierarchy.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Commands.SetUpTearDownItem.#ctor(System.Collections.Generic.IList{System.Reflection.MethodInfo},System.Collections.Generic.IList{System.Reflection.MethodInfo})\">\n            <summary>\n            Construct a SetUpTearDownNode\n            </summary>\n            <param name=\"setUpMethods\">A list of setup methods for this level</param>\n            <param name=\"tearDownMethods\">A list teardown methods for this level</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Commands.SetUpTearDownItem.RunSetUp(NUnit.Framework.Internal.ITestExecutionContext)\">\n            <summary>\n            Run SetUp on this level.\n            </summary>\n            <param name=\"context\">The execution context to use for running.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Commands.SetUpTearDownItem.RunTearDown(NUnit.Framework.Internal.ITestExecutionContext)\">\n            <summary>\n            Run TearDown for this level.\n            </summary>\n            <param name=\"context\"></param>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Commands.SetUpTearDownItem.HasMethods\">\n            <summary>\n             Returns true if this level has any methods at all.\n             This flag is used to discard levels that do nothing.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Guard\">\n            <summary>\n            Class used to guard against unexpected argument values\n            or operations by throwing an appropriate exception.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Guard.ArgumentNotNull(System.Object,System.String)\">\n            <summary>\n            Throws an exception if an argument is null\n            </summary>\n            <param name=\"value\">The value to be tested</param>\n            <param name=\"name\">The name of the argument</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Guard.ArgumentNotNullOrEmpty(System.String,System.String)\">\n            <summary>\n            Throws an exception if a string argument is null or empty\n            </summary>\n            <param name=\"value\">The value to be tested</param>\n            <param name=\"name\">The name of the argument</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Guard.ArgumentInRange(System.Boolean,System.String,System.String)\">\n            <summary>\n            Throws an ArgumentOutOfRangeException if the specified condition is not met.\n            </summary>\n            <param name=\"condition\">The condition that must be met</param>\n            <param name=\"message\">The exception message to be used</param>\n            <param name=\"paramName\">The name of the argument</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Guard.ArgumentValid(System.Boolean,System.String,System.String)\">\n            <summary>\n            Throws an ArgumentException if the specified condition is not met.\n            </summary>\n            <param name=\"condition\">The condition that must be met</param>\n            <param name=\"message\">The exception message to be used</param>\n            <param name=\"paramName\">The name of the argument</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Guard.OperationValid(System.Boolean,System.String)\">\n            <summary>\n            Throws an InvalidOperationException if the specified condition is not met.\n            </summary>\n            <param name=\"condition\">The condition that must be met</param>\n            <param name=\"message\">The exception message to be used</param>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.SubPathConstraint\">\n            <summary>\n            SubPathConstraint tests that the actual path is under the expected path\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.SubPathConstraint.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Constraints.SubPathConstraint\"/> class.\n            </summary>\n            <param name=\"expected\">The expected path</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.SubPathConstraint.Matches(System.String)\">\n            <summary>\n            Test whether the constraint is satisfied by a given value\n            </summary>\n            <param name=\"actual\">The value to be tested</param>\n            <returns>True for success, false for failure</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.SubPathConstraint.Description\">\n            <summary>\n            The Description of what this constraint tests, for\n            use in messages and in the ConstraintResult.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.ParallelizableAttribute\">\n            <summary>\n            ParallelizableAttribute is used to mark tests that may be run in parallel.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.ParallelizableAttribute.#ctor\">\n            <summary>\n            Construct a ParallelizableAttribute using default ParallelScope.Self.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.ParallelizableAttribute.#ctor(NUnit.Framework.ParallelScope)\">\n            <summary>\n            Construct a ParallelizableAttribute with a specified scope.\n            </summary>\n            <param name=\"scope\">The ParallelScope associated with this attribute.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.ParallelizableAttribute.ApplyToContext(NUnit.Framework.Internal.ITestExecutionContext)\">\n            <summary>\n            Modify the context to be used for child tests\n            </summary>\n            <param name=\"context\">The current TestExecutionContext</param>\n        </member>\n        <member name=\"T:NUnit.Framework.Throws\">\n            <summary>\n            Helper class with properties and methods that supply\n            constraints that operate on exceptions.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Throws.TypeOf(System.Type)\">\n            <summary>\n            Creates a constraint specifying the exact type of exception expected\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Throws.TypeOf``1\">\n            <summary>\n            Creates a constraint specifying the exact type of exception expected\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Throws.InstanceOf(System.Type)\">\n            <summary>\n            Creates a constraint specifying the type of exception expected\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Throws.InstanceOf``1\">\n            <summary>\n            Creates a constraint specifying the type of exception expected\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Throws.Exception\">\n            <summary>\n            Creates a constraint specifying an expected exception\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Throws.InnerException\">\n            <summary>\n            Creates a constraint specifying an exception with a given InnerException\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Throws.TargetInvocationException\">\n            <summary>\n            Creates a constraint specifying an expected TargetInvocationException\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Throws.ArgumentException\">\n            <summary>\n            Creates a constraint specifying an expected ArgumentException\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Throws.ArgumentNullException\">\n            <summary>\n            Creates a constraint specifying an expected ArgumentNUllException\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Throws.InvalidOperationException\">\n            <summary>\n            Creates a constraint specifying an expected InvalidOperationException\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Throws.Nothing\">\n            <summary>\n            Creates a constraint specifying that no exception is thrown\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.RuntimeType\">\n            <summary>\n            Enumeration identifying a common language\n            runtime implementation.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.RuntimeType.Any\">\n            <summary>Any supported runtime framework</summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.RuntimeType.Net\">\n            <summary>Microsoft .NET Framework</summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.RuntimeType.NetCF\">\n            <summary>Microsoft .NET Compact Framework</summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.RuntimeType.SSCLI\">\n            <summary>Microsoft Shared Source CLI</summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.RuntimeType.Mono\">\n            <summary>Mono</summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.RuntimeType.Silverlight\">\n            <summary>Silverlight</summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.RuntimeType.MonoTouch\">\n            <summary>MonoTouch</summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.RuntimeFramework\">\n            <summary>\n            RuntimeFramework represents a particular version\n            of a common language runtime implementation.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.RuntimeFramework.DefaultVersion\">\n            <summary>\n            DefaultVersion is an empty Version, used to indicate that\n            NUnit should select the CLR version to use for the test.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.RuntimeFramework.#ctor(NUnit.Framework.Internal.RuntimeType,System.Version)\">\n            <summary>\n            Construct from a runtime type and version. If the version has\n            two parts, it is taken as a framework version. If it has three\n            or more, it is taken as a CLR version. In either case, the other\n            version is deduced based on the runtime type and provided version.\n            </summary>\n            <param name=\"runtime\">The runtime type of the framework</param>\n            <param name=\"version\">The version of the framework</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.RuntimeFramework.Parse(System.String)\">\n            <summary>\n            Parses a string representing a RuntimeFramework.\n            The string may be just a RuntimeType name or just\n            a Version or a hyphenated RuntimeType-Version or\n            a Version prefixed by 'versionString'.\n            </summary>\n            <param name=\"s\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.RuntimeFramework.ToString\">\n            <summary>\n            Overridden to return the short name of the framework\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.RuntimeFramework.Supports(NUnit.Framework.Internal.RuntimeFramework)\">\n            <summary>\n            Returns true if the current framework matches the\n            one supplied as an argument. Two frameworks match\n            if their runtime types are the same or either one\n            is RuntimeType.Any and all specified version components\n            are equal. Negative (i.e. unspecified) version\n            components are ignored.\n            </summary>\n            <param name=\"target\">The RuntimeFramework to be matched.</param>\n            <returns>True on match, otherwise false</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.RuntimeFramework.CurrentFramework\">\n            <summary>\n            Static method to return a RuntimeFramework object\n            for the framework that is currently in use.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.RuntimeFramework.Runtime\">\n            <summary>\n            The type of this runtime framework\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.RuntimeFramework.FrameworkVersion\">\n            <summary>\n            The framework version for this runtime framework\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.RuntimeFramework.ClrVersion\">\n            <summary>\n            The CLR version for this runtime framework\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.RuntimeFramework.AllowAnyVersion\">\n            <summary>\n            Return true if any CLR version may be used in\n            matching this RuntimeFramework object.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.RuntimeFramework.DisplayName\">\n            <summary>\n            Returns the Display name for this framework\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.Filters.CategoryFilter\">\n            <summary>\n            CategoryFilter is able to select or exclude tests\n            based on their categories.\n            </summary>\n            \n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Filters.CategoryFilter.#ctor(System.String)\">\n            <summary>\n            Construct a CategoryFilter using a single category name\n            </summary>\n            <param name=\"name\">A category name</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.Filters.CategoryFilter.Match(NUnit.Framework.Interfaces.ITest)\">\n            <summary>\n            Check whether the filter matches a test\n            </summary>\n            <param name=\"test\">The test to be matched</param>\n            <returns></returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.Filters.CategoryFilter.ElementName\">\n            <summary>\n            Gets the element name\n            </summary>\n            <value>Element name</value>\n        </member>\n        <member name=\"T:NUnit.Framework.GlobalSettings\">\n            <summary>\n            GlobalSettings is a place for setting default values used\n            by the framework in performing asserts. Anything set through\n            this class applies to the entire test run. It should not normally\n            be used from within a test, since it is not thread-safe.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.GlobalSettings.DefaultFloatingPointTolerance\">\n            <summary>\n            Default tolerance for floating point equality\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.FileAssert\">\n            <summary>\n            Asserts on Files\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.FileAssert.Equals(System.Object,System.Object)\">\n            <summary>\n            The Equals method throws an InvalidOperationException. This is done \n            to make sure there is no mistake by calling this function.\n            </summary>\n            <param name=\"a\"></param>\n            <param name=\"b\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.FileAssert.ReferenceEquals(System.Object,System.Object)\">\n            <summary>\n            override the default ReferenceEquals to throw an InvalidOperationException. This \n            implementation makes sure there is no mistake in calling this function \n            as part of Assert. \n            </summary>\n            <param name=\"a\"></param>\n            <param name=\"b\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.FileAssert.AreEqual(System.IO.Stream,System.IO.Stream,System.String,System.Object[])\">\n            <summary>\n            Verifies that two Streams are equal.  Two Streams are considered\n            equal if both are null, or if both have the same value byte for byte.\n            If they are not equal an <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown.\n            </summary>\n            <param name=\"expected\">The expected Stream</param>\n            <param name=\"actual\">The actual Stream</param>\n            <param name=\"message\">The message to display if Streams are not equal</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.FileAssert.AreEqual(System.IO.Stream,System.IO.Stream)\">\n            <summary>\n            Verifies that two Streams are equal.  Two Streams are considered\n            equal if both are null, or if both have the same value byte for byte.\n            If they are not equal an <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown.\n            </summary>\n            <param name=\"expected\">The expected Stream</param>\n            <param name=\"actual\">The actual Stream</param>\n        </member>\n        <member name=\"M:NUnit.Framework.FileAssert.AreEqual(System.IO.FileInfo,System.IO.FileInfo,System.String,System.Object[])\">\n            <summary>\n            Verifies that two files are equal.  Two files are considered\n            equal if both are null, or if both have the same value byte for byte.\n            If they are not equal an <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown.\n            </summary>\n            <param name=\"expected\">A file containing the value that is expected</param>\n            <param name=\"actual\">A file containing the actual value</param>\n            <param name=\"message\">The message to display if Streams are not equal</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.FileAssert.AreEqual(System.IO.FileInfo,System.IO.FileInfo)\">\n            <summary>\n            Verifies that two files are equal.  Two files are considered\n            equal if both are null, or if both have the same value byte for byte.\n            If they are not equal an <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown.\n            </summary>\n            <param name=\"expected\">A file containing the value that is expected</param>\n            <param name=\"actual\">A file containing the actual value</param>\n        </member>\n        <member name=\"M:NUnit.Framework.FileAssert.AreEqual(System.String,System.String,System.String,System.Object[])\">\n            <summary>\n            Verifies that two files are equal.  Two files are considered\n            equal if both are null, or if both have the same value byte for byte.\n            If they are not equal an <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown.\n            </summary>\n            <param name=\"expected\">The path to a file containing the value that is expected</param>\n            <param name=\"actual\">The path to a file containing the actual value</param>\n            <param name=\"message\">The message to display if Streams are not equal</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.FileAssert.AreEqual(System.String,System.String)\">\n            <summary>\n            Verifies that two files are equal.  Two files are considered\n            equal if both are null, or if both have the same value byte for byte.\n            If they are not equal an <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown.\n            </summary>\n            <param name=\"expected\">The path to a file containing the value that is expected</param>\n            <param name=\"actual\">The path to a file containing the actual value</param>\n        </member>\n        <member name=\"M:NUnit.Framework.FileAssert.AreNotEqual(System.IO.Stream,System.IO.Stream,System.String,System.Object[])\">\n            <summary>\n            Asserts that two Streams are not equal. If they are equal\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown.\n            </summary>\n            <param name=\"expected\">The expected Stream</param>\n            <param name=\"actual\">The actual Stream</param>\n            <param name=\"message\">The message to be displayed when the two Stream are the same.</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.FileAssert.AreNotEqual(System.IO.Stream,System.IO.Stream)\">\n            <summary>\n            Asserts that two Streams are not equal. If they are equal\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown.\n            </summary>\n            <param name=\"expected\">The expected Stream</param>\n            <param name=\"actual\">The actual Stream</param>\n        </member>\n        <member name=\"M:NUnit.Framework.FileAssert.AreNotEqual(System.IO.FileInfo,System.IO.FileInfo,System.String,System.Object[])\">\n            <summary>\n            Asserts that two files are not equal. If they are equal\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown.\n            </summary>\n            <param name=\"expected\">A file containing the value that is expected</param>\n            <param name=\"actual\">A file containing the actual value</param>\n            <param name=\"message\">The message to display if Streams are not equal</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.FileAssert.AreNotEqual(System.IO.FileInfo,System.IO.FileInfo)\">\n            <summary>\n            Asserts that two files are not equal. If they are equal\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown.\n            </summary>\n            <param name=\"expected\">A file containing the value that is expected</param>\n            <param name=\"actual\">A file containing the actual value</param>\n        </member>\n        <member name=\"M:NUnit.Framework.FileAssert.AreNotEqual(System.String,System.String,System.String,System.Object[])\">\n            <summary>\n            Asserts that two files are not equal. If they are equal\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown.\n            </summary>\n            <param name=\"expected\">The path to a file containing the value that is expected</param>\n            <param name=\"actual\">The path to a file containing the actual value</param>\n            <param name=\"message\">The message to display if Streams are not equal</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.FileAssert.AreNotEqual(System.String,System.String)\">\n            <summary>\n            Asserts that two files are not equal. If they are equal\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown.\n            </summary>\n            <param name=\"expected\">The path to a file containing the value that is expected</param>\n            <param name=\"actual\">The path to a file containing the actual value</param>\n        </member>\n        <member name=\"M:NUnit.Framework.FileAssert.Exists(System.IO.FileInfo,System.String,System.Object[])\">\n            <summary>\n            Asserts that the file exists. If it does not exist\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown.\n            </summary>\n            <param name=\"actual\">A file containing the actual value</param>\n            <param name=\"message\">The message to display if Streams are not equal</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.FileAssert.Exists(System.IO.FileInfo)\">\n            <summary>\n            Asserts that the file exists. If it does not exist\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown.\n            </summary>\n            <param name=\"actual\">A file containing the actual value</param>\n        </member>\n        <member name=\"M:NUnit.Framework.FileAssert.Exists(System.String,System.String,System.Object[])\">\n            <summary>\n            Asserts that the file exists. If it does not exist\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown.\n            </summary>\n            <param name=\"actual\">The path to a file containing the actual value</param>\n            <param name=\"message\">The message to display if Streams are not equal</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.FileAssert.Exists(System.String)\">\n            <summary>\n            Asserts that the file exists. If it does not exist\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown.\n            </summary>\n            <param name=\"actual\">The path to a file containing the actual value</param>\n        </member>\n        <member name=\"M:NUnit.Framework.FileAssert.DoesNotExist(System.IO.FileInfo,System.String,System.Object[])\">\n            <summary>\n            Asserts that the file does not exist. If it does exist\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown.\n            </summary>\n            <param name=\"actual\">A file containing the actual value</param>\n            <param name=\"message\">The message to display if Streams are not equal</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.FileAssert.DoesNotExist(System.IO.FileInfo)\">\n            <summary>\n            Asserts that the file does not exist. If it does exist\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown.\n            </summary>\n            <param name=\"actual\">A file containing the actual value</param>\n        </member>\n        <member name=\"M:NUnit.Framework.FileAssert.DoesNotExist(System.String,System.String,System.Object[])\">\n            <summary>\n            Asserts that the file does not exist. If it does exist\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown.\n            </summary>\n            <param name=\"actual\">The path to a file containing the actual value</param>\n            <param name=\"message\">The message to display if Streams are not equal</param>\n            <param name=\"args\">Arguments to be used in formatting the message</param>\n        </member>\n        <member name=\"M:NUnit.Framework.FileAssert.DoesNotExist(System.String)\">\n            <summary>\n            Asserts that the file does not exist. If it does exist\n            an <see cref=\"T:NUnit.Framework.AssertionException\"/> is thrown.\n            </summary>\n            <param name=\"actual\">The path to a file containing the actual value</param>\n        </member>\n        <member name=\"T:NUnit.Framework.IgnoreException\">\n            <summary>\n            Thrown when an assertion failed.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.IgnoreException.#ctor(System.String)\">\n            <param name=\"message\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.IgnoreException.#ctor(System.String,System.Exception)\">\n            <param name=\"message\">The error message that explains \n            the reason for the exception</param>\n            <param name=\"inner\">The exception that caused the \n            current exception</param>\n        </member>\n        <member name=\"M:NUnit.Framework.IgnoreException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)\">\n            <summary>\n            Serialization Constructor\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.IgnoreException.ResultState\">\n            <summary>\n            Gets the ResultState provided by this exception\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.SomeItemsConstraint\">\n            <summary>\n            SomeItemsConstraint applies another constraint to each\n            item in a collection, succeeding if any of them succeeds.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.SomeItemsConstraint.#ctor(NUnit.Framework.Constraints.IConstraint)\">\n            <summary>\n            Construct a SomeItemsConstraint on top of an existing constraint\n            </summary>\n            <param name=\"itemConstraint\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.SomeItemsConstraint.ApplyTo(System.Object)\">\n            <summary>\n            Apply the item constraint to each item in the collection,\n            succeeding if any item succeeds.\n            </summary>\n            <param name=\"actual\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.SomeItemsConstraint.DisplayName\">\n            <summary> \n            The display name of this Constraint for use by ToString().\n            The default value is the name of the constraint with\n            trailing \"Constraint\" removed. Derived classes may set\n            this to another name in their constructors.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.SameAsConstraint\">\n            <summary>\n            SameAsConstraint tests whether an object is identical to\n            the object passed to its constructor\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.SameAsConstraint.#ctor(System.Object)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Constraints.SameAsConstraint\"/> class.\n            </summary>\n            <param name=\"expected\">The expected object.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.SameAsConstraint.ApplyTo(System.Object)\">\n            <summary>\n            Test whether the constraint is satisfied by a given value\n            </summary>\n            <param name=\"actual\">The value to be tested</param>\n            <returns>True for success, false for failure</returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.SameAsConstraint.Description\">\n            <summary>\n            The Description of what this constraint tests, for\n            use in messages and in the ConstraintResult.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.RegexConstraint\">\n            <summary>\n            RegexConstraint can test whether a string matches\n            the pattern provided.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.RegexConstraint.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Constraints.RegexConstraint\"/> class.\n            </summary>\n            <param name=\"pattern\">The pattern.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.RegexConstraint.Matches(System.String)\">\n            <summary>\n            Test whether the constraint is satisfied by a given value\n            </summary>\n            <param name=\"actual\">The value to be tested</param>\n            <returns>True for success, false for failure</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.ConstraintStatus\">\n            <summary>\n            ConstraintStatus represents the status of a ConstraintResult\n            returned by a Constraint being applied to an actual value.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.ConstraintStatus.Unknown\">\n            <summary>\n            The status has not yet been set\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.ConstraintStatus.Success\">\n            <summary>\n            The constraint succeeded\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.ConstraintStatus.Failure\">\n            <summary>\n            The constraint failed\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.ConstraintStatus.Error\">\n            <summary>\n            An error occured in applying the constraint (reserved for future use)\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.TearDownAttribute\">\n            <summary>\n            Attribute used to identify a method that is called \n            immediately after each test is run. The method is \n            guaranteed to be called, even if an exception is thrown.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.CombinatorialAttribute\">\n            <summary>\n            Marks a test to use a combinatorial join of any argument \n            data provided. Since this is the default, the attribute is\n            optional.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.CombinatorialAttribute.#ctor\">\n            <summary>\n            Default constructor\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.PropertyNames\">\n            <summary>\n            The PropertyNames class provides static constants for the\n            standard property ids that NUnit uses on tests.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.PropertyNames.AppDomain\">\n            <summary>\n            The FriendlyName of the AppDomain in which the assembly is running\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.PropertyNames.JoinType\">\n            <summary>\n            The selected strategy for joining parameter data into test cases\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.PropertyNames.ProcessID\">\n            <summary>\n            The process ID of the executing assembly\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.PropertyNames.ProviderStackTrace\">\n            <summary>\n            The stack trace from any data provider that threw\n            an exception.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.PropertyNames.SkipReason\">\n            <summary>\n            The reason a test was not run\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.PropertyNames.Author\">\n            <summary>\n            The author of the tests\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.PropertyNames.ApartmentState\">\n            <summary>\n            The ApartmentState required for running the test\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.PropertyNames.Category\">\n            <summary>\n            The categories applying to a test\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.PropertyNames.Description\">\n            <summary>\n            The Description of a test\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.PropertyNames.LevelOfParallelism\">\n            <summary>\n            The number of threads to be used in running tests\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.PropertyNames.MaxTime\">\n            <summary>\n            The maximum time in ms, above which the test is considered to have failed\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.PropertyNames.ParallelScope\">\n            <summary>\n            The ParallelScope associated with a test\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.PropertyNames.RepeatCount\">\n            <summary>\n            The number of times the test should be repeated\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.PropertyNames.RequiresThread\">\n            <summary>\n            Indicates that the test should be run on a separate thread\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.PropertyNames.SetCulture\">\n            <summary>\n            The culture to be set for a test\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.PropertyNames.SetUICulture\">\n            <summary>\n            The UI culture to be set for a test\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.PropertyNames.TestOf\">\n            <summary>\n            The type that is under test\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.PropertyNames.Timeout\">\n            <summary>\n            The timeout value for the test\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.PropertyNames.IgnoreUntilDate\">\n            <summary>\n            The test will be ignored until the given date\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.PropertyNames.Order\">\n            <summary>\n            The optional Order the test will run in\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.MethodWrapper\">\n            <summary>\n            The MethodWrapper class wraps a MethodInfo so that it may\n            be used in a platform-independent manner.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.MethodWrapper.#ctor(System.Type,System.Reflection.MethodInfo)\">\n            <summary>\n            Construct a MethodWrapper for a Type and a MethodInfo.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.MethodWrapper.#ctor(System.Type,System.String)\">\n            <summary>\n            Construct a MethodInfo for a given Type and method name.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.MethodWrapper.GetParameters\">\n            <summary>\n            Gets the parameters of the method.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.MethodWrapper.GetGenericArguments\">\n            <summary>\n            Returns the Type arguments of a generic method or the Type parameters of a generic method definition.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.MethodWrapper.MakeGenericMethod(System.Type[])\">\n            <summary>\n            Replaces the type parameters of the method with the array of types provided and returns a new IMethodInfo.\n            </summary>\n            <param name=\"typeArguments\">The type arguments to be used</param>\n            <returns>A new IMethodInfo with the type arguments replaced</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.MethodWrapper.GetCustomAttributes``1(System.Boolean)\">\n            <summary>\n            Returns an array of custom attributes of the specified type applied to this method\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.MethodWrapper.IsDefined``1(System.Boolean)\">\n            <summary>\n            Gets a value indicating whether one or more attributes of the spcified type are defined on the method.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.MethodWrapper.Invoke(System.Object,System.Object[])\">\n            <summary>\n            Invokes the method, converting any TargetInvocationException to an NUnitException.\n            </summary>\n            <param name=\"fixture\">The object on which to invoke the method</param>\n            <param name=\"args\">The argument list for the method</param>\n            <returns>The return value from the invoked method</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.MethodWrapper.ToString\">\n            <summary>\n            Override ToString() so that error messages in NUnit's own tests make sense\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.MethodWrapper.TypeInfo\">\n            <summary>\n            Gets the Type from which this method was reflected.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.MethodWrapper.MethodInfo\">\n            <summary>\n            Gets the MethodInfo for this method.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.MethodWrapper.Name\">\n            <summary>\n            Gets the name of the method.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.MethodWrapper.IsAbstract\">\n            <summary>\n            Gets a value indicating whether the method is abstract.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.MethodWrapper.IsPublic\">\n            <summary>\n            Gets a value indicating whether the method is public.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.MethodWrapper.ContainsGenericParameters\">\n            <summary>\n            Gets a value indicating whether the method contains unassigned generic type parameters.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.MethodWrapper.IsGenericMethod\">\n            <summary>\n            Gets a value indicating whether the method is a generic method.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.MethodWrapper.IsGenericMethodDefinition\">\n            <summary>\n            Gets a value indicating whether the MethodInfo represents the definition of a generic method.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.MethodWrapper.ReturnType\">\n            <summary>\n            Gets the return Type of the method.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.SomeOperator\">\n            <summary>\n            Represents a constraint that succeeds if any of the \n            members of a collection match a base constraint.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.SomeOperator.ApplyPrefix(NUnit.Framework.Constraints.IConstraint)\">\n            <summary>\n            Returns a constraint that will apply the argument\n            to the members of a collection, succeeding if\n            any of them succeed.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Internal.TestMethod\">\n            <summary>\n            The TestMethod class represents a Test implemented as a method.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Internal.TestMethod.parms\">\n            <summary>\n            The ParameterSet used to create this test method\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestMethod.#ctor(NUnit.Framework.Interfaces.IMethodInfo)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Internal.TestMethod\"/> class.\n            </summary>\n            <param name=\"method\">The method to be used as a test.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestMethod.#ctor(NUnit.Framework.Interfaces.IMethodInfo,NUnit.Framework.Internal.Test)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Internal.TestMethod\"/> class.\n            </summary>\n            <param name=\"method\">The method to be used as a test.</param>\n            <param name=\"parentSuite\">The suite or fixture to which the new test will be added</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestMethod.MakeTestResult\">\n            <summary>\n            Overridden to return a TestCaseResult.\n            </summary>\n            <returns>A TestResult for this test.</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Internal.TestMethod.AddToXml(NUnit.Framework.Interfaces.TNode,System.Boolean)\">\n            <summary>\n            Returns a TNode representing the current result after\n            adding it as a child of the supplied parent node.\n            </summary>\n            <param name=\"parentNode\">The parent node.</param>\n            <param name=\"recursive\">If true, descendant results are included</param>\n            <returns></returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestMethod.HasChildren\">\n            <summary>\n            Gets a bool indicating whether the current test\n            has any descendant tests.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestMethod.Tests\">\n            <summary>\n            Gets this test's child tests\n            </summary>\n            <value>A list of child tests</value>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestMethod.XmlElementName\">\n            <summary>\n            Gets the name used for the top-level element in the\n            XML representation of this test\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Internal.TestMethod.MethodName\">\n            <summary>\n            Returns the name of the method\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.RangeConstraint\">\n            <summary>\n            RangeConstraint tests whether two _values are within a \n            specified range.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.RangeConstraint.#ctor(System.IComparable,System.IComparable)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Constraints.RangeConstraint\"/> class.\n            </summary>\n            <remarks>from must be less than or equal to true</remarks> \n            <param name=\"from\">Inclusive beginning of the range. Must be less than or equal to to.</param>\n            <param name=\"to\">Inclusive end of the range. Must be greater than or equal to from.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.RangeConstraint.ApplyTo(System.Object)\">\n            <summary>\n            Test whether the constraint is satisfied by a given value\n            </summary>\n            <param name=\"actual\">The value to be tested</param>\n            <returns>True for success, false for failure</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.RangeConstraint.Using(System.Collections.IComparer)\">\n            <summary>\n            Modifies the constraint to use an <see cref=\"T:System.Collections.IComparer\"/> and returns self.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.RangeConstraint.Using``1(System.Collections.Generic.IComparer{``0})\">\n            <summary>\n            Modifies the constraint to use an <see cref=\"T:System.Collections.Generic.IComparer`1\"/> and returns self.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.RangeConstraint.Using``1(System.Comparison{``0})\">\n            <summary>\n            Modifies the constraint to use a <see cref=\"T:System.Comparison`1\"/> and returns self.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.RangeConstraint.Description\">\n            <summary>\n            Gets text describing a constraint\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.GreaterThanOrEqualConstraint\">\n            <summary>\n            Tests whether a value is greater than or equal to the value supplied to its constructor\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.GreaterThanOrEqualConstraint.#ctor(System.Object)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Constraints.GreaterThanOrEqualConstraint\"/> class.\n            </summary>\n            <param name=\"expected\">The expected value.</param>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.ActualValueDelegate`1\">\n            <summary>\n            Delegate used to delay evaluation of the actual value\n            to be used in evaluating a constraint\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.AttributeConstraint\">\n            <summary>\n            AttributeConstraint tests that a specified attribute is present\n            on a Type or other provider and that the value of the attribute\n            satisfies some other constraint.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.AttributeConstraint.#ctor(System.Type,NUnit.Framework.Constraints.IConstraint)\">\n            <summary>\n            Constructs an AttributeConstraint for a specified attribute\n            Type and base constraint.\n            </summary>\n            <param name=\"type\"></param>\n            <param name=\"baseConstraint\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.AttributeConstraint.ApplyTo(System.Object)\">\n            <summary>\n            Determines whether the Type or other provider has the \n            expected attribute and if its value matches the\n            additional constraint specified.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.AttributeConstraint.GetStringRepresentation\">\n            <summary>\n            Returns a string representation of the constraint.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.ValueSourceAttribute\">\n            <summary>\n            ValueSourceAttribute indicates the source to be used to\n            provide data for one parameter of a test method.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.ValueSourceAttribute.#ctor(System.String)\">\n            <summary>\n            Construct with the name of the factory - for use with languages\n            that don't support params arrays.\n            </summary>\n            <param name=\"sourceName\">The name of a static method, property or field that will provide data.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.ValueSourceAttribute.#ctor(System.Type,System.String)\">\n            <summary>\n            Construct with a Type and name - for use with languages\n            that don't support params arrays.\n            </summary>\n            <param name=\"sourceType\">The Type that will provide data</param>\n            <param name=\"sourceName\">The name of a static method, property or field that will provide data.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.ValueSourceAttribute.GetData(NUnit.Framework.Interfaces.IParameterInfo)\">\n            <summary>\n            Gets an enumeration of data items for use as arguments\n            for a test method parameter.\n            </summary>\n            <param name=\"parameter\">The parameter for which data is needed</param>\n            <returns>\n            An enumeration containing individual data items\n            </returns>\n        </member>\n        <member name=\"P:NUnit.Framework.ValueSourceAttribute.SourceName\">\n            <summary>\n            The name of a the method, property or fiend to be used as a source\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.ValueSourceAttribute.SourceType\">\n            <summary>\n            A Type to be used as a source\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.SetCultureAttribute\">\n            <summary>\n            Summary description for SetCultureAttribute.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.SetCultureAttribute.#ctor(System.String)\">\n            <summary>\n            Construct given the name of a culture\n            </summary>\n            <param name=\"culture\"></param>\n        </member>\n        <member name=\"T:NUnit.Framework.RandomAttribute\">\n            <summary>\n            RandomAttribute is used to supply a set of random _values\n            to a single parameter of a parameterized test.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.RandomAttribute.#ctor(System.Int32)\">\n            <summary>\n            Construct a random set of values appropriate for the Type of the \n            parameter on which the attribute appears, specifying only the count.\n            </summary>\n            <param name=\"count\"></param>\n        </member>\n        <member name=\"M:NUnit.Framework.RandomAttribute.#ctor(System.Int32,System.Int32,System.Int32)\">\n            <summary>\n            Construct a set of ints within a specified range\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.RandomAttribute.#ctor(System.UInt32,System.UInt32,System.Int32)\">\n            <summary>\n            Construct a set of unsigned ints within a specified range\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.RandomAttribute.#ctor(System.Int64,System.Int64,System.Int32)\">\n            <summary>\n            Construct a set of longs within a specified range\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.RandomAttribute.#ctor(System.UInt64,System.UInt64,System.Int32)\">\n            <summary>\n            Construct a set of unsigned longs within a specified range\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.RandomAttribute.#ctor(System.Int16,System.Int16,System.Int32)\">\n            <summary>\n            Construct a set of shorts within a specified range\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.RandomAttribute.#ctor(System.UInt16,System.UInt16,System.Int32)\">\n            <summary>\n            Construct a set of unsigned shorts within a specified range\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.RandomAttribute.#ctor(System.Double,System.Double,System.Int32)\">\n            <summary>\n            Construct a set of doubles within a specified range\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.RandomAttribute.#ctor(System.Single,System.Single,System.Int32)\">\n            <summary>\n            Construct a set of floats within a specified range\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.RandomAttribute.#ctor(System.Byte,System.Byte,System.Int32)\">\n            <summary>\n            Construct a set of bytes within a specified range\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.RandomAttribute.#ctor(System.SByte,System.SByte,System.Int32)\">\n            <summary>\n            Construct a set of sbytes within a specified range\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.RandomAttribute.GetData(NUnit.Framework.Interfaces.IParameterInfo)\">\n            <summary>\n            Get the collection of _values to be used as arguments.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.TestDelegate\">\n            <summary>\n            Delegate used by tests that execute code and\n            capture any thrown exception.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Interfaces.TNode\">\n            <summary>\n            TNode represents a single node in the XML representation\n            of a Test or TestResult. It replaces System.Xml.XmlNode and\n            System.Xml.Linq.XElement, providing a minimal set of methods \n            for operating on the XML in a platform-independent manner.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.TNode.#ctor(System.String)\">\n            <summary>\n            Constructs a new instance of TNode\n            </summary>\n            <param name=\"name\">The name of the node</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.TNode.#ctor(System.String,System.String)\">\n            <summary>\n            Constructs a new instance of TNode with a value\n            </summary>\n            <param name=\"name\">The name of the node</param>\n            <param name=\"value\">The text content of the node</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.TNode.#ctor(System.String,System.String,System.Boolean)\">\n            <summary>\n            Constructs a new instance of TNode with a value\n            </summary>\n            <param name=\"name\">The name of the node</param>\n            <param name=\"value\">The text content of the node</param>\n            <param name=\"valueIsCDATA\">Flag indicating whether to use CDATA when writing the text</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.TNode.FromXml(System.String)\">\n            <summary>\n            Create a TNode from it's XML text representation\n            </summary>\n            <param name=\"xmlText\">The XML text to be parsed</param>\n            <returns>A TNode</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.TNode.AddElement(System.String)\">\n            <summary>\n            Adds a new element as a child of the current node and returns it.\n            </summary>\n            <param name=\"name\">The element name.</param>\n            <returns>The newly created child element</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.TNode.AddElement(System.String,System.String)\">\n            <summary>\n            Adds a new element with a value as a child of the current node and returns it.\n            </summary>\n            <param name=\"name\">The element name</param>\n            <param name=\"value\">The text content of the new element</param>\n            <returns>The newly created child element</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.TNode.AddElementWithCDATA(System.String,System.String)\">\n            <summary>\n            Adds a new element with a value as a child of the current node and returns it.\n            The value will be output using a CDATA section.\n            </summary>\n            <param name=\"name\">The element name</param>\n            <param name=\"value\">The text content of the new element</param>\n            <returns>The newly created child element</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.TNode.AddAttribute(System.String,System.String)\">\n            <summary>\n            Adds an attribute with a specified name and value to the XmlNode.\n            </summary>\n            <param name=\"name\">The name of the attribute.</param>\n            <param name=\"value\">The value of the attribute.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.TNode.SelectSingleNode(System.String)\">\n            <summary>\n            Finds a single descendant of this node matching an xpath\n            specification. The format of the specification is\n            limited to what is needed by NUnit and its tests.\n            </summary>\n            <param name=\"xpath\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.TNode.SelectNodes(System.String)\">\n            <summary>\n            Finds all descendants of this node matching an xpath\n            specification. The format of the specification is\n            limited to what is needed by NUnit and its tests.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.TNode.WriteTo(System.Xml.XmlWriter)\">\n            <summary>\n            Writes the XML representation of the node to an XmlWriter\n            </summary>\n            <param name=\"writer\"></param>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.TNode.Name\">\n            <summary>\n            Gets the name of the node\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.TNode.Value\">\n            <summary>\n            Gets the value of the node\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.TNode.ValueIsCDATA\">\n            <summary>\n            Gets a flag indicating whether the value should be output using CDATA.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.TNode.Attributes\">\n            <summary>\n            Gets the dictionary of attributes\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.TNode.ChildNodes\">\n            <summary>\n            Gets a list of child nodes\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.TNode.FirstChild\">\n            <summary>\n            Gets the first ChildNode\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.TNode.OuterXml\">\n            <summary>\n            Gets the XML representation of this node.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Interfaces.NodeList\">\n            <summary>\n            Class used to represent a list of XmlResults\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Interfaces.AttributeDictionary\">\n            <summary>\n            Class used to represent the attributes of a node\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.AttributeDictionary.Item(System.String)\">\n            <summary>\n            Gets or sets the value associated with the specified key.\n            Overridden to return null if attribute is not found.\n            </summary>\n            <param name=\"key\">The key.</param>\n            <returns>Value of the attribute or null</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.Api.ITestAssemblyRunner\">\n            <summary>\n            The ITestAssemblyRunner interface is implemented by classes\n            that are able to execute a suite of tests loaded\n            from an assembly.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.ITestAssemblyRunner.Load(System.String,System.Collections.Generic.IDictionary{System.String,System.Object})\">\n            <summary>\n            Loads the tests found in an Assembly, returning an\n            indication of whether or not the load succeeded.\n            </summary>\n            <param name=\"assemblyName\">File name of the assembly to load</param>\n            <param name=\"settings\">Dictionary of options to use in loading the test</param>\n            <returns>An ITest representing the loaded tests</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.ITestAssemblyRunner.Load(System.Reflection.Assembly,System.Collections.Generic.IDictionary{System.String,System.Object})\">\n            <summary>\n            Loads the tests found in an Assembly, returning an\n            indication of whether or not the load succeeded.\n            </summary>\n            <param name=\"assembly\">The assembly to load</param>\n            <param name=\"settings\">Dictionary of options to use in loading the test</param>\n            <returns>An ITest representing the loaded tests</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.ITestAssemblyRunner.CountTestCases(NUnit.Framework.Interfaces.ITestFilter)\">\n            <summary>\n            Count Test Cases using a filter\n            </summary>\n            <param name=\"filter\">The filter to apply</param>\n            <returns>The number of test cases found</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.ITestAssemblyRunner.Run(NUnit.Framework.Interfaces.ITestListener,NUnit.Framework.Interfaces.ITestFilter)\">\n            <summary>\n            Run selected tests and return a test result. The test is run synchronously,\n            and the listener interface is notified as it progresses.\n            </summary>\n            <param name=\"listener\">Interface to receive ITestListener notifications.</param>\n            <param name=\"filter\">A test filter used to select tests to be run</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.ITestAssemblyRunner.RunAsync(NUnit.Framework.Interfaces.ITestListener,NUnit.Framework.Interfaces.ITestFilter)\">\n            <summary>\n            Run selected tests asynchronously, notifying the listener interface as it progresses.\n            </summary>\n            <param name=\"listener\">Interface to receive EventListener notifications.</param>\n            <param name=\"filter\">A test filter used to select tests to be run</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.ITestAssemblyRunner.WaitForCompletion(System.Int32)\">\n            <summary>\n            Wait for the ongoing run to complete.\n            </summary>\n            <param name=\"timeout\">Time to wait in milliseconds</param>\n            <returns>True if the run completed, otherwise false</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.ITestAssemblyRunner.StopRun(System.Boolean)\">\n            <summary>\n            Signal any test run that is in process to stop. Return without error if no test is running.\n            </summary>\n            <param name=\"force\">If true, kill any test-running threads</param>\n        </member>\n        <member name=\"P:NUnit.Framework.Api.ITestAssemblyRunner.LoadedTest\">\n            <summary>\n            Gets the tree of loaded tests, or null if\n            no tests have been loaded.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Api.ITestAssemblyRunner.Result\">\n            <summary>\n            Gets the tree of test results, if the test\n            run is completed, otherwise null.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Api.ITestAssemblyRunner.IsTestLoaded\">\n            <summary>\n            Indicates whether a test has been loaded\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Api.ITestAssemblyRunner.IsTestRunning\">\n            <summary>\n            Indicates whether a test is currently running\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Api.ITestAssemblyRunner.IsTestComplete\">\n            <summary>\n            Indicates whether a test run is complete\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.ToleranceMode\">\n            <summary>\n            Modes in which the tolerance value for a comparison can be interpreted.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.ToleranceMode.Unset\">\n            <summary>\n            The tolerance was created with a value, without specifying \n            how the value would be used. This is used to prevent setting\n            the mode more than once and is generally changed to Linear\n            upon execution of the test.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.ToleranceMode.Linear\">\n            <summary>\n            The tolerance is used as a numeric range within which\n            two compared _values are considered to be equal.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.ToleranceMode.Percent\">\n            <summary>\n            Interprets the tolerance as the percentage by which\n            the two compared _values my deviate from each other.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Constraints.ToleranceMode.Ulps\">\n            <summary>\n            Compares two _values based in their distance in\n            representable numbers.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.ResolvableConstraintExpression\">\n            <summary>\n            ResolvableConstraintExpression is used to represent a compound\n            constraint being constructed at a point where the last operator\n            may either terminate the expression or may have additional \n            qualifying constraints added to it. \n            \n            It is used, for example, for a Property element or for\n            an Exception element, either of which may be optionally\n            followed by constraints that apply to the property or \n            exception.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ResolvableConstraintExpression.#ctor\">\n            <summary>\n            Create a new instance of ResolvableConstraintExpression\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ResolvableConstraintExpression.#ctor(NUnit.Framework.Constraints.ConstraintBuilder)\">\n            <summary>\n            Create a new instance of ResolvableConstraintExpression,\n            passing in a pre-populated ConstraintBuilder.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.ResolvableConstraintExpression.NUnit#Framework#Constraints#IResolveConstraint#Resolve\">\n            <summary>\n            Resolve the current expression to a Constraint\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ResolvableConstraintExpression.And\">\n            <summary>\n            Appends an And Operator to the expression\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Constraints.ResolvableConstraintExpression.Or\">\n            <summary>\n            Appends an Or operator to the expression.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Constraints.NotOperator\">\n            <summary>\n            Negates the test of the constraint it wraps.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.NotOperator.#ctor\">\n            <summary>\n            Constructs a new NotOperator\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Constraints.NotOperator.ApplyPrefix(NUnit.Framework.Constraints.IConstraint)\">\n            <summary>\n            Returns a NotConstraint applied to its argument.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.SetUpFixtureAttribute\">\n            <summary>\n            SetUpFixtureAttribute is used to identify a SetUpFixture\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.SetUpFixtureAttribute.BuildFrom(NUnit.Framework.Interfaces.ITypeInfo)\">\n            <summary>\n            Build a SetUpFixture from type provided. Normally called for a Type\n            on which the attribute has been placed.\n            </summary>\n            <param name=\"typeInfo\">The type info of the fixture to be used.</param>\n            <returns>A SetUpFixture object as a TestSuite.</returns>\n        </member>\n        <member name=\"T:NUnit.Framework.RequiresMTAAttribute\">\n            <summary>\n            Marks a test that must run in the MTA, causing it\n            to run in a separate thread if necessary.\n            \n            On methods, you may also use MTAThreadAttribute\n            to serve the same purpose.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.RequiresMTAAttribute.#ctor\">\n            <summary>\n            Construct a RequiresMTAAttribute\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Interfaces.ResultState\">\n            <summary>\n            The ResultState class represents the outcome of running a test.\n            It contains two pieces of information. The Status of the test\n            is an enum indicating whether the test passed, failed, was\n            skipped or was inconclusive. The Label provides a more\n            detailed breakdown for use by client runners.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.ResultState.#ctor(NUnit.Framework.Interfaces.TestStatus)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Interfaces.ResultState\"/> class.\n            </summary>\n            <param name=\"status\">The TestStatus.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.ResultState.#ctor(NUnit.Framework.Interfaces.TestStatus,System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Interfaces.ResultState\"/> class.\n            </summary>\n            <param name=\"status\">The TestStatus.</param>\n            <param name=\"label\">The label.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.ResultState.#ctor(NUnit.Framework.Interfaces.TestStatus,NUnit.Framework.Interfaces.FailureSite)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Interfaces.ResultState\"/> class.\n            </summary>\n            <param name=\"status\">The TestStatus.</param>\n            <param name=\"site\">The stage at which the result was produced</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.ResultState.#ctor(NUnit.Framework.Interfaces.TestStatus,System.String,NUnit.Framework.Interfaces.FailureSite)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Interfaces.ResultState\"/> class.\n            </summary>\n            <param name=\"status\">The TestStatus.</param>\n            <param name=\"label\">The label.</param>\n            <param name=\"site\">The stage at which the result was produced</param>\n        </member>\n        <member name=\"F:NUnit.Framework.Interfaces.ResultState.Inconclusive\">\n            <summary>\n            The result is inconclusive\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Interfaces.ResultState.Skipped\">\n            <summary>\n            The test has been skipped. \n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Interfaces.ResultState.Ignored\">\n            <summary>\n            The test has been ignored.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Interfaces.ResultState.Explicit\">\n            <summary>\n            The test was skipped because it is explicit\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Interfaces.ResultState.Success\">\n            <summary>\n            The test succeeded\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Interfaces.ResultState.Failure\">\n            <summary>\n            The test failed\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Interfaces.ResultState.Error\">\n            <summary>\n            The test encountered an unexpected exception\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Interfaces.ResultState.Cancelled\">\n            <summary>\n            The test was cancelled by the user\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Interfaces.ResultState.NotRunnable\">\n            <summary>\n            The test was not runnable.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Interfaces.ResultState.ChildFailure\">\n            <summary>\n            A suite failed because one or more child tests failed or had errors\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Interfaces.ResultState.SetUpFailure\">\n            <summary>\n            A suite failed in its OneTimeSetUp\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Interfaces.ResultState.SetUpError\">\n            <summary>\n            A suite had an unexpected exception in its OneTimeSetUp\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Interfaces.ResultState.TearDownError\">\n            <summary>\n            A suite had an unexpected exception in its OneTimeDown\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.ResultState.WithSite(NUnit.Framework.Interfaces.FailureSite)\">\n            <summary>\n            Get a new ResultState, which is the same as the current\n            one but with the FailureSite set to the specified value.\n            </summary>\n            <param name=\"site\">The FailureSite to use</param>\n            <returns>A new ResultState</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.ResultState.Equals(System.Object)\">\n            <summary>\n            Determines whether the specified <see cref=\"T:System.Object\"/>, is equal to this instance.\n            </summary>\n            <param name=\"obj\">The <see cref=\"T:System.Object\"/> to compare with this instance.</param>\n            <returns>\n              <c>true</c> if the specified <see cref=\"T:System.Object\"/> is equal to this instance; otherwise, <c>false</c>.\n            </returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.ResultState.GetHashCode\">\n            <summary>\n            Returns a hash code for this instance.\n            </summary>\n            <returns>\n            A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. \n            </returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Interfaces.ResultState.ToString\">\n            <summary>\n            Returns a <see cref=\"T:System.String\"/> that represents this instance.\n            </summary>\n            <returns>\n            A <see cref=\"T:System.String\"/> that represents this instance.\n            </returns>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ResultState.Status\">\n            <summary>\n            Gets the TestStatus for the test.\n            </summary>\n            <value>The status.</value>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ResultState.Label\">\n            <summary>\n            Gets the label under which this test result is\n            categorized, if any.\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Interfaces.ResultState.Site\">\n            <summary>\n            Gets the stage of test execution in which\n            the failure or other result took place.\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.Interfaces.FailureSite\">\n            <summary>\n            The FailureSite enum indicates the stage of a test\n            in which an error or failure occurred.\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Interfaces.FailureSite.Test\">\n            <summary>\n            Failure in the test itself\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Interfaces.FailureSite.SetUp\">\n            <summary>\n            Failure in the SetUp method\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Interfaces.FailureSite.TearDown\">\n            <summary>\n            Failure in the TearDown method\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Interfaces.FailureSite.Parent\">\n            <summary>\n            Failure of a parent test\n            </summary>\n        </member>\n        <member name=\"F:NUnit.Framework.Interfaces.FailureSite.Child\">\n            <summary>\n            Failure of a child test\n            </summary>\n        </member>\n        <member name=\"T:NUnit.Framework.TestFixtureData\">\n            <summary>\n            The TestFixtureData class represents a set of arguments\n            and other parameter info to be used for a parameterized\n            fixture. It is derived from TestFixtureParameters and adds a\n            fluent syntax for use in initializing the fixture.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestFixtureData.#ctor(System.Object[])\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.TestFixtureData\"/> class.\n            </summary>\n            <param name=\"args\">The arguments.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.TestFixtureData.#ctor(System.Object)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.TestFixtureData\"/> class.\n            </summary>\n            <param name=\"arg\">The argument.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.TestFixtureData.#ctor(System.Object,System.Object)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.TestFixtureData\"/> class.\n            </summary>\n            <param name=\"arg1\">The first argument.</param>\n            <param name=\"arg2\">The second argument.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.TestFixtureData.#ctor(System.Object,System.Object,System.Object)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.TestFixtureData\"/> class.\n            </summary>\n            <param name=\"arg1\">The first argument.</param>\n            <param name=\"arg2\">The second argument.</param>\n            <param name=\"arg3\">The third argument.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.TestFixtureData.Explicit\">\n            <summary>\n            Marks the test fixture as explicit.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestFixtureData.Explicit(System.String)\">\n            <summary>\n            Marks the test fixture as explicit, specifying the reason.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.TestFixtureData.Ignore(System.String)\">\n            <summary>\n            Ignores this TestFixture, specifying the reason.\n            </summary>\n            <param name=\"reason\">The reason.</param>\n            <returns></returns>\n        </member>\n        <member name=\"T:System.Collections.Concurrent.ConcurrentQueue`1\">\n            <summary>\n            Represents a thread-safe first-in, first-out collection of objects.\n            </summary>\n            <typeparam name=\"T\">Specifies the type of elements in the queue.</typeparam>\n            <remarks>\n            All public  and protected members of <see cref=\"T:System.Collections.Concurrent.ConcurrentQueue`1\"/> are thread-safe and may be used\n            concurrently from multiple threads.\n            </remarks>\n        </member>\n        <member name=\"M:System.Collections.Concurrent.ConcurrentQueue`1.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:System.Collections.Concurrent.ConcurrentQueue`1\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:System.Collections.Concurrent.ConcurrentQueue`1.#ctor(System.Collections.Generic.IEnumerable{`0})\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:System.Collections.Concurrent.ConcurrentQueue`1\"/>\n            class that contains elements copied from the specified collection\n            </summary>\n            <param name=\"collection\">The collection whose elements are copied to the new <see cref=\"T:System.Collections.Concurrent.ConcurrentQueue`1\"/>.</param>\n            <exception cref=\"T:System.ArgumentNullException\">The <paramref name=\"collection\"/> argument is\n            null.</exception>\n        </member>\n        <member name=\"M:System.Collections.Concurrent.ConcurrentQueue`1.Enqueue(`0)\">\n            <summary>\n            Adds an object to the end of the <see cref=\"T:System.Collections.Concurrent.ConcurrentQueue`1\"/>.\n            </summary>\n            <param name=\"item\">The object to add to the end of the <see cref=\"T:System.Collections.Concurrent.ConcurrentQueue`1\"/>. The value can be a null reference\n            (Nothing in Visual Basic) for reference types.\n            </param>\n        </member>\n        <member name=\"M:System.Collections.Concurrent.ConcurrentQueue`1.System#Collections#Concurrent#IProducerConsumerCollection{T}#TryAdd(`0)\">\n            <summary>\n            Attempts to add an object to the <see cref=\"T:System.Collections.Concurrent.IProducerConsumerCollection{T}\"/>.\n            </summary>\n            <param name=\"item\">The object to add to the <see cref=\"T:System.Collections.Concurrent.IProducerConsumerCollection{T}\"/>. The value can be a null\n            reference (Nothing in Visual Basic) for reference types.\n            </param>\n            <returns>true if the object was added successfully; otherwise, false.</returns>\n            <remarks>For <see cref=\"T:System.Collections.Concurrent.ConcurrentQueue`1\"/>, this operation will always add the object to the\n            end of the <see cref=\"T:System.Collections.Concurrent.ConcurrentQueue`1\"/>\n            and return true.</remarks>\n        </member>\n        <member name=\"M:System.Collections.Concurrent.ConcurrentQueue`1.TryDequeue(`0@)\">\n            <summary>\n            Attempts to remove and return the object at the beginning of the <see cref=\"T:System.Collections.Concurrent.ConcurrentQueue`1\"/>.\n            </summary>\n            <param name=\"result\">\n            When this method returns, if the operation was successful, <paramref name=\"result\"/> contains the\n            object removed. If no object was available to be removed, the value is unspecified.\n            </param>\n            <returns>true if an element was removed and returned from the beginning of the <see cref=\"T:System.Collections.Concurrent.ConcurrentQueue`1\"/>\n            successfully; otherwise, false.</returns>\n        </member>\n        <member name=\"M:System.Collections.Concurrent.ConcurrentQueue`1.TryPeek(`0@)\">\n            <summary>\n            Attempts to return an object from the beginning of the <see cref=\"T:System.Collections.Concurrent.ConcurrentQueue`1\"/>\n            without removing it.\n            </summary>\n            <param name=\"result\">When this method returns, <paramref name=\"result\"/> contains an object from\n            the beginning of the <see cref=\"T:System.Collections.Concurrent.ConcurrentQueue{T}\"/> or an\n            unspecified value if the operation failed.</param>\n            <returns>true if and object was returned successfully; otherwise, false.</returns>\n        </member>\n        <member name=\"M:System.Collections.Concurrent.ConcurrentQueue`1.System#Collections#IEnumerable#GetEnumerator\">\n            <summary>\n            Returns an enumerator that iterates through a collection.\n            </summary>\n            <returns>An <see cref=\"T:System.Collections.IEnumerator\"/> that can be used to iterate through the collection.</returns>\n        </member>\n        <member name=\"M:System.Collections.Concurrent.ConcurrentQueue`1.GetEnumerator\">\n            <summary>\n            Returns an enumerator that iterates through the <see cref=\"T:System.Collections.Concurrent.ConcurrentQueue`1\"/>.\n            </summary>\n            <returns>An enumerator for the contents of the <see cref=\"T:System.Collections.Concurrent.ConcurrentQueue`1\"/>.</returns>\n            <remarks>\n            The enumeration represents a moment-in-time snapshot of the contents\n            of the queue.  It does not reflect any updates to the collection after \n            <see cref=\"M:System.Collections.Concurrent.ConcurrentQueue`1.GetEnumerator\"/> was called.  The enumerator is safe to use\n            concurrently with reads from and writes to the queue.\n            </remarks>\n        </member>\n        <member name=\"M:System.Collections.Concurrent.ConcurrentQueue`1.System#Collections#ICollection#CopyTo(System.Array,System.Int32)\">\n            <summary>\n            Copies the elements of the <see cref=\"T:System.Collections.ICollection\"/> to an <see cref=\"T:System.Array\"/>, starting at a particular\n            <see cref=\"T:System.Array\"/> index.\n            </summary>\n            <param name=\"array\">The one-dimensional <see cref=\"T:System.Array\">Array</see> that is the\n            destination of the elements copied from the\n            <see cref=\"T:System.Collections.Concurrent.ConcurrentBag\"/>. The <see cref=\"T:System.Array\">Array</see> must have zero-based indexing.</param>\n            <param name=\"index\">The zero-based index in <paramref name=\"array\"/> at which copying\n            begins.</param>\n            <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"array\"/> is a null reference (Nothing in\n            Visual Basic).</exception>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\"><paramref name=\"index\"/> is less than\n            zero.</exception>\n            <exception cref=\"T:System.ArgumentException\">\n            <paramref name=\"array\"/> is multidimensional. -or-\n            <paramref name=\"array\"/> does not have zero-based indexing. -or-\n            <paramref name=\"index\"/> is equal to or greater than the length of the <paramref name=\"array\"/>\n            -or- The number of elements in the source <see cref=\"T:System.Collections.ICollection\"/> is\n            greater than the available space from <paramref name=\"index\"/> to the end of the destination\n            <paramref name=\"array\"/>. -or- The type of the source <see cref=\"T:System.Collections.ICollection\"/> cannot be cast automatically to the type of the\n            destination <paramref name=\"array\"/>.\n            </exception>\n        </member>\n        <member name=\"M:System.Collections.Concurrent.ConcurrentQueue`1.CopyTo(`0[],System.Int32)\">\n            <summary>\n            Copies the <see cref=\"T:System.Collections.Concurrent.ConcurrentQueue`1\"/> elements to an existing one-dimensional <see cref=\"T:System.Array\">Array</see>, starting at the specified array index.\n            </summary>\n            <param name=\"array\">The one-dimensional <see cref=\"T:System.Array\">Array</see> that is the\n            destination of the elements copied from the\n            <see cref=\"T:System.Collections.Concurrent.ConcurrentQueue`1\"/>. The <see cref=\"T:System.Array\">Array</see> must have zero-based\n            indexing.</param>\n            <param name=\"index\">The zero-based index in <paramref name=\"array\"/> at which copying\n            begins.</param>\n            <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"array\"/> is a null reference (Nothing in\n            Visual Basic).</exception>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\"><paramref name=\"index\"/> is less than\n            zero.</exception>\n            <exception cref=\"T:System.ArgumentException\"><paramref name=\"index\"/> is equal to or greater than the\n            length of the <paramref name=\"array\"/>\n            -or- The number of elements in the source <see cref=\"T:System.Collections.Concurrent.ConcurrentQueue`1\"/> is greater than the\n            available space from <paramref name=\"index\"/> to the end of the destination <paramref name=\"array\"/>.\n            </exception>\n        </member>\n        <member name=\"M:System.Collections.Concurrent.ConcurrentQueue`1.ToArray\">\n            <summary>\n            Copies the elements stored in the <see cref=\"T:System.Collections.Concurrent.ConcurrentQueue`1\"/> to a new array.\n            </summary>\n            <returns>A new array containing a snapshot of elements copied from the <see cref=\"T:System.Collections.Concurrent.ConcurrentQueue`1\"/>.</returns>\n        </member>\n        <member name=\"M:System.Collections.Concurrent.ConcurrentQueue`1.System#Collections#Concurrent#IProducerConsumerCollection{T}#TryTake(`0@)\">\n            <summary>\n            Attempts to remove and return an object from the <see cref=\"T:System.Collections.Concurrent.IProducerConsumerCollection{T}\"/>.\n            </summary>\n            <param name=\"item\">\n            When this method returns, if the operation was successful, <paramref name=\"item\"/> contains the\n            object removed. If no object was available to be removed, the value is unspecified.\n            </param>\n            <returns>true if an element was removed and returned successfully; otherwise, false.</returns>\n            <remarks>For <see cref=\"T:System.Collections.Concurrent.ConcurrentQueue`1\"/>, this operation will attempt to remove the object\n            from the beginning of the <see cref=\"T:System.Collections.Concurrent.ConcurrentQueue`1\"/>.\n            </remarks>\n        </member>\n        <member name=\"P:System.Collections.Concurrent.ConcurrentQueue`1.System#Collections#ICollection#IsSynchronized\">\n            <summary>\n            Gets a value indicating whether access to the <see cref=\"T:System.Collections.ICollection\"/> is\n            synchronized with the SyncRoot.\n            </summary>\n            <value>true if access to the <see cref=\"T:System.Collections.ICollection\"/> is synchronized\n            with the SyncRoot; otherwise, false. For <see cref=\"T:System.Collections.Concurrent.ConcurrentQueue`1\"/>, this property always\n            returns false.</value>\n        </member>\n        <member name=\"P:System.Collections.Concurrent.ConcurrentQueue`1.System#Collections#ICollection#SyncRoot\">\n            <summary>\n            Gets an object that can be used to synchronize access to the <see\n            cref=\"T:System.Collections.ICollection\"/>. This property is not supported.\n            </summary>\n            <exception cref=\"T:System.NotSupportedException\">The SyncRoot property is not supported.</exception>\n        </member>\n        <member name=\"P:System.Collections.Concurrent.ConcurrentQueue`1.Count\">\n            <summary>\n            Gets the number of elements contained in the <see cref=\"T:System.Collections.Concurrent.ConcurrentQueue`1\"/>.\n            </summary>\n            <value>The number of elements contained in the <see cref=\"T:System.Collections.Concurrent.ConcurrentQueue`1\"/>.</value>\n            <remarks>\n            For determining whether the collection contains any items, use of the <see cref=\"P:System.Collections.Concurrent.ConcurrentQueue`1.IsEmpty\"/>\n            property is recommended rather than retrieving the number of items from the <see cref=\"P:System.Collections.Concurrent.ConcurrentQueue`1.Count\"/>\n            property and comparing it to 0.\n            </remarks>\n        </member>\n        <member name=\"P:System.Collections.Concurrent.ConcurrentQueue`1.IsEmpty\">\n            <summary>\n            Gets a value that indicates whether the <see cref=\"T:System.Collections.Concurrent.ConcurrentQueue`1\"/> is empty.\n            </summary>\n            <value>true if the <see cref=\"T:System.Collections.Concurrent.ConcurrentQueue`1\"/> is empty; otherwise, false.</value>\n            <remarks>\n            For determining whether the collection contains any items, use of this property is recommended\n            rather than retrieving the number of items from the <see cref=\"P:System.Collections.Concurrent.ConcurrentQueue`1.Count\"/> property and comparing it\n            to 0.  However, as this collection is intended to be accessed concurrently, it may be the case\n            that another thread will modify the collection after <see cref=\"P:System.Collections.Concurrent.ConcurrentQueue`1.IsEmpty\"/> returns, thus invalidating\n            the result.\n            </remarks>\n        </member>\n        <member name=\"T:NUnit.Framework.Api.NUnitTestAssemblyRunner\">\n            <summary>\n            Implementation of ITestAssemblyRunner\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.NUnitTestAssemblyRunner.#ctor(NUnit.Framework.Api.ITestAssemblyBuilder)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:NUnit.Framework.Api.NUnitTestAssemblyRunner\"/> class.\n            </summary>\n            <param name=\"builder\">The builder.</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.NUnitTestAssemblyRunner.Load(System.String,System.Collections.Generic.IDictionary{System.String,System.Object})\">\n            <summary>\n            Loads the tests found in an Assembly\n            </summary>\n            <param name=\"assemblyName\">File name of the assembly to load</param>\n            <param name=\"settings\">Dictionary of option settings for loading the assembly</param>\n            <returns>True if the load was successful</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.NUnitTestAssemblyRunner.Load(System.Reflection.Assembly,System.Collections.Generic.IDictionary{System.String,System.Object})\">\n            <summary>\n            Loads the tests found in an Assembly\n            </summary>\n            <param name=\"assembly\">The assembly to load</param>\n            <param name=\"settings\">Dictionary of option settings for loading the assembly</param>\n            <returns>True if the load was successful</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.NUnitTestAssemblyRunner.CountTestCases(NUnit.Framework.Interfaces.ITestFilter)\">\n            <summary>\n            Count Test Cases using a filter\n            </summary>\n            <param name=\"filter\">The filter to apply</param>\n            <returns>The number of test cases found</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.NUnitTestAssemblyRunner.Run(NUnit.Framework.Interfaces.ITestListener,NUnit.Framework.Interfaces.ITestFilter)\">\n            <summary>\n            Run selected tests and return a test result. The test is run synchronously,\n            and the listener interface is notified as it progresses.\n            </summary>\n            <param name=\"listener\">Interface to receive EventListener notifications.</param>\n            <param name=\"filter\">A test filter used to select tests to be run</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.NUnitTestAssemblyRunner.RunAsync(NUnit.Framework.Interfaces.ITestListener,NUnit.Framework.Interfaces.ITestFilter)\">\n            <summary>\n            Run selected tests asynchronously, notifying the listener interface as it progresses.\n            </summary>\n            <param name=\"listener\">Interface to receive EventListener notifications.</param>\n            <param name=\"filter\">A test filter used to select tests to be run</param>\n            <remarks>\n            RunAsync is a template method, calling various abstract and\n            virtual methods to be overridden by derived classes.\n            </remarks>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.NUnitTestAssemblyRunner.WaitForCompletion(System.Int32)\">\n            <summary>\n            Wait for the ongoing run to complete.\n            </summary>\n            <param name=\"timeout\">Time to wait in milliseconds</param>\n            <returns>True if the run completed, otherwise false</returns>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.NUnitTestAssemblyRunner.StopRun(System.Boolean)\">\n            <summary>\n            Signal any test run that is in process to stop. Return without error if no test is running.\n            </summary>\n            <param name=\"force\">If true, kill any tests that are currently running</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.NUnitTestAssemblyRunner.StartRun(NUnit.Framework.Interfaces.ITestListener)\">\n            <summary>\n            Initiate the test run.\n            </summary>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.NUnitTestAssemblyRunner.CreateTestExecutionContext(NUnit.Framework.Interfaces.ITestListener)\">\n            <summary>\n            Create the initial TestExecutionContext used to run tests\n            </summary>\n            <param name=\"listener\">The ITestListener specified in the RunAsync call</param>\n        </member>\n        <member name=\"M:NUnit.Framework.Api.NUnitTestAssemblyRunner.OnRunCompleted(System.Object,System.EventArgs)\">\n            <summary>\n            Handle the the Completed event for the top level work item\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Api.NUnitTestAssemblyRunner.LoadedTest\">\n            <summary>\n            The tree of tests that was loaded by the builder\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Api.NUnitTestAssemblyRunner.Result\">\n            <summary>\n            The test result, if a run has completed\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Api.NUnitTestAssemblyRunner.IsTestLoaded\">\n            <summary>\n            Indicates whether a test is loaded\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Api.NUnitTestAssemblyRunner.IsTestRunning\">\n            <summary>\n            Indicates whether a test is running\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Api.NUnitTestAssemblyRunner.IsTestComplete\">\n            <summary>\n            Indicates whether a test run is complete\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Api.NUnitTestAssemblyRunner.Settings\">\n            <summary>\n            Our settings, specified when loading the assembly\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Api.NUnitTestAssemblyRunner.TopLevelWorkItem\">\n            <summary>\n            The top level WorkItem created for the assembly as a whole\n            </summary>\n        </member>\n        <member name=\"P:NUnit.Framework.Api.NUnitTestAssemblyRunner.Context\">\n            <summary>\n            The TestExecutionContext for the top level WorkItem\n            </summary>\n        </member>\n    </members>\n</doc>\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom/nunit.framework.xml.meta",
    "content": "fileFormatVersion: 2\nguid: 9c7ad350fb20c854a9112cf4156d1b6e\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom.meta",
    "content": "fileFormatVersion: 2\nguid: 2347243c7aa3e224f9282dc94e6fc3b2\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35.meta",
    "content": "fileFormatVersion: 2\nguid: a36d8b72880a8004f96ac54ce4598ff9\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ext.nunit@1.0.0/package.json",
    "content": "{\n  \"displayName\": \"Custom NUnit\",\n  \"name\": \"com.unity.ext.nunit\",\n  \"version\": \"1.0.0\",\n  \"unity\": \"2019.1\",\n  \"description\": \"Custom version of the nunit package build to work with Unity. Used by the Unity Test Framework.\",\n  \"keywords\": [\"nunit\", \"unittest\", \"test\"],\n  \"category\": \"Libraries\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git@gitlab.cds.internal.unity3d.com/upm-packages/core/com.unity.ext.nunit.git\",\n    \"revision\": \"c8f5044ffe6adb909f9836160b0bdaa30f2d1ec9\"\n  },\n  \"dependencies\": {\n  }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ext.nunit@1.0.0/package.json.meta",
    "content": "fileFormatVersion: 2\nguid: 8143d3a8390f2c64685e3bc272bd9e90\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.rider@1.1.0/.editorconfig",
    "content": "root = true\n\n[*]\nindent_style = space\nindent_size = 2\nend_of_line = lf"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.rider@1.1.0/CHANGELOG.md",
    "content": "# Code Editor Package for Rider\n\n## [1.1.0] - 2019-07-02\n\nnew setting to manage list of extensions to be opened with Rider\navoid breaking everything on any unhandled exception in RiderScriptEditor cctor\nhide Rider settings, when different Editor is selected\ndynamically load only newer rider plugins\npath detection (work on unix symlinks)\nspeed up for project generation\nlots of bug fixing\n\n## [1.0.8] - 2019-05-20\n\nFix NullReferenceException when External editor was pointing to non-existing Rider everything was broken by null-ref.\n\n## [1.0.7] - 2019-05-16\n\nInitial migration steps from rider plugin to package.\nFix OSX check and opening of files.\n\n## [1.0.6] - 2019-04-30\n\nEnsure asset database is refreshed when generating csproj and solution files.\n\n## [1.0.5] - 2019-04-27\n\nAdd support for generating all csproj files.\n\n## [1.0.4] - 2019-04-18\n\nFix relative package paths.\nFix opening editor on mac.\n\n## [1.0.3] - 2019-04-12\n\nFixing null reference issue for callbacks to Asset pipeline.\n\n## [1.0.2] - 2019-01-01\n\n### This is the first release of *Unity Package rider_editor*.\n\nUsing the newly created api to integrate Rider with Unity.\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.rider@1.1.0/CHANGELOG.md.meta",
    "content": "fileFormatVersion: 2\nguid: 8645aa9c3c74fb34ba9499e14fb332b5\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.rider@1.1.0/CONTRIBUTING.md",
    "content": "# Contributing\n\n## All contributions are subject to the [Unity Contribution Agreement(UCA)](https://unity3d.com/legal/licenses/Unity_Contribution_Agreement)\nBy making a pull request, you are confirming agreement to the terms and conditions of the UCA, including that your Contributions are your original creation and that you have complete right and authority to make your Contributions.\n\n## Once you have a change ready following these ground rules. Simply make a pull request"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.rider@1.1.0/CONTRIBUTING.md.meta",
    "content": "fileFormatVersion: 2\nguid: 5e83f8baac96eaa47bdd9ca781cd2002\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.rider@1.1.0/Documentation~/README.md",
    "content": "# Code Editor Package for Rider\n\nThis package is not intended to be modified by users.\nNor does it provide any api intended to be included in user projects."
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.rider@1.1.0/LICENSE.md",
    "content": "MIT License\n\nCopyright (c) 2019 Unity Technologies\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.rider@1.1.0/LICENSE.md.meta",
    "content": "fileFormatVersion: 2\nguid: 5598b14661b5f4c43bed757f34b6d172\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.rider@1.1.0/Rider/Editor/Discovery.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing JetBrains.Annotations;\nusing Microsoft.Win32;\nusing Unity.CodeEditor;\nusing UnityEngine;\n\nnamespace Packages.Rider.Editor\n{\n  public interface IDiscovery\n  {\n    CodeEditor.Installation[] PathCallback();\n  }\n\n  public class Discovery : IDiscovery\n  {\n    public CodeEditor.Installation[] PathCallback()\n    {\n      return RiderPathLocator.GetAllRiderPaths()\n        .Select(riderInfo => new CodeEditor.Installation\n        {\n          Path = riderInfo.Path,\n          Name = riderInfo.Presentation\n        })\n        .OrderBy(a=>a.Name)\n        .ToArray();\n    }\n  }\n\n  /// <summary>\n  /// This code is a modified version of the JetBrains resharper-unity plugin listed here:\n  /// https://github.com/JetBrains/resharper-unity/blob/master/unity/JetBrains.Rider.Unity.Editor/EditorPlugin/RiderPathLocator.cs\n  /// </summary>\n  public static class RiderPathLocator\n  {\n#if !(UNITY_4_7 || UNITY_5_5)\n    [UsedImplicitly] // Used in com.unity.ide.rider\n    public static RiderInfo[] GetAllRiderPaths()\n    {\n      try\n      {\n        switch (SystemInfo.operatingSystemFamily)\n        {\n          case OperatingSystemFamily.Windows:\n          {\n            return CollectRiderInfosWindows();\n          }\n\n          case OperatingSystemFamily.MacOSX:\n          {\n            return CollectRiderInfosMac();\n          }\n\n          case OperatingSystemFamily.Linux:\n          {\n            return CollectAllRiderPathsLinux();\n          }\n        }\n      }\n      catch (Exception e)\n      {\n        Debug.LogException(e);\n      }\n\n      return new RiderInfo[0];\n    }\n#endif\n\n#if RIDER_EDITOR_PLUGIN // can't be used in com.unity.ide.rider\n    internal static RiderInfo[] GetAllFoundInfos(OperatingSystemFamilyRider operatingSystemFamily)\n    {\n      try\n      {\n        switch (operatingSystemFamily)\n        {\n          case OperatingSystemFamilyRider.Windows:\n          {\n            return CollectRiderInfosWindows();\n          }\n          case OperatingSystemFamilyRider.MacOSX:\n          {\n            return CollectRiderInfosMac();\n          }\n          case OperatingSystemFamilyRider.Linux:\n          {\n            return CollectAllRiderPathsLinux();\n          }\n        }\n      }\n      catch (Exception e)\n      {\n        Debug.LogException(e);\n      }\n\n      return new RiderInfo[0];\n    }\n\n    internal static string[] GetAllFoundPaths(OperatingSystemFamilyRider operatingSystemFamily)\n    {\n      return GetAllFoundInfos(operatingSystemFamily).Select(a=>a.Path).ToArray();\n    }\n#endif\n\n    private static RiderInfo[] CollectAllRiderPathsLinux()\n    {\n      var home = Environment.GetEnvironmentVariable(\"HOME\");\n      if (string.IsNullOrEmpty(home))\n        return new RiderInfo[0];\n\n      //$Home/.local/share/JetBrains/Toolbox/apps/Rider/ch-0/173.3994.1125/bin/rider.sh\n      //$Home/.local/share/JetBrains/Toolbox/apps/Rider/ch-0/.channel.settings.json\n      var toolboxRiderRootPath = Path.Combine(home, @\".local/share/JetBrains/Toolbox/apps/Rider\");\n      var paths = CollectPathsFromToolbox(toolboxRiderRootPath, \"bin\", \"rider.sh\", false)\n        .Select(a => new RiderInfo(a, true)).ToList();\n\n      //$Home/.local/share/applications/jetbrains-rider.desktop\n      var shortcut = new FileInfo(Path.Combine(home, @\".local/share/applications/jetbrains-rider.desktop\"));\n\n      if (shortcut.Exists)\n      {\n        var lines = File.ReadAllLines(shortcut.FullName);\n        foreach (var line in lines)\n        {\n          if (!line.StartsWith(\"Exec=\\\"\"))\n            continue;\n          var path = line.Split('\"').Where((item, index) => index == 1).SingleOrDefault();\n          if (string.IsNullOrEmpty(path))\n            continue;\n\n          if (paths.Any(a => a.Path == path)) // avoid adding similar build as from toolbox\n            continue;\n          paths.Add(new RiderInfo(path, false));\n        }\n      }\n\n      // snap install\n      var snapInstallPath = \"/snap/rider/current/bin/rider.sh\";\n      if (new FileInfo(snapInstallPath).Exists)\n        paths.Add(new RiderInfo(snapInstallPath, false));\n      \n      return paths.ToArray();\n    }\n\n    private static RiderInfo[] CollectRiderInfosMac()\n    {\n      // \"/Applications/*Rider*.app\"\n      var folder = new DirectoryInfo(\"/Applications\");\n      if (!folder.Exists)\n        return new RiderInfo[0];\n\n      var results = folder.GetDirectories(\"*Rider*.app\")\n        .Select(a => new RiderInfo(a.FullName, false))\n        .ToList();\n\n      // /Users/user/Library/Application Support/JetBrains/Toolbox/apps/Rider/ch-1/181.3870.267/Rider EAP.app\n      var home = Environment.GetEnvironmentVariable(\"HOME\");\n      if (!string.IsNullOrEmpty(home))\n      {\n        var toolboxRiderRootPath = Path.Combine(home, @\"Library/Application Support/JetBrains/Toolbox/apps/Rider\");\n        var paths = CollectPathsFromToolbox(toolboxRiderRootPath, \"\", \"Rider*.app\", true)\n          .Select(a => new RiderInfo(a, true));\n        results.AddRange(paths);\n      }\n\n      return results.ToArray();\n    }\n\n    internal static string GetBuildNumber(string path)\n    {\n      var file = new FileInfo(Path.Combine(path, GetRelativePathToBuildTxt()));\n      if (!file.Exists) \n        return string.Empty;\n      var text = File.ReadAllText(file.FullName);\n      if (text.Length > 3)\n        return text.Substring(3);\n      return string.Empty;\n    }\n\n    private static RiderInfo[] CollectRiderInfosWindows()\n    {\n      var localAppData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);\n      var toolboxRiderRootPath = Path.Combine(localAppData, @\"JetBrains\\Toolbox\\apps\\Rider\");\n      var installPathsToolbox = CollectPathsFromToolbox(toolboxRiderRootPath, \"bin\", \"rider64.exe\", false).ToList();\n      var installInfosToolbox = installPathsToolbox\n        .Select(a => new RiderInfo(a, true)).ToList();\n\n      var installPaths = new List<string>();\n      const string registryKey = @\"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\";\n      CollectPathsFromRegistry(registryKey, installPaths);\n      const string wowRegistryKey = @\"SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\";\n      CollectPathsFromRegistry(wowRegistryKey, installPaths);\n\n      var installInfos = installPaths\n        .Select(a => new RiderInfo(a, false)).ToList();\n      installInfos.AddRange(installInfosToolbox);\n\n      return installInfos.ToArray();\n    }\n\n    private static string GetRelativePathToBuildTxt()\n    {\n      switch (SystemInfo.operatingSystemFamily)\n      {\n        case OperatingSystemFamily.Windows: \n        case OperatingSystemFamily.Linux:\n          return \"../../build.txt\";\n        case OperatingSystemFamily.MacOSX:\n          return \"Contents/Resources/build.txt\";\n      }\n      throw new Exception(\"Unknown OS\");\n    }\n\n    private static void CollectPathsFromRegistry(string registryKey, List<string> installPaths)\n    {\n      using (var key = Registry.LocalMachine.OpenSubKey(registryKey))\n      {\n        if (key == null) return;\n        foreach (var subkeyName in key.GetSubKeyNames().Where(a => a.Contains(\"Rider\")))\n        {\n          using (var subkey = key.OpenSubKey(subkeyName))\n          {\n            var folderObject = subkey?.GetValue(\"InstallLocation\");\n            if (folderObject == null) continue;\n            var folder = folderObject.ToString();\n            var possiblePath = Path.Combine(folder, @\"bin\\rider64.exe\");\n            if (File.Exists(possiblePath))\n              installPaths.Add(possiblePath);\n          }\n        }\n      }\n    }\n\n    private static string[] CollectPathsFromToolbox(string toolboxRiderRootPath, string dirName, string searchPattern,\n      bool isMac)\n    {\n      if (!Directory.Exists(toolboxRiderRootPath))\n        return new string[0];\n\n      var channelDirs = Directory.GetDirectories(toolboxRiderRootPath);\n      var paths = channelDirs.SelectMany(channelDir =>\n        {\n          try\n          {\n            // use history.json - last entry stands for the active build https://jetbrains.slack.com/archives/C07KNP99D/p1547807024066500?thread_ts=1547731708.057700&cid=C07KNP99D\n            var historyFile = Path.Combine(channelDir, \".history.json\");\n            if (File.Exists(historyFile))\n            {\n              var json = File.ReadAllText(historyFile);\n              var build = ToolboxHistory.GetLatestBuildFromJson(json);\n              if (build != null)\n              {\n                var buildDir = Path.Combine(channelDir, build);\n                var executablePaths = GetExecutablePaths(dirName, searchPattern, isMac, buildDir);\n                if (executablePaths.Any())\n                  return executablePaths;\n              }\n            }\n\n            var channelFile = Path.Combine(channelDir, \".channel.settings.json\");\n            if (File.Exists(channelFile))\n            {\n              var json = File.ReadAllText(channelFile).Replace(\"active-application\", \"active_application\");\n              var build = ToolboxInstallData.GetLatestBuildFromJson(json);\n              if (build != null)\n              {\n                var buildDir = Path.Combine(channelDir, build);\n                var executablePaths = GetExecutablePaths(dirName, searchPattern, isMac, buildDir);\n                if (executablePaths.Any())\n                  return executablePaths;\n              }\n            }\n\n            // changes in toolbox json files format may brake the logic above, so return all found Rider installations\n            return Directory.GetDirectories(channelDir)\n              .SelectMany(buildDir => GetExecutablePaths(dirName, searchPattern, isMac, buildDir));\n          }\n          catch (Exception e)\n          {\n            // do not write to Debug.Log, just log it.\n            Logger.Warn($\"Failed to get RiderPath from {channelDir}\", e);\n          }\n\n          return new string[0];\n        })\n        .Where(c => !string.IsNullOrEmpty(c))\n        .ToArray();\n      return paths;\n    }\n\n    private static string[] GetExecutablePaths(string dirName, string searchPattern, bool isMac, string buildDir)\n    {\n      var folder = new DirectoryInfo(Path.Combine(buildDir, dirName));\n      if (!folder.Exists)\n        return new string[0];\n\n      if (!isMac)\n        return new[] {Path.Combine(folder.FullName, searchPattern)}.Where(File.Exists).ToArray();\n      return folder.GetDirectories(searchPattern).Select(f => f.FullName)\n        .Where(Directory.Exists).ToArray();\n    }\n\n    // Disable the \"field is never assigned\" compiler warning. We never assign it, but Unity does.\n    // Note that Unity disable this warning in the generated C# projects\n#pragma warning disable 0649\n\n    [Serializable]\n    class ToolboxHistory\n    {\n      public List<ItemNode> history;\n\n      [CanBeNull]\n      public static string GetLatestBuildFromJson(string json)\n      {\n        try\n        {\n#if UNITY_4_7 || UNITY_5_5\n          return JsonConvert.DeserializeObject<ToolboxHistory>(json).history.LastOrDefault()?.item.build;\n#else\n          return JsonUtility.FromJson<ToolboxHistory>(json).history.LastOrDefault()?.item.build;\n#endif\n        }\n        catch (Exception)\n        {\n          Logger.Warn($\"Failed to get latest build from json {json}\");\n        }\n\n        return null;\n      }\n    }\n\n    [Serializable]\n    class ItemNode\n    {\n      public BuildNode item;\n    }\n\n    [Serializable]\n    class BuildNode\n    {\n      public string build;\n    }\n\n    // ReSharper disable once ClassNeverInstantiated.Global\n    [Serializable]\n    class ToolboxInstallData\n    {\n      // ReSharper disable once InconsistentNaming\n      public ActiveApplication active_application;\n\n      [CanBeNull]\n      public static string GetLatestBuildFromJson(string json)\n      {\n        try\n        {\n#if UNITY_4_7 || UNITY_5_5\n          var toolbox = JsonConvert.DeserializeObject<ToolboxInstallData>(json);\n#else\n          var toolbox = JsonUtility.FromJson<ToolboxInstallData>(json);\n#endif\n          var builds = toolbox.active_application.builds;\n          if (builds != null && builds.Any())\n            return builds.First();\n        }\n        catch (Exception)\n        {\n          Logger.Warn($\"Failed to get latest build from json {json}\");\n        }\n\n        return null;\n      }\n    }\n\n    [Serializable]\n    class ActiveApplication\n    {\n      // ReSharper disable once InconsistentNaming\n      public List<string> builds;\n    }\n\n#pragma warning restore 0649\n\n    public struct RiderInfo\n    {\n      public string Presentation;\n      public string BuildVersion;\n      public string Path;\n\n      public RiderInfo(string path, bool isToolbox)\n      {\n        BuildVersion = GetBuildNumber(path);\n        Path = new FileInfo(path).FullName; // normalize separators\n        var presentation = \"Rider \" + BuildVersion;\n        if (isToolbox)\n          presentation += \" (JetBrains Toolbox)\";\n\n        Presentation = presentation;\n      }\n    }\n\n    private static class Logger\n    {\n      internal static void Warn(string message, Exception e = null)\n      {\n#if RIDER_EDITOR_PLUGIN // can't be used in com.unity.ide.rider\n        Log.GetLog(typeof(RiderPathLocator).Name).Warn(message);\n        if (e != null) \n          Log.GetLog(typeof(RiderPathLocator).Name).Warn(e);\n#else\n        Debug.LogError(message);\n        if (e != null)\n          Debug.LogException(e);\n#endif\n      }\n    }\n  }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.rider@1.1.0/Rider/Editor/Discovery.cs.meta",
    "content": "fileFormatVersion: 2\nguid: dab656c79e1985c40b31faebcda44442\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.rider@1.1.0/Rider/Editor/EditorPluginInterop.cs",
    "content": "using System;\nusing System.IO;\nusing System.Linq;\nusing System.Reflection;\nusing System.Runtime.CompilerServices;\nusing UnityEngine;\n\nnamespace Packages.Rider.Editor\n{\n  public static class EditorPluginInterop\n  {\n    private static string ourEntryPointTypeName = \"JetBrains.Rider.Unity.Editor.PluginEntryPoint\";\n\n    private static void DisableSyncSolutionOnceCallBack()\n    {\n      // RiderScriptableSingleton.Instance.CsprojProcessedOnce = true;\n      // Otherwise EditorPlugin regenerates all on every AppDomain reload\n      var assembly = GetEditorPluginAssembly();\n      if (assembly == null) return;\n      var type = assembly.GetType(\"JetBrains.Rider.Unity.Editor.Utils.RiderScriptableSingleton\");\n      if (type == null) return;\n      var baseType = type.BaseType;\n      if (baseType == null) return;\n      var instance = baseType.GetProperty(\"Instance\");\n      if (instance == null) return;\n      var instanceVal = instance.GetValue(null);\n      var member = type.GetProperty(\"CsprojProcessedOnce\");\n      if (member==null) return;\n      member.SetValue(instanceVal, true);\n    }\n    \n    public static string LogPath\n    {\n      get\n      {\n        try\n        {\n          var assembly = GetEditorPluginAssembly();\n          if (assembly == null) return null;\n          var type = assembly.GetType(ourEntryPointTypeName);\n          if (type == null) return null;\n          var field = type.GetField(\"LogPath\", BindingFlags.NonPublic | BindingFlags.Static);\n          if (field == null) return null;\n          return field.GetValue(null) as string;\n        }\n        catch (Exception)\n        {\n          Debug.Log(\"Unable to do OpenFile to Rider from dll, fallback to com.unity.ide.rider implementation.\");\n        }\n\n        return null;\n      }\n    }\n\n    public static bool OpenFileDllImplementation(string path, int line, int column)\n    {\n      var openResult = false;\n      // reflection for fast OpenFileLineCol, when Rider is started and protocol connection is established\n      try\n      {\n        var assembly = GetEditorPluginAssembly();\n        if (assembly == null) return false;\n        var type = assembly.GetType(ourEntryPointTypeName);\n        if (type == null) return false;\n        var field = type.GetField(\"OpenAssetHandler\", BindingFlags.NonPublic | BindingFlags.Static);\n        if (field == null) return false;\n        var handlerInstance = field.GetValue(null);\n        var method = handlerInstance.GetType()\n          .GetMethod(\"OnOpenedAsset\", new[] {typeof(string), typeof(int), typeof(int)});\n        if (method == null) return false;\n        var assetFilePath = path;\n        if (!string.IsNullOrEmpty(path))\n          assetFilePath = Path.GetFullPath(path);\n        \n        openResult = (bool) method.Invoke(handlerInstance, new object[] {assetFilePath, line, column});\n      }\n      catch (Exception e)\n      {\n        Debug.Log(\"Unable to do OpenFile to Rider from dll, fallback to com.unity.ide.rider implementation.\");\n        Debug.LogException(e);\n      }\n\n      return openResult;\n    }\n\n    public static Assembly GetEditorPluginAssembly()\n    {\n      var assemblies = AppDomain.CurrentDomain.GetAssemblies();\n      var assembly = assemblies.FirstOrDefault(a => a.GetName().Name.Equals(\"JetBrains.Rider.Unity.Editor.Plugin.Full.Repacked\"));\n      return assembly;\n    }\n\n    public static bool EditorPluginIsLoadedFromAssets()\n    {\n      var currentDir = Directory.GetCurrentDirectory();\n      var assembly = GetEditorPluginAssembly();\n      if (assembly == null)\n        return false;\n      var location = assembly.Location;\n      return location.StartsWith(currentDir, StringComparison.InvariantCultureIgnoreCase);\n    }\n\n\n    internal static void InitEntryPoint()\n    {\n      try\n      {\n        DisableSyncSolutionOnceCallBack(); // is require for Rider prior to 2019.2\n        \n        var type = GetEditorPluginAssembly().GetType(\"JetBrains.Rider.Unity.Editor.AfterUnity56.EntryPoint\");\n        if (type == null) \n          type = GetEditorPluginAssembly().GetType(\"JetBrains.Rider.Unity.Editor.UnitTesting.EntryPoint\"); // oldRider\n        RuntimeHelpers.RunClassConstructor(type.TypeHandle);\n      }\n      catch (TypeInitializationException ex)\n      {\n        Debug.LogException(ex);\n        if (ex.InnerException != null) \n          Debug.LogException(ex.InnerException);\n      }\n    }\n  }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.rider@1.1.0/Rider/Editor/EditorPluginInterop.cs.meta",
    "content": "fileFormatVersion: 2\nguid: f9bd02a3a916be64c9b47b1305149423\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.rider@1.1.0/Rider/Editor/LoggingLevel.cs",
    "content": "namespace Packages.Rider.Editor\n{\n  public enum LoggingLevel\n  {\n    /// <summary>\n    /// Do not use it in logging. Only in config to disable logging.\n    /// </summary>\n    OFF,\n    /// <summary>For errors that lead to application failure</summary>\n    FATAL,\n    /// <summary>For errors that must be shown in Exception Browser</summary>\n    ERROR,\n    /// <summary>Suspicious situations but not errors</summary>\n    WARN,\n    /// <summary>Regular level for important events</summary>\n    INFO,\n    /// <summary>Additional info for debbuging</summary>\n    VERBOSE,\n    /// <summary>Methods &amp; callstacks tracing, more than verbose</summary>\n    TRACE,\n  }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.rider@1.1.0/Rider/Editor/LoggingLevel.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 71bb46b59a9a7a346bbab1e185c723df\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.rider@1.1.0/Rider/Editor/PluginSettings.cs",
    "content": "using System.Reflection;\nusing Unity.CodeEditor;\nusing UnityEditor;\nusing UnityEngine;\n\nnamespace Packages.Rider.Editor\n{\n  public class PluginSettings\n  {\n    public static LoggingLevel SelectedLoggingLevel\n    {\n      get => (LoggingLevel) EditorPrefs.GetInt(\"Rider_SelectedLoggingLevel\", 0);\n      set\n      {\n        EditorPrefs.SetInt(\"Rider_SelectedLoggingLevel\", (int) value);\n      }\n    }\n\n    public static bool OverrideLangVersion\n    {\n      get { return EditorPrefs.GetBool(\"Rider_OverrideLangVersion\", false); }\n      private set { EditorPrefs.SetBool(\"Rider_OverrideLangVersion\", value);; }\n    }\n\n    public static string LangVersion\n    {\n      get { return EditorPrefs.GetString(\"Rider_LangVersion\", \"4\"); }\n      private set { EditorPrefs.SetString(\"Rider_LangVersion\", value); }\n    }\n\n    public static bool LogEventsCollectorEnabled\n    {\n      get { return EditorPrefs.GetBool(\"Rider_LogEventsCollectorEnabled\", true); }\n      private set { EditorPrefs.SetBool(\"Rider_LogEventsCollectorEnabled\", value); }\n    }\n\n\n    private static GUIStyle ourVersionInfoStyle = new GUIStyle()\n    {\n      normal = new GUIStyleState()\n      {\n        textColor = new Color(0, 0, 0, .6f),\n      }, \n      margin = new RectOffset(4, 4, 4, 4),\n    };\n\n    /// <summary>\n    /// Preferences menu layout\n    /// </summary>\n    /// <remarks>\n    /// Contains all 3 toggles: Enable/Disable; Debug On/Off; Writing Launch File On/Off\n    /// </remarks>\n    [SettingsProvider]\n    private static SettingsProvider RiderPreferencesItem()\n    {\n      if (!RiderScriptEditor.IsRiderInstallation(RiderScriptEditor.CurrentEditor))\n        return null;\n      if (!RiderScriptEditor.ShouldLoadEditorPlugin(RiderScriptEditor.CurrentEditor))\n        return null;\n      var provider = new SettingsProvider(\"Preferences/Rider\", SettingsScope.User)\n      {\n        label = \"Rider\",\n        keywords = new[] { \"Rider\" },\n        guiHandler = (searchContext) =>\n        {\n          EditorGUIUtility.labelWidth = 200f;\n          EditorGUILayout.BeginVertical();\n\n          GUILayout.BeginVertical();\n          LogEventsCollectorEnabled =\n            EditorGUILayout.Toggle(new GUIContent(\"Pass Console to Rider:\"), LogEventsCollectorEnabled);\n\n          GUILayout.EndVertical();\n\n          OverrideLangVersion = EditorGUILayout.Toggle(new GUIContent(\"Override LangVersion:\"), OverrideLangVersion);\n          if (OverrideLangVersion)\n          {\n            var workaroundUrl = \"https://gist.github.com/van800/875ce55eaf88d65b105d010d7b38a8d4\";\n            var workaroundText = \"Use this <color=#0000FF>workaround</color> if overriding doesn't work.\";\n            var helpLangVersion = @\"Avoid overriding, unless there is no particular need.\";\n\n            LangVersion =\n              EditorGUILayout.TextField(\n                new GUIContent(\"LangVersion:\",\n                  helpLangVersion), LangVersion);\n            LinkButton(caption: workaroundText, url: workaroundUrl);\n            EditorGUILayout.HelpBox(helpLangVersion, MessageType.None);\n          }\n\n          GUILayout.Label(\"\");\n\n          if (!string.IsNullOrEmpty(EditorPluginInterop.LogPath))\n          {\n            EditorGUILayout.BeginHorizontal();\n            EditorGUILayout.PrefixLabel(\"Log file:\");\n            var previous = GUI.enabled;\n            GUI.enabled = previous && SelectedLoggingLevel != LoggingLevel.OFF;\n            var button = GUILayout.Button(new GUIContent(\"Open log\"));\n            if (button)\n            {\n              //UnityEditorInternal.InternalEditorUtility.OpenFileAtLineExternal(PluginEntryPoint.LogPath, 0);\n              // works much faster than the commented code, when Rider is already started\n              CodeEditor.CurrentEditor.OpenProject(EditorPluginInterop.LogPath, 0, 0);\n            }\n\n            GUI.enabled = previous;\n            GUILayout.EndHorizontal();\n          }\n\n          var loggingMsg =\n            @\"Sets the amount of Rider Debug output. If you are about to report an issue, please select Verbose logging level and attach Unity console output to the issue.\";\n          SelectedLoggingLevel =\n            (LoggingLevel) EditorGUILayout.EnumPopup(new GUIContent(\"Logging Level:\", loggingMsg),\n              SelectedLoggingLevel);\n\n\n          EditorGUILayout.HelpBox(loggingMsg, MessageType.None);\n\n          var githubRepo = \"https://github.com/JetBrains/resharper-unity\";\n          var caption = $\"<color=#0000FF>{githubRepo}</color>\";\n          LinkButton(caption: caption, url: githubRepo);\n\n          GUILayout.FlexibleSpace();\n          GUILayout.BeginHorizontal();\n\n          GUILayout.FlexibleSpace();\n          var version = Assembly.GetExecutingAssembly().GetName().Version;\n          GUILayout.Label(\"Plugin version: \" + version, ourVersionInfoStyle);\n\n          GUILayout.EndHorizontal();\n\n          EditorGUILayout.EndVertical();\n        }\n      };\n      return provider;\n    }\n\n    private static void LinkButton(string caption, string url)\n    {\n      var style = GUI.skin.label;\n      style.richText = true;\n\n      var bClicked = GUILayout.Button(caption, style);\n\n      var rect = GUILayoutUtility.GetLastRect();\n      rect.width = style.CalcSize(new GUIContent(caption)).x;\n      EditorGUIUtility.AddCursorRect(rect, MouseCursor.Link);\n\n      if (bClicked)\n        Application.OpenURL(url);\n    }\n  }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.rider@1.1.0/Rider/Editor/PluginSettings.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 1bfe12aa306c0c74db4f4f1a1a0ae5ce\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.rider@1.1.0/Rider/Editor/ProjectGeneration.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Security;\nusing System.Security.Cryptography;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing Packages.Rider.Editor.Util;\nusing UnityEditor;\nusing UnityEditor.Compilation;\nusing UnityEditor.PackageManager;\nusing UnityEditorInternal;\nusing UnityEngine;\n\nnamespace Packages.Rider.Editor\n{\n  public interface IGenerator\n  {\n    bool SyncIfNeeded(IEnumerable<string> affectedFiles, IEnumerable<string> reimportedFiles);\n    void Sync();\n    bool HasSolutionBeenGenerated();\n    string SolutionFile();\n    string ProjectDirectory { get; }\n    void GenerateAll(bool generateAll);\n  }\n\n  public interface IAssemblyNameProvider\n  {\n    string GetAssemblyNameFromScriptPath(string path);\n    IEnumerable<Assembly> GetAllAssemblies(Func<string, bool> shouldFileBePartOfSolution);\n    IEnumerable<string> GetAllAssetPaths();\n    UnityEditor.PackageManager.PackageInfo FindForAssetPath(string assetPath);\n  }\n\n  public struct TestSettings\n  {\n    public bool ShouldSync;\n    public Dictionary<string, string> SyncPath;\n  }\n\n  class AssemblyNameProvider : IAssemblyNameProvider\n  {\n    public string GetAssemblyNameFromScriptPath(string path)\n    {\n      return CompilationPipeline.GetAssemblyNameFromScriptPath(path);\n    }\n\n    public IEnumerable<Assembly> GetAllAssemblies(Func<string, bool> shouldFileBePartOfSolution)\n    {\n      return CompilationPipeline.GetAssemblies()\n        .Where(i => 0 < i.sourceFiles.Length && i.sourceFiles.Any(shouldFileBePartOfSolution));\n    }\n\n    public IEnumerable<string> GetAllAssetPaths()\n    {\n      return AssetDatabase.GetAllAssetPaths();\n    }\n\n    public UnityEditor.PackageManager.PackageInfo FindForAssetPath(string assetPath)\n    {\n      return UnityEditor.PackageManager.PackageInfo.FindForAssetPath(assetPath);\n    }\n  }\n\n\n  public class ProjectGeneration : IGenerator\n  {\n    enum ScriptingLanguage\n    {\n      None,\n      CSharp\n    }\n\n    public static readonly string MSBuildNamespaceUri = \"http://schemas.microsoft.com/developer/msbuild/2003\";\n\n    const string k_WindowsNewline = \"\\r\\n\";\n\n    /// <summary>\n    /// Map source extensions to ScriptingLanguages\n    /// </summary>\n    static readonly Dictionary<string, ScriptingLanguage> k_BuiltinSupportedExtensions =\n      new Dictionary<string, ScriptingLanguage>\n      {\n        {\"cs\", ScriptingLanguage.CSharp},\n        {\"uxml\", ScriptingLanguage.None},\n        {\"uss\", ScriptingLanguage.None},\n        {\"shader\", ScriptingLanguage.None},\n        {\"compute\", ScriptingLanguage.None},\n        {\"cginc\", ScriptingLanguage.None},\n        {\"hlsl\", ScriptingLanguage.None},\n        {\"glslinc\", ScriptingLanguage.None}\n      };\n\n    string m_SolutionProjectEntryTemplate = string.Join(\"\\r\\n\",\n      @\"Project(\"\"{{{0}}}\"\") = \"\"{1}\"\", \"\"{2}\"\", \"\"{{{3}}}\"\"\",\n      @\"EndProject\").Replace(\"    \", \"\\t\");\n\n    string m_SolutionProjectConfigurationTemplate = string.Join(\"\\r\\n\",\n      @\"        {{{0}}}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\",\n      @\"        {{{0}}}.Debug|Any CPU.Build.0 = Debug|Any CPU\",\n      @\"        {{{0}}}.Release|Any CPU.ActiveCfg = Release|Any CPU\",\n      @\"        {{{0}}}.Release|Any CPU.Build.0 = Release|Any CPU\").Replace(\"    \", \"\\t\");\n\n    static readonly string[] k_ReimportSyncExtensions = {\".dll\", \".asmdef\"};\n\n    /// <summary>\n    /// Map ScriptingLanguages to project extensions\n    /// </summary>\n    /*static readonly Dictionary<ScriptingLanguage, string> k_ProjectExtensions = new Dictionary<ScriptingLanguage, string>\n    {\n        { ScriptingLanguage.CSharp, \".csproj\" },\n        { ScriptingLanguage.None, \".csproj\" },\n    };*/\n    static readonly Regex k_ScriptReferenceExpression = new Regex(\n      @\"^Library.ScriptAssemblies.(?<dllname>(?<project>.*)\\.dll$)\",\n      RegexOptions.Compiled | RegexOptions.IgnoreCase);\n\n    string[] m_ProjectSupportedExtensions = new string[0];\n    bool m_ShouldGenerateAll;\n\n    public string ProjectDirectory { get; }\n\n    public void GenerateAll(bool generateAll)\n    {\n      m_ShouldGenerateAll = generateAll;\n    }\n\n    public TestSettings Settings { get; set; }\n    readonly string m_ProjectName;\n    readonly IAssemblyNameProvider m_AssemblyNameProvider;\n\n    const string k_ToolsVersion = \"4.0\";\n    const string k_ProductVersion = \"10.0.20506\";\n    const string k_BaseDirectory = \".\";\n    const string k_TargetFrameworkVersion = \"v4.7.1\";\n    const string k_TargetLanguageVersion = \"latest\";\n\n    public ProjectGeneration() : this(Directory.GetParent(Application.dataPath).FullName, new AssemblyNameProvider())\n    {\n    }\n\n    public ProjectGeneration(string tempDirectory) : this(tempDirectory, new AssemblyNameProvider())\n    {\n    }\n\n    public ProjectGeneration(string tempDirectory, IAssemblyNameProvider assemblyNameProvider)\n    {\n      Settings = new TestSettings {ShouldSync = true};\n      ProjectDirectory = tempDirectory.Replace('\\\\', '/');\n      m_ProjectName = Path.GetFileName(ProjectDirectory);\n      m_AssemblyNameProvider = assemblyNameProvider;\n    }\n\n    /// <summary>\n    /// Syncs the scripting solution if any affected files are relevant.\n    /// </summary>\n    /// <returns>\n    /// Whether the solution was synced.\n    /// </returns>\n    /// <param name='affectedFiles'>\n    /// A set of files whose status has changed\n    /// </param>\n    /// <param name=\"reimportedFiles\">\n    /// A set of files that got reimported\n    /// </param>\n    public bool SyncIfNeeded(IEnumerable<string> affectedFiles, IEnumerable<string> reimportedFiles)\n    {\n      SetupProjectSupportedExtensions();\n      \n      if (HasFilesBeenModified(affectedFiles, reimportedFiles))\n      {\n        Sync();\n        return true;\n      }\n\n      return false;\n    }\n\n    bool HasFilesBeenModified(IEnumerable<string> affectedFiles, IEnumerable<string> reimportedFiles)\n    {\n      return affectedFiles.Any(ShouldFileBePartOfSolution) || reimportedFiles.Any(ShouldSyncOnReimportedAsset);\n    }\n\n    static bool ShouldSyncOnReimportedAsset(string asset)\n    {\n      return k_ReimportSyncExtensions.Contains(new FileInfo(asset).Extension);\n    }\n\n    public void Sync()\n    {\n      SetupProjectSupportedExtensions();\n      var types = GetAssetPostprocessorTypes();\n      bool externalCodeAlreadyGeneratedProjects = OnPreGeneratingCSProjectFiles(types);\n\n      if (!externalCodeAlreadyGeneratedProjects)\n      {\n        GenerateAndWriteSolutionAndProjects(types);\n      }\n      \n      OnGeneratedCSProjectFiles(types);\n    }\n\n    public bool HasSolutionBeenGenerated()\n    {\n      return File.Exists(SolutionFile());\n    }\n\n    void SetupProjectSupportedExtensions()\n    {\n      m_ProjectSupportedExtensions = EditorSettings.projectGenerationUserExtensions;\n    }\n\n    bool ShouldFileBePartOfSolution(string file)\n    {\n      string extension = Path.GetExtension(file);\n\n      // Exclude files coming from packages except if they are internalized.\n      if (!m_ShouldGenerateAll && IsInternalizedPackagePath(file))\n      {\n        return false;\n      }\n\n      // Dll's are not scripts but still need to be included..\n      if (extension == \".dll\")\n        return true;\n\n      if (file.ToLower().EndsWith(\".asmdef\"))\n        return true;\n\n      return IsSupportedExtension(extension);\n    }\n\n    bool IsSupportedExtension(string extension)\n    {\n      extension = extension.TrimStart('.');\n      if (k_BuiltinSupportedExtensions.ContainsKey(extension))\n        return true;\n      if (m_ProjectSupportedExtensions.Contains(extension))\n        return true;\n      return false;\n    }\n\n    static ScriptingLanguage ScriptingLanguageFor(Assembly island)\n    {\n      return ScriptingLanguageFor(GetExtensionOfSourceFiles(island.sourceFiles));\n    }\n\n    static string GetExtensionOfSourceFiles(string[] files)\n    {\n      return files.Length > 0 ? GetExtensionOfSourceFile(files[0]) : \"NA\";\n    }\n\n    static string GetExtensionOfSourceFile(string file)\n    {\n      var ext = Path.GetExtension(file).ToLower();\n      ext = ext.Substring(1); //strip dot\n      return ext;\n    }\n\n    static ScriptingLanguage ScriptingLanguageFor(string extension)\n    {\n      return k_BuiltinSupportedExtensions.TryGetValue(extension.TrimStart('.'), out var result)\n        ? result\n        : ScriptingLanguage.None;\n    }\n\n    public void GenerateAndWriteSolutionAndProjects(Type[] types)\n    {\n      // Only synchronize islands that have associated source files and ones that we actually want in the project.\n      // This also filters out DLLs coming from .asmdef files in packages.\n      var assemblies = m_AssemblyNameProvider.GetAllAssemblies(ShouldFileBePartOfSolution);\n\n      var allAssetProjectParts = GenerateAllAssetProjectParts();\n\n      var monoIslands = assemblies.ToList();\n\n      SyncSolution(monoIslands, types);\n      var allProjectIslands = RelevantIslandsForMode(monoIslands).ToList();\n      foreach (Assembly assembly in allProjectIslands)\n      {\n        var responseFileData = ParseResponseFileData(assembly);\n        SyncProject(assembly, allAssetProjectParts, responseFileData, allProjectIslands, types);\n      }\n    }\n\n    IEnumerable<ResponseFileData> ParseResponseFileData(Assembly assembly)\n    {\n      var systemReferenceDirectories =\n        CompilationPipeline.GetSystemAssemblyDirectories(assembly.compilerOptions.ApiCompatibilityLevel);\n\n      Dictionary<string, ResponseFileData> responseFilesData = assembly.compilerOptions.ResponseFiles.ToDictionary(\n        x => x, x => CompilationPipeline.ParseResponseFile(\n          Path.Combine(ProjectDirectory, x),\n          ProjectDirectory,\n          systemReferenceDirectories\n        ));\n\n      Dictionary<string, ResponseFileData> responseFilesWithErrors = responseFilesData.Where(x => x.Value.Errors.Any())\n        .ToDictionary(x => x.Key, x => x.Value);\n\n      if (responseFilesWithErrors.Any())\n      {\n        foreach (var error in responseFilesWithErrors)\n        foreach (var valueError in error.Value.Errors)\n        {\n          Debug.LogError($\"{error.Key} Parse Error : {valueError}\");\n        }\n      }\n\n      return responseFilesData.Select(x => x.Value);\n    }\n\n    Dictionary<string, string> GenerateAllAssetProjectParts()\n    {\n      Dictionary<string, StringBuilder> stringBuilders = new Dictionary<string, StringBuilder>();\n\n      foreach (string asset in m_AssemblyNameProvider.GetAllAssetPaths())\n      {\n        // Exclude files coming from packages except if they are internalized.\n        if (!m_ShouldGenerateAll && IsInternalizedPackagePath(asset))\n        {\n          continue;\n        }\n\n        string extension = Path.GetExtension(asset);\n        if (IsSupportedExtension(extension) && ScriptingLanguage.None == ScriptingLanguageFor(extension))\n        {\n          // Find assembly the asset belongs to by adding script extension and using compilation pipeline.\n          var assemblyName = m_AssemblyNameProvider.GetAssemblyNameFromScriptPath(asset + \".cs\");\n\n          if (string.IsNullOrEmpty(assemblyName))\n          {\n            continue;\n          }\n\n          assemblyName = FileSystemUtil.FileNameWithoutExtension(assemblyName);\n\n          if (!stringBuilders.TryGetValue(assemblyName, out var projectBuilder))\n          {\n            projectBuilder = new StringBuilder();\n            stringBuilders[assemblyName] = projectBuilder;\n          }\n\n          projectBuilder.Append(\"     <None Include=\\\"\").Append(EscapedRelativePathFor(asset)).Append(\"\\\" />\")\n            .Append(k_WindowsNewline);\n        }\n      }\n\n      var result = new Dictionary<string, string>();\n\n      foreach (var entry in stringBuilders)\n        result[entry.Key] = entry.Value.ToString();\n\n      return result;\n    }\n\n    bool IsInternalizedPackagePath(string file)\n    {\n      if (string.IsNullOrWhiteSpace(file))\n      {\n        return false;\n      }\n\n      var packageInfo = m_AssemblyNameProvider.FindForAssetPath(file);\n      if (packageInfo == null)\n      {\n        return false;\n      }\n\n      var packageSource = packageInfo.source;\n      return packageSource != PackageSource.Embedded && packageSource != PackageSource.Local;\n    }\n\n    void SyncProject(\n      Assembly island,\n      Dictionary<string, string> allAssetsProjectParts,\n      IEnumerable<ResponseFileData> responseFilesData,\n      List<Assembly> allProjectIslands,\n      Type[] types)\n    {\n      SyncProjectFileIfNotChanged(ProjectFile(island),\n        ProjectText(island, allAssetsProjectParts, responseFilesData, allProjectIslands), types);\n    }\n\n    void SyncProjectFileIfNotChanged(string path, string newContents, Type[] types)\n    {\n      if (Path.GetExtension(path) == \".csproj\")\n      {\n        newContents = OnGeneratedCSProject(path, newContents, types);\n      }\n\n      SyncFileIfNotChanged(path, newContents);\n    }\n\n    void SyncSolutionFileIfNotChanged(string path, string newContents, Type[] types)\n    {\n      newContents = OnGeneratedSlnSolution(path, newContents, types);\n\n      SyncFileIfNotChanged(path, newContents);\n    }\n\n    static List<Type> SafeGetTypes(System.Reflection.Assembly a)\n    {\n      List<Type> ret;\n\n      try\n      {\n        ret = a.GetTypes().ToList();\n      }\n      catch (System.Reflection.ReflectionTypeLoadException rtl)\n      {\n        ret = rtl.Types.ToList();\n      }\n      catch (Exception)\n      {\n        return new List<Type>();\n      }\n\n      return ret.Where(r => r != null).ToList();\n    }\n\n    static void OnGeneratedCSProjectFiles(Type[] types)\n    {\n      var args = new object[0];\n      foreach (var type in types)\n      {\n        var method = type.GetMethod(\"OnGeneratedCSProjectFiles\",\n          System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic |\n          System.Reflection.BindingFlags.Static);\n        if (method == null)\n        {\n          continue;\n        }\n\n        method.Invoke(null, args);\n      }\n    }\n\n    public static Type[] GetAssetPostprocessorTypes()\n    {\n      return TypeCache.GetTypesDerivedFrom<AssetPostprocessor>().ToArray(); // doesn't find types from EditorPlugin, which is fine\n    }\n\n    static bool OnPreGeneratingCSProjectFiles(Type[] types)\n    {\n      bool result = false;\n      foreach (var type in types)\n      {\n        var args = new object[0];\n        var method = type.GetMethod(\"OnPreGeneratingCSProjectFiles\",\n          System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic |\n          System.Reflection.BindingFlags.Static);\n        if (method == null)\n        {\n          continue;\n        }\n\n        var returnValue = method.Invoke(null, args);\n        if (method.ReturnType == typeof(bool))\n        {\n          result |= (bool) returnValue;\n        }\n      }\n\n      return result;\n    }\n\n    static string OnGeneratedCSProject(string path, string content, Type[] types)\n    {\n      foreach (var type in types)\n      {\n        var args = new[] {path, content};\n        var method = type.GetMethod(\"OnGeneratedCSProject\",\n          System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic |\n          System.Reflection.BindingFlags.Static);\n        if (method == null)\n        {\n          continue;\n        }\n\n        var returnValue = method.Invoke(null, args);\n        if (method.ReturnType == typeof(string))\n        {\n          content = (string) returnValue;\n        }\n      }\n\n      return content;\n    }\n\n    static string OnGeneratedSlnSolution(string path, string content, Type[] types)\n    {\n      foreach (var type in types)\n      {\n        var args = new[] {path, content};\n        var method = type.GetMethod(\"OnGeneratedSlnSolution\",\n          System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic |\n          System.Reflection.BindingFlags.Static);\n        if (method == null)\n        {\n          continue;\n        }\n\n        var returnValue = method.Invoke(null, args);\n        if (method.ReturnType == typeof(string))\n        {\n          content = (string) returnValue;\n        }\n      }\n\n      return content;\n    }\n\n    void SyncFileIfNotChanged(string filename, string newContents)\n    {\n      if (File.Exists(filename) &&\n          newContents == File.ReadAllText(filename))\n      {\n        return;\n      }\n\n      if (Settings.ShouldSync)\n      {\n        File.WriteAllText(filename, newContents, Encoding.UTF8);\n      }\n      else\n      {\n        var utf8 = Encoding.UTF8;\n        byte[] utfBytes = utf8.GetBytes(newContents);\n        Settings.SyncPath[filename] = utf8.GetString(utfBytes, 0, utfBytes.Length);\n      }\n    }\n\n    string ProjectText(Assembly assembly,\n      Dictionary<string, string> allAssetsProjectParts,\n      IEnumerable<ResponseFileData> responseFilesData,\n      List<Assembly> allProjectIslands)\n    {\n      var projectBuilder = new StringBuilder(ProjectHeader(assembly, responseFilesData));\n      var references = new List<string>();\n      var projectReferences = new List<Match>();\n\n      foreach (string file in assembly.sourceFiles)\n      {\n        if (!ShouldFileBePartOfSolution(file))\n          continue;\n\n        var extension = Path.GetExtension(file).ToLower();\n        var fullFile = EscapedRelativePathFor(file);\n        if (\".dll\" != extension)\n        {\n          projectBuilder.Append(\"     <Compile Include=\\\"\").Append(fullFile).Append(\"\\\" />\").Append(k_WindowsNewline);\n        }\n        else\n        {\n          references.Add(fullFile);\n        }\n      }\n\n      var assemblyName = FileSystemUtil.FileNameWithoutExtension(assembly.outputPath);\n\n      // Append additional non-script files that should be included in project generation.\n      if (allAssetsProjectParts.TryGetValue(assemblyName, out var additionalAssetsForProject))\n        projectBuilder.Append(additionalAssetsForProject);\n\n      var islandRefs = references.Union(assembly.allReferences);\n\n      foreach (string reference in islandRefs)\n      {\n        if (reference.EndsWith(\"/UnityEditor.dll\", StringComparison.Ordinal)\n            || reference.EndsWith(\"/UnityEngine.dll\", StringComparison.Ordinal)\n            || reference.EndsWith(\"\\\\UnityEditor.dll\", StringComparison.Ordinal)\n            || reference.EndsWith(\"\\\\UnityEngine.dll\", StringComparison.Ordinal))\n          continue;\n\n        var match = k_ScriptReferenceExpression.Match(reference);\n        if (match.Success)\n        {\n          // assume csharp language\n          // Add a reference to a project except if it's a reference to a script assembly\n          // that we are not generating a project for. This will be the case for assemblies\n          // coming from .assembly.json files in non-internalized packages.\n          var dllName = match.Groups[\"dllname\"].Value;\n          if (allProjectIslands.Any(i => Path.GetFileName(i.outputPath) == dllName))\n          {\n            projectReferences.Add(match);\n            continue;\n          }\n        }\n\n        string fullReference = Path.IsPathRooted(reference) ? reference : Path.Combine(ProjectDirectory, reference);\n\n        AppendReference(fullReference, projectBuilder);\n      }\n\n      var responseRefs = responseFilesData.SelectMany(x => x.FullPathReferences.Select(r => r));\n      foreach (var reference in responseRefs)\n      {\n        AppendReference(reference, projectBuilder);\n      }\n\n      if (0 < projectReferences.Count)\n      {\n        projectBuilder.AppendLine(\"  </ItemGroup>\");\n        projectBuilder.AppendLine(\"  <ItemGroup>\");\n        foreach (Match reference in projectReferences)\n        {\n          var referencedProject = reference.Groups[\"project\"].Value;\n\n          projectBuilder.Append(\"    <ProjectReference Include=\\\"\").Append(referencedProject)\n            .Append(GetProjectExtension()).Append(\"\\\">\").Append(k_WindowsNewline);\n          projectBuilder.Append(\"      <Project>{\")\n            .Append(ProjectGuid(Path.Combine(\"Temp\", reference.Groups[\"project\"].Value + \".dll\"))).Append(\"}</Project>\")\n            .Append(k_WindowsNewline);\n          projectBuilder.Append(\"      <Name>\").Append(referencedProject).Append(\"</Name>\").Append(k_WindowsNewline);\n          projectBuilder.AppendLine(\"    </ProjectReference>\");\n        }\n      }\n\n      projectBuilder.Append(ProjectFooter());\n      return projectBuilder.ToString();\n    }\n\n    static void AppendReference(string fullReference, StringBuilder projectBuilder)\n    {\n      //replace \\ with / and \\\\ with /\n      var escapedFullPath = SecurityElement.Escape(fullReference);\n      escapedFullPath = escapedFullPath.Replace(\"\\\\\\\\\", \"/\").Replace(\"\\\\\", \"/\");\n      projectBuilder.Append(\" <Reference Include=\\\"\").Append(FileSystemUtil.FileNameWithoutExtension(escapedFullPath))\n        .Append(\"\\\">\").Append(k_WindowsNewline);\n      projectBuilder.Append(\" <HintPath>\").Append(escapedFullPath).Append(\"</HintPath>\").Append(k_WindowsNewline);\n      projectBuilder.Append(\" </Reference>\").Append(k_WindowsNewline);\n    }\n\n    public string ProjectFile(Assembly assembly)\n    {\n      return Path.Combine(ProjectDirectory, $\"{FileSystemUtil.FileNameWithoutExtension(assembly.outputPath)}.csproj\");\n    }\n\n    public string SolutionFile()\n    {\n      return Path.Combine(ProjectDirectory, $\"{m_ProjectName}.sln\");\n    }\n\n    string ProjectHeader(\n      Assembly island,\n      IEnumerable<ResponseFileData> responseFilesData\n    )\n    {\n      var arguments = new object[]\n      {\n        k_ToolsVersion, k_ProductVersion, ProjectGuid(island.outputPath),\n        InternalEditorUtility.GetEngineAssemblyPath(),\n        InternalEditorUtility.GetEditorAssemblyPath(),\n        string.Join(\";\",\n          new[] {\"DEBUG\", \"TRACE\"}.Concat(EditorUserBuildSettings.activeScriptCompilationDefines).Concat(island.defines)\n            .Concat(responseFilesData.SelectMany(x => x.Defines)).Distinct().ToArray()),\n        MSBuildNamespaceUri,\n        FileSystemUtil.FileNameWithoutExtension(island.outputPath),\n        EditorSettings.projectGenerationRootNamespace,\n        k_TargetFrameworkVersion,\n        PluginSettings.OverrideLangVersion?PluginSettings.LangVersion:k_TargetLanguageVersion,\n        k_BaseDirectory,\n        island.compilerOptions.AllowUnsafeCode | responseFilesData.Any(x => x.Unsafe)\n      };\n\n      try\n      {\n        return string.Format(GetProjectHeaderTemplate(), arguments);\n      }\n      catch (Exception)\n      {\n        throw new NotSupportedException(\n          \"Failed creating c# project because the c# project header did not have the correct amount of arguments, which is \" +\n          arguments.Length);\n      }\n    }\n\n    static string GetSolutionText()\n    {\n      return string.Join(\"\\r\\n\",\n        @\"\",\n        @\"Microsoft Visual Studio Solution File, Format Version {0}\",\n        @\"# Visual Studio {1}\",\n        @\"{2}\",\n        @\"Global\",\n        @\"    GlobalSection(SolutionConfigurationPlatforms) = preSolution\",\n        @\"        Debug|Any CPU = Debug|Any CPU\",\n        @\"        Release|Any CPU = Release|Any CPU\",\n        @\"    EndGlobalSection\",\n        @\"    GlobalSection(ProjectConfigurationPlatforms) = postSolution\",\n        @\"{3}\",\n        @\"    EndGlobalSection\",\n        @\"    GlobalSection(SolutionProperties) = preSolution\",\n        @\"        HideSolutionNode = FALSE\",\n        @\"    EndGlobalSection\",\n        @\"EndGlobal\",\n        @\"\").Replace(\"    \", \"\\t\");\n    }\n\n    static string GetProjectFooterTemplate()\n    {\n      return string.Join(\"\\r\\n\",\n        @\"  </ItemGroup>\",\n        @\"  <Import Project=\"\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\"\" />\",\n        @\"  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \",\n        @\"       Other similar extension points exist, see Microsoft.Common.targets.\",\n        @\"  <Target Name=\"\"BeforeBuild\"\">\",\n        @\"  </Target>\",\n        @\"  <Target Name=\"\"AfterBuild\"\">\",\n        @\"  </Target>\",\n        @\"  -->\",\n        @\"</Project>\",\n        @\"\");\n    }\n\n    static string GetProjectHeaderTemplate()\n    {\n      var header = new[]\n      {\n        @\"<?xml version=\"\"1.0\"\" encoding=\"\"utf-8\"\"?>\",\n        @\"<Project ToolsVersion=\"\"{0}\"\" DefaultTargets=\"\"Build\"\" xmlns=\"\"{6}\"\">\",\n        @\"  <PropertyGroup>\",\n        @\"    <LangVersion>{10}</LangVersion>\",\n        @\"    <_TargetFrameworkDirectories>non_empty_path_generated_by_unity.rider.package</_TargetFrameworkDirectories>\",\n        @\"    <_FullFrameworkReferenceAssemblyPaths>non_empty_path_generated_by_unity.rider.package</_FullFrameworkReferenceAssemblyPaths>\", \n        @\"    <DisableHandlePackageFileConflicts>true</DisableHandlePackageFileConflicts>\",\n        @\"  </PropertyGroup>\",\n        @\"  <PropertyGroup>\",\n        @\"    <Configuration Condition=\"\" '$(Configuration)' == '' \"\">Debug</Configuration>\",\n        @\"    <Platform Condition=\"\" '$(Platform)' == '' \"\">AnyCPU</Platform>\",\n        @\"    <ProductVersion>{1}</ProductVersion>\",\n        @\"    <SchemaVersion>2.0</SchemaVersion>\",\n        @\"    <RootNamespace>{8}</RootNamespace>\",\n        @\"    <ProjectGuid>{{{2}}}</ProjectGuid>\",\n        @\"    <OutputType>Library</OutputType>\",\n        @\"    <AppDesignerFolder>Properties</AppDesignerFolder>\",\n        @\"    <AssemblyName>{7}</AssemblyName>\",\n        @\"    <TargetFrameworkVersion>{9}</TargetFrameworkVersion>\",\n        @\"    <FileAlignment>512</FileAlignment>\",\n        @\"    <BaseDirectory>{11}</BaseDirectory>\",\n        @\"  </PropertyGroup>\",\n        @\"  <PropertyGroup Condition=\"\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \"\">\",\n        @\"    <DebugSymbols>true</DebugSymbols>\",\n        @\"    <DebugType>full</DebugType>\",\n        @\"    <Optimize>false</Optimize>\",\n        @\"    <OutputPath>Temp\\bin\\Debug\\</OutputPath>\",\n        @\"    <DefineConstants>{5}</DefineConstants>\",\n        @\"    <ErrorReport>prompt</ErrorReport>\",\n        @\"    <WarningLevel>4</WarningLevel>\",\n        @\"    <NoWarn>0169</NoWarn>\",\n        @\"    <AllowUnsafeBlocks>{12}</AllowUnsafeBlocks>\",\n        @\"  </PropertyGroup>\",\n        @\"  <PropertyGroup Condition=\"\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \"\">\",\n        @\"    <DebugType>pdbonly</DebugType>\",\n        @\"    <Optimize>true</Optimize>\",\n        @\"    <OutputPath>Temp\\bin\\Release\\</OutputPath>\",\n        @\"    <ErrorReport>prompt</ErrorReport>\",\n        @\"    <WarningLevel>4</WarningLevel>\",\n        @\"    <NoWarn>0169</NoWarn>\",\n        @\"    <AllowUnsafeBlocks>{12}</AllowUnsafeBlocks>\",\n        @\"  </PropertyGroup>\"\n      };\n\n      var forceExplicitReferences = new[]\n      {\n        @\"  <PropertyGroup>\",\n        @\"    <NoConfig>true</NoConfig>\",\n        @\"    <NoStdLib>true</NoStdLib>\",\n        @\"    <AddAdditionalExplicitAssemblyReferences>false</AddAdditionalExplicitAssemblyReferences>\",\n        @\"    <ImplicitlyExpandNETStandardFacades>false</ImplicitlyExpandNETStandardFacades>\",\n        @\"    <ImplicitlyExpandDesignTimeFacades>false</ImplicitlyExpandDesignTimeFacades>\",\n        @\"  </PropertyGroup>\"\n      };\n\n      var itemGroupStart = new[]\n      {\n        @\"  <ItemGroup>\"\n      };\n\n      var footer = new[]\n      {\n        @\"    <Reference Include=\"\"UnityEngine\"\">\",\n        @\"      <HintPath>{3}</HintPath>\",\n        @\"    </Reference>\",\n        @\"    <Reference Include=\"\"UnityEditor\"\">\",\n        @\"      <HintPath>{4}</HintPath>\",\n        @\"    </Reference>\",\n        @\"  </ItemGroup>\",\n        @\"  <ItemGroup>\",\n        @\"\"\n      };\n\n      var text = header.Concat(forceExplicitReferences).Concat(itemGroupStart).Concat(footer).ToArray();\n      return string.Join(\"\\r\\n\", text);\n    }\n\n    void SyncSolution(IEnumerable<Assembly> islands, Type[] types)\n    {\n      SyncSolutionFileIfNotChanged(SolutionFile(), SolutionText(islands), types);\n    }\n\n    string SolutionText(IEnumerable<Assembly> islands)\n    {\n      var fileversion = \"11.00\";\n      var vsversion = \"2010\";\n\n      var relevantIslands = RelevantIslandsForMode(islands);\n      string projectEntries = GetProjectEntries(relevantIslands);\n      string projectConfigurations = string.Join(k_WindowsNewline,\n        relevantIslands.Select(i => GetProjectActiveConfigurations(ProjectGuid(i.outputPath))).ToArray());\n      return string.Format(GetSolutionText(), fileversion, vsversion, projectEntries, projectConfigurations);\n    }\n\n    static IEnumerable<Assembly> RelevantIslandsForMode(IEnumerable<Assembly> islands)\n    {\n      IEnumerable<Assembly> relevantIslands = islands.Where(i => ScriptingLanguage.CSharp == ScriptingLanguageFor(i));\n      return relevantIslands;\n    }\n\n    /// <summary>\n    /// Get a Project(\"{guid}\") = \"MyProject\", \"MyProject.unityproj\", \"{projectguid}\"\n    /// entry for each relevant language\n    /// </summary>\n    string GetProjectEntries(IEnumerable<Assembly> islands)\n    {\n      var projectEntries = islands.Select(i => string.Format(\n        m_SolutionProjectEntryTemplate,\n        SolutionGuid(i), FileSystemUtil.FileNameWithoutExtension(i.outputPath), Path.GetFileName(ProjectFile(i)),\n        ProjectGuid(i.outputPath)\n      ));\n\n      return string.Join(k_WindowsNewline, projectEntries.ToArray());\n    }\n\n    /// <summary>\n    /// Generate the active configuration string for a given project guid\n    /// </summary>\n    string GetProjectActiveConfigurations(string projectGuid)\n    {\n      return string.Format(\n        m_SolutionProjectConfigurationTemplate,\n        projectGuid);\n    }\n\n    string EscapedRelativePathFor(string file)\n    {\n      var projectDir = ProjectDirectory.Replace('/', '\\\\');\n      file = file.Replace('/', '\\\\');\n      var path = SkipPathPrefix(file, projectDir);\n\n      var packageInfo = m_AssemblyNameProvider.FindForAssetPath(path.Replace('\\\\', '/'));\n      if (packageInfo != null)\n      {\n        // We have to normalize the path, because the PackageManagerRemapper assumes\n        // dir seperators will be os specific.\n        var absolutePath = Path.GetFullPath(NormalizePath(path)).Replace('/', '\\\\');\n        path = SkipPathPrefix(absolutePath, projectDir);\n      }\n\n      return SecurityElement.Escape(path);\n    }\n\n    static string SkipPathPrefix(string path, string prefix)\n    {\n      if (path.Replace(\"\\\\\", \"/\").StartsWith($\"{prefix}/\"))\n        return path.Substring(prefix.Length + 1);\n      return path;\n    }\n\n    static string NormalizePath(string path)\n    {\n      if (Path.DirectorySeparatorChar == '\\\\')\n        return path.Replace('/', Path.DirectorySeparatorChar);\n      return path.Replace('\\\\', Path.DirectorySeparatorChar);\n    }\n\n\n    string ProjectGuid(string assembly)\n    {\n      return SolutionGuidGenerator.GuidForProject(m_ProjectName + FileSystemUtil.FileNameWithoutExtension(assembly));\n    }\n\n    string SolutionGuid(Assembly island)\n    {\n      return SolutionGuidGenerator.GuidForSolution(m_ProjectName, GetExtensionOfSourceFiles(island.sourceFiles));\n    }\n\n    static string ProjectFooter()\n    {\n      return GetProjectFooterTemplate();\n    }\n\n    static string GetProjectExtension()\n    {\n      return \".csproj\";\n    }\n  }\n\n  public static class SolutionGuidGenerator\n  {\n    public static string GuidForProject(string projectName)\n    {\n      return ComputeGuidHashFor(projectName + \"salt\");\n    }\n\n    public static string GuidForSolution(string projectName, string sourceFileExtension)\n    {\n      if (sourceFileExtension.ToLower() == \"cs\")\n        // GUID for a C# class library: http://www.codeproject.com/Reference/720512/List-of-Visual-Studio-Project-Type-GUIDs\n        return \"FAE04EC0-301F-11D3-BF4B-00C04F79EFBC\";\n\n      return ComputeGuidHashFor(projectName);\n    }\n\n    static string ComputeGuidHashFor(string input)\n    {\n      var hash = MD5.Create().ComputeHash(Encoding.Default.GetBytes(input));\n      return HashAsGuid(HashToString(hash));\n    }\n\n    static string HashAsGuid(string hash)\n    {\n      var guid = hash.Substring(0, 8) + \"-\" + hash.Substring(8, 4) + \"-\" + hash.Substring(12, 4) + \"-\" +\n                 hash.Substring(16, 4) + \"-\" + hash.Substring(20, 12);\n      return guid.ToUpper();\n    }\n\n    static string HashToString(byte[] bs)\n    {\n      var sb = new StringBuilder();\n      foreach (byte b in bs)\n        sb.Append(b.ToString(\"x2\"));\n      return sb.ToString();\n    }\n  }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.rider@1.1.0/Rider/Editor/ProjectGeneration.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 8df45492ff0815a488744d61efcecba7\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.rider@1.1.0/Rider/Editor/RiderInitializer.cs",
    "content": "using System;\nusing System.IO;\nusing System.Linq;\nusing System.Reflection;\nusing UnityEngine;\n\nnamespace Packages.Rider.Editor\n{\n    internal class RiderInitializer\n    {\n      public void Initialize(string editorPath)\n      {\n        if (EditorPluginInterop.EditorPluginIsLoadedFromAssets())\n        {\n          Debug.LogError($\"Please delete {EditorPluginInterop.GetEditorPluginAssembly().Location}. Unity 2019.2+ loads it directly from Rider installation. To disable this, open Rider's settings, search and uncheck 'Automatically install and update Rider's Unity editor plugin'.\");\n          return;\n        }\n\n        var dllName = \"JetBrains.Rider.Unity.Editor.Plugin.Full.Repacked.dll\";\n        var relPath = \"../../plugins/rider-unity/EditorPlugin\";\n        if (SystemInfo.operatingSystemFamily == OperatingSystemFamily.MacOSX)\n          relPath = \"Contents/plugins/rider-unity/EditorPlugin\";\n        var dllFile = new FileInfo(Path.Combine(Path.Combine(editorPath, relPath), dllName));\n\n        if (dllFile.Exists)\n        {\n          // doesn't lock assembly on disk\n          var bytes = File.ReadAllBytes(dllFile.FullName);\n          var pdbFile = new FileInfo(Path.ChangeExtension(dllFile.FullName, \".pdb\"));\n          if (pdbFile.Exists)\n          {\n            AppDomain.CurrentDomain.Load(bytes, File.ReadAllBytes(pdbFile.FullName));  \n          }\n          else\n          {\n            AppDomain.CurrentDomain.Load(bytes);\n            // AppDomain.CurrentDomain.Load(AssemblyName.GetAssemblyName(dllFile.FullName)); // use this for external source debug\n          }\n          EditorPluginInterop.InitEntryPoint();\n        }\n        else\n        {\n          Debug.Log((object) ($\"Unable to find Rider EditorPlugin {dllFile.FullName} for Unity \"));\n        }\n      }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.rider@1.1.0/Rider/Editor/RiderInitializer.cs.meta",
    "content": "fileFormatVersion: 2\nguid: f5a0cc9645f0e2d4fb816156dcf3f4dd\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.rider@1.1.0/Rider/Editor/RiderScriptEditor.cs",
    "content": "using System;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Linq;\nusing Packages.Rider.Editor.Util;\nusing Unity.CodeEditor;\nusing UnityEditor;\nusing UnityEngine;\nusing Debug = UnityEngine.Debug;\n\nnamespace Packages.Rider.Editor\n{\n  [InitializeOnLoad]\n  public class RiderScriptEditor : IExternalCodeEditor\n  {\n    IDiscovery m_Discoverability;\n    IGenerator m_ProjectGeneration;\n    RiderInitializer m_Initiliazer = new RiderInitializer();\n\n    static RiderScriptEditor()\n    {\n      try\n      {\n        var projectGeneration = new ProjectGeneration();\n        var editor = new RiderScriptEditor(new Discovery(), projectGeneration);\n        CodeEditor.Register(editor);\n        \n        var path = GetEditorRealPath(CodeEditor.CurrentEditorInstallation);\n        if (IsRiderInstallation(path))\n        {\n          if (!FileSystemUtil.EditorPathExists(path)) // previously used rider was removed\n          {\n            var newEditor = editor.Installations.Last().Path;\n            CodeEditor.SetExternalScriptEditor(newEditor);\n            path = newEditor;\n          }\n          \n          editor.CreateSolutionIfDoesntExist();\n          if (ShouldLoadEditorPlugin(path))\n          {\n            editor.m_Initiliazer.Initialize(path);\n          }\n\n          InitProjectFilesWatcher();\n        }\n      }\n      catch (Exception e)\n      {\n        Debug.LogException(e);\n      }\n    }\n\n    private static void InitProjectFilesWatcher()\n    {\n      var watcher = new FileSystemWatcher();\n      watcher.Path = Directory.GetCurrentDirectory();\n      watcher.NotifyFilter = NotifyFilters.LastWrite; //Watch for changes in LastWrite times\n      watcher.Filter = \"*.*\";\n\n      // Add event handlers.\n      watcher.Changed += OnChanged;\n      watcher.Created += OnChanged;\n\n      watcher.EnableRaisingEvents = true; // Begin watching.\n      \n      AppDomain.CurrentDomain.DomainUnload += (EventHandler) ((_, __) =>\n      {\n        watcher.Dispose();\n      });\n    }\n\n    private static void OnChanged(object sender, FileSystemEventArgs e)\n    {\n      var extension = Path.GetExtension(e.FullPath);\n      if (extension == \".sln\" || extension == \".csproj\") \n        RiderScriptEditorData.instance.HasChanges = true;\n    }\n\n    private static string GetEditorRealPath(string path)\n    {\n      if (string.IsNullOrEmpty(path))\n      {\n        return path;\n      }\n\n      if (!FileSystemUtil.EditorPathExists(path))\n        return path;\n\n      if (SystemInfo.operatingSystemFamily != OperatingSystemFamily.Windows)\n      {\n        var realPath = FileSystemUtil.GetFinalPathName(path);\n        \n        // case of snap installation\n        if (SystemInfo.operatingSystemFamily == OperatingSystemFamily.Linux)\n        {\n          if (new FileInfo(path).Name.ToLowerInvariant() == \"rider\" &&\n              new FileInfo(realPath).Name.ToLowerInvariant() == \"snap\")\n          {\n            var snapInstallPath = \"/snap/rider/current/bin/rider.sh\";\n            if (new FileInfo(snapInstallPath).Exists)\n              return snapInstallPath;\n          }\n        }\n        \n        // in case of symlink\n        return realPath;\n      }\n\n      return path;\n    }\n\n    const string unity_generate_all = \"unity_generate_all_csproj\";\n\n    public RiderScriptEditor(IDiscovery discovery, IGenerator projectGeneration)\n    {\n      m_Discoverability = discovery;\n      m_ProjectGeneration = projectGeneration;\n    }\n\n    private static string[] defaultExtensions\n    {\n      get\n      {\n        var customExtensions = new[] {\"json\", \"asmdef\", \"log\"};\n        return EditorSettings.projectGenerationBuiltinExtensions.Concat(EditorSettings.projectGenerationUserExtensions)\n          .Concat(customExtensions).Distinct().ToArray();\n      }\n    }\n\n    private static string[] HandledExtensions\n    {\n      get\n      {\n        return HandledExtensionsString.Split(new[] {';'}, StringSplitOptions.RemoveEmptyEntries).Select(s => s.TrimStart('.', '*'))\n          .ToArray();\n      } \n    }\n\n    private static string HandledExtensionsString\n    {\n      get { return EditorPrefs.GetString(\"Rider_UserExtensions\", string.Join(\";\", defaultExtensions));}\n      set { EditorPrefs.SetString(\"Rider_UserExtensions\", value); }\n    }\n    \n    private static bool SupportsExtension(string path)\n    {\n      var extension = Path.GetExtension(path);\n      if (string.IsNullOrEmpty(extension))\n        return false; \n      return HandledExtensions.Contains(extension.TrimStart('.'));\n    }\n\n    public void OnGUI()\n    {\n      var prevGenerate = EditorPrefs.GetBool(unity_generate_all, false);\n      var generateAll = EditorGUILayout.Toggle(\"Generate all .csproj files.\", prevGenerate);\n      if (generateAll != prevGenerate)\n      {\n        EditorPrefs.SetBool(unity_generate_all, generateAll);\n      }\n      \n      m_ProjectGeneration.GenerateAll(generateAll);\n\n      if (ShouldLoadEditorPlugin(CurrentEditor))\n      {\n        HandledExtensionsString = EditorGUILayout.TextField(new GUIContent(\"Extensions handled: \"), HandledExtensionsString);  \n      }\n    }\n\n    public void SyncIfNeeded(string[] addedFiles, string[] deletedFiles, string[] movedFiles, string[] movedFromFiles,\n      string[] importedFiles)\n    {\n      m_ProjectGeneration.SyncIfNeeded(addedFiles.Union(deletedFiles).Union(movedFiles).Union(movedFromFiles),\n        importedFiles);\n    }\n\n    public void SyncAll()\n    {\n      AssetDatabase.Refresh();\n      if (RiderScriptEditorData.instance.HasChanges)\n      {\n        m_ProjectGeneration.Sync();\n        RiderScriptEditorData.instance.HasChanges = false;\n      }\n    }\n\n    public void Initialize(string editorInstallationPath) // is called each time ExternalEditor is changed\n    {\n      m_ProjectGeneration.Sync(); // regenerate csproj and sln for new editor\n    }\n\n    public bool OpenProject(string path, int line, int column)\n    {\n      if (path != \"\" && !SupportsExtension(path)) // Assets - Open C# Project passes empty path here\n      {\n        return false;\n      }\n      \n      if (path == \"\" && SystemInfo.operatingSystemFamily == OperatingSystemFamily.MacOSX)\n      {\n        // there is a bug in DllImplementation - use package implementation here instead https://github.cds.internal.unity3d.com/unity/com.unity.ide.rider/issues/21\n        return OpenOSXApp(path, line, column);\n      }\n\n      if (!IsUnityScript(path))\n      {\n        var fastOpenResult = EditorPluginInterop.OpenFileDllImplementation(path, line, column);\n        if (fastOpenResult)\n          return true;\n      }\n\n      if (SystemInfo.operatingSystemFamily == OperatingSystemFamily.MacOSX)\n      {\n        return OpenOSXApp(path, line, column);\n      }\n\n      var solution = GetSolutionFile(path); // TODO: If solution file doesn't exist resync.\n      solution = solution == \"\" ? \"\" : $\"\\\"{solution}\\\"\";\n      var process = new Process\n      {\n        StartInfo = new ProcessStartInfo\n        {\n          FileName = CodeEditor.CurrentEditorInstallation,\n          Arguments = $\"{solution} -l {line} \\\"{path}\\\"\",\n          UseShellExecute = true,\n        }\n      };\n\n      process.Start();\n\n      return true;\n    }\n\n    private bool OpenOSXApp(string path, int line, int column)\n    {\n      var solution = GetSolutionFile(path); // TODO: If solution file doesn't exist resync.\n      solution = solution == \"\" ? \"\" : $\"\\\"{solution}\\\"\";\n      var pathArguments = path == \"\" ? \"\" : $\"-l {line} \\\"{path}\\\"\";\n      var process = new Process\n      {\n        StartInfo = new ProcessStartInfo\n        {\n          FileName = \"open\",\n          Arguments = $\"-n \\\"{CodeEditor.CurrentEditorInstallation}\\\" --args {solution} {pathArguments}\",\n          CreateNoWindow = true,\n          UseShellExecute = true,\n        }\n      };\n\n      process.Start();\n\n      return true;\n    }\n\n    private string GetSolutionFile(string path)\n    {\n      if (IsUnityScript(path))\n      {\n        return Path.Combine(GetBaseUnityDeveloperFolder(), \"Projects/CSharp/Unity.CSharpProjects.gen.sln\");\n      }\n\n      var solutionFile = m_ProjectGeneration.SolutionFile();\n      if (File.Exists(solutionFile))\n      {\n        return solutionFile;\n      }\n\n      return \"\";\n    }\n\n    static bool IsUnityScript(string path)\n    {\n      if (UnityEditor.Unsupported.IsDeveloperBuild())\n      {\n        var baseFolder = GetBaseUnityDeveloperFolder().Replace(\"\\\\\", \"/\");\n        var lowerPath = path.ToLowerInvariant().Replace(\"\\\\\", \"/\");\n\n        if (lowerPath.Contains((baseFolder + \"/Runtime\").ToLowerInvariant())\n          || lowerPath.Contains((baseFolder + \"/Editor\").ToLowerInvariant()))\n        {\n          return true;\n        }\n      }\n\n      return false;\n    }\n\n    static string GetBaseUnityDeveloperFolder()\n    {\n      return Directory.GetParent(EditorApplication.applicationPath).Parent.Parent.FullName;\n    }\n\n    public bool TryGetInstallationForPath(string editorPath, out CodeEditor.Installation installation)\n    {\n      if (FileSystemUtil.EditorPathExists(editorPath) && IsRiderInstallation(editorPath))\n      {\n        var info = new RiderPathLocator.RiderInfo(editorPath, false);\n        installation = new CodeEditor.Installation\n        {\n          Name = info.Presentation,\n          Path = info.Path\n        };\n        return true;\n      }\n\n      installation = default;\n      return false;\n    }\n\n    public static bool IsRiderInstallation(string path)\n    {\n      if (string.IsNullOrEmpty(path))\n      {\n        return false;\n      }\n\n      var fileInfo = new FileInfo(path);\n      var filename = fileInfo.Name.ToLowerInvariant();\n      return filename.StartsWith(\"rider\", StringComparison.Ordinal);\n    }\n\n    public static string CurrentEditor // works fast, doesn't validate if executable really exists\n      => EditorPrefs.GetString(\"kScriptsDefaultApp\");\n\n    public static bool ShouldLoadEditorPlugin(string path)\n    {\n      var ver = RiderPathLocator.GetBuildNumber(path);\n      if (!Version.TryParse(ver, out var version))\n        return false;\n\n      return version >= new Version(\"191.7141.156\");\n    }\n\n    public CodeEditor.Installation[] Installations => m_Discoverability.PathCallback();\n\n    public void CreateSolutionIfDoesntExist()\n    {\n      if (!m_ProjectGeneration.HasSolutionBeenGenerated())\n      {\n        m_ProjectGeneration.Sync();\n      }\n    }\n  }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.rider@1.1.0/Rider/Editor/RiderScriptEditor.cs.meta",
    "content": "fileFormatVersion: 2\nguid: c4095d72f77fbb64ea39b8b3ca246622\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.rider@1.1.0/Rider/Editor/RiderScriptEditorData.cs",
    "content": "using UnityEditor;\nusing UnityEngine;\n\nnamespace Packages.Rider.Editor\n{\n  public class RiderScriptEditorData:ScriptableSingleton<RiderScriptEditorData>\n  {\n    [SerializeField] internal bool HasChanges = true; // sln/csproj files were changed\n  }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.rider@1.1.0/Rider/Editor/RiderScriptEditorData.cs.meta",
    "content": "fileFormatVersion: 2\nguid: f079e3afd077fb94fa2bda74d6409499\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.rider@1.1.0/Rider/Editor/Util/FileSystemUtil.cs",
    "content": "using System;\nusing System.ComponentModel;\nusing System.IO;\nusing System.Text;\nusing JetBrains.Annotations;\nusing UnityEngine;\n\nnamespace Packages.Rider.Editor.Util\n{\n  public static class FileSystemUtil\n  {\n    [NotNull]\n    public static string GetFinalPathName([NotNull] string path)\n    {\n      if (path == null) throw new ArgumentNullException(\"path\");\n\n      // up to MAX_PATH. MAX_PATH on Linux currently 4096, on Mac OS X 1024\n      // doc: http://man7.org/linux/man-pages/man3/realpath.3.html\n      var sb = new StringBuilder(8192);\n      var result = LibcNativeInterop.realpath(path, sb);\n      if (result == IntPtr.Zero)\n      {\n        throw new Win32Exception($\"{path} was not resolved.\");\n      }\n\n      return new FileInfo(sb.ToString()).FullName;\n    }\n    \n    public static string FileNameWithoutExtension(string path)\n    {\n      if (string.IsNullOrEmpty(path))\n      {\n        return \"\";\n      }\n\n      var indexOfDot = -1;\n      var indexOfSlash = 0;\n      for (var i = path.Length - 1; i >= 0; i--)\n      {\n        if (indexOfDot == -1 && path[i] == '.')\n        {\n          indexOfDot = i;\n        }\n\n        if (indexOfSlash == 0 && path[i] == '/' || path[i] == '\\\\')\n        {\n          indexOfSlash = i + 1;\n          break;\n        }\n      }\n\n      if (indexOfDot == -1)\n      {\n        indexOfDot = path.Length - 1;\n      }\n\n      return path.Substring(indexOfSlash, indexOfDot - indexOfSlash);\n    }\n    \n    public static bool EditorPathExists(string editorPath)\n    {\n      return SystemInfo.operatingSystemFamily == OperatingSystemFamily.MacOSX && new DirectoryInfo(editorPath).Exists \n             || SystemInfo.operatingSystemFamily != OperatingSystemFamily.MacOSX && new FileInfo(editorPath).Exists;\n    }\n  }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.rider@1.1.0/Rider/Editor/Util/FileSystemUtil.cs.meta",
    "content": "fileFormatVersion: 2\nguid: bdbd564a9fdad0b738e76d030cad1204\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.rider@1.1.0/Rider/Editor/Util/LibcNativeInterop.cs",
    "content": "using System;\nusing System.Runtime.InteropServices;\nusing System.Text;\n\nnamespace Packages.Rider.Editor.Util\n{\n  internal static class LibcNativeInterop\n  {\n    [DllImport(\"libc\", SetLastError = true)] \n    public static extern IntPtr realpath(string path, StringBuilder resolved_path);\n  }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.rider@1.1.0/Rider/Editor/Util/LibcNativeInterop.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 071c17858dc6c47ada7b2a1f1ded5402\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.rider@1.1.0/Rider/Editor/Util/UnityUtils.cs",
    "content": "using System;\nusing System.Linq;\nusing UnityEngine;\n\nnamespace Packages.Rider.Editor.Util\n{\n  public static class UnityUtils\n  {\n    internal static readonly string UnityApplicationVersion = Application.unityVersion;\n    \n    public static Version UnityVersion\n    {\n      get\n      {\n        var ver = UnityApplicationVersion.Split(\".\".ToCharArray()).Take(2).Aggregate((a, b) => a + \".\" + b);\n        return new Version(ver);\n      }\n    }\n  }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.rider@1.1.0/Rider/Editor/Util/UnityUtils.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 3ec9edad2de6c4df3a146b543a0fbc4c\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.rider@1.1.0/Rider/Editor/Util.meta",
    "content": "fileFormatVersion: 2\nguid: 5e726086cd652f82087d59d67d2c24cd\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.rider@1.1.0/Rider/Editor/com.unity.ide.rider.asmdef",
    "content": "{\n    \"name\": \"Unity.Rider.Editor\",\n    \"references\": [],\n    \"optionalUnityReferences\": [],\n    \"includePlatforms\": [\n        \"Editor\"\n    ],\n    \"excludePlatforms\": []\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.rider@1.1.0/Rider/Editor/com.unity.ide.rider.asmdef.meta",
    "content": "fileFormatVersion: 2\nguid: d528c8c98d269ca44a06cd9624a03945\nAssemblyDefinitionImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.rider@1.1.0/Rider/Editor.meta",
    "content": "fileFormatVersion: 2\nguid: 1b393f6b29a9ee84c803af1ab4944b71\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.rider@1.1.0/Rider.meta",
    "content": "fileFormatVersion: 2\nguid: 9129183a42052cd43b9c284d6dbd541e\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.rider@1.1.0/package.json",
    "content": "{\n  \"name\": \"com.unity.ide.rider\",\n  \"displayName\": \"Rider Editor\",\n  \"description\": \"Code editor integration for supporting Rider as code editor for unity. Adds support for generating csproj files for code completion, auto discovery of installations, etc.\",\n  \"version\": \"1.1.0\",\n  \"unity\": \"2019.2\",\n  \"unityRelease\": \"0a12\",\n  \"dependencies\": {\n    \"com.unity.ext.nunit\": \"1.0.0\"\n  },\n  \"relatedPackages\": {\n    \"com.unity.ide.rider.tests\": \"1.1.0\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git@github.cds.internal.unity3d.com:unity/com.unity.ide.rider.git\",\n    \"revision\": \"80ad81f593b04a6104771ae0d01cc71773d07b02\"\n  }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.rider@1.1.0/package.json.meta",
    "content": "fileFormatVersion: 2\nguid: 66c95bb3c74257f41bae2622511dc02d\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.vscode@1.1.3/CHANGELOG.md",
    "content": "# Code Editor Package for Visual Studio Code\n\n## [1.1.3] - 2019-10-22\n\nExe version of vscode will use Normal ProcessWindowStyle while cmd will use Hidden\n\n\n## [1.1.2] - 2019-08-30\n\nFixing OSX open command arguments\n\n\n## [1.1.1] - 2019-08-19\n\nSupport for Player Project. Generates specific csproj files containing files, reference, defines,\netc. that will show how the assembly will be compiled for a target platform.\n\n\n## [1.1.0] - 2019-08-07\n\nAdds support for choosing extensions to be opened with VSCode. This can be done through the GUI in Preferences.\nAvoids opening all extensions after the change in core unity.\n\n\n## [1.0.7] - 2019-05-15\n\nFix various OSX specific issues.\nGenerate project on load if they are not generated.\nFix path recognition.\n\n\n## [1.0.6] - 2019-04-30\n\nEnsure asset database is refreshed when generating csproj and solution files.\n\n## [1.0.5] - 2019-04-27\n\nAdd support for generating all csproj files.\n\n## [1.0.4] - 2019-04-18\n\nFix relative package paths.\nFix opening editor on mac.\nAdd %LOCALAPPDATA%/Programs to the path of install paths.\n\n## [1.0.3] - 2019-01-01\n\n### This is the first release of *Unity Package vscode_editor*.\n\nUsing the newly created api to integrate Visual Studio Code with Unity.\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.vscode@1.1.3/CHANGELOG.md.meta",
    "content": "fileFormatVersion: 2\nguid: 4ddcdc3816429494a8bea67e973875f7\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.vscode@1.1.3/CONTRIBUTING.md",
    "content": "# Contributing\n\n## All contributions are subject to the [Unity Contribution Agreement(UCA)](https://unity3d.com/legal/licenses/Unity_Contribution_Agreement)\nBy making a pull request, you are confirming agreement to the terms and conditions of the UCA, including that your Contributions are your original creation and that you have complete right and authority to make your Contributions.\n\n## Once you have a change ready following these ground rules. Simply make a pull request"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.vscode@1.1.3/CONTRIBUTING.md.meta",
    "content": "fileFormatVersion: 2\nguid: fcb9be00baf924c4183fc0313e6185c5\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.vscode@1.1.3/Documentation~/README.md",
    "content": "# Code Editor Package for Visual Studio Code\n\nThis package is not intended to be modified by users.\nNor does it provide any api intended to be included in user projects."
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/ProjectGeneration/AssemblyNameProvider.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing UnityEditor;\nusing UnityEditor.Compilation;\n\nnamespace VSCodeEditor\n{\n    public interface IAssemblyNameProvider\n    {\n        string GetAssemblyNameFromScriptPath(string path);\n        IEnumerable<Assembly> GetAssemblies(Func<string, bool> shouldFileBePartOfSolution);\n        IEnumerable<string> GetAllAssetPaths();\n        UnityEditor.PackageManager.PackageInfo FindForAssetPath(string assetPath);\n        ResponseFileData ParseResponseFile(string responseFilePath, string projectDirectory, string[] systemReferenceDirectories);\n    }\n\n    internal class AssemblyNameProvider : IAssemblyNameProvider\n    {\n        public string GetAssemblyNameFromScriptPath(string path)\n        {\n            return CompilationPipeline.GetAssemblyNameFromScriptPath(path);\n        }\n\n        public IEnumerable<Assembly> GetAssemblies(Func<string, bool> shouldFileBePartOfSolution)\n        {\n            return CompilationPipeline.GetAssemblies()\n                .Where(i => 0 < i.sourceFiles.Length && i.sourceFiles.Any(shouldFileBePartOfSolution));\n        }\n\n        public IEnumerable<string> GetAllAssetPaths()\n        {\n            return AssetDatabase.GetAllAssetPaths();\n        }\n\n        public UnityEditor.PackageManager.PackageInfo FindForAssetPath(string assetPath)\n        {\n            return UnityEditor.PackageManager.PackageInfo.FindForAssetPath(assetPath);\n        }\n\n        public ResponseFileData ParseResponseFile(string responseFilePath, string projectDirectory, string[] systemReferenceDirectories)\n        {\n            return CompilationPipeline.ParseResponseFile(\n                responseFilePath,\n                projectDirectory,\n                systemReferenceDirectories\n            );\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/ProjectGeneration/AssemblyNameProvider.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 1d93ffb668978f7488211a331977b73b\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/ProjectGeneration/FileIO.cs",
    "content": "using System.IO;\nusing System.Text;\n\nnamespace VSCodeEditor\n{\n    public interface IFileIO\n    {\n        bool Exists(string fileName);\n\n        string ReadAllText(string fileName);\n        void WriteAllText(string fileName, string content);\n\n        void CreateDirectory(string pathName);\n    }\n\n    class FileIOProvider : IFileIO\n    {\n        public bool Exists(string fileName)\n        {\n            return File.Exists(fileName);\n        }\n\n        public string ReadAllText(string fileName)\n        {\n            return File.ReadAllText(fileName);\n        }\n\n        public void WriteAllText(string fileName, string content)\n        {\n            File.WriteAllText(fileName, content, Encoding.UTF8);\n        }\n\n        public void CreateDirectory(string pathName)\n        {\n            Directory.CreateDirectory(pathName);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/ProjectGeneration/FileIO.cs.meta",
    "content": "fileFormatVersion: 2\nguid: eb221cf55b3544646b0c3b6bc790080f\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/ProjectGeneration/GUIDGenerator.cs",
    "content": "namespace VSCodeEditor\n{\n    public interface IGUIDGenerator\n    {\n        string ProjectGuid(string projectName, string assemblyName);\n        string SolutionGuid(string projectName, string extension);\n    }\n\n    class GUIDProvider : IGUIDGenerator\n    {\n        public string ProjectGuid(string projectName, string assemblyName)\n        {\n            return SolutionGuidGenerator.GuidForProject(projectName + assemblyName);\n        }\n\n        public string SolutionGuid(string projectName, string extension)\n        {\n            return SolutionGuidGenerator.GuidForSolution(projectName, extension); // GetExtensionOfSourceFiles(assembly.sourceFiles)\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/ProjectGeneration/GUIDGenerator.cs.meta",
    "content": "fileFormatVersion: 2\nguid: e58bd3cca6475e54b93632bb6837aeea\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/ProjectGeneration/ProjectGeneration.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Security;\nusing System.Security.Cryptography;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing UnityEditor;\nusing UnityEditor.Compilation;\nusing UnityEditor.PackageManager;\nusing UnityEngine;\nusing UnityEngine.Profiling;\n\nnamespace VSCodeEditor\n{\n    public interface IGenerator\n    {\n        bool SyncIfNeeded(IEnumerable<string> affectedFiles, IEnumerable<string> reimportedFiles);\n        void Sync();\n        string SolutionFile();\n        string ProjectDirectory { get; }\n        void GenerateAll(bool generateAll);\n        bool SolutionExists();\n    }\n\n    public class ProjectGeneration : IGenerator\n    {\n        enum ScriptingLanguage\n        {\n            None,\n            CSharp\n        }\n\n        public static readonly string MSBuildNamespaceUri = \"http://schemas.microsoft.com/developer/msbuild/2003\";\n\n        const string k_WindowsNewline = \"\\r\\n\";\n\n        const string k_SettingsJson = @\"{\n    \"\"files.exclude\"\":\n    {\n        \"\"**/.DS_Store\"\":true,\n        \"\"**/.git\"\":true,\n        \"\"**/.gitignore\"\":true,\n        \"\"**/.gitmodules\"\":true,\n        \"\"**/*.booproj\"\":true,\n        \"\"**/*.pidb\"\":true,\n        \"\"**/*.suo\"\":true,\n        \"\"**/*.user\"\":true,\n        \"\"**/*.userprefs\"\":true,\n        \"\"**/*.unityproj\"\":true,\n        \"\"**/*.dll\"\":true,\n        \"\"**/*.exe\"\":true,\n        \"\"**/*.pdf\"\":true,\n        \"\"**/*.mid\"\":true,\n        \"\"**/*.midi\"\":true,\n        \"\"**/*.wav\"\":true,\n        \"\"**/*.gif\"\":true,\n        \"\"**/*.ico\"\":true,\n        \"\"**/*.jpg\"\":true,\n        \"\"**/*.jpeg\"\":true,\n        \"\"**/*.png\"\":true,\n        \"\"**/*.psd\"\":true,\n        \"\"**/*.tga\"\":true,\n        \"\"**/*.tif\"\":true,\n        \"\"**/*.tiff\"\":true,\n        \"\"**/*.3ds\"\":true,\n        \"\"**/*.3DS\"\":true,\n        \"\"**/*.fbx\"\":true,\n        \"\"**/*.FBX\"\":true,\n        \"\"**/*.lxo\"\":true,\n        \"\"**/*.LXO\"\":true,\n        \"\"**/*.ma\"\":true,\n        \"\"**/*.MA\"\":true,\n        \"\"**/*.obj\"\":true,\n        \"\"**/*.OBJ\"\":true,\n        \"\"**/*.asset\"\":true,\n        \"\"**/*.cubemap\"\":true,\n        \"\"**/*.flare\"\":true,\n        \"\"**/*.mat\"\":true,\n        \"\"**/*.meta\"\":true,\n        \"\"**/*.prefab\"\":true,\n        \"\"**/*.unity\"\":true,\n        \"\"build/\"\":true,\n        \"\"Build/\"\":true,\n        \"\"Library/\"\":true,\n        \"\"library/\"\":true,\n        \"\"obj/\"\":true,\n        \"\"Obj/\"\":true,\n        \"\"ProjectSettings/\"\":true,\n        \"\"temp/\"\":true,\n        \"\"Temp/\"\":true\n    }\n}\";\n\n        /// <summary>\n        /// Map source extensions to ScriptingLanguages\n        /// </summary>\n        static readonly Dictionary<string, ScriptingLanguage> k_BuiltinSupportedExtensions = new Dictionary<string, ScriptingLanguage>\n        {\n            { \"cs\", ScriptingLanguage.CSharp },\n            { \"uxml\", ScriptingLanguage.None },\n            { \"uss\", ScriptingLanguage.None },\n            { \"shader\", ScriptingLanguage.None },\n            { \"compute\", ScriptingLanguage.None },\n            { \"cginc\", ScriptingLanguage.None },\n            { \"hlsl\", ScriptingLanguage.None },\n            { \"glslinc\", ScriptingLanguage.None },\n            { \"template\", ScriptingLanguage.None },\n            { \"raytrace\", ScriptingLanguage.None }\n        };\n\n        string m_SolutionProjectEntryTemplate = string.Join(\"\\r\\n\", @\"Project(\"\"{{{0}}}\"\") = \"\"{1}\"\", \"\"{2}\"\", \"\"{{{3}}}\"\"\", @\"EndProject\").Replace(\"    \", \"\\t\");\n\n        string m_SolutionProjectConfigurationTemplate = string.Join(\"\\r\\n\", @\"        {{{0}}}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\", @\"        {{{0}}}.Debug|Any CPU.Build.0 = Debug|Any CPU\", @\"        {{{0}}}.Release|Any CPU.ActiveCfg = Release|Any CPU\", @\"        {{{0}}}.Release|Any CPU.Build.0 = Release|Any CPU\").Replace(\"    \", \"\\t\");\n\n        static readonly string[] k_ReimportSyncExtensions = { \".dll\", \".asmdef\" };\n\n        /// <summary>\n        /// Map ScriptingLanguages to project extensions\n        /// </summary>\n        /*static readonly Dictionary<ScriptingLanguage, string> k_ProjectExtensions = new Dictionary<ScriptingLanguage, string>\n        {\n            { ScriptingLanguage.CSharp, \".csproj\" },\n            { ScriptingLanguage.None, \".csproj\" },\n        };*/\n        static readonly Regex k_ScriptReferenceExpression = new Regex(\n            @\"^Library.ScriptAssemblies.(?<dllname>(?<project>.*)\\.dll$)\",\n            RegexOptions.Compiled | RegexOptions.IgnoreCase);\n\n        string[] m_ProjectSupportedExtensions = new string[0];\n        public string ProjectDirectory { get; }\n        bool m_ShouldGenerateAll;\n\n        public void GenerateAll(bool generateAll)\n        {\n            m_ShouldGenerateAll = generateAll;\n        }\n\n        readonly string m_ProjectName;\n        readonly IAssemblyNameProvider m_AssemblyNameProvider;\n        readonly IFileIO m_FileIOProvider;\n        readonly IGUIDGenerator m_GUIDProvider;\n\n        const string k_ToolsVersion = \"4.0\";\n        const string k_ProductVersion = \"10.0.20506\";\n        const string k_BaseDirectory = \".\";\n        const string k_TargetFrameworkVersion = \"v4.7.1\";\n        const string k_TargetLanguageVersion = \"latest\";\n\n        public ProjectGeneration(string tempDirectory)\n            : this(tempDirectory, new AssemblyNameProvider(), new FileIOProvider(), new GUIDProvider()) { }\n\n        public ProjectGeneration(string tempDirectory, IAssemblyNameProvider assemblyNameProvider, IFileIO fileIO, IGUIDGenerator guidGenerator)\n        {\n            ProjectDirectory = tempDirectory.Replace('\\\\', '/');\n            m_ProjectName = Path.GetFileName(ProjectDirectory);\n            m_AssemblyNameProvider = assemblyNameProvider;\n            m_FileIOProvider = fileIO;\n            m_GUIDProvider = guidGenerator;\n        }\n\n        /// <summary>\n        /// Syncs the scripting solution if any affected files are relevant.\n        /// </summary>\n        /// <returns>\n        /// Whether the solution was synced.\n        /// </returns>\n        /// <param name='affectedFiles'>\n        /// A set of files whose status has changed\n        /// </param>\n        /// <param name=\"reimportedFiles\">\n        /// A set of files that got reimported\n        /// </param>\n        public bool SyncIfNeeded(IEnumerable<string> affectedFiles, IEnumerable<string> reimportedFiles)\n        {\n            Profiler.BeginSample(\"SolutionSynchronizerSync\");\n            SetupProjectSupportedExtensions();\n\n            // Don't sync if we haven't synced before\n            if (SolutionExists() && HasFilesBeenModified(affectedFiles, reimportedFiles))\n            {\n                Sync();\n\n                Profiler.EndSample();\n                return true;\n            }\n\n            Profiler.EndSample();\n            return false;\n        }\n\n        bool HasFilesBeenModified(IEnumerable<string> affectedFiles, IEnumerable<string> reimportedFiles)\n        {\n            return affectedFiles.Any(ShouldFileBePartOfSolution) || reimportedFiles.Any(ShouldSyncOnReimportedAsset);\n        }\n\n        static bool ShouldSyncOnReimportedAsset(string asset)\n        {\n            return k_ReimportSyncExtensions.Contains(new FileInfo(asset).Extension);\n        }\n\n        public void Sync()\n        {\n            SetupProjectSupportedExtensions();\n            GenerateAndWriteSolutionAndProjects();\n        }\n\n        public bool SolutionExists()\n        {\n            return m_FileIOProvider.Exists(SolutionFile());\n        }\n\n        void SetupProjectSupportedExtensions()\n        {\n            m_ProjectSupportedExtensions = EditorSettings.projectGenerationUserExtensions;\n        }\n\n        bool ShouldFileBePartOfSolution(string file)\n        {\n            string extension = Path.GetExtension(file);\n\n            // Exclude files coming from packages except if they are internalized.\n            if (!m_ShouldGenerateAll && IsInternalizedPackagePath(file))\n            {\n                return false;\n            }\n\n            // Dll's are not scripts but still need to be included..\n            if (extension == \".dll\")\n                return true;\n\n            if (file.ToLower().EndsWith(\".asmdef\"))\n                return true;\n\n            return IsSupportedExtension(extension);\n        }\n\n        bool IsSupportedExtension(string extension)\n        {\n            extension = extension.TrimStart('.');\n            if (k_BuiltinSupportedExtensions.ContainsKey(extension))\n                return true;\n            if (m_ProjectSupportedExtensions.Contains(extension))\n                return true;\n            return false;\n        }\n\n        static ScriptingLanguage ScriptingLanguageFor(Assembly island)\n        {\n            return ScriptingLanguageFor(GetExtensionOfSourceFiles(island.sourceFiles));\n        }\n\n        static string GetExtensionOfSourceFiles(string[] files)\n        {\n            return files.Length > 0 ? GetExtensionOfSourceFile(files[0]) : \"NA\";\n        }\n\n        static string GetExtensionOfSourceFile(string file)\n        {\n            var ext = Path.GetExtension(file).ToLower();\n            ext = ext.Substring(1); //strip dot\n            return ext;\n        }\n\n        static ScriptingLanguage ScriptingLanguageFor(string extension)\n        {\n            return k_BuiltinSupportedExtensions.TryGetValue(extension.TrimStart('.'), out var result)\n                ? result\n                : ScriptingLanguage.None;\n        }\n\n        public void GenerateAndWriteSolutionAndProjects()\n        {\n            // Only synchronize islands that have associated source files and ones that we actually want in the project.\n            // This also filters out DLLs coming from .asmdef files in packages.\n            var assemblies = m_AssemblyNameProvider.GetAssemblies(ShouldFileBePartOfSolution);\n\n            var allAssetProjectParts = GenerateAllAssetProjectParts();\n\n            SyncSolution(assemblies);\n            var allProjectIslands = RelevantIslandsForMode(assemblies).ToList();\n            foreach (Assembly assembly in allProjectIslands)\n            {\n                var responseFileData = ParseResponseFileData(assembly);\n                SyncProject(assembly, allAssetProjectParts, responseFileData, allProjectIslands);\n            }\n\n            WriteVSCodeSettingsFiles();\n        }\n\n        IEnumerable<ResponseFileData> ParseResponseFileData(Assembly assembly)\n        {\n            var systemReferenceDirectories = CompilationPipeline.GetSystemAssemblyDirectories(assembly.compilerOptions.ApiCompatibilityLevel);\n\n            Dictionary<string, ResponseFileData> responseFilesData = assembly.compilerOptions.ResponseFiles.ToDictionary(x => x, x => m_AssemblyNameProvider.ParseResponseFile(\n                x,\n                ProjectDirectory,\n                systemReferenceDirectories\n            ));\n\n            Dictionary<string, ResponseFileData> responseFilesWithErrors = responseFilesData.Where(x => x.Value.Errors.Any())\n                .ToDictionary(x => x.Key, x => x.Value);\n\n            if (responseFilesWithErrors.Any())\n            {\n                foreach (var error in responseFilesWithErrors)\n                foreach (var valueError in error.Value.Errors)\n                {\n                    Debug.LogError($\"{error.Key} Parse Error : {valueError}\");\n                }\n            }\n\n            return responseFilesData.Select(x => x.Value);\n        }\n\n        Dictionary<string, string> GenerateAllAssetProjectParts()\n        {\n            Dictionary<string, StringBuilder> stringBuilders = new Dictionary<string, StringBuilder>();\n\n            foreach (string asset in m_AssemblyNameProvider.GetAllAssetPaths())\n            {\n                // Exclude files coming from packages except if they are internalized.\n                // TODO: We need assets from the assembly API\n                if (!m_ShouldGenerateAll && IsInternalizedPackagePath(asset))\n                {\n                    continue;\n                }\n\n                string extension = Path.GetExtension(asset);\n                if (IsSupportedExtension(extension) && ScriptingLanguage.None == ScriptingLanguageFor(extension))\n                {\n                    // Find assembly the asset belongs to by adding script extension and using compilation pipeline.\n                    var assemblyName = m_AssemblyNameProvider.GetAssemblyNameFromScriptPath(asset + \".cs\");\n\n                    if (string.IsNullOrEmpty(assemblyName))\n                    {\n                        continue;\n                    }\n\n                    assemblyName = Utility.FileNameWithoutExtension(assemblyName);\n\n                    if (!stringBuilders.TryGetValue(assemblyName, out var projectBuilder))\n                    {\n                        projectBuilder = new StringBuilder();\n                        stringBuilders[assemblyName] = projectBuilder;\n                    }\n\n                    projectBuilder.Append(\"     <None Include=\\\"\").Append(EscapedRelativePathFor(asset)).Append(\"\\\" />\").Append(k_WindowsNewline);\n                }\n            }\n\n            var result = new Dictionary<string, string>();\n\n            foreach (var entry in stringBuilders)\n                result[entry.Key] = entry.Value.ToString();\n\n            return result;\n        }\n\n        bool IsInternalizedPackagePath(string file)\n        {\n            if (string.IsNullOrWhiteSpace(file))\n            {\n                return false;\n            }\n\n            var packageInfo = m_AssemblyNameProvider.FindForAssetPath(file);\n            if (packageInfo == null)\n            {\n                return false;\n            }\n\n            var packageSource = packageInfo.source;\n            return packageSource != PackageSource.Embedded && packageSource != PackageSource.Local;\n        }\n\n        void SyncProject(\n            Assembly island,\n            Dictionary<string, string> allAssetsProjectParts,\n            IEnumerable<ResponseFileData> responseFilesData,\n            List<Assembly> allProjectIslands)\n        {\n            SyncProjectFileIfNotChanged(ProjectFile(island), ProjectText(island, allAssetsProjectParts, responseFilesData, allProjectIslands));\n        }\n\n        void SyncProjectFileIfNotChanged(string path, string newContents)\n        {\n            SyncFileIfNotChanged(path, newContents);\n        }\n\n        void SyncSolutionFileIfNotChanged(string path, string newContents)\n        {\n            SyncFileIfNotChanged(path, newContents);\n        }\n\n        void SyncFileIfNotChanged(string filename, string newContents)\n        {\n            if (m_FileIOProvider.Exists(filename))\n            {\n                var currentContents = m_FileIOProvider.ReadAllText(filename);\n\n                if (currentContents == newContents)\n                {\n                    return;\n                }\n            }\n\n            m_FileIOProvider.WriteAllText(filename, newContents);\n        }\n\n        string ProjectText(\n            Assembly assembly,\n            Dictionary<string, string> allAssetsProjectParts,\n            IEnumerable<ResponseFileData> responseFilesData,\n            List<Assembly> allProjectIslands)\n        {\n            var projectBuilder = new StringBuilder(ProjectHeader(assembly, responseFilesData));\n            var references = new List<string>();\n            var projectReferences = new List<Match>();\n\n            foreach (string file in assembly.sourceFiles)\n            {\n                if (!ShouldFileBePartOfSolution(file))\n                    continue;\n\n                var extension = Path.GetExtension(file).ToLower();\n                var fullFile = EscapedRelativePathFor(file);\n                if (\".dll\" != extension)\n                {\n                    projectBuilder.Append(\"     <Compile Include=\\\"\").Append(fullFile).Append(\"\\\" />\").Append(k_WindowsNewline);\n                }\n                else\n                {\n                    references.Add(fullFile);\n                }\n            }\n\n            // Append additional non-script files that should be included in project generation.\n            if (allAssetsProjectParts.TryGetValue(assembly.name, out var additionalAssetsForProject))\n                projectBuilder.Append(additionalAssetsForProject);\n\n            var islandRefs = references.Union(assembly.allReferences);\n\n            foreach (string reference in islandRefs)\n            {\n                var match = k_ScriptReferenceExpression.Match(reference);\n                if (match.Success)\n                {\n                    // assume csharp language\n                    // Add a reference to a project except if it's a reference to a script assembly\n                    // that we are not generating a project for. This will be the case for assemblies\n                    // coming from .assembly.json files in non-internalized packages.\n                    var dllName = match.Groups[\"dllname\"].Value;\n                    if (allProjectIslands.Any(i => Path.GetFileName(i.outputPath) == dllName))\n                    {\n                        projectReferences.Add(match);\n                        continue;\n                    }\n                }\n\n                string fullReference = Path.IsPathRooted(reference) ? reference : Path.Combine(ProjectDirectory, reference);\n\n                AppendReference(fullReference, projectBuilder);\n            }\n\n            var responseRefs = responseFilesData.SelectMany(x => x.FullPathReferences.Select(r => r));\n            foreach (var reference in responseRefs)\n            {\n                AppendReference(reference, projectBuilder);\n            }\n\n            if (0 < projectReferences.Count)\n            {\n                projectBuilder.AppendLine(\"  </ItemGroup>\");\n                projectBuilder.AppendLine(\"  <ItemGroup>\");\n                foreach (Match reference in projectReferences)\n                {\n                    var referencedProject = reference.Groups[\"project\"].Value;\n\n                    projectBuilder.Append(\"    <ProjectReference Include=\\\"\").Append(referencedProject).Append(GetProjectExtension()).Append(\"\\\">\").Append(k_WindowsNewline);\n                    projectBuilder.Append(\"      <Project>{\").Append(ProjectGuid(Path.Combine(\"Temp\", reference.Groups[\"project\"].Value + \".dll\"))).Append(\"}</Project>\").Append(k_WindowsNewline);\n                    projectBuilder.Append(\"      <Name>\").Append(referencedProject).Append(\"</Name>\").Append(k_WindowsNewline);\n                    projectBuilder.AppendLine(\"    </ProjectReference>\");\n                }\n            }\n\n            projectBuilder.Append(ProjectFooter());\n            return projectBuilder.ToString();\n        }\n\n        static void AppendReference(string fullReference, StringBuilder projectBuilder)\n        {\n            //replace \\ with / and \\\\ with /\n            var escapedFullPath = SecurityElement.Escape(fullReference);\n            escapedFullPath = escapedFullPath.Replace(\"\\\\\", \"/\");\n            escapedFullPath = escapedFullPath.Replace(\"\\\\\\\\\", \"/\");\n            projectBuilder.Append(\" <Reference Include=\\\"\").Append(Utility.FileNameWithoutExtension(escapedFullPath)).Append(\"\\\">\").Append(k_WindowsNewline);\n            projectBuilder.Append(\" <HintPath>\").Append(escapedFullPath).Append(\"</HintPath>\").Append(k_WindowsNewline);\n            projectBuilder.Append(\" </Reference>\").Append(k_WindowsNewline);\n        }\n\n        public string ProjectFile(Assembly assembly)\n        {\n            var fileBuilder = new StringBuilder(assembly.name);\n\n            //            if (!assembly.flags.HasFlag(AssemblyFlags.EditorAssembly) && m_PlayerAssemblies.Contains(assembly))\n            //            {\n            //                fileBuilder.Append(\"-player\");\n            //            }\n            fileBuilder.Append(\".csproj\");\n            return Path.Combine(ProjectDirectory, fileBuilder.ToString());\n        }\n\n        public string SolutionFile()\n        {\n            return Path.Combine(ProjectDirectory, $\"{m_ProjectName}.sln\");\n        }\n\n        string ProjectHeader(\n            Assembly assembly,\n            IEnumerable<ResponseFileData> responseFilesData\n        )\n        {\n            // TODO: .Concat(EditorUserBuildSettings.activeScriptCompilationDefines)\n            var arguments = new object[]\n            {\n                k_ToolsVersion,\n                k_ProductVersion,\n                ProjectGuid(assembly.name),\n                string.Join(\";\", new[] { \"DEBUG\", \"TRACE\" }.Concat(assembly.defines).Concat(responseFilesData.SelectMany(x => x.Defines)).Distinct().ToArray()),\n                MSBuildNamespaceUri,\n                assembly.name,\n                EditorSettings.projectGenerationRootNamespace,\n                k_TargetFrameworkVersion,\n                k_TargetLanguageVersion,\n                k_BaseDirectory,\n                assembly.compilerOptions.AllowUnsafeCode | responseFilesData.Any(x => x.Unsafe)\n            };\n\n            try\n            {\n                return string.Format(GetProjectHeaderTemplate(), arguments);\n            }\n            catch (Exception)\n            {\n                throw new NotSupportedException(\"Failed creating c# project because the c# project header did not have the correct amount of arguments, which is \" + arguments.Length);\n            }\n        }\n\n        static string GetSolutionText()\n        {\n            return string.Join(\"\\r\\n\", @\"\", @\"Microsoft Visual Studio Solution File, Format Version {0}\", @\"# Visual Studio {1}\", @\"{2}\", @\"Global\", @\"    GlobalSection(SolutionConfigurationPlatforms) = preSolution\", @\"        Debug|Any CPU = Debug|Any CPU\", @\"        Release|Any CPU = Release|Any CPU\", @\"    EndGlobalSection\", @\"    GlobalSection(ProjectConfigurationPlatforms) = postSolution\", @\"{3}\", @\"    EndGlobalSection\", @\"    GlobalSection(SolutionProperties) = preSolution\", @\"        HideSolutionNode = FALSE\", @\"    EndGlobalSection\", @\"EndGlobal\", @\"\").Replace(\"    \", \"\\t\");\n        }\n\n        static string GetProjectFooterTemplate()\n        {\n            return string.Join(\"\\r\\n\", @\"  </ItemGroup>\", @\"  <Import Project=\"\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\"\" />\", @\"  <!-- To modify your build process, add your task inside one of the targets below and uncomment it.\", @\"       Other similar extension points exist, see Microsoft.Common.targets.\", @\"  <Target Name=\"\"BeforeBuild\"\">\", @\"  </Target>\", @\"  <Target Name=\"\"AfterBuild\"\">\", @\"  </Target>\", @\"  -->\", @\"</Project>\", @\"\");\n        }\n\n        static string GetProjectHeaderTemplate()\n        {\n            var header = new[]\n            {\n                @\"<?xml version=\"\"1.0\"\" encoding=\"\"utf-8\"\"?>\",\n                @\"<Project ToolsVersion=\"\"{0}\"\" DefaultTargets=\"\"Build\"\" xmlns=\"\"{4}\"\">\",\n                @\"  <PropertyGroup>\",\n                @\"    <LangVersion>{8}</LangVersion>\",\n                @\"  </PropertyGroup>\",\n                @\"  <PropertyGroup>\",\n                @\"    <Configuration Condition=\"\" '$(Configuration)' == '' \"\">Debug</Configuration>\",\n                @\"    <Platform Condition=\"\" '$(Platform)' == '' \"\">AnyCPU</Platform>\",\n                @\"    <ProductVersion>{1}</ProductVersion>\",\n                @\"    <SchemaVersion>2.0</SchemaVersion>\",\n                @\"    <RootNamespace>{6}</RootNamespace>\",\n                @\"    <ProjectGuid>{{{2}}}</ProjectGuid>\",\n                @\"    <OutputType>Library</OutputType>\",\n                @\"    <AppDesignerFolder>Properties</AppDesignerFolder>\",\n                @\"    <AssemblyName>{5}</AssemblyName>\",\n                @\"    <TargetFrameworkVersion>{7}</TargetFrameworkVersion>\",\n                @\"    <FileAlignment>512</FileAlignment>\",\n                @\"    <BaseDirectory>{9}</BaseDirectory>\",\n                @\"  </PropertyGroup>\",\n                @\"  <PropertyGroup Condition=\"\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \"\">\",\n                @\"    <DebugSymbols>true</DebugSymbols>\",\n                @\"    <DebugType>full</DebugType>\",\n                @\"    <Optimize>false</Optimize>\",\n                @\"    <OutputPath>Temp\\bin\\Debug\\</OutputPath>\",\n                @\"    <DefineConstants>{3}</DefineConstants>\",\n                @\"    <ErrorReport>prompt</ErrorReport>\",\n                @\"    <WarningLevel>4</WarningLevel>\",\n                @\"    <NoWarn>0169</NoWarn>\",\n                @\"    <AllowUnsafeBlocks>{10}</AllowUnsafeBlocks>\",\n                @\"  </PropertyGroup>\",\n                @\"  <PropertyGroup Condition=\"\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \"\">\",\n                @\"    <DebugType>pdbonly</DebugType>\",\n                @\"    <Optimize>true</Optimize>\",\n                @\"    <OutputPath>Temp\\bin\\Release\\</OutputPath>\",\n                @\"    <ErrorReport>prompt</ErrorReport>\",\n                @\"    <WarningLevel>4</WarningLevel>\",\n                @\"    <NoWarn>0169</NoWarn>\",\n                @\"    <AllowUnsafeBlocks>{10}</AllowUnsafeBlocks>\",\n                @\"  </PropertyGroup>\"\n            };\n\n            var forceExplicitReferences = new[]\n            {\n                @\"  <PropertyGroup>\",\n                @\"    <NoConfig>true</NoConfig>\",\n                @\"    <NoStdLib>true</NoStdLib>\",\n                @\"    <AddAdditionalExplicitAssemblyReferences>false</AddAdditionalExplicitAssemblyReferences>\",\n                @\"    <ImplicitlyExpandNETStandardFacades>false</ImplicitlyExpandNETStandardFacades>\",\n                @\"    <ImplicitlyExpandDesignTimeFacades>false</ImplicitlyExpandDesignTimeFacades>\",\n                @\"  </PropertyGroup>\"\n            };\n\n            var itemGroupStart = new[]\n            {\n                @\"  <ItemGroup>\",\n                @\"\"\n            };\n\n            var text = header.Concat(forceExplicitReferences).Concat(itemGroupStart).ToArray();\n            return string.Join(\"\\r\\n\", text);\n        }\n\n        void SyncSolution(IEnumerable<Assembly> islands)\n        {\n            SyncSolutionFileIfNotChanged(SolutionFile(), SolutionText(islands));\n        }\n\n        string SolutionText(IEnumerable<Assembly> islands)\n        {\n            var fileversion = \"11.00\";\n            var vsversion = \"2010\";\n\n            var relevantIslands = RelevantIslandsForMode(islands);\n            string projectEntries = GetProjectEntries(relevantIslands);\n            string projectConfigurations = string.Join(k_WindowsNewline, relevantIslands.Select(i => GetProjectActiveConfigurations(ProjectGuid(i.name))).ToArray());\n            return string.Format(GetSolutionText(), fileversion, vsversion, projectEntries, projectConfigurations);\n        }\n\n        static IEnumerable<Assembly> RelevantIslandsForMode(IEnumerable<Assembly> islands)\n        {\n            IEnumerable<Assembly> relevantIslands = islands.Where(i => ScriptingLanguage.CSharp == ScriptingLanguageFor(i));\n            return relevantIslands;\n        }\n\n        /// <summary>\n        /// Get a Project(\"{guid}\") = \"MyProject\", \"MyProject.csproj\", \"{projectguid}\"\n        /// entry for each relevant language\n        /// </summary>\n        string GetProjectEntries(IEnumerable<Assembly> islands)\n        {\n            var projectEntries = islands.Select(i => string.Format(\n                m_SolutionProjectEntryTemplate,\n                SolutionGuid(i),\n                i.name,\n                Path.GetFileName(ProjectFile(i)),\n                ProjectGuid(i.name)\n            ));\n\n            return string.Join(k_WindowsNewline, projectEntries.ToArray());\n        }\n\n        /// <summary>\n        /// Generate the active configuration string for a given project guid\n        /// </summary>\n        string GetProjectActiveConfigurations(string projectGuid)\n        {\n            return string.Format(\n                m_SolutionProjectConfigurationTemplate,\n                projectGuid);\n        }\n\n        string EscapedRelativePathFor(string file)\n        {\n            var projectDir = ProjectDirectory.Replace('/', '\\\\');\n            file = file.Replace('/', '\\\\');\n            var path = SkipPathPrefix(file, projectDir);\n\n            var packageInfo = m_AssemblyNameProvider.FindForAssetPath(path.Replace('\\\\', '/'));\n            if (packageInfo != null)\n            {\n                // We have to normalize the path, because the PackageManagerRemapper assumes\n                // dir seperators will be os specific.\n                var absolutePath = Path.GetFullPath(NormalizePath(path)).Replace('/', '\\\\');\n                path = SkipPathPrefix(absolutePath, projectDir);\n            }\n\n            return SecurityElement.Escape(path);\n        }\n\n        static string SkipPathPrefix(string path, string prefix)\n        {\n            if (path.StartsWith($@\"{prefix}\\\"))\n                return path.Substring(prefix.Length + 1);\n            return path;\n        }\n\n        static string NormalizePath(string path)\n        {\n            if (Path.DirectorySeparatorChar == '\\\\')\n                return path.Replace('/', Path.DirectorySeparatorChar);\n            return path.Replace('\\\\', Path.DirectorySeparatorChar);\n        }\n\n        string ProjectGuid(string assembly)\n        {\n            return m_GUIDProvider.ProjectGuid(m_ProjectName, assembly);\n        }\n\n        string SolutionGuid(Assembly island)\n        {\n            return m_GUIDProvider.SolutionGuid(m_ProjectName, GetExtensionOfSourceFiles(island.sourceFiles));\n        }\n\n        static string ProjectFooter()\n        {\n            return GetProjectFooterTemplate();\n        }\n\n        static string GetProjectExtension()\n        {\n            return \".csproj\";\n        }\n\n        void WriteVSCodeSettingsFiles()\n        {\n            var vsCodeDirectory = Path.Combine(ProjectDirectory, \".vscode\");\n\n            if (!m_FileIOProvider.Exists(vsCodeDirectory))\n                m_FileIOProvider.CreateDirectory(vsCodeDirectory);\n\n            var vsCodeSettingsJson = Path.Combine(vsCodeDirectory, \"settings.json\");\n\n            if (!m_FileIOProvider.Exists(vsCodeSettingsJson))\n                m_FileIOProvider.WriteAllText(vsCodeSettingsJson, k_SettingsJson);\n        }\n    }\n\n    public static class SolutionGuidGenerator\n    {\n        public static string GuidForProject(string projectName)\n        {\n            return ComputeGuidHashFor(projectName + \"salt\");\n        }\n\n        public static string GuidForSolution(string projectName, string sourceFileExtension)\n        {\n            if (sourceFileExtension.ToLower() == \"cs\")\n\n                // GUID for a C# class library: http://www.codeproject.com/Reference/720512/List-of-Visual-Studio-Project-Type-GUIDs\n                return \"FAE04EC0-301F-11D3-BF4B-00C04F79EFBC\";\n\n            return ComputeGuidHashFor(projectName);\n        }\n\n        static string ComputeGuidHashFor(string input)\n        {\n            var hash = MD5.Create().ComputeHash(Encoding.Default.GetBytes(input));\n            return HashAsGuid(HashToString(hash));\n        }\n\n        static string HashAsGuid(string hash)\n        {\n            var guid = hash.Substring(0, 8) + \"-\" + hash.Substring(8, 4) + \"-\" + hash.Substring(12, 4) + \"-\" + hash.Substring(16, 4) + \"-\" + hash.Substring(20, 12);\n            return guid.ToUpper();\n        }\n\n        static string HashToString(byte[] bs)\n        {\n            var sb = new StringBuilder();\n            foreach (byte b in bs)\n                sb.Append(b.ToString(\"x2\"));\n            return sb.ToString();\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/ProjectGeneration/ProjectGeneration.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 97d6c87381e3e51488b49f5891490b70\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/ProjectGeneration.meta",
    "content": "fileFormatVersion: 2\nguid: c779d3735d950f341ba35154e8b3234b\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/Unity.com.unity.vscode.Editor.asmdef",
    "content": "{\n    \"name\": \"Unity.VSCode.Editor\",\n    \"references\": [],\n    \"optionalUnityReferences\": [],\n    \"includePlatforms\": [\n        \"Editor\"\n    ],\n    \"excludePlatforms\": []\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/Unity.com.unity.vscode.Editor.asmdef.meta",
    "content": "fileFormatVersion: 2\nguid: 8b845b123ab418448a8be2935fa804e0\nAssemblyDefinitionImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/Utility.cs",
    "content": "namespace VSCodeEditor\n{\n    public static class Utility\n    {\n        public static string FileNameWithoutExtension(string path)\n        {\n            if (string.IsNullOrEmpty(path))\n            {\n                return \"\";\n            }\n\n            var indexOfDot = -1;\n            var indexOfSlash = 0;\n            for (var i = path.Length - 1; i >= 0; i--)\n            {\n                if (indexOfDot == -1 && path[i] == '.')\n                {\n                    indexOfDot = i;\n                }\n\n                if (indexOfSlash == 0 && path[i] == '/' || path[i] == '\\\\')\n                {\n                    indexOfSlash = i + 1;\n                    break;\n                }\n            }\n\n            if (indexOfDot == -1)\n            {\n                indexOfDot = path.Length;\n            }\n\n            return path.Substring(indexOfSlash, indexOfDot - indexOfSlash);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/Utility.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 1ac677c5ece15b443b2aaf7fae5842f7\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/VSCodeDiscovery.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing Unity.CodeEditor;\n\nnamespace VSCodeEditor\n{\n    public interface IDiscovery\n    {\n        CodeEditor.Installation[] PathCallback();\n    }\n\n    public class VSCodeDiscovery : IDiscovery\n    {\n        List<CodeEditor.Installation> m_Installations;\n\n        public CodeEditor.Installation[] PathCallback()\n        {\n            if (m_Installations == null)\n            {\n                m_Installations = new List<CodeEditor.Installation>();\n                FindInstallationPaths();\n            }\n\n            return m_Installations.ToArray();\n        }\n\n        void FindInstallationPaths()\n        {\n            string[] possiblePaths =\n#if UNITY_EDITOR_OSX\n            {\n                \"/Applications/Visual Studio Code.app\",\n                \"/Applications/Visual Studio Code - Insiders.app\"\n            };\n#elif UNITY_EDITOR_WIN\n            {\n                GetProgramFiles() + @\"/Microsoft VS Code/bin/code.cmd\",\n                GetProgramFiles() + @\"/Microsoft VS Code/Code.exe\",\n                GetProgramFiles() + @\"/Microsoft VS Code Insiders/bin/code-insiders.cmd\",\n                GetProgramFiles() + @\"/Microsoft VS Code Insiders/Code.exe\",\n                GetLocalAppData() + @\"/Programs/Microsoft VS Code/bin/code.cmd\",\n                GetLocalAppData() + @\"/Programs/Microsoft VS Code/Code.exe\",\n                GetLocalAppData() + @\"/Programs/Microsoft VS Code Insiders/bin/code-insiders.cmd\",\n                GetLocalAppData() + @\"/Programs/Microsoft VS Code Insiders/Code.exe\",\n            };\n#else\n            {\n                \"/usr/bin/code\",\n                \"/bin/code\",\n                \"/usr/local/bin/code\",\n                \"/var/lib/flatpak/exports/bin/com.visualstudio.code\",\n                \"/snap/current/bin/code\"\n            };\n#endif\n            var existingPaths = possiblePaths.Where(VSCodeExists).ToList();\n            if (!existingPaths.Any())\n            {\n                return;\n            }\n\n            var lcp = GetLongestCommonPrefix(existingPaths);\n            switch (existingPaths.Count)\n            {\n                case 1:\n                {\n                    var path = existingPaths.First();\n                    m_Installations = new List<CodeEditor.Installation>\n                    {\n                        new CodeEditor.Installation\n                        {\n                            Path = path,\n                            Name = path.Contains(\"Insiders\")\n                                ? \"Visual Studio Code Insiders\"\n                                : \"Visual Studio Code\"\n                        }\n                    };\n                    break;\n                }\n                case 2 when existingPaths.Any(path => !(path.Substring(lcp.Length).Contains(\"/\") || path.Substring(lcp.Length).Contains(\"\\\\\"))):\n                {\n                    goto case 1;\n                }\n                default:\n                {\n                    m_Installations = existingPaths.Select(path => new CodeEditor.Installation\n                    {\n                        Name = $\"Visual Studio Code Insiders ({path.Substring(lcp.Length)})\",\n                        Path = path\n                    }).ToList();\n\n                    break;\n                }\n            }\n        }\n\n#if UNITY_EDITOR_WIN\n        static string GetProgramFiles()\n        {\n            return Environment.GetEnvironmentVariable(\"ProgramFiles\")?.Replace(\"\\\\\", \"/\");\n        }\n\n        static string GetLocalAppData()\n        {\n            return Environment.GetEnvironmentVariable(\"LOCALAPPDATA\")?.Replace(\"\\\\\", \"/\");\n        }\n#endif\n\n        static string GetLongestCommonPrefix(List<string> paths)\n        {\n            var baseLength = paths.First().Length;\n            for (var pathIndex = 1; pathIndex < paths.Count; pathIndex++)\n            {\n                baseLength = Math.Min(baseLength, paths[pathIndex].Length);\n                for (var i = 0; i < baseLength; i++)\n                {\n                    if (paths[pathIndex][i] == paths[0][i]) continue;\n\n                    baseLength = i;\n                    break;\n                }\n            }\n\n            return paths[0].Substring(0, baseLength);\n        }\n\n        static bool VSCodeExists(string path)\n        {\n#if UNITY_EDITOR_OSX\n            return System.IO.Directory.Exists(path);\n#else\n            return new FileInfo(path).Exists;\n#endif\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/VSCodeDiscovery.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 380f7372e785c7d408552e2c760d269d\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/VSCodeScriptEditor.cs",
    "content": "using System;\nusing System.IO;\nusing System.Linq;\nusing System.Diagnostics;\nusing UnityEditor;\nusing UnityEngine;\nusing Unity.CodeEditor;\n\nnamespace VSCodeEditor\n{\n    [InitializeOnLoad]\n    public class VSCodeScriptEditor : IExternalCodeEditor\n    {\n        const string vscode_argument = \"vscode_arguments\";\n        const string vscode_generate_all = \"unity_generate_all_csproj\";\n        const string vscode_extension = \"vscode_userExtensions\";\n        static readonly GUIContent k_ResetArguments = EditorGUIUtility.TrTextContent(\"Reset argument\");\n        string m_Arguments;\n\n        IDiscovery m_Discoverability;\n        IGenerator m_ProjectGeneration;\n\n        static readonly string[] k_SupportedFileNames = { \"code.exe\", \"visualstudiocode.app\", \"visualstudiocode-insiders.app\", \"vscode.app\", \"code.app\", \"code.cmd\", \"code-insiders.cmd\", \"code\", \"com.visualstudio.code\" };\n\n        static bool IsOSX => Application.platform == RuntimePlatform.OSXEditor;\n\n        static string DefaultApp => EditorPrefs.GetString(\"kScriptsDefaultApp\");\n\n        static string DefaultArgument { get; } = \"\\\"$(ProjectPath)\\\" -g \\\"$(File)\\\":$(Line):$(Column)\";\n\n        string Arguments\n        {\n            get => m_Arguments ?? (m_Arguments = EditorPrefs.GetString(vscode_argument, DefaultArgument));\n            set\n            {\n                m_Arguments = value;\n                EditorPrefs.SetString(vscode_argument, value);\n            }\n        }\n\n        static string[] defaultExtensions\n        {\n            get\n            {\n                var customExtensions = new[] { \"json\", \"asmdef\", \"log\" };\n                return EditorSettings.projectGenerationBuiltinExtensions\n                    .Concat(EditorSettings.projectGenerationUserExtensions)\n                    .Concat(customExtensions)\n                    .Distinct().ToArray();\n            }\n        }\n\n        static string[] HandledExtensions\n        {\n            get\n            {\n                return HandledExtensionsString\n                    .Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries)\n                    .Select(s => s.TrimStart('.', '*'))\n                    .ToArray();\n            }\n        }\n\n        static string HandledExtensionsString\n        {\n            get => EditorPrefs.GetString(vscode_extension, string.Join(\";\", defaultExtensions));\n            set => EditorPrefs.SetString(vscode_extension, value);\n        }\n\n        public bool TryGetInstallationForPath(string editorPath, out CodeEditor.Installation installation)\n        {\n            var lowerCasePath = editorPath.ToLower();\n            var filename = Path.GetFileName(lowerCasePath).Replace(\" \", \"\");\n            var installations = Installations;\n            if (!k_SupportedFileNames.Contains(filename))\n            {\n                installation = default;\n                return false;\n            }\n\n            if (!installations.Any())\n            {\n                installation = new CodeEditor.Installation\n                {\n                    Name = \"Visual Studio Code\",\n                    Path = editorPath\n                };\n            }\n            else\n            {\n                try\n                {\n                    installation = installations.First(inst => inst.Path == editorPath);\n                }\n                catch (InvalidOperationException)\n                {\n                    installation = new CodeEditor.Installation\n                    {\n                        Name = \"Visual Studio Code\",\n                        Path = editorPath\n                    };\n                }\n            }\n\n            return true;\n        }\n\n        public void OnGUI()\n        {\n            Arguments = EditorGUILayout.TextField(\"External Script Editor Args\", Arguments);\n            if (GUILayout.Button(k_ResetArguments, GUILayout.Width(120)))\n            {\n                Arguments = DefaultArgument;\n            }\n\n            var prevGenerate = EditorPrefs.GetBool(vscode_generate_all, false);\n\n            var generateAll = EditorGUILayout.Toggle(\"Generate all .csproj files.\", prevGenerate);\n            if (generateAll != prevGenerate)\n            {\n                EditorPrefs.SetBool(vscode_generate_all, generateAll);\n            }\n\n            m_ProjectGeneration.GenerateAll(generateAll);\n\n            HandledExtensionsString = EditorGUILayout.TextField(new GUIContent(\"Extensions handled: \"), HandledExtensionsString);\n        }\n\n        public void CreateIfDoesntExist()\n        {\n            if (!m_ProjectGeneration.SolutionExists())\n            {\n                m_ProjectGeneration.Sync();\n            }\n        }\n\n        public void SyncIfNeeded(string[] addedFiles, string[] deletedFiles, string[] movedFiles, string[] movedFromFiles, string[] importedFiles)\n        {\n            m_ProjectGeneration.SyncIfNeeded(addedFiles.Union(deletedFiles).Union(movedFiles).Union(movedFromFiles), importedFiles);\n        }\n\n        public void SyncAll()\n        {\n            AssetDatabase.Refresh();\n            m_ProjectGeneration.Sync();\n        }\n\n        public bool OpenProject(string path, int line, int column)\n        {\n            if (path != \"\" && !SupportsExtension(path)) // Assets - Open C# Project passes empty path here\n            {\n                return false;\n            }\n\n            if (line == -1)\n                line = 1;\n            if (column == -1)\n                column = 0;\n\n            string arguments;\n            if (Arguments != DefaultArgument)\n            {\n                arguments = m_ProjectGeneration.ProjectDirectory != path\n                    ? CodeEditor.ParseArgument(Arguments, path, line, column)\n                    : m_ProjectGeneration.ProjectDirectory;\n            }\n            else\n            {\n                arguments = $@\"\"\"{m_ProjectGeneration.ProjectDirectory}\"\"\";\n                if (m_ProjectGeneration.ProjectDirectory != path && path.Length != 0)\n                {\n                    arguments += $@\" -g \"\"{path}\"\":{line}:{column}\";\n                }\n            }\n\n            if (IsOSX)\n            {\n                return OpenOSX(arguments);\n            }\n\n            var app = DefaultApp;\n            var process = new Process\n            {\n                StartInfo = new ProcessStartInfo\n                {\n                    FileName = app,\n                    Arguments = arguments,\n                    WindowStyle = app.EndsWith(\".cmd\", StringComparison.OrdinalIgnoreCase) ? ProcessWindowStyle.Hidden : ProcessWindowStyle.Normal,\n                    CreateNoWindow = true,\n                    UseShellExecute = true,\n                }\n            };\n\n            process.Start();\n            return true;\n        }\n\n        static bool OpenOSX(string arguments)\n        {\n            var process = new Process\n            {\n                StartInfo = new ProcessStartInfo\n                {\n                    FileName = \"open\",\n                    Arguments = $\"-n \\\"{DefaultApp}\\\" --args {arguments}\",\n                    UseShellExecute = true,\n                }\n            };\n\n            process.Start();\n            return true;\n        }\n\n        static bool SupportsExtension(string path)\n        {\n            var extension = Path.GetExtension(path);\n            if (string.IsNullOrEmpty(extension))\n                return false;\n            return HandledExtensions.Contains(extension.TrimStart('.'));\n        }\n\n        public CodeEditor.Installation[] Installations => m_Discoverability.PathCallback();\n\n        public VSCodeScriptEditor(IDiscovery discovery, IGenerator projectGeneration)\n        {\n            m_Discoverability = discovery;\n            m_ProjectGeneration = projectGeneration;\n        }\n\n        static VSCodeScriptEditor()\n        {\n            var editor = new VSCodeScriptEditor(new VSCodeDiscovery(), new ProjectGeneration(Directory.GetParent(Application.dataPath).FullName));\n            CodeEditor.Register(editor);\n\n            if (IsVSCodeInstallation(CodeEditor.CurrentEditorInstallation))\n            {\n                editor.CreateIfDoesntExist();\n            }\n        }\n\n        static bool IsVSCodeInstallation(string path)\n        {\n            if (string.IsNullOrEmpty(path))\n            {\n                return false;\n            }\n\n            var lowerCasePath = path.ToLower();\n            var filename = Path\n                .GetFileName(lowerCasePath.Replace('\\\\', Path.DirectorySeparatorChar).Replace('/', Path.DirectorySeparatorChar))\n                .Replace(\" \", \"\");\n            return k_SupportedFileNames.Contains(filename);\n        }\n\n        public void Initialize(string editorInstallationPath) { }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor/VSCodeScriptEditor.cs.meta",
    "content": "fileFormatVersion: 2\nguid: ac3f13489022aa34d861a0320a6917b9\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.vscode@1.1.3/Editor.meta",
    "content": "fileFormatVersion: 2\nguid: 58628227479c34542ac8c5193ccced84\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.vscode@1.1.3/LICENSE.md",
    "content": "MIT License\n\nCopyright (c) 2019 Unity Technologies\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.vscode@1.1.3/LICENSE.md.meta",
    "content": "fileFormatVersion: 2\nguid: c9aabac5924106d4790d7b3a924ca34d\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.vscode@1.1.3/package.json",
    "content": "{\n  \"name\": \"com.unity.ide.vscode\",\n  \"displayName\": \"Visual Studio Code Editor\",\n  \"description\": \"Code editor integration for supporting Visual Studio Code as code editor for unity. Adds support for generating csproj files for intellisense purposes, auto discovery of installations, etc.\",\n  \"version\": \"1.1.3\",\n  \"unity\": \"2019.2\",\n  \"unityRelease\": \"0a12\",\n  \"dependencies\": {},\n  \"relatedPackages\": {\n    \"com.unity.ide.vscode.tests\": \"1.1.3\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git@github.cds.internal.unity3d.com:unity/com.unity.ide.vscode.git\",\n    \"revision\": \"7509767be271ef8ccdfaf82ea0fb71162a971d43\"\n  }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.ide.vscode@1.1.3/package.json.meta",
    "content": "fileFormatVersion: 2\nguid: ffc6271f08270b64ca0aae9c49235d81\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/CHANGELOG.md",
    "content": "# Changelog\n## [1.0.13] - 2019-05-07\n- Fixed a regression where results from the player would no longer update correctly in the UI (case 1151147).\n\n## [1.0.12] - 2019-04-16\n- Added specific unity release to the package information.\n\n## [1.0.11] - 2019-04-10\n- Fixed a regression from 1.0.10 where test-started events were triggered multiple times after a domain reload.\n\n## [1.0.10] - 2019-04-08\n- Fixed an issue where test-started events would not be fired correctly after a test performing a domain reload (case 1141530).\n- The UI should correctly run tests inside a nested class, when that class is selected.\n- All actions should now correctly display a prefix when reporting test result. E.g. \"TearDown :\".\n- Errors logged with Debug.LogError in TearDowns now append the error, rather than overwriting the existing result (case 1114306).\n- Incorrect implementations of IWrapTestMethod and IWrapSetUpTearDown now gives a meaningful error.\n- Fixed a regression where the Test Framework would run TearDown in a base class before the inheriting class (case 1142553).\n- Fixed a regression introduced in 1.0.9 where tests with the Explicit attribute could no longer be executed.\n\n## [1.0.9] - 2019-03-27\n- Fixed an issue where a corrupt instance of the test runner window would block for a new being opened.\n- Added the required modules to the list of package requirements.\n- Fixed an issue where errors would happen if the test filter ui was clicked before the ui is done loading.\n- Fix selecting items with duplicate names in test hierarchy of Test Runner window (case 987587).\n- Fixed RecompileScripts instruction which we use in tests (case 1128994).\n- Fixed an issue where using multiple filters on tests would sometimes give an incorrect result.\n\n## [1.0.7] - 2019-03-12\n### This is the first release of *Unity Package com.unity.test-framework*.\n\n- Migrated the test-framework from the current extension in unity.\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/CHANGELOG.md.meta",
    "content": "fileFormatVersion: 2\nguid: d691174143fd3774ba63d7c493633b99\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/CONTRIBUTING.md",
    "content": "# Contributing\n\n## If you are interested in contributing, here are some ground rules:\n* ... Define guidelines & rules for what contributors need to know to successfully make Pull requests against your repo ...\n\n## All contributions are subject to the [Unity Contribution Agreement(UCA)](https://unity3d.com/legal/licenses/Unity_Contribution_Agreement)\nBy making a pull request, you are confirming agreement to the terms and conditions of the UCA, including that your Contributions are your original creation and that you have complete right and authority to make your Contributions.\n\n## Once you have a change ready following these ground rules. Simply make a pull request\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/CONTRIBUTING.md.meta",
    "content": "fileFormatVersion: 2\nguid: 57d2ac5c7d5786e499d4794973fe0d4e\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/Documentation~/PlaymodeTestFramework.md",
    "content": "# Writing and executing tests in Unity Test Runner\n\nThe Unity Test Runner tests your code in __Edit__ mode and __Play__ mode, as well as on target platforms such as Standalone, Android, or iOS.\n\nThe documentation on this page discusses writing and executing tests in the the Unity Test Runner, and assumes you understand both [scripting](https://docs.unity3d.com/Manual/CreatingAndUsingScripts.html) and the [Unity Test Runner](About.md).\n\nUnity delivers test results in an XML format. For more information, see the [NUnit documentation on XML format test results](https://github.com/nunit/docs/wiki/Test-Result-XML-Format).\n\n## UnityTestAttribute\n\n[UnityTestAttribute](https://docs.unity3d.com/ScriptReference/TestTools.UnityTestAttribute.html) requires you to return `IEnumerator`. In __Play__ mode, execute the test as a [coroutine](https://docs.unity3d.com/ScriptReference/Coroutine.html). In __Edit__ mode, you can yield `null` from the test, which skips the current frame.\n\n__Note:__ The WebGL and WSA platforms do not support `UnityTestAttribute`.\n\n### Regular NUnit test (works in Edit mode and Play mode)\n\n```\n[Test]\npublic void GameObject_CreatedWithGiven_WillHaveTheName()\n{\n    var go = new GameObject(\"MyGameObject\");\n    Assert.AreEqual(\"MyGameObject\", go.name);\n}\n```\n\n### Example in Play mode\n\n```\n[UnityTest]\npublic IEnumerator GameObject_WithRigidBody_WillBeAffectedByPhysics()\n{\n    var go = new GameObject();\n    go.AddComponent<Rigidbody>();\n    var originalPosition = go.transform.position.y;\n\n    yield return new WaitForFixedUpdate();\n\n    Assert.AreNotEqual(originalPosition, go.transform.position.y);\n}\n```\n\n### Example in Edit mode:\n\n```\n[UnityTest]\npublic IEnumerator EditorUtility_WhenExecuted_ReturnsSuccess()\n{\n    var utility = RunEditorUtilityInTheBackgroud();\n\n    while (utility.isRunning)\n    {\n        yield return null;\n    }\n\n    Assert.IsTrue(utility.isSuccess);\n}\n```\n\n## UnityPlatformAttribute\n\nUse [UnityPlatformAttribute](https://docs.unity3d.com/ScriptReference/TestTools.UnityPlatformAttribute.html) to filter tests based on the the executing platform. It behaves like the [NUnit ](http://nunit.org/docs/2.5/platform.html)[PlatformAttribute](http://nunit.org/docs/2.5/platform.html).\n\n```\n[Test]\n[UnityPlatform (RuntimePlatform.WindowsPlayer)]\npublic void TestMethod1()\n{\n   Assert.AreEqual(Application.platform, RuntimePlatform.WindowsPlayer);\n}\n\n[Test]\n[UnityPlatform(exclude = new[] {RuntimePlatform.WindowsEditor })]\npublic void TestMethod2()\n{\n   Assert.AreNotEqual(Application.platform, RuntimePlatform.WindowsEditor);\n}\n```\n\nTo only execute Editor tests on a given platform, you can also use `UnityPlatform` .\n\n### PrebuildSetupAttriubte\n\nUse [PrebuildSetupAttribute](https://docs.unity3d.com/ScriptReference/TestTools.PrebuildSetupAttribute.html) if you need to perform any extra set-up before the test starts. To do this, specify the class type that implements the [IPrebuildSetup](https://docs.unity3d.com/ScriptReference/TestTools.IPrebuildSetup.html) interface. If you need to run the set-up code for the whole class (for example, if you want to execute some code before the test starts, such as Asset preparation or set-up required for a specific test), implement the `IPrebuildSetup` interface in the class for tests.\n\n```\npublic class TestsWithPrebuildStep : IPrebuildSetup\n{\n    public void Setup()\n    {\n        // Run this code before the tests are executed\n    }\n\n    [Test]\n    //PrebuildSetupAttribute can be skipped because it's implemented in the same class\n    [PrebuildSetup(typeof(TestsWithPrebuildStep))]\n    public void Test()\n    {\n        (...)\n    }\n}\n```\n\nExecute the `IPrebuildSetup` code before entering Play mode or building a player. Setup can use UnityEditor namespace and its function, but to avoid compilation errors, you must place it either in the *Editor* folder, or guard it with the `#if UNITY_EDITOR` directive.\n\n## LogAssert\n\nA test fails if Unity logs a message other than a regular log or warning message. Use the [LogAssert](https://docs.unity3d.com/ScriptReference/TestTools.LogAssert.html) class to make a message expected in the log, so that the test does not fail when Unity logs that message.\n\nA test also reports as failed if an expected message does not appear, or if Unity does not log any regular log or warning messages.\n\n### Example\n\n```\n[Test]\npublic void LogAssertExample()\n{\n    //Expect a regular log message\n    LogAssert.Expect(LogType.Log, \"Log message\");\n    //A log message is expected so without the following line\n    //the test would fail\n    Debug.Log(\"Log message\");\n    //An error log is printed\n    Debug.LogError(\"Error message\");\n    //Without expecting an error log, the test would fail\n    LogAssert.Expect(LogType.Error, \"Error message\");\n}\n```\n\n## MonoBehaviourTest\n\n[MonoBehaviourTest](https://docs.unity3d.com/ScriptReference/TestTools.MonoBehaviourTest_1.html) is a [coroutine](https://docs.unity3d.com/ScriptReference/Coroutine.html), and a helper for writing [MonoBehaviour](https://docs.unity3d.com/ScriptReference/MonoBehaviour.html) tests. Yield `MonoBehaviourTest` from the [UnityTest](https://docs.unity3d.com/ScriptReference/TestTools.UnityTestAttribute.html) attribute to instantiate the specified MonoBehaviour and wait for it to finish executing. Implement the [IMonoBehaviourTest](https://docs.unity3d.com/ScriptReference/TestTools.IMonoBehaviourTest.html) interface to indicate when the test is done.\n\n### Example\n\n```\n[UnityTest]\npublic IEnumerator MonoBehaviourTest_Works()\n{\n    yield return new MonoBehaviourTest<MyMonoBehaviourTest>();\n}\n\npublic class MyMonoBehaviourTest : MonoBehaviour, IMonoBehaviourTest\n{\n    private int frameCount;\n    public bool IsTestFinished\n    {\n        get { return frameCount > 10; }\n    }\n\n     void Update()\n     {\n        frameCount++;\n     }\n}\n```\n\n## Running tests on platforms\n\nIn __Play__ mode, you can run tests on specific platforms. The target platform is always the current Platform selected in [Build Settings](https://docs.unity3d.com/Manual/BuildSettings.html) (menu: __File__ > __Build Settings__). Click __Run all in the player__ to build and run your tests on the currently active target platform.\n\nNote that your current platform displays in brackets on the button. For example, in the screenshot below, the button reads __Run all in player (StandaloneWindows)__, because the current platform is Windows.\n\n![](UnityTestRunner-3.png)\n\nThe test results display in the build once the test is complete.\n\n![](UnityTestRunner-4.png)\n\nTo get the test results from the platform to the Editor running the test, both need to be on same network. The application running on the platform reports back the test results, displays the tests executed, and shuts down.\n\nNote that some platforms do not support shutting down the application with [Application.Quit](https://docs.unity3d.com/ScriptReference/Application.Quit.html). These continue running after reporting test results.\n\nIf Unity cannot instantiate the connection, you can visually see the tests succeed in the running application. Note that running tests on platforms with arguments, in this state, does not provide XML test results.\n\n## Running from the command line\n\nTo do this, run Unity with the following [command line arguments](https://docs.unity3d.com/Manual/CommandLineArguments.html):\n\n* `runTest` - Executes tests in the Project.\n\n* `testPlatform` - The platform you want to run tests on.\n\n    * Available platforms:\n\n        * `playmode` and `editmode`. Note that If unspecified, tests run in `editmode` by default.\n\n        * Platform/Type convention is from the [BuildTarget](https://docs.unity3d.com/ScriptReference/BuildTarget.html) enum. The tested and official supported platforms:\n\n            * [StandaloneWindows](https://docs.unity3d.com/ScriptReference/BuildTarget.StandaloneWindows.html)\n\n            * [StandaloneWindows64](https://docs.unity3d.com/ScriptReference/BuildTarget.StandaloneWindows64.html)\n\n            * [StandaloneOSXIntel](https://docs.unity3d.com/ScriptReference/BuildTarget.StandaloneOSXIntel.html)\n\n            * [StandaloneOSXIntel64](https://docs.unity3d.com/ScriptReference/BuildTarget.StandaloneOSXIntel64.html)\n\n            * [iOS](https://docs.unity3d.com/ScriptReference/BuildTarget.iOS.html)\n\n            * [tvOS](https://docs.unity3d.com/ScriptReference/BuildTarget.tvOS.html)\n\n            * [Android](https://docs.unity3d.com/ScriptReference/BuildTarget.Android.html)\n\n            * [PS4](https://docs.unity3d.com/ScriptReference/BuildTarget.PS4.html)\n\n            * [XboxOne](https://docs.unity3d.com/ScriptReference/BuildTarget.XboxOne.html)\n\n* `testResults` - The path indicating where Unity should save the result file. By default, Unity saves it in the Project’s root folder. \n\n### Example\n\nThe following example shows a command line argument on Windows. The specific line may differ depending on your operating system.\n\n\n```\n>Unity.exe -runTests -projectPath PATH_TO_YOUR_PROJECT -testResults C:\\temp\\results.xml -testPlatform editmode\n```\n\n__Tip:__ On Windows, in order to read the result code of the executed command, run the following: \n\n`start /WAIT Unity.exe ARGUMENT_LIST`.\n\n## Comparison utilities\n\nThe [UnityEngine.TestTools.Utils](https://docs.unity3d.com/ScriptReference/TestTools.Utils.Utils.html) namespace contains utility classes to compare [Vector2](https://docs.unity3d.com/ScriptReference/Vector2.html), [Vector3](https://docs.unity3d.com/ScriptReference/Vector3.html), [Vector4](https://docs.unity3d.com/ScriptReference/Vector4.html), [Quaternion](https://docs.unity3d.com/ScriptReference/Quaternion.html), [Color](https://docs.unity3d.com/ScriptReference/Color.html) and `float` types using NUnit constraints."
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/Documentation~/com.unity.test-framework.md",
    "content": "# Unity Test Runner\n\nThe Unity Test Runner is a tool that tests your code in both __Edit__ mode and __Play__ mode, and also on target platforms such as [Standalone](https://docs.unity3d.com/Manual/Standalone.html), Android, or iOS.\n\nTo access the Unity Test Runner, go to __Window__ > __Test Runner__.\n\n![](UnityTestRunner-0.png)\n\nThe Unity Test Runner uses a Unity integration of the NUnit library, which is an open-source unit testing library for .Net languages. For more information about NUnit, see the [official NUnit website](http://www.nunit.org/) and the [NUnit documentation on GitHub](https://github.com/nunit/docs/wiki/NUnit-Documentation).\n\n[UnityTestAttribute](https://docs.unity3d.com/ScriptReference/TestTools.UnityTestAttribute.html) is the main addition to the standard NUnit library for the Unity Test Runner. This is a type of unit test that allows you to skip a frame from within a test (which allows background tasks to finish). To use `UnityTestAttribute`:\n\n* In __Play__ mode: Execute `UnityTestAttribute` as a [coroutine](https://docs.unity3d.com/ScriptReference/Coroutine.html).\n\n* In __Edit__ mode: Execute `UnityTestAttribute` in the [EditorApplication.update](https://docs.unity3d.com/ScriptReference/EditorApplication-update.html) callback loop.\n\n## Known issues and limitations\n\nThere are some known issues and limitations of the Unity Test Runner:\n\n* The WebGL and WSA platforms do not support `UnityTestAttribute`.\n\n* `UnityTest` does not support [Parameterized tests](https://github.com/nunit/docs/wiki/Parameterized-Tests) (except for `ValueSource`).\n\n## How to use Unity Test Runner\n\nThis page assumes you already have an understanding of unit testing and NUnit. If you are new to NUnit or would like more information, see to the [NUnit documentation on GitHub](https://github.com/nunit/docs/wiki/NUnit-Documentation).\n\nTo open the Unity Test Runner, open Unity and go to __Window__ &gt; __Test Runner__. If there are no tests in your Project, click the __Create Test Script in current folder__ button to create a basic test script. This button is greyed out if adding a test script would result in a compilation error. The conditions for adding a test script are in the [Editor](https://docs.unity3d.com/Manual/SpecialFolders.html) folder, or any folders using Assembly Definition files that reference test assemblies (NUnit, Unity Test Runner, and user script assemblies).\n\n![](UnityTestRunner-1.png)\n\nYou can also create test scripts by navigating to __Assets__ &gt; __Create__ &gt; __C# Test Script__. This option is disabled if adding a test script would result in a compilation error.\n\n__Note:__ Unity does not include test assemblies (NUnit, Unity TestRunner, and user script assemblies) when using the normal build pipeline, but does include them when using \"Run on &lt;Platform&gt;\" in the Test Runner Window.\n\n### Testing in Edit mode\n\nIn __Edit__ mode, Unity runs tests from the Test Runner window.\n\nEdit mode test scripts are defined by the file location you place them in. Valid locations:\n\n* Project [Editor](https://docs.unity3d.com/Manual/SpecialFolders.html) folder\n\n* Assembly Definition file that references test assemblies that are Editor-only\n\n* Precompiled assemblies that are in the Project’s [Editor](https://docs.unity3d.com/Manual/SpecialFolders.html) folder\n\nClick the __EditMode__ button, then click __Create Test Script in current folder__ to create a basic test script. Open and edit this in your preferred script editing software as required.\n\nNote: When running in __Edit__ mode, execute [UnityTestAttribute](https://docs.unity3d.com/ScriptReference/TestTools.UnityTestAttribute.html) in the [EditorApplication.update](https://docs.unity3d.com/ScriptReference/EditorApplication-update.html) callback loop.\n\n### Testing in Play mode\n\nYou need to place Play mode test scripts in a folder that an Assembly Definition file includes. The Assembly Definition file needs to reference test assemblies (Nunit and Unity TestRunner). Pre-defined Unity assemblies (such as *Assembly-CSharp.dll*) do not reference the defined assembly. This Assembly Definition file also needs to reference the assembly you want to test. This means that it’s only possible to test code defined by other Assembly Definition files.\n\nUnity does not include test assemblies in normal player builds; only when running through the Test Runner. If you need to test code in pre-defined assemblies, you can reference test assemblies from all the assemblies. However, you must manually remove these tests afterwards, so that Unity does not add them to the final player build.\n\nTo do this:\n\n1. Save your project.\n\n2. Go to __Window__ &gt; __Test Runner.__\n\n3. Click the small drop-down menu in the top-right of the window.\n\n4. Click __Enable playmode tests for all assemblies__.\n\n5. In the dialog box appears, click __OK__ to manually restart the Editor.\n\n![](UnityTestRunner-2.png)\n\n__Note:__ Enabling __PlayMode__ tests for all assemblies includes additional assemblies in your Project’s build, which can increase your Project’s size as well as build time.\n\nTo create __PlayMode__ test scripts, select __PlayMode__ in the Test Runner window and click __Create Test Script in current folder__. This button is greyed out if adding the script would result in a compilation error. \n\n__Note__: Execute [UnityTestAttribute](https://docs.unity3d.com/ScriptReference/TestTools.UnityTestAttribute.html) as a [coroutine](https://docs.unity3d.com/ScriptReference/Coroutine.html) when running in __Play__ mode.\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/LICENSE.md",
    "content": "Test Framework copyright © 2019 Unity Technologies ApS\n\nLicensed under the Unity Companion License for Unity-dependent projects--see [Unity Companion License](http://www.unity3d.com/legal/licenses/Unity_Companion_License). \n\nUnless expressly provided otherwise, the Software under this license is made available strictly on an “AS IS” BASIS WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED. Please review the license for details on these and other terms and conditions.\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/LICENSE.md.meta",
    "content": "fileFormatVersion: 2\nguid: 3ec7596410385054a9e0bc90377fbe63\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api/CallbacksDelegator.cs",
    "content": "using System;\nusing System.Linq;\nusing System.Text;\nusing NUnit.Framework.Interfaces;\nusing NUnit.Framework.Internal;\nusing UnityEngine;\nusing UnityEngine.TestRunner.TestLaunchers;\n\nnamespace UnityEditor.TestTools.TestRunner.Api\n{\n    internal class CallbacksDelegator\n    {\n        private static CallbacksDelegator s_instance;\n        public static CallbacksDelegator instance\n        {\n            get\n            {\n                if (s_instance == null)\n                {\n                    s_instance = new CallbacksDelegator(CallbacksHolder.instance.GetAll, new TestAdaptorFactory());\n                }\n                return s_instance;\n            }\n        }\n\n        private readonly Func<ICallbacks[]> m_CallbacksProvider;\n        private readonly ITestAdaptorFactory m_AdaptorFactory;\n\n        public CallbacksDelegator(Func<ICallbacks[]> callbacksProvider, ITestAdaptorFactory adaptorFactory)\n        {\n            m_CallbacksProvider = callbacksProvider;\n            m_AdaptorFactory = adaptorFactory;\n        }\n\n        public void RunStarted(ITest testsToRun)\n        {\n            var testRunnerTestsToRun = m_AdaptorFactory.Create(testsToRun);\n            TryInvokeAllCallbacks(callbacks => callbacks.RunStarted(testRunnerTestsToRun));\n        }\n\n        public void RunStartedRemotely(byte[] testsToRunData)\n        {\n            var testData = Deserialize<RemoteTestResultDataWithTestData>(testsToRunData);\n            var testsToRun = m_AdaptorFactory.BuildTree(testData);\n            TryInvokeAllCallbacks(callbacks => callbacks.RunStarted(testsToRun));\n        }\n\n        public void RunFinished(ITestResult testResults)\n        {\n            var testResult = m_AdaptorFactory.Create(testResults);\n            TryInvokeAllCallbacks(callbacks => callbacks.RunFinished(testResult));\n        }\n\n        public void RunFinishedRemotely(byte[] testResultsData)\n        {\n            var remoteTestResult = Deserialize<RemoteTestResultDataWithTestData>(testResultsData);\n            var testResult = m_AdaptorFactory.Create(remoteTestResult.results.First(), remoteTestResult);\n            TryInvokeAllCallbacks(callbacks => callbacks.RunFinished(testResult));\n        }\n\n        public void RunFailed(string failureMessage)\n        {\n            var nunitTestResult = new TestSuiteResult(new TestSuite(\"test\"));\n            nunitTestResult.SetResult(ResultState.Error, failureMessage);\n            var testResult = m_AdaptorFactory.Create(nunitTestResult);\n            TryInvokeAllCallbacks(callbacks => callbacks.RunFinished(testResult));\n        }\n\n        public void TestStarted(ITest test)\n        {\n            var testRunnerTest = m_AdaptorFactory.Create(test);\n            TryInvokeAllCallbacks(callbacks => callbacks.TestStarted(testRunnerTest));\n        }\n\n        public void TestStartedRemotely(byte[] testStartedData)\n        {\n            var testData = Deserialize<RemoteTestResultDataWithTestData>(testStartedData);\n            var testsToRun = m_AdaptorFactory.BuildTree(testData);\n\n            TryInvokeAllCallbacks(callbacks => callbacks.TestStarted(testsToRun));\n        }\n\n        public void TestFinished(ITestResult result)\n        {\n            var testResult = m_AdaptorFactory.Create(result);\n            TryInvokeAllCallbacks(callbacks => callbacks.TestFinished(testResult));\n        }\n\n        public void TestFinishedRemotely(byte[] testResultsData)\n        {\n            var remoteTestResult = Deserialize<RemoteTestResultDataWithTestData>(testResultsData);\n            var testResult = m_AdaptorFactory.Create(remoteTestResult.results.First(), remoteTestResult);\n            TryInvokeAllCallbacks(callbacks => callbacks.TestFinished(testResult));\n        }\n\n        private void TryInvokeAllCallbacks(Action<ICallbacks> callbackAction)\n        {\n            foreach (var testRunnerApiCallback in m_CallbacksProvider())\n            {\n                try\n                {\n                    callbackAction(testRunnerApiCallback);\n                }\n                catch (Exception ex)\n                {\n                    Debug.LogException(ex);\n                }\n            }\n        }\n\n        private static T Deserialize<T>(byte[] data)\n        {\n            return JsonUtility.FromJson<T>(Encoding.UTF8.GetString(data));\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api/CallbacksDelegator.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 0de03ebd74e2b474fa23d05ab42d0cd8\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api/CallbacksDelegatorListener.cs",
    "content": "using UnityEngine;\nusing UnityEngine.TestTools.TestRunner;\n\nnamespace UnityEditor.TestTools.TestRunner.Api\n{\n    internal class CallbacksDelegatorListener : ScriptableObject, ITestRunnerListener\n    {\n        public void RunStarted(NUnit.Framework.Interfaces.ITest testsToRun)\n        {\n            CallbacksDelegator.instance.RunStarted(testsToRun);\n        }\n\n        public void RunFinished(NUnit.Framework.Interfaces.ITestResult testResults)\n        {\n            CallbacksDelegator.instance.RunFinished(testResults);\n        }\n\n        public void TestStarted(NUnit.Framework.Interfaces.ITest test)\n        {\n            CallbacksDelegator.instance.TestStarted(test);\n        }\n\n        public void TestFinished(NUnit.Framework.Interfaces.ITestResult result)\n        {\n            CallbacksDelegator.instance.TestFinished(result);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api/CallbacksDelegatorListener.cs.meta",
    "content": "fileFormatVersion: 2\nguid: f3e1b3cbf3fac6a459b1a602167ad311\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api/CallbacksHolder.cs",
    "content": "using System.Collections.Generic;\nusing System.Linq;\n\nnamespace UnityEditor.TestTools.TestRunner.Api\n{\n    internal class CallbacksHolder : ScriptableSingleton<CallbacksHolder>\n    {\n        private List<CallbackWithPriority> m_Callbacks = new List<CallbackWithPriority>();\n        public void Add(ICallbacks callback, int priority)\n        {\n            m_Callbacks.Add(new CallbackWithPriority(callback, priority));\n        }\n\n        public void Remove(ICallbacks callback)\n        {\n            m_Callbacks.RemoveAll(callbackWithPriority => callbackWithPriority.Callback == callback);\n        }\n\n        public ICallbacks[] GetAll()\n        {\n            return m_Callbacks.OrderByDescending(callback => callback.Priority).Select(callback => callback.Callback).ToArray();\n        }\n\n        public void Clear()\n        {\n            m_Callbacks.Clear();\n        }\n\n        private struct CallbackWithPriority\n        {\n            public ICallbacks Callback;\n            public int Priority;\n            public CallbackWithPriority(ICallbacks callback, int priority)\n            {\n                Callback = callback;\n                Priority = priority;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api/CallbacksHolder.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 4884ccc3528cb2e40a0e6f0a19a2b35b\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api/ExecutionSettings.cs",
    "content": "namespace UnityEditor.TestTools.TestRunner.Api\n{\n    internal class ExecutionSettings\n    {\n        public BuildTarget? targetPlatform;\n        public ITestRunSettings overloadTestRunSettings;\n        public Filter filter;\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api/ExecutionSettings.cs.meta",
    "content": "fileFormatVersion: 2\nguid: eea34a28297f9bc4c9f4c573bc8d5d1c\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api/Filter.cs",
    "content": "using System;\nusing UnityEngine;\nusing UnityEngine.TestTools.TestRunner.GUI;\n\nnamespace UnityEditor.TestTools.TestRunner.Api\n{\n    [Serializable]\n    internal class Filter\n    {\n        [SerializeField]\n        public TestMode testMode;\n        [SerializeField]\n        public string[] testNames;\n        [SerializeField]\n        public string[] groupNames;\n        [SerializeField]\n        public string[] categoryNames;\n        [SerializeField]\n        public string[] assemblyNames;\n\n        public static Filter empty = new Filter();\n\n        internal TestRunnerFilter ToTestRunnerFilter()\n        {\n            return new TestRunnerFilter()\n            {\n                testNames = testNames,\n                categoryNames = categoryNames,\n                groupNames = groupNames,\n                assemblyNames = assemblyNames\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api/Filter.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 05f92e4a2414cb144a92157752dfa324\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api/ICallbacks.cs",
    "content": "namespace UnityEditor.TestTools.TestRunner.Api\n{\n    internal interface ICallbacks\n    {\n        void RunStarted(ITestAdaptor testsToRun);\n        void RunFinished(ITestResultAdaptor result);\n        void TestStarted(ITestAdaptor test);\n        void TestFinished(ITestResultAdaptor result);\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api/ICallbacks.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 93eea84e53d0226479c9a584f19427b5\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api/ITestAdaptor.cs",
    "content": "using System.Collections.Generic;\nusing NUnit.Framework.Interfaces;\n\nnamespace UnityEditor.TestTools.TestRunner.Api\n{\n    internal interface ITestAdaptor\n    {\n        string Id { get; }\n        string Name { get; }\n        string FullName { get; }\n        int TestCaseCount { get; }\n        bool HasChildren { get; }\n        bool IsSuite { get; }\n        IEnumerable<ITestAdaptor> Children { get; }\n        int TestCaseTimeout { get; }\n        ITypeInfo TypeInfo { get; }\n        IMethodInfo Method { get; }\n        string[] Categories { get; }\n        bool IsTestAssembly { get; }\n        RunState RunState { get; }\n        string Description { get; }\n        string SkipReason { get; }\n        string ParentId { get; }\n        string UniqueName { get; }\n        string ParentUniqueName { get; }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api/ITestAdaptor.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 85dd7af03f02aea4aae13a3945e3b313\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api/ITestAdaptorFactory.cs",
    "content": "using System.Collections.Generic;\nusing NUnit.Framework.Interfaces;\nusing UnityEngine.TestRunner.TestLaunchers;\n\nnamespace UnityEditor.TestTools.TestRunner.Api\n{\n    internal interface ITestAdaptorFactory\n    {\n        ITestAdaptor Create(ITest test);\n        ITestAdaptor Create(RemoteTestData testData);\n        ITestResultAdaptor Create(ITestResult testResult);\n        ITestResultAdaptor Create(RemoteTestResultData testResult, RemoteTestResultDataWithTestData allData);\n        ITestAdaptor BuildTree(RemoteTestResultDataWithTestData data);\n        IEnumerator<ITestAdaptor> BuildTreeAsync(RemoteTestResultDataWithTestData data);\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api/ITestAdaptorFactory.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 803abab0f7e17044db56f8760186dbd1\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api/ITestResultAdaptor.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing NUnit.Framework.Interfaces;\n\nnamespace UnityEditor.TestTools.TestRunner.Api\n{\n    internal interface ITestResultAdaptor\n    {\n        ITestAdaptor Test { get; }\n        string Name { get; }\n\n        /// <summary>Gets the full name of the test result</summary>\n        string FullName { get; }\n\n        string ResultState { get; }\n\n        TestStatus TestStatus { get; }\n\n        /// <summary>Gets the elapsed time for running the test in seconds</summary>\n        double Duration { get; }\n\n        /// <summary>Gets or sets the time the test started running.</summary>\n        DateTime StartTime { get; }\n\n        /// <summary>Gets or sets the time the test finished running.</summary>\n        DateTime EndTime { get; }\n\n        /// <summary>\n        /// Gets the message associated with a test\n        /// failure or with not running the test\n        /// </summary>\n        string Message { get; }\n\n        /// <summary>\n        /// Gets any stacktrace associated with an\n        /// error or failure. Not available in\n        /// the Compact Framework 1.0.\n        /// </summary>\n        string StackTrace { get; }\n\n        /// <summary>\n        /// Gets the number of asserts executed\n        /// when running the test and all its children.\n        /// </summary>\n        int AssertCount { get; }\n\n        /// <summary>\n        /// Gets the number of test cases that failed\n        /// when running the test and all its children.\n        /// </summary>\n        int FailCount { get; }\n\n        /// <summary>\n        /// Gets the number of test cases that passed\n        /// when running the test and all its children.\n        /// </summary>\n        int PassCount { get; }\n\n        /// <summary>\n        /// Gets the number of test cases that were skipped\n        /// when running the test and all its children.\n        /// </summary>\n        int SkipCount { get; }\n\n        /// <summary>\n        /// Gets the number of test cases that were inconclusive\n        /// when running the test and all its children.\n        /// </summary>\n        int InconclusiveCount { get; }\n\n        /// <summary>\n        /// Indicates whether this result has any child results.\n        /// Accessing HasChildren should not force creation of the\n        /// Children collection in classes implementing this interface.\n        /// </summary>\n        bool HasChildren { get; }\n\n        /// <summary>Gets the the collection of child results.</summary>\n        IEnumerable<ITestResultAdaptor> Children { get; }\n\n        /// <summary>Gets any text output written to this result.</summary>\n        string Output { get; }\n\n        TNode ToXml();\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api/ITestResultAdaptor.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 4f90cfe4bf5cfb44f84a5b11387f2a42\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api/ITestRunSettings.cs",
    "content": "using System;\n\nnamespace UnityEditor.TestTools.TestRunner.Api\n{\n    internal interface ITestRunSettings : IDisposable\n    {\n        void Apply();\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api/ITestRunSettings.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 2ae2ce6274819484fa8747a28cebdf3a\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api/ITestRunnerApi.cs",
    "content": "using System;\n\nnamespace UnityEditor.TestTools.TestRunner.Api\n{\n    interface ITestRunnerApi\n    {\n        void Execute(ExecutionSettings executionSettings);\n        void RegisterCallbacks<T>(T testCallbacks, int priority = 0) where T : ICallbacks;\n        void UnregisterCallbacks<T>(T testCallbacks) where T : ICallbacks;\n        void RetrieveTestList(ExecutionSettings executionSettings, Action<ITestAdaptor> callback);\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api/ITestRunnerApi.cs.meta",
    "content": "fileFormatVersion: 2\nguid: a7842a837a4b13e41ae16193db753418\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api/RunState.cs",
    "content": "namespace UnityEditor.TestTools.TestRunner.Api\n{\n    internal enum RunState\n    {\n        NotRunnable,\n        Runnable,\n        Explicit,\n        Skipped,\n        Ignored,\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api/RunState.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 8bb59cb2f66d156418ca1bd1e2703233\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api/TestAdaptor.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing NUnit.Framework.Interfaces;\nusing NUnit.Framework.Internal;\nusing UnityEngine.TestRunner.NUnitExtensions;\nusing UnityEngine.TestRunner.NUnitExtensions.Runner;\nusing UnityEngine.TestRunner.TestLaunchers;\nusing UnityEngine.TestTools.Utils;\n\nnamespace UnityEditor.TestTools.TestRunner.Api\n{\n    internal class TestAdaptor : ITestAdaptor\n    {\n        internal TestAdaptor(ITest test) : this(test, new ITest[0])\n        {\n        }\n\n        internal TestAdaptor(ITest test, ITest[] additionalChildren)\n        {\n            Id = test.Id;\n            Name = test.Name;\n            var childIndex = -1;\n            if (test.Properties[\"childIndex\"].Count > 0)\n            {\n                childIndex = (int)test.Properties[\"childIndex\"][0];\n            }\n            FullName = childIndex != -1 ? GetIndexedTestCaseName(test.FullName, childIndex) : test.FullName;\n            TestCaseCount = test.TestCaseCount;\n            HasChildren = test.HasChildren;\n            IsSuite = test.IsSuite;\n            Children = new[] {test.Tests, additionalChildren}.SelectMany(t => t).Select(t => new TestAdaptor(t)).ToArray();\n            if (UnityTestExecutionContext.CurrentContext != null)\n            {\n                TestCaseTimeout = UnityTestExecutionContext.CurrentContext.TestCaseTimeout;\n            }\n            else\n            {\n                TestCaseTimeout = CoroutineRunner.k_DefaultTimeout;\n            }\n\n            TypeInfo = test.TypeInfo;\n            Method = test.Method;\n            FullPath = GetFullPath(test);\n            Categories = test.GetAllCategoriesFromTest().Distinct().ToArray();\n            IsTestAssembly = test is TestAssembly;\n            RunState = (RunState)Enum.Parse(typeof(RunState), test.RunState.ToString());\n            Description = (string)test.Properties.Get(PropertyNames.Description);\n            SkipReason = test.GetSkipReason();\n            ParentId = test.GetParentId();\n            UniqueName = test.GetUniqueName();\n            ParentUniqueName = test.GetParentUniqueName();\n        }\n\n        internal TestAdaptor(RemoteTestData test)\n        {\n            Id = test.id;\n            Name = test.name;\n            FullName = test.ChildIndex != -1 ? GetIndexedTestCaseName(test.fullName, test.ChildIndex) : test.fullName;\n            TestCaseCount = test.testCaseCount;\n            HasChildren = test.hasChildren;\n            IsSuite = test.isSuite;\n            m_ChildrenIds = test.childrenIds;\n            TestCaseTimeout = test.testCaseTimeout;\n            Categories = test.Categories;\n            IsTestAssembly = test.IsTestAssembly;\n            RunState = (RunState)Enum.Parse(typeof(RunState), test.RunState.ToString());\n            Description = test.Description;\n            SkipReason = test.SkipReason;\n            ParentId = test.ParentId;\n            UniqueName = test.UniqueName;\n            ParentUniqueName = test.ParentUniqueName;\n        }\n\n        internal void ApplyChildren(IEnumerable<TestAdaptor> allTests)\n        {\n            Children = m_ChildrenIds.Select(id => allTests.First(t => t.Id == id)).ToArray();\n        }\n\n        public string Id { get; private set; }\n        public string Name { get; private set; }\n        public string FullName { get; private set; }\n        public int TestCaseCount { get; private set; }\n        public bool HasChildren { get; private set; }\n        public bool IsSuite { get; private set; }\n        public IEnumerable<ITestAdaptor> Children { get; private set; }\n        public int TestCaseTimeout { get; private set; }\n        public ITypeInfo TypeInfo { get; private set; }\n        public IMethodInfo Method { get; private set; }\n        public string FullPath { get; private set; }\n        private string[] m_ChildrenIds;\n        public string[] Categories { get; private set; }\n        public bool IsTestAssembly { get; private set; }\n        public RunState RunState { get; }\n        public string Description { get; }\n        public string SkipReason { get; }\n        public string ParentId { get; }\n        public string UniqueName { get; }\n        public string ParentUniqueName { get; }\n\n        private static string GetFullPath(ITest test)\n        {\n            if (test.Parent != null && test.Parent.Parent != null)\n                return GetFullPath(test.Parent) + \"/\" + test.Name;\n            return test.Name;\n        }\n\n        private static string GetIndexedTestCaseName(string fullName, int index)\n        {\n            var generatedTestSuffix = \" GeneratedTestCase\" + index;\n            if (fullName.EndsWith(\")\"))\n            {\n                // Test names from generated TestCaseSource look like Test(TestCaseSourceType)\n                // This inserts a unique test case index in the name, so that it becomes Test(TestCaseSourceType GeneratedTestCase0)\n                return fullName.Substring(0, fullName.Length - 1) + generatedTestSuffix + fullName[fullName.Length - 1];\n            }\n\n            // In some cases there can be tests with duplicate names generated in other ways and they won't have () in their name\n            // We just append a suffix at the end of the name in that case\n            return fullName + generatedTestSuffix;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api/TestAdaptor.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 6e0e62db88935c74288c97c907243bd0\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api/TestAdaptorFactory.cs",
    "content": "using System.Collections.Generic;\nusing System.Linq;\nusing NUnit.Framework.Interfaces;\nusing UnityEngine.TestRunner.TestLaunchers;\n\nnamespace UnityEditor.TestTools.TestRunner.Api\n{\n    internal class TestAdaptorFactory : ITestAdaptorFactory\n    {\n        public ITestAdaptor Create(ITest test)\n        {\n            return new TestAdaptor(test);\n        }\n\n        public ITestAdaptor Create(RemoteTestData testData)\n        {\n            return new TestAdaptor(testData);\n        }\n\n        public ITestResultAdaptor Create(ITestResult testResult)\n        {\n            return new TestResultAdaptor(testResult);\n        }\n\n        public ITestResultAdaptor Create(RemoteTestResultData testResult, RemoteTestResultDataWithTestData allData)\n        {\n            return new TestResultAdaptor(testResult, allData);\n        }\n\n        public ITestAdaptor BuildTree(RemoteTestResultDataWithTestData data)\n        {\n            var tests = data.tests.Select(remoteTestData => new TestAdaptor(remoteTestData)).ToList();\n\n            foreach (var test in tests)\n            {\n                test.ApplyChildren(tests);\n            }\n\n            return tests.First();\n        }\n\n        public IEnumerator<ITestAdaptor> BuildTreeAsync(RemoteTestResultDataWithTestData data)\n        {\n            var tests = data.tests.Select(remoteTestData => new TestAdaptor(remoteTestData)).ToList();\n\n            for (var index = 0; index < tests.Count; index++)\n            {\n                var test = tests[index];\n                test.ApplyChildren(tests);\n                if (index % 100 == 0)\n                {\n                    yield return null;\n                }\n            }\n\n            yield return tests.First();\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api/TestAdaptorFactory.cs.meta",
    "content": "fileFormatVersion: 2\nguid: d0663d520c26b7c48a4135599e66acf8\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api/TestLauncherFactory.cs",
    "content": "using System;\nusing UnityEngine.TestTools;\nusing UnityEngine.TestTools.TestRunner;\n\nnamespace UnityEditor.TestTools.TestRunner.Api\n{\n    internal class TestLauncherFactory\n    {\n        internal TestLauncherBase GetLauncher(ExecutionSettings executionSettings)\n        {\n            if (executionSettings.filter.testMode == TestMode.EditMode)\n            {\n                return GetEditModeLauncher(executionSettings.filter);\n            }\n            else\n            {\n                var settings = PlaymodeTestsControllerSettings.CreateRunnerSettings(executionSettings.filter.ToTestRunnerFilter());\n                return GetPlayModeLauncher(settings, executionSettings);\n            }\n        }\n\n        static TestLauncherBase GetEditModeLauncher(Filter filter)\n        {\n            return GetEditModeLauncherForProvidedAssemblies(filter);\n        }\n\n        static TestLauncherBase GetPlayModeLauncher(PlaymodeTestsControllerSettings settings, ExecutionSettings executionSettings)\n        {\n            if (executionSettings.targetPlatform != null)\n            {\n                return GetPlayerLauncher(settings, executionSettings.targetPlatform.Value, executionSettings.overloadTestRunSettings);\n            }\n\n            if (PlayerSettings.runPlayModeTestAsEditModeTest)\n            {\n                return GetEditModeLauncherForProvidedAssemblies(executionSettings.filter, TestPlatform.PlayMode);\n            }\n\n            return GetPlayModeLauncher(settings);\n        }\n\n        static TestLauncherBase GetEditModeLauncherForProvidedAssemblies(Filter filter, TestPlatform testPlatform = TestPlatform.EditMode)\n        {\n            return new EditModeLauncher(filter.ToTestRunnerFilter(), testPlatform);\n        }\n\n        static TestLauncherBase GetPlayModeLauncher(PlaymodeTestsControllerSettings settings)\n        {\n            return new PlaymodeLauncher(settings);\n        }\n\n        static TestLauncherBase GetPlayerLauncher(PlaymodeTestsControllerSettings settings, BuildTarget targetPlatform, ITestRunSettings overloadTestRunSettings)\n        {\n            return new PlayerLauncher(settings, targetPlatform, overloadTestRunSettings);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api/TestLauncherFactory.cs.meta",
    "content": "fileFormatVersion: 2\nguid: f33e570b8b9af1048b80a27e7848cb09\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api/TestMode.cs",
    "content": "using System;\n\nnamespace UnityEditor.TestTools.TestRunner.Api\n{\n    [Flags]\n    internal enum TestMode\n    {\n        EditMode = 1 << 0,\n        PlayMode = 1 << 1\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api/TestMode.cs.meta",
    "content": "fileFormatVersion: 2\nguid: cad095eccea17b741bc4cd264e7441cd\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api/TestResultAdaptor.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing NUnit.Framework.Interfaces;\nusing UnityEngine.TestRunner.TestLaunchers;\n\nnamespace UnityEditor.TestTools.TestRunner.Api\n{\n    internal class TestResultAdaptor : ITestResultAdaptor\n    {\n        private TNode m_Node;\n\n        internal TestResultAdaptor(ITestResult result)\n        {\n            Test = new TestAdaptor(result.Test);\n            Name = result.Name;\n            FullName = result.FullName;\n            ResultState = result.ResultState.ToString();\n            TestStatus = ParseTestStatus(result.ResultState.Status);\n            Duration = result.Duration;\n            StartTime = result.StartTime;\n            EndTime = result.EndTime;\n            Message = result.Message;\n            StackTrace = result.StackTrace;\n            AssertCount = result.AssertCount;\n            FailCount = result.FailCount;\n            PassCount = result.PassCount;\n            SkipCount = result.SkipCount;\n            InconclusiveCount = result.InconclusiveCount;\n            HasChildren = result.HasChildren;\n            Output = result.Output;\n            Children = result.Children.Select(child => new TestResultAdaptor(child)).ToArray();\n            m_Node = result.ToXml(true);\n        }\n\n        internal TestResultAdaptor(RemoteTestResultData result, RemoteTestResultDataWithTestData allData)\n        {\n            Test = new TestAdaptor(allData.tests.First(t => t.id == result.testId));\n            Name = result.name;\n            FullName = result.fullName;\n            ResultState = result.resultState;\n            TestStatus = ParseTestStatus(result.testStatus);\n            Duration = result.duration;\n            StartTime = result.startTime;\n            EndTime = result.endTime;\n            Message = result.message;\n            StackTrace = result.stackTrace;\n            AssertCount = result.assertCount;\n            FailCount = result.failCount;\n            PassCount = result.passCount;\n            SkipCount = result.skipCount;\n            InconclusiveCount = result.inconclusiveCount;\n            HasChildren = result.hasChildren;\n            Output = result.output;\n            Children = result.childrenIds.Select(childId => new TestResultAdaptor(allData.results.First(r => r.testId == childId), allData)).ToArray();\n            m_Node = TNode.FromXml(result.xml);\n        }\n\n        public ITestAdaptor Test { get; private set; }\n        public string Name { get; private set; }\n        public string FullName { get; private set; }\n        public string ResultState { get; private set; }\n        public TestStatus TestStatus { get; private set; }\n        public double Duration { get; private set; }\n        public DateTime StartTime { get; private set; }\n        public DateTime EndTime { get; private set; }\n        public string Message { get; private set; }\n        public string StackTrace { get; private set; }\n        public int AssertCount { get; private set; }\n        public int FailCount { get; private set; }\n        public int PassCount { get; private set; }\n        public int SkipCount { get; private set; }\n        public int InconclusiveCount { get; private set; }\n        public bool HasChildren { get; private set; }\n        public IEnumerable<ITestResultAdaptor> Children { get; private set; }\n        public string Output { get; private set; }\n        public TNode ToXml()\n        {\n            return m_Node;\n        }\n\n        private static TestStatus ParseTestStatus(NUnit.Framework.Interfaces.TestStatus testStatus)\n        {\n            return (TestStatus)Enum.Parse(typeof(TestStatus), testStatus.ToString());\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api/TestResultAdaptor.cs.meta",
    "content": "fileFormatVersion: 2\nguid: d061ada5d3169454daf54243390b5fdb\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api/TestRunData.cs",
    "content": "using System;\nusing UnityEngine;\n\nnamespace UnityEditor.TestTools.TestRunner.Api\n{\n    [Serializable]\n    internal class TestRunData : ScriptableSingleton<TestRunData>\n    {\n        [SerializeField]\n        public ExecutionSettings executionSettings;\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api/TestRunData.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 973b024861c5ae84f869aad614234b04\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api/TestRunnerApi.cs",
    "content": "using System;\nusing System.Linq;\nusing System.Threading;\nusing UnityEngine;\nusing UnityEngine.TestRunner.TestLaunchers;\nusing UnityEngine.TestTools;\nusing UnityEngine.TestTools.NUnitExtensions;\n\nnamespace UnityEditor.TestTools.TestRunner.Api\n{\n    internal class TestRunnerApi : ScriptableObject, ITestRunnerApi\n    {\n        public void Execute(ExecutionSettings executionSettings)\n        {\n            if (executionSettings == null)\n            {\n                throw new ArgumentException(\"Filter for execution is undefined.\");\n            }\n\n            var launcherFactory = new TestLauncherFactory();\n            var data = TestRunData.instance;\n            data.executionSettings = executionSettings;\n\n            var testLauncher = launcherFactory.GetLauncher(executionSettings);\n            testLauncher.Run();\n        }\n\n        public void RegisterCallbacks<T>(T testCallbacks, int priority = 0) where T : ICallbacks\n        {\n            if (testCallbacks == null)\n            {\n                throw new ArgumentException(\"TestCallbacks for execution is undefined.\");\n            }\n\n            CallbacksHolder.instance.Add(testCallbacks, priority);\n        }\n\n        public void UnregisterCallbacks<T>(T testCallbacks) where T : ICallbacks\n        {\n            if (testCallbacks == null)\n            {\n                throw new ArgumentException(\"TestCallbacks for execution is undefined.\");\n            }\n\n            CallbacksHolder.instance.Remove(testCallbacks);\n        }\n\n        public void RetrieveTestList(ExecutionSettings executionSettings, Action<ITestAdaptor> callback)\n        {\n            if (executionSettings == null)\n            {\n                throw new ArgumentException(\"Filter for execution is undefined.\");\n            }\n\n            if (callback == null)\n            {\n                throw new ArgumentException(\"Callback is undefined.\");\n            }\n\n            var platform = ParseTestMode(executionSettings.filter.testMode);\n            var testAssemblyProvider = new EditorLoadedTestAssemblyProvider(new EditorCompilationInterfaceProxy(), new EditorAssembliesProxy());\n            var testAdaptorFactory = new TestAdaptorFactory();\n            var testListCache = new TestListCache(testAdaptorFactory, new RemoteTestResultDataFactory(), TestListCacheData.instance);\n            var testListProvider = new TestListProvider(testAssemblyProvider, new UnityTestAssemblyBuilder());\n            var cachedTestListProvider = new CachingTestListProvider(testListProvider, testListCache, testAdaptorFactory);\n\n            var job = new TestListJob(cachedTestListProvider, platform, callback);\n            job.Start();\n        }\n\n        private static TestPlatform ParseTestMode(TestMode testmode)\n        {\n            if (testmode == TestMode.EditMode)\n            {\n                return TestPlatform.EditMode;\n            }\n\n            return TestPlatform.PlayMode;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api/TestRunnerApi.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 68993ba529ae04440916cb7c23bf3279\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api/TestStatus.cs",
    "content": "namespace UnityEditor.TestTools.TestRunner.Api\n{\n    internal enum TestStatus\n    {\n        Skipped,\n        Passed,\n        Failed,\n        Inconclusive\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api/TestStatus.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 9ec94545c5b00344c9bd8e691f15d799\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/Api.meta",
    "content": "fileFormatVersion: 2\nguid: fa423365b1ce06a4dbdc6fb4a8597bfa\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/AssemblyInfo.cs",
    "content": "using System.Reflection;\nusing System.Runtime.CompilerServices;\n\n[assembly: AssemblyTitle(\"UnityEditor.TestRunner\")]\n[assembly: InternalsVisibleTo(\"Assembly-CSharp-Editor-testable\")]\n[assembly: InternalsVisibleTo(\"DynamicProxyGenAssembly2\")]\n[assembly: InternalsVisibleTo(\"Unity.PerformanceTesting.Editor\")]\n[assembly: InternalsVisibleTo(\"Unity.IntegrationTests\")]\n[assembly: InternalsVisibleTo(\"UnityEditor.TestRunner.Tests\")]\n[assembly: InternalsVisibleTo(\"Unity.TestTools.CodeCoverage.Editor\")]\n[assembly: InternalsVisibleTo(\"Unity.PackageManagerUI.Develop.Editor\")]\n[assembly: InternalsVisibleTo(\"Unity.PackageManagerUI.Develop.EditorTests\")]\n\n[assembly: AssemblyVersion(\"1.0.0\")]\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/AssemblyInfo.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 9db19a04003fca7439552acd4de9baa1\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/CommandLineParser/CommandLineOption.cs",
    "content": "using System;\nusing System.Linq;\n\nnamespace UnityEditor.TestRunner.CommandLineParser\n{\n    internal class CommandLineOption : ICommandLineOption\n    {\n        Action<string> m_ArgAction;\n\n        public CommandLineOption(string argName, Action action)\n        {\n            ArgName = argName;\n            m_ArgAction = s => action();\n        }\n\n        public CommandLineOption(string argName, Action<string> action)\n        {\n            ArgName = argName;\n            m_ArgAction = action;\n        }\n\n        public CommandLineOption(string argName, Action<string[]> action)\n        {\n            ArgName = argName;\n            m_ArgAction = s => action(SplitStringToArray(s));\n        }\n\n        public string ArgName { get; private set; }\n\n        public void ApplyValue(string value)\n        {\n            m_ArgAction(value);\n        }\n\n        static string[] SplitStringToArray(string value)\n        {\n            if (string.IsNullOrEmpty(value))\n            {\n                return null;\n            }\n\n            return value.Split(';').ToArray();\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/CommandLineParser/CommandLineOption.cs.meta",
    "content": "fileFormatVersion: 2\nguid: a3529368f4cd0424a89aa51080a16b06\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/CommandLineParser/CommandLineOptionSet.cs",
    "content": "using System;\n\nnamespace UnityEditor.TestRunner.CommandLineParser\n{\n    internal class CommandLineOptionSet\n    {\n        ICommandLineOption[] m_Options;\n\n        public CommandLineOptionSet(params ICommandLineOption[] options)\n        {\n            m_Options = options;\n        }\n\n        public void Parse(string[] args)\n        {\n            var i = 0;\n            while (i < args.Length)\n            {\n                var arg = args[i];\n                if (!arg.StartsWith(\"-\"))\n                {\n                    i++;\n                    continue;\n                }\n\n                string value = null;\n                if (i + 1 < args.Length && !args[i + 1].StartsWith(\"-\"))\n                {\n                    value = args[i + 1];\n                    i++;\n                }\n\n                ApplyValueToMatchingOptions(arg, value);\n                i++;\n            }\n        }\n\n        private void ApplyValueToMatchingOptions(string argName, string value)\n        {\n            foreach (var option in m_Options)\n            {\n                if (\"-\" + option.ArgName == argName)\n                {\n                    option.ApplyValue(value);\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/CommandLineParser/CommandLineOptionSet.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 139c5eac101a4dc4fb3098e30c29f15e\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/CommandLineParser/ICommandLineOption.cs",
    "content": "namespace UnityEditor.TestRunner.CommandLineParser\n{\n    interface ICommandLineOption\n    {\n        string ArgName { get; }\n        void ApplyValue(string value);\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/CommandLineParser/ICommandLineOption.cs.meta",
    "content": "fileFormatVersion: 2\nguid: f445ca0c614a846449fcd8ae648c24e2\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/CommandLineParser.meta",
    "content": "fileFormatVersion: 2\nguid: 7602252bdb82b8d45ae3483c3a00d3e1\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/CommandLineTest/Executer.cs",
    "content": "using System;\nusing System.Linq;\nusing UnityEditor.TestRunner.TestLaunchers;\nusing UnityEditor.TestTools.TestRunner.Api;\nusing UnityEngine;\n\nnamespace UnityEditor.TestTools.TestRunner.CommandLineTest\n{\n    internal class Executer\n    {\n        private ITestRunnerApi m_TestRunnerApi;\n        private ISettingsBuilder m_SettingsBuilder;\n        private Action<string, object[]> m_LogErrorFormat;\n        private Action<Exception> m_LogException;\n        private Action<int> m_ExitEditorApplication;\n        private Func<bool> m_ScriptCompilationFailedCheck;\n\n        public Executer(ITestRunnerApi testRunnerApi, ISettingsBuilder settingsBuilder, Action<string, object[]> logErrorFormat, Action<Exception> logException, Action<int> exitEditorApplication, Func<bool> scriptCompilationFailedCheck)\n        {\n            m_TestRunnerApi = testRunnerApi;\n            m_SettingsBuilder = settingsBuilder;\n            m_LogErrorFormat = logErrorFormat;\n            m_LogException = logException;\n            m_ExitEditorApplication = exitEditorApplication;\n            m_ScriptCompilationFailedCheck = scriptCompilationFailedCheck;\n        }\n\n        internal void InitializeAndExecuteRun(string[] commandLineArgs)\n        {\n            Api.ExecutionSettings executionSettings;\n            try\n            {\n                executionSettings = m_SettingsBuilder.BuildApiExecutionSettings(commandLineArgs);\n                if (executionSettings.targetPlatform.HasValue)\n                    RemotePlayerLogController.instance.SetBuildTarget(executionSettings.targetPlatform.Value);\n            }\n            catch (SetupException exception)\n            {\n                HandleSetupException(exception);\n                return;\n            }\n\n            try\n            {\n                Debug.Log(\"Executing tests with settings: \" + ExecutionSettingsToString(executionSettings));\n                m_TestRunnerApi.Execute(executionSettings);\n            }\n            catch (Exception exception)\n            {\n                m_LogException(exception);\n                m_ExitEditorApplication((int)ReturnCodes.RunError);\n            }\n        }\n\n        internal ExecutionSettings BuildExecutionSettings(string[] commandLineArgs)\n        {\n            return m_SettingsBuilder.BuildExecutionSettings(commandLineArgs);\n        }\n\n        internal enum ReturnCodes\n        {\n            Ok = 0,\n            Failed = 2,\n            RunError = 3,\n            PlatformNotFoundReturnCode = 4\n        }\n\n        internal void SetUpCallbacks(ExecutionSettings executionSettings)\n        {\n            RemotePlayerLogController.instance.SetLogsDirectory(executionSettings.DeviceLogsDirectory);\n\n            var resultSavingCallback = ScriptableObject.CreateInstance<ResultsSavingCallbacks>();\n            resultSavingCallback.m_ResultFilePath = executionSettings.TestResultsFile;\n\n            var logSavingCallback = ScriptableObject.CreateInstance<LogSavingCallbacks>();\n\n            m_TestRunnerApi.RegisterCallbacks(resultSavingCallback);\n            m_TestRunnerApi.RegisterCallbacks(logSavingCallback);\n            m_TestRunnerApi.RegisterCallbacks(ScriptableObject.CreateInstance<ExitCallbacks>(), -10);\n            var timeoutCallbacks = ScriptableObject.CreateInstance<TimeoutCallbacks>();\n            timeoutCallbacks.Init((action, time) => new DelayedCallback(action, time), m_LogErrorFormat, m_ExitEditorApplication);\n            m_TestRunnerApi.RegisterCallbacks(timeoutCallbacks);\n        }\n\n        internal void ExitOnCompileErrors()\n        {\n            if (m_ScriptCompilationFailedCheck())\n            {\n                var handling = s_ExceptionHandlingMapping.First(h => h.m_ExceptionType == SetupException.ExceptionType.ScriptCompilationFailed);\n                m_LogErrorFormat(handling.m_Message, new object[0]);\n                m_ExitEditorApplication(handling.m_ReturnCode);\n            }\n        }\n\n        void HandleSetupException(SetupException exception)\n        {\n            ExceptionHandling handling = s_ExceptionHandlingMapping.FirstOrDefault(h => h.m_ExceptionType == exception.Type) ?? new ExceptionHandling(exception.Type, \"Unknown command line test run error. \" + exception.Type, ReturnCodes.RunError);\n            m_LogErrorFormat(handling.m_Message, exception.Details);\n            m_ExitEditorApplication(handling.m_ReturnCode);\n        }\n\n        private class ExceptionHandling\n        {\n            internal SetupException.ExceptionType m_ExceptionType;\n            internal string m_Message;\n            internal int m_ReturnCode;\n            public ExceptionHandling(SetupException.ExceptionType exceptionType, string message, ReturnCodes returnCode)\n            {\n                m_ExceptionType = exceptionType;\n                m_Message = message;\n                m_ReturnCode = (int)returnCode;\n            }\n        }\n\n        static ExceptionHandling[] s_ExceptionHandlingMapping = new[]\n        {\n            new ExceptionHandling(SetupException.ExceptionType.ScriptCompilationFailed, \"Scripts had compilation errors.\", ReturnCodes.RunError),\n            new ExceptionHandling(SetupException.ExceptionType.PlatformNotFound, \"Test platform not found ({0}).\", ReturnCodes.PlatformNotFoundReturnCode),\n            new ExceptionHandling(SetupException.ExceptionType.TestSettingsFileNotFound, \"Test settings file not found at {0}.\", ReturnCodes.RunError)\n        };\n\n        private static string ExecutionSettingsToString(Api.ExecutionSettings executionSettings)\n        {\n            if (executionSettings == null)\n            {\n                return \"none\";\n            }\n\n            if (executionSettings.filter == null)\n            {\n                return \"no filter\";\n            }\n\n            return \"test mode = \" + executionSettings.filter.testMode;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/CommandLineTest/Executer.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 083c6a3a5426382449369ddc12b691d8\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/CommandLineTest/ExecutionSettings.cs",
    "content": "using System;\n\nnamespace UnityEditor.TestTools.TestRunner.CommandLineTest\n{\n    [Serializable]\n    internal class ExecutionSettings\n    {\n        public string TestResultsFile;\n        public string DeviceLogsDirectory;\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/CommandLineTest/ExecutionSettings.cs.meta",
    "content": "fileFormatVersion: 2\nguid: c3a75354f6ceac94ca15ca9d96593290\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/CommandLineTest/ExitCallbacks.cs",
    "content": "using System;\nusing UnityEditor.TestTools.TestRunner.Api;\nusing UnityEngine;\n\nnamespace UnityEditor.TestTools.TestRunner.CommandLineTest\n{\n    [Serializable]\n    internal class ExitCallbacks : ScriptableObject, ICallbacks\n    {\n        private bool m_AnyTestsExecuted;\n        private bool m_RunFailed;\n        internal static bool preventExit;\n\n        public void RunFinished(ITestResultAdaptor testResults)\n        {\n            if (preventExit)\n            {\n                return;\n            }\n\n            if (!m_AnyTestsExecuted)\n            {\n                Debug.LogFormat(LogType.Warning, LogOption.NoStacktrace, null, \"No tests were executed\");\n            }\n            EditorApplication.Exit(m_RunFailed ? (int)Executer.ReturnCodes.Failed : (int)Executer.ReturnCodes.Ok);\n        }\n\n        public void TestStarted(ITestAdaptor test)\n        {\n            if (!test.IsSuite)\n            {\n                m_AnyTestsExecuted = true;\n            }\n        }\n\n        public void TestFinished(ITestResultAdaptor result)\n        {\n            if (!result.Test.IsSuite && (result.TestStatus == TestStatus.Failed))\n            {\n                m_RunFailed = true;\n            }\n        }\n\n        public void RunStarted(ITestAdaptor testsToRun)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/CommandLineTest/ExitCallbacks.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 1adaa8dcc4fda3d4cb4d3c8e0cb65d12\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/CommandLineTest/ISettingsBuilder.cs",
    "content": "using UnityEditor.TestTools.TestRunner.Api;\n\nnamespace UnityEditor.TestTools.TestRunner.CommandLineTest\n{\n    interface ISettingsBuilder\n    {\n        Api.ExecutionSettings BuildApiExecutionSettings(string[] commandLineArgs);\n        ExecutionSettings BuildExecutionSettings(string[] commandLineArgs);\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/CommandLineTest/ISettingsBuilder.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 8a13cbeb2099aca47bb456f49845f86c\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/CommandLineTest/LogSavingCallbacks.cs",
    "content": "using System;\nusing UnityEditor.TestRunner.TestLaunchers;\nusing UnityEditor.TestTools.TestRunner.Api;\nusing UnityEngine;\n\nnamespace UnityEditor.TestTools.TestRunner.CommandLineTest\n{\n    [Serializable]\n    internal class LogSavingCallbacks : ScriptableObject, ICallbacks\n    {\n        public void RunStarted(ITestAdaptor testsToRun)\n        {\n            RemotePlayerLogController.instance.StartLogWriters();\n        }\n\n        public virtual void RunFinished(ITestResultAdaptor testResults)\n        {\n            RemotePlayerLogController.instance.StopLogWriters();\n        }\n\n        public void TestStarted(ITestAdaptor test)\n        {\n        }\n\n        public void TestFinished(ITestResultAdaptor result)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/CommandLineTest/LogSavingCallbacks.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 8d20eedbe40f0ce41a4c4f633f225de8\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/CommandLineTest/LogWriter.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing UnityEditor.DeploymentTargets;\nusing UnityEditor.Utils;\nusing UnityEngine;\n\nnamespace UnityEditor.TestTools.TestRunner.CommandLineTest\n{\n    internal class LogWriter : IDisposable\n    {\n        private string m_LogsDirectory;\n        private string m_DeviceID;\n        private Dictionary<string, StreamWriter> m_LogStreams;\n        private DeploymentTargetLogger m_Logger;\n\n        internal LogWriter(string logsDirectory, string deviceID, DeploymentTargetLogger logger)\n        {\n            m_LogStreams = new Dictionary<string, StreamWriter>();\n            m_Logger = logger;\n            m_LogsDirectory = logsDirectory;\n            m_DeviceID = deviceID;\n\n            logger.logMessage += WriteLogToFile;\n        }\n\n        private void WriteLogToFile(string id, string logLine)\n        {\n            StreamWriter logStream;\n            var streamExists = m_LogStreams.TryGetValue(id, out logStream);\n            if (!streamExists)\n            {\n                var filePath = GetLogFilePath(m_LogsDirectory, m_DeviceID, id);\n                logStream = CreateLogFile(filePath);\n\n                m_LogStreams.Add(id, logStream);\n            }\n\n            try\n            {\n                if (logLine != null)\n                    logStream.WriteLine(logLine);\n            }\n            catch (Exception ex)\n            {\n                Debug.LogError($\"Writing {id} log failed.\");\n                Debug.LogException(ex);\n            }\n        }\n\n        public void Stop()\n        {\n            m_Logger.Stop();\n            foreach (var logStream in m_LogStreams)\n            {\n                logStream.Value.Close();\n            }\n        }\n\n        public void Dispose()\n        {\n            Stop();\n        }\n\n        private StreamWriter CreateLogFile(string path)\n        {\n            Debug.LogFormat(LogType.Log, LogOption.NoStacktrace, null, \"Creating {0} device log: {1}\", m_DeviceID, path);\n            StreamWriter streamWriter = null;\n            try\n            {\n                if (!Directory.Exists(path))\n                    Directory.CreateDirectory(Path.GetDirectoryName(path));\n\n                streamWriter = File.CreateText(path);\n            }\n            catch (Exception ex)\n            {\n                Debug.LogError($\"Creating device log {path} file failed.\");\n                Debug.LogException(ex);\n            }\n\n            return streamWriter;\n        }\n\n        private string GetLogFilePath(string lgosDirectory, string deviceID, string logID)\n        {\n            var fileName = \"Device-\" + deviceID + \"-\" + logID + \".txt\";\n            fileName = string.Join(\"_\", fileName.Split(Path.GetInvalidFileNameChars()));\n            return Paths.Combine(lgosDirectory, fileName);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/CommandLineTest/LogWriter.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 05778dd1de4433d418793b6f3d3c18cf\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/CommandLineTest/ResultsSavingCallbacks.cs",
    "content": "using System;\nusing System.IO;\nusing UnityEditor.TestTools.TestRunner.Api;\nusing UnityEditor.Utils;\nusing UnityEngine;\n\nnamespace UnityEditor.TestTools.TestRunner.CommandLineTest\n{\n    [Serializable]\n    internal class ResultsSavingCallbacks : ScriptableObject, ICallbacks\n    {\n        [SerializeField]\n        public string m_ResultFilePath;\n\n        public ResultsSavingCallbacks()\n        {\n            this.m_ResultFilePath = GetDefaultResultFilePath();\n        }\n\n        public void RunStarted(ITestAdaptor testsToRun)\n        {\n        }\n\n        public virtual void RunFinished(ITestResultAdaptor testResults)\n        {\n            if (string.IsNullOrEmpty(m_ResultFilePath))\n            {\n                m_ResultFilePath = GetDefaultResultFilePath();\n            }\n\n            var resultWriter = new ResultsWriter();\n            resultWriter.WriteResultToFile(testResults, m_ResultFilePath);\n        }\n\n        public void TestStarted(ITestAdaptor test)\n        {\n        }\n\n        public void TestFinished(ITestResultAdaptor result)\n        {\n        }\n\n        private static string GetDefaultResultFilePath()\n        {\n            var fileName = \"TestResults-\" + DateTime.Now.Ticks + \".xml\";\n            var projectPath = Directory.GetCurrentDirectory();\n            return Paths.Combine(projectPath, fileName);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/CommandLineTest/ResultsSavingCallbacks.cs.meta",
    "content": "fileFormatVersion: 2\nguid: ef563c5a6ecf64d4193dc144cb7d472a\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/CommandLineTest/ResultsWriter.cs",
    "content": "using System;\nusing System.IO;\nusing System.Xml;\nusing NUnit.Framework.Interfaces;\nusing UnityEditor.TestTools.TestRunner.Api;\nusing UnityEngine;\n\nnamespace UnityEditor.TestTools.TestRunner.CommandLineTest\n{\n    internal class ResultsWriter\n    {\n        private const string k_nUnitVersion = \"3.5.0.0\";\n\n        private const string k_TestRunNode = \"test-run\";\n        private const string k_Id = \"id\";\n        private const string k_Testcasecount = \"testcasecount\";\n        private const string k_Result = \"result\";\n        private const string k_Total = \"total\";\n        private const string k_Passed = \"passed\";\n        private const string k_Failed = \"failed\";\n        private const string k_Inconclusive = \"inconclusive\";\n        private const string k_Skipped = \"skipped\";\n        private const string k_Asserts = \"asserts\";\n        private const string k_EngineVersion = \"engine-version\";\n        private const string k_ClrVersion = \"clr-version\";\n        private const string k_StartTime = \"start-time\";\n        private const string k_EndTime = \"end-time\";\n        private const string k_Duration = \"duration\";\n\n        private const string k_TimeFormat = \"u\";\n\n        public void WriteResultToFile(ITestResultAdaptor result, string filePath)\n        {\n            Debug.LogFormat(LogType.Log, LogOption.NoStacktrace, null, \"Saving results to: {0}\", filePath);\n\n            try\n            {\n                if (!Directory.Exists(filePath))\n                {\n                    CreateDirectory(filePath);\n                }\n\n                using (var fileStream = File.CreateText(filePath))\n                {\n                    WriteResultToStream(result, fileStream);\n                }\n            }\n            catch (Exception ex)\n            {\n                Debug.LogError(\"Saving result file failed.\");\n                Debug.LogException(ex);\n            }\n        }\n\n        void CreateDirectory(string filePath)\n        {\n            Directory.CreateDirectory(Path.GetDirectoryName(filePath));\n        }\n\n        public void WriteResultToStream(ITestResultAdaptor result, StreamWriter streamWriter, XmlWriterSettings settings = null)\n        {\n            settings = settings ?? new XmlWriterSettings();\n            settings.Indent = true;\n            settings.NewLineOnAttributes = false;\n\n            using (var xmlWriter = XmlWriter.Create(streamWriter, settings))\n            {\n                WriteResultsToXml(result, xmlWriter);\n            }\n        }\n\n        void WriteResultsToXml(ITestResultAdaptor result, XmlWriter xmlWriter)\n        {\n            // XML format as specified at https://github.com/nunit/docs/wiki/Test-Result-XML-Format\n\n            var testRunNode = new TNode(k_TestRunNode);\n\n            testRunNode.AddAttribute(k_Id, \"2\");\n            testRunNode.AddAttribute(k_Testcasecount, (result.PassCount + result.FailCount + result.SkipCount + result.InconclusiveCount).ToString());\n            testRunNode.AddAttribute(k_Result, result.ResultState.ToString());\n            testRunNode.AddAttribute(k_Total, (result.PassCount + result.FailCount + result.SkipCount + result.InconclusiveCount).ToString());\n            testRunNode.AddAttribute(k_Passed, result.PassCount.ToString());\n            testRunNode.AddAttribute(k_Failed, result.FailCount.ToString());\n            testRunNode.AddAttribute(k_Inconclusive, result.InconclusiveCount.ToString());\n            testRunNode.AddAttribute(k_Skipped, result.SkipCount.ToString());\n            testRunNode.AddAttribute(k_Asserts, result.AssertCount.ToString());\n            testRunNode.AddAttribute(k_EngineVersion, k_nUnitVersion);\n            testRunNode.AddAttribute(k_ClrVersion, Environment.Version.ToString());\n            testRunNode.AddAttribute(k_StartTime, result.StartTime.ToString(k_TimeFormat));\n            testRunNode.AddAttribute(k_EndTime, result.EndTime.ToString(k_TimeFormat));\n            testRunNode.AddAttribute(k_Duration, result.Duration.ToString());\n\n            var resultNode = result.ToXml();\n            testRunNode.ChildNodes.Add(resultNode);\n\n            testRunNode.WriteTo(xmlWriter);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/CommandLineTest/ResultsWriter.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 29d603e0a726a9043b3503112271844a\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/CommandLineTest/RunData.cs",
    "content": "namespace UnityEditor.TestTools.TestRunner.CommandLineTest\n{\n    internal class RunData : ScriptableSingleton<RunData>\n    {\n        public bool isRunning;\n        public ExecutionSettings executionSettings;\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/CommandLineTest/RunData.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 3f8c1075884df0249b80e23a0598f9c1\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/CommandLineTest/RunSettings.cs",
    "content": "using UnityEditor.TestTools.TestRunner.Api;\n\nnamespace UnityEditor.TestTools.TestRunner.CommandLineTest\n{\n    internal class RunSettings : ITestRunSettings\n    {\n        private ITestSettings m_TestSettings;\n        public RunSettings(ITestSettings testSettings)\n        {\n            this.m_TestSettings = testSettings;\n        }\n\n        public void Apply()\n        {\n            if (m_TestSettings != null)\n            {\n                m_TestSettings.SetupProjectParameters();\n            }\n        }\n\n        public void Dispose()\n        {\n            if (m_TestSettings != null)\n            {\n                m_TestSettings.Dispose();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/CommandLineTest/RunSettings.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 59d3f5586b341a74c84c8f72144a4568\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/CommandLineTest/SettingsBuilder.cs",
    "content": "using System;\nusing System.IO;\nusing UnityEditor.TestRunner.CommandLineParser;\nusing UnityEditor.TestTools.TestRunner.Api;\nusing UnityEngine.TestTools.TestRunner.GUI;\n\nnamespace UnityEditor.TestTools.TestRunner.CommandLineTest\n{\n    internal class SettingsBuilder : ISettingsBuilder\n    {\n        private ITestSettingsDeserializer m_TestSettingsDeserializer;\n        private Action<string> m_LogAction;\n        private Action<string> m_LogWarningAction;\n        private Func<string, bool> m_FileExistsCheck;\n        private Func<bool> m_ScriptCompilationFailedCheck;\n        public SettingsBuilder(ITestSettingsDeserializer testSettingsDeserializer, Action<string> logAction, Action<string> logWarningAction, Func<string, bool> fileExistsCheck, Func<bool> scriptCompilationFailedCheck)\n        {\n            m_LogAction = logAction;\n            m_LogWarningAction = logWarningAction;\n            m_FileExistsCheck = fileExistsCheck;\n            m_ScriptCompilationFailedCheck = scriptCompilationFailedCheck;\n            m_TestSettingsDeserializer = testSettingsDeserializer;\n        }\n\n        public Api.ExecutionSettings BuildApiExecutionSettings(string[] commandLineArgs)\n        {\n            var quit = false;\n            string testPlatform = TestMode.EditMode.ToString();\n            string[] testFilters = null;\n            string[] testCategories = null;\n            string testSettingsFilePath = null;\n            int testRepetitions = 1;\n\n            var optionSet = new CommandLineOptionSet(\n                new CommandLineOption(\"quit\", () => { quit = true; }),\n                new CommandLineOption(\"testPlatform\", platform => { testPlatform = platform; }),\n                new CommandLineOption(\"editorTestsFilter\", filters => { testFilters = filters; }),\n                new CommandLineOption(\"testFilter\", filters => { testFilters = filters; }),\n                new CommandLineOption(\"editorTestsCategories\", catagories => { testCategories = catagories; }),\n                new CommandLineOption(\"testCategory\", catagories => { testCategories = catagories; }),\n                new CommandLineOption(\"testSettingsFile\", settingsFilePath => { testSettingsFilePath = settingsFilePath; }),\n                new CommandLineOption(\"testRepetitions\", reps => { testRepetitions = int.Parse(reps); })\n            );\n            optionSet.Parse(commandLineArgs);\n\n            DisplayQuitWarningIfQuitIsGiven(quit);\n\n            CheckForScriptCompilationErrors();\n\n            LogParametersForRun(testPlatform, testFilters, testCategories, testSettingsFilePath);\n\n            var testSettings = GetTestSettings(testSettingsFilePath);\n\n            var filter = new Filter()\n            {\n                groupNames = testFilters,\n                categoryNames = testCategories\n            };\n\n            var buildTarget = SetFilterAndGetBuildTarget(testPlatform, filter);\n\n            RerunCallbackData.instance.runFilter = new TestRunnerFilter()\n            {\n                categoryNames = filter.categoryNames,\n                groupNames = filter.groupNames,\n                testRepetitions = testRepetitions\n            };\n\n            RerunCallbackData.instance.testMode = filter.testMode;\n\n            return new Api.ExecutionSettings()\n            {\n                filter = filter,\n                overloadTestRunSettings = new RunSettings(testSettings),\n                targetPlatform = buildTarget\n            };\n        }\n\n        public ExecutionSettings BuildExecutionSettings(string[] commandLineArgs)\n        {\n            string resultFilePath = null;\n            string deviceLogsDirectory = null;\n\n            var optionSet = new CommandLineOptionSet(\n                new CommandLineOption(\"editorTestsResultFile\", filePath => { resultFilePath = filePath; }),\n                new CommandLineOption(\"testResults\", filePath => { resultFilePath = filePath; }),\n                new CommandLineOption(\"deviceLogs\", dirPath => { deviceLogsDirectory = dirPath; })\n            );\n            optionSet.Parse(commandLineArgs);\n\n            return new ExecutionSettings()\n            {\n                TestResultsFile = resultFilePath,\n                DeviceLogsDirectory = deviceLogsDirectory\n            };\n        }\n\n        void DisplayQuitWarningIfQuitIsGiven(bool quitIsGiven)\n        {\n            if (quitIsGiven)\n            {\n                m_LogWarningAction(\"Running tests from command line arguments will not work when \\\"quit\\\" is specified.\");\n            }\n        }\n\n        void CheckForScriptCompilationErrors()\n        {\n            if (m_ScriptCompilationFailedCheck())\n            {\n                throw new SetupException(SetupException.ExceptionType.ScriptCompilationFailed);\n            }\n        }\n\n        void LogParametersForRun(string testPlatform, string[] testFilters, string[] testCategories, string testSettingsFilePath)\n        {\n            m_LogAction(\"Running tests for \" + testPlatform);\n            if (testFilters != null && testFilters.Length > 0)\n            {\n                m_LogAction(\"With test filter: \" + string.Join(\", \", testFilters));\n            }\n            if (testCategories != null && testCategories.Length > 0)\n            {\n                m_LogAction(\"With test categories: \" + string.Join(\", \", testCategories));\n            }\n            if (!string.IsNullOrEmpty(testSettingsFilePath))\n            {\n                m_LogAction(\"With test settings file: \" + testSettingsFilePath);\n            }\n        }\n\n        ITestSettings GetTestSettings(string testSettingsFilePath)\n        {\n            ITestSettings testSettings = null;\n            if (!string.IsNullOrEmpty(testSettingsFilePath))\n            {\n                if (!m_FileExistsCheck(testSettingsFilePath))\n                {\n                    throw new SetupException(SetupException.ExceptionType.TestSettingsFileNotFound, testSettingsFilePath);\n                }\n\n                testSettings = m_TestSettingsDeserializer.GetSettingsFromJsonFile(testSettingsFilePath);\n            }\n            return testSettings;\n        }\n\n        static BuildTarget? SetFilterAndGetBuildTarget(string testPlatform, Filter filter)\n        {\n            BuildTarget? buildTarget = null;\n            if (testPlatform.ToLower() == \"editmode\")\n            {\n                filter.testMode = TestMode.EditMode;\n            }\n            else if (testPlatform.ToLower() == \"playmode\")\n            {\n                filter.testMode = TestMode.PlayMode;\n            }\n            else\n            {\n                try\n                {\n                    buildTarget = (BuildTarget)Enum.Parse(typeof(BuildTarget), testPlatform, true);\n\n                    filter.testMode = TestMode.PlayMode;\n                }\n                catch (ArgumentException)\n                {\n                    throw new SetupException(SetupException.ExceptionType.PlatformNotFound, testPlatform);\n                }\n            }\n            return buildTarget;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/CommandLineTest/SettingsBuilder.cs.meta",
    "content": "fileFormatVersion: 2\nguid: b7468a027a77337478e133b40b42b4f9\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/CommandLineTest/SetupException.cs",
    "content": "using System;\n\nnamespace UnityEditor.TestTools.TestRunner.CommandLineTest\n{\n    internal class SetupException : Exception\n    {\n        public ExceptionType Type { get; }\n        public object[] Details { get; }\n\n        public SetupException(ExceptionType type, params object[] details)\n        {\n            Type = type;\n            Details = details;\n        }\n\n        public enum ExceptionType\n        {\n            ScriptCompilationFailed,\n            PlatformNotFound,\n            TestSettingsFileNotFound,\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/CommandLineTest/SetupException.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 63572993f2104574099a48392460b211\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/CommandLineTest/TestStarter.cs",
    "content": "using System;\nusing System.IO;\nusing UnityEditor.TestRunner.CommandLineParser;\nusing UnityEditor.TestTools.TestRunner.Api;\nusing UnityEngine;\n\nnamespace UnityEditor.TestTools.TestRunner.CommandLineTest\n{\n    [InitializeOnLoad]\n    static class TestStarter\n    {\n        static TestStarter()\n        {\n            if (!ShouldRunTests())\n            {\n                return;\n            }\n\n            if (EditorApplication.isCompiling)\n            {\n                return;\n            }\n\n            executer.ExitOnCompileErrors();\n\n            if (RunData.instance.isRunning)\n            {\n                executer.SetUpCallbacks(RunData.instance.executionSettings);\n                return;\n            }\n\n            EditorApplication.update += UpdateWatch;\n        }\n\n        static void UpdateWatch()\n        {\n            EditorApplication.update -= UpdateWatch;\n\n            if (RunData.instance.isRunning)\n            {\n                return;\n            }\n\n            RunData.instance.isRunning = true;\n            var commandLineArgs = Environment.GetCommandLineArgs();\n            RunData.instance.executionSettings = executer.BuildExecutionSettings(commandLineArgs);\n            executer.SetUpCallbacks(RunData.instance.executionSettings);\n            executer.InitializeAndExecuteRun(commandLineArgs);\n        }\n\n        static bool ShouldRunTests()\n        {\n            var shouldRunTests = false;\n            var optionSet = new CommandLineOptionSet(\n                new CommandLineOption(\"runTests\", () => { shouldRunTests = true; }),\n                new CommandLineOption(\"runEditorTests\", () => { shouldRunTests = true; })\n            );\n            optionSet.Parse(Environment.GetCommandLineArgs());\n            return shouldRunTests;\n        }\n\n        static Executer s_Executer;\n\n        static Executer executer\n        {\n            get\n            {\n                if (s_Executer == null)\n                {\n                    Func<bool> compilationCheck = () => EditorUtility.scriptCompilationFailed;\n                    Action<string> actionLogger = (string msg) => { Debug.LogFormat(LogType.Log, LogOption.NoStacktrace, null, msg); };\n                    var apiSettingsBuilder = new SettingsBuilder(new TestSettingsDeserializer(() => new TestSettings()), actionLogger, Debug.LogWarning, File.Exists, compilationCheck);\n                    s_Executer = new Executer(ScriptableObject.CreateInstance<TestRunnerApi>(), apiSettingsBuilder, Debug.LogErrorFormat, Debug.LogException, EditorApplication.Exit, compilationCheck);\n                }\n\n                return s_Executer;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/CommandLineTest/TestStarter.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 4d616d1a494edd144b262cf6cd5e5fda\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/CommandLineTest/TimeoutCallbacks.cs",
    "content": "using System;\nusing UnityEditor.TestRunner.TestLaunchers;\nusing UnityEditor.TestTools.TestRunner.Api;\nusing UnityEngine;\n\nnamespace UnityEditor.TestTools.TestRunner.CommandLineTest\n{\n    internal class TimeoutCallbacks : ScriptableObject, ICallbacks\n    {\n        internal const int k_DefaultTimeout = 600;\n\n        private Func<Action, double, IDelayedCallback> m_DelayedCallbackFactory;\n        private Action<string, object[]> m_LogErrorFormat;\n        private Action<int> m_ExitApplication;\n\n        private double m_CurrentTimeout;\n        private IDelayedCallback m_TimeoutCallback;\n\n        public void Init(Func<Action, double, IDelayedCallback> delayedCallbackFactory, Action<string, object[]> logErrorFormat, Action<int> exitApplication)\n        {\n            m_DelayedCallbackFactory = delayedCallbackFactory;\n            m_LogErrorFormat = logErrorFormat;\n            m_ExitApplication = exitApplication;\n        }\n\n        public void RunFinished(ITestResultAdaptor result)\n        {\n            if (m_TimeoutCallback != null)\n            {\n                m_TimeoutCallback.Clear();\n            }\n        }\n\n        public void RunStarted(ITestAdaptor testsToRun)\n        {\n            ResetToTimeout(k_DefaultTimeout);\n        }\n\n        public void TestFinished(ITestResultAdaptor result)\n        {\n            ResetToTimeout(k_DefaultTimeout);\n        }\n\n        public void TestStarted(ITestAdaptor test)\n        {\n            ResetToTimeout(k_DefaultTimeout + test.TestCaseTimeout / 1000);\n        }\n\n        private void ResetToTimeout(double timeoutValue)\n        {\n            if (m_TimeoutCallback != null && Math.Abs(m_CurrentTimeout - timeoutValue) < 0.1f)\n            {\n                m_TimeoutCallback.Reset();\n            }\n            else\n            {\n                if (m_TimeoutCallback != null)\n                {\n                    m_TimeoutCallback.Clear();\n                }\n\n                m_TimeoutCallback = m_DelayedCallbackFactory(TimeoutReached, timeoutValue);\n                m_CurrentTimeout = timeoutValue;\n            }\n        }\n\n        private void TimeoutReached()\n        {\n            RemotePlayerLogController.instance.StopLogWriters();\n            m_LogErrorFormat(\"Test execution timed out.\", new object[0]);\n            m_ExitApplication((int)Executer.ReturnCodes.RunError);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/CommandLineTest/TimeoutCallbacks.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 4dc5887d05b52fd4fb5f52909d09ffe9\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/CommandLineTest.meta",
    "content": "fileFormatVersion: 2\nguid: b477d1f29b65a674e9d5cdab4eb72b01\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/GUI/AssetsDatabaseHelper.cs",
    "content": "namespace UnityEditor.TestTools.TestRunner.GUI\n{\n    internal class AssetsDatabaseHelper : IAssetsDatabaseHelper\n    {\n        public void OpenAssetInItsDefaultExternalEditor(string assetPath, int line)\n        {\n            var asset = AssetDatabase.LoadMainAssetAtPath(assetPath);\n            AssetDatabase.OpenAsset(asset, line);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/GUI/AssetsDatabaseHelper.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 740b3785866edda4b8d1e1a05570a5f8\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/GUI/GuiHelper.cs",
    "content": "using System;\nusing System.IO;\nusing System.Linq;\nusing System.Reflection;\nusing System.Text.RegularExpressions;\nusing UnityEditor.Utils;\nusing UnityEngine;\n\nnamespace UnityEditor.TestTools.TestRunner.GUI\n{\n    internal class GuiHelper : IGuiHelper\n    {\n        public GuiHelper(IMonoCecilHelper monoCecilHelper, IAssetsDatabaseHelper assetsDatabaseHelper)\n        {\n            MonoCecilHelper = monoCecilHelper;\n            AssetsDatabaseHelper = assetsDatabaseHelper;\n        }\n\n        protected IMonoCecilHelper MonoCecilHelper { get; private set; }\n        public IAssetsDatabaseHelper AssetsDatabaseHelper { get; private set; }\n\n        public void OpenScriptInExternalEditor(Type type, MethodInfo method)\n        {\n            var fileOpenInfo = GetFileOpenInfo(type, method);\n\n            if (string.IsNullOrEmpty(fileOpenInfo.FilePath))\n            {\n                Debug.LogWarning(\"Failed to open test method source code in external editor. Inconsistent filename and yield return operator in target method.\");\n\n                return;\n            }\n\n            if (fileOpenInfo.LineNumber == 1)\n            {\n                Debug.LogWarning(\"Failed to get a line number for unity test method. So please find it in opened file in external editor.\");\n            }\n\n            AssetsDatabaseHelper.OpenAssetInItsDefaultExternalEditor(fileOpenInfo.FilePath, fileOpenInfo.LineNumber);\n        }\n\n        public IFileOpenInfo GetFileOpenInfo(Type type, MethodInfo method)\n        {\n            const string fileExtension = \".cs\";\n\n            var fileOpenInfo = MonoCecilHelper.TryGetCecilFileOpenInfo(type, method);\n            if (string.IsNullOrEmpty(fileOpenInfo.FilePath))\n            {\n                var dirPath = Paths.UnifyDirectorySeparator(Application.dataPath);\n                var allCsFiles = Directory.GetFiles(dirPath, string.Format(\"*{0}\", fileExtension), SearchOption.AllDirectories)\n                    .Select(Paths.UnifyDirectorySeparator);\n\n                var fileName = allCsFiles.FirstOrDefault(x =>\n                    x.Split(Path.DirectorySeparatorChar).Last().Equals(string.Concat(type.Name, fileExtension)));\n\n                fileOpenInfo.FilePath = fileName ?? string.Empty;\n            }\n\n            fileOpenInfo.FilePath = FilePathToAssetsRelativeAndUnified(fileOpenInfo.FilePath);\n\n            return fileOpenInfo;\n        }\n\n        public string FilePathToAssetsRelativeAndUnified(string filePath)\n        {\n            if (string.IsNullOrEmpty(filePath))\n                return string.Empty;\n\n            filePath = Paths.UnifyDirectorySeparator(filePath);\n            var length = Paths.UnifyDirectorySeparator(Application.dataPath).Length - \"Assets\".Length;\n\n            return filePath.Substring(length);\n        }\n\n        public bool OpenScriptInExternalEditor(string stacktrace)\n        {\n            if (string.IsNullOrEmpty(stacktrace))\n                return false;\n\n            var regex = new Regex(\"in (?<path>.*):{1}(?<line>[0-9]+)\");\n\n            var matchingLines = stacktrace.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).Where(x => regex.IsMatch(x)).ToList();\n            if (!matchingLines.Any())\n                return false;\n\n            var fileOpenInfo = matchingLines\n                .Select(x => regex.Match(x))\n                .Select(x =>\n                    new FileOpenInfo\n                    {\n                        FilePath = x.Groups[\"path\"].Value,\n                        LineNumber = int.Parse(x.Groups[\"line\"].Value)\n                    })\n                .First(openInfo => !string.IsNullOrEmpty(openInfo.FilePath) && File.Exists(openInfo.FilePath));\n\n            var filePath = FilePathToAssetsRelativeAndUnified(fileOpenInfo.FilePath);\n            AssetsDatabaseHelper.OpenAssetInItsDefaultExternalEditor(filePath, fileOpenInfo.LineNumber);\n\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/GUI/GuiHelper.cs.meta",
    "content": "fileFormatVersion: 2\nguid: d0138170d24533e47b8e6c250c6d7fbc\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/GUI/IAssetsDatabaseHelper.cs",
    "content": "namespace UnityEditor.TestTools.TestRunner.GUI\n{\n    internal interface IAssetsDatabaseHelper\n    {\n        void OpenAssetInItsDefaultExternalEditor(string assetPath, int line);\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/GUI/IAssetsDatabaseHelper.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 208e46d59ff6e304db0318377d20f5a1\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/GUI/IGuiHelper.cs",
    "content": "using System;\nusing System.Reflection;\n\nnamespace UnityEditor.TestTools.TestRunner.GUI\n{\n    internal interface IGuiHelper\n    {\n        bool OpenScriptInExternalEditor(string stacktrace);\n        void OpenScriptInExternalEditor(Type type, MethodInfo method);\n        IFileOpenInfo GetFileOpenInfo(Type type, MethodInfo method);\n        string FilePathToAssetsRelativeAndUnified(string filePath);\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/GUI/IGuiHelper.cs.meta",
    "content": "fileFormatVersion: 2\nguid: fd57cf917f61bbb42b8f030436426ddd\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/GUI/TestListBuilder/RenderingOptions.cs",
    "content": "namespace UnityEditor.TestTools.TestRunner.GUI\n{\n    internal class RenderingOptions\n    {\n        public string nameFilter;\n        public bool showSucceeded;\n        public bool showFailed;\n        public bool showIgnored;\n        public bool showNotRunned;\n        public string[] categories;\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/GUI/TestListBuilder/RenderingOptions.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 87357ff0dec4ef348a295235835c6ee4\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/GUI/TestListBuilder/ResultSummarizer.cs",
    "content": "// ****************************************************************\n// Based on nUnit 2.6.2 (http://www.nunit.org/)\n// ****************************************************************\n\nusing System;\nusing System.Collections.Generic;\nusing UnityEngine.TestTools.TestRunner.GUI;\n\nnamespace UnityEditor.TestTools.TestRunner.GUI\n{\n    /// <summary>\n    /// Summary description for ResultSummarizer.\n    /// </summary>\n    internal class ResultSummarizer\n    {\n        private int m_ErrorCount = -1;\n        private int m_FailureCount;\n        private int m_IgnoreCount = -1;\n        private int m_InconclusiveCount = -1;\n        private int m_NotRunnable = -1;\n        private int m_ResultCount;\n        private int m_SkipCount;\n        private int m_SuccessCount;\n        private int m_TestsRun;\n\n        private TimeSpan m_Duration = TimeSpan.FromSeconds(0);\n\n        public ResultSummarizer(IEnumerable<TestRunnerResult> results)\n        {\n            foreach (var result in results)\n                Summarize(result);\n        }\n\n        public bool success\n        {\n            get { return m_FailureCount == 0; }\n        }\n\n        /// <summary>\n        /// Returns the number of test cases for which results\n        /// have been summarized. Any tests excluded by use of\n        /// Category or Explicit attributes are not counted.\n        /// </summary>\n        public int ResultCount\n        {\n            get { return m_ResultCount; }\n        }\n\n        /// <summary>\n        /// Returns the number of test cases actually run, which\n        /// is the same as ResultCount, less any Skipped, Ignored\n        /// or NonRunnable tests.\n        /// </summary>\n        public int TestsRun\n        {\n            get { return m_TestsRun; }\n        }\n\n        /// <summary>\n        /// Returns the number of tests that passed\n        /// </summary>\n        public int Passed\n        {\n            get { return m_SuccessCount; }\n        }\n\n        /// <summary>\n        /// Returns the number of test cases that had an error.\n        /// </summary>\n        public int errors\n        {\n            get { return m_ErrorCount; }\n        }\n\n        /// <summary>\n        /// Returns the number of test cases that failed.\n        /// </summary>\n        public int failures\n        {\n            get { return m_FailureCount; }\n        }\n\n        /// <summary>\n        /// Returns the number of test cases that failed.\n        /// </summary>\n        public int inconclusive\n        {\n            get { return m_InconclusiveCount; }\n        }\n\n        /// <summary>\n        /// Returns the number of test cases that were not runnable\n        /// due to errors in the signature of the class or method.\n        /// Such tests are also counted as Errors.\n        /// </summary>\n        public int notRunnable\n        {\n            get { return m_NotRunnable; }\n        }\n\n        /// <summary>\n        /// Returns the number of test cases that were skipped.\n        /// </summary>\n        public int Skipped\n        {\n            get { return m_SkipCount; }\n        }\n\n        public int ignored\n        {\n            get { return m_IgnoreCount; }\n        }\n\n        public double duration\n        {\n            get { return m_Duration.TotalSeconds; }\n        }\n\n        public int testsNotRun\n        {\n            get { return m_SkipCount + m_IgnoreCount + m_NotRunnable; }\n        }\n\n        public void Summarize(TestRunnerResult result)\n        {\n            m_Duration += TimeSpan.FromSeconds(result.duration);\n            m_ResultCount++;\n\n            if (result.resultStatus != TestRunnerResult.ResultStatus.NotRun)\n            {\n                //TODO implement missing features\n                //                if(result.IsIgnored)\n                //                {\n                //                    m_IgnoreCount++;\n                //                    return;\n                //                }\n\n                m_SkipCount++;\n                return;\n            }\n\n            switch (result.resultStatus)\n            {\n                case TestRunnerResult.ResultStatus.Passed:\n                    m_SuccessCount++;\n                    m_TestsRun++;\n                    break;\n                case TestRunnerResult.ResultStatus.Failed:\n                    m_FailureCount++;\n                    m_TestsRun++;\n                    break;\n                //TODO implement missing features\n                //                case TestResultState.Error:\n                //                case TestResultState.Cancelled:\n                //                    m_ErrorCount++;\n                //                    m_TestsRun++;\n                //                    break;\n                //                case TestResultState.Inconclusive:\n                //                    m_InconclusiveCount++;\n                //                    m_TestsRun++;\n                //                    break;\n                //                case TestResultState.NotRunnable:\n                //                    m_NotRunnable++;\n                //                    // errorCount++;\n                //                    break;\n                //                case TestResultState.Ignored:\n                //                    m_IgnoreCount++;\n                //                    break;\n                default:\n                    m_SkipCount++;\n                    break;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/GUI/TestListBuilder/ResultSummarizer.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 95a2914724952ef40bb590d0607fc878\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/GUI/TestListBuilder/TestFilterSettings.cs",
    "content": "using System.Collections.Generic;\nusing System.Linq;\nusing UnityEngine;\nusing UnityEngine.TestTools.TestRunner.GUI;\n\nnamespace UnityEditor.TestTools.TestRunner.GUI\n{\n    internal class TestFilterSettings\n    {\n        public bool showSucceeded;\n        public bool showFailed;\n        public bool showIgnored;\n        public bool showNotRun;\n\n        public string filterByName;\n        public int filterByCategory;\n\n        private GUIContent m_SucceededBtn;\n        private GUIContent m_FailedBtn;\n        private GUIContent m_IgnoredBtn;\n        private GUIContent m_NotRunBtn;\n\n        public string[] availableCategories;\n\n        private readonly string m_PrefsKey;\n\n        public TestFilterSettings(string prefsKey)\n        {\n            availableCategories = null;\n            m_PrefsKey = prefsKey;\n            Load();\n            UpdateCounters(Enumerable.Empty<TestRunnerResult>());\n        }\n\n        public void Load()\n        {\n            showSucceeded = EditorPrefs.GetBool(m_PrefsKey + \".ShowSucceeded\", true);\n            showFailed = EditorPrefs.GetBool(m_PrefsKey + \".ShowFailed\", true);\n            showIgnored = EditorPrefs.GetBool(m_PrefsKey + \".ShowIgnored\", true);\n            showNotRun = EditorPrefs.GetBool(m_PrefsKey + \".ShowNotRun\", true);\n            filterByName = EditorPrefs.GetString(m_PrefsKey + \".FilterByName\", string.Empty);\n            filterByCategory = EditorPrefs.GetInt(m_PrefsKey + \".FilterByCategory\", 0);\n        }\n\n        public void Save()\n        {\n            EditorPrefs.SetBool(m_PrefsKey + \".ShowSucceeded\", showSucceeded);\n            EditorPrefs.SetBool(m_PrefsKey + \".ShowFailed\", showFailed);\n            EditorPrefs.SetBool(m_PrefsKey + \".ShowIgnored\", showIgnored);\n            EditorPrefs.SetBool(m_PrefsKey + \".ShowNotRun\", showNotRun);\n            EditorPrefs.SetString(m_PrefsKey + \".FilterByName\", filterByName);\n            EditorPrefs.SetInt(m_PrefsKey + \".FilterByCategory\", filterByCategory);\n        }\n\n        public void UpdateCounters(IEnumerable<TestRunnerResult> results)\n        {\n            var summary = new ResultSummarizer(results);\n\n            m_SucceededBtn = new GUIContent(summary.Passed.ToString(), Icons.s_SuccessImg, \"Show tests that succeeded\");\n            m_FailedBtn = new GUIContent((summary.errors + summary.failures + summary.inconclusive).ToString(), Icons.s_FailImg, \"Show tests that failed\");\n            m_IgnoredBtn = new GUIContent((summary.ignored + summary.notRunnable).ToString(), Icons.s_IgnoreImg, \"Show tests that are ignored\");\n            m_NotRunBtn = new GUIContent((summary.testsNotRun - summary.ignored - summary.notRunnable).ToString(), Icons.s_UnknownImg, \"Show tests that didn't run\");\n        }\n\n        public string[] GetSelectedCategories()\n        {\n            if (availableCategories == null)\n                return new string[0];\n\n            return availableCategories.Where((c, i) => (filterByCategory & (1 << i)) != 0).ToArray();\n        }\n\n        public void OnGUI()\n        {\n            EditorGUI.BeginChangeCheck();\n\n            filterByName = GUILayout.TextField(filterByName, \"ToolbarSeachTextField\", GUILayout.MinWidth(100), GUILayout.MaxWidth(250), GUILayout.ExpandWidth(true));\n            if (GUILayout.Button(GUIContent.none, string.IsNullOrEmpty(filterByName) ? \"ToolbarSeachCancelButtonEmpty\" : \"ToolbarSeachCancelButton\"))\n                filterByName = string.Empty;\n\n            if (availableCategories != null && availableCategories.Length > 0)\n                filterByCategory = EditorGUILayout.MaskField(filterByCategory, availableCategories, EditorStyles.toolbarDropDown, GUILayout.MaxWidth(90));\n\n            showSucceeded = GUILayout.Toggle(showSucceeded, m_SucceededBtn, EditorStyles.toolbarButton);\n            showFailed = GUILayout.Toggle(showFailed, m_FailedBtn, EditorStyles.toolbarButton);\n            showIgnored = GUILayout.Toggle(showIgnored, m_IgnoredBtn, EditorStyles.toolbarButton);\n            showNotRun = GUILayout.Toggle(showNotRun, m_NotRunBtn, EditorStyles.toolbarButton);\n\n            if (EditorGUI.EndChangeCheck())\n                Save();\n        }\n\n        public RenderingOptions BuildRenderingOptions()\n        {\n            var options = new RenderingOptions();\n            options.showSucceeded = showSucceeded;\n            options.showFailed = showFailed;\n            options.showIgnored = showIgnored;\n            options.showNotRunned = showNotRun;\n            options.nameFilter = filterByName;\n            options.categories = GetSelectedCategories();\n            return options;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/GUI/TestListBuilder/TestFilterSettings.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 046c3854296c5ec48bac50da6ca248ec\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/GUI/TestListBuilder/TestTreeViewBuilder.cs",
    "content": "using System.Collections.Generic;\nusing System.Linq;\nusing UnityEditor.IMGUI.Controls;\nusing UnityEditor.TestTools.TestRunner.Api;\nusing UnityEngine.TestRunner.NUnitExtensions;\nusing UnityEngine.TestTools.TestRunner.GUI;\nusing UnityEngine.TestRunner.NUnitExtensions.Filters;\n\nnamespace UnityEditor.TestTools.TestRunner.GUI\n{\n    internal class TestTreeViewBuilder\n    {\n        public List<TestRunnerResult> results = new List<TestRunnerResult>();\n        private readonly List<TestRunnerResult> m_OldTestResultList;\n        private readonly TestRunnerUIFilter m_UIFilter;\n        private readonly ITestAdaptor m_TestListRoot;\n\n        private readonly List<string> m_AvailableCategories = new List<string>();\n\n        public string[] AvailableCategories\n        {\n            get { return m_AvailableCategories.Distinct().OrderBy(a => a).ToArray(); }\n        }\n\n        public TestTreeViewBuilder(ITestAdaptor tests, List<TestRunnerResult> oldTestResultResults, TestRunnerUIFilter uiFilter)\n        {\n            m_AvailableCategories.Add(CategoryFilterExtended.k_DefaultCategory);\n            m_OldTestResultList = oldTestResultResults;\n            m_TestListRoot = tests;\n            m_UIFilter = uiFilter;\n        }\n\n        public TreeViewItem BuildTreeView(TestFilterSettings settings, bool sceneBased, string sceneName)\n        {\n            var rootItem = new TreeViewItem(int.MaxValue, 0, null, \"Invisible Root Item\");\n            ParseTestTree(0, rootItem, m_TestListRoot);\n            return rootItem;\n        }\n\n        private bool IsFilteredOutByUIFilter(ITestAdaptor test, TestRunnerResult result)\n        {\n            if (m_UIFilter.PassedHidden && result.resultStatus == TestRunnerResult.ResultStatus.Passed)\n                return true;\n            if (m_UIFilter.FailedHidden && (result.resultStatus == TestRunnerResult.ResultStatus.Failed || result.resultStatus == TestRunnerResult.ResultStatus.Inconclusive))\n                return true;\n            if (m_UIFilter.NotRunHidden && (result.resultStatus == TestRunnerResult.ResultStatus.NotRun || result.resultStatus == TestRunnerResult.ResultStatus.Skipped))\n                return true;\n            if (m_UIFilter.CategoryFilter.Length > 0)\n                return !test.Categories.Any(category => m_UIFilter.CategoryFilter.Contains(category));\n            return false;\n        }\n\n        private void ParseTestTree(int depth, TreeViewItem rootItem, ITestAdaptor testElement)\n        {\n            m_AvailableCategories.AddRange(testElement.Categories);\n\n            var testElementId = testElement.UniqueName;\n            if (!testElement.HasChildren)\n            {\n                var result = m_OldTestResultList.FirstOrDefault(a => a.uniqueId == testElementId);\n\n                if (result != null &&\n                    (result.ignoredOrSkipped\n                     || result.notRunnable\n                     || testElement.RunState == RunState.NotRunnable\n                     || testElement.RunState == RunState.Ignored\n                     || testElement.RunState == RunState.Skipped\n                    )\n                )\n                {\n                    //if the test was or becomes ignored or not runnable, we recreate the result in case it has changed\n                    result = null;\n                }\n                if (result == null)\n                {\n                    result = new TestRunnerResult(testElement);\n                }\n                results.Add(result);\n\n                var test = new TestTreeViewItem(testElement, depth, rootItem);\n                if (!IsFilteredOutByUIFilter(testElement, result))\n                    rootItem.AddChild(test);\n                test.SetResult(result);\n                return;\n            }\n\n            var groupResult = m_OldTestResultList.FirstOrDefault(a => a.uniqueId == testElementId);\n            if (groupResult == null)\n            {\n                groupResult = new TestRunnerResult(testElement);\n            }\n\n            results.Add(groupResult);\n            var group = new TestTreeViewItem(testElement, depth, rootItem);\n            group.SetResult(groupResult);\n\n            depth++;\n            foreach (var child in testElement.Children)\n            {\n                ParseTestTree(depth, group, child);\n            }\n\n\n            if (testElement.IsTestAssembly && !testElement.HasChildren)\n                return;\n\n            if (group.hasChildren)\n                rootItem.AddChild(group);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/GUI/TestListBuilder/TestTreeViewBuilder.cs.meta",
    "content": "fileFormatVersion: 2\nguid: e17c88b021c2a4c409b3f15b0d80ac62\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/GUI/TestListBuilder.meta",
    "content": "fileFormatVersion: 2\nguid: 07ea0326ed848fb4489187cb58f96113\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/GUI/TestListGuiHelper.cs",
    "content": "using System;\nusing System.IO;\nusing System.Linq;\nusing UnityEditor.ProjectWindowCallback;\nusing UnityEditor.Scripting.ScriptCompilation;\nusing UnityEngine;\n\nnamespace UnityEditor.TestTools.TestRunner.GUI\n{\n    internal class TestListGUIHelper\n    {\n        private const string kResourcesTemplatePath = \"Resources/ScriptTemplates\";\n        private const string kAssemblyDefinitionTestTemplate = \"92-Assembly Definition-NewTestAssembly.asmdef.txt\";\n\n        private const string kAssemblyDefinitionEditModeTestTemplate =\n            \"92-Assembly Definition-NewEditModeTestAssembly.asmdef.txt\";\n\n        private const string kTestScriptTemplate = \"83-C# Script-NewTestScript.cs.txt\";\n        private const string kNewTestScriptName = \"NewTestScript.cs\";\n        private const string kNunit = \"nunit.framework.dll\";\n\n        [MenuItem(\"Assets/Create/Testing/Tests Assembly Folder\", false, 83)]\n        public static void MenuItemAddFolderAndAsmDefForTesting()\n        {\n            AddFolderAndAsmDefForTesting();\n        }\n\n        [MenuItem(\"Assets/Create/Testing/Tests Assembly Folder\", true, 83)]\n        public static bool MenuItemAddFolderAndAsmDefForTestingWithValidation()\n        {\n            return !SelectedFolderContainsTestAssembly();\n        }\n\n        public static void AddFolderAndAsmDefForTesting(bool isEditorOnly = false)\n        {\n            ProjectWindowUtil.CreateFolderWithTemplates(\"Tests\",\n                isEditorOnly ? kAssemblyDefinitionEditModeTestTemplate : kAssemblyDefinitionTestTemplate);\n        }\n\n        public static bool SelectedFolderContainsTestAssembly()\n        {\n            var theNearestCustomScriptAssembly = GetTheNearestCustomScriptAssembly();\n            if (theNearestCustomScriptAssembly != null)\n            {\n                return theNearestCustomScriptAssembly.PrecompiledReferences != null && theNearestCustomScriptAssembly.PrecompiledReferences.Any(x => Path.GetFileName(x) == kNunit);\n            }\n\n            return false;\n        }\n\n        [MenuItem(\"Assets/Create/Testing/C# Test Script\", false, 83)]\n        public static void AddTest()\n        {\n            var basePath = Path.Combine(EditorApplication.applicationContentsPath, kResourcesTemplatePath);\n            var destPath = Path.Combine(GetActiveFolderPath(), kNewTestScriptName);\n            var templatePath = Path.Combine(basePath, kTestScriptTemplate);\n            var icon = EditorGUIUtility.IconContent(\"cs Script Icon\").image as Texture2D;\n            ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0,\n                ScriptableObject.CreateInstance<DoCreateScriptAsset>(), destPath, icon, templatePath);\n\n            AssetDatabase.Refresh();\n        }\n\n        [MenuItem(\"Assets/Create/Testing/C# Test Script\", true, 83)]\n        public static bool CanAddScriptAndItWillCompile()\n        {\n            return CanAddEditModeTestScriptAndItWillCompile() || CanAddPlayModeTestScriptAndItWillCompile();\n        }\n\n        public static bool CanAddEditModeTestScriptAndItWillCompile()\n        {\n            var theNearestCustomScriptAssembly = GetTheNearestCustomScriptAssembly();\n            if (theNearestCustomScriptAssembly != null)\n            {\n                return (theNearestCustomScriptAssembly.AssemblyFlags & AssemblyFlags.EditorOnly) ==\n                    AssemblyFlags.EditorOnly;\n            }\n\n            var activeFolderPath = GetActiveFolderPath();\n            return activeFolderPath.ToLower().Contains(\"/editor\");\n        }\n\n        public static bool CanAddPlayModeTestScriptAndItWillCompile()\n        {\n            if (PlayerSettings.playModeTestRunnerEnabled)\n            {\n                return true;\n            }\n\n            var theNearestCustomScriptAssembly = GetTheNearestCustomScriptAssembly();\n\n            if (theNearestCustomScriptAssembly == null)\n            {\n                return false;\n            }\n\n            var hasTestAssemblyFlag = theNearestCustomScriptAssembly.PrecompiledReferences != null && theNearestCustomScriptAssembly.PrecompiledReferences.Any(x => Path.GetFileName(x) == kNunit);;\n            var editorOnlyAssembly = (theNearestCustomScriptAssembly.AssemblyFlags & AssemblyFlags.EditorOnly) != 0;\n\n            return hasTestAssemblyFlag && !editorOnlyAssembly;\n        }\n\n        public static string GetActiveFolderPath()\n        {\n            var path = \"Assets\";\n\n            foreach (var obj in Selection.GetFiltered(typeof(UnityEngine.Object), SelectionMode.Assets))\n            {\n                path = AssetDatabase.GetAssetPath(obj);\n                if (!string.IsNullOrEmpty(path) && File.Exists(path))\n                {\n                    path = Path.GetDirectoryName(path);\n                    break;\n                }\n            }\n            return path;\n        }\n\n        private static CustomScriptAssembly GetTheNearestCustomScriptAssembly()\n        {\n            CustomScriptAssembly findCustomScriptAssemblyFromScriptPath;\n            try\n            {\n                findCustomScriptAssemblyFromScriptPath =\n                    EditorCompilationInterface.Instance.FindCustomScriptAssemblyFromScriptPath(\n                        Path.Combine(GetActiveFolderPath(), \"Foo.cs\"));\n            }\n            catch (Exception)\n            {\n                return null;\n            }\n            return findCustomScriptAssemblyFromScriptPath;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/GUI/TestListGuiHelper.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 97a05971510726f438153cd4987526fb\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/GUI/TestListTreeView/Icons.cs",
    "content": "using UnityEngine;\n\nnamespace UnityEditor.TestTools.TestRunner.GUI\n{\n    internal static class Icons\n    {\n        public static readonly Texture2D s_FailImg;\n        public static readonly Texture2D s_IgnoreImg;\n        public static readonly Texture2D s_SuccessImg;\n        public static readonly Texture2D s_UnknownImg;\n        public static readonly Texture2D s_InconclusiveImg;\n        public static readonly Texture2D s_StopwatchImg;\n\n        static Icons()\n        {\n            s_FailImg = EditorGUIUtility.IconContent(\"TestFailed\").image as Texture2D;\n            s_IgnoreImg = EditorGUIUtility.IconContent(\"TestIgnored\").image as Texture2D;\n            s_SuccessImg = EditorGUIUtility.IconContent(\"TestPassed\").image as Texture2D;\n            s_UnknownImg = EditorGUIUtility.IconContent(\"TestNormal\").image as Texture2D;\n            s_InconclusiveImg = EditorGUIUtility.IconContent(\"TestInconclusive\").image as Texture2D;\n            s_StopwatchImg = EditorGUIUtility.IconContent(\"TestStopwatch\").image as Texture2D;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/GUI/TestListTreeView/Icons.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 27769e9b00b038d47aefe306a4d20bec\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/GUI/TestListTreeView/TestListTreeViewDataSource.cs",
    "content": "using System.Collections.Generic;\nusing UnityEditor.IMGUI.Controls;\nusing UnityEditor.TestTools.TestRunner.Api;\nusing UnityEngine.SceneManagement;\nusing UnityEngine.TestTools.TestRunner;\nusing UnityEngine.TestTools.TestRunner.GUI;\n\nnamespace UnityEditor.TestTools.TestRunner.GUI\n{\n    internal class TestListTreeViewDataSource : TreeViewDataSource\n    {\n        private bool m_ExpandTreeOnCreation;\n        private readonly TestListGUI m_TestListGUI;\n        private ITestAdaptor m_RootTest;\n\n        public TestListTreeViewDataSource(TreeViewController testListTree, TestListGUI testListGUI, ITestAdaptor rootTest) : base(testListTree)\n        {\n            showRootItem = false;\n            rootIsCollapsable = false;\n            m_TestListGUI = testListGUI;\n            m_RootTest = rootTest;\n        }\n\n        public override void FetchData()\n        {\n            var sceneName = SceneManager.GetActiveScene().name;\n            if (sceneName.StartsWith(\"InitTestScene\"))\n                sceneName = PlaymodeTestsController.GetController().settings.originalScene;\n\n            var testListBuilder = new TestTreeViewBuilder(m_RootTest, m_TestListGUI.newResultList, m_TestListGUI.m_TestRunnerUIFilter);\n\n            m_RootItem = testListBuilder.BuildTreeView(null, false, sceneName);\n            SetExpanded(m_RootItem, true);\n            if (m_RootItem.hasChildren && m_RootItem.children.Count == 1)\n                SetExpanded(m_RootItem.children[0], true);\n\n            if (m_ExpandTreeOnCreation)\n                SetExpandedWithChildren(m_RootItem, true);\n\n            m_TestListGUI.newResultList = new List<TestRunnerResult>(testListBuilder.results);\n            m_TestListGUI.m_TestRunnerUIFilter.availableCategories = testListBuilder.AvailableCategories;\n            m_NeedRefreshRows = true;\n        }\n\n        public override bool IsRenamingItemAllowed(TreeViewItem item)\n        {\n            return false;\n        }\n\n        public void ExpandTreeOnCreation()\n        {\n            m_ExpandTreeOnCreation = true;\n        }\n\n        public override bool IsExpandable(TreeViewItem item)\n        {\n            if (item is TestTreeViewItem)\n                return ((TestTreeViewItem)item).IsGroupNode;\n            return base.IsExpandable(item);\n        }\n\n        protected override List<TreeViewItem> Search(TreeViewItem rootItem, string search)\n        {\n            var result = new List<TreeViewItem>();\n\n            if (rootItem.hasChildren)\n            {\n                foreach (var child in rootItem.children)\n                {\n                    SearchTestTree(child, search, result);\n                }\n            }\n            return result;\n        }\n\n        protected void SearchTestTree(TreeViewItem item, string search, IList<TreeViewItem> searchResult)\n        {\n            var testItem = item as TestTreeViewItem;\n            if (!testItem.IsGroupNode)\n            {\n                if (testItem.FullName.ToLower().Contains(search))\n                {\n                    searchResult.Add(item);\n                }\n            }\n            else if (item.children != null)\n            {\n                foreach (var child in item.children)\n                    SearchTestTree(child, search, searchResult);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/GUI/TestListTreeView/TestListTreeViewDataSource.cs.meta",
    "content": "fileFormatVersion: 2\nguid: ce87c287371edde43a4b5fcfdee7b9ef\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/GUI/TestListTreeView/TestListTreeViewGUI.cs",
    "content": "using UnityEditor.IMGUI.Controls;\n\nnamespace UnityEditor.TestTools.TestRunner.GUI\n{\n    internal class TestListTreeViewGUI : TreeViewGUI\n    {\n        public TestListTreeViewGUI(TreeViewController testListTree) : base(testListTree)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/GUI/TestListTreeView/TestListTreeViewGUI.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 52c907c81459f324497af504b84fd557\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/GUI/TestListTreeView/TestTreeViewItem.cs",
    "content": "using System;\nusing System.Reflection;\nusing System.Text;\nusing UnityEditor.IMGUI.Controls;\nusing UnityEditor.TestTools.TestRunner.Api;\nusing UnityEngine.TestTools.TestRunner.GUI;\n\nnamespace UnityEditor.TestTools.TestRunner.GUI\n{\n    internal sealed class TestTreeViewItem : TreeViewItem\n    {\n        public TestRunnerResult result;\n        internal ITestAdaptor m_Test;\n\n        public Type type;\n        public MethodInfo method;\n\n        private const int k_ResultTestMaxLength = 15000;\n\n        public bool IsGroupNode { get { return m_Test.IsSuite; } }\n\n        public string FullName { get { return m_Test.FullName; } }\n\n        public TestTreeViewItem(ITestAdaptor test, int depth, TreeViewItem parent)\n            : base(GetId(test), depth, parent, test.Name)\n        {\n            m_Test = test;\n\n            if (test.TypeInfo != null)\n            {\n                type = test.TypeInfo.Type;\n            }\n            if (test.Method != null)\n            {\n                method = test.Method.MethodInfo;\n            }\n\n            displayName = test.Name.Replace(\"\\n\", \"\");\n            icon = Icons.s_UnknownImg;\n        }\n\n        private static int GetId(ITestAdaptor test)\n        {\n            return test.UniqueName.GetHashCode();\n        }\n\n        public void SetResult(TestRunnerResult testResult)\n        {\n            result = testResult;\n            result.SetResultChangedCallback(ResultUpdated);\n            ResultUpdated(result);\n        }\n\n        public string GetResultText()\n        {\n            var durationString = String.Format(\"{0:0.000}\", result.duration);\n            var sb = new StringBuilder(string.Format(\"{0} ({1}s)\", displayName.Trim(), durationString));\n            if (!string.IsNullOrEmpty(result.description))\n            {\n                sb.AppendFormat(\"\\n{0}\", result.description);\n            }\n            if (!string.IsNullOrEmpty(result.messages))\n            {\n                sb.Append(\"\\n---\\n\");\n                sb.Append(result.messages.Trim());\n            }\n            if (!string.IsNullOrEmpty(result.stacktrace))\n            {\n                sb.Append(\"\\n---\\n\");\n                sb.Append(result.stacktrace.Trim());\n            }\n            if (!string.IsNullOrEmpty(result.output))\n            {\n                sb.Append(\"\\n---\\n\");\n                sb.Append(result.output.Trim());\n            }\n            if (sb.Length > k_ResultTestMaxLength)\n            {\n                sb.Length = k_ResultTestMaxLength;\n                sb.AppendFormat(\"...\\n\\n---MESSAGE TRUNCATED AT {0} CHARACTERS---\", k_ResultTestMaxLength);\n            }\n            return sb.ToString().Trim();\n        }\n\n        private void ResultUpdated(TestRunnerResult testResult)\n        {\n            switch (testResult.resultStatus)\n            {\n                case TestRunnerResult.ResultStatus.Passed:\n                    icon = Icons.s_SuccessImg;\n                    break;\n                case TestRunnerResult.ResultStatus.Failed:\n                    icon = Icons.s_FailImg;\n                    break;\n                case TestRunnerResult.ResultStatus.Inconclusive:\n                    icon = Icons.s_InconclusiveImg;\n                    break;\n                case TestRunnerResult.ResultStatus.Skipped:\n                    icon = Icons.s_IgnoreImg;\n                    break;\n                default:\n                    if (testResult.ignoredOrSkipped)\n                    {\n                        icon = Icons.s_IgnoreImg;\n                    }\n                    else if (testResult.notRunnable)\n                    {\n                        icon = Icons.s_FailImg;\n                    }\n                    else\n                    {\n                        icon = Icons.s_UnknownImg;\n                    }\n                    break;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/GUI/TestListTreeView/TestTreeViewItem.cs.meta",
    "content": "fileFormatVersion: 2\nguid: ce567ddbf30368344bc7b80e20cac36e\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/GUI/TestListTreeView.meta",
    "content": "fileFormatVersion: 2\nguid: 68cb547af0187634aad591a09c01cd5b\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/GUI/TestRunnerResult.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing UnityEditor.TestTools.TestRunner.Api;\nusing UnityEngine.TestTools.TestRunner.GUI;\n\nnamespace UnityEditor.TestTools.TestRunner.GUI\n{\n    [Serializable]\n    internal class TestRunnerResult : TestRunnerFilter.IClearableResult\n    {\n        public string id;\n        public string uniqueId;\n        public string name;\n        public string fullName;\n        public ResultStatus resultStatus = ResultStatus.NotRun;\n        public float duration;\n        public string messages;\n        public string output;\n        public string stacktrace;\n        public bool notRunnable;\n        public bool ignoredOrSkipped;\n        public string description;\n        public bool isSuite;\n        public List<string> categories;\n        public string parentId;\n        public string parentUniqueId;\n\n        //This field is suppose to mark results from before domain reload\n        //Such result is outdated because the code might haev changed\n        //This field will get reset every time a domain reload happens\n        [NonSerialized]\n        public bool notOutdated;\n\n        protected Action<TestRunnerResult> m_OnResultUpdate;\n\n        internal TestRunnerResult(ITestAdaptor test)\n        {\n            id = test.Id;\n            uniqueId = test.UniqueName;\n\n            fullName = test.FullName;\n            name = test.Name;\n            description = test.Description;\n            isSuite = test.IsSuite;\n\n            ignoredOrSkipped = test.RunState == RunState.Ignored || test.RunState == RunState.Skipped;\n            notRunnable = test.RunState == RunState.NotRunnable;\n\n            if (ignoredOrSkipped)\n            {\n                messages = test.SkipReason;\n            }\n            if (notRunnable)\n            {\n                resultStatus = ResultStatus.Failed;\n                messages = test.SkipReason;\n            }\n            categories = test.Categories.ToList();\n            parentId = test.ParentId;\n            parentUniqueId = test.ParentUniqueName;\n        }\n\n        internal TestRunnerResult(ITestResultAdaptor testResult) : this(testResult.Test)\n        {\n            notOutdated = true;\n\n            messages = testResult.Message;\n            output = testResult.Output;\n            stacktrace = testResult.StackTrace;\n            duration = (float)testResult.Duration;\n            if (testResult.Test.IsSuite && testResult.ResultState == \"Ignored\")\n            {\n                resultStatus = ResultStatus.Passed;\n            }\n            else\n            {\n                resultStatus = ParseNUnitResultStatus(testResult.TestStatus);\n            }\n        }\n\n        public void Update(TestRunnerResult result)\n        {\n            if (ReferenceEquals(result, null))\n                return;\n            resultStatus = result.resultStatus;\n            duration = result.duration;\n            messages = result.messages;\n            output = result.output;\n            stacktrace = result.stacktrace;\n            ignoredOrSkipped = result.ignoredOrSkipped;\n            notRunnable = result.notRunnable;\n            description = result.description;\n            notOutdated = result.notOutdated;\n            if (m_OnResultUpdate != null)\n                m_OnResultUpdate(this);\n        }\n\n        public void SetResultChangedCallback(Action<TestRunnerResult> resultUpdated)\n        {\n            m_OnResultUpdate = resultUpdated;\n        }\n\n        [Serializable]\n        internal enum ResultStatus\n        {\n            NotRun,\n            Passed,\n            Failed,\n            Inconclusive,\n            Skipped\n        }\n\n        private static ResultStatus ParseNUnitResultStatus(TestStatus status)\n        {\n            switch (status)\n            {\n                case TestStatus.Passed:\n                    return ResultStatus.Passed;\n                case TestStatus.Failed:\n                    return ResultStatus.Failed;\n                case TestStatus.Inconclusive:\n                    return ResultStatus.Inconclusive;\n                case TestStatus.Skipped:\n                    return ResultStatus.Skipped;\n                default:\n                    return ResultStatus.NotRun;\n            }\n        }\n\n        public override string ToString()\n        {\n            return string.Format(\"{0} ({1})\", name, fullName);\n        }\n\n        public string Id { get { return uniqueId; } }\n        public string FullName { get { return fullName; } }\n        public string ParentId { get { return parentUniqueId; } }\n        public bool IsSuite { get { return isSuite; } }\n        public List<string> Categories { get { return categories; } }\n\n        public void Clear()\n        {\n            resultStatus = ResultStatus.NotRun;\n            if (m_OnResultUpdate != null)\n                m_OnResultUpdate(this);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/GUI/TestRunnerResult.cs.meta",
    "content": "fileFormatVersion: 2\nguid: a04a45bbed9e1714f9902fc9443669b9\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/GUI/TestRunnerUIFilter.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing UnityEngine;\nusing UnityEngine.TestTools.TestRunner.GUI;\n\nnamespace UnityEditor.TestTools.TestRunner.GUI\n{\n    [Serializable]\n    internal class TestRunnerUIFilter\n    {\n        private int m_PassedCount;\n        private int m_FailedCount;\n        private int m_NotRunCount;\n        private int m_InconclusiveCount;\n        private int m_SkippedCount;\n\n        public int PassedCount { get { return m_PassedCount; } }\n        public int FailedCount { get { return m_FailedCount + m_InconclusiveCount; } }\n        public int NotRunCount { get { return m_NotRunCount + m_SkippedCount; } }\n\n        [SerializeField]\n        public bool PassedHidden;\n        [SerializeField]\n        public bool FailedHidden;\n        [SerializeField]\n        public bool NotRunHidden;\n\n        [SerializeField]\n        private string m_SearchString;\n        [SerializeField]\n        private int selectedCategoryMask;\n\n        public string[] availableCategories = new string[0];\n\n\n        private GUIContent m_SucceededBtn;\n        private GUIContent m_FailedBtn;\n        private GUIContent m_NotRunBtn;\n\n        public Action RebuildTestList;\n        public Action<string> SearchStringChanged;\n        public bool IsFiltering\n        {\n            get\n            {\n                return !string.IsNullOrEmpty(m_SearchString) || PassedHidden || FailedHidden || NotRunHidden ||\n                    selectedCategoryMask != 0;\n            }\n        }\n\n        public string[] CategoryFilter\n        {\n            get\n            {\n                var list = new List<string>();\n                for (int i = 0; i < availableCategories.Length; i++)\n                {\n                    if ((selectedCategoryMask & (1 << i)) != 0)\n                    {\n                        list.Add(availableCategories[i]);\n                    }\n                }\n                return list.ToArray();\n            }\n        }\n\n        public void UpdateCounters(List<TestRunnerResult> resultList)\n        {\n            m_PassedCount = m_FailedCount = m_NotRunCount =  m_InconclusiveCount = m_SkippedCount = 0;\n            foreach (var result in resultList)\n            {\n                if (result.isSuite)\n                    continue;\n                switch (result.resultStatus)\n                {\n                    case TestRunnerResult.ResultStatus.Passed:\n                        m_PassedCount++;\n                        break;\n                    case TestRunnerResult.ResultStatus.Failed:\n                        m_FailedCount++;\n                        break;\n                    case TestRunnerResult.ResultStatus.Inconclusive:\n                        m_InconclusiveCount++;\n                        break;\n                    case TestRunnerResult.ResultStatus.Skipped:\n                        m_SkippedCount++;\n                        break;\n                    case TestRunnerResult.ResultStatus.NotRun:\n                    default:\n                        m_NotRunCount++;\n                        break;\n                }\n            }\n\n            var succeededTooltip = string.Format(\"Show tests that succeeded\\n{0} succeeded\", m_PassedCount);\n            m_SucceededBtn = new GUIContent(PassedCount.ToString(), Icons.s_SuccessImg, succeededTooltip);\n            var failedTooltip = string.Format(\"Show tests that failed\\n{0} failed\\n{1} inconclusive\", m_FailedCount, m_InconclusiveCount);\n            m_FailedBtn = new GUIContent(FailedCount.ToString(), Icons.s_FailImg, failedTooltip);\n            var notRunTooltip = string.Format(\"Show tests that didn't run\\n{0} didn't run\\n{1} skipped or ignored\", m_NotRunCount, m_SkippedCount);\n            m_NotRunBtn = new GUIContent(NotRunCount.ToString(), Icons.s_UnknownImg, notRunTooltip);\n        }\n\n        public void Draw()\n        {\n            EditorGUI.BeginChangeCheck();\n            m_SearchString = EditorGUILayout.ToolbarSearchField(m_SearchString);\n            if (EditorGUI.EndChangeCheck() && SearchStringChanged != null)\n            {\n                SearchStringChanged(m_SearchString);\n            }\n\n            if (availableCategories != null && availableCategories.Any())\n            {\n                EditorGUI.BeginChangeCheck();\n                selectedCategoryMask = EditorGUILayout.MaskField(selectedCategoryMask, availableCategories, EditorStyles.toolbarDropDown, GUILayout.MaxWidth(150));\n                if (EditorGUI.EndChangeCheck() && RebuildTestList != null)\n                {\n                    RebuildTestList();\n                }\n            }\n            else\n            {\n                EditorGUILayout.Popup(0, new[] { \"<No categories available>\" }, EditorStyles.toolbarDropDown, GUILayout.MaxWidth(150));\n            }\n\n            EditorGUI.BeginChangeCheck();\n            if (m_SucceededBtn != null)\n            {\n                PassedHidden = !GUILayout.Toggle(!PassedHidden, m_SucceededBtn, EditorStyles.toolbarButton, GUILayout.MaxWidth(GetMaxWidth(PassedCount)));\n            }\n            if (m_FailedBtn != null)\n            {\n                FailedHidden = !GUILayout.Toggle(!FailedHidden, m_FailedBtn, EditorStyles.toolbarButton, GUILayout.MaxWidth(GetMaxWidth(FailedCount)));\n            }\n            if (m_NotRunBtn != null)\n            {\n                NotRunHidden = !GUILayout.Toggle(!NotRunHidden, m_NotRunBtn, EditorStyles.toolbarButton, GUILayout.MaxWidth(GetMaxWidth(NotRunCount)));\n            }\n\n            if (EditorGUI.EndChangeCheck() && RebuildTestList != null)\n            {\n                RebuildTestList();\n            }\n        }\n\n        private static int GetMaxWidth(int count)\n        {\n            if (count < 10)\n                return 33;\n            return count < 100 ? 40 : 47;\n        }\n\n        public void Clear()\n        {\n            PassedHidden = false;\n            FailedHidden = false;\n            NotRunHidden = false;\n            selectedCategoryMask = 0;\n            m_SearchString = \"\";\n            if (SearchStringChanged != null)\n            {\n                SearchStringChanged(m_SearchString);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/GUI/TestRunnerUIFilter.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 15f870c6975ad6449b5b52514b90dc2b\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/GUI/Views/EditModeTestListGUI.cs",
    "content": "using System;\nusing System.Linq;\nusing UnityEditor.TestTools.TestRunner.Api;\nusing UnityEngine;\nusing UnityEngine.TestTools;\nusing UnityEngine.TestTools.TestRunner.GUI;\n\nnamespace UnityEditor.TestTools.TestRunner.GUI\n{\n    [Serializable]\n    internal class EditModeTestListGUI : TestListGUI\n    {\n        public override TestMode TestMode\n        {\n            get { return TestMode.EditMode; }\n        }\n\n        public override void RenderNoTestsInfo()\n        {\n            if (!TestListGUIHelper.SelectedFolderContainsTestAssembly())\n            {\n                var noTestText = \"No tests to show\";\n\n                if (!PlayerSettings.playModeTestRunnerEnabled)\n                {\n                    const string testsArePulledFromCustomAssemblies =\n                        \"EditMode tests can be in Editor only Assemblies, either in the editor special folder or Editor only Assembly Definitions with added Unity References \\\"Test Assemblies\\\".\";\n                    noTestText += Environment.NewLine + testsArePulledFromCustomAssemblies;\n                }\n\n                EditorGUILayout.HelpBox(noTestText, MessageType.Info);\n                if (GUILayout.Button(\"Create EditMode Test Assembly Folder\"))\n                {\n                    TestListGUIHelper.AddFolderAndAsmDefForTesting(isEditorOnly: true);\n                }\n            }\n\n            if (!TestListGUIHelper.CanAddEditModeTestScriptAndItWillCompile())\n            {\n                UnityEngine.GUI.enabled = false;\n                EditorGUILayout.HelpBox(\"EditMode test scripts can only be created in editor test assemblies.\", MessageType.Warning);\n            }\n            if (GUILayout.Button(\"Create Test Script in current folder\"))\n            {\n                TestListGUIHelper.AddTest();\n            }\n            UnityEngine.GUI.enabled = true;\n        }\n\n        public override void PrintHeadPanel()\n        {\n            base.PrintHeadPanel();\n            DrawFilters();\n        }\n\n        protected override void RunTests(TestRunnerFilter filter)\n        {\n            if (EditorUtility.scriptCompilationFailed)\n            {\n                Debug.LogError(\"Fix compilation issues before running tests\");\n                return;\n            }\n\n            filter.ClearResults(newResultList.OfType<TestRunnerFilter.IClearableResult>().ToList());\n\n            RerunCallbackData.instance.runFilter = filter;\n            RerunCallbackData.instance.testMode = TestMode.EditMode;\n\n            var testRunnerApi = ScriptableObject.CreateInstance<TestRunnerApi>();\n            testRunnerApi.Execute(new ExecutionSettings()\n            {\n                filter = new Filter()\n                {\n                    categoryNames = filter.categoryNames,\n                    groupNames =  filter.groupNames,\n                    testMode = TestMode,\n                    testNames = filter.testNames\n                }\n            });\n        }\n\n        public override TestPlatform TestPlatform { get { return TestPlatform.EditMode; } }\n        protected override bool IsBusy()\n        {\n            return EditModeLauncher.IsRunning || EditorApplication.isCompiling || EditorApplication.isPlaying;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/GUI/Views/EditModeTestListGUI.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 0336a32a79bfaed43a3fd2d88b91e974\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/GUI/Views/PlayModeTestListGUI.cs",
    "content": "using System;\nusing System.Linq;\nusing UnityEditor.SceneManagement;\nusing UnityEditor.TestTools.TestRunner.Api;\nusing UnityEngine;\nusing UnityEngine.TestTools;\nusing UnityEngine.SceneManagement;\nusing UnityEngine.TestTools.TestRunner;\nusing UnityEngine.TestTools.TestRunner.GUI;\n\nnamespace UnityEditor.TestTools.TestRunner.GUI\n{\n    [Serializable]\n    internal class PlayModeTestListGUI : TestListGUI\n    {\n        public override TestMode TestMode\n        {\n            get { return TestMode.PlayMode; }\n        }\n        public override void PrintHeadPanel()\n        {\n            EditorGUILayout.BeginHorizontal(GUILayout.ExpandHeight(false));\n            base.PrintHeadPanel();\n            if (GUILayout.Button(\"Run all in player (\" + EditorUserBuildSettings.activeBuildTarget + \")\", EditorStyles.toolbarButton))\n            {\n                RunTestsInPlayer(null);\n            }\n            EditorGUILayout.EndHorizontal();\n            DrawFilters();\n            EditorGUILayout.BeginHorizontal(GUILayout.ExpandHeight(false));\n            EditorGUILayout.EndHorizontal();\n        }\n\n        public override void RenderNoTestsInfo()\n        {\n            if (!TestListGUIHelper.SelectedFolderContainsTestAssembly())\n            {\n                var noTestText = \"No tests to show\";\n                if (!PlayerSettings.playModeTestRunnerEnabled)\n                {\n                    const string testsArePulledFromCustomAssemblues = \"Test Assemblies are defined by Assembly Definitions where you add Unity References \\\"Test Assemblies\\\"\";\n                    const string infoTextAboutTestsInAllAssemblies =\n                        \"To have tests in all assemblies enable it in the Test Runner window context menu\";\n                    noTestText += Environment.NewLine + testsArePulledFromCustomAssemblues + Environment.NewLine +\n                        infoTextAboutTestsInAllAssemblies;\n                }\n\n                EditorGUILayout.HelpBox(noTestText, MessageType.Info);\n                if (GUILayout.Button(\"Create PlayMode Test Assembly Folder\"))\n                {\n                    TestListGUIHelper.AddFolderAndAsmDefForTesting();\n                }\n            }\n\n            if (!TestListGUIHelper.CanAddPlayModeTestScriptAndItWillCompile())\n            {\n                UnityEngine.GUI.enabled = false;\n                EditorGUILayout.HelpBox(\"PlayMode test scripts can only be created in non editor test assemblies.\", MessageType.Warning);\n            }\n            if (GUILayout.Button(\"Create Test Script in current folder\"))\n            {\n                TestListGUIHelper.AddTest();\n            }\n            UnityEngine.GUI.enabled = true;\n        }\n\n        protected override void RunTests(TestRunnerFilter filter)\n        {\n            // Give user chance to save the changes to their currently open scene because we close it and load our own\n            var cancelled = !EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo();\n            if (cancelled)\n                return;\n\n            filter.ClearResults(newResultList.OfType<TestRunnerFilter.IClearableResult>().ToList());\n\n            RerunCallbackData.instance.runFilter = filter;\n            RerunCallbackData.instance.testMode = TestMode.PlayMode;\n\n            var testRunnerApi = ScriptableObject.CreateInstance<TestRunnerApi>();\n            testRunnerApi.Execute(new ExecutionSettings()\n            {\n                filter = new Filter()\n                {\n                    categoryNames = filter.categoryNames,\n                    groupNames =  filter.groupNames,\n                    testMode = TestMode,\n                    testNames = filter.testNames\n                }\n            });\n        }\n\n        protected void RunTestsInPlayer(TestRunnerFilter filter)\n        {\n            var settings = PlaymodeTestsControllerSettings.CreateRunnerSettings(filter);\n            var testExecutor = new PlayerLauncher(settings, null, null);\n            testExecutor.Run();\n            GUIUtility.ExitGUI();\n        }\n\n        public override TestPlatform TestPlatform { get { return TestPlatform.PlayMode; } }\n        protected override bool IsBusy()\n        {\n            return PlaymodeLauncher.IsRunning  || EditorApplication.isCompiling || EditorApplication.isPlaying;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/GUI/Views/PlayModeTestListGUI.cs.meta",
    "content": "fileFormatVersion: 2\nguid: c3efd39f2cfb43a4c830d4fd5689900f\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/GUI/Views/TestListGUIBase.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing UnityEditor.IMGUI.Controls;\nusing UnityEditor.TestTools.TestRunner.Api;\nusing UnityEngine;\nusing UnityEngine.TestTools.TestRunner.GUI;\nusing UnityEngine.TestTools;\n\nnamespace UnityEditor.TestTools.TestRunner.GUI\n{\n    internal abstract class TestListGUI\n    {\n        private static readonly GUIContent s_GUIRunSelectedTests = EditorGUIUtility.TrTextContent(\"Run Selected\", \"Run selected test(s)\");\n        private static readonly GUIContent s_GUIRunAllTests = EditorGUIUtility.TrTextContent(\"Run All\", \"Run all tests\");\n        private static readonly GUIContent s_GUIRerunFailedTests = EditorGUIUtility.TrTextContent(\"Rerun Failed\", \"Rerun all failed tests\");\n        private static readonly GUIContent s_GUIRun = EditorGUIUtility.TrTextContent(\"Run\");\n        private static readonly GUIContent s_GUIRunUntilFailed = EditorGUIUtility.TrTextContent(\"Run Until Failed\");\n        private static readonly GUIContent s_GUIRun100Times = EditorGUIUtility.TrTextContent(\"Run 100 times\");\n        private static readonly GUIContent s_GUIOpenTest = EditorGUIUtility.TrTextContent(\"Open source code\");\n        private static readonly GUIContent s_GUIOpenErrorLine = EditorGUIUtility.TrTextContent(\"Open error line\");\n\n        [SerializeField]\n        protected TestRunnerWindow m_Window;\n        [SerializeField]\n        public List<TestRunnerResult> newResultList = new List<TestRunnerResult>();\n        [SerializeField]\n        private string m_ResultText;\n        [SerializeField]\n        private string m_ResultStacktrace;\n\n        private TreeViewController m_TestListTree;\n        [SerializeField]\n        internal TreeViewState m_TestListState;\n        [SerializeField]\n        internal TestRunnerUIFilter m_TestRunnerUIFilter = new TestRunnerUIFilter();\n\n        private Vector2 m_TestInfoScroll, m_TestListScroll;\n        private string m_PreviousProjectPath;\n        private List<TestRunnerResult> m_QueuedResults = new List<TestRunnerResult>();\n\n        protected TestListGUI()\n        {\n            MonoCecilHelper = new MonoCecilHelper();\n            AssetsDatabaseHelper = new AssetsDatabaseHelper();\n\n            GuiHelper = new GuiHelper(MonoCecilHelper, AssetsDatabaseHelper);\n        }\n\n        protected IMonoCecilHelper MonoCecilHelper { get; private set; }\n        protected IAssetsDatabaseHelper AssetsDatabaseHelper { get; private set; }\n        protected IGuiHelper GuiHelper { get; private set; }\n\n        public abstract TestMode TestMode { get; }\n\n        public virtual void PrintHeadPanel()\n        {\n            EditorGUILayout.BeginHorizontal(EditorStyles.toolbar);\n            using (new EditorGUI.DisabledScope(IsBusy()))\n            {\n                if (GUILayout.Button(s_GUIRunAllTests, EditorStyles.toolbarButton))\n                {\n                    var filter = new TestRunnerFilter {categoryNames = m_TestRunnerUIFilter.CategoryFilter};\n                    RunTests(filter);\n                    GUIUtility.ExitGUI();\n                }\n            }\n            using (new EditorGUI.DisabledScope(m_TestListTree == null || !m_TestListTree.HasSelection() || IsBusy()))\n            {\n                if (GUILayout.Button(s_GUIRunSelectedTests, EditorStyles.toolbarButton))\n                {\n                    RunTests(GetSelectedTestsAsFilter(m_TestListTree.GetSelection()));\n                    GUIUtility.ExitGUI();\n                }\n            }\n            using (new EditorGUI.DisabledScope(m_TestRunnerUIFilter.FailedCount == 0 || IsBusy()))\n            {\n                if (GUILayout.Button(s_GUIRerunFailedTests, EditorStyles.toolbarButton))\n                {\n                    var failedTestnames = new List<string>();\n                    foreach (var result in newResultList)\n                    {\n                        if (result.isSuite)\n                            continue;\n                        if (result.resultStatus == TestRunnerResult.ResultStatus.Failed ||\n                            result.resultStatus == TestRunnerResult.ResultStatus.Inconclusive)\n                            failedTestnames.Add(result.fullName);\n                    }\n                    RunTests(new TestRunnerFilter() {testNames = failedTestnames.ToArray(), categoryNames = m_TestRunnerUIFilter.CategoryFilter});\n                    GUIUtility.ExitGUI();\n                }\n            }\n            GUILayout.FlexibleSpace();\n            EditorGUILayout.EndHorizontal();\n        }\n\n        protected void DrawFilters()\n        {\n            EditorGUILayout.BeginHorizontal(EditorStyles.toolbar);\n            m_TestRunnerUIFilter.Draw();\n            EditorGUILayout.EndHorizontal();\n        }\n\n        public bool HasTreeData()\n        {\n            return m_TestListTree != null;\n        }\n\n        public virtual void RenderTestList()\n        {\n            if (m_TestListTree == null)\n            {\n                GUILayout.Label(\"Loading...\");\n                return;\n            }\n\n            m_TestListScroll = EditorGUILayout.BeginScrollView(m_TestListScroll,\n                GUILayout.ExpandWidth(true),\n                GUILayout.MaxWidth(2000));\n\n            if (m_TestListTree.data.root == null || m_TestListTree.data.rowCount == 0 || (!m_TestListTree.isSearching && !m_TestListTree.data.GetItem(0).hasChildren))\n            {\n                if (m_TestRunnerUIFilter.IsFiltering)\n                {\n                    if (GUILayout.Button(\"Clear filters\"))\n                    {\n                        m_TestRunnerUIFilter.Clear();\n                        m_TestListTree.ReloadData();\n                        m_Window.Repaint();\n                    }\n                }\n                RenderNoTestsInfo();\n            }\n            else\n            {\n                var treeRect = EditorGUILayout.GetControlRect(GUILayout.ExpandHeight(true), GUILayout.ExpandWidth(true));\n                var treeViewKeyboardControlId = GUIUtility.GetControlID(FocusType.Keyboard);\n\n                m_TestListTree.OnGUI(treeRect, treeViewKeyboardControlId);\n            }\n\n            EditorGUILayout.EndScrollView();\n        }\n\n        public virtual void RenderNoTestsInfo()\n        {\n            EditorGUILayout.HelpBox(\"No tests to show\", MessageType.Info);\n        }\n\n        public void RenderDetails()\n        {\n            m_TestInfoScroll = EditorGUILayout.BeginScrollView(m_TestInfoScroll);\n            var resultTextSize = TestRunnerWindow.Styles.info.CalcSize(new GUIContent(m_ResultText));\n            EditorGUILayout.SelectableLabel(m_ResultText, TestRunnerWindow.Styles.info,\n                GUILayout.ExpandHeight(true),\n                GUILayout.ExpandWidth(true),\n                GUILayout.MinWidth(resultTextSize.x),\n                GUILayout.MinHeight(resultTextSize.y));\n            EditorGUILayout.EndScrollView();\n        }\n\n        public void Reload()\n        {\n            if (m_TestListTree != null)\n            {\n                m_TestListTree.ReloadData();\n                UpdateQueuedResults();\n            }\n        }\n\n        public void Repaint()\n        {\n            if (m_TestListTree == null || m_TestListTree.data.root == null)\n            {\n                return;\n            }\n\n            m_TestListTree.Repaint();\n            if (m_TestListTree.data.rowCount == 0)\n                m_TestListTree.SetSelection(new int[0], false);\n            TestSelectionCallback(m_TestListState.selectedIDs.ToArray());\n        }\n\n        public void Init(TestRunnerWindow window, ITestAdaptor rootTest)\n        {\n            if (m_Window == null)\n            {\n                m_Window = window;\n            }\n\n            if (m_TestListTree == null)\n            {\n                if (m_TestListState == null)\n                {\n                    m_TestListState = new TreeViewState();\n                }\n                if (m_TestListTree == null)\n                    m_TestListTree = new TreeViewController(m_Window, m_TestListState);\n\n                m_TestListTree.deselectOnUnhandledMouseDown = false;\n\n                m_TestListTree.selectionChangedCallback += TestSelectionCallback;\n                m_TestListTree.itemDoubleClickedCallback += TestDoubleClickCallback;\n                m_TestListTree.contextClickItemCallback += TestContextClickCallback;\n\n                var testListTreeViewDataSource = new TestListTreeViewDataSource(m_TestListTree, this, rootTest);\n\n                if (!newResultList.Any())\n                    testListTreeViewDataSource.ExpandTreeOnCreation();\n\n                m_TestListTree.Init(new Rect(),\n                    testListTreeViewDataSource,\n                    new TestListTreeViewGUI(m_TestListTree),\n                    null);\n            }\n\n            EditorApplication.update += RepaintIfProjectPathChanged;\n\n            m_TestRunnerUIFilter.UpdateCounters(newResultList);\n            m_TestRunnerUIFilter.RebuildTestList = () => m_TestListTree.ReloadData();\n            m_TestRunnerUIFilter.SearchStringChanged = s => m_TestListTree.searchString = s;\n        }\n\n        public void UpdateResult(TestRunnerResult result)\n        {\n            if (!HasTreeData())\n            {\n                m_QueuedResults.Add(result);\n                return;\n            }\n\n            if (newResultList.All(x => x.uniqueId != result.uniqueId))\n            {\n                return;\n            }\n\n            var testRunnerResult = newResultList.FirstOrDefault(x => x.uniqueId == result.uniqueId);\n            if (testRunnerResult != null)\n            {\n                testRunnerResult.Update(result);\n            }\n\n            Repaint();\n            m_Window.Repaint();\n        }\n\n        private void UpdateQueuedResults()\n        {\n            foreach (var testRunnerResult in m_QueuedResults)\n            {\n                var existingResult = newResultList.FirstOrDefault(x => x.uniqueId == testRunnerResult.uniqueId);\n                if (existingResult != null)\n                {\n                    existingResult.Update(testRunnerResult);\n                }\n            }\n            m_QueuedResults.Clear();\n            TestSelectionCallback(m_TestListState.selectedIDs.ToArray());\n            Repaint();\n            m_Window.Repaint();\n        }\n\n        internal void TestSelectionCallback(int[] selected)\n        {\n            if (m_TestListTree != null && selected.Length == 1)\n            {\n                if (m_TestListTree != null)\n                {\n                    var node = m_TestListTree.FindItem(selected[0]);\n                    if (node is TestTreeViewItem)\n                    {\n                        var test = node as TestTreeViewItem;\n                        m_ResultText = test.GetResultText();\n                        m_ResultStacktrace = test.result.stacktrace;\n                    }\n                }\n            }\n            else if (selected.Length == 0)\n            {\n                m_ResultText = \"\";\n            }\n        }\n\n        protected virtual void TestDoubleClickCallback(int id)\n        {\n            if (IsBusy())\n                return;\n\n            RunTests(GetSelectedTestsAsFilter(new List<int> { id }));\n            GUIUtility.ExitGUI();\n        }\n\n        protected virtual void RunTests(TestRunnerFilter filter)\n        {\n            throw new NotImplementedException();\n        }\n\n        protected virtual void TestContextClickCallback(int id)\n        {\n            if (id == 0)\n                return;\n\n            var m = new GenericMenu();\n            var testFilter = GetSelectedTestsAsFilter(m_TestListState.selectedIDs);\n            var multilineSelection = m_TestListState.selectedIDs.Count > 1;\n\n            if (!multilineSelection)\n            {\n                var testNode = GetSelectedTest();\n                var isNotSuite = !testNode.IsGroupNode;\n                if (isNotSuite)\n                {\n                    if (!string.IsNullOrEmpty(m_ResultStacktrace))\n                    {\n                        m.AddItem(s_GUIOpenErrorLine,\n                            false,\n                            data =>\n                            {\n                                if (!GuiHelper.OpenScriptInExternalEditor(m_ResultStacktrace))\n                                {\n                                    GuiHelper.OpenScriptInExternalEditor(testNode.type, testNode.method);\n                                }\n                            },\n                            \"\");\n                    }\n\n                    m.AddItem(s_GUIOpenTest,\n                        false,\n                        data => GuiHelper.OpenScriptInExternalEditor(testNode.type, testNode.method),\n                        \"\");\n                    m.AddSeparator(\"\");\n                }\n            }\n\n            if (!IsBusy())\n            {\n                m.AddItem(multilineSelection ? s_GUIRunSelectedTests : s_GUIRun,\n                    false,\n                    data => RunTests(testFilter),\n                    \"\");\n\n                if (EditorPrefs.GetBool(\"DeveloperMode\", false))\n                {\n                    m.AddItem(multilineSelection ? s_GUIRunSelectedTests : s_GUIRunUntilFailed,\n                        false,\n                        data =>\n                        {\n                            testFilter.testRepetitions = int.MaxValue;\n                            RunTests(testFilter);\n                        },\n                        \"\");\n\n                    m.AddItem(multilineSelection ? s_GUIRunSelectedTests : s_GUIRun100Times,\n                        false,\n                        data =>\n                        {\n                            testFilter.testRepetitions = 100;\n                            RunTests(testFilter);\n                        },\n                        \"\");\n                }\n            }\n            else\n                m.AddDisabledItem(multilineSelection ? s_GUIRunSelectedTests : s_GUIRun, false);\n\n            m.ShowAsContext();\n        }\n\n        private TestRunnerFilter GetSelectedTestsAsFilter(IEnumerable<int> selectedIDs)\n        {\n            var namesToRun = new List<string>();\n            var exactNamesToRun = new List<string>();\n            var assembliesToRun = new List<string>();\n            foreach (var lineId in selectedIDs)\n            {\n                var line = m_TestListTree.FindItem(lineId);\n                if (line is TestTreeViewItem)\n                {\n                    var testLine = line as TestTreeViewItem;\n                    if (testLine.IsGroupNode && !testLine.FullName.Contains(\"+\")) \n                    {\n                        if (testLine.parent != null && testLine.parent.displayName == \"Invisible Root Item\")\n                        {\n                            //Root node selected. Use an empty TestRunnerFilter to run every test\n                            namesToRun.Clear();\n                            exactNamesToRun.Clear();\n                            assembliesToRun.Clear();\n                            break;\n                        }\n\n                        if (testLine.FullName.EndsWith(\".dll\", StringComparison.OrdinalIgnoreCase))\n                            assembliesToRun.Add(TestRunnerFilter.AssemblyNameFromPath(testLine.FullName));\n                        else\n                            namesToRun.Add(string.Format(\"^{0}$\", testLine.FullName));\n                    }\n                    else\n                        exactNamesToRun.Add(testLine.FullName);\n                }\n            }\n\n            var filter = new TestRunnerFilter\n            {\n                assemblyNames = assembliesToRun.ToArray(),\n                groupNames = namesToRun.ToArray(),\n                testNames = exactNamesToRun.ToArray(),\n                categoryNames = m_TestRunnerUIFilter.CategoryFilter\n            };\n            return filter;\n        }\n\n        private TestTreeViewItem GetSelectedTest()\n        {\n            foreach (var lineId in m_TestListState.selectedIDs)\n            {\n                var line = m_TestListTree.FindItem(lineId);\n                if (line is TestTreeViewItem)\n                {\n                    return line as TestTreeViewItem;\n                }\n            }\n            return null;\n        }\n\n        public abstract TestPlatform TestPlatform { get; }\n\n        public void RebuildUIFilter()\n        {\n            m_TestRunnerUIFilter.UpdateCounters(newResultList);\n            if (m_TestRunnerUIFilter.IsFiltering)\n            {\n                m_TestListTree.ReloadData();\n            }\n        }\n\n        public void RepaintIfProjectPathChanged()\n        {\n            var path = TestListGUIHelper.GetActiveFolderPath();\n            if (path != m_PreviousProjectPath)\n            {\n                m_PreviousProjectPath = path;\n                TestRunnerWindow.s_Instance.Repaint();\n            }\n\n            EditorApplication.update -= RepaintIfProjectPathChanged;\n        }\n\n        protected abstract bool IsBusy();\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/GUI/Views/TestListGUIBase.cs.meta",
    "content": "fileFormatVersion: 2\nguid: b8abb41ceb6f62c45a00197ae59224c1\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/GUI/Views.meta",
    "content": "fileFormatVersion: 2\nguid: c5535d742ea2e4941850b421f9c70a1f\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/GUI.meta",
    "content": "fileFormatVersion: 2\nguid: 7e609b27ad2caa14c83dd9951b6c13c6\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/NUnitExtension/Attributes/AssetPipelineIgnore.cs",
    "content": "using System;\nusing NUnit.Framework;\nusing NUnit.Framework.Interfaces;\nusing NUnit.Framework.Internal;\n\nnamespace UnityEditor.TestTools\n{\n    /// <summary>\n    /// Ignore attributes dedicated to Asset Import Pipeline backend version handling.\n    /// </summary>\n    internal static class AssetPipelineIgnore\n    {\n        internal enum AssetPipelineBackend\n        {\n            V1,\n            V2\n        }\n\n        /// <summary>\n        /// Ignore the test when running with the legacy Asset Import Pipeline V1 backend.\n        /// </summary>\n        internal class IgnoreInV1 : AssetPipelineIgnoreAttribute\n        {\n            public IgnoreInV1(string ignoreReason) : base(AssetPipelineBackend.V1, ignoreReason) {}\n        }\n\n        /// <summary>\n        /// Ignore the test when running with the latest Asset Import Pipeline V2 backend.\n        /// </summary>\n        internal class IgnoreInV2 : AssetPipelineIgnoreAttribute\n        {\n            public IgnoreInV2(string ignoreReason) : base(AssetPipelineBackend.V2, ignoreReason) {}\n        }\n\n        [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)]\n        internal class AssetPipelineIgnoreAttribute : NUnitAttribute, IApplyToTest\n        {\n            readonly string m_IgnoreReason;\n            readonly AssetPipelineBackend m_IgnoredBackend;\n            static readonly AssetPipelineBackend k_ActiveBackend = AssetDatabase.IsV2Enabled()\n                ? AssetPipelineBackend.V2\n                : AssetPipelineBackend.V1;\n\n            static string ActiveBackendName = Enum.GetName(typeof(AssetPipelineBackend), k_ActiveBackend);\n\n            public AssetPipelineIgnoreAttribute(AssetPipelineBackend backend, string ignoreReason)\n            {\n                m_IgnoredBackend = backend;\n                m_IgnoreReason = ignoreReason;\n            }\n\n            public void ApplyToTest(Test test)\n            {\n                if (k_ActiveBackend == m_IgnoredBackend)\n                {\n                    test.RunState = RunState.Ignored;\n                    var skipReason = string.Format(\"Not supported by asset pipeline {0} backend {1}\", ActiveBackendName, m_IgnoreReason);\n                    test.Properties.Add(PropertyNames.SkipReason, skipReason);\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/NUnitExtension/Attributes/AssetPipelineIgnore.cs.meta",
    "content": "fileFormatVersion: 2\nguid: b88caca58e05ee74486d86fb404c48e2\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/NUnitExtension/Attributes.meta",
    "content": "fileFormatVersion: 2\nguid: 96c503bf059df984c86eecf572370347\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/NUnitExtension/TestRunnerStateSerializer.cs",
    "content": "using System;\nusing System.Reflection;\nusing System.Text;\nusing System.Collections.Generic;\nusing UnityEngine;\nusing UnityEngine.TestRunner.NUnitExtensions.Runner;\nusing UnityEngine.TestTools.NUnitExtensions;\nusing UnityEngine.TestTools.Logging;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    [Serializable]\n    internal class TestRunnerStateSerializer : IStateSerializer\n    {\n        private const BindingFlags Flags = BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy;\n\n        [SerializeField]\n        private HideFlags m_OriginalHideFlags;\n\n        [SerializeField]\n        private bool m_ShouldRestore;\n\n        [SerializeField]\n        private string m_TestObjectTypeName;\n\n        [SerializeField]\n        private ScriptableObject m_TestObject;\n\n        [SerializeField]\n        private string m_TestObjectTxt;\n\n        [SerializeField]\n        private long StartTicks;\n\n        [SerializeField]\n        private double StartTimeOA;\n\n        [SerializeField]\n        private string output;\n\n        [SerializeField]\n        private LogMatch[] m_ExpectedLogs;\n\n        public bool ShouldRestore()\n        {\n            return m_ShouldRestore;\n        }\n\n        public void SaveContext()\n        {\n            var currentContext = UnityTestExecutionContext.CurrentContext;\n\n            if (currentContext.TestObject != null)\n            {\n                m_TestObjectTypeName = currentContext.TestObject.GetType().AssemblyQualifiedName;\n                m_TestObject = null;\n                m_TestObjectTxt = null;\n                if (currentContext.TestObject is ScriptableObject)\n                {\n                    m_TestObject = currentContext.TestObject as ScriptableObject;\n                    m_OriginalHideFlags = m_TestObject.hideFlags;\n                    m_TestObject.hideFlags |= HideFlags.DontSave;\n                }\n                else\n                {\n                    m_TestObjectTxt = JsonUtility.ToJson(currentContext.TestObject);\n                }\n            }\n\n            output = currentContext.CurrentResult.Output;\n            StartTicks = currentContext.StartTicks;\n            StartTimeOA = currentContext.StartTime.ToOADate();\n            if (LogScope.HasCurrentLogScope())\n            {\n                m_ExpectedLogs = LogScope.Current.ExpectedLogs.ToArray();\n            }\n\n            m_ShouldRestore = true;\n        }\n\n        public void RestoreContext()\n        {\n            var currentContext = UnityTestExecutionContext.CurrentContext;\n\n            var outputProp = currentContext.CurrentResult.GetType().BaseType.GetField(\"_output\", Flags);\n            (outputProp.GetValue(currentContext.CurrentResult) as StringBuilder).Append(output);\n\n            currentContext.StartTicks = StartTicks;\n            currentContext.StartTime = DateTime.FromOADate(StartTimeOA);\n            if (LogScope.HasCurrentLogScope())\n            {\n                LogScope.Current.ExpectedLogs = new Queue<LogMatch>(m_ExpectedLogs);\n            }\n\n            m_ShouldRestore = false;\n        }\n\n        public bool CanRestoreFromScriptableObject(Type requestedType)\n        {\n            if (m_TestObject == null)\n            {\n                return false;\n            }\n            return m_TestObjectTypeName == requestedType.AssemblyQualifiedName;\n        }\n\n        public ScriptableObject RestoreScriptableObjectInstance()\n        {\n            if (m_TestObject == null)\n            {\n                Debug.LogError(\"No object to restore\");\n                return null;\n            }\n            EditorApplication.playModeStateChanged += OnPlayModeStateChanged;\n            var temp = m_TestObject;\n            m_TestObject = null;\n            m_TestObjectTypeName = null;\n            return temp;\n        }\n\n        public bool CanRestoreFromJson(Type requestedType)\n        {\n            if (string.IsNullOrEmpty(m_TestObjectTxt))\n            {\n                return false;\n            }\n            return m_TestObjectTypeName == requestedType.AssemblyQualifiedName;\n        }\n\n        public void RestoreClassFromJson(ref object instance)\n        {\n            if (string.IsNullOrEmpty(m_TestObjectTxt))\n            {\n                Debug.LogWarning(\"No JSON representation to restore\");\n                return;\n            }\n            JsonUtility.FromJsonOverwrite(m_TestObjectTxt, instance);\n            m_TestObjectTxt = null;\n            m_TestObjectTypeName = null;\n        }\n\n        private void OnPlayModeStateChanged(PlayModeStateChange state)\n        {\n            if (m_TestObject == null)\n            {\n                EditorApplication.playModeStateChanged -= OnPlayModeStateChanged;\n                return;\n            }\n\n            //We set the DontSave flag here because the ScriptableObject would be nulled right before entering EditMode\n            if (state == PlayModeStateChange.ExitingPlayMode)\n            {\n                m_TestObject.hideFlags |= HideFlags.DontSave;\n            }\n            else if (state == PlayModeStateChange.EnteredEditMode)\n            {\n                m_TestObject.hideFlags = m_OriginalHideFlags;\n                EditorApplication.playModeStateChanged -= OnPlayModeStateChanged;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/NUnitExtension/TestRunnerStateSerializer.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 124533853216377448d786fd7c725701\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/NUnitExtension.meta",
    "content": "fileFormatVersion: 2\nguid: 3f9202a39620f51418046c7754f215f0\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/RequireApiProfileAttribute.cs",
    "content": "using System;\nusing System.Linq;\nusing NUnit.Framework;\nusing NUnit.Framework.Interfaces;\nusing NUnit.Framework.Internal;\n\nnamespace UnityEditor.TestTools\n{\n    [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)]\n    internal class RequireApiProfileAttribute : NUnitAttribute, IApplyToTest\n    {\n        public ApiCompatibilityLevel[] apiProfiles { get; private set; }\n\n        public RequireApiProfileAttribute(params ApiCompatibilityLevel[] apiProfiles)\n        {\n            this.apiProfiles = apiProfiles;\n        }\n\n        void IApplyToTest.ApplyToTest(Test test)\n        {\n            test.Properties.Add(PropertyNames.Category, string.Format(\"ApiProfile({0})\", string.Join(\", \", apiProfiles.Select(p => p.ToString()).OrderBy(p => p).ToArray())));\n            ApiCompatibilityLevel testProfile = PlayerSettings.GetApiCompatibilityLevel(EditorUserBuildSettings.activeBuildTargetGroup);\n\n            if (!apiProfiles.Contains(testProfile))\n            {\n                string skipReason = \"Skipping test as it requires a compatible api profile set: \" + string.Join(\", \", apiProfiles.Select(p => p.ToString()).ToArray());\n                test.RunState = RunState.Skipped;\n                test.Properties.Add(PropertyNames.SkipReason, skipReason);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/RequireApiProfileAttribute.cs.meta",
    "content": "fileFormatVersion: 2\nguid: a667f6654ad7a9548b8c8e68b51c8895\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/RequirePlatformSupportAttribute.cs",
    "content": "using System;\nusing System.Linq;\nusing NUnit.Framework;\nusing NUnit.Framework.Interfaces;\nusing NUnit.Framework.Internal;\n\nnamespace UnityEditor.TestTools\n{\n    [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)]\n    public class RequirePlatformSupportAttribute : NUnitAttribute, IApplyToTest\n    {\n        public RequirePlatformSupportAttribute(params BuildTarget[] platforms)\n        {\n            this.platforms = platforms;\n        }\n\n        public BuildTarget[] platforms { get; private set; }\n\n        void IApplyToTest.ApplyToTest(Test test)\n        {\n            test.Properties.Add(PropertyNames.Category, string.Format(\"RequirePlatformSupport({0})\", string.Join(\", \", platforms.Select(p => p.ToString()).OrderBy(p => p).ToArray())));\n\n            if (!platforms.All(p => BuildPipeline.IsBuildTargetSupported(BuildTargetGroup.Unknown, p)))\n            {\n                var missingPlatforms = platforms.Where(p => !BuildPipeline.IsBuildTargetSupported(BuildTargetGroup.Unknown, p)).Select(p => p.ToString()).ToArray();\n                string skipReason = \"Test cannot be run as it requires support for the following platforms to be installed: \" + string.Join(\", \", missingPlatforms);\n\n                test.RunState = RunState.Skipped;\n                test.Properties.Add(PropertyNames.SkipReason, skipReason);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/RequirePlatformSupportAttribute.cs.meta",
    "content": "fileFormatVersion: 2\nguid: d2146428d3f1ad54eb7326c9a44b3284\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestBuildAssemblyFilter.cs",
    "content": "using System.Linq;\nusing UnityEditor.Build;\n\nnamespace UnityEditor.TestRunner\n{\n    internal class TestBuildAssemblyFilter : IFilterBuildAssemblies\n    {\n        private const string nunitAssemblyName = \"nunit.framework\";\n        private const string unityTestRunnerAssemblyName = \"UnityEngine.TestRunner\";\n\n        public int callbackOrder { get; }\n        public string[] OnFilterAssemblies(BuildOptions buildOptions, string[] assemblies)\n        {\n            if ((buildOptions & BuildOptions.IncludeTestAssemblies) == BuildOptions.IncludeTestAssemblies || PlayerSettings.playModeTestRunnerEnabled)\n            {\n                return assemblies;\n            }\n            return assemblies.Where(x => !x.Contains(nunitAssemblyName) && !x.Contains(unityTestRunnerAssemblyName)).ToArray();\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestBuildAssemblyFilter.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 3411e19edd44cfd46b548b058c3bc36c\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/AttributeFinderBase.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing NUnit.Framework.Interfaces;\nusing UnityEngine;\nusing UnityEngine.TestTools;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    internal abstract class AttributeFinderBase\n    {\n        public abstract IEnumerable<Type> Search(ITest tests, ITestFilter filter, RuntimePlatform testTargetPlatform);\n    }\n\n    internal abstract class AttributeFinderBase<T1, T2> : AttributeFinderBase where T2 : Attribute\n    {\n        private readonly Func<T2, Type> m_TypeSelector;\n        protected AttributeFinderBase(Func<T2, Type> typeSelector)\n        {\n            m_TypeSelector = typeSelector;\n        }\n\n        public override IEnumerable<Type> Search(ITest tests, ITestFilter filter, RuntimePlatform testTargetPlatform)\n        {\n            var selectedTests = new List<ITest>();\n            GetMatchingTests(tests, filter, ref selectedTests, testTargetPlatform);\n\n            var result = new List<Type>();\n            result.AddRange(GetTypesFromPrebuildAttributes(selectedTests));\n            result.AddRange(GetTypesFromInterface(selectedTests, testTargetPlatform));\n\n            return result.Distinct();\n        }\n\n        private static void GetMatchingTests(ITest tests, ITestFilter filter, ref List<ITest> resultList, RuntimePlatform testTargetPlatform)\n        {\n            foreach (var test in tests.Tests)\n            {\n                if (IsTestEnabledOnPlatform(test, testTargetPlatform))\n                {\n                    if (test.IsSuite)\n                    {\n                        GetMatchingTests(test, filter, ref resultList, testTargetPlatform);\n                    }\n                    else\n                    {\n                        if (filter.Pass(test))\n                            resultList.Add(test);\n                    }\n                }\n            }\n        }\n\n        private static bool IsTestEnabledOnPlatform(ITest test, RuntimePlatform testTargetPlatform)\n        {\n            if (test.Method == null)\n            {\n                return true;\n            }\n\n            var attributesFromMethods = test.Method.GetCustomAttributes<UnityPlatformAttribute>(true).Select(attribute => attribute);\n            var attributesFromTypes = test.Method.TypeInfo.GetCustomAttributes<UnityPlatformAttribute>(true).Select(attribute => attribute);\n\n            if (!attributesFromMethods.All(a => a.IsPlatformSupported(testTargetPlatform)))\n            {\n                return false;\n            }\n\n            if (!attributesFromTypes.All(a => a.IsPlatformSupported(testTargetPlatform)))\n            {\n                return false;\n            }\n\n            return true;\n        }\n\n        private IEnumerable<Type> GetTypesFromPrebuildAttributes(IEnumerable<ITest> tests)\n        {\n            var attributesFromMethods = tests.SelectMany(t => t.Method.GetCustomAttributes<T2>(true).Select(attribute => attribute));\n            var attributesFromTypes = tests.SelectMany(t => t.Method.TypeInfo.GetCustomAttributes<T2>(true).Select(attribute => attribute));\n\n            var result = new List<T2>();\n            result.AddRange(attributesFromMethods);\n            result.AddRange(attributesFromTypes);\n\n            return result.Select(m_TypeSelector).Where(type => type != null);\n        }\n\n        private static IEnumerable<Type> GetTypesFromInterface(IEnumerable<ITest> selectedTests, RuntimePlatform testTargetPlatform)\n        {\n            var typesWithInterfaces = selectedTests.Where(t => typeof(T1).IsAssignableFrom(t.Method.TypeInfo.Type) && IsTestEnabledOnPlatform(t, testTargetPlatform));\n            return typesWithInterfaces.Select(t => t.Method.TypeInfo.Type);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/AttributeFinderBase.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 5d4de3d4682a8d641907cc75e4fb950e\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/EditModeLauncher.cs",
    "content": "using System.Collections.Generic;\nusing NUnit.Framework.Interfaces;\nusing UnityEditor.SceneManagement;\nusing UnityEditor.TestTools.TestRunner.Api;\nusing UnityEngine;\nusing UnityEngine.SceneManagement;\nusing UnityEngine.TestTools;\nusing UnityEngine.TestTools.TestRunner;\nusing UnityEngine.TestTools.TestRunner.GUI;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    internal class EditModeLauncher : TestLauncherBase\n    {\n        public static bool IsRunning;\n        private readonly EditModeRunner m_EditModeRunner;\n\n        public EditModeLauncher(TestRunnerFilter filter, TestPlatform platform)\n        {\n            m_EditModeRunner = ScriptableObject.CreateInstance<EditModeRunner>();\n            m_EditModeRunner.UnityTestAssemblyRunnerFactory = new UnityTestAssemblyRunnerFactory();\n            m_EditModeRunner.Init(filter, platform);\n        }\n\n        public override void Run()\n        {\n            // Give user chance to save the changes to their currently open scene because we close it and load our own\n            var cancelled = !EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo();\n            if (cancelled)\n                return;\n\n            IsRunning = true;\n            var exceptionThrown = ExecutePreBuildSetupMethods(m_EditModeRunner.GetLoadedTests(), m_EditModeRunner.GetFilter());\n            if (exceptionThrown)\n            {\n                CallbacksDelegator.instance.RunFailed(\"Run Failed: One or more errors in a prebuild setup. See the editor log for details.\");\n                return;\n            }\n\n            var undoGroup = Undo.GetCurrentGroup();\n            SceneSetup[] previousSceneSetup;\n            if (!OpenNewScene(out previousSceneSetup))\n                return;\n\n            var callback = AddEventHandler<EditModeRunnerCallback>();\n            callback.previousSceneSetup = previousSceneSetup;\n            callback.undoGroup = undoGroup;\n            callback.runner = m_EditModeRunner;\n            AddEventHandler<CallbacksDelegatorListener>();\n\n            m_EditModeRunner.Run();\n            AddEventHandler<BackgroundListener>();\n        }\n\n        private static bool OpenNewScene(out SceneSetup[] previousSceneSetup)\n        {\n            previousSceneSetup = null;\n\n            var sceneCount = SceneManager.sceneCount;\n\n            var scene = SceneManager.GetSceneAt(0);\n            var isSceneNotPersisted = string.IsNullOrEmpty(scene.path);\n\n            if (sceneCount == 1 && isSceneNotPersisted)\n            {\n                EditorSceneManager.NewScene(NewSceneSetup.DefaultGameObjects, NewSceneMode.Single);\n                return true;\n            }\n            RemoveUntitledScenes();\n\n            // In case the user chose not to save the dirty scenes we reload them\n            ReloadUnsavedDirtyScene();\n\n            previousSceneSetup = EditorSceneManager.GetSceneManagerSetup();\n\n            scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Additive);\n            SceneManager.SetActiveScene(scene);\n\n            return true;\n        }\n\n        private static void ReloadUnsavedDirtyScene()\n        {\n            for (var i = 0; i < SceneManager.sceneCount; i++)\n            {\n                var scene = SceneManager.GetSceneAt(i);\n                var isSceneNotPersisted = string.IsNullOrEmpty(scene.path);\n                var isSceneDirty = scene.isDirty;\n                if (isSceneNotPersisted && isSceneDirty)\n                {\n                    EditorSceneManager.ReloadScene(scene);\n                }\n            }\n        }\n\n        private static void RemoveUntitledScenes()\n        {\n            int sceneCount = SceneManager.sceneCount;\n\n            var scenesToClose = new List<Scene>();\n            for (var i = 0; i < sceneCount; i++)\n            {\n                var scene = SceneManager.GetSceneAt(i);\n                var isSceneNotPersisted = string.IsNullOrEmpty(scene.path);\n                if (isSceneNotPersisted)\n                {\n                    scenesToClose.Add(scene);\n                }\n            }\n            foreach (Scene scene in scenesToClose)\n            {\n                EditorSceneManager.CloseScene(scene, true);\n            }\n        }\n\n        public class BackgroundListener : ScriptableObject, ITestRunnerListener\n        {\n            public void RunStarted(ITest testsToRun)\n            {\n            }\n\n            public void RunFinished(ITestResult testResults)\n            {\n                IsRunning = false;\n            }\n\n            public void TestStarted(ITest test)\n            {\n            }\n\n            public void TestFinished(ITestResult result)\n            {\n            }\n        }\n\n        public T AddEventHandler<T>() where T : ScriptableObject, ITestRunnerListener\n        {\n            return m_EditModeRunner.AddEventHandler<T>();\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/EditModeLauncher.cs.meta",
    "content": "fileFormatVersion: 2\nguid: ac68f5ae37c8957468562b8da42f9984\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/EditModeLauncherContextSettings.cs",
    "content": "using System;\nusing UnityEngine;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    internal class EditModeLauncherContextSettings : IDisposable\n    {\n        private bool m_RunInBackground;\n\n        public EditModeLauncherContextSettings()\n        {\n            SetupProjectParameters();\n        }\n\n        public void Dispose()\n        {\n            CleanupProjectParameters();\n        }\n\n        private void SetupProjectParameters()\n        {\n            m_RunInBackground = Application.runInBackground;\n            Application.runInBackground = true;\n        }\n\n        private void CleanupProjectParameters()\n        {\n            Application.runInBackground = m_RunInBackground;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/EditModeLauncherContextSettings.cs.meta",
    "content": "fileFormatVersion: 2\nguid: a582090813554df479fb9ca03e9857d3\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/AndroidPlatformSetup.cs",
    "content": "using System;\nusing UnityEngine;\nusing System.Net;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    internal class AndroidPlatformSetup : IPlatformSetup\n    {\n        private string m_oldApplicationIdentifier;\n        private string m_oldDeviceSocketAddress;\n        [SerializeField]\n        private bool m_Stripping;\n\n        public void Setup()\n        {\n            m_oldApplicationIdentifier = PlayerSettings.GetApplicationIdentifier(BuildTargetGroup.Android);\n            PlayerSettings.SetApplicationIdentifier(BuildTargetGroup.Android, \"com.UnityTestRunner.UnityTestRunner\");\n\n            m_oldDeviceSocketAddress = EditorUserBuildSettings.androidDeviceSocketAddress;\n            var androidDeviceConnection = Environment.GetEnvironmentVariable(\"ANDROID_DEVICE_CONNECTION\");\n            EditorUserBuildSettings.waitForPlayerConnection = true;\n            if (androidDeviceConnection != null)\n            {\n                EditorUserBuildSettings.androidDeviceSocketAddress = androidDeviceConnection;\n            }\n            m_Stripping = PlayerSettings.stripEngineCode;\n            PlayerSettings.stripEngineCode = false;\n        }\n\n        public void PostBuildAction()\n        {\n            PlayerSettings.stripEngineCode = m_Stripping;\n        }\n\n        public void PostSuccessfulBuildAction()\n        {\n            var connectionResult = -1;\n            var maxTryCount = 10;\n            var tryCount = maxTryCount;\n            while (tryCount-- > 0 && connectionResult == -1)\n            {\n                connectionResult = EditorConnectionInternal.ConnectPlayerProxy(IPAddress.Loopback.ToString(), 34999);\n                if (EditorUtility.DisplayCancelableProgressBar(\"Editor Connection\", \"Connecting to the player\",\n                    1 - ((float)tryCount / maxTryCount)))\n                {\n                    EditorUtility.ClearProgressBar();\n                    throw new TestLaunchFailedException();\n                }\n            }\n            EditorUtility.ClearProgressBar();\n            if (connectionResult == -1)\n                throw new TestLaunchFailedException(\n                    \"Timed out trying to connect to the player. Player failed to launch or crashed soon after launching\");\n        }\n\n        public void CleanUp()\n        {\n            EditorUserBuildSettings.androidDeviceSocketAddress = m_oldDeviceSocketAddress;\n            PlayerSettings.SetApplicationIdentifier(BuildTargetGroup.Android, m_oldApplicationIdentifier);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/AndroidPlatformSetup.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 961642509dec50b44a293d26240140ec\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/ApplePlatformSetup.cs",
    "content": "using System;\nusing System.Diagnostics;\nusing UnityEngine;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    [Serializable]\n    internal class ApplePlatformSetup : IPlatformSetup\n    {\n        [SerializeField]\n        private bool m_Stripping;\n\n        public ApplePlatformSetup(BuildTarget buildTarget)\n        {\n        }\n\n        public void Setup()\n        {\n            // Camera and fonts are stripped out and app crashes on iOS when test runner is trying to add a scene with... camera and text\n            m_Stripping = PlayerSettings.stripEngineCode;\n            PlayerSettings.stripEngineCode = false;\n        }\n\n        public void PostBuildAction()\n        {\n            // Restoring player setting as early as possible\n            PlayerSettings.stripEngineCode = m_Stripping;\n        }\n\n        public void PostSuccessfulBuildAction()\n        {\n        }\n\n        public void CleanUp()\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/ApplePlatformSetup.cs.meta",
    "content": "fileFormatVersion: 2\nguid: f6c189a159d3bde4c964cee562e508ea\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/IPlatformSetup.cs",
    "content": "namespace UnityEditor.TestTools.TestRunner\n{\n    internal interface IPlatformSetup\n    {\n        void Setup();\n        void PostBuildAction();\n        void PostSuccessfulBuildAction();\n        void CleanUp();\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/IPlatformSetup.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 9d614808f9add8a4f8e4860db2c7af0d\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/LuminPlatformSetup.cs",
    "content": "using System;\nusing System.Threading;\nusing UnityEngine;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    internal class LuminPlatformSetup : IPlatformSetup\n    {\n        private const string kDeviceAddress = \"127.0.0.1\";\n        private const int kDevicePort = 55000;\n\n        public void Setup()\n        {\n        }\n\n        public void PostBuildAction()\n        {\n        }\n\n        public void PostSuccessfulBuildAction()\n        {\n            var connectionResult = -1;\n            var maxTryCount = 100;\n            var tryCount = maxTryCount;\n            while (tryCount-- > 0 && connectionResult == -1)\n            {\n                Thread.Sleep(1000);\n                connectionResult = EditorConnectionInternal.ConnectPlayerProxy(kDeviceAddress, kDevicePort);\n                if (EditorUtility.DisplayCancelableProgressBar(\"Editor Connection\", \"Connecting to the player\",\n                    1 - ((float)tryCount / maxTryCount)))\n                {\n                    EditorUtility.ClearProgressBar();\n                    throw new TestLaunchFailedException();\n                }\n            }\n            EditorUtility.ClearProgressBar();\n            if (connectionResult == -1)\n                throw new TestLaunchFailedException(\n                    \"Timed out trying to connect to the player. Player failed to launch or crashed soon after launching\");\n        }\n\n        public void CleanUp()\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/LuminPlatformSetup.cs.meta",
    "content": "fileFormatVersion: 2\nguid: c38ae0585d6a55042a2d678330689685\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/PlatformSpecificSetup.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing UnityEngine;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    [Serializable]\n    internal class PlatformSpecificSetup\n    {\n        [SerializeField]\n        private ApplePlatformSetup m_AppleiOSPlatformSetup = new ApplePlatformSetup(BuildTarget.iOS);\n        [SerializeField]\n        private ApplePlatformSetup m_AppleTvOSPlatformSetup = new ApplePlatformSetup(BuildTarget.tvOS);\n        [SerializeField]\n        private XboxOnePlatformSetup m_XboxOnePlatformSetup = new XboxOnePlatformSetup();\n        [SerializeField]\n        private AndroidPlatformSetup m_AndroidPlatformSetup = new AndroidPlatformSetup();\n        [SerializeField]\n        private SwitchPlatformSetup m_SwitchPlatformSetup = new SwitchPlatformSetup();\n\n        [SerializeField]\n        private UwpPlatformSetup m_UwpPlatformSetup = new UwpPlatformSetup();\n\n        [SerializeField]\n        private LuminPlatformSetup m_LuminPlatformSetup = new LuminPlatformSetup();\n\n\n        private IDictionary<BuildTarget, IPlatformSetup> m_SetupTypes;\n\n        [SerializeField]\n        private BuildTarget m_Target;\n\n        public PlatformSpecificSetup()\n        {\n        }\n\n        public PlatformSpecificSetup(BuildTarget target)\n        {\n            m_Target = target;\n        }\n\n        public void Setup()\n        {\n            var dictionary = GetSetup();\n\n            if (!dictionary.ContainsKey(m_Target))\n            {\n                return;\n            }\n\n            dictionary[m_Target].Setup();\n        }\n\n        public void PostBuildAction()\n        {\n            var dictionary = GetSetup();\n\n            if (!dictionary.ContainsKey(m_Target))\n            {\n                return;\n            }\n\n            dictionary[m_Target].PostBuildAction();\n        }\n\n        public void PostSuccessfulBuildAction()\n        {\n            var dictionary = GetSetup();\n\n            if (!dictionary.ContainsKey(m_Target))\n            {\n                return;\n            }\n\n            dictionary[m_Target].PostSuccessfulBuildAction();\n        }\n\n        public void CleanUp()\n        {\n            var dictionary = GetSetup();\n\n            if (!dictionary.ContainsKey(m_Target))\n            {\n                return;\n            }\n\n            dictionary[m_Target].CleanUp();\n        }\n\n        private IDictionary<BuildTarget, IPlatformSetup> GetSetup()\n        {\n            m_SetupTypes = new Dictionary<BuildTarget, IPlatformSetup>()\n            {\n                {BuildTarget.iOS, m_AppleiOSPlatformSetup},\n                {BuildTarget.tvOS, m_AppleTvOSPlatformSetup},\n                {BuildTarget.XboxOne, m_XboxOnePlatformSetup},\n                {BuildTarget.Android, m_AndroidPlatformSetup},\n                {BuildTarget.WSAPlayer, m_UwpPlatformSetup},\n                {BuildTarget.Lumin, m_LuminPlatformSetup},\n                {BuildTarget.Switch, m_SwitchPlatformSetup}\n            };\n            return m_SetupTypes;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/PlatformSpecificSetup.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 6cccd50ebf7384242bda4d7bcb282ebf\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/SwitchPlatformSetup.cs",
    "content": "namespace UnityEditor.TestTools.TestRunner\n{\n    internal class SwitchPlatformSetup : IPlatformSetup\n    {\n        public void Setup()\n        {\n            EditorUserBuildSettings.switchCreateRomFile = true;\n            EditorUserBuildSettings.switchNVNGraphicsDebugger = false;\n            EditorUserBuildSettings.switchNVNDrawValidation = true; // catches more graphics errors\n            EditorUserBuildSettings.development = true;\n            EditorUserBuildSettings.switchRedirectWritesToHostMount = true;\n\n            // We can use these when more debugging is required:\n            //EditorUserBuildSettings.switchNVNDrawValidation = false; // cannot be used with shader debug\n            //EditorUserBuildSettings.switchNVNGraphicsDebugger = true;\n            //EditorUserBuildSettings.switchNVNShaderDebugging = true;\n            //EditorUserBuildSettings.switchCreateSolutionFile = true; // for shorter iteration time\n            //EditorUserBuildSettings.allowDebugging = true; // managed debugger can be attached\n        }\n\n        public void PostBuildAction()\n        {\n        }\n\n        public void PostSuccessfulBuildAction()\n        {\n        }\n\n        public void CleanUp()\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/SwitchPlatformSetup.cs.meta",
    "content": "fileFormatVersion: 2\nguid: adf7bea9401c1834380d55601add6cfb\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/UwpPlatformSetup.cs",
    "content": "using System;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    internal class UwpPlatformSetup : IPlatformSetup\n    {\n        private const string k_SettingsBuildConfiguration = \"BuildConfiguration\";\n        private bool m_InternetClientServer;\n        private bool m_PrivateNetworkClientServer;\n\n        public void Setup()\n        {\n            m_InternetClientServer = PlayerSettings.WSA.GetCapability(PlayerSettings.WSACapability.InternetClientServer);\n            m_PrivateNetworkClientServer = PlayerSettings.WSA.GetCapability(PlayerSettings.WSACapability.PrivateNetworkClientServer);\n            PlayerSettings.WSA.SetCapability(PlayerSettings.WSACapability.InternetClientServer, true);\n            PlayerSettings.WSA.SetCapability(PlayerSettings.WSACapability.PrivateNetworkClientServer, true);\n\n            // This setting is initialized only when Window Store App is selected from the Build Settings window, and\n            // is typically an empty strings when running tests via UTR on the command-line.\n            bool wsaSettingNotInitialized = string.IsNullOrEmpty(EditorUserBuildSettings.wsaArchitecture);\n\n            // If WSA build settings aren't fully initialized or running from a build machine, specify a default build configuration.\n            // Otherwise we can use the existing configuration specified by the user in Build Settings.\n            if (!string.IsNullOrEmpty(Environment.GetEnvironmentVariable(\"UNITY_THISISABUILDMACHINE\")) || wsaSettingNotInitialized)\n            {\n                EditorUserBuildSettings.wsaSubtarget = WSASubtarget.PC;\n                EditorUserBuildSettings.wsaArchitecture = \"x64\";\n                EditorUserBuildSettings.SetPlatformSettings(BuildPipeline.GetBuildTargetName(BuildTarget.WSAPlayer), k_SettingsBuildConfiguration, WSABuildType.Debug.ToString());\n                EditorUserBuildSettings.wsaUWPBuildType = WSAUWPBuildType.ExecutableOnly;\n                PlayerSettings.SetIl2CppCompilerConfiguration(BuildTargetGroup.WSA, Il2CppCompilerConfiguration.Debug);\n            }\n        }\n\n        public void PostBuildAction()\n        {\n        }\n\n        public void PostSuccessfulBuildAction()\n        {\n        }\n\n        public void CleanUp()\n        {\n            PlayerSettings.WSA.SetCapability(PlayerSettings.WSACapability.InternetClientServer, m_InternetClientServer);\n            PlayerSettings.WSA.SetCapability(PlayerSettings.WSACapability.PrivateNetworkClientServer, m_PrivateNetworkClientServer);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/UwpPlatformSetup.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 667c6ad86a0b7a548aaa5c287f2c2861\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/XboxOnePlatformSetup.cs",
    "content": "namespace UnityEditor.TestTools.TestRunner\n{\n    internal class XboxOnePlatformSetup : IPlatformSetup\n    {\n        private XboxOneDeployMethod oldXboxOneDeployMethod;\n        private XboxOneDeployDrive oldXboxOneDeployDrive;\n        private string oldXboxOneAdditionalDebugPorts;\n\n        public void Setup()\n        {\n            oldXboxOneDeployMethod = EditorUserBuildSettings.xboxOneDeployMethod;\n            oldXboxOneDeployDrive = EditorUserBuildSettings.xboxOneDeployDrive;\n            oldXboxOneAdditionalDebugPorts = EditorUserBuildSettings.xboxOneAdditionalDebugPorts;\n\n            EditorUserBuildSettings.xboxOneDeployMethod = XboxOneDeployMethod.Package;\n            EditorUserBuildSettings.xboxOneDeployDrive = XboxOneDeployDrive.Default;\n\n            // This causes the XboxOne post processing systems to open this port in your package manifest.\n            // In addition it will open the ephemeral range for debug connections as well.\n            // Failure to do this will cause connection problems.\n            EditorUserBuildSettings.xboxOneAdditionalDebugPorts = \"34999\";\n        }\n\n        public void PostBuildAction()\n        {\n        }\n\n        public void PostSuccessfulBuildAction()\n        {\n        }\n\n        public void CleanUp()\n        {\n            EditorUserBuildSettings.xboxOneDeployMethod = oldXboxOneDeployMethod;\n            EditorUserBuildSettings.xboxOneDeployDrive = oldXboxOneDeployDrive;\n\n            // This causes the XboxOne post processing systems to open this port in your package manifest.\n            // In addition it will open the ephemeral range for debug connections as well.\n            // Failure to do this will cause connection problems.\n            EditorUserBuildSettings.xboxOneAdditionalDebugPorts = oldXboxOneAdditionalDebugPorts;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/XboxOnePlatformSetup.cs.meta",
    "content": "fileFormatVersion: 2\nguid: aed7ab02155e43341a2dbcb7bc17c160\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/PlatformSetup.meta",
    "content": "fileFormatVersion: 2\nguid: ebc4d20cc106cea49b1df1153f0b3b5e\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/PlayerLauncher.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing UnityEditor;\nusing UnityEditor.TestRunner.TestLaunchers;\nusing UnityEditor.TestTools.TestRunner.Api;\nusing UnityEngine;\nusing UnityEngine.SceneManagement;\nusing UnityEngine.TestTools.TestRunner;\nusing UnityEngine.TestTools.TestRunner.Callbacks;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    internal class TestLaunchFailedException : Exception\n    {\n        public TestLaunchFailedException() {}\n        public TestLaunchFailedException(string message) : base(message) {}\n    }\n\n    [Serializable]\n    internal class PlayerLauncher : RuntimeTestLauncherBase\n    {\n        private readonly PlaymodeTestsControllerSettings m_Settings;\n        private readonly BuildTarget m_TargetPlatform;\n        private string m_TempBuildLocation;\n        private ITestRunSettings m_OverloadTestRunSettings;\n\n        public PlayerLauncher(PlaymodeTestsControllerSettings settings, BuildTarget? targetPlatform, ITestRunSettings overloadTestRunSettings)\n        {\n            m_Settings = settings;\n            m_TargetPlatform = targetPlatform ?? EditorUserBuildSettings.activeBuildTarget;\n            m_OverloadTestRunSettings = overloadTestRunSettings;\n        }\n\n        protected override RuntimePlatform? TestTargetPlatform\n        {\n            get { return BuildTargetConverter.TryConvertToRuntimePlatform(m_TargetPlatform); }\n        }\n\n        public override void Run()\n        {\n            var editorConnectionTestCollector = RemoteTestRunController.instance;\n            editorConnectionTestCollector.hideFlags = HideFlags.HideAndDontSave;\n            editorConnectionTestCollector.Init(m_TargetPlatform);\n\n            var remotePlayerLogController = RemotePlayerLogController.instance;\n            remotePlayerLogController.hideFlags = HideFlags.HideAndDontSave;\n\n            using (var settings = new PlayerLauncherContextSettings(m_OverloadTestRunSettings))\n            {\n                var sceneName = CreateSceneName();\n                var scene = PrepareScene(sceneName);\n\n                var filter = m_Settings.filter.BuildNUnitFilter();\n                var runner = LoadTests(filter);\n                var exceptionThrown = ExecutePreBuildSetupMethods(runner.LoadedTest, filter);\n                if (exceptionThrown)\n                {\n                    ReopenOriginalScene(m_Settings.originalScene);\n                    AssetDatabase.DeleteAsset(sceneName);\n                    CallbacksDelegator.instance.RunFailed(\"Run Failed: One or more errors in a prebuild setup. See the editor log for details.\");\n                    return;\n                }\n\n                var playerBuildOptions = GetBuildOptions(scene);\n\n                var success = BuildAndRunPlayer(playerBuildOptions);\n                editorConnectionTestCollector.PostBuildAction();\n                ExecutePostBuildCleanupMethods(runner.LoadedTest, filter);\n\n                ReopenOriginalScene(m_Settings.originalScene);\n                AssetDatabase.DeleteAsset(sceneName);\n\n                if (!success)\n                {\n                    ScriptableObject.DestroyImmediate(editorConnectionTestCollector);\n                    Debug.LogError(\"Player build failed\");\n                    throw new TestLaunchFailedException(\"Player build failed\");\n                }\n\n                editorConnectionTestCollector.PostSuccessfulBuildAction();\n            }\n        }\n\n        public Scene PrepareScene(string sceneName)\n        {\n            var scene = CreateBootstrapScene(sceneName, runner =>\n            {\n                runner.AddEventHandlerMonoBehaviour<PlayModeRunnerCallback>();\n                runner.settings = m_Settings;\n                runner.AddEventHandlerMonoBehaviour<RemoteTestResultSender>();\n            });\n            return scene;\n        }\n\n        private static bool BuildAndRunPlayer(PlayerLauncherBuildOptions buildOptions)\n        {\n            Debug.LogFormat(LogType.Log, LogOption.NoStacktrace, null, \"Building player with following options:\\n{0}\", buildOptions);\n\n\n            // Android has to be in listen mode to establish player connection\n            if (buildOptions.BuildPlayerOptions.target == BuildTarget.Android)\n            {\n                buildOptions.BuildPlayerOptions.options &= ~BuildOptions.ConnectToHost;\n            }\n\n            // For now, so does Lumin\n            if (buildOptions.BuildPlayerOptions.target == BuildTarget.Lumin)\n            {\n                buildOptions.BuildPlayerOptions.options &= ~BuildOptions.ConnectToHost;\n            }\n\n            var result = BuildPipeline.BuildPlayer(buildOptions.BuildPlayerOptions);\n            if (result.summary.result != Build.Reporting.BuildResult.Succeeded)\n                Debug.LogError(result.SummarizeErrors());\n\n            return result.summary.result == Build.Reporting.BuildResult.Succeeded;\n        }\n\n        private PlayerLauncherBuildOptions GetBuildOptions(Scene scene)\n        {\n            var buildOptions = new BuildPlayerOptions();\n            var reduceBuildLocationPathLength = false;\n\n            //Some platforms hit MAX_PATH limits during the build process, in these cases minimize the path length\n            if ((m_TargetPlatform == BuildTarget.WSAPlayer) || (m_TargetPlatform == BuildTarget.XboxOne))\n            {\n                reduceBuildLocationPathLength = true;\n            }\n\n            var scenes = new List<string>() { scene.path };\n            scenes.AddRange(EditorBuildSettings.scenes.Select(x => x.path));\n            buildOptions.scenes = scenes.ToArray();\n\n            buildOptions.options |= BuildOptions.AutoRunPlayer | BuildOptions.Development | BuildOptions.ConnectToHost | BuildOptions.IncludeTestAssemblies | BuildOptions.StrictMode;\n            buildOptions.target = m_TargetPlatform;\n\n            if (EditorUserBuildSettings.waitForPlayerConnection)\n                buildOptions.options |= BuildOptions.WaitForPlayerConnection;\n\n            var buildTargetGroup = EditorUserBuildSettings.activeBuildTargetGroup;\n            var uniqueTempPathInProject = FileUtil.GetUniqueTempPathInProject();\n\n            if (reduceBuildLocationPathLength)\n            {\n                uniqueTempPathInProject = Path.GetTempFileName();\n                File.Delete(uniqueTempPathInProject);\n                Directory.CreateDirectory(uniqueTempPathInProject);\n            }\n\n            //Check if Lz4 is supported for the current buildtargetgroup and enable it if need be\n            if (PostprocessBuildPlayer.SupportsLz4Compression(buildTargetGroup, m_TargetPlatform))\n            {\n                if (EditorUserBuildSettings.GetCompressionType(buildTargetGroup) == Compression.Lz4)\n                    buildOptions.options |= BuildOptions.CompressWithLz4;\n                else if (EditorUserBuildSettings.GetCompressionType(buildTargetGroup) == Compression.Lz4HC)\n                    buildOptions.options |= BuildOptions.CompressWithLz4HC;\n            }\n\n            m_TempBuildLocation = Path.GetFullPath(uniqueTempPathInProject);\n\n            string extensionForBuildTarget = PostprocessBuildPlayer.GetExtensionForBuildTarget(buildTargetGroup, buildOptions.target, buildOptions.options);\n\n            var playerExecutableName = \"PlayerWithTests\";\n            var playerDirectoryName = reduceBuildLocationPathLength ? \"PwT\" : \"PlayerWithTests\";\n\n            var locationPath = Path.Combine(m_TempBuildLocation, playerDirectoryName);\n\n            if (!string.IsNullOrEmpty(extensionForBuildTarget))\n            {\n                playerExecutableName += string.Format(\".{0}\", extensionForBuildTarget);\n                locationPath = Path.Combine(locationPath, playerExecutableName);\n            }\n\n            buildOptions.locationPathName = locationPath;\n\n            return new PlayerLauncherBuildOptions\n            {\n                BuildPlayerOptions = buildOptions,\n                PlayerDirectory = Path.Combine(m_TempBuildLocation, playerDirectoryName),\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/PlayerLauncher.cs.meta",
    "content": "fileFormatVersion: 2\nguid: d973fc1524e4d724081553934c55958c\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherBuildOptions.cs",
    "content": "using System.Text;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    internal class PlayerLauncherBuildOptions\n    {\n        public BuildPlayerOptions BuildPlayerOptions;\n        public string PlayerDirectory;\n\n        public override string ToString()\n        {\n            var str = new StringBuilder();\n            str.AppendLine(\"locationPathName = \" + BuildPlayerOptions.locationPathName);\n            str.AppendLine(\"target = \" + BuildPlayerOptions.target);\n            str.AppendLine(\"scenes = \" + string.Join(\", \", BuildPlayerOptions.scenes));\n            str.AppendLine(\"assetBundleManifestPath = \" + BuildPlayerOptions.assetBundleManifestPath);\n            str.AppendLine(\"options.Development = \" + ((BuildPlayerOptions.options & BuildOptions.Development) != 0));\n            str.AppendLine(\"options.AutoRunPlayer = \" + ((BuildPlayerOptions.options & BuildOptions.AutoRunPlayer) != 0));\n            str.AppendLine(\"options.ForceEnableAssertions = \" + ((BuildPlayerOptions.options & BuildOptions.ForceEnableAssertions) != 0));\n            return str.ToString();\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherBuildOptions.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 2a0bd678385f98e4d8eabdfc07d62b4f\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherContextSettings.cs",
    "content": "using System;\nusing UnityEditor.TestTools.TestRunner.Api;\nusing UnityEngine;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    internal class PlayerLauncherContextSettings : IDisposable\n    {\n        private ITestRunSettings m_OverloadSettings;\n\n        private EditorBuildSettingsScene[] m_EditorBuildSettings;\n#pragma warning disable 618\n        private ResolutionDialogSetting m_DisplayResolutionDialog;\n#pragma warning restore 618\n        private bool m_RunInBackground;\n        private FullScreenMode m_FullScreenMode;\n        private bool m_ResizableWindow;\n        private bool m_ShowUnitySplashScreen;\n        private string m_OldproductName;\n        private string m_OldAotOptions;\n        private Lightmapping.GIWorkflowMode m_OldLightmapping;\n        private bool m_explicitNullChecks;\n\n        private bool m_Disposed;\n\n        public PlayerLauncherContextSettings(ITestRunSettings overloadSettings)\n        {\n            m_OverloadSettings = overloadSettings;\n            SetupProjectParameters();\n\n            if (overloadSettings != null)\n            {\n                overloadSettings.Apply();\n            }\n        }\n\n        public void Dispose()\n        {\n            if (!m_Disposed)\n            {\n                CleanupProjectParameters();\n                if (m_OverloadSettings != null)\n                {\n                    m_OverloadSettings.Dispose();\n                }\n\n                m_Disposed = true;\n            }\n        }\n\n        private void SetupProjectParameters()\n        {\n            EditorApplication.LockReloadAssemblies();\n\n            m_EditorBuildSettings = EditorBuildSettings.scenes;\n\n#pragma warning disable 618\n            m_DisplayResolutionDialog = PlayerSettings.displayResolutionDialog;\n            PlayerSettings.displayResolutionDialog = ResolutionDialogSetting.Disabled;\n#pragma warning restore 618\n\n            m_RunInBackground = PlayerSettings.runInBackground;\n            PlayerSettings.runInBackground = true;\n\n            m_FullScreenMode = PlayerSettings.fullScreenMode;\n            PlayerSettings.fullScreenMode = FullScreenMode.Windowed;\n\n            m_OldAotOptions = PlayerSettings.aotOptions;\n            PlayerSettings.aotOptions = \"nimt-trampolines=1024\";\n\n            m_ResizableWindow = PlayerSettings.resizableWindow;\n            PlayerSettings.resizableWindow = true;\n\n            m_ShowUnitySplashScreen = PlayerSettings.SplashScreen.show;\n            PlayerSettings.SplashScreen.show = false;\n\n            m_OldproductName = PlayerSettings.productName;\n            PlayerSettings.productName = \"UnityTestFramework\";\n\n            m_OldLightmapping = Lightmapping.giWorkflowMode;\n            Lightmapping.giWorkflowMode = Lightmapping.GIWorkflowMode.OnDemand;\n\n            m_explicitNullChecks = EditorUserBuildSettings.explicitNullChecks;\n            EditorUserBuildSettings.explicitNullChecks = true;\n        }\n\n        private void CleanupProjectParameters()\n        {\n            EditorBuildSettings.scenes = m_EditorBuildSettings;\n\n            PlayerSettings.fullScreenMode = m_FullScreenMode;\n            PlayerSettings.runInBackground = m_RunInBackground;\n#pragma warning disable 618\n            PlayerSettings.displayResolutionDialog = m_DisplayResolutionDialog;\n#pragma warning restore 618\n            PlayerSettings.resizableWindow = m_ResizableWindow;\n            PlayerSettings.SplashScreen.show = m_ShowUnitySplashScreen;\n            PlayerSettings.productName = m_OldproductName;\n            PlayerSettings.aotOptions = m_OldAotOptions;\n            Lightmapping.giWorkflowMode = m_OldLightmapping;\n            EditorUserBuildSettings.explicitNullChecks = m_explicitNullChecks;\n\n            EditorApplication.UnlockReloadAssemblies();\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherContextSettings.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 6965880f76f40194593cb53a88f74005\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/PlaymodeLauncher.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing NUnit.Framework.Interfaces;\nusing UnityEditor.TestTools.TestRunner.Api;\nusing UnityEngine;\nusing UnityEngine.SceneManagement;\nusing UnityEngine.TestTools.TestRunner;\nusing UnityEngine.TestTools.TestRunner.Callbacks;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    internal class PlaymodeLauncher : RuntimeTestLauncherBase\n    {\n        public static bool IsRunning;\n        private Scene m_Scene;\n        private bool m_IsTestSetupPerformed;\n        private readonly PlaymodeTestsControllerSettings m_Settings;\n        private ITestFilter testFilter;\n\n        [SerializeField]\n        private List<Type> m_EventHandlers = new List<Type>();\n\n        public PlaymodeLauncher(PlaymodeTestsControllerSettings settings)\n        {\n            m_Settings = settings;\n        }\n\n        public override void Run()\n        {\n            IsRunning = true;\n            ConsoleWindow.SetConsoleErrorPause(false);\n            Application.runInBackground = true;\n\n            var sceneName = CreateSceneName();\n            m_Scene = CreateBootstrapScene(sceneName, runner =>\n            {\n                runner.AddEventHandlerMonoBehaviour<PlayModeRunnerCallback>();\n                runner.AddEventHandlerScriptableObject<TestRunnerCallback>();\n                runner.AddEventHandlerScriptableObject<CallbacksDelegatorListener>();\n\n                foreach (var eventHandler in m_EventHandlers)\n                {\n                    var obj = ScriptableObject.CreateInstance(eventHandler);\n                    runner.AddEventHandlerScriptableObject(obj as ITestRunnerListener);\n                }\n\n                runner.settings = m_Settings;\n            });\n\n            if (m_Settings.sceneBased)\n            {\n                var newListOfScenes =\n                    new List<EditorBuildSettingsScene> {new EditorBuildSettingsScene(sceneName, true)};\n                newListOfScenes.AddRange(EditorBuildSettings.scenes);\n                EditorBuildSettings.scenes = newListOfScenes.ToArray();\n            }\n\n            EditorApplication.update += UpdateCallback;\n        }\n\n        public void UpdateCallback()\n        {\n            if (m_IsTestSetupPerformed)\n            {\n                if (m_Scene.IsValid())\n                    SceneManager.SetActiveScene(m_Scene);\n                EditorApplication.update -= UpdateCallback;\n                EditorApplication.isPlaying = true;\n            }\n            else\n            {\n                testFilter = m_Settings.filter.BuildNUnitFilter();\n                var runner = LoadTests(testFilter);\n\n                var exceptionThrown = ExecutePreBuildSetupMethods(runner.LoadedTest, testFilter);\n                if (exceptionThrown)\n                {\n                    EditorApplication.update -= UpdateCallback;\n                    IsRunning = false;\n                    var controller = PlaymodeTestsController.GetController();\n                    ReopenOriginalScene(controller);\n                    AssetDatabase.DeleteAsset(controller.settings.bootstrapScene);\n                    CallbacksDelegator.instance.RunFailed(\"Run Failed: One or more errors in a prebuild setup. See the editor log for details.\");\n                    return;\n                }\n                m_IsTestSetupPerformed = true;\n            }\n        }\n\n        [InitializeOnLoad]\n        public class BackgroundWatcher\n        {\n            static BackgroundWatcher()\n            {\n                EditorApplication.playModeStateChanged += OnPlayModeStateChanged;\n            }\n\n            private static void OnPlayModeStateChanged(PlayModeStateChange state)\n            {\n                if (!PlaymodeTestsController.IsControllerOnScene())\n                    return;\n                var runner = PlaymodeTestsController.GetController();\n                if (runner == null)\n                    return;\n                if (state == PlayModeStateChange.ExitingPlayMode)\n                {\n                    AssetDatabase.DeleteAsset(runner.settings.bootstrapScene);\n                    ExecutePostBuildCleanupMethods(runner.m_Runner.LoadedTest, runner.settings.filter.BuildNUnitFilter(), Application.platform);\n                    IsRunning = false;\n                }\n                else if (state == PlayModeStateChange.EnteredEditMode)\n                {\n                    //reopen the original scene once we exit playmode\n                    ReopenOriginalScene(runner);\n                }\n            }\n        }\n\n        protected static void ReopenOriginalScene(PlaymodeTestsController runner)\n        {\n            ReopenOriginalScene(runner.settings.originalScene);\n        }\n\n        public void AddEventHandler<T>() where T : ScriptableObject, ITestRunnerListener\n        {\n            m_EventHandlers.Add(typeof(T));\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/PlaymodeLauncher.cs.meta",
    "content": "fileFormatVersion: 2\nguid: d3217d58bbd1d2b4aaee933e2e8b9195\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/PostbuildCleanupAttributeFinder.cs",
    "content": "using UnityEngine.TestTools;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    internal class PostbuildCleanupAttributeFinder : AttributeFinderBase<IPostBuildCleanup, PostBuildCleanupAttribute>\n    {\n        public PostbuildCleanupAttributeFinder() : base(attribute => attribute.TargetClass) {}\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/PostbuildCleanupAttributeFinder.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 2c2dfcbbb77359547bcaa7cdabd47ebb\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/PrebuildSetupAttributeFinder.cs",
    "content": "using UnityEngine.TestTools;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    internal class PrebuildSetupAttributeFinder : AttributeFinderBase<IPrebuildSetup, PrebuildSetupAttribute>\n    {\n        public PrebuildSetupAttributeFinder() : base((attribute) => attribute.TargetClass) {}\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/PrebuildSetupAttributeFinder.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 3c4ccfb0896bcf44da13e152b267aa49\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/RemotePlayerLogController.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing UnityEditor.DeploymentTargets;\nusing UnityEditor.TestTools.TestRunner.CommandLineTest;\nusing UnityEngine;\n\nnamespace UnityEditor.TestRunner.TestLaunchers\n{\n    [Serializable]\n    internal class RemotePlayerLogController : ScriptableSingleton<RemotePlayerLogController>\n    {\n        private List<LogWriter> m_LogWriters;\n\n        private Dictionary<string, DeploymentTargetLogger> m_Loggers;\n\n        private string m_DeviceLogsDirectory;\n\n        public void SetBuildTarget(BuildTarget buildTarget)\n        {\n            m_Loggers = GetDeploymentTargetLoggers(buildTarget);\n        }\n\n        public void SetLogsDirectory(string dir)\n        {\n            m_DeviceLogsDirectory = dir;\n        }\n\n        public void StartLogWriters()\n        {\n            if (m_DeviceLogsDirectory == null || m_Loggers == null)\n                return;\n\n            m_LogWriters = new List<LogWriter>();\n\n            foreach (var logger in m_Loggers)\n            {\n                m_LogWriters.Add(new LogWriter(m_DeviceLogsDirectory, logger.Key, logger.Value));\n                logger.Value.Start();\n            }\n        }\n\n        public void StopLogWriters()\n        {\n            if (m_LogWriters == null)\n                return;\n\n            foreach (var logWriter in m_LogWriters)\n            {\n                logWriter.Stop();\n            }\n        }\n\n        private Dictionary<string, DeploymentTargetLogger> GetDeploymentTargetLoggers(BuildTarget buildTarget)\n        {\n            DeploymentTargetManager deploymentTargetManager;\n\n            try\n            {\n                deploymentTargetManager = DeploymentTargetManager.CreateInstance(EditorUserBuildSettings.activeBuildTargetGroup, buildTarget);\n            }\n            catch (NotSupportedException ex)\n            {\n                Debug.Log(ex.Message);\n                Debug.Log(\"Deployment target logger not initialised\");\n                return null;\n            }\n\n            var targets = deploymentTargetManager.GetKnownTargets();\n            var loggers = new Dictionary<string, DeploymentTargetLogger>();\n\n            foreach (var target in targets)\n            {\n                if (target.status != DeploymentTargetStatus.Ready) continue;\n\n                var logger = deploymentTargetManager.GetTargetLogger(target.id);\n                logger.Clear();\n                loggers.Add(target.id, logger);\n            }\n\n            return loggers;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/RemotePlayerLogController.cs.meta",
    "content": "fileFormatVersion: 2\nguid: edd2a1fe1acbbde43aad39862bb3f4a8\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/RemotePlayerTestController.cs",
    "content": "using System;\nusing UnityEditor.Networking.PlayerConnection;\nusing UnityEditor.TestTools.TestRunner;\nusing UnityEditor.TestTools.TestRunner.Api;\nusing UnityEditor.TestTools.TestRunner.UnityTestProtocol;\nusing UnityEngine;\nusing UnityEngine.Networking.PlayerConnection;\nusing UnityEngine.TestRunner.TestLaunchers;\n\nnamespace UnityEditor.TestRunner.TestLaunchers\n{\n    [Serializable]\n    internal class RemoteTestRunController : ScriptableSingleton<RemoteTestRunController>\n    {\n        [SerializeField]\n        private RemoteTestResultReciever m_RemoteTestResultReciever;\n\n        [SerializeField]\n        private PlatformSpecificSetup m_PlatformSpecificSetup;\n\n        [SerializeField]\n        private bool m_RegisteredConnectionCallbacks;\n\n        public void Init(BuildTarget buildTarget)\n        {\n            m_PlatformSpecificSetup = new PlatformSpecificSetup(buildTarget);\n            m_PlatformSpecificSetup.Setup();\n            m_RemoteTestResultReciever = new RemoteTestResultReciever();\n            EditorConnection.instance.Initialize();\n            if (!m_RegisteredConnectionCallbacks)\n            {\n                EditorConnection.instance.Initialize();\n                DelegateEditorConnectionEvents();\n            }\n        }\n\n        private void DelegateEditorConnectionEvents()\n        {\n            m_RegisteredConnectionCallbacks = true;\n            //This is needed because RemoteTestResultReciever is not a ScriptableObject\n            EditorConnection.instance.Register(PlayerConnectionMessageIds.runStartedMessageId, RunStarted);\n            EditorConnection.instance.Register(PlayerConnectionMessageIds.runFinishedMessageId, RunFinished);\n            EditorConnection.instance.Register(PlayerConnectionMessageIds.testStartedMessageId, TestStarted);\n            EditorConnection.instance.Register(PlayerConnectionMessageIds.testFinishedMessageId, TestFinished);\n        }\n\n        private void RunStarted(MessageEventArgs messageEventArgs)\n        {\n            m_RemoteTestResultReciever.RunStarted(messageEventArgs);\n            CallbacksDelegator.instance.RunStartedRemotely(messageEventArgs.data);\n        }\n\n        private void RunFinished(MessageEventArgs messageEventArgs)\n        {\n            m_RemoteTestResultReciever.RunFinished(messageEventArgs);\n            m_PlatformSpecificSetup.CleanUp();\n\n            CallbacksDelegator.instance.RunFinishedRemotely(messageEventArgs.data);\n        }\n\n        private void TestStarted(MessageEventArgs messageEventArgs)\n        {\n            CallbacksDelegator.instance.TestStartedRemotely(messageEventArgs.data);\n        }\n\n        private void TestFinished(MessageEventArgs messageEventArgs)\n        {\n            CallbacksDelegator.instance.TestFinishedRemotely(messageEventArgs.data);\n        }\n\n        public void PostBuildAction()\n        {\n            m_PlatformSpecificSetup.PostBuildAction();\n        }\n\n        public void PostSuccessfulBuildAction()\n        {\n            m_PlatformSpecificSetup.PostSuccessfulBuildAction();\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/RemotePlayerTestController.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 7d36034e63ad8254b9b2f55280fcc040\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/RemoteTestResultReciever.cs",
    "content": "using System;\nusing UnityEditor.Networking.PlayerConnection;\nusing UnityEngine;\nusing UnityEngine.Networking.PlayerConnection;\nusing UnityEngine.TestRunner.TestLaunchers;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    [Serializable]\n    internal class RemoteTestResultReciever\n    {\n        public void RunStarted(MessageEventArgs messageEventArgs)\n        {\n        }\n\n        public void RunFinished(MessageEventArgs messageEventArgs)\n        {\n            EditorConnection.instance.Send(PlayerConnectionMessageIds.runFinishedMessageId, null, messageEventArgs.playerId);\n            EditorConnection.instance.DisconnectAll();\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/RemoteTestResultReciever.cs.meta",
    "content": "fileFormatVersion: 2\nguid: fdb35ef8fc437e14fa4b6c74a0609e86\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/RuntimeTestLauncherBase.cs",
    "content": "using System;\nusing System.Linq;\nusing NUnit.Framework.Interfaces;\nusing UnityEditor.Events;\nusing UnityEditor.SceneManagement;\nusing UnityEngine;\nusing UnityEngine.SceneManagement;\nusing UnityEngine.TestRunner.NUnitExtensions.Runner;\nusing UnityEngine.TestTools;\nusing UnityEngine.TestTools.NUnitExtensions;\nusing UnityEngine.TestTools.TestRunner;\nusing UnityEngine.TestTools.Utils;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    internal abstract class RuntimeTestLauncherBase : TestLauncherBase\n    {\n        protected Scene CreateBootstrapScene(string sceneName, Action<PlaymodeTestsController> runnerSetup)\n        {\n            var scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Single);\n            var go = new GameObject(PlaymodeTestsController.kPlaymodeTestControllerName);\n\n            var editorLoadedTestAssemblyProvider = new EditorLoadedTestAssemblyProvider(new EditorCompilationInterfaceProxy(), new EditorAssembliesProxy());\n\n            var runner = go.AddComponent<PlaymodeTestsController>();\n            runnerSetup(runner);\n            runner.settings.bootstrapScene = sceneName;\n            runner.AssembliesWithTests = editorLoadedTestAssemblyProvider.GetAssembliesGroupedByType(TestPlatform.PlayMode).Select(x => x.Assembly.GetName().Name).ToList();\n\n            EditorSceneManager.MarkSceneDirty(scene);\n            AssetDatabase.SaveAssets();\n            EditorSceneManager.SaveScene(scene, sceneName, false);\n\n            return scene;\n        }\n\n        public string CreateSceneName()\n        {\n            return \"Assets/InitTestScene\" + DateTime.Now.Ticks + \".unity\";\n        }\n\n        protected UnityTestAssemblyRunner LoadTests(ITestFilter filter)\n        {\n            var editorLoadedTestAssemblyProvider = new EditorLoadedTestAssemblyProvider(new EditorCompilationInterfaceProxy(), new EditorAssembliesProxy());\n            var assembliesWithTests = editorLoadedTestAssemblyProvider.GetAssembliesGroupedByType(TestPlatform.PlayMode).Select(x => x.Assembly.GetName().Name).ToList();\n\n            var nUnitTestAssemblyRunner = new UnityTestAssemblyRunner(new UnityTestAssemblyBuilder(), null);\n            var assemblyProvider = new PlayerTestAssemblyProvider(new AssemblyLoadProxy(), assembliesWithTests);\n            nUnitTestAssemblyRunner.Load(assemblyProvider.GetUserAssemblies().Select(a => a.Assembly).ToArray(), UnityTestAssemblyBuilder.GetNUnitTestBuilderSettings(TestPlatform.PlayMode));\n            return nUnitTestAssemblyRunner;\n        }\n\n        protected static void ReopenOriginalScene(string originalSceneName)\n        {\n            EditorSceneManager.NewScene(NewSceneSetup.DefaultGameObjects);\n            if (!string.IsNullOrEmpty(originalSceneName))\n            {\n                EditorSceneManager.OpenScene(originalSceneName);\n            }\n        }\n    }\n\n    internal static class PlaymodeTestsControllerExtensions\n    {\n        internal static T AddEventHandlerMonoBehaviour<T>(this PlaymodeTestsController controller) where T : MonoBehaviour, ITestRunnerListener\n        {\n            var eventHandler = controller.gameObject.AddComponent<T>();\n            SetListeners(controller, eventHandler);\n            return eventHandler;\n        }\n\n        internal static T AddEventHandlerScriptableObject<T>(this PlaymodeTestsController controller) where T : ScriptableObject, ITestRunnerListener\n        {\n            var eventListener = ScriptableObject.CreateInstance<T>();\n            AddEventHandlerScriptableObject(controller, eventListener);\n            return eventListener;\n        }\n\n        internal static void AddEventHandlerScriptableObject(this PlaymodeTestsController controller, ITestRunnerListener obj)\n        {\n            SetListeners(controller, obj);\n        }\n\n        private static void SetListeners(PlaymodeTestsController controller, ITestRunnerListener eventHandler)\n        {\n            UnityEventTools.AddPersistentListener(controller.testStartedEvent, eventHandler.TestStarted);\n            UnityEventTools.AddPersistentListener(controller.testFinishedEvent, eventHandler.TestFinished);\n            UnityEventTools.AddPersistentListener(controller.runStartedEvent, eventHandler.RunStarted);\n            UnityEventTools.AddPersistentListener(controller.runFinishedEvent, eventHandler.RunFinished);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/RuntimeTestLauncherBase.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 0efb23ecb373b6d4bbe5217485785138\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/TestLauncherBase.cs",
    "content": "using System;\nusing NUnit.Framework.Interfaces;\nusing UnityEngine;\nusing UnityEngine.TestTools;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    internal abstract class TestLauncherBase\n    {\n        public abstract void Run();\n\n        protected virtual RuntimePlatform? TestTargetPlatform\n        {\n            get { return Application.platform; }\n        }\n\n        protected bool ExecutePreBuildSetupMethods(ITest tests, ITestFilter testRunnerFilter)\n        {\n            var attributeFinder = new PrebuildSetupAttributeFinder();\n            var logString = \"Executing setup for: {0}\";\n            return ExecuteMethods<IPrebuildSetup>(tests, testRunnerFilter, attributeFinder, logString, targetClass => targetClass.Setup(), TestTargetPlatform);\n        }\n\n        public void ExecutePostBuildCleanupMethods(ITest tests, ITestFilter testRunnerFilter)\n        {\n            ExecutePostBuildCleanupMethods(tests, testRunnerFilter, TestTargetPlatform);\n        }\n\n        public static void ExecutePostBuildCleanupMethods(ITest tests, ITestFilter testRunnerFilter, RuntimePlatform? testTargetPlatform)\n        {\n            var attributeFinder = new PostbuildCleanupAttributeFinder();\n            var logString = \"Executing cleanup for: {0}\";\n            ExecuteMethods<IPostBuildCleanup>(tests, testRunnerFilter, attributeFinder, logString, targetClass => targetClass.Cleanup(), testTargetPlatform);\n        }\n\n        private static bool ExecuteMethods<T>(ITest tests, ITestFilter testRunnerFilter, AttributeFinderBase attributeFinder, string logString, Action<T> action, RuntimePlatform? testTargetPlatform)\n        {\n            var exceptionsThrown = false;\n\n            if (testTargetPlatform == null)\n            {\n                Debug.LogError(\"Could not determine test target platform from build target \" + EditorUserBuildSettings.activeBuildTarget);\n                return true;\n            }\n\n            foreach (var targetClassType in attributeFinder.Search(tests, testRunnerFilter, testTargetPlatform.Value))\n            {\n                try\n                {\n                    var targetClass = (T)Activator.CreateInstance(targetClassType);\n\n                    Debug.LogFormat(logString, targetClassType.FullName);\n                    action(targetClass);\n                }\n                catch (InvalidCastException) {}\n                catch (Exception e)\n                {\n                    Debug.LogException(e);\n                    exceptionsThrown = true;\n                }\n            }\n\n            return exceptionsThrown;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers/TestLauncherBase.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 1cddf785b0d07434d8e0607c97b09135\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestLaunchers.meta",
    "content": "fileFormatVersion: 2\nguid: d64d92e4f04a13e4b99ea8d48e9e8ae9\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestResultSerializer.cs",
    "content": "using System;\nusing System.Reflection;\nusing System.Text;\nusing NUnit.Framework.Interfaces;\nusing NUnit.Framework.Internal;\nusing UnityEngine;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    [Serializable]\n    internal class TestResultSerializer\n    {\n        private static readonly BindingFlags flags = BindingFlags.NonPublic | BindingFlags.Public |\n            BindingFlags.Instance | BindingFlags.FlattenHierarchy;\n\n        [SerializeField] public string id;\n\n        [SerializeField] public string fullName;\n\n        [SerializeField] private double duration;\n\n        [SerializeField] private string label;\n\n        [SerializeField] private string message;\n\n        [SerializeField] private string output;\n\n        [SerializeField] private string site;\n\n        [SerializeField] private string stacktrace;\n\n        [SerializeField] private double startTimeAO;\n\n        [SerializeField] private string status;\n\n        public static TestResultSerializer MakeFromTestResult(ITestResult result)\n        {\n            var wrapper = new TestResultSerializer();\n            wrapper.id = result.Test.Id;\n            wrapper.fullName = result.FullName;\n            wrapper.status = result.ResultState.Status.ToString();\n            wrapper.label = result.ResultState.Label;\n            wrapper.site = result.ResultState.Site.ToString();\n            wrapper.output = result.Output;\n            wrapper.duration = result.Duration;\n            wrapper.stacktrace = result.StackTrace;\n            wrapper.message = result.Message;\n            wrapper.startTimeAO = result.StartTime.ToOADate();\n            return wrapper;\n        }\n\n        public void RestoreTestResult(TestResult result)\n        {\n            var resultState = new ResultState((TestStatus)Enum.Parse(typeof(TestStatus), status), label,\n                (FailureSite)Enum.Parse(typeof(FailureSite), site));\n            result.GetType().BaseType.GetField(\"_resultState\", flags).SetValue(result, resultState);\n            result.GetType().BaseType.GetField(\"_output\", flags).SetValue(result, new StringBuilder(output));\n            result.GetType().BaseType.GetField(\"_duration\", flags).SetValue(result, duration);\n            result.GetType().BaseType.GetField(\"_message\", flags).SetValue(result, message);\n            result.GetType().BaseType.GetField(\"_stackTrace\", flags).SetValue(result, stacktrace);\n            result.GetType()\n                .BaseType.GetProperty(\"StartTime\", flags)\n                .SetValue(result, DateTime.FromOADate(startTimeAO), null);\n        }\n\n        public bool IsPassed()\n        {\n            return status == TestStatus.Passed.ToString();\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestResultSerializer.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 559482fe33c79e44882d3a6cedc55fb5\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Callbacks/EditModeRunnerCallback.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing NUnit.Framework;\nusing NUnit.Framework.Interfaces;\nusing NUnit.Framework.Internal;\nusing UnityEditor.SceneManagement;\nusing UnityEngine;\nusing UnityEngine.TestTools.TestRunner;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    internal class EditModeRunnerCallback : ScriptableObject, ITestRunnerListener\n    {\n        private EditModeLauncherContextSettings m_Settings;\n        public SceneSetup[] previousSceneSetup;\n        public int undoGroup;\n        public EditModeRunner runner;\n\n        private bool m_Canceled;\n        private ITest m_CurrentTest;\n        private int m_TotalTests;\n\n        [SerializeField]\n        private List<string> m_PendingTests;\n        [SerializeField]\n        private string m_LastCountedTestName;\n        [SerializeField]\n        private bool m_RunRestarted;\n\n        public void OnDestroy()\n        {\n            CleanUp();\n        }\n\n        public void RunStarted(ITest testsToRun)\n        {\n            Setup();\n            if (m_PendingTests == null)\n            {\n                m_PendingTests = GetTestsExpectedToRun(testsToRun, runner.GetFilter());\n                m_TotalTests = m_PendingTests.Count;\n            }\n        }\n\n        public void OnEnable()\n        {\n            if (m_RunRestarted)\n            {\n                Setup();\n            }\n        }\n\n        private void Setup()\n        {\n            m_Settings = new EditModeLauncherContextSettings();\n            Application.logMessageReceivedThreaded += LogReceived;\n            EditorApplication.playModeStateChanged += WaitForExitPlaymode;\n            EditorApplication.update += DisplayProgressBar;\n            AssemblyReloadEvents.beforeAssemblyReload += BeforeAssemblyReload;\n        }\n\n        private void BeforeAssemblyReload()\n        {\n            if (m_CurrentTest != null)\n            {\n                m_LastCountedTestName = m_CurrentTest.FullName;\n                m_RunRestarted = true;\n            }\n        }\n\n        private void DisplayProgressBar()\n        {\n            if (m_CurrentTest == null)\n                return;\n            if (!m_Canceled && EditorUtility.DisplayCancelableProgressBar(\"Test Runner\", \"Running test \" + m_CurrentTest.Name, Math.Min(1.0f, (float)(m_TotalTests - m_PendingTests.Count) / m_TotalTests)))\n            {\n                EditorApplication.update -= DisplayProgressBar;\n                m_Canceled = true;\n                EditorUtility.ClearProgressBar();\n                runner.OnRunCancel();\n            }\n        }\n\n        private static void LogReceived(string message, string stacktrace, LogType type)\n        {\n            if (TestContext.Out != null)\n                TestContext.Out.WriteLine(message);\n        }\n\n        private static void WaitForExitPlaymode(PlayModeStateChange state)\n        {\n            if (state == PlayModeStateChange.EnteredEditMode)\n            {\n                EditorApplication.playModeStateChanged -= WaitForExitPlaymode;\n                //because logMessage is reset on Enter EditMode\n                //we remove and add the callback\n                //because Unity\n                Application.logMessageReceivedThreaded -= LogReceived;\n                Application.logMessageReceivedThreaded += LogReceived;\n            }\n        }\n\n        public void RunFinished(ITestResult result)\n        {\n            if (previousSceneSetup != null && previousSceneSetup.Length > 0)\n            {\n                try\n                {\n                    EditorSceneManager.RestoreSceneManagerSetup(previousSceneSetup);\n                }\n                catch (ArgumentException e)\n                {\n                    Debug.LogWarning(e.Message);\n                }\n            }\n            else\n            {\n                EditorSceneManager.NewScene(NewSceneSetup.DefaultGameObjects, NewSceneMode.Single);\n            }\n            CleanUp();\n            PerformUndo(undoGroup);\n        }\n\n        private void CleanUp()\n        {\n            m_CurrentTest = null;\n            EditorUtility.ClearProgressBar();\n            if (m_Settings != null)\n            {\n                m_Settings.Dispose();\n            }\n            Application.logMessageReceivedThreaded -= LogReceived;\n            EditorApplication.update -= DisplayProgressBar;\n        }\n\n        public void TestStarted(ITest test)\n        {\n            if (test.IsSuite || !(test is TestMethod))\n            {\n                return;\n            }\n\n            m_CurrentTest = test;\n\n            if (m_RunRestarted)\n            {\n                if (test.FullName == m_LastCountedTestName)\n                    m_RunRestarted = false;\n            }\n        }\n\n        public void TestFinished(ITestResult result)\n        {\n            if (result.Test is TestMethod)\n            {\n                m_PendingTests.Remove(result.Test.FullName);\n            }\n        }\n\n        private static void PerformUndo(int undoGroup)\n        {\n            EditorUtility.DisplayProgressBar(\"Undo\", \"Reverting changes to the scene\", 0);\n            var undoStartTime = DateTime.Now;\n            Undo.RevertAllDownToGroup(undoGroup);\n            if ((DateTime.Now - undoStartTime).TotalSeconds > 1)\n                Debug.LogWarning(\"Undo after editor test run took \" + (DateTime.Now - undoStartTime).Seconds + \" seconds.\");\n            EditorUtility.ClearProgressBar();\n        }\n\n        private static List<string> GetTestsExpectedToRun(ITest test, ITestFilter filter)\n        {\n            var expectedTests = new List<string>();\n\n            if (filter.Pass(test))\n            {\n                if (test.IsSuite)\n                {\n                    expectedTests.AddRange(test.Tests.SelectMany(subTest => GetTestsExpectedToRun(subTest, filter)));\n                }\n                else\n                {\n                    expectedTests.Add(test.FullName);\n                }\n            }\n\n            return expectedTests;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Callbacks/EditModeRunnerCallback.cs.meta",
    "content": "fileFormatVersion: 2\nguid: cc456ba93311a3a43ad896449fee9868\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallback.cs",
    "content": "using UnityEditor.TestTools.TestRunner.Api;\nusing UnityEditor.TestTools.TestRunner.CommandLineTest;\nusing UnityEngine.TestTools.TestRunner.GUI;\nusing UnityEngine;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    internal class RerunCallback : ScriptableObject, ICallbacks\n    {\n        public static bool useMockRunFilter = false;\n        public static TestRunnerFilter mockRunFilter = null;\n\n        public void RunFinished(ITestResultAdaptor result)\n        {\n            if (RerunCallbackData.instance.runFilter == null)\n                RerunCallbackData.instance.runFilter = new TestRunnerFilter(); \n\n            var runFilter = RerunCallbackData.instance.runFilter;\n\n            if (useMockRunFilter)\n            {\n                runFilter = mockRunFilter;\n            }\n\n            runFilter.testRepetitions--;\n            if (runFilter.testRepetitions <= 0 || result.TestStatus != TestStatus.Passed)\n            {\n                ExitCallbacks.preventExit = false;\n                return;\n            }\n\n            ExitCallbacks.preventExit = true;\n            if (EditorApplication.isPlaying)\n            {\n                EditorApplication.playModeStateChanged += WaitForExitPlaymode;\n                return;\n            }\n\n            if (!useMockRunFilter)\n            {\n                ExecuteTestRunnerAPI();\n            }\n        }\n\n        private static void WaitForExitPlaymode(PlayModeStateChange state)\n        {\n            if (state == PlayModeStateChange.EnteredEditMode)\n            {\n                ExecuteTestRunnerAPI();\n            }\n        }\n\n        private static void ExecuteTestRunnerAPI()\n        {\n            var runFilter = RerunCallbackData.instance.runFilter;\n            var testMode = RerunCallbackData.instance.testMode;\n\n            var testRunnerApi = ScriptableObject.CreateInstance<TestRunnerApi>();\n            testRunnerApi.Execute(new Api.ExecutionSettings()\n            {\n                filter = new Filter()\n                {\n                    categoryNames = runFilter.categoryNames,\n                    groupNames = runFilter.groupNames,\n                    testMode = testMode,\n                    testNames = runFilter.testNames\n                }\n            });\n        }\n\n        public void TestStarted(ITestAdaptor test)\n        {\n        }\n\n        public void TestFinished(ITestResultAdaptor result)\n        {\n        }\n\n        public void RunStarted(ITestAdaptor testsToRun)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallback.cs.meta",
    "content": "fileFormatVersion: 2\nguid: b7ff2b2e91321ff4381d4ab45870a32e\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallbackData.cs",
    "content": "using UnityEditor.TestTools.TestRunner.Api;\nusing UnityEngine;\nusing UnityEngine.TestTools.TestRunner.GUI;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    internal class RerunCallbackData : ScriptableSingleton<RerunCallbackData>\n    {\n        [SerializeField]\n        internal TestRunnerFilter runFilter;\n\n        [SerializeField]\n        internal TestMode testMode;\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallbackData.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 087cba9fa6ac867479a0b0fdc0a5864b\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallbackInitializer.cs",
    "content": "using UnityEngine;\nusing UnityEditor.TestTools.TestRunner.Api;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    [InitializeOnLoad]\n    static class RerunCallbackInitializer\n    {\n        static RerunCallbackInitializer()\n        {\n            var testRunnerApi = ScriptableObject.CreateInstance<TestRunnerApi>();\n\n            var rerunCallback = ScriptableObject.CreateInstance<RerunCallback>();\n            testRunnerApi.RegisterCallbacks<RerunCallback>(rerunCallback);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallbackInitializer.cs.meta",
    "content": "fileFormatVersion: 2\nguid: f73fc901e4b0f2d4daf11f46506054ba\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Callbacks/TestRunnerCallback.cs",
    "content": "using NUnit.Framework.Interfaces;\nusing UnityEngine;\nusing UnityEngine.TestTools.TestRunner;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    internal class TestRunnerCallback : ScriptableObject, ITestRunnerListener\n    {\n        public void RunStarted(ITest testsToRun)\n        {\n            EditorApplication.playModeStateChanged += OnPlayModeStateChanged;\n        }\n\n        private void OnPlayModeStateChanged(PlayModeStateChange state)\n        {\n            if (state == PlayModeStateChange.ExitingPlayMode)\n            {\n                EditorApplication.playModeStateChanged -= OnPlayModeStateChanged;\n                //We need to make sure we don't block NUnit thread in case we exit PlayMode earlier\n                PlaymodeTestsController.TryCleanup();\n            }\n        }\n\n        public void RunFinished(ITestResult testResults)\n        {\n            EditorApplication.isPlaying = false;\n        }\n\n        public void TestStarted(ITest testName)\n        {\n        }\n\n        public void TestFinished(ITestResult test)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Callbacks/TestRunnerCallback.cs.meta",
    "content": "fileFormatVersion: 2\nguid: d44e6804bc58be84ea71a619b468f150\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Callbacks/WindowResultUpdater.cs",
    "content": "using UnityEditor.TestTools.TestRunner.Api;\n\nnamespace UnityEditor.TestTools.TestRunner.GUI\n{\n    internal class WindowResultUpdater : ICallbacks\n    {\n        public void RunStarted(ITestAdaptor testsToRun)\n        {\n        }\n\n        public void RunFinished(ITestResultAdaptor testResults)\n        {\n            if (TestRunnerWindow.s_Instance != null)\n            {\n                TestRunnerWindow.s_Instance.RebuildUIFilter();\n            }\n        }\n\n        public void TestStarted(ITestAdaptor testName)\n        {\n        }\n\n        public void TestFinished(ITestResultAdaptor test)\n        {\n            if (TestRunnerWindow.s_Instance == null)\n                return;\n\n            var result = new TestRunnerResult(test);\n            TestRunnerWindow.s_Instance.m_SelectedTestTypes.UpdateResult(result);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Callbacks/WindowResultUpdater.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 6d468ee3657be7a43a2ef2178ec14239\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Callbacks.meta",
    "content": "fileFormatVersion: 2\nguid: 5d7f0d6acfced954682a89e7002c04d9\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/EditModePCHelper.cs",
    "content": "using System.Collections;\nusing System.Reflection;\nusing UnityEngine.TestTools;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    internal class EditModePcHelper : TestCommandPcHelper\n    {\n        public override void SetEnumeratorPC(IEnumerator enumerator, int pc)\n        {\n            GetPCFieldInfo(enumerator).SetValue(enumerator, pc);\n        }\n\n        public override int GetEnumeratorPC(IEnumerator enumerator)\n        {\n            if (enumerator == null)\n            {\n                return 0;\n            }\n            return (int)GetPCFieldInfo(enumerator).GetValue(enumerator);\n        }\n\n        private FieldInfo GetPCFieldInfo(IEnumerator enumerator)\n        {\n            var field = enumerator.GetType().GetField(\"$PC\", BindingFlags.NonPublic | BindingFlags.Instance);\n            if (field == null) // Roslyn\n                field = enumerator.GetType().GetField(\"<>1__state\", BindingFlags.NonPublic | BindingFlags.Instance);\n\n            return field;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/EditModePCHelper.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 6d16f2e78a356d34c9a32108929de932\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/EditModeRunner.cs",
    "content": "using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\nusing NUnit.Framework.Interfaces;\nusing NUnit.Framework.Internal;\nusing UnityEngine;\nusing UnityEngine.TestTools.NUnitExtensions;\nusing UnityEngine.TestTools.TestRunner;\nusing UnityEngine.TestTools;\nusing UnityEngine.TestTools.TestRunner.GUI;\nusing UnityEditor.Callbacks;\nusing UnityEngine.TestRunner.NUnitExtensions;\nusing UnityEngine.TestRunner.NUnitExtensions.Runner;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    internal interface IUnityTestAssemblyRunnerFactory\n    {\n        IUnityTestAssemblyRunner Create(TestPlatform testPlatform, WorkItemFactory factory);\n    }\n\n    internal class UnityTestAssemblyRunnerFactory : IUnityTestAssemblyRunnerFactory\n    {\n        public IUnityTestAssemblyRunner Create(TestPlatform testPlatform, WorkItemFactory factory)\n        {\n            return new UnityTestAssemblyRunner(new UnityTestAssemblyBuilder(), factory);\n        }\n    }\n\n    [Serializable]\n    internal class EditModeRunner : ScriptableObject, IDisposable\n    {\n        [SerializeField]\n        private TestRunnerFilter m_Filter;\n\n        //The counter from the IEnumerator object\n        [SerializeField]\n        private int m_CurrentPC;\n\n        [SerializeField]\n        private bool m_ExecuteOnEnable;\n\n        [SerializeField]\n        private List<string> m_AlreadyStartedTests;\n\n        [SerializeField]\n        private List<TestResultSerializer> m_ExecutedTests;\n\n        [SerializeField]\n        private List<ScriptableObject> m_CallbackObjects = new List<ScriptableObject>();\n\n        [SerializeField]\n        private TestStartedEvent m_TestStartedEvent = new TestStartedEvent();\n\n        [SerializeField]\n        private TestFinishedEvent m_TestFinishedEvent = new TestFinishedEvent();\n\n        [SerializeField]\n        private RunStartedEvent m_RunStartedEvent = new RunStartedEvent();\n\n        [SerializeField]\n        private RunFinishedEvent m_RunFinishedEvent = new RunFinishedEvent();\n\n        [SerializeField]\n        private TestRunnerStateSerializer m_TestRunnerStateSerializer = new TestRunnerStateSerializer();\n\n        [SerializeField]\n        private TestFileCleanupVerifier m_CleanupVerifier = new TestFileCleanupVerifier();\n\n        [SerializeField]\n        private bool m_RunningTests;\n\n        [SerializeField]\n        private TestPlatform m_TestPlatform;\n\n        [SerializeField]\n        private object m_CurrentYieldObject;\n\n        [SerializeField]\n        private BeforeAfterTestCommandState m_SetUpTearDownState;\n        [SerializeField]\n        private BeforeAfterTestCommandState m_OuterUnityTestActionState;\n\n        internal IUnityTestAssemblyRunner m_Runner;\n\n        private ConstructDelegator m_ConstructDelegator;\n\n        private IEnumerator m_RunStep;\n\n        public IUnityTestAssemblyRunnerFactory UnityTestAssemblyRunnerFactory { get; set; }\n\n        public void Init(TestRunnerFilter filter, TestPlatform platform)\n        {\n            m_Filter = filter;\n            m_TestPlatform = platform;\n            m_AlreadyStartedTests = new List<string>();\n            m_ExecutedTests = new List<TestResultSerializer>();\n            InitRunner();\n        }\n\n        private void InitRunner()\n        {\n            //We give the EditMode platform here so we dont suddenly create Playmode work items in the test Runner.\n            m_Runner = (UnityTestAssemblyRunnerFactory ?? new UnityTestAssemblyRunnerFactory()).Create(TestPlatform.EditMode, new EditmodeWorkItemFactory());\n            var testAssemblyProvider = new EditorLoadedTestAssemblyProvider(new EditorCompilationInterfaceProxy(), new EditorAssembliesProxy());\n            var loadedTests = m_Runner.Load(\n                testAssemblyProvider.GetAssembliesGroupedByType(m_TestPlatform).Select(x => x.Assembly).ToArray(),\n                UnityTestAssemblyBuilder.GetNUnitTestBuilderSettings(m_TestPlatform));\n            loadedTests.ParseForNameDuplicates();\n            hideFlags |= HideFlags.DontSave;\n            EnumerableSetUpTearDownCommand.ActivePcHelper = new EditModePcHelper();\n            OuterUnityTestActionCommand.ActivePcHelper = new EditModePcHelper();\n        }\n\n        public void OnEnable()\n        {\n            if (m_ExecuteOnEnable)\n            {\n                InitRunner();\n                m_ExecuteOnEnable = false;\n                foreach (var callback in m_CallbackObjects)\n                {\n                    AddListeners(callback as ITestRunnerListener);\n                }\n                m_ConstructDelegator = new ConstructDelegator(m_TestRunnerStateSerializer);\n\n                EnumeratorStepHelper.SetEnumeratorPC(m_CurrentPC);\n\n                UnityWorkItemDataHolder.alreadyExecutedTests = m_ExecutedTests.Select(x => x.fullName).ToList();\n                UnityWorkItemDataHolder.alreadyStartedTests = m_AlreadyStartedTests;\n                Run();\n            }\n        }\n\n        public void TestStartedEvent(ITest test)\n        {\n            m_AlreadyStartedTests.Add(test.FullName);\n        }\n\n        public void TestFinishedEvent(ITestResult testResult)\n        {\n            m_AlreadyStartedTests.Remove(testResult.FullName);\n            m_ExecutedTests.Add(TestResultSerializer.MakeFromTestResult(testResult));\n        }\n\n        public void Run()\n        {\n            EditModeTestCallbacks.RestoringTestContext += OnRestoringTest;\n            var context = m_Runner.GetCurrentContext();\n            if (m_SetUpTearDownState == null)\n            {\n                m_SetUpTearDownState = CreateInstance<BeforeAfterTestCommandState>();\n            }\n            context.SetUpTearDownState = m_SetUpTearDownState;\n\n            if (m_OuterUnityTestActionState == null)\n            {\n                m_OuterUnityTestActionState = CreateInstance<BeforeAfterTestCommandState>();\n            }\n            context.OuterUnityTestActionState = m_OuterUnityTestActionState;\n\n            m_CleanupVerifier.RegisterExistingFiles();\n\n            if (!m_RunningTests)\n            {\n                m_RunStartedEvent.Invoke(m_Runner.LoadedTest);\n            }\n\n            if (m_ConstructDelegator == null)\n                m_ConstructDelegator = new ConstructDelegator(m_TestRunnerStateSerializer);\n\n            Reflect.ConstructorCallWrapper = m_ConstructDelegator.Delegate;\n            m_TestStartedEvent.AddListener(TestStartedEvent);\n            m_TestFinishedEvent.AddListener(TestFinishedEvent);\n\n            AssemblyReloadEvents.beforeAssemblyReload += OnBeforeAssemblyReload;\n\n            RunningTests = true;\n\n            EditorApplication.LockReloadAssemblies();\n\n            var testListenerWrapper = new TestListenerWrapper(m_TestStartedEvent, m_TestFinishedEvent);\n            m_RunStep = m_Runner.Run(testListenerWrapper, m_Filter.BuildNUnitFilter()).GetEnumerator();\n            m_RunningTests = true;\n\n            EditorApplication.update += TestConsumer;\n        }\n\n        private void OnBeforeAssemblyReload()\n        {\n            EditorApplication.update -= TestConsumer;\n\n            if (m_ExecuteOnEnable)\n            {\n                AssemblyReloadEvents.beforeAssemblyReload -= OnBeforeAssemblyReload;\n                return;\n            }\n\n            if (m_Runner != null && m_Runner.TopLevelWorkItem != null)\n                m_Runner.TopLevelWorkItem.ResultedInDomainReload = true;\n\n            if (RunningTests)\n            {\n                Debug.LogError(\"TestRunner: Unexpected assembly reload happened while running tests\");\n\n                EditorUtility.ClearProgressBar();\n\n                if (m_Runner.GetCurrentContext() != null && m_Runner.GetCurrentContext().CurrentResult != null)\n                {\n                    m_Runner.GetCurrentContext().CurrentResult.SetResult(ResultState.Cancelled, \"Unexpected assembly reload happened\");\n                }\n                OnRunCancel();\n            }\n        }\n\n        private bool RunningTests;\n\n        private Stack<IEnumerator> StepStack = new Stack<IEnumerator>();\n\n        private bool MoveNextAndUpdateYieldObject()\n        {\n            var result = m_RunStep.MoveNext();\n\n            if (result)\n            {\n                m_CurrentYieldObject = m_RunStep.Current;\n                while (m_CurrentYieldObject is IEnumerator)    // going deeper\n                {\n                    var currentEnumerator = (IEnumerator)m_CurrentYieldObject;\n\n                    // go deeper and add parent to stack\n                    StepStack.Push(m_RunStep);\n\n                    m_RunStep = currentEnumerator;\n                    m_CurrentYieldObject = m_RunStep.Current;\n                }\n\n                if (StepStack.Count > 0 && m_CurrentYieldObject != null)    // not null and not IEnumerator, nested\n                {\n                    Debug.LogError(\"EditMode test can only yield null, but not <\" + m_CurrentYieldObject.GetType().Name + \">\");\n                }\n\n                return true;\n            }\n\n            if (StepStack.Count == 0)       // done\n                return false;\n\n            m_RunStep = StepStack.Pop();    // going up\n            return MoveNextAndUpdateYieldObject();\n        }\n\n        private void TestConsumer()\n        {\n            var moveNext = MoveNextAndUpdateYieldObject();\n\n            if (m_CurrentYieldObject != null)\n            {\n                InvokeDelegator();\n            }\n\n            if (!moveNext && !m_Runner.IsTestComplete)\n            {\n                CompleteTestRun();\n                throw new IndexOutOfRangeException(\"There are no more elements to process and IsTestComplete is false\");\n            }\n\n            if (m_Runner.IsTestComplete)\n            {\n                CompleteTestRun();\n            }\n        }\n\n        private void CompleteTestRun()\n        {\n            EditorApplication.update -= TestConsumer;\n            TestLauncherBase.ExecutePostBuildCleanupMethods(this.GetLoadedTests(), this.GetFilter(), Application.platform);\n            m_CleanupVerifier.VerifyNoNewFilesAdded();\n            m_RunFinishedEvent.Invoke(m_Runner.Result);\n\n            if (m_ConstructDelegator != null)\n                m_ConstructDelegator.DestroyCurrentTestObjectIfExists();\n            Dispose();\n            UnityWorkItemDataHolder.alreadyExecutedTests = null;\n        }\n\n        private void OnRestoringTest()\n        {\n            var item = m_ExecutedTests.Find(t => t.fullName == UnityTestExecutionContext.CurrentContext.CurrentTest.FullName);\n            if (item != null)\n            {\n                item.RestoreTestResult(UnityTestExecutionContext.CurrentContext.CurrentResult);\n            }\n        }\n\n        private static bool IsCancelled()\n        {\n            return UnityTestExecutionContext.CurrentContext.ExecutionStatus == TestExecutionStatus.AbortRequested || UnityTestExecutionContext.CurrentContext.ExecutionStatus == TestExecutionStatus.StopRequested;\n        }\n\n        private void InvokeDelegator()\n        {\n            if (m_CurrentYieldObject == null)\n            {\n                return;\n            }\n\n            if (IsCancelled())\n            {\n                return;\n            }\n\n            if (m_CurrentYieldObject is RestoreTestContextAfterDomainReload)\n            {\n                if (m_TestRunnerStateSerializer.ShouldRestore())\n                {\n                    m_TestRunnerStateSerializer.RestoreContext();\n                }\n\n                return;\n            }\n\n            try\n            {\n                if (m_CurrentYieldObject is IEditModeTestYieldInstruction)\n                {\n                    var editModeTestYieldInstruction = (IEditModeTestYieldInstruction)m_CurrentYieldObject;\n                    if (editModeTestYieldInstruction.ExpectDomainReload)\n                    {\n                        PrepareForDomainReload();\n                    }\n                    return;\n                }\n            }\n            catch (Exception e)\n            {\n                UnityTestExecutionContext.CurrentContext.CurrentResult.RecordException(e);\n                return;\n            }\n\n            Debug.LogError(\"EditMode test can only yield null\");\n        }\n\n        private void CompilationFailureWatch()\n        {\n            if (EditorApplication.isCompiling)\n                return;\n\n            EditorApplication.update -= CompilationFailureWatch;\n\n            if (EditorUtility.scriptCompilationFailed)\n            {\n                EditorUtility.ClearProgressBar();\n                OnRunCancel();\n            }\n        }\n\n        private void PrepareForDomainReload()\n        {\n            m_TestRunnerStateSerializer.SaveContext();\n            m_CurrentPC = EnumeratorStepHelper.GetEnumeratorPC(TestEnumerator.Enumerator);\n            m_ExecuteOnEnable = true;\n\n            RunningTests = false;\n        }\n\n        public T AddEventHandler<T>() where T : ScriptableObject, ITestRunnerListener\n        {\n            var eventHandler = CreateInstance<T>();\n            eventHandler.hideFlags |= HideFlags.DontSave;\n            m_CallbackObjects.Add(eventHandler);\n\n            AddListeners(eventHandler);\n\n            return eventHandler;\n        }\n\n        private void AddListeners(ITestRunnerListener eventHandler)\n        {\n            m_TestStartedEvent.AddListener(eventHandler.TestStarted);\n            m_TestFinishedEvent.AddListener(eventHandler.TestFinished);\n            m_RunStartedEvent.AddListener(eventHandler.RunStarted);\n            m_RunFinishedEvent.AddListener(eventHandler.RunFinished);\n        }\n\n        public void Dispose()\n        {\n            Reflect.MethodCallWrapper = null;\n            EditorApplication.update -= TestConsumer;\n\n            DestroyImmediate(this);\n\n            if (m_CallbackObjects != null)\n            {\n                foreach (var obj in m_CallbackObjects)\n                {\n                    DestroyImmediate(obj);\n                }\n                m_CallbackObjects.Clear();\n            }\n            RunningTests = false;\n            EditorApplication.UnlockReloadAssemblies();\n        }\n\n        public void OnRunCancel()\n        {\n            UnityWorkItemDataHolder.alreadyExecutedTests = null;\n            m_ExecuteOnEnable = false;\n            m_Runner.StopRun();\n        }\n\n        public ITest GetLoadedTests()\n        {\n            return m_Runner.LoadedTest;\n        }\n\n        public ITestFilter GetFilter()\n        {\n            return m_Filter.BuildNUnitFilter();\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/EditModeRunner.cs.meta",
    "content": "fileFormatVersion: 2\nguid: c9219e99d466b7741a057132d1994f35\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/EditmodeWorkItemFactory.cs",
    "content": "using NUnit.Framework.Interfaces;\nusing NUnit.Framework.Internal;\nusing UnityEngine.TestRunner.NUnitExtensions.Runner;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    internal class EditmodeWorkItemFactory : WorkItemFactory\n    {\n        protected override UnityWorkItem Create(TestMethod method, ITestFilter filter, ITest loadedTest)\n        {\n            return new EditorEnumeratorTestWorkItem(method, filter);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/EditmodeWorkItemFactory.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 3dde15f260b0dd1469e60d16eaa795dc\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/EditorEnumeratorTestWorkItem.cs",
    "content": "using System;\nusing System.Collections;\nusing NUnit.Framework.Interfaces;\nusing NUnit.Framework.Internal;\nusing NUnit.Framework.Internal.Commands;\nusing NUnit.Framework.Internal.Execution;\nusing UnityEngine;\nusing UnityEngine.TestRunner.NUnitExtensions.Runner;\nusing UnityEngine.TestTools;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    internal class EditorEnumeratorTestWorkItem : UnityWorkItem\n    {\n        private TestCommand m_Command;\n\n        public EditorEnumeratorTestWorkItem(TestMethod test, ITestFilter filter)\n            : base(test, null)\n        {\n            m_Command = test.RunState == RunState.Runnable || test.RunState == RunState.Explicit && filter.IsExplicitMatch(test)\n                ? CommandBuilder.MakeTestCommand(test)\n                : CommandBuilder.MakeSkipCommand(test);\n        }\n\n        private static IEnumerableTestMethodCommand FindFirstIEnumerableTestMethodCommand(TestCommand command)\n        {\n            if (command == null)\n            {\n                return null;\n            }\n\n            if (command is IEnumerableTestMethodCommand)\n            {\n                return (IEnumerableTestMethodCommand)command;\n            }\n\n            if (command is DelegatingTestCommand)\n            {\n                var delegatingTestCommand = (DelegatingTestCommand)command;\n                return FindFirstIEnumerableTestMethodCommand(delegatingTestCommand.GetInnerCommand());\n            }\n            return null;\n        }\n\n        protected override IEnumerable PerformWork()\n        {\n            if (IsCancelledRun())\n            {\n                yield break;\n            }\n\n            if (m_DontRunRestoringResult)\n            {\n                if (EditModeTestCallbacks.RestoringTestContext == null)\n                {\n                    throw new NullReferenceException(\"RestoringTestContext is not set\");\n                }\n                EditModeTestCallbacks.RestoringTestContext();\n                Result = Context.CurrentResult;\n                yield break;\n            }\n\n            try\n            {\n                if (IsCancelledRun())\n                {\n                    yield break;\n                }\n\n                if (m_Command is SkipCommand)\n                {\n                    m_Command.Execute(Context);\n                    Result = Context.CurrentResult;\n                    yield break;\n                }\n\n                //Check if we can execute this test\n                var firstEnumerableCommand = FindFirstIEnumerableTestMethodCommand(m_Command);\n                if (firstEnumerableCommand == null)\n                {\n                    Context.CurrentResult.SetResult(ResultState.Error, \"Returning IEnumerator but not using test attribute supporting this\");\n                    yield break;\n                }\n\n                if (m_Command.Test.Method.ReturnType.IsType(typeof(IEnumerator)))\n                {\n                    if (m_Command is ApplyChangesToContextCommand)\n                    {\n                        var applyChangesToContextCommand = ((ApplyChangesToContextCommand)m_Command);\n                        applyChangesToContextCommand.ApplyChanges(Context);\n                        m_Command = applyChangesToContextCommand.GetInnerCommand();\n                    }\n\n                    var innerCommand = (IEnumerableTestMethodCommand)m_Command;\n                    if (innerCommand == null)\n                    {\n                        Debug.Log(\"failed getting innerCommand\");\n                        throw new Exception(\"Tests returning IEnumerator can only use test attributes handling those\");\n                    }\n\n                    foreach (var workItemStep in innerCommand.ExecuteEnumerable(Context))\n                    {\n                        if (IsCancelledRun())\n                        {\n                            yield break;\n                        }\n\n                        if (workItemStep is TestEnumerator)\n                        {\n                            if (EnumeratorStepHelper.UpdateEnumeratorPcIfNeeded(TestEnumerator.Enumerator))\n                            {\n                                yield return new RestoreTestContextAfterDomainReload();\n                            }\n                            continue;\n                        }\n\n                        if (workItemStep is AsyncOperation)\n                        {\n                            var asyncOperation = (AsyncOperation)workItemStep;\n                            while (!asyncOperation.isDone)\n                            {\n                                if (IsCancelledRun())\n                                {\n                                    yield break;\n                                }\n\n                                yield return null;\n                            }\n                            continue;\n                        }\n\n                        ResultedInDomainReload = false;\n\n                        if (workItemStep is IEditModeTestYieldInstruction)\n                        {\n                            var editModeTestYieldInstruction = (IEditModeTestYieldInstruction)workItemStep;\n                            yield return editModeTestYieldInstruction;\n                            var enumerator = editModeTestYieldInstruction.Perform();\n                            while (true)\n                            {\n                                bool moveNext;\n                                try\n                                {\n                                    moveNext = enumerator.MoveNext();\n                                }\n                                catch (Exception e)\n                                {\n                                    Context.CurrentResult.RecordException(e);\n                                    break;\n                                }\n\n                                if (!moveNext)\n                                {\n                                    break;\n                                }\n                                yield return null;\n                            }\n                        }\n                        else\n                        {\n                            yield return workItemStep;\n                        }\n                    }\n\n                    Result = Context.CurrentResult;\n                    EditorApplication.isPlaying = false;\n                    yield return null;\n                }\n            }\n            finally\n            {\n                WorkItemComplete();\n            }\n        }\n\n        private bool IsCancelledRun()\n        {\n            return Context.ExecutionStatus == TestExecutionStatus.AbortRequested || Context.ExecutionStatus == TestExecutionStatus.StopRequested;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/EditorEnumeratorTestWorkItem.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 1ebc1994f9a3d5649a1201d3a84b38df\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/EnumeratorStepHelper.cs",
    "content": "using System.Collections;\nusing System.Reflection;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    internal class EnumeratorStepHelper\n    {\n        private static int m_PC;\n\n        public static void SetEnumeratorPC(int pc)\n        {\n            m_PC = pc;\n        }\n\n        /// <summary>\n        /// Gets the current enumerator PC\n        /// </summary>\n        /// <returns>\n        /// The PC\n        /// 0 if no current Enumeration\n        /// </returns>\n        public static int GetEnumeratorPC(IEnumerator enumerator)\n        {\n            if (enumerator == null)\n            {\n                return 0;\n            }\n            return (int)GetPCFieldInfo(enumerator).GetValue(enumerator);\n        }\n\n        public static bool UpdateEnumeratorPcIfNeeded(IEnumerator enumerator)\n        {\n            if (m_PC > 0)\n            {\n                GetPCFieldInfo(enumerator).SetValue(enumerator, m_PC);\n                m_PC = 0;\n                return true;\n            }\n            return false;\n        }\n\n        private static FieldInfo GetPCFieldInfo(IEnumerator enumerator)\n        {\n            var field = enumerator.GetType().GetField(\"$PC\", BindingFlags.NonPublic | BindingFlags.Instance);\n            if (field == null) // Roslyn\n                field = enumerator.GetType().GetField(\"<>1__state\", BindingFlags.NonPublic | BindingFlags.Instance);\n\n            return field;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/EnumeratorStepHelper.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 901b761c5c1e22d4e8a3ba7d95bc1f5d\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Messages/EnterPlayMode.cs",
    "content": "using System;\nusing System.Collections;\nusing UnityEditor;\n\nnamespace UnityEngine.TestTools\n{\n    public class EnterPlayMode : IEditModeTestYieldInstruction\n    {\n        public bool ExpectDomainReload { get; }\n        public bool ExpectedPlaymodeState { get; private set; }\n\n        public EnterPlayMode(bool expectDomainReload = true)\n        {\n            ExpectDomainReload = expectDomainReload;\n        }\n\n        public IEnumerator Perform()\n        {\n            if (EditorApplication.isPlaying)\n            {\n                throw new Exception(\"Editor is already in PlayMode\");\n            }\n            if (EditorUtility.scriptCompilationFailed)\n            {\n                throw new Exception(\"Script compilation failed\");\n            }\n            yield return null;\n            ExpectedPlaymodeState = true;\n\n            EditorApplication.UnlockReloadAssemblies();\n            EditorApplication.isPlaying = true;\n\n            while (!EditorApplication.isPlaying)\n            {\n                yield return null;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Messages/EnterPlayMode.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 9bd5a110ed89025499ddee8c7e73778e\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Messages/ExitPlayMode.cs",
    "content": "using System;\nusing System.Collections;\nusing UnityEditor;\n\nnamespace UnityEngine.TestTools\n{\n    public class ExitPlayMode : IEditModeTestYieldInstruction\n    {\n        public bool ExpectDomainReload { get; }\n        public bool ExpectedPlaymodeState { get; private set; }\n\n        public ExitPlayMode()\n        {\n            ExpectDomainReload = false;\n            ExpectedPlaymodeState = false;\n        }\n\n        public IEnumerator Perform()\n        {\n            if (!EditorApplication.isPlayingOrWillChangePlaymode)\n            {\n                throw new Exception(\"Editor is already in EditMode\");\n            }\n\n            EditorApplication.isPlaying = false;\n            while (EditorApplication.isPlaying)\n            {\n                yield return null;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Messages/ExitPlayMode.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 408674d91d506a54aac9a7f07951c018\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Messages/RecompileScripts.cs",
    "content": "using System;\nusing System.Collections;\nusing UnityEditor;\n\nnamespace UnityEngine.TestTools\n{\n    internal class RecompileScripts : IEditModeTestYieldInstruction\n    {\n        public RecompileScripts() : this(true)\n        {\n        }\n\n        public RecompileScripts(bool expectScriptCompilation) : this(expectScriptCompilation, true)\n        {\n        }\n\n        public RecompileScripts(bool expectScriptCompilation, bool expectScriptCompilationSuccess)\n        {\n            ExpectScriptCompilation = expectScriptCompilation;\n            ExpectScriptCompilationSuccess = expectScriptCompilationSuccess;\n            ExpectDomainReload = true;\n        }\n\n        public bool ExpectDomainReload { get; private set; }\n        public bool ExpectedPlaymodeState { get; }\n        public bool ExpectScriptCompilation { get; private set; }\n        public bool ExpectScriptCompilationSuccess { get; private set; }\n        public static RecompileScripts Current { get; private set; }\n\n        public IEnumerator Perform()\n        {\n            Current = this;\n\n            // We need to yield, to give the test runner a chance to prepare for the domain reload\n            //  If the script compilation happens very fast, then EditModeRunner.MoveNextAndUpdateYieldObject will not have a chance to set m_CurrentYieldObject\n            // This really should be fixed in EditModeRunner.MoveNextAndUpdateYieldObject\n            yield return null;\n\n            AssetDatabase.Refresh();\n\n            if (ExpectScriptCompilation && !EditorApplication.isCompiling)\n            {\n                Current = null;\n                throw new Exception(\"Editor does not need to recompile scripts\");\n            }\n\n            EditorApplication.UnlockReloadAssemblies();\n\n            while (EditorApplication.isCompiling)\n            {\n                yield return null;\n            }\n\n            Current = null;\n\n            if (ExpectScriptCompilationSuccess && EditorUtility.scriptCompilationFailed)\n            {\n                EditorApplication.LockReloadAssemblies();\n                throw new Exception(\"Script compilation failed\");\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Messages/RecompileScripts.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 9202fbba95ea8294cb5e718f028f21b0\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Messages/WaitForDomainReload.cs",
    "content": "using System;\nusing System.Collections;\nusing UnityEditor;\n\nnamespace UnityEngine.TestTools\n{\n    internal class WaitForDomainReload : IEditModeTestYieldInstruction\n    {\n        public WaitForDomainReload()\n        {\n            ExpectDomainReload = true;\n        }\n\n        public bool ExpectDomainReload { get;  }\n        public bool ExpectedPlaymodeState { get; }\n\n        public IEnumerator Perform()\n        {\n            EditorApplication.UnlockReloadAssemblies();\n\n            // Detect if AssetDatabase.Refresh was called (true) or if it will be called on next tick\n            bool isAsync = EditorApplication.isCompiling;\n\n            yield return null;\n\n            if (!isAsync)\n            {\n                EditorApplication.LockReloadAssemblies();\n                throw new Exception(\"Expected domain reload, but it did not occur\");\n            }\n\n            while (EditorApplication.isCompiling)\n            {\n                yield return null;\n            }\n\n            if (EditorUtility.scriptCompilationFailed)\n            {\n                EditorApplication.LockReloadAssemblies();\n                throw new Exception(\"Script compilation failed\");\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Messages/WaitForDomainReload.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 5df3c21c5237c994db89660fbdfee07d\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Messages.meta",
    "content": "fileFormatVersion: 2\nguid: d9682e749d3efc642af54d789d9090a6\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/TestFileCleanupVerifier.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing UnityEngine;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    [Serializable]\n    internal class TestFileCleanupVerifier\n    {\n        const string k_Indent = \"    \";\n\n        [SerializeField]\n        List<string> m_ExistingFiles;\n\n        [SerializeField]\n        bool m_ExistingFilesScanned;\n\n        public Action<object> logAction = Debug.LogWarning;\n\n        private Func<string[]> getAllAssetPathsAction;\n        public Func<string[]> GetAllAssetPathsAction\n        {\n            get\n            {\n                if (getAllAssetPathsAction != null)\n                {\n                    return getAllAssetPathsAction;\n                }\n                return AssetDatabase.GetAllAssetPaths;\n            }\n            set\n            {\n                getAllAssetPathsAction = value;\n            }\n        }\n\n        public void RegisterExistingFiles()\n        {\n            if (m_ExistingFilesScanned)\n            {\n                return;\n            }\n\n            m_ExistingFiles = GetAllFilesInAssetsDirectory().ToList();\n            m_ExistingFilesScanned = true;\n        }\n\n        public void VerifyNoNewFilesAdded()\n        {\n            var currentFiles = GetAllFilesInAssetsDirectory().ToList();\n\n            //Expect that if its the same amount of files, there havent been any changes\n            //This is to optimize if there are many files\n            if (currentFiles.Count != m_ExistingFiles.Count)\n            {\n                LogWarningForFilesIfAny(currentFiles.Except(m_ExistingFiles));\n            }\n        }\n\n        void LogWarningForFilesIfAny(IEnumerable<string> filePaths)\n        {\n            if (!filePaths.Any())\n            {\n                return;\n            }\n\n            var stringWriter = new StringWriter();\n            stringWriter.WriteLine(\"Files generated by test without cleanup.\");\n            stringWriter.WriteLine(k_Indent + \"Found {0} new files.\", filePaths.Count());\n\n            foreach (var filePath in filePaths)\n            {\n                stringWriter.WriteLine(k_Indent + filePath);\n            }\n\n            LogAction(stringWriter.ToString());\n        }\n\n        private void LogAction(object obj)\n        {\n            if (this.logAction != null)\n            {\n                this.logAction(obj);\n            }\n            else\n            {\n                Debug.LogWarning(obj);\n            }\n        }\n\n        private IEnumerable<string> GetAllFilesInAssetsDirectory()\n        {\n            return GetAllAssetPathsAction();\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/TestFileCleanupVerifier.cs.meta",
    "content": "fileFormatVersion: 2\nguid: d6e23541e3b2fea489be46f704b64707\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Utils/CachingTestListProvider.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing UnityEditor.TestTools.TestRunner.Api;\nusing UnityEngine.TestRunner.NUnitExtensions;\nusing UnityEngine.TestTools;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    internal class CachingTestListProvider\n    {\n        private readonly ITestListProvider m_InnerTestListProvider;\n        private readonly ITestListCache m_TestListCache;\n        private readonly ITestAdaptorFactory m_TestAdaptorFactory;\n        public CachingTestListProvider(ITestListProvider innerTestListProvider, ITestListCache testListCache, ITestAdaptorFactory testAdaptorFactory)\n        {\n            m_InnerTestListProvider = innerTestListProvider;\n            m_TestListCache = testListCache;\n            m_TestAdaptorFactory = testAdaptorFactory;\n        }\n\n        public IEnumerator<ITestAdaptor> GetTestListAsync(TestPlatform platform)\n        {\n            var testFromCache = m_TestListCache.GetTestFromCacheAsync(platform);\n            while (testFromCache.MoveNext())\n            {\n                yield return null;\n            }\n\n\n            if (testFromCache.Current != null)\n            {\n                yield return testFromCache.Current;\n            }\n            else\n            {\n                var test = m_InnerTestListProvider.GetTestListAsync(platform);\n                while (test.MoveNext())\n                {\n                    yield return null;\n                }\n\n                test.Current.ParseForNameDuplicates();\n                m_TestListCache.CacheTest(platform, test.Current);\n                yield return m_TestAdaptorFactory.Create(test.Current);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Utils/CachingTestListProvider.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 26f3e7301af463c4ca72fa98d59b429e\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Utils/EditorAssembliesProxy.cs",
    "content": "using System.Linq;\nusing UnityEngine.TestTools.Utils;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    internal class EditorAssembliesProxy : IEditorAssembliesProxy\n    {\n        public IAssemblyWrapper[] loadedAssemblies\n        {\n            get { return EditorAssemblies.loadedAssemblies.Select(x => new EditorAssemblyWrapper(x)).ToArray(); }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Utils/EditorAssembliesProxy.cs.meta",
    "content": "fileFormatVersion: 2\nguid: f96d0ea807c081145a1170ed1b6d71e0\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Utils/EditorAssemblyWrapper.cs",
    "content": "using System.Reflection;\nusing UnityEngine.TestTools.Utils;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    internal class EditorAssemblyWrapper : AssemblyWrapper\n    {\n        public EditorAssemblyWrapper(Assembly assembly)\n            : base(assembly) {}\n\n        public override AssemblyName[] GetReferencedAssemblies()\n        {\n            return Assembly.GetReferencedAssemblies();\n        }\n\n        public override string Location { get { return Assembly.Location; } }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Utils/EditorAssemblyWrapper.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 20cdb37e6fea6d946bbb84d2c923db85\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Utils/EditorCompilationInterfaceProxy.cs",
    "content": "using UnityEditor.Scripting.ScriptCompilation;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    internal class EditorCompilationInterfaceProxy : IEditorCompilationInterfaceProxy\n    {\n        public ScriptAssembly[] GetAllEditorScriptAssemblies()\n        {\n            return EditorCompilationInterface.Instance.GetAllEditorScriptAssemblies(EditorCompilationInterface.GetAdditionalEditorScriptCompilationOptions());\n        }\n\n        public PrecompiledAssembly[] GetAllPrecompiledAssemblies()\n        {\n            return EditorCompilationInterface.Instance.GetAllPrecompiledAssemblies();\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Utils/EditorCompilationInterfaceProxy.cs.meta",
    "content": "fileFormatVersion: 2\nguid: c9b23632c77de204abfe8bf7168d48c0\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Utils/EditorLoadedTestAssemblyProvider.cs",
    "content": "using System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing UnityEditor.Scripting.ScriptCompilation;\nusing UnityEngine.TestTools;\nusing UnityEngine.TestTools.Utils;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    internal class EditorLoadedTestAssemblyProvider\n    {\n        private const string k_NunitAssemblyName = \"nunit.framework\";\n        private const string k_TestRunnerAssemblyName = \"UnityEngine.TestRunner\";\n        internal const string k_PerformanceTestingAssemblyName = \"Unity.PerformanceTesting\";\n\n        private readonly IEditorAssembliesProxy m_EditorAssembliesProxy;\n        private readonly ScriptAssembly[] m_AllEditorScriptAssemblies;\n        private readonly PrecompiledAssembly[] m_AllPrecompiledAssemblies;\n\n        public EditorLoadedTestAssemblyProvider(IEditorCompilationInterfaceProxy compilationInterfaceProxy, IEditorAssembliesProxy editorAssembliesProxy)\n        {\n            m_EditorAssembliesProxy = editorAssembliesProxy;\n            m_AllEditorScriptAssemblies = compilationInterfaceProxy.GetAllEditorScriptAssemblies();\n            m_AllPrecompiledAssemblies = compilationInterfaceProxy.GetAllPrecompiledAssemblies();\n        }\n\n        public List<IAssemblyWrapper> GetAssembliesGroupedByType(TestPlatform mode)\n        {\n            var assemblies = GetAssembliesGroupedByTypeAsync(mode);\n            while (assemblies.MoveNext())\n            {\n            }\n\n            return assemblies.Current;\n        }\n\n        public IEnumerator<List<IAssemblyWrapper>> GetAssembliesGroupedByTypeAsync(TestPlatform mode)\n        {\n            IAssemblyWrapper[] loadedAssemblies = m_EditorAssembliesProxy.loadedAssemblies;\n\n            IDictionary<TestPlatform, List<IAssemblyWrapper>> result = new Dictionary<TestPlatform, List<IAssemblyWrapper>>()\n            {\n                {TestPlatform.EditMode, new List<IAssemblyWrapper>() },\n                {TestPlatform.PlayMode, new List<IAssemblyWrapper>() }\n            };\n\n            foreach (var loadedAssembly in loadedAssemblies)\n            {\n                if (loadedAssembly.GetReferencedAssemblies().Any(x => x.Name == k_NunitAssemblyName || x.Name == k_TestRunnerAssemblyName || x.Name == k_PerformanceTestingAssemblyName))\n                {\n                    var assemblyName = new FileInfo(loadedAssembly.Location).Name;\n                    var scriptAssemblies = m_AllEditorScriptAssemblies.Where(x => x.Filename == assemblyName).ToList();\n                    var precompiledAssemblies = m_AllPrecompiledAssemblies.Where(x => new FileInfo(x.Path).Name == assemblyName).ToList();\n                    if (scriptAssemblies.Count < 1 && precompiledAssemblies.Count < 1)\n                    {\n                        continue;\n                    }\n\n                    var assemblyFlags = scriptAssemblies.Any() ? scriptAssemblies.Single().Flags : precompiledAssemblies.Single().Flags;\n                    var assemblyType = (assemblyFlags & AssemblyFlags.EditorOnly) == AssemblyFlags.EditorOnly ? TestPlatform.EditMode : TestPlatform.PlayMode;\n                    result[assemblyType].Add(loadedAssembly);\n                    yield return null;\n                }\n            }\n\n            yield return result[mode];\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Utils/EditorLoadedTestAssemblyProvider.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 033c884ba52437d49bc55935939ef1c6\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Utils/IEditorAssembliesProxy.cs",
    "content": "using UnityEngine.TestTools.Utils;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    internal interface IEditorAssembliesProxy\n    {\n        IAssemblyWrapper[] loadedAssemblies { get; }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Utils/IEditorAssembliesProxy.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 98808b11e78f6c84a841a6b4bc5a29d2\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Utils/IEditorCompilationInterfaceProxy.cs",
    "content": "using UnityEditor.Scripting.ScriptCompilation;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    internal interface IEditorCompilationInterfaceProxy\n    {\n        ScriptAssembly[] GetAllEditorScriptAssemblies();\n        PrecompiledAssembly[] GetAllPrecompiledAssemblies();\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Utils/IEditorCompilationInterfaceProxy.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 28c8fcb831e6e734a9f564bc4f495eba\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Utils/ITestListCache.cs",
    "content": "using System.Collections.Generic;\nusing NUnit.Framework.Interfaces;\nusing UnityEditor.TestTools.TestRunner.Api;\nusing UnityEngine.TestTools;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    interface ITestListCache\n    {\n        void CacheTest(TestPlatform platform, ITest test);\n        IEnumerator<ITestAdaptor> GetTestFromCacheAsync(TestPlatform platform);\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Utils/ITestListCache.cs.meta",
    "content": "fileFormatVersion: 2\nguid: a704c010bcdb1ec4a9f3417b3c393164\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Utils/ITestListCacheData.cs",
    "content": "using System.Collections.Generic;\nusing UnityEngine.TestRunner.TestLaunchers;\nusing UnityEngine.TestTools;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    interface ITestListCacheData\n    {\n        List<TestPlatform> platforms { get; }\n        List<RemoteTestResultDataWithTestData> cachedData { get; }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Utils/ITestListCacheData.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 7043e9a330ac2d84a80a965ada4589ad\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Utils/ITestListProvider.cs",
    "content": "using System.Collections.Generic;\nusing NUnit.Framework.Interfaces;\nusing UnityEngine.TestTools;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    interface ITestListProvider\n    {\n        IEnumerator<ITest> GetTestListAsync(TestPlatform platform);\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Utils/ITestListProvider.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 64689f8b25eadac4da519e96f514b653\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Utils/TestListCache.cs",
    "content": "using System.Collections.Generic;\nusing NUnit.Framework.Interfaces;\nusing UnityEditor.TestTools.TestRunner.Api;\nusing UnityEngine.TestRunner.TestLaunchers;\nusing UnityEngine.TestTools;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    internal class TestListCache : ITestListCache\n    {\n        private readonly ITestAdaptorFactory m_TestAdaptorFactory;\n        private readonly IRemoteTestResultDataFactory m_TestResultDataFactory;\n        private readonly ITestListCacheData m_TestListCacheData;\n\n        public TestListCache(ITestAdaptorFactory testAdaptorFactory, IRemoteTestResultDataFactory testResultDataFactory, ITestListCacheData testListCacheData)\n        {\n            m_TestAdaptorFactory = testAdaptorFactory;\n            m_TestResultDataFactory = testResultDataFactory;\n            m_TestListCacheData = testListCacheData;\n        }\n\n        public void CacheTest(TestPlatform platform, ITest test)\n        {\n            var data = m_TestResultDataFactory.CreateFromTest(test);\n\n            var index = m_TestListCacheData.platforms.IndexOf(platform);\n            if (index < 0)\n            {\n                m_TestListCacheData.cachedData.Add(data);\n                m_TestListCacheData.platforms.Add(platform);\n            }\n            else\n            {\n                m_TestListCacheData.cachedData[index] = data;\n            }\n        }\n\n        public IEnumerator<ITestAdaptor> GetTestFromCacheAsync(TestPlatform platform)\n        {\n            var index = m_TestListCacheData.platforms.IndexOf(platform);\n            if (index < 0)\n            {\n                yield return null;\n                yield break;\n            }\n\n            var testData = m_TestListCacheData.cachedData[index];\n            var test = m_TestAdaptorFactory.BuildTreeAsync(testData);\n            while (test.MoveNext())\n            {\n                yield return null;\n            }\n\n            yield return test.Current;\n        }\n\n        [Callbacks.DidReloadScripts]\n        private static void ScriptReloaded()\n        {\n            TestListCacheData.instance.cachedData.Clear();\n            TestListCacheData.instance.platforms.Clear();\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Utils/TestListCache.cs.meta",
    "content": "fileFormatVersion: 2\nguid: d685d97a1eb004f49afea0cc982ff728\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Utils/TestListCacheData.cs",
    "content": "using System.Collections.Generic;\nusing UnityEngine;\nusing UnityEngine.TestRunner.TestLaunchers;\nusing UnityEngine.TestTools;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    internal class TestListCacheData : ScriptableSingleton<TestListCacheData>, ITestListCacheData\n    {\n        [SerializeField]\n        private List<TestPlatform> m_Platforms = new List<TestPlatform>();\n\n        [SerializeField]\n        private List<RemoteTestResultDataWithTestData> m_CachedData = new List<RemoteTestResultDataWithTestData>();\n\n        public List<TestPlatform> platforms\n        {\n            get { return m_Platforms; }\n        }\n\n        public List<RemoteTestResultDataWithTestData> cachedData\n        {\n            get { return m_CachedData; }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Utils/TestListCacheData.cs.meta",
    "content": "fileFormatVersion: 2\nguid: f1b6399349763114d9361bc6dfcd025b\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Utils/TestListJob.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing UnityEditor.TestTools.TestRunner.Api;\nusing UnityEngine.TestTools;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    internal class TestListJob\n    {\n        private CachingTestListProvider m_TestListProvider;\n        private TestPlatform m_Platform;\n        private Action<ITestAdaptor> m_Callback;\n        private IEnumerator<ITestAdaptor> m_ResultEnumerator;\n        public TestListJob(CachingTestListProvider testListProvider, TestPlatform platform, Action<ITestAdaptor> callback)\n        {\n            m_TestListProvider = testListProvider;\n            m_Platform = platform;\n            m_Callback = callback;\n        }\n\n        public void Start()\n        {\n            m_ResultEnumerator = m_TestListProvider.GetTestListAsync(m_Platform);\n            EditorApplication.update += EditorUpdate;\n        }\n\n        private void EditorUpdate()\n        {\n            if (!m_ResultEnumerator.MoveNext())\n            {\n                m_Callback(m_ResultEnumerator.Current);\n                EditorApplication.update -= EditorUpdate;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Utils/TestListJob.cs.meta",
    "content": "fileFormatVersion: 2\nguid: dec9066d4afefe444be0dad3f137730d\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Utils/TestListProvider.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing NUnit.Framework.Interfaces;\nusing UnityEngine.TestTools;\nusing UnityEngine.TestTools.NUnitExtensions;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    internal class TestListProvider : ITestListProvider\n    {\n        private readonly EditorLoadedTestAssemblyProvider m_AssemblyProvider;\n        private readonly UnityTestAssemblyBuilder m_AssemblyBuilder;\n\n        public TestListProvider(EditorLoadedTestAssemblyProvider assemblyProvider, UnityTestAssemblyBuilder assemblyBuilder)\n        {\n            m_AssemblyProvider = assemblyProvider;\n            m_AssemblyBuilder = assemblyBuilder;\n        }\n\n        public IEnumerator<ITest> GetTestListAsync(TestPlatform platform)\n        {\n            var assemblies = m_AssemblyProvider.GetAssembliesGroupedByTypeAsync(platform);\n            while (assemblies.MoveNext())\n            {\n                yield return null;\n            }\n\n            var settings = UnityTestAssemblyBuilder.GetNUnitTestBuilderSettings(platform);\n            var test =  m_AssemblyBuilder.BuildAsync(assemblies.Current.Select(x => x.Assembly).ToArray(), settings);\n            while (test.MoveNext())\n            {\n                yield return null;\n            }\n\n            yield return test.Current;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Utils/TestListProvider.cs.meta",
    "content": "fileFormatVersion: 2\nguid: f15cbb987069826429540d0ea0937442\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner/Utils.meta",
    "content": "fileFormatVersion: 2\nguid: 1f5bbb88ca730434483440cbc0278ef6\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunner.meta",
    "content": "fileFormatVersion: 2\nguid: 49d4c2ab7ff0f4442af256bad7c9d57c\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunnerWindow.cs",
    "content": "using System;\nusing UnityEditor.Callbacks;\nusing UnityEditor.TestTools.TestRunner.Api;\nusing UnityEditor.TestTools.TestRunner.GUI;\nusing UnityEngine;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    [Serializable]\n    internal class TestRunnerWindow : EditorWindow, IHasCustomMenu\n    {\n        internal static class Styles\n        {\n            public static GUIStyle info;\n            public static GUIStyle testList;\n\n            static Styles()\n            {\n                info = new GUIStyle(EditorStyles.wordWrappedLabel);\n                info.wordWrap = false;\n                info.stretchHeight = true;\n                info.margin.right = 15;\n\n                testList = new GUIStyle(\"CN Box\");\n                testList.margin.top = 0;\n                testList.padding.left = 3;\n            }\n        }\n\n        private readonly GUIContent m_GUIHorizontalSplit = EditorGUIUtility.TrTextContent(\"Horizontal layout\");\n        private readonly GUIContent m_GUIVerticalSplit = EditorGUIUtility.TrTextContent(\"Vertical layout\");\n        private readonly GUIContent m_GUIEnableaPlaymodeTestsRunner = EditorGUIUtility.TrTextContent(\"Enable playmode tests for all assemblies\");\n        private readonly GUIContent m_GUIDisablePlaymodeTestsRunner = EditorGUIUtility.TrTextContent(\"Disable playmode tests for all assemblies\");\n        private readonly GUIContent m_GUIRunPlayModeTestAsEditModeTests = EditorGUIUtility.TrTextContent(\"Run playmode tests as editmode tests\");\n\n        internal static TestRunnerWindow s_Instance;\n        private bool m_IsBuilding;\n        [NonSerialized]\n        private bool m_Enabled;\n        public TestFilterSettings filterSettings;\n\n        private readonly SplitterState m_Spl = new SplitterState(new float[] { 75, 25 }, new[] { 32, 32 }, null);\n\n        private TestRunnerWindowSettings m_Settings;\n\n        private enum TestRunnerMenuLabels\n        {\n            PlayMode = 0,\n            EditMode = 1\n        }\n        [SerializeField]\n        private int m_TestTypeToolbarIndex = (int)TestRunnerMenuLabels.EditMode;\n        [SerializeField]\n        private PlayModeTestListGUI m_PlayModeTestListGUI;\n        [SerializeField]\n        private EditModeTestListGUI m_EditModeTestListGUI;\n\n        internal TestListGUI m_SelectedTestTypes;\n\n        private ITestRunnerApi m_testRunnerApi;\n\n        private WindowResultUpdater m_WindowResultUpdater;\n\n        [MenuItem(\"Window/General/Test Runner\", false, 201, false)]\n        public static void ShowPlaymodeTestsRunnerWindowCodeBased()\n        {\n            if (s_Instance != null)\n            {\n                try\n                {\n                    s_Instance.Close();\n                }\n                catch (Exception exception)\n                {\n                    Debug.LogException(exception);\n                }\n            }\n\n            s_Instance = GetWindow<TestRunnerWindow>(\"Test Runner\");\n            s_Instance.Show();\n        }\n\n        static TestRunnerWindow()\n        {\n            InitBackgroundRunners();\n        }\n\n        private static void InitBackgroundRunners()\n        {\n            EditorApplication.playModeStateChanged -= OnPlayModeStateChanged;\n            EditorApplication.playModeStateChanged += OnPlayModeStateChanged;\n        }\n\n        [DidReloadScripts]\n        private static void CompilationCallback()\n        {\n            UpdateWindow();\n        }\n\n        private static void OnPlayModeStateChanged(PlayModeStateChange state)\n        {\n            if (s_Instance && state == PlayModeStateChange.EnteredEditMode && s_Instance.m_SelectedTestTypes.HasTreeData())\n            {\n                //repaint message details after exit playmode\n                s_Instance.m_SelectedTestTypes.TestSelectionCallback(s_Instance.m_SelectedTestTypes.m_TestListState.selectedIDs.ToArray());\n                s_Instance.Repaint();\n            }\n        }\n\n        public void OnDestroy()\n        {\n            EditorApplication.playModeStateChanged -= OnPlayModeStateChanged;\n            if (m_testRunnerApi != null)\n            {\n                m_testRunnerApi.UnregisterCallbacks(m_WindowResultUpdater);\n            }\n        }\n\n        private void OnEnable()\n        {\n            s_Instance = this;\n            SelectTestListGUI(m_TestTypeToolbarIndex);\n\n            m_testRunnerApi = ScriptableObject.CreateInstance<TestRunnerApi>();\n            m_WindowResultUpdater = new WindowResultUpdater();\n            m_testRunnerApi.RegisterCallbacks(m_WindowResultUpdater);\n        }\n\n        private void Enable()\n        {\n            m_Settings = new TestRunnerWindowSettings(\"UnityEditor.PlaymodeTestsRunnerWindow\");\n            filterSettings = new TestFilterSettings(\"UnityTest.IntegrationTestsRunnerWindow\");\n\n            if (m_SelectedTestTypes == null)\n            {\n                SelectTestListGUI(m_TestTypeToolbarIndex);\n            }\n\n            StartRetrieveTestList();\n            m_SelectedTestTypes.Reload();\n            m_Enabled = true;\n        }\n\n        private void SelectTestListGUI(int testTypeToolbarIndex)\n        {\n            if (testTypeToolbarIndex == (int)TestRunnerMenuLabels.PlayMode)\n            {\n                if (m_PlayModeTestListGUI == null)\n                {\n                    m_PlayModeTestListGUI = new PlayModeTestListGUI();\n                }\n                m_SelectedTestTypes = m_PlayModeTestListGUI;\n            }\n            else if (testTypeToolbarIndex == (int)TestRunnerMenuLabels.EditMode)\n            {\n                if (m_EditModeTestListGUI == null)\n                {\n                    m_EditModeTestListGUI = new EditModeTestListGUI();\n                }\n                m_SelectedTestTypes = m_EditModeTestListGUI;\n            }\n        }\n\n        private void StartRetrieveTestList()\n        {\n            if (!m_SelectedTestTypes.HasTreeData())\n            {\n                m_testRunnerApi.RetrieveTestList(new ExecutionSettings() { filter = new Filter() { testMode = m_SelectedTestTypes.TestMode } }, (rootTest) =>\n                {\n                    m_SelectedTestTypes.Init(this, rootTest);\n                    m_SelectedTestTypes.Reload();\n                });\n            }\n        }\n\n        public void OnGUI()\n        {\n            if (!m_Enabled)\n            {\n                Enable();\n            }\n\n            if (BuildPipeline.isBuildingPlayer)\n            {\n                m_IsBuilding = true;\n            }\n            else if (m_IsBuilding)\n            {\n                m_IsBuilding = false;\n                Repaint();\n            }\n\n            EditorGUILayout.BeginHorizontal();\n            GUILayout.FlexibleSpace();\n            var selectedIndex = m_TestTypeToolbarIndex;\n            m_TestTypeToolbarIndex = GUILayout.Toolbar(m_TestTypeToolbarIndex, Enum.GetNames(typeof(TestRunnerMenuLabels)), \"LargeButton\", UnityEngine.GUI.ToolbarButtonSize.FitToContents);\n            GUILayout.FlexibleSpace();\n            EditorGUILayout.EndHorizontal();\n\n            if (selectedIndex != m_TestTypeToolbarIndex)\n            {\n                SelectTestListGUI(m_TestTypeToolbarIndex);\n                StartRetrieveTestList();\n            }\n\n            EditorGUILayout.BeginVertical();\n            using (new EditorGUI.DisabledScope(EditorApplication.isPlayingOrWillChangePlaymode))\n            {\n                m_SelectedTestTypes.PrintHeadPanel();\n            }\n            EditorGUILayout.EndVertical();\n\n            if (m_Settings.verticalSplit)\n                SplitterGUILayout.BeginVerticalSplit(m_Spl);\n            else\n                SplitterGUILayout.BeginHorizontalSplit(m_Spl);\n\n            EditorGUILayout.BeginVertical();\n            EditorGUILayout.BeginVertical(Styles.testList);\n            m_SelectedTestTypes.RenderTestList();\n            EditorGUILayout.EndVertical();\n            EditorGUILayout.EndVertical();\n\n            m_SelectedTestTypes.RenderDetails();\n\n            if (m_Settings.verticalSplit)\n                SplitterGUILayout.EndVerticalSplit();\n            else\n                SplitterGUILayout.EndHorizontalSplit();\n        }\n\n        public void AddItemsToMenu(GenericMenu menu)\n        {\n            menu.AddItem(m_GUIVerticalSplit, m_Settings.verticalSplit, m_Settings.ToggleVerticalSplit);\n            menu.AddItem(m_GUIHorizontalSplit, !m_Settings.verticalSplit, m_Settings.ToggleVerticalSplit);\n\n            menu.AddSeparator(null);\n\n            var playModeTestRunnerEnabled = PlayerSettings.playModeTestRunnerEnabled;\n            var currentActive = playModeTestRunnerEnabled ? m_GUIDisablePlaymodeTestsRunner : m_GUIEnableaPlaymodeTestsRunner;\n\n            if (EditorPrefs.GetBool(\"InternalMode\", false))\n            {\n                menu.AddItem(m_GUIRunPlayModeTestAsEditModeTests, PlayerSettings.runPlayModeTestAsEditModeTest, () =>\n                {\n                    PlayerSettings.runPlayModeTestAsEditModeTest = !PlayerSettings.runPlayModeTestAsEditModeTest;\n                });\n            }\n\n            menu.AddItem(currentActive, false, () =>\n            {\n                PlayerSettings.playModeTestRunnerEnabled = !playModeTestRunnerEnabled;\n                EditorUtility.DisplayDialog(currentActive.text, \"You need to restart the editor now\", \"Ok\");\n            });\n        }\n\n        public void RebuildUIFilter()\n        {\n            if (m_SelectedTestTypes != null && m_SelectedTestTypes.HasTreeData())\n            {\n                m_SelectedTestTypes.RebuildUIFilter();\n            }\n        }\n\n        public static void UpdateWindow()\n        {\n            if (s_Instance != null && s_Instance.m_SelectedTestTypes != null)\n            {\n                s_Instance.m_SelectedTestTypes.Repaint();\n                s_Instance.Repaint();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunnerWindow.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 4dfcd3a631f61d248b7cc0b845d40345\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunnerWindowSettings.cs",
    "content": "namespace UnityEditor.TestTools.TestRunner\n{\n    internal class TestRunnerWindowSettings\n    {\n        public bool verticalSplit;\n\n        private readonly string m_PrefsKey;\n\n        public TestRunnerWindowSettings(string prefsKey)\n        {\n            m_PrefsKey = prefsKey;\n            verticalSplit = EditorPrefs.GetBool(m_PrefsKey + \".verticalSplit\", true);\n        }\n\n        public void ToggleVerticalSplit()\n        {\n            verticalSplit = !verticalSplit;\n            Save();\n        }\n\n        private void Save()\n        {\n            EditorPrefs.SetBool(m_PrefsKey + \".verticalSplit\", verticalSplit);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestRunnerWindowSettings.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 2b301b727225f1941974d69e61a55620\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestSettings/ITestSettings.cs",
    "content": "using System;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    internal interface ITestSettings : IDisposable\n    {\n        ScriptingImplementation? scriptingBackend { get; set; }\n\n        string Architecture { get; set; }\n\n        ApiCompatibilityLevel? apiProfile { get; set; }\n\n        bool? appleEnableAutomaticSigning { get; set; }\n        string appleDeveloperTeamID { get; set; }\n        ProvisioningProfileType? iOSManualProvisioningProfileType { get; set; }\n        string iOSManualProvisioningProfileID { get; set; }\n        ProvisioningProfileType? tvOSManualProvisioningProfileType { get; set; }\n        string tvOSManualProvisioningProfileID { get; set; }\n\n        void SetupProjectParameters();\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestSettings/ITestSettings.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 83eda34b7da01e04aa894f268158b0c0\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestSettings/ITestSettingsDeserializer.cs",
    "content": "namespace UnityEditor.TestTools.TestRunner\n{\n    interface ITestSettingsDeserializer\n    {\n        ITestSettings GetSettingsFromJsonFile(string jsonFilePath);\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestSettings/ITestSettingsDeserializer.cs.meta",
    "content": "fileFormatVersion: 2\nguid: d208a1684f8aa6a40ad91d6aa9600c14\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestSettings/TestSettings.cs",
    "content": "using System;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    internal class TestSettings : ITestSettings\n    {\n        private readonly TestSetting[] m_Settings =\n        {\n            new TestSetting<ScriptingImplementation?>(\n                settings => settings.scriptingBackend,\n                () => PlayerSettings.GetScriptingBackend(EditorUserBuildSettings.activeBuildTargetGroup),\n                implementation => PlayerSettings.SetScriptingBackend(EditorUserBuildSettings.activeBuildTargetGroup, implementation.Value)),\n            new TestSetting<string>(\n                settings => settings.Architecture,\n                () => EditorUserBuildSettings.activeBuildTarget == BuildTarget.Android ? PlayerSettings.Android.targetArchitectures.ToString() : null,\n                architecture =>\n                {\n                    if (EditorUserBuildSettings.activeBuildTarget == BuildTarget.Android)\n                    {\n                        if (!string.IsNullOrEmpty(architecture))\n                        {\n                            var targetArchitectures = (AndroidArchitecture)Enum.Parse(typeof(AndroidArchitecture), architecture, true);\n                            PlayerSettings.Android.targetArchitectures = targetArchitectures;\n                        }\n                    }\n                }),\n            new TestSetting<ApiCompatibilityLevel?>(\n                settings => settings.apiProfile,\n                () => PlayerSettings.GetApiCompatibilityLevel(EditorUserBuildSettings.activeBuildTargetGroup),\n                implementation =>\n                {\n                    if (Enum.IsDefined(typeof(ApiCompatibilityLevel), implementation.Value))\n                    {\n                        PlayerSettings.SetApiCompatibilityLevel(EditorUserBuildSettings.activeBuildTargetGroup,\n                            implementation.Value);\n                    }\n                }),\n            new TestSetting<bool?>(\n                settings => settings.appleEnableAutomaticSigning,\n                () => PlayerSettings.iOS.appleEnableAutomaticSigning,\n                enableAutomaticSigning =>\n                {\n                    if (enableAutomaticSigning != null)\n                        PlayerSettings.iOS.appleEnableAutomaticSigning = enableAutomaticSigning.Value;\n                }),\n            new TestSetting<string>(\n                settings => settings.appleDeveloperTeamID,\n                () => PlayerSettings.iOS.appleDeveloperTeamID,\n                developerTeam =>\n                {\n                    if (developerTeam != null)\n                        PlayerSettings.iOS.appleDeveloperTeamID = developerTeam;\n                }),\n            new TestSetting<ProvisioningProfileType?>(\n                settings => settings.iOSManualProvisioningProfileType,\n                () => PlayerSettings.iOS.iOSManualProvisioningProfileType,\n                profileType =>\n                {\n                    if (profileType != null)\n                        PlayerSettings.iOS.iOSManualProvisioningProfileType = profileType.Value;\n                }),\n            new TestSetting<string>(\n                settings => settings.iOSManualProvisioningProfileID,\n                () => PlayerSettings.iOS.iOSManualProvisioningProfileID,\n                provisioningUUID =>\n                {\n                    if (provisioningUUID != null)\n                        PlayerSettings.iOS.iOSManualProvisioningProfileID = provisioningUUID;\n                }),\n            new TestSetting<ProvisioningProfileType?>(\n                settings => settings.tvOSManualProvisioningProfileType,\n                () => PlayerSettings.iOS.tvOSManualProvisioningProfileType,\n                profileType =>\n                {\n                    if (profileType != null)\n                        PlayerSettings.iOS.tvOSManualProvisioningProfileType = profileType.Value;\n                }),\n            new TestSetting<string>(\n                settings => settings.tvOSManualProvisioningProfileID,\n                () => PlayerSettings.iOS.tvOSManualProvisioningProfileID,\n                provisioningUUID =>\n                {\n                    if (provisioningUUID != null)\n                        PlayerSettings.iOS.tvOSManualProvisioningProfileID = provisioningUUID;\n                }),\n        };\n\n        private bool m_Disposed;\n\n        public ScriptingImplementation? scriptingBackend { get; set; }\n\n        public string Architecture { get; set; }\n\n        public ApiCompatibilityLevel? apiProfile { get; set; }\n\n        public bool? appleEnableAutomaticSigning { get; set; }\n        public string appleDeveloperTeamID { get; set; }\n        public ProvisioningProfileType? iOSManualProvisioningProfileType { get; set; }\n        public string iOSManualProvisioningProfileID { get; set; }\n        public ProvisioningProfileType? tvOSManualProvisioningProfileType { get; set; }\n        public string tvOSManualProvisioningProfileID { get; set; }\n\n        public void Dispose()\n        {\n            if (!m_Disposed)\n            {\n                foreach (var testSetting in m_Settings)\n                {\n                    testSetting.Cleanup();\n                }\n\n                m_Disposed = true;\n            }\n        }\n\n        public void SetupProjectParameters()\n        {\n            foreach (var testSetting in m_Settings)\n            {\n                testSetting.Setup(this);\n            }\n        }\n\n        private abstract class TestSetting\n        {\n            public abstract void Setup(TestSettings settings);\n            public abstract void Cleanup();\n        }\n\n        private class TestSetting<T> : TestSetting\n        {\n            private T m_ValueBeforeSetup;\n            private Func<TestSettings, T> m_GetFromSettings;\n            private Func<T> m_GetCurrentValue;\n            private Action<T> m_SetValue;\n\n            public TestSetting(Func<TestSettings, T> getFromSettings, Func<T> getCurrentValue, Action<T> setValue)\n            {\n                m_GetFromSettings = getFromSettings;\n                m_GetCurrentValue = getCurrentValue;\n                m_SetValue = setValue;\n            }\n\n            public override void Setup(TestSettings settings)\n            {\n                m_ValueBeforeSetup = m_GetCurrentValue();\n                var newValue = m_GetFromSettings(settings);\n                if (newValue != null)\n                {\n                    m_SetValue(newValue);\n                }\n            }\n\n            public override void Cleanup()\n            {\n                m_SetValue(m_ValueBeforeSetup);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestSettings/TestSettings.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 6b32b6725087a0d4bb1670818d26996e\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestSettings/TestSettingsDeserializer.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing UnityEngine;\n\nnamespace UnityEditor.TestTools.TestRunner\n{\n    /// <summary>\n    /// Handles deserialization of TestSettings from a provided json file path.\n    /// </summary>\n    internal class TestSettingsDeserializer : ITestSettingsDeserializer\n    {\n        private static readonly SettingsMap[] s_SettingsMapping =\n        {\n            new SettingsMap<ScriptingImplementation>(\"scriptingBackend\", (settings, value) => settings.scriptingBackend = value),\n            new SettingsMap<string>(\"architecture\", (settings, value) => settings.Architecture = value),\n            new SettingsMap<ApiCompatibilityLevel>(\"apiProfile\", (settings, value) => settings.apiProfile = value),\n            new SettingsMap<bool>(\"appleEnableAutomaticSigning\", (settings, value) => settings.appleEnableAutomaticSigning = value),\n            new SettingsMap<string>(\"appleDeveloperTeamID\", (settings, value) => settings.appleDeveloperTeamID = value),\n            new SettingsMap<ProvisioningProfileType>(\"iOSManualProvisioningProfileType\", (settings, value) => settings.iOSManualProvisioningProfileType = value),\n            new SettingsMap<string>(\"iOSManualProvisioningProfileID\", (settings, value) => settings.iOSManualProvisioningProfileID = value),\n            new SettingsMap<ProvisioningProfileType>(\"tvOSManualProvisioningProfileType\", (settings, value) => settings.tvOSManualProvisioningProfileType = value),\n            new SettingsMap<string>(\"tvOSManualProvisioningProfileID\", (settings, value) => settings.tvOSManualProvisioningProfileID = value),\n        };\n\n        private readonly Func<ITestSettings> m_TestSettingsFactory;\n        public TestSettingsDeserializer(Func<ITestSettings> testSettingsFactory)\n        {\n            m_TestSettingsFactory = testSettingsFactory;\n        }\n\n        public ITestSettings GetSettingsFromJsonFile(string jsonFilePath)\n        {\n            var text = File.ReadAllText(jsonFilePath);\n            var settingsDictionary = Json.Deserialize(text) as Dictionary<string, object>;\n\n            var testSettings = m_TestSettingsFactory();\n            if (settingsDictionary == null)\n            {\n                return testSettings;\n            }\n\n            foreach (var settingsMap in s_SettingsMapping)\n            {\n                if (!settingsDictionary.ContainsKey(settingsMap.Key))\n                {\n                    continue;\n                }\n\n                if (settingsMap.Type.IsEnum)\n                {\n                    SetEnumValue(settingsMap.Key, settingsDictionary[settingsMap.Key], settingsMap.Type, value => settingsMap.ApplyToSettings(testSettings, value));\n                }\n                else\n                {\n                    SetValue(settingsMap.Key, settingsDictionary[settingsMap.Key], settingsMap.Type, value => settingsMap.ApplyToSettings(testSettings, value));\n                }\n            }\n\n            return testSettings;\n        }\n\n        private abstract class SettingsMap\n        {\n            public string Key { get; }\n            public Type Type { get; }\n            protected SettingsMap(string key, Type type)\n            {\n                Key = key;\n                Type = type;\n            }\n\n            public abstract void ApplyToSettings(ITestSettings settings, object value);\n        }\n\n        private class SettingsMap<T> : SettingsMap\n        {\n            private Action<ITestSettings, T> m_Setter;\n            public SettingsMap(string key, Action<ITestSettings, T> setter) : base(key, typeof(T))\n            {\n                m_Setter = setter;\n            }\n\n            public override void ApplyToSettings(ITestSettings settings, object value)\n            {\n                m_Setter(settings, (T)value);\n            }\n        }\n\n        private static void SetEnumValue(string key, object value, Type type, Action<object> setter)\n        {\n            object enumValue;\n            if (TryGetEnum(value as string, type, out enumValue))\n            {\n                setter(enumValue);\n                return;\n            }\n\n            var acceptedValues = string.Join(\", \", Enum.GetValues(type).OfType<object>().Select(val => val.ToString()).ToArray());\n\n            Debug.LogFormat(\"Could not convert '{0}' argument '{1}' to a valid {2}. Accepted values: {3}.\", key, value, type.Name, acceptedValues);\n        }\n\n        private static bool TryGetEnum(string value, Type type, out object enumValue)\n        {\n            try\n            {\n                enumValue = Enum.Parse(type, value, true);\n                return true;\n            }\n            catch (Exception)\n            {\n                enumValue = null;\n                return false;\n            }\n        }\n\n        private static void SetValue(string key, object value, Type type, Action<object> setter)\n        {\n            if (type.IsInstanceOfType(value))\n            {\n                setter(value);\n                return;\n            }\n\n            Debug.LogFormat(\"Could not convert '{0}' argument '{1}' to a valid {2}.\", key, value, type.Name);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestSettings/TestSettingsDeserializer.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 75e7d7a9a57458841a85fe42d9c9141f\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/TestSettings.meta",
    "content": "fileFormatVersion: 2\nguid: 95b719082a664ea45bb56759eed1f271\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/UnityEditor.TestRunner.asmdef",
    "content": "{\n    \"name\": \"UnityEditor.TestRunner\",\n    \"references\": [\n        \"UnityEngine.TestRunner\"\n    ],\n    \"includePlatforms\": [\n        \"Editor\"\n    ],\n    \"excludePlatforms\": [],\n    \"allowUnsafeCode\": false,\n    \"overrideReferences\": true,\n    \"precompiledReferences\": [\n        \"nunit.framework.dll\",\n        \"Mono.Cecil.dll\",\n        \"Mono.Cecil.Pdb.dll\",\n        \"Mono.Cecil.Mdb.dll\",\n        \"Mono.Cecil.Rocks.dll\"\n    ],\n    \"autoReferenced\": false,\n    \"defineConstraints\": []\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/UnityEditor.TestRunner.asmdef.meta",
    "content": "fileFormatVersion: 2\nguid: 0acc523941302664db1f4e527237feb3\nAssemblyDefinitionImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/UnityTestProtocol/AssemblyCompilationErrorsMessage.cs",
    "content": "namespace UnityEditor.TestTools.TestRunner.UnityTestProtocol\n{\n    internal class AssemblyCompilationErrorsMessage : Message\n    {\n        public string assembly;\n        public string[] errors;\n\n        public AssemblyCompilationErrorsMessage()\n        {\n            type = \"AssemblyCompilationErrors\";\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/UnityTestProtocol/AssemblyCompilationErrorsMessage.cs.meta",
    "content": "fileFormatVersion: 2\nguid: c346a7445959bba46a96de0747e77c2a\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/UnityTestProtocol/ITestRunnerApiMapper.cs",
    "content": "using System.Collections.Generic;\nusing UnityEditor.TestTools.TestRunner.Api;\n\nnamespace UnityEditor.TestTools.TestRunner.UnityTestProtocol\n{\n    interface ITestRunnerApiMapper\n    {\n        string GetRunStateFromResultNunitXml(ITestResultAdaptor result);\n        TestState GetTestStateFromResult(ITestResultAdaptor result);\n        List<string> FlattenTestNames(ITestAdaptor testsToRun);\n        TestPlanMessage MapTestToTestPlanMessage(ITestAdaptor testsToRun);\n        TestStartedMessage MapTestToTestStartedMessage(ITestAdaptor test);\n        TestFinishedMessage TestResultToTestFinishedMessage(ITestResultAdaptor result);\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/UnityTestProtocol/ITestRunnerApiMapper.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 6de79ae237e51554da96fd28f68b66a6\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/UnityTestProtocol/IUtpLogger.cs",
    "content": "namespace UnityEditor.TestTools.TestRunner.UnityTestProtocol\n{\n    interface IUtpLogger\n    {\n        void Log(Message msg);\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/UnityTestProtocol/IUtpLogger.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 9014630255533ed42915965b4065cde8\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/UnityTestProtocol/IUtpMessageReporter.cs",
    "content": "using System.Collections.Generic;\nusing UnityEditor.Compilation;\nusing UnityEditor.TestTools.TestRunner.Api;\n\nnamespace UnityEditor.TestTools.TestRunner.UnityTestProtocol\n{\n    internal interface IUtpMessageReporter\n    {\n        void ReportAssemblyCompilationErrors(string assembly, IEnumerable<CompilerMessage> errorCompilerMessages);\n        void ReportTestFinished(ITestResultAdaptor result);\n        void ReportTestRunStarted(ITestAdaptor testsToRun);\n        void ReportTestStarted(ITestAdaptor test);\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/UnityTestProtocol/IUtpMessageReporter.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 952b3dc7b47846947b37c8d3ae46579a\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/UnityTestProtocol/Message.cs",
    "content": "using System;\nusing System.Diagnostics;\n\nnamespace UnityEditor.TestTools.TestRunner.UnityTestProtocol\n{\n    [Serializable]\n    internal abstract class Message\n    {\n        public string type;\n        // Milliseconds since unix epoch\n        public ulong time;\n        public int version;\n        public string phase;\n        public int processId;\n\n        protected Message()\n        {\n            version = 2;\n            phase = \"Immediate\";\n            processId = Process.GetCurrentProcess().Id;\n            AddTimeStamp();\n        }\n\n        public void AddTimeStamp()\n        {\n            time = Convert.ToUInt64((DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalMilliseconds);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/UnityTestProtocol/Message.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 321dc2c0720f8dd4f9396ecdc12b8746\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/UnityTestProtocol/TestFinishedMessage.cs",
    "content": "namespace UnityEditor.TestTools.TestRunner.UnityTestProtocol\n{\n    internal class TestFinishedMessage : Message\n    {\n        public string name;\n        public TestState state;\n        public string message;\n        public ulong duration; // milliseconds\n        public ulong durationMicroseconds;\n\n        public TestFinishedMessage()\n        {\n            type = \"TestStatus\";\n            phase = \"End\";\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/UnityTestProtocol/TestFinishedMessage.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 423fe2ef878fa1140a7e1f7f9e365815\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/UnityTestProtocol/TestPlanMessage.cs",
    "content": "using System.Collections.Generic;\n\nnamespace UnityEditor.TestTools.TestRunner.UnityTestProtocol\n{\n    internal class TestPlanMessage : Message\n    {\n        public List<string> tests;\n\n        public TestPlanMessage()\n        {\n            type = \"TestPlan\";\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/UnityTestProtocol/TestPlanMessage.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 28f79a0d7e64c2345bc46f8c4cf788f8\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/UnityTestProtocol/TestRunnerApiMapper.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Xml;\nusing UnityEditor.TestTools.TestRunner.Api;\n\nnamespace UnityEditor.TestTools.TestRunner.UnityTestProtocol\n{\n    internal class TestRunnerApiMapper : ITestRunnerApiMapper\n    {\n        public TestPlanMessage MapTestToTestPlanMessage(ITestAdaptor testsToRun)\n        {\n            var testsNames = testsToRun != null ? FlattenTestNames(testsToRun) : new List<string>();\n\n            var msg = new TestPlanMessage\n            {\n                tests = testsNames\n            };\n\n            return msg;\n        }\n\n        public TestStartedMessage MapTestToTestStartedMessage(ITestAdaptor test)\n        {\n            return new TestStartedMessage\n            {\n                name = test.FullName\n            };\n        }\n\n        public TestFinishedMessage TestResultToTestFinishedMessage(ITestResultAdaptor result)\n        {\n            return new TestFinishedMessage\n            {\n                name = result.Test.FullName,\n                duration = Convert.ToUInt64(result.Duration * 1000),\n                durationMicroseconds = Convert.ToUInt64(result.Duration * 1000000),\n                message = result.Message,\n                state = GetTestStateFromResult(result)\n            };\n        }\n\n        public string GetRunStateFromResultNunitXml(ITestResultAdaptor result)\n        {\n            var doc = new XmlDocument();\n            doc.LoadXml(result.ToXml().OuterXml);\n            return doc.FirstChild.Attributes[\"runstate\"].Value;\n        }\n\n        public TestState GetTestStateFromResult(ITestResultAdaptor result)\n        {\n            var state = TestState.Failure;\n\n            if (result.TestStatus == TestStatus.Passed)\n            {\n                state = TestState.Success;\n\n                var runstate = GetRunStateFromResultNunitXml(result);\n                runstate = runstate ?? String.Empty;\n\n                if (runstate.ToLowerInvariant().Equals(\"explicit\"))\n                    state = TestState.Skipped;\n            }\n            else if (result.TestStatus == TestStatus.Skipped)\n            {\n                state = TestState.Skipped;\n\n                if (result.ResultState.ToLowerInvariant().EndsWith(\"ignored\"))\n                    state = TestState.Ignored;\n            }\n            else\n            {\n                if (result.ResultState.ToLowerInvariant().Equals(\"inconclusive\"))\n                    state = TestState.Inconclusive;\n\n                if (result.ResultState.ToLowerInvariant().EndsWith(\"cancelled\") ||\n                    result.ResultState.ToLowerInvariant().EndsWith(\"error\"))\n                    state = TestState.Error;\n            }\n\n            return state;\n        }\n\n        public List<string> FlattenTestNames(ITestAdaptor test)\n        {\n            var results = new List<string>();\n\n            if (!test.IsSuite)\n                results.Add(test.FullName);\n\n            if (test.Children != null && test.Children.Any())\n                foreach (var child in test.Children)\n                    results.AddRange(FlattenTestNames(child));\n\n            return results;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/UnityTestProtocol/TestRunnerApiMapper.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 2011a59d3f76b3d4a85cb53f945fceee\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/UnityTestProtocol/TestStartedMessage.cs",
    "content": "namespace UnityEditor.TestTools.TestRunner.UnityTestProtocol\n{\n    internal class TestStartedMessage : Message\n    {\n        public string name;\n        public TestState state;\n\n        public TestStartedMessage()\n        {\n            type = \"TestStatus\";\n            phase = \"Begin\";\n            state = TestState.Inconclusive;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/UnityTestProtocol/TestStartedMessage.cs.meta",
    "content": "fileFormatVersion: 2\nguid: bd3e81baa10021f4d877fa36382bab16\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/UnityTestProtocol/TestState.cs",
    "content": "namespace UnityEditor.TestTools.TestRunner.UnityTestProtocol\n{\n    // This matches the state definitions expected by the Perl code, which in turn matches the NUnit 2 values...\n    internal enum TestState\n    {\n        Inconclusive = 0,\n        Skipped = 2,\n        Ignored = 3,\n        Success = 4,\n        Failure = 5,\n        Error = 6\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/UnityTestProtocol/TestState.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 77f432980bb30084299a138e15c6f571\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/UnityTestProtocol/UnityTestProtocolListener.cs",
    "content": "using UnityEditor.TestTools.TestRunner.Api;\nusing UnityEngine;\n\nnamespace UnityEditor.TestTools.TestRunner.UnityTestProtocol\n{\n    internal class UnityTestProtocolListener : ScriptableObject, ICallbacks\n    {\n        private IUtpMessageReporter m_UtpMessageReporter;\n\n        public UnityTestProtocolListener()\n        {\n            m_UtpMessageReporter = new UtpMessageReporter(new UtpDebugLogger());\n        }\n\n        public void RunStarted(ITestAdaptor testsToRun)\n        {\n            m_UtpMessageReporter.ReportTestRunStarted(testsToRun);\n        }\n\n        public void RunFinished(ITestResultAdaptor testResults)\n        {\n            // Apparently does nothing :)\n        }\n\n        public void TestStarted(ITestAdaptor test)\n        {\n            m_UtpMessageReporter.ReportTestStarted(test);\n        }\n\n        public void TestFinished(ITestResultAdaptor result)\n        {\n            m_UtpMessageReporter.ReportTestFinished(result);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/UnityTestProtocol/UnityTestProtocolListener.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 900aac3710bc14542a8d164e3f0ff820\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/UnityTestProtocol/UnityTestProtocolStarter.cs",
    "content": "using System;\nusing System.Linq;\nusing UnityEditor.Compilation;\nusing UnityEditor.TestTools.TestRunner.Api;\nusing UnityEngine;\nusing UnityEngine.TestTools;\n\nnamespace UnityEditor.TestTools.TestRunner.UnityTestProtocol\n{\n    [InitializeOnLoad]\n    internal static class UnityTestProtocolStarter\n    {\n        static UnityTestProtocolStarter()\n        {\n            var commandLineArgs = Environment.GetCommandLineArgs();\n            if (commandLineArgs.Contains(\"-automated\") && commandLineArgs.Contains(\"-runTests\")) // wanna have it only for utr run\n            {\n                var api = ScriptableObject.CreateInstance<TestRunnerApi>();\n                var listener = ScriptableObject.CreateInstance<UnityTestProtocolListener>();\n                api.RegisterCallbacks(listener);\n                CompilationPipeline.assemblyCompilationFinished += OnAssemblyCompilationFinished;\n            }\n        }\n\n        public static void OnAssemblyCompilationFinished(string assembly, CompilerMessage[] messages)\n        {\n            bool checkCompileErrors = RecompileScripts.Current == null || RecompileScripts.Current.ExpectScriptCompilationSuccess;\n\n            if (checkCompileErrors && messages.Any(x => x.type == CompilerMessageType.Error))\n            {\n                var compilerErrorMessages = messages.Where(x => x.type == CompilerMessageType.Error);\n                var utpMessageReporter = new UtpMessageReporter(new UtpDebugLogger());\n                utpMessageReporter.ReportAssemblyCompilationErrors(assembly, compilerErrorMessages);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/UnityTestProtocol/UnityTestProtocolStarter.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 1ac58cb55fc8daf4abd3945a2bbbb0c5\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/UnityTestProtocol/UtpDebuglogger.cs",
    "content": "using UnityEngine;\n\nnamespace UnityEditor.TestTools.TestRunner.UnityTestProtocol\n{\n    class UtpDebugLogger : IUtpLogger\n    {\n        public void Log(Message msg)\n        {\n            var msgJson = JsonUtility.ToJson(msg);\n            Debug.LogFormat(LogType.Log, LogOption.NoStacktrace, null, \"\\n##utp:{0}\", msgJson);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/UnityTestProtocol/UtpDebuglogger.cs.meta",
    "content": "fileFormatVersion: 2\nguid: d0abdd8cb6b29a24c8ee19626ef741b9\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/UnityTestProtocol/UtpMessageReporter.cs",
    "content": "using System.Collections.Generic;\nusing System.Linq;\nusing UnityEditor.Compilation;\nusing UnityEditor.TestTools.TestRunner.Api;\n\nnamespace UnityEditor.TestTools.TestRunner.UnityTestProtocol\n{\n    internal class UtpMessageReporter : IUtpMessageReporter\n    {\n        public ITestRunnerApiMapper TestRunnerApiMapper;\n        public IUtpLogger Logger;\n\n        public UtpMessageReporter(IUtpLogger utpLogger)\n        {\n            TestRunnerApiMapper = new TestRunnerApiMapper();\n            Logger = utpLogger;\n        }\n\n        public void ReportAssemblyCompilationErrors(string assembly, IEnumerable<CompilerMessage> errorCompilerMessages)\n        {\n            var compilationErrorMessage = new AssemblyCompilationErrorsMessage\n            {\n                assembly = assembly,\n                errors = errorCompilerMessages.Select(x => x.message).ToArray()\n            };\n\n            Logger.Log(compilationErrorMessage);\n        }\n\n        public void ReportTestRunStarted(ITestAdaptor testsToRun)\n        {\n            var msg = TestRunnerApiMapper.MapTestToTestPlanMessage(testsToRun);\n\n            Logger.Log(msg);\n        }\n\n        public void ReportTestStarted(ITestAdaptor test)\n        {\n            if (test.IsSuite)\n                return;\n\n            var msg = TestRunnerApiMapper.MapTestToTestStartedMessage(test);\n\n            Logger.Log(msg);\n        }\n\n        public void ReportTestFinished(ITestResultAdaptor result)\n        {\n            if (result.Test.IsSuite)\n                return;\n\n            var msg = TestRunnerApiMapper.TestResultToTestFinishedMessage(result);\n\n            Logger.Log(msg);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/UnityTestProtocol/UtpMessageReporter.cs.meta",
    "content": "fileFormatVersion: 2\nguid: ebcc5f899d9277642868aeda9a17cbaf\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner/UnityTestProtocol.meta",
    "content": "fileFormatVersion: 2\nguid: 936c6340f3468444ebb1785b4c311126\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEditor.TestRunner.meta",
    "content": "fileFormatVersion: 2\nguid: 95cdf27b47eb82747ba9e51f41e72a35\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/AssemblyInfo.cs",
    "content": "using System.Reflection;\nusing System.Runtime.CompilerServices;\n\n[assembly: AssemblyTitle(\"UnityEngine.TestRunner\")]\n\n[assembly: InternalsVisibleTo(\"UnityEditor.TestRunner\")]\n[assembly: InternalsVisibleTo(\"DynamicProxyGenAssembly2\")]\n[assembly: InternalsVisibleTo(\"Unity.PerformanceTesting\")]\n[assembly: InternalsVisibleTo(\"Unity.PerformanceTesting.Editor\")]\n[assembly: InternalsVisibleTo(\"Assembly-CSharp-testable\")]\n[assembly: InternalsVisibleTo(\"Assembly-CSharp-Editor-testable\")]\n[assembly: InternalsVisibleTo(\"UnityEngine.TestRunner.Tests\")]\n[assembly: InternalsVisibleTo(\"UnityEditor.TestRunner.Tests\")]\n[assembly: InternalsVisibleTo(\"Unity.PackageManagerUI.Editor\")]\n\n[assembly: AssemblyVersion(\"1.0.0\")]\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/AssemblyInfo.cs.meta",
    "content": "fileFormatVersion: 2\nguid: cc22cc13b69c1094c85e176c008b9ef8\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Assertions/AllocatingGCMemoryConstraint.cs",
    "content": "using System;\nusing NUnit.Framework;\nusing NUnit.Framework.Constraints;\nusing UnityEngine.Profiling;\n\nnamespace UnityEngine.TestTools.Constraints\n{\n    public class AllocatingGCMemoryConstraint : Constraint\n    {\n        private class AllocatingGCMemoryResult : ConstraintResult\n        {\n            private readonly int diff;\n            public AllocatingGCMemoryResult(IConstraint constraint, object actualValue, int diff) : base(constraint, actualValue, diff > 0)\n            {\n                this.diff = diff;\n            }\n\n            public override void WriteMessageTo(MessageWriter writer)\n            {\n                if (diff == 0)\n                    writer.WriteMessageLine(\"The provided delegate did not make any GC allocations.\");\n                else\n                    writer.WriteMessageLine(\"The provided delegate made {0} GC allocation(s).\", diff);\n            }\n        }\n\n        private ConstraintResult ApplyTo(Action action, object original)\n        {\n            var recorder = Recorder.Get(\"GC.Alloc\");\n\n            // The recorder was created enabled, which means it captured the creation of the Recorder object itself, etc.\n            // Disabling it flushes its data, so that we can retrieve the sample block count and have it correctly account\n            // for these initial allocations.\n            recorder.enabled = false;\n\n#if !UNITY_WEBGL\n            recorder.FilterToCurrentThread();\n#endif\n\n            recorder.enabled = true;\n\n            try\n            {\n                action();\n            }\n            finally\n            {\n                recorder.enabled = false;\n#if !UNITY_WEBGL\n                recorder.CollectFromAllThreads();\n#endif\n            }\n\n            return new AllocatingGCMemoryResult(this, original, recorder.sampleBlockCount);\n        }\n\n        public override ConstraintResult ApplyTo(object obj)\n        {\n            if (obj == null)\n                throw new ArgumentNullException();\n\n            TestDelegate d = obj as TestDelegate;\n            if (d == null)\n                throw new ArgumentException(string.Format(\"The actual value must be a TestDelegate but was {0}\",\n                    obj.GetType()));\n\n            return ApplyTo(() => d.Invoke(), obj);\n        }\n\n        public override ConstraintResult ApplyTo<TActual>(ActualValueDelegate<TActual> del)\n        {\n            if (del == null)\n                throw new ArgumentNullException();\n\n            return ApplyTo(() => del.Invoke(), del);\n        }\n\n        public override string Description\n        {\n            get { return \"allocates GC memory\"; }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Assertions/AllocatingGCMemoryConstraint.cs.meta",
    "content": "fileFormatVersion: 2\nguid: d09858396dd7adb4bbdb22ea0c8c3a37\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Assertions/ConstraintsExtensions.cs",
    "content": "using NUnit.Framework.Constraints;\n\nnamespace UnityEngine.TestTools.Constraints\n{\n    public static class ConstraintExtensions\n    {\n        public static AllocatingGCMemoryConstraint AllocatingGCMemory(this ConstraintExpression chain)\n        {\n            var constraint = new AllocatingGCMemoryConstraint();\n            chain.Append(constraint);\n            return constraint;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Assertions/ConstraintsExtensions.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 68a48d1900320ed458e118415857faf6\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Assertions/InvalidSignatureException.cs",
    "content": "using NUnit.Framework;\nusing NUnit.Framework.Interfaces;\n\nnamespace UnityEngine.TestTools.TestRunner\n{\n    internal class InvalidSignatureException : ResultStateException\n    {\n        public InvalidSignatureException(string message)\n            : base(message)\n        {\n        }\n\n        public override ResultState ResultState\n        {\n            get { return ResultState.NotRunnable; }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Assertions/InvalidSignatureException.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 9650d910fcaefb34cb45f121c1993892\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Assertions/Is.cs",
    "content": "namespace UnityEngine.TestTools.Constraints\n{\n    public class Is : NUnit.Framework.Is\n    {\n        public static AllocatingGCMemoryConstraint AllocatingGCMemory()\n        {\n            return new AllocatingGCMemoryConstraint();\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Assertions/Is.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 6d5833966abeadb429de247e4316eef4\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Assertions/LogAssert.cs",
    "content": "using System.Text.RegularExpressions;\nusing UnityEngine.TestTools.Logging;\nusing UnityEngine.TestTools.TestRunner;\n\nnamespace UnityEngine.TestTools\n{\n    public static class LogAssert\n    {\n        public static void Expect(LogType type, string message)\n        {\n            LogScope.Current.ExpectedLogs.Enqueue(new LogMatch() { LogType = type, Message = message });\n        }\n\n        public static void Expect(LogType type, Regex message)\n        {\n            LogScope.Current.ExpectedLogs.Enqueue(new LogMatch() { LogType = type, MessageRegex = message });\n        }\n\n        public static void NoUnexpectedReceived()\n        {\n            LogScope.Current.ProcessExpectedLogs();\n            var isAllLogsHandled = LogScope.Current.IsAllLogsHandled();\n            if (isAllLogsHandled)\n            {\n                return;\n            }\n            var unhandledLog = LogScope.Current.GetUnhandledLog();\n            throw new UnhandledLogMessageException(unhandledLog);\n        }\n\n        public static bool ignoreFailingMessages\n        {\n            get\n            {\n                return LogScope.Current.IgnoreFailingMessages;\n            }\n            set\n            {\n                LogScope.Current.IgnoreFailingMessages = value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Assertions/LogAssert.cs.meta",
    "content": "fileFormatVersion: 2\nguid: c97b794b51780d349a16826a4c7898d7\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Assertions/LogScope/ILogScope.cs",
    "content": "using System;\nusing System.Collections.Generic;\n\nnamespace UnityEngine.TestTools.Logging\n{\n    internal interface ILogScope : IDisposable\n    {\n        List<LogEvent> LogEvents { get; }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Assertions/LogScope/ILogScope.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 3504aa04cda851b44a65973f9aead6f7\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Assertions/LogScope/LogEvent.cs",
    "content": "namespace UnityEngine.TestTools.Logging\n{\n    internal class LogEvent\n    {\n        public string Message { get; set; }\n\n        public string StackTrace { get; set; }\n\n        public LogType LogType { get; set; }\n\n        public bool IsHandled { get; set; }\n\n        public override string ToString()\n        {\n            return string.Format(\"[{0}] {1}\", LogType, Message);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Assertions/LogScope/LogEvent.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 0c56471f08a0f6846afc792f0b4205b9\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Assertions/LogScope/LogMatch.cs",
    "content": "using System;\nusing System.Text.RegularExpressions;\n\nnamespace UnityEngine.TestTools.Logging\n{\n    [Serializable]\n    internal class LogMatch\n    {\n        [SerializeField]\n        private bool m_UseRegex;\n        [SerializeField]\n        private string m_Message;\n        [SerializeField]\n        private string m_MessageRegex;\n        [SerializeField]\n        private string m_LogType;\n\n        public string Message\n        {\n            get { return m_Message; }\n            set\n            {\n                m_Message = value;\n                m_UseRegex = false;\n            }\n        }\n\n        public Regex MessageRegex\n        {\n            get\n            {\n                if (!m_UseRegex)\n                {\n                    return null;\n                }\n\n                return new Regex(m_MessageRegex);\n            }\n            set\n            {\n                if (value != null)\n                {\n                    m_MessageRegex = value.ToString();\n                    m_UseRegex = true;\n                }\n                else\n                {\n                    m_MessageRegex = null;\n                    m_UseRegex = false;\n                }\n            }\n        }\n\n        public LogType? LogType\n        {\n            get\n            {\n                if (!string.IsNullOrEmpty(m_LogType))\n                {\n                    return Enum.Parse(typeof(LogType), m_LogType) as LogType ? ;\n                }\n\n                return null;\n            }\n            set\n            {\n                if (value != null)\n                {\n                    m_LogType = value.Value.ToString();\n                }\n                else\n                {\n                    m_LogType = null;\n                }\n            }\n        }\n\n        public bool Matches(LogEvent log)\n        {\n            if (LogType != null && LogType != log.LogType)\n            {\n                return false;\n            }\n\n            if (m_UseRegex)\n            {\n                return MessageRegex.IsMatch(log.Message);\n            }\n            else\n            {\n                return Message.Equals(log.Message);\n            }\n        }\n\n        public override string ToString()\n        {\n            if (m_UseRegex)\n                return string.Format(\"[{0}] Regex: {1}\", LogType, MessageRegex);\n            else\n                return string.Format(\"[{0}] {1}\", LogType, Message);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Assertions/LogScope/LogMatch.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 9945ffed4692c6044b6d3acf81efd694\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Assertions/LogScope/LogScope.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace UnityEngine.TestTools.Logging\n{\n    internal class LogScope : IDisposable\n    {\n        private bool m_Disposed;\n        private readonly object _lock = new object();\n\n        public Queue<LogMatch> ExpectedLogs { get; set; }\n        public List<LogEvent> AllLogs { get; }\n        public List<LogEvent> FailingLogs { get; }\n        public bool IgnoreFailingMessages { get; set; }\n        public bool IsNUnitException { get; private set; }\n        public bool IsNUnitSuccessException { get; private set; }\n        public bool IsNUnitInconclusiveException { get; private set; }\n        public bool IsNUnitIgnoreException { get; private set; }\n        public string NUnitExceptionMessage { get; private set; }\n\n        private bool m_NeedToProcessLogs;\n        private static List<LogScope> s_ActiveScopes = new List<LogScope>();\n\n        internal static LogScope Current\n        {\n            get\n            {\n                if (s_ActiveScopes.Count == 0)\n                    throw new InvalidOperationException(\"No log scope is available\");\n                return s_ActiveScopes[0];\n            }\n        }\n\n        internal static bool HasCurrentLogScope()\n        {\n            return s_ActiveScopes.Count > 0;\n        }\n\n        public LogScope()\n        {\n            AllLogs = new List<LogEvent>();\n            FailingLogs = new List<LogEvent>();\n            ExpectedLogs = new Queue<LogMatch>();\n            IgnoreFailingMessages = false;\n            Activate();\n        }\n\n        private void Activate()\n        {\n            s_ActiveScopes.Insert(0, this);\n            RegisterScope(this);\n            Application.logMessageReceivedThreaded -= AddLog;\n            Application.logMessageReceivedThreaded += AddLog;\n        }\n\n        private void Deactivate()\n        {\n            Application.logMessageReceivedThreaded -= AddLog;\n            s_ActiveScopes.Remove(this);\n            UnregisterScope(this);\n        }\n\n        private static void RegisterScope(LogScope logScope)\n        {\n            Application.logMessageReceivedThreaded += logScope.AddLog;\n        }\n\n        private static void UnregisterScope(LogScope logScope)\n        {\n            Application.logMessageReceivedThreaded -= logScope.AddLog;\n        }\n\n        public void AddLog(string message, string stacktrace, LogType type)\n        {\n            lock (_lock)\n            {\n                m_NeedToProcessLogs = true;\n                var log = new LogEvent\n                {\n                    LogType = type,\n                    Message = message,\n                    StackTrace = stacktrace,\n                };\n\n                AllLogs.Add(log);\n\n                if (IsNUnitResultStateException(stacktrace, type))\n                {\n                    if (message.StartsWith(\"SuccessException\"))\n                    {\n                        IsNUnitException = true;\n                        IsNUnitSuccessException = true;\n                        if (message.StartsWith(\"SuccessException: \"))\n                        {\n                            NUnitExceptionMessage = message.Substring(\"SuccessException: \".Length);\n                            return;\n                        }\n                    }\n                    else if (message.StartsWith(\"InconclusiveException\"))\n                    {\n                        IsNUnitException = true;\n                        IsNUnitInconclusiveException = true;\n                        if (message.StartsWith(\"InconclusiveException: \"))\n                        {\n                            NUnitExceptionMessage = message.Substring(\"InconclusiveException: \".Length);\n                            return;\n                        }\n                    }\n                    else if (message.StartsWith(\"IgnoreException\"))\n                    {\n                        IsNUnitException = true;\n                        IsNUnitIgnoreException = true;\n                        if (message.StartsWith(\"IgnoreException: \"))\n                        {\n                            NUnitExceptionMessage = message.Substring(\"IgnoreException: \".Length);\n                            return;\n                        }\n                    }\n                }\n\n                if (IsFailingLog(type) && !IgnoreFailingMessages)\n                {\n                    FailingLogs.Add(log);\n                }\n            }\n        }\n\n        public bool IsAllLogsHandled()\n        {\n            lock (_lock)\n            {\n                return AllLogs.All(x => x.IsHandled);\n            }\n        }\n\n        public LogEvent GetUnhandledLog()\n        {\n            lock (_lock)\n            {\n                return AllLogs.First(x => !x.IsHandled);\n            }\n        }\n\n        private static bool IsNUnitResultStateException(string stacktrace, LogType logType)\n        {\n            if (logType != LogType.Exception)\n                return false;\n\n            return string.IsNullOrEmpty(stacktrace) || stacktrace.StartsWith(\"NUnit.Framework.Assert.\");\n        }\n\n        private static bool IsFailingLog(LogType type)\n        {\n            switch (type)\n            {\n                case LogType.Assert:\n                case LogType.Error:\n                case LogType.Exception:\n                    return true;\n                default:\n                    return false;\n            }\n        }\n\n        public void Dispose()\n        {\n            Dispose(true);\n            GC.SuppressFinalize(this);\n        }\n\n        protected virtual void Dispose(bool disposing)\n        {\n            if (m_Disposed)\n            {\n                return;\n            }\n\n            m_Disposed = true;\n\n            if (disposing)\n            {\n                Deactivate();\n            }\n        }\n\n        internal bool AnyFailingLogs()\n        {\n            ProcessExpectedLogs();\n            return FailingLogs.Any();\n        }\n\n        internal void ProcessExpectedLogs()\n        {\n            lock (_lock)\n            {\n                if (!m_NeedToProcessLogs || !ExpectedLogs.Any())\n                    return;\n\n                LogMatch expectedLog = null;\n                foreach (var logEvent in AllLogs)\n                {\n                    if (!ExpectedLogs.Any())\n                        break;\n                    if (expectedLog == null && ExpectedLogs.Any())\n                        expectedLog = ExpectedLogs.Peek();\n\n                    if (expectedLog != null && expectedLog.Matches(logEvent))\n                    {\n                        ExpectedLogs.Dequeue();\n                        logEvent.IsHandled = true;\n                        if (FailingLogs.Any(expectedLog.Matches))\n                        {\n                            var failingLog = FailingLogs.First(expectedLog.Matches);\n                            FailingLogs.Remove(failingLog);\n                        }\n                        expectedLog = null;\n                    }\n                }\n                m_NeedToProcessLogs = false;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Assertions/LogScope/LogScope.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 4bbc17b35884fdf468e4b52ae4222882\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Assertions/LogScope.meta",
    "content": "fileFormatVersion: 2\nguid: b1d8465ba1376b148bdab58965101f47\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Assertions/UnexpectedLogMessageException.cs",
    "content": "using NUnit.Framework;\nusing NUnit.Framework.Interfaces;\nusing UnityEngine.TestTools.Logging;\n\nnamespace UnityEngine.TestTools.TestRunner\n{\n    internal class UnexpectedLogMessageException : ResultStateException\n    {\n        public LogMatch LogEvent;\n\n        public UnexpectedLogMessageException(LogMatch log)\n            : base(BuildMessage(log))\n        {\n            LogEvent = log;\n        }\n\n        private static string BuildMessage(LogMatch log)\n        {\n            return string.Format(\"Expected log did not appear: {0}\", log);\n        }\n\n        public override ResultState ResultState\n        {\n            get { return ResultState.Failure; }\n        }\n\n        public override string StackTrace { get { return null; } }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Assertions/UnexpectedLogMessageException.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 5b2eeca598284bd4abb4a15c30df1576\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Assertions/UnhandledLogMessageException.cs",
    "content": "using NUnit.Framework;\nusing NUnit.Framework.Interfaces;\nusing UnityEngine.TestTools.Logging;\nusing UnityEngine.TestTools.Utils;\n\nnamespace UnityEngine.TestTools.TestRunner\n{\n    internal class UnhandledLogMessageException : ResultStateException\n    {\n        public LogEvent LogEvent;\n        private readonly string m_CustomStackTrace;\n\n        public UnhandledLogMessageException(LogEvent log)\n            : base(BuildMessage(log))\n        {\n            LogEvent = log;\n            m_CustomStackTrace = StackTraceFilter.Filter(log.StackTrace);\n        }\n\n        private static string BuildMessage(LogEvent log)\n        {\n            return string.Format(\"Unhandled log message: '{0}'. Use UnityEngine.TestTools.LogAssert.Expect\", log);\n        }\n\n        public override ResultState ResultState\n        {\n            get { return ResultState.Failure; }\n        }\n\n        public override string StackTrace\n        {\n            get { return m_CustomStackTrace; }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Assertions/UnhandledLogMessageException.cs.meta",
    "content": "fileFormatVersion: 2\nguid: a8ed4063f2beecd41a234a582202f3c4\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Assertions/UnityTestTimeoutException.cs",
    "content": "using NUnit.Framework;\nusing NUnit.Framework.Interfaces;\n\nnamespace UnityEngine.TestTools.TestRunner\n{\n    internal class UnityTestTimeoutException : ResultStateException\n    {\n        public UnityTestTimeoutException(int timeout)\n            : base(BuildMessage(timeout))\n        {\n        }\n\n        private static string BuildMessage(int timeout)\n        {\n            return string.Format(\"UnityTest exceeded Timeout value of {0}ms\", timeout);\n        }\n\n        public override ResultState ResultState\n        {\n            get { return ResultState.Failure; }\n        }\n\n        public override string StackTrace\n        {\n            get { return \"\"; }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Assertions/UnityTestTimeoutException.cs.meta",
    "content": "fileFormatVersion: 2\nguid: ffb335140c799c4408411d81789fb05c\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Assertions.meta",
    "content": "fileFormatVersion: 2\nguid: 1ad55f5ad04d1d045a1f287409c650dd\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/ActionDelegator.cs",
    "content": "using System;\nusing System.Linq;\nusing UnityEngine.TestRunner.NUnitExtensions.Runner;\nusing UnityEngine.TestTools.Logging;\nusing UnityEngine.TestTools.TestRunner;\n\nnamespace UnityEngine.TestTools.NUnitExtensions\n{\n    /// <summary>\n    /// This class delegates actions from the NUnit thread that should be executed on the main thread.\n    /// NUnit thread calls Delegate which blocks the execution on the thread until the action is executed.\n    /// The main thread will poll for awaiting actions (HasAction) and invoke them (Execute).\n    /// Once the action is executed, the main thread releases the lock and executino on the NUnit thread is continued.\n    /// </summary>\n    internal class ActionDelegator : BaseDelegator\n    {\n        private Func<object> m_Action;\n        public object Delegate(Action action)\n        {\n            return Delegate(() => { action(); return null; });\n        }\n\n        public object Delegate(Func<object> action)\n        {\n            if (m_Aborted)\n            {\n                return null;\n            }\n\n            AssertState();\n            m_Context = UnityTestExecutionContext.CurrentContext;\n\n            m_Signal.Reset();\n            m_Action = action;\n\n            WaitForSignal();\n\n            return HandleResult();\n        }\n\n        private void AssertState()\n        {\n            if (m_Action != null)\n            {\n                throw new Exception(\"Action not executed yet\");\n            }\n        }\n\n        public bool HasAction()\n        {\n            return m_Action != null;\n        }\n\n        public void Execute(LogScope logScope)\n        {\n            try\n            {\n                SetCurrentTestContext();\n                m_Result = m_Action();\n                if (logScope.AnyFailingLogs())\n                {\n                    var failingLog = logScope.FailingLogs.First();\n                    throw new UnhandledLogMessageException(failingLog);\n                }\n                if (logScope.ExpectedLogs.Any())\n                    throw new UnexpectedLogMessageException(LogScope.Current.ExpectedLogs.Peek());\n            }\n            catch (Exception e)\n            {\n                m_Exception = e;\n            }\n            finally\n            {\n                m_Action = null;\n                m_Signal.Set();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/ActionDelegator.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 4f939b9e23a0946439b812551e07ac81\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Attributes/TestEnumerator.cs",
    "content": "using System;\nusing System.Collections;\nusing NUnit.Framework;\nusing NUnit.Framework.Interfaces;\nusing NUnit.Framework.Internal;\n\nnamespace UnityEngine.TestTools\n{\n    internal class TestEnumerator\n    {\n        private readonly ITestExecutionContext m_Context;\n        private static IEnumerator m_TestEnumerator;\n\n        public static IEnumerator Enumerator { get { return m_TestEnumerator; } }\n\n        public TestEnumerator(ITestExecutionContext context, IEnumerator testEnumerator)\n        {\n            m_Context = context;\n            m_TestEnumerator = testEnumerator;\n        }\n\n        public IEnumerator Execute()\n        {\n            m_Context.CurrentResult.SetResult(ResultState.Success);\n\n            while (true)\n            {\n                object current = null;\n                try\n                {\n                    if (!m_TestEnumerator.MoveNext())\n                    {\n                        yield break;\n                    }\n\n                    if (!m_Context.CurrentResult.ResultState.Equals(ResultState.Success))\n                    {\n                        yield break;\n                    }\n\n                    current = m_TestEnumerator.Current;\n                }\n                catch (Exception exception)\n                {\n                    m_Context.CurrentResult.RecordException(exception);\n                    yield break;\n                }\n                yield return current;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Attributes/TestEnumerator.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 750aad009559b814dbc27001341fc1c3\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityCombinatorialStrategy.cs",
    "content": "using System.Collections;\nusing System.Collections.Generic;\nusing NUnit.Framework.Interfaces;\nusing NUnit.Framework.Internal.Builders;\n\nnamespace UnityEngine.TestTools\n{\n    internal class UnityCombinatorialStrategy : CombinatorialStrategy, ICombiningStrategy\n    {\n        public new IEnumerable<ITestCaseData> GetTestCases(IEnumerable[] sources)\n        {\n            var testCases = base.GetTestCases(sources);\n            foreach (var testCase in testCases)\n            {\n                testCase.GetType().GetProperty(\"ExpectedResult\").SetValue(testCase, new object(), null);\n            }\n            return testCases;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityCombinatorialStrategy.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 7af6ac3e6b51b8d4aab04adc85b8de2f\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityPlatformAttribute.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing NUnit.Framework;\nusing NUnit.Framework.Interfaces;\nusing NUnit.Framework.Internal;\n\nnamespace UnityEngine.TestTools\n{\n    [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = false)]\n    public class UnityPlatformAttribute : NUnitAttribute, IApplyToTest\n    {\n        public RuntimePlatform[] include { get; set; }\n        public RuntimePlatform[] exclude { get; set; }\n\n        private string m_skippedReason;\n\n        public UnityPlatformAttribute()\n        {\n            include = new List<RuntimePlatform>().ToArray();\n            exclude = new List<RuntimePlatform>().ToArray();\n        }\n\n        public UnityPlatformAttribute(params RuntimePlatform[] include)\n            : this()\n        {\n            this.include = include;\n        }\n\n        public void ApplyToTest(Test test)\n        {\n            if (test.RunState == RunState.NotRunnable || test.RunState == RunState.Ignored || IsPlatformSupported(Application.platform))\n            {\n                return;\n            }\n            test.RunState = RunState.Skipped;\n            test.Properties.Add(\"_SKIPREASON\", m_skippedReason);\n        }\n\n        internal bool IsPlatformSupported(RuntimePlatform testTargetPlatform)\n        {\n            if (include.Any() && !include.Any(x => x == testTargetPlatform))\n            {\n                m_skippedReason = string.Format(\"Only supported on {0}\", string.Join(\", \", include.Select(x => x.ToString()).ToArray()));\n                return false;\n            }\n\n            if (exclude.Any(x => x == testTargetPlatform))\n            {\n                m_skippedReason = string.Format(\"Not supported on  {0}\", string.Join(\", \", include.Select(x => x.ToString()).ToArray()));\n                return false;\n            }\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityPlatformAttribute.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 5440c1153b397e14c9c7b1d6eb83b9f9\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnitySetUpAttribute.cs",
    "content": "using System;\nusing NUnit.Framework;\n\nnamespace UnityEngine.TestTools\n{\n    [AttributeUsage(AttributeTargets.Method)]\n    public class UnitySetUpAttribute : NUnitAttribute\n    {\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnitySetUpAttribute.cs.meta",
    "content": "fileFormatVersion: 2\nguid: cc6401f13df54ba44bfd7cdc93c7d64d\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityTearDownAttribute.cs",
    "content": "using System;\nusing NUnit.Framework;\n\nnamespace UnityEngine.TestTools\n{\n    [AttributeUsage(AttributeTargets.Method)]\n    public class UnityTearDownAttribute : NUnitAttribute\n    {\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityTearDownAttribute.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 600f4b74746dbf944901257f81a8af6d\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityTestAttribute.cs",
    "content": "using System;\nusing NUnit.Framework;\nusing NUnit.Framework.Internal.Commands;\nusing NUnit.Framework.Interfaces;\nusing NUnit.Framework.Internal;\nusing NUnit.Framework.Internal.Builders;\nusing UnityEngine.TestRunner.NUnitExtensions.Runner;\n\nnamespace UnityEngine.TestTools\n{\n    [AttributeUsage(AttributeTargets.Method)]\n    public class UnityTestAttribute : CombiningStrategyAttribute, IWrapSetUpTearDown, ISimpleTestBuilder, IImplyFixture\n    {\n        public UnityTestAttribute() : base(new UnityCombinatorialStrategy(), new ParameterDataSourceProvider()) {}\n\n        private readonly NUnitTestCaseBuilder _builder = new NUnitTestCaseBuilder();\n\n        TestMethod ISimpleTestBuilder.BuildFrom(IMethodInfo method, Test suite)\n        {\n            TestCaseParameters parms = new TestCaseParameters\n            {\n                ExpectedResult = new object(),\n                HasExpectedResult = true\n            };\n\n            var t = _builder.BuildTestMethod(method, suite, parms);\n\n            if (t.parms != null)\n                t.parms.HasExpectedResult = false;\n            return t;\n        }\n\n        public TestCommand Wrap(TestCommand command)\n        {\n            return new OuterUnityTestActionCommand(\n                new EnumerableSetUpTearDownCommand(\n                    new SetUpTearDownCommand(\n                        new TestActionCommand(\n                            new UnityLogCheckDelegatingCommand(\n                                new EnumerableTestMethodCommand((TestMethod)command.Test))))));\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityTestAttribute.cs.meta",
    "content": "fileFormatVersion: 2\nguid: fedb0f9e5006b1943abae52f52f08a1a\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Attributes.meta",
    "content": "fileFormatVersion: 2\nguid: 0cb14878543cf3d4f8472b15f7ecf0e3\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/BaseDelegator.cs",
    "content": "using System;\nusing System.Threading;\nusing NUnit.Framework.Internal;\n\nnamespace UnityEngine.TestTools.NUnitExtensions\n{\n    internal abstract class BaseDelegator\n    {\n        protected ManualResetEvent m_Signal = new ManualResetEvent(false);\n\n        protected object m_Result;\n        protected Exception m_Exception;\n        protected ITestExecutionContext m_Context;\n\n        protected bool m_Aborted;\n\n        protected object HandleResult()\n        {\n            SetCurrentTestContext();\n            if (m_Exception != null)\n            {\n                var temp = m_Exception;\n                m_Exception = null;\n                throw temp;\n            }\n            var tempResult = m_Result;\n            m_Result = null;\n            return tempResult;\n        }\n\n        protected void WaitForSignal()\n        {\n            while (!m_Signal.WaitOne(100))\n            {\n                if (m_Aborted)\n                {\n                    m_Aborted = false;\n                    Reflect.MethodCallWrapper = null;\n                    throw new Exception();\n                }\n            }\n        }\n\n        public void Abort()\n        {\n            m_Aborted = true;\n        }\n\n        protected void SetCurrentTestContext()\n        {\n            var prop = typeof(TestExecutionContext).GetProperty(\"CurrentContext\");\n            if (prop != null)\n            {\n                prop.SetValue(null, m_Context, null);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/BaseDelegator.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 37cea569bfefafe49a1513c4d7f0e9eb\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Commands/BeforeAfterTestCommandBase.cs",
    "content": "using System;\nusing System.Collections;\nusing System.Linq;\nusing NUnit.Framework.Interfaces;\nusing NUnit.Framework.Internal;\nusing NUnit.Framework.Internal.Commands;\nusing UnityEngine.TestRunner.NUnitExtensions;\nusing UnityEngine.TestRunner.NUnitExtensions.Runner;\nusing UnityEngine.TestTools.Logging;\nusing UnityEngine.TestTools.TestRunner;\n\nnamespace UnityEngine.TestTools\n{\n    internal abstract class BeforeAfterTestCommandBase<T> : DelegatingTestCommand, IEnumerableTestMethodCommand\n    {\n        private string m_BeforeErrorPrefix;\n        private string m_AfterErrorPrefix;\n        private bool m_SkipYieldAfterActions;\n        protected BeforeAfterTestCommandBase(TestCommand innerCommand, string beforeErrorPrefix, string afterErrorPrefix, bool skipYieldAfterActions = false)\n            : base(innerCommand)\n        {\n            m_BeforeErrorPrefix = beforeErrorPrefix;\n            m_AfterErrorPrefix = afterErrorPrefix;\n            m_SkipYieldAfterActions = skipYieldAfterActions;\n        }\n\n        protected T[] BeforeActions = new T[0];\n\n        protected T[] AfterActions = new T[0];\n\n        protected abstract IEnumerator InvokeBefore(T action, Test test, UnityTestExecutionContext context);\n\n        protected abstract IEnumerator InvokeAfter(T action, Test test, UnityTestExecutionContext context);\n\n        protected abstract BeforeAfterTestCommandState GetState(UnityTestExecutionContext context);\n\n        public IEnumerable ExecuteEnumerable(ITestExecutionContext context)\n        {\n            var unityContext = (UnityTestExecutionContext)context;\n            var state = GetState(unityContext);\n\n            if (state == null)\n            {\n                // We do not expect a state to exist in playmode\n                state = ScriptableObject.CreateInstance<BeforeAfterTestCommandState>();\n            }\n\n            state.ApplyTestResult(context.CurrentResult);\n\n            while (state.NextBeforeStepIndex < BeforeActions.Length)\n            {\n                var action = BeforeActions[state.NextBeforeStepIndex];\n                var enumerator = InvokeBefore(action, Test, unityContext);\n                ActivePcHelper.SetEnumeratorPC(enumerator, state.NextBeforeStepPc);\n\n                using (var logScope = new LogScope())\n                {\n                    while (true)\n                    {\n                        try\n                        {\n                            if (!enumerator.MoveNext())\n                            {\n                                break;\n                            }\n                        }\n                        catch (Exception ex)\n                        {\n                            state.TestHasRun = true;\n                            context.CurrentResult.RecordPrefixedException(m_BeforeErrorPrefix, ex);\n                            state.StoreTestResult(context.CurrentResult);\n                            break;\n                        }\n\n                        state.NextBeforeStepPc = ActivePcHelper.GetEnumeratorPC(enumerator);\n                        state.StoreTestResult(context.CurrentResult);\n                        if (m_SkipYieldAfterActions)\n                        {\n                            break;\n                        }\n                        else\n                        {\n                            yield return enumerator.Current;\n                        }\n                    }\n\n                    if (logScope.AnyFailingLogs())\n                    {\n                        state.TestHasRun = true;\n                        context.CurrentResult.RecordPrefixedError(m_BeforeErrorPrefix, new UnhandledLogMessageException(logScope.FailingLogs.First()).Message);\n                        state.StoreTestResult(context.CurrentResult);\n                    }\n                }\n\n                state.NextBeforeStepIndex++;\n                state.NextBeforeStepPc = 0;\n            }\n\n            if (!state.TestHasRun)\n            {\n                if (innerCommand is IEnumerableTestMethodCommand)\n                {\n                    var executeEnumerable = ((IEnumerableTestMethodCommand)innerCommand).ExecuteEnumerable(context);\n                    foreach (var iterator in executeEnumerable)\n                    {\n                        state.StoreTestResult(context.CurrentResult);\n                        yield return iterator;\n                    }\n                }\n                else\n                {\n                    context.CurrentResult = innerCommand.Execute(context);\n                    state.StoreTestResult(context.CurrentResult);\n                }\n\n                state.TestHasRun = true;\n            }\n\n            while (state.NextAfterStepIndex < AfterActions.Length)\n            {\n                state.TestAfterStarted = true;\n                var action = AfterActions[state.NextAfterStepIndex];\n                var enumerator = InvokeAfter(action, Test, unityContext);\n                ActivePcHelper.SetEnumeratorPC(enumerator, state.NextAfterStepPc);\n\n                using (var logScope = new LogScope())\n                {\n                    while (true)\n                    {\n                        try\n                        {\n                            if (!enumerator.MoveNext())\n                            {\n                                break;\n                            }\n                        }\n                        catch (Exception ex)\n                        {\n                            context.CurrentResult.RecordPrefixedException(m_AfterErrorPrefix, ex);\n                            state.StoreTestResult(context.CurrentResult);\n                            break;\n                        }\n\n                        state.NextAfterStepPc = ActivePcHelper.GetEnumeratorPC(enumerator);\n                        state.StoreTestResult(context.CurrentResult);\n\n                        if (m_SkipYieldAfterActions)\n                        {\n                            break;\n                        }\n                        else\n                        {\n                            yield return enumerator.Current;\n                        }\n                    }\n\n                    if (logScope.AnyFailingLogs())\n                    {\n                        state.TestHasRun = true;\n                        context.CurrentResult.RecordPrefixedError(m_AfterErrorPrefix, new UnhandledLogMessageException(logScope.FailingLogs.First()).Message);\n                        state.StoreTestResult(context.CurrentResult);\n                    }\n                }\n\n                state.NextAfterStepIndex++;\n                state.NextAfterStepPc = 0;\n            }\n\n            state.Reset();\n        }\n\n        public override TestResult Execute(ITestExecutionContext context)\n        {\n            throw new NotImplementedException(\"Use ExecuteEnumerable\");\n        }\n\n        private static TestCommandPcHelper pcHelper;\n\n        internal static TestCommandPcHelper ActivePcHelper\n        {\n            get\n            {\n                if (pcHelper == null)\n                {\n                    pcHelper = new TestCommandPcHelper();\n                }\n\n                return pcHelper;\n            }\n            set\n            {\n                pcHelper = value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Commands/BeforeAfterTestCommandBase.cs.meta",
    "content": "fileFormatVersion: 2\nguid: cbbca1d8a0434be4bbc7f165523763ac\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Commands/BeforeAfterTestCommandState.cs",
    "content": "using NUnit.Framework.Interfaces;\nusing NUnit.Framework.Internal;\n\nnamespace UnityEngine.TestTools\n{\n    internal class BeforeAfterTestCommandState : ScriptableObject\n    {\n        public int NextBeforeStepIndex;\n        public int NextBeforeStepPc;\n        public int NextAfterStepIndex;\n        public int NextAfterStepPc;\n        public bool TestHasRun;\n        public TestStatus CurrentTestResultStatus;\n        public string CurrentTestResultLabel;\n        public FailureSite CurrentTestResultSite;\n        public string CurrentTestMessage;\n        public string CurrentTestStrackTrace;\n        public bool TestAfterStarted;\n\n        public void Reset()\n        {\n            NextBeforeStepIndex = 0;\n            NextBeforeStepPc = 0;\n            NextAfterStepIndex = 0;\n            NextAfterStepPc = 0;\n            TestHasRun = false;\n            CurrentTestResultStatus = TestStatus.Inconclusive;\n            CurrentTestResultLabel = null;\n            CurrentTestResultSite = default(FailureSite);\n            CurrentTestMessage = null;\n            CurrentTestStrackTrace = null;\n            TestAfterStarted = false;\n        }\n\n        public void StoreTestResult(TestResult result)\n        {\n            CurrentTestResultStatus = result.ResultState.Status;\n            CurrentTestResultLabel = result.ResultState.Label;\n            CurrentTestResultSite = result.ResultState.Site;\n            CurrentTestMessage = result.Message;\n            CurrentTestStrackTrace = result.StackTrace;\n        }\n\n        public void ApplyTestResult(TestResult result)\n        {\n            result.SetResult(new ResultState(CurrentTestResultStatus, CurrentTestResultLabel, CurrentTestResultSite), CurrentTestMessage, CurrentTestStrackTrace);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Commands/BeforeAfterTestCommandState.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 7f65567c9026afb4db5de3355accc636\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableApplyChangesToContextCommand.cs",
    "content": "\nusing System.Collections;\nusing System.Collections.Generic;\nusing NUnit.Framework.Interfaces;\nusing NUnit.Framework.Internal;\nusing NUnit.Framework.Internal.Commands;\nusing UnityEngine.TestRunner.NUnitExtensions.Runner;\n\nnamespace UnityEngine.TestTools\n{\n    internal class EnumerableApplyChangesToContextCommand : ApplyChangesToContextCommand, IEnumerableTestMethodCommand\n    {\n        public EnumerableApplyChangesToContextCommand(TestCommand innerCommand, IEnumerable<IApplyToContext> changes)\n            : base(innerCommand, changes) { }\n\n        public IEnumerable ExecuteEnumerable(ITestExecutionContext context)\n        {\n            ApplyChanges(context);\n\n            if (innerCommand is IEnumerableTestMethodCommand)\n            {\n                var executeEnumerable = ((IEnumerableTestMethodCommand)innerCommand).ExecuteEnumerable(context);\n                foreach (var iterator in executeEnumerable)\n                {\n                    yield return iterator;\n                }\n            }\n            else\n            {\n                context.CurrentResult = innerCommand.Execute(context);\n            }\n        }\n    }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableApplyChangesToContextCommand.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 3b4429eff9fcffb48b006e8edcc90338\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableSetUpTearDownCommand.cs",
    "content": "using System;\nusing System.Collections;\nusing System.Linq;\nusing System.Reflection;\nusing NUnit.Framework.Internal;\nusing NUnit.Framework.Internal.Commands;\nusing UnityEngine.TestRunner.NUnitExtensions.Runner;\n\nnamespace UnityEngine.TestTools\n{\n    internal class EnumerableSetUpTearDownCommand : BeforeAfterTestCommandBase<MethodInfo>\n    {\n        public EnumerableSetUpTearDownCommand(TestCommand innerCommand)\n            : base(innerCommand, \"SetUp\", \"TearDown\")\n        {\n            if (Test.TypeInfo.Type != null)\n            {\n                BeforeActions = GetMethodsWithAttributeFromFixture(Test.TypeInfo.Type, typeof(UnitySetUpAttribute));\n                AfterActions = GetMethodsWithAttributeFromFixture(Test.TypeInfo.Type, typeof(UnityTearDownAttribute)).Reverse().ToArray();\n            }\n        }\n\n        private static MethodInfo[] GetMethodsWithAttributeFromFixture(Type fixtureType, Type setUpType)\n        {\n            MethodInfo[] methodsWithAttribute = Reflect.GetMethodsWithAttribute(fixtureType, setUpType, true);\n            return methodsWithAttribute.Where(x => x.ReturnType == typeof(IEnumerator)).ToArray();\n        }\n\n        protected override IEnumerator InvokeBefore(MethodInfo action, Test test, UnityTestExecutionContext context)\n        {\n            return (IEnumerator)Reflect.InvokeMethod(action, context.TestObject);\n        }\n\n        protected override IEnumerator InvokeAfter(MethodInfo action, Test test, UnityTestExecutionContext context)\n        {\n            return (IEnumerator)Reflect.InvokeMethod(action, context.TestObject);\n        }\n\n        protected override BeforeAfterTestCommandState GetState(UnityTestExecutionContext context)\n        {\n            return context.SetUpTearDownState;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableSetUpTearDownCommand.cs.meta",
    "content": "fileFormatVersion: 2\nguid: dd85a35169d313840a0874aea1a28629\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableTestMethodCommand.cs",
    "content": "using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing NUnit.Framework;\nusing NUnit.Framework.Interfaces;\nusing NUnit.Framework.Internal;\nusing NUnit.Framework.Internal.Commands;\nusing NUnit.Framework.Internal.Execution;\nusing UnityEngine.TestRunner.NUnitExtensions.Runner;\nusing UnityEngine.TestTools.TestRunner;\n\nnamespace UnityEngine.TestTools\n{\n    internal class EnumerableTestMethodCommand : TestCommand, IEnumerableTestMethodCommand\n    {\n        private readonly TestMethod testMethod;\n\n        public EnumerableTestMethodCommand(TestMethod testMethod)\n            : base(testMethod)\n        {\n            this.testMethod = testMethod;\n        }\n\n        public IEnumerable ExecuteEnumerable(ITestExecutionContext context)\n        {\n            yield return null;\n\n            var currentExecutingTestEnumerator = new TestEnumeratorWrapper(testMethod).GetEnumerator(context);\n            if (currentExecutingTestEnumerator != null)\n            {\n                var testEnumeraterYieldInstruction = new TestEnumerator(context, currentExecutingTestEnumerator);\n\n                yield return testEnumeraterYieldInstruction;\n\n                var enumerator = testEnumeraterYieldInstruction.Execute();\n\n                var executingEnumerator = ExecuteEnumerableAndRecordExceptions(enumerator, context);\n                while (executingEnumerator.MoveNext())\n                {\n                    yield return executingEnumerator.Current;\n                }\n            }\n            else\n            {\n                if (context.CurrentResult.ResultState != ResultState.Ignored)\n                {\n                    context.CurrentResult.SetResult(ResultState.Success);\n                }\n            }\n        }\n\n        private static IEnumerator ExecuteEnumerableAndRecordExceptions(IEnumerator enumerator, ITestExecutionContext context)\n        {\n            while (true)\n            {\n                try\n                {\n                    if (!enumerator.MoveNext())\n                    {\n                        break;\n                    }\n                }\n                catch (Exception ex)\n                {\n                    context.CurrentResult.RecordException(ex);\n                    break;\n                }\n\n                if (enumerator.Current is IEnumerator)\n                {\n                    var current = (IEnumerator)enumerator.Current;\n                    yield return ExecuteEnumerableAndRecordExceptions(current, context);\n                }\n                else\n                {\n                    yield return enumerator.Current;\n                }\n            }\n        }\n\n        public override TestResult Execute(ITestExecutionContext context)\n        {\n            throw new NotImplementedException(\"Use ExecuteEnumerable\");\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableTestMethodCommand.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 19a6f000f81e24c4a826c1abd43e77c7\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Commands/ImmediateEnumerableCommand.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing NUnit.Framework.Internal;\nusing NUnit.Framework.Internal.Commands;\nusing UnityEngine.TestRunner.NUnitExtensions.Runner;\n\nnamespace UnityEngine.TestTools\n{\n    internal class ImmediateEnumerableCommand : DelegatingTestCommand\n    {\n        public ImmediateEnumerableCommand(TestCommand innerCommand)\n            : base(innerCommand) { }\n\n        public override TestResult Execute(ITestExecutionContext context)\n        {\n            if (innerCommand is IEnumerableTestMethodCommand)\n            {\n                var executeEnumerable = ((IEnumerableTestMethodCommand)innerCommand).ExecuteEnumerable(context);\n                foreach (var iterator in executeEnumerable)\n                {\n                    if (iterator != null)\n                    {\n                        throw new Exception(\"Only null can be yielded at this point.\");\n                    }\n                }\n                return context.CurrentResult;\n            }\n\n            return innerCommand.Execute(context);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Commands/ImmediateEnumerableCommand.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 8349e42a2b30c7a4abd8678c203428ba\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Commands/OuterUnityTestActionCommand.cs",
    "content": "using System.Collections;\nusing System.Collections.Generic;\nusing System.Reflection;\nusing NUnit.Framework.Internal;\nusing NUnit.Framework.Internal.Commands;\nusing UnityEngine.TestRunner.NUnitExtensions.Runner;\n\nnamespace UnityEngine.TestTools\n{\n    internal class OuterUnityTestActionCommand : BeforeAfterTestCommandBase<IOuterUnityTestAction>\n    {\n        public OuterUnityTestActionCommand(TestCommand innerCommand)\n            : base(innerCommand, \"BeforeTest\", \"AfterTest\")\n        {\n            if (Test.TypeInfo.Type != null)\n            {\n                BeforeActions = GetUnityTestActionsFromMethod(Test.Method.MethodInfo);\n                AfterActions = BeforeActions;\n            }\n        }\n\n        private static IOuterUnityTestAction[] GetUnityTestActionsFromMethod(MethodInfo method)\n        {\n            var attributes = method.GetCustomAttributes(false);\n            List<IOuterUnityTestAction> actions = new List<IOuterUnityTestAction>();\n            foreach (var attribute in attributes)\n            {\n                if (attribute is IOuterUnityTestAction)\n                    actions.Add(attribute as IOuterUnityTestAction);\n            }\n            return actions.ToArray();\n        }\n\n        protected override IEnumerator InvokeBefore(IOuterUnityTestAction action, Test test, UnityTestExecutionContext context)\n        {\n            return action.BeforeTest(test);\n        }\n\n        protected override IEnumerator InvokeAfter(IOuterUnityTestAction action, Test test, UnityTestExecutionContext context)\n        {\n            return action.AfterTest(test);\n        }\n\n        protected override BeforeAfterTestCommandState GetState(UnityTestExecutionContext context)\n        {\n            return context.OuterUnityTestActionState;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Commands/OuterUnityTestActionCommand.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 0d4fc309a0784294c8ab658b53b12320\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Commands/SetUpTearDownCommand.cs",
    "content": "using System;\nusing System.Collections;\nusing System.Linq;\nusing System.Reflection;\nusing NUnit.Framework;\nusing NUnit.Framework.Internal;\nusing NUnit.Framework.Internal.Commands;\nusing NUnit.Framework.Internal.Execution;\nusing UnityEngine.TestRunner.NUnitExtensions.Runner;\n\nnamespace UnityEngine.TestTools\n{\n    internal class SetUpTearDownCommand : BeforeAfterTestCommandBase<MethodInfo>\n    {\n        public SetUpTearDownCommand(TestCommand innerCommand)\n            : base(innerCommand, \"SetUp\", \"TearDown\", true)\n        {\n            if (Test.TypeInfo.Type != null)\n            {\n                BeforeActions = GetMethodsWithAttributeFromFixture(Test.TypeInfo.Type, typeof(SetUpAttribute));\n                AfterActions = GetMethodsWithAttributeFromFixture(Test.TypeInfo.Type, typeof(TearDownAttribute)).Reverse().ToArray();\n            }\n        }\n\n        private static MethodInfo[] GetMethodsWithAttributeFromFixture(Type fixtureType, Type setUpType)\n        {\n            MethodInfo[] methodsWithAttribute = Reflect.GetMethodsWithAttribute(fixtureType, setUpType, true);\n            return methodsWithAttribute.Where(x => x.ReturnType == typeof(void)).ToArray();\n        }\n\n        protected override IEnumerator InvokeBefore(MethodInfo action, Test test, UnityTestExecutionContext context)\n        {\n            Reflect.InvokeMethod(action, context.TestObject);\n            yield return null;\n        }\n\n        protected override IEnumerator InvokeAfter(MethodInfo action, Test test, UnityTestExecutionContext context)\n        {\n            Reflect.InvokeMethod(action, context.TestObject);\n            yield return null;\n        }\n\n        protected override BeforeAfterTestCommandState GetState(UnityTestExecutionContext context)\n        {\n            return null;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Commands/SetUpTearDownCommand.cs.meta",
    "content": "fileFormatVersion: 2\nguid: e0db3f3921670cd4ca2e925737c3fba4\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Commands/TestActionCommand.cs",
    "content": "using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Reflection;\nusing NUnit.Framework;\nusing NUnit.Framework.Internal;\nusing NUnit.Framework.Internal.Commands;\nusing UnityEngine.TestRunner.NUnitExtensions.Runner;\n\nnamespace UnityEngine.TestTools\n{\n    internal class TestActionCommand : BeforeAfterTestCommandBase<ITestAction>\n    {\n        public TestActionCommand(TestCommand innerCommand)\n            : base(innerCommand, \"BeforeTest\", \"AfterTest\", true)\n        {\n            if (Test.TypeInfo.Type != null)\n            {\n                BeforeActions = GetTestActionsFromMethod(Test.Method.MethodInfo);\n                AfterActions = BeforeActions;\n            }\n        }\n\n        private static ITestAction[] GetTestActionsFromMethod(MethodInfo method)\n        {\n            var attributes = method.GetCustomAttributes(false);\n            List<ITestAction> actions = new List<ITestAction>();\n            foreach (var attribute in attributes)\n            {\n                if (attribute is ITestAction)\n                    actions.Add(attribute as ITestAction);\n            }\n            return actions.ToArray();\n        }\n\n        protected override IEnumerator InvokeBefore(ITestAction action, Test test, UnityTestExecutionContext context)\n        {\n            action.BeforeTest(test);\n            yield return null;\n        }\n\n        protected override IEnumerator InvokeAfter(ITestAction action, Test test, UnityTestExecutionContext context)\n        {\n            action.AfterTest(test);\n            yield return null;\n        }\n\n        protected override BeforeAfterTestCommandState GetState(UnityTestExecutionContext context)\n        {\n            return null;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Commands/TestActionCommand.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 2de8ba3b840049641897e0da7ce1d5cd\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Commands/TestCommandPcHelper.cs",
    "content": "using System;\nusing System.Collections;\n\nnamespace UnityEngine.TestTools\n{\n    internal class TestCommandPcHelper\n    {\n        public virtual void SetEnumeratorPC(IEnumerator enumerator, int pc)\n        {\n            // Noop implementation used in playmode.\n        }\n\n        public virtual int GetEnumeratorPC(IEnumerator enumerator)\n        {\n            return 0;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Commands/TestCommandPcHelper.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 33e6b78c96bb0694e96383e3c56b7b54\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Commands.meta",
    "content": "fileFormatVersion: 2\nguid: 6b72875690e0f7343911e06af3145bd5\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/ConstructDelegator.cs",
    "content": "using System;\nusing System.Linq;\nusing NUnit.Framework.Internal;\nusing UnityEngine.TestRunner.NUnitExtensions.Runner;\nusing UnityEngine.TestTools.Logging;\nusing UnityEngine.TestTools.TestRunner;\n\nnamespace UnityEngine.TestTools.NUnitExtensions\n{\n    /// <summary>\n    /// Specialization of BaseDelegator that makes sure objects are created on the MainThread.\n    /// It also deals with ScriptableObjects so that tests can survive assembly reload.\n    /// </summary>\n    internal class ConstructDelegator\n    {\n        private Type m_RequestedType;\n        private object[] m_Arguments;\n\n        private ScriptableObject m_CurrentRunningTest;\n        private readonly IStateSerializer m_StateSerializer;\n\n        protected Exception m_Exception;\n        protected object m_Result;\n        protected ITestExecutionContext m_Context;\n\n        public ConstructDelegator(IStateSerializer stateSerializer)\n        {\n            m_StateSerializer = stateSerializer;\n        }\n\n        protected object HandleResult()\n        {\n            SetCurrentTestContext();\n            if (m_Exception != null)\n            {\n                var temp = m_Exception;\n                m_Exception = null;\n                throw temp;\n            }\n            var tempResult = m_Result;\n            m_Result = null;\n            return tempResult;\n        }\n\n        protected void SetCurrentTestContext()\n        {\n            var prop = typeof(UnityTestExecutionContext).GetProperty(\"CurrentContext\");\n            if (prop != null)\n            {\n                prop.SetValue(null, m_Context, null);\n            }\n        }\n\n        public object Delegate(Type type, object[] arguments)\n        {\n            AssertState();\n            m_Context = UnityTestExecutionContext.CurrentContext;\n\n            m_RequestedType = type;\n            m_Arguments = arguments;\n\n            using (var logScope = new LogScope())\n            {\n                Execute(logScope);\n            }\n\n            return HandleResult();\n        }\n\n        private void AssertState()\n        {\n            if (m_RequestedType != null)\n            {\n                throw new Exception(\"Constructor not executed yet\");\n            }\n        }\n\n        public bool HasAction()\n        {\n            return m_RequestedType != null;\n        }\n\n        public void Execute(LogScope logScope)\n        {\n            try\n            {\n                if (typeof(ScriptableObject).IsAssignableFrom(m_RequestedType))\n                {\n                    if (m_CurrentRunningTest != null && m_RequestedType != m_CurrentRunningTest.GetType())\n                    {\n                        DestroyCurrentTestObjectIfExists();\n                    }\n                    if (m_CurrentRunningTest == null)\n                    {\n                        if (m_StateSerializer.CanRestoreFromScriptableObject(m_RequestedType))\n                        {\n                            m_CurrentRunningTest = m_StateSerializer.RestoreScriptableObjectInstance();\n                        }\n                        else\n                        {\n                            m_CurrentRunningTest = ScriptableObject.CreateInstance(m_RequestedType);\n                        }\n                    }\n                    m_Result = m_CurrentRunningTest;\n                }\n                else\n                {\n                    DestroyCurrentTestObjectIfExists();\n                    m_Result = Activator.CreateInstance(m_RequestedType, m_Arguments);\n                    if (m_StateSerializer.CanRestoreFromJson(m_RequestedType))\n                    {\n                        m_StateSerializer.RestoreClassFromJson(ref m_Result);\n                    }\n                }\n                if (logScope.AnyFailingLogs())\n                {\n                    var failingLog = logScope.FailingLogs.First();\n                    throw new UnhandledLogMessageException(failingLog);\n                }\n                if (logScope.ExpectedLogs.Any())\n                    throw new UnexpectedLogMessageException(LogScope.Current.ExpectedLogs.Peek());\n            }\n            catch (Exception e)\n            {\n                m_Exception = e;\n            }\n            finally\n            {\n                m_RequestedType = null;\n                m_Arguments = null;\n            }\n        }\n\n        public void DestroyCurrentTestObjectIfExists()\n        {\n            if (m_CurrentRunningTest == null)\n                return;\n            Object.DestroyImmediate(m_CurrentRunningTest);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/ConstructDelegator.cs.meta",
    "content": "fileFormatVersion: 2\nguid: b42e1db66fe9c634798674cb9e1df2ca\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Filters/AssemblyNameFilter.cs",
    "content": "using System;\nusing NUnit.Framework.Interfaces;\nusing NUnit.Framework.Internal.Filters;\n\nnamespace UnityEngine.TestRunner.NUnitExtensions.Filters\n{\n    internal class AssemblyNameFilter : ValueMatchFilter\n    {\n        public AssemblyNameFilter(string assemblyName) : base(assemblyName) {}\n\n        public override bool Match(ITest test)\n        {\n            string assemblyName = string.Empty;\n            //Assembly fullname is in the format \"Assembly-name, meta data ...\", so extract the name by looking for the comma\n            if (test.TypeInfo != null && test.TypeInfo.Assembly != null && test.TypeInfo.FullName != null)\n                assemblyName = test.TypeInfo.Assembly.FullName.Substring(0, test.TypeInfo.Assembly.FullName.IndexOf(',')).TrimEnd(',');\n            return ExpectedValue.Equals(assemblyName, StringComparison.OrdinalIgnoreCase);\n        }\n\n        protected override string ElementName\n        {\n            get { return \"id\"; }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Filters/AssemblyNameFilter.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 91319408591cec1478efd3c62f9f418a\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Filters/CategoryFilterExtended.cs",
    "content": "using System.Collections;\nusing System.Linq;\nusing NUnit.Framework.Interfaces;\nusing NUnit.Framework.Internal;\nusing NUnit.Framework.Internal.Filters;\n\nnamespace UnityEngine.TestRunner.NUnitExtensions.Filters\n{\n    internal class CategoryFilterExtended : CategoryFilter\n    {\n        public static string k_DefaultCategory = \"Uncategorized\";\n\n        public CategoryFilterExtended(string name) : base(name)\n        {\n        }\n\n        public override bool Match(ITest test)\n        {\n            IList testCategories = test.Properties[PropertyNames.Category].Cast<string>().ToList();\n\n            if (test is TestMethod)\n            {\n                // Do not count tests with no attribute as Uncategorized if test fixture class has at least one attribute\n                // The test inherits the attribute from the test fixture\n                IList fixtureCategories = test.Parent.Properties[PropertyNames.Category].Cast<string>().ToList();\n                if (fixtureCategories.Count > 0)\n                    return false;\n            }\n\n            if (testCategories.Count == 0 && ExpectedValue == k_DefaultCategory && test is TestMethod)\n                return true;\n\n            return base.Match(test);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Filters/CategoryFilterExtended.cs.meta",
    "content": "fileFormatVersion: 2\nguid: ebeedaa04bb53e24ba2e7fb6745e3fd3\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Filters.meta",
    "content": "fileFormatVersion: 2\nguid: c3de99f9efc582a48995bc8e8c2df418\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/IStateSerializer.cs",
    "content": "using System;\n\nnamespace UnityEngine.TestTools.NUnitExtensions\n{\n    internal interface IStateSerializer\n    {\n        ScriptableObject RestoreScriptableObjectInstance();\n        void RestoreClassFromJson(ref object instance);\n        bool CanRestoreFromJson(Type requestedType);\n        bool CanRestoreFromScriptableObject(Type requestedType);\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/IStateSerializer.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 5f875a14565308a40a5262d2504da705\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Runner/CompositeWorkItem.cs",
    "content": "using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\nusing NUnit.Framework;\nusing NUnit.Framework.Interfaces;\nusing NUnit.Framework.Internal;\nusing NUnit.Framework.Internal.Commands;\nusing NUnit.Framework.Internal.Execution;\nusing UnityEngine.TestTools.Logging;\nusing UnityEngine.TestTools.TestRunner;\n\nnamespace UnityEngine.TestRunner.NUnitExtensions.Runner\n{\n    internal class CompositeWorkItem : UnityWorkItem\n    {\n        private readonly TestSuite _suite;\n        private readonly TestSuiteResult _suiteResult;\n        private readonly ITestFilter _childFilter;\n        private TestCommand _setupCommand;\n        private TestCommand _teardownCommand;\n\n        public List<UnityWorkItem> Children { get; private set; }\n\n        private int _countOrder;\n\n        private CountdownEvent _childTestCountdown;\n\n        public CompositeWorkItem(TestSuite suite, ITestFilter childFilter, WorkItemFactory factory)\n            : base(suite, factory)\n        {\n            _suite = suite;\n            _suiteResult = Result as TestSuiteResult;\n            _childFilter = childFilter;\n            _countOrder = 0;\n        }\n\n        protected override IEnumerable PerformWork()\n        {\n            InitializeSetUpAndTearDownCommands();\n\n            if (UnityTestExecutionContext.CurrentContext != null && m_DontRunRestoringResult && EditModeTestCallbacks.RestoringTestContext != null)\n            {\n                EditModeTestCallbacks.RestoringTestContext();\n            }\n\n            if (!CheckForCancellation())\n                if (Test.RunState == RunState.Explicit && !_childFilter.IsExplicitMatch(Test))\n                    SkipFixture(ResultState.Explicit, GetSkipReason(), null);\n                else\n                    switch (Test.RunState)\n                    {\n                        default:\n                        case RunState.Runnable:\n                        case RunState.Explicit:\n                            Result.SetResult(ResultState.Success);\n\n                            CreateChildWorkItems();\n\n                            if (Children.Count > 0)\n                            {\n                                if (!m_DontRunRestoringResult)\n                                {\n                                    //This is needed to give the editor a chance to go out of playmode if needed before creating objects.\n                                    //If we do not, the objects could be automatically destroyed when exiting playmode and could result in errors later on\n                                    yield return null;\n                                    PerformOneTimeSetUp();\n                                }\n\n                                if (!CheckForCancellation())\n                                {\n                                    switch (Result.ResultState.Status)\n                                    {\n                                        case TestStatus.Passed:\n                                            foreach (var child in RunChildren())\n                                            {\n                                                if (CheckForCancellation())\n                                                {\n                                                    yield break;\n                                                }\n\n                                                yield return child;\n                                            }\n                                            break;\n                                        case TestStatus.Skipped:\n                                        case TestStatus.Inconclusive:\n                                        case TestStatus.Failed:\n                                            SkipChildren(_suite, Result.ResultState.WithSite(FailureSite.Parent), \"OneTimeSetUp: \" + Result.Message);\n                                            break;\n                                    }\n                                }\n\n                                if (Context.ExecutionStatus != TestExecutionStatus.AbortRequested && !m_DontRunRestoringResult)\n                                {\n                                    PerformOneTimeTearDown();\n                                }\n                            }\n                            break;\n\n                        case RunState.Skipped:\n                            SkipFixture(ResultState.Skipped, GetSkipReason(), null);\n                            break;\n\n                        case RunState.Ignored:\n                            SkipFixture(ResultState.Ignored, GetSkipReason(), null);\n                            break;\n\n                        case RunState.NotRunnable:\n                            SkipFixture(ResultState.NotRunnable, GetSkipReason(), GetProviderStackTrace());\n                            break;\n                    }\n            if (!ResultedInDomainReload)\n            {\n                WorkItemComplete();\n            }\n        }\n\n        private bool CheckForCancellation()\n        {\n            if (Context.ExecutionStatus != TestExecutionStatus.Running)\n            {\n                Result.SetResult(ResultState.Cancelled, \"Test cancelled by user\");\n                return true;\n            }\n\n            return false;\n        }\n\n        private void InitializeSetUpAndTearDownCommands()\n        {\n            List<SetUpTearDownItem> setUpTearDownItems = _suite.TypeInfo != null\n                ? CommandBuilder.BuildSetUpTearDownList(_suite.TypeInfo.Type, typeof(OneTimeSetUpAttribute), typeof(OneTimeTearDownAttribute))\n                : new List<SetUpTearDownItem>();\n\n            var actionItems = new List<TestActionItem>();\n            foreach (ITestAction action in Actions)\n            {\n                bool applyToSuite = (action.Targets & ActionTargets.Suite) == ActionTargets.Suite\n                    || action.Targets == ActionTargets.Default && !(Test is ParameterizedMethodSuite);\n\n                bool applyToTest = (action.Targets & ActionTargets.Test) == ActionTargets.Test\n                    && !(Test is ParameterizedMethodSuite);\n\n                if (applyToSuite)\n                    actionItems.Add(new TestActionItem(action));\n\n                if (applyToTest)\n                    Context.UpstreamActions.Add(action);\n            }\n\n            _setupCommand = CommandBuilder.MakeOneTimeSetUpCommand(_suite, setUpTearDownItems, actionItems);\n            _teardownCommand = CommandBuilder.MakeOneTimeTearDownCommand(_suite, setUpTearDownItems, actionItems);\n        }\n\n        private void PerformOneTimeSetUp()\n        {\n            var logScope = new LogScope();\n            try\n            {\n                _setupCommand.Execute(Context);\n            }\n            catch (Exception ex)\n            {\n                if (ex is NUnitException || ex is TargetInvocationException)\n                    ex = ex.InnerException;\n\n                Result.RecordException(ex, FailureSite.SetUp);\n            }\n\n            if (logScope.AnyFailingLogs())\n            {\n                Result.RecordException(new UnhandledLogMessageException(logScope.FailingLogs.First()));\n            }\n            logScope.Dispose();\n        }\n\n        private IEnumerable RunChildren()\n        {\n            int childCount = Children.Count;\n            if (childCount == 0)\n                throw new InvalidOperationException(\"RunChildren called but item has no children\");\n\n            _childTestCountdown = new CountdownEvent(childCount);\n\n            foreach (UnityWorkItem child in Children)\n            {\n                if (CheckForCancellation())\n                {\n                    yield break;\n                }\n\n                var unityTestExecutionContext = new UnityTestExecutionContext(Context);\n                child.InitializeContext(unityTestExecutionContext);\n\n                var enumerable = child.Execute().GetEnumerator();\n\n                while (true)\n                {\n                    if (!enumerable.MoveNext())\n                    {\n                        break;\n                    }\n                    ResultedInDomainReload |= child.ResultedInDomainReload;\n                    yield return enumerable.Current;\n                }\n\n                _suiteResult.AddResult(child.Result);\n                childCount--;\n            }\n\n            if (childCount > 0)\n            {\n                while (childCount-- > 0)\n                    CountDownChildTest();\n            }\n        }\n\n        private void CreateChildWorkItems()\n        {\n            Children = new List<UnityWorkItem>();\n            var testSuite = _suite;\n\n            foreach (ITest test in testSuite.Tests)\n            {\n                if (_childFilter.Pass(test))\n                {\n                    var child = m_Factory.Create(test, _childFilter);\n\n                    if (test.Properties.ContainsKey(PropertyNames.Order))\n                    {\n                        Children.Insert(0, child);\n                        _countOrder++;\n                    }\n                    else\n                    {\n                        Children.Add(child);\n                    }\n                }\n            }\n\n            if (_countOrder != 0) SortChildren();\n        }\n\n        private class UnityWorkItemOrderComparer : IComparer<UnityWorkItem>\n        {\n            public int Compare(UnityWorkItem x, UnityWorkItem y)\n            {\n                var xKey = int.MaxValue;\n                var yKey = int.MaxValue;\n\n                if (x.Test.Properties.ContainsKey(PropertyNames.Order))\n                    xKey = (int)x.Test.Properties[PropertyNames.Order][0];\n\n                if (y.Test.Properties.ContainsKey(PropertyNames.Order))\n                    yKey = (int)y.Test.Properties[PropertyNames.Order][0];\n\n                return xKey.CompareTo(yKey);\n            }\n        }\n\n        private void SortChildren()\n        {\n            Children.Sort(0, _countOrder, new UnityWorkItemOrderComparer());\n        }\n\n        private void SkipFixture(ResultState resultState, string message, string stackTrace)\n        {\n            Result.SetResult(resultState.WithSite(FailureSite.SetUp), message, StackFilter.Filter(stackTrace));\n            SkipChildren(_suite, resultState.WithSite(FailureSite.Parent), \"OneTimeSetUp: \" + message);\n        }\n\n        private void SkipChildren(TestSuite suite, ResultState resultState, string message)\n        {\n            foreach (Test child in suite.Tests)\n            {\n                if (_childFilter.Pass(child))\n                {\n                    Context.Listener.TestStarted(child);\n                    TestResult childResult = child.MakeTestResult();\n                    childResult.SetResult(resultState, message);\n                    _suiteResult.AddResult(childResult);\n\n                    if (child.IsSuite)\n                        SkipChildren((TestSuite)child, resultState, message);\n\n                    Context.Listener.TestFinished(childResult);\n                }\n            }\n        }\n\n        private void PerformOneTimeTearDown()\n        {\n            _teardownCommand.Execute(Context);\n        }\n\n        private string GetSkipReason()\n        {\n            return (string)Test.Properties.Get(PropertyNames.SkipReason);\n        }\n\n        private string GetProviderStackTrace()\n        {\n            return (string)Test.Properties.Get(PropertyNames.ProviderStackTrace);\n        }\n\n        private void CountDownChildTest()\n        {\n            _childTestCountdown.Signal();\n            if (_childTestCountdown.CurrentCount == 0)\n            {\n                if (Context.ExecutionStatus != TestExecutionStatus.AbortRequested)\n                    PerformOneTimeTearDown();\n\n                foreach (var childResult in _suiteResult.Children)\n                    if (childResult.ResultState == ResultState.Cancelled)\n                    {\n                        this.Result.SetResult(ResultState.Cancelled, \"Cancelled by user\");\n                        break;\n                    }\n\n                WorkItemComplete();\n            }\n        }\n\n        public override void Cancel(bool force)\n        {\n            if (Children == null)\n                return;\n\n            foreach (var child in Children)\n            {\n                var ctx = child.Context;\n                if (ctx != null)\n                    ctx.ExecutionStatus = force ? TestExecutionStatus.AbortRequested : TestExecutionStatus.StopRequested;\n\n                if (child.State == WorkItemState.Running)\n                    child.Cancel(force);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Runner/CompositeWorkItem.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 110d5035a36a6a34580fb65bb40cd78f\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Runner/CoroutineTestWorkItem.cs",
    "content": "using System;\nusing System.Collections;\nusing NUnit.Framework.Interfaces;\nusing NUnit.Framework.Internal;\nusing NUnit.Framework.Internal.Commands;\nusing NUnit.Framework.Internal.Execution;\nusing UnityEngine.TestTools.Utils;\n\nnamespace UnityEngine.TestRunner.NUnitExtensions.Runner\n{\n    internal class CoroutineTestWorkItem : UnityWorkItem\n    {\n        private static MonoBehaviour m_MonoBehaviourCoroutineRunner;\n        private TestCommand m_Command;\n\n        public static MonoBehaviour monoBehaviourCoroutineRunner\n        {\n            get\n            {\n                if (m_MonoBehaviourCoroutineRunner == null)\n                {\n                    throw new NullReferenceException(\"MonoBehaviour coroutine runner not set\");\n                }\n                return m_MonoBehaviourCoroutineRunner;\n            }\n            set { m_MonoBehaviourCoroutineRunner = value; }\n        }\n\n        public CoroutineTestWorkItem(TestMethod test, ITestFilter filter)\n            : base(test, null)\n        {\n            m_Command = test.RunState == RunState.Runnable || test.RunState == RunState.Explicit && filter.IsExplicitMatch(test)\n                ? CommandBuilder.MakeTestCommand(test)\n                : CommandBuilder.MakeSkipCommand(test);\n        }\n\n        protected override IEnumerable PerformWork()\n        {\n            if (m_Command is SkipCommand)\n            {\n                m_Command.Execute(Context);\n                Result = Context.CurrentResult;\n                WorkItemComplete();\n                yield break;\n            }\n\n            if (m_Command is ApplyChangesToContextCommand)\n            {\n                var applyChangesToContextCommand = (ApplyChangesToContextCommand)m_Command;\n                applyChangesToContextCommand.ApplyChanges(Context);\n                m_Command = applyChangesToContextCommand.GetInnerCommand();\n            }\n\n            var enumerableTestMethodCommand = (IEnumerableTestMethodCommand)m_Command;\n            try\n            {\n                var executeEnumerable = enumerableTestMethodCommand.ExecuteEnumerable(Context).GetEnumerator();\n\n                var coroutineRunner = new CoroutineRunner(monoBehaviourCoroutineRunner, Context);\n                yield return coroutineRunner.HandleEnumerableTest(executeEnumerable);\n\n                if (coroutineRunner.HasFailedWithTimeout())\n                {\n                    Context.CurrentResult.SetResult(ResultState.Failure, string.Format(\"Test exceeded Timeout value of {0}ms\", Context.TestCaseTimeout));\n                }\n\n                while (executeEnumerable.MoveNext()) {}\n\n                Result = Context.CurrentResult;\n            }\n            finally\n            {\n                WorkItemComplete();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Runner/CoroutineTestWorkItem.cs.meta",
    "content": "fileFormatVersion: 2\nguid: b557515fff172984e8c4400b43f1c631\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Runner/DefaultTestWorkItem.cs",
    "content": "using System;\nusing System.Collections;\nusing System.Linq;\nusing NUnit.Framework.Interfaces;\nusing NUnit.Framework.Internal;\nusing NUnit.Framework.Internal.Commands;\nusing NUnit.Framework.Internal.Execution;\nusing UnityEngine.TestTools;\nusing SetUpTearDownCommand = NUnit.Framework.Internal.Commands.SetUpTearDownCommand;\nusing TestActionCommand = NUnit.Framework.Internal.Commands.TestActionCommand;\n\nnamespace UnityEngine.TestRunner.NUnitExtensions.Runner\n{\n    internal class EditModeTestCallbacks\n    {\n        public static Action RestoringTestContext { get; set; }\n    }\n\n    internal class DefaultTestWorkItem : UnityWorkItem\n    {\n        private TestCommand _command;\n\n        public DefaultTestWorkItem(TestMethod test, ITestFilter filter)\n            : base(test, null)\n        {\n            _command = test.RunState == RunState.Runnable || test.RunState == RunState.Explicit && filter.IsExplicitMatch(test)\n                ? BuildTestCommand(test)\n                : new SkipCommand(test);\n        }\n\n        private static TestCommand BuildTestCommand(TestMethod test)\n        {\n            var command = (TestCommand)new TestMethodCommand(test);\n            command = new UnityLogCheckDelegatingCommand(command);\n            foreach (var wrapper in test.Method.GetCustomAttributes<IWrapTestMethod>(true))\n            {\n                command = wrapper.Wrap(command);\n                if (command == null)\n                {\n                    var message = string.Format(\"IWrapTestMethod implementation '{0}' returned null as command.\", wrapper.GetType().FullName);\n                    return new FailCommand(test, ResultState.Failure, message);\n                }\n            }\n\n            command = new TestTools.TestActionCommand(command);\n            command = new TestTools.SetUpTearDownCommand(command);\n            command = new ImmediateEnumerableCommand(command);\n            foreach (var wrapper in test.Method.GetCustomAttributes<IWrapSetUpTearDown>(true))\n            {\n                command = wrapper.Wrap(command);\n                if (command == null)\n                {\n                    var message = string.Format(\"IWrapSetUpTearDown implementation '{0}' returned null as command.\", wrapper.GetType().FullName);\n                    return new FailCommand(test, ResultState.Failure, message);\n                }\n            }\n\n            command = new EnumerableSetUpTearDownCommand(command);\n            command = new OuterUnityTestActionCommand(command);\n\n            IApplyToContext[] changes = test.Method.GetCustomAttributes<IApplyToContext>(true);\n            if (changes.Length > 0)\n            {\n                command = new EnumerableApplyChangesToContextCommand(command, changes);\n            }\n\n            return command;\n        }\n\n        protected override IEnumerable PerformWork()\n        {\n            if (m_DontRunRestoringResult && EditModeTestCallbacks.RestoringTestContext != null)\n            {\n                EditModeTestCallbacks.RestoringTestContext();\n                Result = Context.CurrentResult;\n                yield break;\n            }\n\n            try\n            {\n                if (_command is SkipCommand || _command is FailCommand)\n                {\n                    Result = _command.Execute(Context);\n                    yield break;\n                }\n\n                if (!(_command is IEnumerableTestMethodCommand))\n                {\n                    Debug.LogError(\"Cannot perform work on \" + _command.GetType().Name);\n                    yield break;\n                }\n\n                foreach (var workItemStep in ((IEnumerableTestMethodCommand)_command).ExecuteEnumerable(Context))\n                {\n                    ResultedInDomainReload = false;\n\n                    if (workItemStep is IEditModeTestYieldInstruction)\n                    {\n                        var editModeTestYieldInstruction = (IEditModeTestYieldInstruction)workItemStep;\n                        yield return editModeTestYieldInstruction;\n                        var enumerator = editModeTestYieldInstruction.Perform();\n                        while (true)\n                        {\n                            bool moveNext;\n                            try\n                            {\n                                moveNext = enumerator.MoveNext();\n                            }\n                            catch (Exception e)\n                            {\n                                Context.CurrentResult.RecordException(e);\n                                break;\n                            }\n\n                            if (!moveNext)\n                            {\n                                break;\n                            }\n\n                            yield return null;\n                        }\n                    }\n                    else\n                    {\n                        yield return workItemStep;\n                    }\n                }\n\n                Result = Context.CurrentResult;\n            }\n            finally\n            {\n                WorkItemComplete();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Runner/DefaultTestWorkItem.cs.meta",
    "content": "fileFormatVersion: 2\nguid: c7cfda246e604b945b12b7afedb094ce\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Runner/FailCommand.cs",
    "content": "\nusing NUnit.Framework.Interfaces;\nusing NUnit.Framework.Internal;\nusing NUnit.Framework.Internal.Commands;\n\nnamespace UnityEngine.TestRunner.NUnitExtensions.Runner\n{\n    internal class FailCommand : TestCommand\n    {\n        private ResultState m_ResultState;\n        private string m_Message;\n\n        public FailCommand(Test test, ResultState resultState, string message)\n            : base(test)\n        {\n            m_ResultState = resultState;\n            m_Message = message;\n        }\n\n        public override TestResult Execute(ITestExecutionContext context)\n        {\n            context.CurrentResult.SetResult(m_ResultState, m_Message);\n            return context.CurrentResult;\n        }\n    }\n\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Runner/FailCommand.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 68e5dc8bfd5d72647a93b7f2e1da831a\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Runner/IEnumerableTestMethodCommand.cs",
    "content": "using System.Collections;\nusing NUnit.Framework.Internal;\n\nnamespace UnityEngine.TestRunner.NUnitExtensions.Runner\n{\n    internal interface IEnumerableTestMethodCommand\n    {\n        IEnumerable ExecuteEnumerable(ITestExecutionContext context);\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Runner/IEnumerableTestMethodCommand.cs.meta",
    "content": "fileFormatVersion: 2\nguid: dbd43d8a3b8122d4e89b055f53382b11\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Runner/PlaymodeWorkItemFactory.cs",
    "content": "using NUnit.Framework.Interfaces;\nusing NUnit.Framework.Internal;\n\nnamespace UnityEngine.TestRunner.NUnitExtensions.Runner\n{\n    internal class PlaymodeWorkItemFactory : WorkItemFactory\n    {\n        protected override UnityWorkItem Create(TestMethod method, ITestFilter filter, ITest loadedTest)\n        {\n            return new CoroutineTestWorkItem(method, filter);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Runner/PlaymodeWorkItemFactory.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 7ef6801a8b664544aa9f2ab1bc1f8b60\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Runner/RestoreTestContextAfterDomainReload.cs",
    "content": "namespace UnityEngine.TestRunner.NUnitExtensions.Runner\n{\n    internal class RestoreTestContextAfterDomainReload {}\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Runner/RestoreTestContextAfterDomainReload.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 26721f9940339264fb14bdbfe1290e21\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityLogCheckDelegatingCommand.cs",
    "content": "using System;\nusing System.Collections;\nusing System.Linq;\nusing NUnit.Framework.Internal;\nusing NUnit.Framework.Internal.Commands;\nusing UnityEngine.TestTools.Logging;\nusing UnityEngine.TestTools.TestRunner;\n\nnamespace UnityEngine.TestRunner.NUnitExtensions.Runner\n{\n    internal class UnityLogCheckDelegatingCommand : DelegatingTestCommand, IEnumerableTestMethodCommand\n    {\n        public UnityLogCheckDelegatingCommand(TestCommand innerCommand)\n            : base(innerCommand) {}\n\n        public override TestResult Execute(ITestExecutionContext context)\n        {\n            var logCollector = new LogScope();\n\n            try\n            {\n                innerCommand.Execute(context);\n\n                if (logCollector.AnyFailingLogs())\n                {\n                    var failingLog = logCollector.FailingLogs.First();\n                    throw new UnhandledLogMessageException(failingLog);\n                }\n\n                if (logCollector.ExpectedLogs.Any())\n                {\n                    throw new UnexpectedLogMessageException(logCollector.ExpectedLogs.Peek());\n                }\n            }\n            catch (Exception exception)\n            {\n                context.CurrentResult.RecordException(exception);\n            }\n            logCollector.Dispose();\n            return context.CurrentResult;\n        }\n\n        public IEnumerable ExecuteEnumerable(ITestExecutionContext context)\n        {\n            var logCollector = new LogScope();\n\n            if (!(innerCommand is IEnumerableTestMethodCommand))\n            {\n                Execute(context);\n                yield break;\n            }\n\n            var enumerableTestMethodCommand = (IEnumerableTestMethodCommand)innerCommand;\n\n            IEnumerable executeEnumerable;\n\n            try\n            {\n                executeEnumerable = enumerableTestMethodCommand.ExecuteEnumerable(context);\n            }\n            catch (Exception e)\n            {\n                context.CurrentResult.RecordException(e);\n                yield break;\n            }\n\n            foreach (var step in executeEnumerable)\n            {\n                try\n                {\n                    if (logCollector.AnyFailingLogs())\n                    {\n                        var failingLog = logCollector.FailingLogs.First();\n                        throw new UnhandledLogMessageException(failingLog);\n                    }\n                }\n                catch (Exception e)\n                {\n                    context.CurrentResult.RecordException(e);\n                    break;\n                }\n                yield return step;\n            }\n\n            try\n            {\n                if (logCollector.AnyFailingLogs())\n                {\n                    var failingLog = logCollector.FailingLogs.First();\n                    throw new UnhandledLogMessageException(failingLog);\n                }\n\n                logCollector.ProcessExpectedLogs();\n                if (logCollector.ExpectedLogs.Any())\n                {\n                    throw new UnexpectedLogMessageException(LogScope.Current.ExpectedLogs.Peek());\n                }\n            }\n            catch (Exception exception)\n            {\n                context.CurrentResult.RecordException(exception);\n            }\n            logCollector.Dispose();\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityLogCheckDelegatingCommand.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 48230e4e90fb4d14a9d56bddea898413\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityTestAssemblyRunner.cs",
    "content": "using System.Collections;\nusing System.Collections.Generic;\nusing System.Reflection;\nusing NUnit;\nusing NUnit.Framework.Interfaces;\nusing NUnit.Framework.Internal;\nusing UnityEngine.TestTools.NUnitExtensions;\n\nnamespace UnityEngine.TestRunner.NUnitExtensions.Runner\n{\n    internal interface IUnityTestAssemblyRunner\n    {\n        ITest LoadedTest { get; }\n        ITestResult Result { get; }\n        bool IsTestLoaded { get; }\n        bool IsTestRunning { get; }\n        bool IsTestComplete { get; }\n        UnityWorkItem TopLevelWorkItem { get; set; }\n        UnityTestExecutionContext GetCurrentContext();\n        ITest Load(Assembly[] assemblies, IDictionary<string, object> settings);\n        IEnumerable Run(ITestListener listener, ITestFilter filter);\n        void StopRun();\n    }\n\n    internal class UnityTestAssemblyRunner : IUnityTestAssemblyRunner\n    {\n        private readonly UnityTestAssemblyBuilder unityBuilder;\n        private readonly WorkItemFactory m_Factory;\n\n        protected UnityTestExecutionContext Context { get; set; }\n\n        public UnityTestExecutionContext GetCurrentContext()\n        {\n            return UnityTestExecutionContext.CurrentContext;\n        }\n\n        protected IDictionary<string, object> Settings { get; set; }\n        public ITest LoadedTest { get; protected set; }\n\n        public ITestResult Result\n        {\n            get { return TopLevelWorkItem == null ? null : TopLevelWorkItem.Result; }\n        }\n\n        public bool IsTestLoaded\n        {\n            get { return LoadedTest != null; }\n        }\n\n        public bool IsTestRunning\n        {\n            get { return TopLevelWorkItem != null && TopLevelWorkItem.State == NUnit.Framework.Internal.Execution.WorkItemState.Running; }\n        }\n        public bool IsTestComplete\n        {\n            get { return TopLevelWorkItem != null && TopLevelWorkItem.State == NUnit.Framework.Internal.Execution.WorkItemState.Complete; }\n        }\n\n        public UnityTestAssemblyRunner(UnityTestAssemblyBuilder builder, WorkItemFactory factory)\n        {\n            unityBuilder = builder;\n            m_Factory = factory;\n            Context = new UnityTestExecutionContext();\n        }\n\n        public ITest Load(Assembly[] assemblies, IDictionary<string, object> settings)\n        {\n            Settings = settings;\n\n            if (settings.ContainsKey(FrameworkPackageSettings.RandomSeed))\n                Randomizer.InitialSeed = (int)settings[FrameworkPackageSettings.RandomSeed];\n\n            return LoadedTest = unityBuilder.Build(assemblies, settings);\n        }\n\n        public IEnumerable Run(ITestListener listener, ITestFilter filter)\n        {\n            TopLevelWorkItem = m_Factory.Create(LoadedTest, filter);\n            TopLevelWorkItem.InitializeContext(Context);\n            UnityTestExecutionContext.CurrentContext = Context;\n            Context.Listener = listener;\n\n            return TopLevelWorkItem.Execute();\n        }\n\n        public UnityWorkItem TopLevelWorkItem { get; set; }\n\n        public void StopRun()\n        {\n            if (IsTestRunning)\n            {\n                TopLevelWorkItem.Cancel(false);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityTestAssemblyRunner.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 874e40a588dbb1e48bc128d686337d4e\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityTestExecutionContext.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.IO;\nusing NUnit.Framework;\nusing NUnit.Framework.Constraints;\nusing NUnit.Framework.Interfaces;\nusing NUnit.Framework.Internal;\nusing NUnit.Framework.Internal.Execution;\nusing UnityEngine.TestTools;\n\nnamespace UnityEngine.TestRunner.NUnitExtensions.Runner\n{\n    internal class UnityTestExecutionContext : ITestExecutionContext\n    {\n        private readonly UnityTestExecutionContext _priorContext;\n        private TestResult _currentResult;\n        private int _assertCount;\n\n        public static UnityTestExecutionContext CurrentContext { get; set; }\n\n        public UnityTestExecutionContext Context { get; private set; }\n\n        public Test CurrentTest { get; set; }\n        public DateTime StartTime { get; set; }\n        public long StartTicks { get; set; }\n        public TestResult CurrentResult\n        {\n            get { return _currentResult; }\n            set\n            {\n                _currentResult = value;\n                if (value != null)\n                    OutWriter = value.OutWriter;\n            }\n        }\n\n        public object TestObject { get; set; }\n        public string WorkDirectory { get; set; }\n\n\n        private TestExecutionStatus _executionStatus;\n        public TestExecutionStatus ExecutionStatus\n        {\n            get\n            {\n                // ExecutionStatus may have been set to StopRequested or AbortRequested\n                // in a prior context. If so, reflect the same setting in this context.\n                if (_executionStatus == TestExecutionStatus.Running && _priorContext != null)\n                    _executionStatus = _priorContext.ExecutionStatus;\n\n                return _executionStatus;\n            }\n            set\n            {\n                _executionStatus = value;\n\n                // Push the same setting up to all prior contexts\n                if (_priorContext != null)\n                    _priorContext.ExecutionStatus = value;\n            }\n        }\n\n        public List<ITestAction> UpstreamActions { get; private set; }\n        public int TestCaseTimeout { get; set; }\n        public CultureInfo CurrentCulture { get; set; }\n        public CultureInfo CurrentUICulture { get; set; }\n        public ITestListener Listener { get; set; }\n\n        public UnityTestExecutionContext()\n        {\n            UpstreamActions = new List<ITestAction>();\n            CurrentContext = this;\n        }\n\n        public UnityTestExecutionContext(UnityTestExecutionContext other)\n        {\n            _priorContext = other;\n\n            CurrentTest = other.CurrentTest;\n            CurrentResult = other.CurrentResult;\n            TestObject = other.TestObject;\n            WorkDirectory = other.WorkDirectory;\n            Listener = other.Listener;\n            TestCaseTimeout = other.TestCaseTimeout;\n            UpstreamActions = new List<ITestAction>(other.UpstreamActions);\n            SetUpTearDownState = other.SetUpTearDownState;\n            OuterUnityTestActionState = other.OuterUnityTestActionState;\n\n            TestContext.CurrentTestExecutionContext = this;\n\n            CurrentCulture = other.CurrentCulture;\n            CurrentUICulture = other.CurrentUICulture;\n            CurrentContext = this;\n        }\n\n        public TextWriter OutWriter { get; private set; }\n        public bool StopOnError { get; set; }\n\n        public IWorkItemDispatcher Dispatcher { get; set; }\n\n        public ParallelScope ParallelScope { get; set; }\n        public string WorkerId { get; private set; }\n        public Randomizer RandomGenerator { get; private set; }\n        public ValueFormatter CurrentValueFormatter { get; private set; }\n        public bool IsSingleThreaded { get; set; }\n        public BeforeAfterTestCommandState SetUpTearDownState { get; set; }\n        public BeforeAfterTestCommandState OuterUnityTestActionState { get; set; }\n\n        internal int AssertCount\n        {\n            get\n            {\n                return _assertCount;\n            }\n        }\n\n        public void IncrementAssertCount()\n        {\n            _assertCount += 1;\n        }\n\n        public void AddFormatter(ValueFormatterFactory formatterFactory)\n        {\n            throw new NotImplementedException();\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityTestExecutionContext.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 59ff995fabb3bac45afa0f96f333e5dc\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityWorkItem.cs",
    "content": "using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Linq;\nusing NUnit.Framework;\nusing NUnit.Framework.Interfaces;\nusing NUnit.Framework.Internal;\nusing NUnit.Framework.Internal.Execution;\n\nnamespace UnityEngine.TestRunner.NUnitExtensions.Runner\n{\n    internal abstract class UnityWorkItem\n    {\n        protected readonly WorkItemFactory m_Factory;\n        protected bool m_ExecuteTestStartEvent;\n        protected bool m_DontRunRestoringResult;\n        public event EventHandler Completed;\n\n        public bool ResultedInDomainReload { get; internal set; }\n\n        public UnityTestExecutionContext Context { get; private set; }\n\n        public Test Test { get; private set; }\n\n        public TestResult Result { get; protected set; }\n\n        public WorkItemState State { get; private set; }\n\n        public List<ITestAction> Actions { get; private set; }\n\n        protected UnityWorkItem(Test test, WorkItemFactory factory)\n        {\n            m_Factory = factory;\n            Test = test;\n            Actions = new List<ITestAction>();\n            Result = test.MakeTestResult();\n            State = WorkItemState.Ready;\n            m_ExecuteTestStartEvent = ShouldExecuteStartEvent();\n            m_DontRunRestoringResult = ShouldRestore(test);\n        }\n\n        protected static bool ShouldRestore(ITest loadedTest)\n        {\n            return UnityWorkItemDataHolder.alreadyExecutedTests != null && UnityWorkItemDataHolder.alreadyExecutedTests.Contains(loadedTest.FullName);\n        }\n\n        protected bool ShouldExecuteStartEvent()\n        {\n            return UnityWorkItemDataHolder.alreadyStartedTests != null && UnityWorkItemDataHolder.alreadyStartedTests.All(x => x != Test.FullName) && !ShouldRestore(Test);\n        }\n\n        protected abstract IEnumerable PerformWork();\n\n        public void InitializeContext(UnityTestExecutionContext context)\n        {\n            Context = context;\n\n            if (Test is TestAssembly)\n                Actions.AddRange(ActionsHelper.GetActionsFromTestAssembly((TestAssembly)Test));\n            else if (Test is ParameterizedMethodSuite)\n                Actions.AddRange(ActionsHelper.GetActionsFromTestMethodInfo(Test.Method));\n            else if (Test.TypeInfo != null)\n                Actions.AddRange(ActionsHelper.GetActionsFromTypesAttributes(Test.TypeInfo.Type));\n        }\n\n        public virtual IEnumerable Execute()\n        {\n            Context.CurrentTest = this.Test;\n            Context.CurrentResult = this.Result;\n\n            if (m_ExecuteTestStartEvent)\n            {\n                Context.Listener.TestStarted(Test);\n            }\n\n            Context.StartTime = DateTime.UtcNow;\n            Context.StartTicks = Stopwatch.GetTimestamp();\n\n            State = WorkItemState.Running;\n\n            return PerformWork();\n        }\n\n        protected void WorkItemComplete()\n        {\n            State = WorkItemState.Complete;\n\n            Result.StartTime = Context.StartTime;\n            Result.EndTime = DateTime.UtcNow;\n\n            long tickCount = Stopwatch.GetTimestamp() - Context.StartTicks;\n            double seconds = (double)tickCount / Stopwatch.Frequency;\n            Result.Duration = seconds;\n\n            //Result.AssertCount += Context.AssertCount;\n\n            Context.Listener.TestFinished(Result);\n\n            if (Completed != null)\n                Completed(this, EventArgs.Empty);\n\n            Context.TestObject = null;\n            Test.Fixture = null;\n        }\n\n        public virtual void Cancel(bool force)\n        {\n            Context.Listener.TestFinished(Result);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityWorkItem.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 79ced2556f0af814a840b86232613ff1\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityWorkItemDataHolder.cs",
    "content": "using System.Collections.Generic;\n\nnamespace UnityEngine.TestRunner.NUnitExtensions.Runner\n{\n    internal class UnityWorkItemDataHolder\n    {\n        public static List<string> alreadyStartedTests = new List<string>();\n        public static List<string> alreadyExecutedTests;\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityWorkItemDataHolder.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 5b3e90046c38f1d4dad2e0d5a79e871c\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Runner/WorkItemFactory.cs",
    "content": "using System.Collections;\nusing NUnit.Framework.Interfaces;\nusing NUnit.Framework.Internal;\n\nnamespace UnityEngine.TestRunner.NUnitExtensions.Runner\n{\n    internal abstract class WorkItemFactory\n    {\n        public UnityWorkItem Create(ITest loadedTest, ITestFilter filter)\n        {\n            TestSuite suite = loadedTest as TestSuite;\n            if (suite != null)\n            {\n                return new CompositeWorkItem(suite, filter, this);\n            }\n\n            var testMethod = (TestMethod)loadedTest;\n            if (testMethod.Method.ReturnType.Type != typeof(IEnumerator))\n            {\n                return new DefaultTestWorkItem(testMethod, filter);\n            }\n\n            return Create(testMethod, filter, loadedTest);\n        }\n\n        protected abstract UnityWorkItem Create(TestMethod method, ITestFilter filter, ITest loadedTest);\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Runner/WorkItemFactory.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 5c15bf0966eb95847a4260d830a30d30\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/Runner.meta",
    "content": "fileFormatVersion: 2\nguid: 37888acc09d9ee848bf9559f06645c45\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/TestExtensions.cs",
    "content": "using System.Collections.Generic;\nusing System.Linq;\nusing NUnit.Framework.Interfaces;\nusing NUnit.Framework.Internal;\nusing UnityEngine.TestRunner.NUnitExtensions.Filters;\n\nnamespace UnityEngine.TestRunner.NUnitExtensions\n{\n    internal static class TestExtensions\n    {\n        private static IEnumerable<string> GetTestCategories(this ITest test)\n        {\n            var categories = test.Properties[PropertyNames.Category].Cast<string>().ToList();\n            if (categories.Count == 0 && test is TestMethod)\n            {\n                // only mark tests as Uncategorized if the test fixture doesn't have a category,\n                // otherwise the test inherits the Fixture category\n                var fixtureCategories = test.Parent.Properties[PropertyNames.Category].Cast<string>().ToList();\n                if (fixtureCategories.Count == 0)\n                    categories.Add(CategoryFilterExtended.k_DefaultCategory);\n            }\n            return categories;\n        }\n\n        public static bool HasCategory(this ITest test, string[] categoryFilter)\n        {\n            var categories = test.GetAllCategoriesFromTest().Distinct();\n            return categoryFilter.Any(c => categories.Any(r => r == c));\n        }\n\n        public static List<string> GetAllCategoriesFromTest(this ITest test)\n        {\n            if (test.Parent == null)\n                return test.GetTestCategories().ToList();\n\n            var categories = GetAllCategoriesFromTest(test.Parent);\n            categories.AddRange(test.GetTestCategories());\n            return categories;\n        }\n\n        public static void ParseForNameDuplicates(this ITest test)\n        {\n            var duplicates = new Dictionary<string, int>();\n            for (var i = 0; i < test.Tests.Count; i++)\n            {\n                var child = test.Tests[i];\n                int count;\n                if (duplicates.TryGetValue(child.FullName, out count))\n                {\n                    count++;\n                    child.Properties.Add(\"childIndex\", count);\n                    duplicates[child.FullName] = count;\n                }\n                else\n                {\n                    duplicates.Add(child.FullName, 1);\n                }\n                ParseForNameDuplicates(child);\n            }\n        }\n\n        public static int GetChildIndex(this ITest test)\n        {\n            var index = test.Properties[\"childIndex\"];\n            return (int)index[0];\n        }\n\n        public static bool HasChildIndex(this ITest test)\n        {\n            var index = test.Properties[\"childIndex\"];\n            return index.Count > 0;\n        }\n\n        static string GetAncestorPath(ITest test)\n        {\n            var path = \"\";\n            var testParent = test.Parent;\n\n            while (testParent != null && testParent.Parent != null && !string.IsNullOrEmpty(testParent.Name))\n            {\n                path = testParent.Name + \"/\" + path;\n                testParent = testParent.Parent;\n            }\n\n            return path;\n        }\n\n        public static string GetUniqueName(this ITest test)\n        {\n            var id = GetAncestorPath(test) + GetFullName(test);\n            if (test.HasChildIndex())\n            {\n                var index = test.GetChildIndex();\n                if (index >= 0)\n                    id += index;\n            }\n            if (test.IsSuite)\n            {\n                id += \"[suite]\";\n            }\n            return id;\n        }\n\n        public static string GetFullName(ITest test)\n        {\n            if (test.TypeInfo == null && (test.Parent == null || test.Parent.TypeInfo == null))\n            {\n                return \"[\" + test.FullName + \"]\";\n            }\n            var assemblyId = test.TypeInfo == null ? test.Parent.TypeInfo.Assembly.GetName().Name : test.TypeInfo.Assembly.GetName().Name;\n            return string.Format(\"[{0}][{1}]\", assemblyId, test.FullName);\n        }\n\n        public static string GetSkipReason(this ITest test)\n        {\n            if (test.Properties.ContainsKey(PropertyNames.SkipReason))\n                return (string)test.Properties.Get(PropertyNames.SkipReason);\n\n            return null;\n        }\n\n        public static string GetParentId(this ITest test)\n        {\n            if (test.Parent != null)\n                return test.Parent.Id;\n\n            return null;\n        }\n\n        public static string GetParentUniqueName(this ITest test)\n        {\n            if (test.Parent != null)\n                return GetUniqueName(test.Parent);\n\n            return null;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/TestExtensions.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 8bc74398aa3944646ade4ee78cd57484\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/TestResultExtensions.cs",
    "content": "using System;\nusing NUnit.Framework;\nusing NUnit.Framework.Interfaces;\nusing NUnit.Framework.Internal;\n\nnamespace UnityEngine.TestRunner.NUnitExtensions\n{\n    internal static class TestResultExtensions\n    {\n        public static void RecordPrefixedException(this TestResult testResult, string prefix, Exception ex, ResultState resultState = null)\n\n        {\n            if (ex is NUnitException)\n            {\n                ex = ex.InnerException;\n            }\n\n            if (resultState == null)\n            {\n                resultState = testResult.ResultState == ResultState.Cancelled\n                    ? ResultState.Cancelled\n                    : ResultState.Error;\n            }\n\n            var exceptionMessage = ExceptionHelper.BuildMessage(ex);\n            string stackTrace = \"--\" + prefix + NUnit.Env.NewLine + ExceptionHelper.BuildStackTrace(ex);\n            if (testResult.StackTrace != null)\n            {\n                stackTrace = testResult.StackTrace + NUnit.Env.NewLine + stackTrace;\n            }\n\n            if (testResult.Test.IsSuite)\n            {\n                resultState = resultState.WithSite(FailureSite.TearDown);\n            }\n\n            if (ex is ResultStateException)\n            {\n                exceptionMessage = ex.Message;\n                resultState = ((ResultStateException)ex).ResultState;\n                stackTrace = StackFilter.Filter(ex.StackTrace);\n            }\n\n            string message = (string.IsNullOrEmpty(prefix) ? \"\" : (prefix + \" : \")) + exceptionMessage;\n            if (testResult.Message != null)\n            {\n                message = testResult.Message + NUnit.Env.NewLine + message;\n            }\n\n            testResult.SetResult(resultState, message, stackTrace);\n        }\n\n        public static void RecordPrefixedError(this TestResult testResult, string prefix, string error, ResultState resultState = null)\n\n        {\n            if (resultState == null)\n            {\n                resultState = testResult.ResultState == ResultState.Cancelled\n                    ? ResultState.Cancelled\n                    : ResultState.Error;\n            }\n            \n            if (testResult.Test.IsSuite)\n            {\n                resultState = resultState.WithSite(FailureSite.TearDown);\n            }\n\n            string message = (string.IsNullOrEmpty(prefix) ? \"\" : (prefix + \" : \")) + error;\n            if (testResult.Message != null)\n            {\n                message = testResult.Message + NUnit.Env.NewLine + message;\n            }\n\n            testResult.SetResult(resultState, message);\n        }\n    }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/TestResultExtensions.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 65fb6da362a78334ab360a125cfafdaf\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/UnityTestAssemblyBuilder.cs",
    "content": "using System.Collections.Generic;\nusing System.IO;\nusing System.Reflection;\nusing NUnit;\nusing NUnit.Framework.Api;\nusing NUnit.Framework.Interfaces;\nusing NUnit.Framework.Internal;\n\nnamespace UnityEngine.TestTools.NUnitExtensions\n{\n    internal class UnityTestAssemblyBuilder : DefaultTestAssemblyBuilder\n    {\n        private readonly string m_ProductName;\n        public UnityTestAssemblyBuilder()\n        {\n            m_ProductName = Application.productName;\n        }\n\n        public ITest Build(Assembly[] assemblies, IDictionary<string, object> options)\n        {\n            var test = BuildAsync(assemblies, options);\n            while (test.MoveNext())\n            {\n            }\n\n            return test.Current;\n        }\n\n        public IEnumerator<ITest> BuildAsync(Assembly[] assemblies, IDictionary<string, object> options)\n        {\n            var productName = string.Join(\"_\", m_ProductName.Split(Path.GetInvalidFileNameChars()));\n            var suite = new TestSuite(productName);\n            foreach (var assembly in assemblies)\n            {\n                var assemblySuite = Build(assembly, options) as TestSuite;\n                if (assemblySuite != null && assemblySuite.HasChildren)\n                {\n                    suite.Add(assemblySuite);\n                }\n                yield return null;\n            }\n            yield return suite;\n        }\n\n        public static Dictionary<string, object> GetNUnitTestBuilderSettings(TestPlatform testPlatform)\n        {\n            var emptySettings = new Dictionary<string, object>();\n            emptySettings.Add(FrameworkPackageSettings.TestParameters, \"platform=\" + testPlatform);\n            return emptySettings;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions/UnityTestAssemblyBuilder.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 98ba0396e4b4ee8498a8f097affcfddf\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/NUnitExtensions.meta",
    "content": "fileFormatVersion: 2\nguid: 3e8d6af343b383544ba5743d119f4062\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/TestRunner/Callbacks/PlayModeRunnerCallback.cs",
    "content": "using NUnit.Framework;\nusing NUnit.Framework.Interfaces;\n\nnamespace UnityEngine.TestTools.TestRunner.Callbacks\n{\n    [AddComponentMenu(\"\")]\n    internal class PlayModeRunnerCallback : MonoBehaviour, ITestRunnerListener\n    {\n        private TestResultRenderer m_ResultRenderer;\n\n        public void RunFinished(ITestResult testResults)\n        {\n            Application.logMessageReceivedThreaded -= LogRecieved;\n            if (Camera.main == null)\n            {\n                gameObject.AddComponent<Camera>();\n            }\n            m_ResultRenderer = new TestResultRenderer(testResults);\n            m_ResultRenderer.ShowResults();\n        }\n\n        public void TestFinished(ITestResult result)\n        {\n        }\n\n        public void OnGUI()\n        {\n            if (m_ResultRenderer != null)\n                m_ResultRenderer.Draw();\n        }\n\n        public void RunStarted(ITest testsToRun)\n        {\n            Application.logMessageReceivedThreaded += LogRecieved;\n        }\n\n        public void TestStarted(ITest test)\n        {\n        }\n\n        private void LogRecieved(string message, string stacktrace, LogType type)\n        {\n            if (TestContext.Out != null)\n                TestContext.Out.WriteLine(message);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/TestRunner/Callbacks/PlayModeRunnerCallback.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 3cf5cb9e1ef590c48b1f919f2a7bd895\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/TestRunner/Callbacks/RemoteTestResultSender.cs",
    "content": "using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing NUnit.Framework.Interfaces;\nusing UnityEngine.Networking.PlayerConnection;\nusing UnityEngine.TestRunner.TestLaunchers;\n\nnamespace UnityEngine.TestTools.TestRunner.Callbacks\n{\n    [AddComponentMenu(\"\")]\n    internal class RemoteTestResultSender : MonoBehaviour, ITestRunnerListener\n    {\n        private class QueueData\n        {\n            public Guid id { get; set; }\n            public byte[] data { get; set; }\n        }\n\n        private readonly Queue<QueueData> m_SendQueue = new Queue<QueueData>();\n        private readonly object m_LockQueue = new object();\n        private readonly IRemoteTestResultDataFactory m_TestResultDataFactory = new RemoteTestResultDataFactory();\n\n        public void Start()\n        {\n            PlayerConnection.instance.Register(PlayerConnectionMessageIds.runFinishedMessageId, EditorProccessedTheResult);\n            StartCoroutine(SendDataRoutine());\n        }\n\n        private void EditorProccessedTheResult(MessageEventArgs arg0)\n        {\n            if (arg0.data != null)\n            {\n                return;\n            }\n\n            //Some platforms don't quit, so we need to disconnect to make sure they will not connect to another editor instance automatically.\n            PlayerConnection.instance.DisconnectAll();\n\n            //XBOX has an error when quitting\n            if (Application.platform == RuntimePlatform.XboxOne)\n            {\n                return;\n            }\n            Application.Quit();\n        }\n\n        private byte[] SerializeObject(object objectToSerialize)\n        {\n            return Encoding.UTF8.GetBytes(JsonUtility.ToJson(objectToSerialize));\n        }\n\n        public void RunStarted(ITest testsToRun)\n        {\n            var data = SerializeObject(m_TestResultDataFactory.CreateFromTest(testsToRun));\n            lock (m_LockQueue)\n            {\n                m_SendQueue.Enqueue(new QueueData\n                {\n                    id = PlayerConnectionMessageIds.runStartedMessageId,\n                    data = data\n                });\n            }\n        }\n\n        public void RunFinished(ITestResult testResults)\n        {\n            var data = SerializeObject(m_TestResultDataFactory.CreateFromTestResult(testResults));\n            lock (m_LockQueue)\n            {\n                m_SendQueue.Enqueue(new QueueData { id = PlayerConnectionMessageIds.runFinishedMessageId, data = data, });\n            }\n        }\n\n        public void TestStarted(ITest test)\n        {\n            var data = SerializeObject(m_TestResultDataFactory.CreateFromTest(test));\n            lock (m_LockQueue)\n            {\n                m_SendQueue.Enqueue(new QueueData\n                {\n                    id = PlayerConnectionMessageIds.testStartedMessageId,\n                    data = data\n                });\n            }\n        }\n\n        public void TestFinished(ITestResult result)\n        {\n            var testRunnerResultForApi = m_TestResultDataFactory.CreateFromTestResult(result);\n            var resultData = SerializeObject(testRunnerResultForApi);\n            lock (m_LockQueue)\n            {\n                m_SendQueue.Enqueue(new QueueData\n                {\n                    id = PlayerConnectionMessageIds.testFinishedMessageId,\n                    data = resultData,\n                });\n            }\n        }\n\n        public IEnumerator SendDataRoutine()\n        {\n            while (!PlayerConnection.instance.isConnected)\n            {\n                yield return new WaitForSeconds(1);\n            }\n\n            while (true)\n            {\n                lock (m_LockQueue)\n                {\n                    if (PlayerConnection.instance.isConnected && m_SendQueue.Count > 0)\n                    {\n                        var queueData = m_SendQueue.Dequeue();\n                        PlayerConnection.instance.Send(queueData.id, queueData.data);\n                        yield return null;\n                    }\n\n                    //This is needed so we dont stall the player totally\n                    if (!m_SendQueue.Any())\n                    {\n                        yield return new WaitForSeconds(0.02f);\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/TestRunner/Callbacks/RemoteTestResultSender.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 20793418366caf14293b29c55df5e9ec\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/TestRunner/Callbacks/TestResultRenderer.cs",
    "content": "using System.Collections.Generic;\nusing System.Linq;\nusing NUnit.Framework.Interfaces;\nusing NUnit.Framework.Internal;\n\nnamespace UnityEngine.TestTools.TestRunner.Callbacks\n{\n    internal class TestResultRenderer\n    {\n        private static class Styles\n        {\n            public static readonly GUIStyle SucceedLabelStyle;\n            public static readonly GUIStyle FailedLabelStyle;\n            public static readonly GUIStyle FailedMessagesStyle;\n\n            static Styles()\n            {\n                SucceedLabelStyle = new GUIStyle(\"label\");\n                SucceedLabelStyle.normal.textColor = Color.green;\n                SucceedLabelStyle.fontSize = 48;\n\n                FailedLabelStyle = new GUIStyle(\"label\");\n                FailedLabelStyle.normal.textColor = Color.red;\n                FailedLabelStyle.fontSize = 32;\n\n                FailedMessagesStyle = new GUIStyle(\"label\");\n                FailedMessagesStyle.wordWrap = false;\n                FailedMessagesStyle.richText = true;\n            }\n        }\n\n        private readonly List<ITestResult> m_FailedTestCollection;\n\n        private bool m_ShowResults;\n        private Vector2 m_ScrollPosition;\n\n        public TestResultRenderer(ITestResult testResults)\n        {\n            m_FailedTestCollection = new List<ITestResult>();\n            GetFailedTests(testResults);\n        }\n\n        private void GetFailedTests(ITestResult testResults)\n        {\n            if (testResults is TestCaseResult)\n            {\n                if (testResults.ResultState.Status == TestStatus.Failed)\n                    m_FailedTestCollection.Add(testResults);\n            }\n            else if (testResults.HasChildren)\n            {\n                foreach (var testResultsChild in testResults.Children)\n                {\n                    GetFailedTests(testResultsChild);\n                }\n            }\n        }\n\n        private const int k_MaxStringLength = 15000;\n\n        public void ShowResults()\n        {\n            m_ShowResults = true;\n            Cursor.visible = true;\n        }\n\n        public void Draw()\n        {\n            if (!m_ShowResults) return;\n            if (m_FailedTestCollection.Count == 0)\n            {\n                GUILayout.Label(\"All test succeeded\", Styles.SucceedLabelStyle, GUILayout.Width(600));\n            }\n            else\n            {\n                int count = m_FailedTestCollection.Count;\n                GUILayout.Label(count + \" tests failed!\", Styles.FailedLabelStyle);\n\n                m_ScrollPosition = GUILayout.BeginScrollView(m_ScrollPosition, GUILayout.ExpandWidth(true));\n                var text = \"\";\n\n                text += \"<b><size=18>Code-based tests</size></b>\\n\";\n                text += string.Join(\"\\n\", m_FailedTestCollection\n                    .Select(result => result.Name + \" \" + result.ResultState + \"\\n\" + result.Message)\n                    .ToArray());\n\n                if (text.Length > k_MaxStringLength)\n                    text = text.Substring(0, k_MaxStringLength);\n\n                GUILayout.TextArea(text, Styles.FailedMessagesStyle);\n                GUILayout.EndScrollView();\n            }\n            if (GUILayout.Button(\"Close\"))\n                Application.Quit();\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/TestRunner/Callbacks/TestResultRenderer.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 5ebb87899ca30b743bb4274bc00c02b4\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/TestRunner/Callbacks/TestResultRendererCallback.cs",
    "content": "using NUnit.Framework.Interfaces;\n\nnamespace UnityEngine.TestTools.TestRunner.Callbacks\n{\n    internal class TestResultRendererCallback : MonoBehaviour, ITestRunnerListener\n    {\n        private TestResultRenderer m_ResultRenderer;\n        public void RunStarted(ITest testsToRun)\n        {\n        }\n\n        public void RunFinished(ITestResult testResults)\n        {\n            if (Camera.main == null)\n            {\n                gameObject.AddComponent<Camera>();\n            }\n            m_ResultRenderer = new TestResultRenderer(testResults);\n            m_ResultRenderer.ShowResults();\n        }\n\n        public void OnGUI()\n        {\n            if (m_ResultRenderer != null)\n                m_ResultRenderer.Draw();\n        }\n\n        public void TestStarted(ITest test)\n        {\n        }\n\n        public void TestFinished(ITestResult result)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/TestRunner/Callbacks/TestResultRendererCallback.cs.meta",
    "content": "fileFormatVersion: 2\nguid: dfc336f10b83bd74eaded16a658275c7\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/TestRunner/Callbacks.meta",
    "content": "fileFormatVersion: 2\nguid: 61e236e8570a95e4eb754fb291e102e0\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/TestRunner/ITestRunnerListener.cs",
    "content": "using System;\nusing NUnit.Framework.Interfaces;\nusing UnityEngine.Events;\n\nnamespace UnityEngine.TestTools.TestRunner\n{\n    internal interface ITestRunnerListener\n    {\n        void RunStarted(ITest testsToRun);\n        void RunFinished(ITestResult testResults);\n        void TestStarted(ITest test);\n        void TestFinished(ITestResult result);\n    }\n\n    [Serializable]\n    internal class TestFinishedEvent : UnityEvent<ITestResult> {}\n\n    [Serializable]\n    internal class TestStartedEvent : UnityEvent<ITest> {}\n\n    [Serializable]\n    internal class RunFinishedEvent : UnityEvent<ITestResult> {}\n\n    [Serializable]\n    internal class RunStartedEvent : UnityEvent<ITest> {}\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/TestRunner/ITestRunnerListener.cs.meta",
    "content": "fileFormatVersion: 2\nguid: d1b534518943030499685344fd1d476d\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/TestRunner/Messages/IEditModeTestYieldInstruction.cs",
    "content": "using System.Collections;\n\nnamespace UnityEngine.TestTools\n{\n    public interface IEditModeTestYieldInstruction\n    {\n        bool ExpectDomainReload { get; }\n        bool ExpectedPlaymodeState { get; }\n\n        IEnumerator Perform();\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/TestRunner/Messages/IEditModeTestYieldInstruction.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 898bc38486fc899428fbe5bd6adfe473\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/TestRunner/Messages.meta",
    "content": "fileFormatVersion: 2\nguid: 256a0ca37fa972840bce7fca446e75e7\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/TestRunner/PlaymodeTestsController.cs",
    "content": "using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\nusing UnityEngine.SceneManagement;\nusing UnityEngine.TestRunner.NUnitExtensions;\nusing UnityEngine.TestRunner.NUnitExtensions.Runner;\nusing UnityEngine.TestTools.NUnitExtensions;\nusing UnityEngine.TestTools.Utils;\n\nnamespace UnityEngine.TestTools.TestRunner\n{\n    [Serializable]\n    [AddComponentMenu(\"\")]\n    internal class PlaymodeTestsController : MonoBehaviour\n    {\n        private IEnumerator m_TestSteps;\n\n        [SerializeField]\n        private List<string> m_AssembliesWithTests;\n        public List<string> AssembliesWithTests\n        {\n            get\n            {\n                return m_AssembliesWithTests;\n            }\n            set\n            {\n                m_AssembliesWithTests = value;\n            }\n        }\n\n        [SerializeField]\n        internal TestStartedEvent testStartedEvent = new TestStartedEvent();\n        [SerializeField]\n        internal TestFinishedEvent testFinishedEvent = new TestFinishedEvent();\n        [SerializeField]\n        internal RunStartedEvent runStartedEvent = new RunStartedEvent();\n        [SerializeField]\n        internal RunFinishedEvent runFinishedEvent = new RunFinishedEvent();\n\n        internal const string kPlaymodeTestControllerName = \"Code-based tests runner\";\n\n        [SerializeField]\n        public PlaymodeTestsControllerSettings settings = new PlaymodeTestsControllerSettings();\n\n        internal UnityTestAssemblyRunner m_Runner;\n\n        public IEnumerator Start()\n        {\n            //Skip 2 frame because Unity.\n            yield return null;\n            yield return null;\n            StartCoroutine(Run());\n        }\n\n        internal static bool IsControllerOnScene()\n        {\n            return GameObject.Find(kPlaymodeTestControllerName) != null;\n        }\n\n        internal static PlaymodeTestsController GetController()\n        {\n            return GameObject.Find(kPlaymodeTestControllerName).GetComponent<PlaymodeTestsController>();\n        }\n\n        public IEnumerator TestRunnerCorotine()\n        {\n            while (m_TestSteps.MoveNext())\n            {\n                yield return m_TestSteps.Current;\n            }\n\n            if (m_Runner.IsTestComplete)\n            {\n                runFinishedEvent.Invoke(m_Runner.Result);\n                Cleanup();\n\n                yield return null;\n            }\n        }\n\n        public IEnumerator Run()\n        {\n            CoroutineTestWorkItem.monoBehaviourCoroutineRunner = this;\n            gameObject.hideFlags |= HideFlags.DontSave;\n\n            if (settings.sceneBased)\n            {\n                SceneManager.LoadScene(1, LoadSceneMode.Additive);\n                yield return null;\n            }\n\n            var testListUtil = new PlayerTestAssemblyProvider(new AssemblyLoadProxy(), m_AssembliesWithTests);\n            m_Runner = new UnityTestAssemblyRunner(new UnityTestAssemblyBuilder(), new PlaymodeWorkItemFactory());\n\n            var loadedTests = m_Runner.Load(testListUtil.GetUserAssemblies().Select(a => a.Assembly).ToArray(), UnityTestAssemblyBuilder.GetNUnitTestBuilderSettings(TestPlatform.PlayMode));\n            loadedTests.ParseForNameDuplicates();\n            runStartedEvent.Invoke(m_Runner.LoadedTest);\n\n            var testListenerWrapper = new TestListenerWrapper(testStartedEvent, testFinishedEvent);\n            m_TestSteps = m_Runner.Run(testListenerWrapper, settings.filter.BuildNUnitFilter()).GetEnumerator();\n\n            yield return TestRunnerCorotine();\n        }\n\n        public void Cleanup()\n        {\n            if (m_Runner != null)\n            {\n                m_Runner.StopRun();\n                m_Runner = null;\n            }\n            if (Application.isEditor)\n            {\n                Destroy(gameObject);\n            }\n        }\n\n        public static void TryCleanup()\n        {\n            var controller = GetController();\n            if (controller != null)\n            {\n                controller.Cleanup();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/TestRunner/PlaymodeTestsController.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 102e512f651ee834f951a2516c1ea3b8\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/TestRunner/PlaymodeTestsControllerSettings.cs",
    "content": "using System;\nusing UnityEngine.SceneManagement;\nusing UnityEngine.TestTools.TestRunner.GUI;\n\nnamespace UnityEngine.TestTools.TestRunner\n{\n    [Serializable]\n    internal class PlaymodeTestsControllerSettings\n    {\n        [SerializeField]\n        public TestRunnerFilter filter;\n        public bool sceneBased;\n        public string originalScene;\n        public string bootstrapScene;\n\n        public static PlaymodeTestsControllerSettings CreateRunnerSettings(TestRunnerFilter filter)\n        {\n            var settings = new PlaymodeTestsControllerSettings\n            {\n                filter = filter,\n                sceneBased = false,\n                originalScene = SceneManager.GetActiveScene().path,\n                bootstrapScene = null\n            };\n            return settings;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/TestRunner/PlaymodeTestsControllerSettings.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 2799eb4c84e72e54092a292cf626936b\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/TestRunner/RemoteHelpers/IRemoteTestResultDataFactory.cs",
    "content": "using System;\nusing NUnit.Framework.Interfaces;\n\nnamespace UnityEngine.TestRunner.TestLaunchers\n{\n    internal interface IRemoteTestResultDataFactory\n    {\n        RemoteTestResultDataWithTestData CreateFromTestResult(ITestResult result);\n        RemoteTestResultDataWithTestData CreateFromTest(ITest test);\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/TestRunner/RemoteHelpers/IRemoteTestResultDataFactory.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 874c0713cdc44f549b0161750b48d2c2\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/TestRunner/RemoteHelpers/PlayerConnectionMessageIds.cs",
    "content": "using System;\n\nnamespace UnityEngine.TestRunner.TestLaunchers\n{\n    internal static class PlayerConnectionMessageIds\n    {\n        public static Guid runStartedMessageId { get { return new Guid(\"6a7f53dd-4672-461d-a7b5-9467e9393fd3\"); } }\n        public static Guid runFinishedMessageId { get { return new Guid(\"ffb622fc-34ad-4901-8d7b-47fb04b0bdd4\"); } }\n        public static Guid testStartedMessageId { get { return new Guid(\"b54d241e-d88d-4dba-8c8f-ee415d11c030\"); } }\n        public static Guid testFinishedMessageId { get { return new Guid(\"72f7b7f4-6829-4cd1-afde-78872b9d5adc\"); } }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/TestRunner/RemoteHelpers/PlayerConnectionMessageIds.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 41d60936b62cc6d4ca7fe628b22b0e40\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestData.cs",
    "content": "using System;\nusing System.Linq;\nusing NUnit.Framework.Interfaces;\nusing NUnit.Framework.Internal;\nusing UnityEngine.TestRunner.NUnitExtensions;\n\nnamespace UnityEngine.TestRunner.TestLaunchers\n{\n    [Serializable]\n    internal class RemoteTestData\n    {\n        public string id;\n        public string name;\n        public string fullName;\n        public int testCaseCount;\n        public int ChildIndex;\n        public bool hasChildren;\n        public bool isSuite;\n        public string[] childrenIds;\n        public int testCaseTimeout;\n        public string[] Categories;\n        public bool IsTestAssembly;\n        public RunState RunState;\n        public string Description;\n        public string SkipReason;\n        public string ParentId;\n        public string UniqueName;\n        public string ParentUniqueName;\n\n        internal RemoteTestData(ITest test)\n        {\n            id = test.Id;\n            name = test.Name;\n            fullName = test.FullName;\n            testCaseCount = test.TestCaseCount;\n            ChildIndex = -1;\n            if (test.Properties[\"childIndex\"].Count > 0)\n            {\n                ChildIndex = (int)test.Properties[\"childIndex\"][0];\n            }\n            hasChildren = test.HasChildren;\n            isSuite = test.IsSuite;\n            childrenIds = test.Tests.Select(t => t.Id).ToArray();\n            Categories = test.GetAllCategoriesFromTest().ToArray();\n            IsTestAssembly = test is TestAssembly;\n            RunState = (RunState)Enum.Parse(typeof(RunState), test.RunState.ToString());\n            Description = (string)test.Properties.Get(PropertyNames.Description);\n            SkipReason = test.GetSkipReason();\n            ParentId = test.GetParentId();\n            UniqueName = test.GetUniqueName();\n            ParentUniqueName = test.GetParentUniqueName();\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestData.cs.meta",
    "content": "fileFormatVersion: 2\nguid: b135ec222fdcd11468014c90d11d6821\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultData.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing NUnit.Framework.Interfaces;\n\nnamespace UnityEngine.TestRunner.TestLaunchers\n{\n    [Serializable]\n    internal class RemoteTestResultData\n    {\n        public string testId;\n        public string name;\n        public string fullName;\n        public string resultState;\n        public TestStatus testStatus;\n        public double duration;\n        public DateTime startTime;\n        public DateTime endTime;\n        public string message;\n        public string stackTrace;\n        public int assertCount;\n        public int failCount;\n        public int passCount;\n        public int skipCount;\n        public int inconclusiveCount;\n        public bool hasChildren;\n        public string output;\n        public string xml;\n        public string[] childrenIds;\n\n        internal RemoteTestResultData(ITestResult result)\n        {\n            testId = result.Test.Id;\n            name = result.Name;\n            fullName = result.FullName;\n            resultState = result.ResultState.ToString();\n            testStatus = result.ResultState.Status;\n            duration = result.Duration;\n            startTime = result.StartTime;\n            endTime = result.EndTime;\n            message = result.Message;\n            stackTrace = result.StackTrace;\n            assertCount = result.AssertCount;\n            failCount = result.FailCount;\n            passCount = result.PassCount;\n            skipCount = result.SkipCount;\n            inconclusiveCount = result.InconclusiveCount;\n            hasChildren = result.HasChildren;\n            output = result.Output;\n            xml = result.ToXml(true).OuterXml;\n            childrenIds = result.Children.Select(child => child.Test.Id).ToArray();\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultData.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 03e4d63665d06f04c8a6cf68133c1592\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultDataFactory.cs",
    "content": "using System.Collections.Generic;\nusing System.Linq;\nusing NUnit.Framework.Interfaces;\nusing UnityEngine.TestRunner.NUnitExtensions.Runner;\n\nnamespace UnityEngine.TestRunner.TestLaunchers\n{\n    internal class RemoteTestResultDataFactory : IRemoteTestResultDataFactory\n    {\n        public RemoteTestResultDataWithTestData CreateFromTestResult(ITestResult result)\n        {\n            var tests = CreateTestDataList(result.Test);\n            tests.First().testCaseTimeout = UnityTestExecutionContext.CurrentContext.TestCaseTimeout;\n            return new RemoteTestResultDataWithTestData()\n            {\n                results = CreateTestResultDataList(result),\n                tests = tests\n            };\n        }\n\n        public RemoteTestResultDataWithTestData CreateFromTest(ITest test)\n        {\n            var tests = CreateTestDataList(test);\n            if (UnityTestExecutionContext.CurrentContext != null)\n            {\n                tests.First().testCaseTimeout = UnityTestExecutionContext.CurrentContext.TestCaseTimeout;\n            }\n\n            return new RemoteTestResultDataWithTestData()\n            {\n                tests = tests\n            };\n        }\n\n        private RemoteTestData[] CreateTestDataList(ITest test)\n        {\n            var list = new List<RemoteTestData>();\n            list.Add(new RemoteTestData(test));\n            list.AddRange(test.Tests.SelectMany(CreateTestDataList));\n            return list.ToArray();\n        }\n\n        private static RemoteTestResultData[] CreateTestResultDataList(ITestResult result)\n        {\n            var list = new List<RemoteTestResultData>();\n            list.Add(new RemoteTestResultData(result));\n            list.AddRange(result.Children.SelectMany(CreateTestResultDataList));\n            return list.ToArray();\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultDataFactory.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 826b6becaef90fb458eedebe4c2f3664\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultDataWithTestData.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing NUnit.Framework.Interfaces;\nusing UnityEngine.TestRunner.NUnitExtensions.Runner;\n\nnamespace UnityEngine.TestRunner.TestLaunchers\n{\n    [Serializable]\n    internal class RemoteTestResultDataWithTestData\n    {\n        public RemoteTestResultData[] results;\n        public RemoteTestData[] tests;\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultDataWithTestData.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 475e3699f219c854f8581a9838135002\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/TestRunner/RemoteHelpers.meta",
    "content": "fileFormatVersion: 2\nguid: 91c20d2c22b8b3a4cb6c816bd225591a\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/TestRunner/TestEnumeratorWrapper.cs",
    "content": "using System;\nusing System.Collections;\nusing System.Reflection;\nusing NUnit.Framework;\nusing NUnit.Framework.Interfaces;\nusing NUnit.Framework.Internal;\n\nnamespace UnityEngine.TestTools.TestRunner\n{\n    internal class TestEnumeratorWrapper\n    {\n        private readonly TestMethod m_TestMethod;\n\n        public TestEnumeratorWrapper(TestMethod testMethod)\n        {\n            m_TestMethod = testMethod;\n        }\n\n        public IEnumerator GetEnumerator(ITestExecutionContext context)\n        {\n            if (m_TestMethod.Method.ReturnType.Type == typeof(IEnumerator))\n            {\n                return HandleEnumerableTest(context);\n            }\n            var message = string.Format(\"Return type {0} of {1} in {2} is not supported.\",\n                m_TestMethod.Method.ReturnType, m_TestMethod.Method.Name, m_TestMethod.Method.TypeInfo.FullName);\n            if (m_TestMethod.Method.ReturnType.Type == typeof(IEnumerable))\n            {\n                message += \"\\nDid you mean IEnumerator?\";\n            }\n            throw new InvalidSignatureException(message);\n        }\n\n        private IEnumerator HandleEnumerableTest(ITestExecutionContext context)\n        {\n            try\n            {\n                return m_TestMethod.Method.MethodInfo.Invoke(context.TestObject, m_TestMethod.parms != null ? m_TestMethod.parms.OriginalArguments : null) as IEnumerator;\n            }\n            catch (TargetInvocationException e)\n            {\n                if (e.InnerException is IgnoreException)\n                {\n                    context.CurrentResult.SetResult(ResultState.Ignored, e.InnerException.Message);\n                    return null;\n                }\n                throw;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/TestRunner/TestEnumeratorWrapper.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 9ad0b0c865b01af4ca1b414689e71259\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/TestRunner/TestListenerWrapper.cs",
    "content": "using NUnit.Framework.Interfaces;\n\nnamespace UnityEngine.TestTools.TestRunner\n{\n    internal class TestListenerWrapper : ITestListener\n    {\n        private readonly TestFinishedEvent m_TestFinishedEvent;\n        private readonly TestStartedEvent m_TestStartedEvent;\n\n        public TestListenerWrapper(TestStartedEvent testStartedEvent, TestFinishedEvent testFinishedEvent)\n        {\n            m_TestStartedEvent = testStartedEvent;\n            m_TestFinishedEvent = testFinishedEvent;\n        }\n\n        public void TestStarted(ITest test)\n        {\n            m_TestStartedEvent.Invoke(test);\n        }\n\n        public void TestFinished(ITestResult result)\n        {\n            m_TestFinishedEvent.Invoke(result);\n        }\n\n        public void TestOutput(TestOutput output)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/TestRunner/TestListenerWrapper.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 73deb9b8722aa284eab27c4dc90956c6\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/TestRunner/TestPlatform.cs",
    "content": "using System;\n\nnamespace UnityEngine.TestTools\n{\n    [Flags]\n    [Serializable]\n    public enum TestPlatform : byte\n    {\n        All = 0xFF,\n        EditMode = 1 << 1,\n        PlayMode = 1 << 2\n    }\n\n    internal static class TestPlatformEnumExtensions\n    {\n        public static bool IsFlagIncluded(this TestPlatform flags, TestPlatform flag)\n        {\n            return (flags & flag) == flag;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/TestRunner/TestPlatform.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 743879b4db4bc1a4b829aae4386f4acf\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/TestRunner/TestRunnerFilter.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text.RegularExpressions;\nusing System.IO;\nusing NUnit.Framework.Interfaces;\nusing NUnit.Framework.Internal;\nusing NUnit.Framework.Internal.Filters;\nusing UnityEngine.TestRunner.NUnitExtensions.Filters;\n\nnamespace UnityEngine.TestTools.TestRunner.GUI\n{\n    [Serializable]\n    internal class TestRunnerFilter\n    {\n#pragma warning disable 649\n        public string[] assemblyNames;\n        public string[] groupNames;\n        public string[] categoryNames;\n        public static TestRunnerFilter empty = new TestRunnerFilter();\n        public string[] testNames;\n        public int testRepetitions = 1;\n\n        public static string AssemblyNameFromPath(string path)\n        {\n            string output = Path.GetFileName(path);\n            if (output != null && output.EndsWith(\".dll\", StringComparison.OrdinalIgnoreCase))\n                return output.Substring(0, output.Length - 4);\n            return output;\n        }\n\n        private bool CategoryMatches(IEnumerable<string> categories)\n        {\n            if (categoryNames == null || categoryNames.Length == 0)\n                return true;\n\n            foreach (string category in categories)\n            {\n                if (categoryNames.Contains(category))\n                    return true;\n            }\n\n            return false;\n        }\n\n        private bool IDMatchesAssembly(string id)\n        {\n            if (AreOptionalFiltersEmpty())\n                return true;\n\n            if (assemblyNames == null)\n                return false;\n\n            int openingBracket = id.IndexOf('[');\n            int closingBracket = id.IndexOf(']');\n            if (openingBracket >= 0 && openingBracket < id.Length && closingBracket > openingBracket && openingBracket < id.Length)\n            {\n                //Some assemblies are absolute and explicitly part of the test ID e.g.\n                //\"[/path/to/assembly-name.dll][rest of ID ...]\"\n                //While some are minimal assembly names e.g.\n                //\"[assembly-name][rest of ID ...]\"\n                //Strip them down to just the assembly name\n                string assemblyNameFromID = AssemblyNameFromPath(id.Substring(openingBracket + 1, closingBracket - openingBracket - 1));\n                foreach (string assemblyName in assemblyNames)\n                {\n                    if (assemblyName.Equals(assemblyNameFromID, StringComparison.OrdinalIgnoreCase))\n                        return true;\n                }\n            }\n            return false;\n        }\n\n        private bool NameMatches(string name)\n        {\n            if (AreOptionalFiltersEmpty())\n                return true;\n\n            if (groupNames == null)\n                return false;\n\n            foreach (var nameFromFilter in groupNames)\n            {\n                //Strict regex match for test group name on its own\n                if (Regex.IsMatch(name, nameFromFilter))\n                    return true;\n                //Match test names that end with parametrized test values and full nunit generated test names that have . separators\n                var regex = nameFromFilter.TrimEnd('$') + @\"[\\.|\\(.*\\)]\";\n                if (Regex.IsMatch(name, regex))\n                    return true;\n            }\n            return false;\n        }\n\n        private bool AreOptionalFiltersEmpty()\n        {\n            if (assemblyNames != null && assemblyNames.Length != 0)\n                return false;\n            if (groupNames != null && groupNames.Length != 0)\n                return false;\n            if (testNames != null && testNames.Length != 0)\n                return false;\n            return true;\n        }\n\n        private bool NameMatchesExactly(string name)\n        {\n            if (AreOptionalFiltersEmpty())\n                return true;\n\n            if (testNames == null)\n                return false;\n\n            foreach (var exactName in testNames)\n            {\n                if (name == exactName)\n                    return true;\n            }\n            return false;\n        }\n\n        private static void ClearAncestors(IEnumerable<IClearableResult> newResultList, string parentID)\n        {\n            if (string.IsNullOrEmpty(parentID))\n                return;\n            foreach (var result in newResultList)\n            {\n                if (result.Id == parentID)\n                {\n                    result.Clear();\n                    ClearAncestors(newResultList, result.ParentId);\n                    break;\n                }\n            }\n        }\n\n        public void ClearResults(List<IClearableResult> newResultList)\n        {\n            foreach (var result in newResultList)\n            {\n                if (!result.IsSuite && CategoryMatches(result.Categories))\n                {\n                    if (IDMatchesAssembly(result.Id) || NameMatches(result.FullName) || NameMatchesExactly(result.FullName))\n                    {\n                        result.Clear();\n                        ClearAncestors(newResultList, result.ParentId);\n                    }\n                }\n            }\n        }\n\n        public ITestFilter BuildNUnitFilter()\n        {\n            var filters = new List<ITestFilter>();\n\n            if (testNames != null && testNames.Length != 0)\n            {\n                var nameFilter = new OrFilter(testNames.Select(n => new FullNameFilter(n)).ToArray());\n                filters.Add(nameFilter);\n            }\n\n            if (groupNames != null && groupNames.Length != 0)\n            {\n                var exactNamesFilter = new OrFilter(groupNames.Select(n =>\n                {\n                    var f = new FullNameFilter(n);\n                    f.IsRegex = true;\n                    return f;\n                }).ToArray());\n                filters.Add(exactNamesFilter);\n            }\n\n            if (assemblyNames != null && assemblyNames.Length != 0)\n            {\n                var assemblyFilter = new OrFilter(assemblyNames.Select(c => new AssemblyNameFilter(c)).ToArray());\n                filters.Add(assemblyFilter);\n            }\n\n            if (categoryNames != null && categoryNames.Length != 0)\n            {\n                var categoryFilter = new OrFilter(categoryNames.Select(c => new CategoryFilterExtended(c) {IsRegex = true}).ToArray());\n                filters.Add(categoryFilter);\n            }\n\n            return filters.Count == 0 ? TestFilter.Empty : new AndFilter(filters.ToArray());\n        }\n\n        internal interface IClearableResult\n        {\n            string Id { get; }\n            string FullName { get; }\n            string ParentId { get; }\n            bool IsSuite { get; }\n            List<string> Categories { get; }\n            void Clear();\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/TestRunner/TestRunnerFilter.cs.meta",
    "content": "fileFormatVersion: 2\nguid: a025ba7ee40d0104db8d08b1d9eabb0d\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/TestRunner.meta",
    "content": "fileFormatVersion: 2\nguid: 1ddb9e1c877ea80479d1eab4ddaa5d0d\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/UnityEngine.TestRunner.asmdef",
    "content": "{\n    \"name\": \"UnityEngine.TestRunner\",\n    \"references\": [],\n    \"includePlatforms\": [],\n    \"excludePlatforms\": [],\n    \"allowUnsafeCode\": false,\n    \"overrideReferences\": true,\n    \"precompiledReferences\": [\n        \"nunit.framework.dll\"\n    ],\n    \"autoReferenced\": false,\n    \"defineConstraints\": []\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/UnityEngine.TestRunner.asmdef.meta",
    "content": "fileFormatVersion: 2\nguid: 27619889b8ba8c24980f49ee34dbb44a\nAssemblyDefinitionImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/AssemblyProvider/AssemblyLoadProxy.cs",
    "content": "using System.Reflection;\n\nnamespace UnityEngine.TestTools.Utils\n{\n    internal class AssemblyLoadProxy : IAssemblyLoadProxy\n    {\n        public IAssemblyWrapper Load(string assemblyString)\n        {\n            return new AssemblyWrapper(Assembly.Load(assemblyString));\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/AssemblyProvider/AssemblyLoadProxy.cs.meta",
    "content": "fileFormatVersion: 2\nguid: fb593906b7b6d824087dcaebf6c082e0\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/AssemblyProvider/AssemblyWrapper.cs",
    "content": "using System;\nusing System.Reflection;\n\nnamespace UnityEngine.TestTools.Utils\n{\n    internal class AssemblyWrapper : IAssemblyWrapper\n    {\n        public AssemblyWrapper(Assembly assembly)\n        {\n            Assembly = assembly;\n        }\n\n        public Assembly Assembly { get; }\n\n        public virtual string Location\n        {\n            get\n            {\n                //Some platforms dont support this\n                throw new NotImplementedException();\n            }\n        }\n\n        public virtual AssemblyName[] GetReferencedAssemblies()\n        {\n            //Some platforms dont support this\n            throw new NotImplementedException();\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/AssemblyProvider/AssemblyWrapper.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 2e3b9bbf2c1a3cd4f88883ca32882ec6\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/AssemblyProvider/IAssemblyLoadProxy.cs",
    "content": "namespace UnityEngine.TestTools.Utils\n{\n    internal interface IAssemblyLoadProxy\n    {\n        IAssemblyWrapper Load(string assemblyString);\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/AssemblyProvider/IAssemblyLoadProxy.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 12dfd4bdbb5c8e6419432fbc54ef25d9\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/AssemblyProvider/IAssemblyWrapper.cs",
    "content": "using System.Reflection;\n\nnamespace UnityEngine.TestTools.Utils\n{\n    internal interface IAssemblyWrapper\n    {\n        Assembly Assembly { get; }\n        string Location { get; }\n        AssemblyName[] GetReferencedAssemblies();\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/AssemblyProvider/IAssemblyWrapper.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 1c5afe945b715e149a70113a4be7b32a\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/AssemblyProvider/IScriptingRuntimeProxy.cs",
    "content": "namespace UnityEngine.TestTools.Utils\n{\n    internal interface IScriptingRuntimeProxy\n    {\n        string[] GetAllUserAssemblies();\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/AssemblyProvider/IScriptingRuntimeProxy.cs.meta",
    "content": "fileFormatVersion: 2\nguid: fe4aef60e4ace544c8430da8ef8acba2\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/AssemblyProvider/ITestAssemblyProvider.cs",
    "content": "using NUnit.Framework.Interfaces;\n\nnamespace UnityEngine.TestTools.Utils\n{\n    internal interface ITestAssemblyProvider\n    {\n        ITest GetTestsWithNUnit();\n        IAssemblyWrapper[] GetUserAssemblies();\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/AssemblyProvider/ITestAssemblyProvider.cs.meta",
    "content": "fileFormatVersion: 2\nguid: c5acba6181d845c4e92146009bd4480f\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/AssemblyProvider/PlayerTestAssemblyProvider.cs",
    "content": "using System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing NUnit.Framework.Interfaces;\nusing UnityEngine.TestTools.NUnitExtensions;\n\nnamespace UnityEngine.TestTools.Utils\n{\n    internal class PlayerTestAssemblyProvider\n    {\n        private IAssemblyLoadProxy m_AssemblyLoadProxy;\n        private readonly List<string> m_AssembliesToLoad;\n\n        //Cached until domain reload\n        private static List<IAssemblyWrapper> m_LoadedAssemblies;\n\n        internal PlayerTestAssemblyProvider(IAssemblyLoadProxy assemblyLoadProxy, List<string> assembliesToLoad)\n        {\n            m_AssemblyLoadProxy = assemblyLoadProxy;\n            m_AssembliesToLoad = assembliesToLoad;\n            LoadAssemblies();\n        }\n\n        public ITest GetTestsWithNUnit()\n        {\n            return BuildTests(TestPlatform.PlayMode, m_LoadedAssemblies.ToArray());\n        }\n\n        public List<IAssemblyWrapper> GetUserAssemblies()\n        {\n            return m_LoadedAssemblies;\n        }\n\n        protected static ITest BuildTests(TestPlatform testPlatform, IAssemblyWrapper[] assemblies)\n        {\n            var settings = UnityTestAssemblyBuilder.GetNUnitTestBuilderSettings(testPlatform);\n            var builder = new UnityTestAssemblyBuilder();\n            return builder.Build(assemblies.Select(a => a.Assembly).ToArray(), settings);\n        }\n\n        private void LoadAssemblies()\n        {\n            if (m_LoadedAssemblies != null)\n            {\n                return;\n            }\n\n            m_LoadedAssemblies = new List<IAssemblyWrapper>();\n\n            foreach (var userAssembly in m_AssembliesToLoad)\n            {\n                IAssemblyWrapper a;\n                try\n                {\n                    a = m_AssemblyLoadProxy.Load(userAssembly);\n                }\n                catch (FileNotFoundException)\n                {\n                    continue;\n                }\n                if (a != null)\n                    m_LoadedAssemblies.Add(a);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/AssemblyProvider/PlayerTestAssemblyProvider.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 43a3aec217baa9644a7cf34b5f93fed9\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/AssemblyProvider/ScriptingRuntimeProxy.cs",
    "content": "namespace UnityEngine.TestTools.Utils\n{\n    internal class ScriptingRuntimeProxy : IScriptingRuntimeProxy\n    {\n        public string[] GetAllUserAssemblies()\n        {\n            return ScriptingRuntime.GetAllUserAssemblies();\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/AssemblyProvider/ScriptingRuntimeProxy.cs.meta",
    "content": "fileFormatVersion: 2\nguid: f3a361a6ad1aff14ba8f48976e94ad76\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/AssemblyProvider.meta",
    "content": "fileFormatVersion: 2\nguid: 51557afa652635743b264a309f0a5c60\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/AttributeHelper.cs",
    "content": "using System;\nusing System.IO;\nusing System.Linq;\n\nnamespace UnityEngine.TestTools\n{\n    internal static class AttributeHelper\n    {\n        internal static Type GetTargetClassFromName(string targetClassName, Type attributeInterface)\n        {\n            Type targetClass = null;\n            foreach (var assemblyName in ScriptingRuntime.GetAllUserAssemblies())\n            {\n                // we need to pass the assembly name without the .dll extension, so removing that first\n                var name = Path.GetFileNameWithoutExtension(assemblyName);\n                targetClass = Type.GetType(targetClassName + \",\" + name);\n                if (targetClass != null)\n                    break;\n            }\n\n            if (targetClass == null)\n            {\n                Debug.LogWarningFormat(\"Class type not found: \" + targetClassName);\n                return null;\n            }\n\n            ValidateTargetClass(targetClass, attributeInterface);\n            return targetClass;\n        }\n\n        private static void ValidateTargetClass(Type targetClass, Type attributeInterface)\n        {\n            var constructorInfos = targetClass.GetConstructors();\n            if (constructorInfos.All(constructor => constructor.GetParameters().Length != 0))\n            {\n                Debug.LogWarningFormat(\"{0} does not implement default constructor\", targetClass.Name);\n            }\n\n            if (!attributeInterface.IsAssignableFrom(targetClass))\n            {\n                Debug.LogWarningFormat(\"{0} does not implement {1}\", targetClass.Name, attributeInterface.Name);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/AttributeHelper.cs.meta",
    "content": "fileFormatVersion: 2\nguid: ae8ce3ffe04ac2c42945fd27e0291fc3\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/ColorEqualityComparer.cs",
    "content": "using System.Collections.Generic;\n\nnamespace UnityEngine.TestTools.Utils\n{\n    public class ColorEqualityComparer : IEqualityComparer<Color>\n    {\n        private const float k_DefaultError = 0.01f;\n        private readonly float AllowedError;\n\n\n        private static readonly ColorEqualityComparer m_Instance = new ColorEqualityComparer();\n        public static ColorEqualityComparer Instance { get { return m_Instance; } }\n\n        private ColorEqualityComparer() : this(k_DefaultError)\n        {\n        }\n\n        public ColorEqualityComparer(float error)\n        {\n            this.AllowedError = error;\n        }\n\n        public bool Equals(Color expected, Color actual)\n        {\n            return Utils.AreFloatsEqualAbsoluteError(expected.r, actual.r, AllowedError) &&\n                Utils.AreFloatsEqualAbsoluteError(expected.g, actual.g, AllowedError) &&\n                Utils.AreFloatsEqualAbsoluteError(expected.b, actual.b, AllowedError) &&\n                Utils.AreFloatsEqualAbsoluteError(expected.a, actual.a, AllowedError);\n        }\n\n        public int GetHashCode(Color color)\n        {\n            return 0;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/ColorEqualityComparer.cs.meta",
    "content": "fileFormatVersion: 2\nguid: d6105bc8cf5ce544487daca4cbc62583\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/CoroutineRunner.cs",
    "content": "using System;\nusing System.Collections;\nusing NUnit.Framework.Internal;\nusing UnityEngine.TestRunner.NUnitExtensions.Runner;\n\nnamespace UnityEngine.TestTools.Utils\n{\n    internal class CoroutineRunner\n    {\n        private bool m_Running;\n        private bool m_TestFailed;\n        private bool m_Timeout;\n        private readonly MonoBehaviour m_Controller;\n        private readonly UnityTestExecutionContext m_Context;\n        private Coroutine m_TimeOutCoroutine;\n        private IEnumerator m_TestCoroutine;\n\n        internal const int k_DefaultTimeout = 1000 * 180;\n\n        public CoroutineRunner(MonoBehaviour playmodeTestsController, UnityTestExecutionContext context)\n        {\n            m_Controller = playmodeTestsController;\n            m_Context = context;\n        }\n\n        public IEnumerator HandleEnumerableTest(IEnumerator testEnumerator)\n        {\n            if (m_Context.TestCaseTimeout == 0)\n            {\n                m_Context.TestCaseTimeout = k_DefaultTimeout;\n            }\n            do\n            {\n                if (!m_Running)\n                {\n                    m_Running = true;\n                    m_TestCoroutine = ExMethod(testEnumerator, m_Context.TestCaseTimeout);\n                    m_Controller.StartCoroutine(m_TestCoroutine);\n                }\n                if (m_TestFailed)\n                {\n                    StopAllRunningCoroutines();\n                    yield break;\n                }\n\n                if (m_Context.ExecutionStatus == TestExecutionStatus.StopRequested || m_Context.ExecutionStatus == TestExecutionStatus.AbortRequested)\n                {\n                    StopAllRunningCoroutines();\n                    yield break;\n                }\n                yield return null;\n            }\n            while (m_Running);\n        }\n\n        private void StopAllRunningCoroutines()\n        {\n            if (m_TimeOutCoroutine != null)\n            {\n                m_Controller.StopCoroutine(m_TimeOutCoroutine);\n            }\n\n            if (m_TestCoroutine != null)\n            {\n                m_Controller.StopCoroutine(m_TestCoroutine);\n            }\n        }\n\n        private IEnumerator ExMethod(IEnumerator e, int timeout)\n        {\n            m_TimeOutCoroutine = m_Controller.StartCoroutine(StartTimer(e, timeout,\n                () =>\n                {\n                    m_TestFailed = true;\n                    m_Timeout = true;\n                    m_Running = false;\n                }));\n\n            yield return m_Controller.StartCoroutine(e);\n            m_Controller.StopCoroutine(m_TimeOutCoroutine);\n            m_Running = false;\n        }\n\n        private IEnumerator StartTimer(IEnumerator coroutineToBeKilled, int timeout, Action onTimeout)\n        {\n            yield return new WaitForSecondsRealtime(timeout / 1000f);\n            if (coroutineToBeKilled != null)\n                m_Controller.StopCoroutine(coroutineToBeKilled);\n            if (onTimeout != null)\n                onTimeout();\n        }\n\n        public bool HasFailedWithTimeout()\n        {\n            return m_Timeout;\n        }\n\n        public int GetDefaultTimeout()\n        {\n            return k_DefaultTimeout;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/CoroutineRunner.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 24a158219395ebf44a60547b97784ddc\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/FloatEqualityComparer.cs",
    "content": "using System.Collections.Generic;\n\nnamespace UnityEngine.TestTools.Utils\n{\n    public class FloatEqualityComparer : IEqualityComparer<float>\n    {\n        private const float k_DefaultError = 0.0001f;\n        private readonly float AllowedError;\n\n        private static readonly  FloatEqualityComparer m_Instance = new FloatEqualityComparer();\n        public static FloatEqualityComparer Instance { get { return m_Instance; } }\n\n        private FloatEqualityComparer() : this(k_DefaultError) {}\n\n        public FloatEqualityComparer(float allowedError)\n        {\n            this.AllowedError = allowedError;\n        }\n\n        public bool Equals(float expected, float actual)\n        {\n            return Utils.AreFloatsEqual(expected, actual, AllowedError);\n        }\n\n        public int GetHashCode(float value)\n        {\n            return 0;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/FloatEqualityComparer.cs.meta",
    "content": "fileFormatVersion: 2\nguid: af5042802f06c804c8abddd544b77a4a\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/IOuterUnityTestAction.cs",
    "content": "using System.Collections;\nusing NUnit.Framework.Interfaces;\n\nnamespace UnityEngine.TestTools\n{\n    /// <summary>\n    /// When implemented by an attribute, this interface implemented to provide actions to execute before setup and after teardown of tests.\n    /// </summary>\n    public interface IOuterUnityTestAction\n    {\n        /// <summary>Executed before each test is run</summary>\n        /// <param name=\"test\">The test that is going to be run.</param>\n        IEnumerator BeforeTest(ITest test);\n\n        /// <summary>Executed after each test is run</summary>\n        /// <param name=\"test\">The test that has just been run.</param>\n        IEnumerator AfterTest(ITest test);\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/IOuterUnityTestAction.cs.meta",
    "content": "fileFormatVersion: 2\nguid: b9c2a6302985d3846b7b9f6fd9e2da9a\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/IPostBuildCleanup.cs",
    "content": "namespace UnityEngine.TestTools\n{\n    public interface IPostBuildCleanup\n    {\n        void Cleanup();\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/IPostBuildCleanup.cs.meta",
    "content": "fileFormatVersion: 2\nguid: ff67c526455160f4690a44f74dee4cbe\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/IPrebuildSceneSetup.cs",
    "content": "namespace UnityEngine.TestTools\n{\n    public interface IPrebuildSetup\n    {\n        void Setup();\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/IPrebuildSceneSetup.cs.meta",
    "content": "fileFormatVersion: 2\nguid: acc16f0c684508f44813662a300c574b\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/MonoBehaviourTest/IMonoBehaviourTest.cs",
    "content": "namespace UnityEngine.TestTools\n{\n    public interface IMonoBehaviourTest\n    {\n        bool IsTestFinished {get; }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/MonoBehaviourTest/IMonoBehaviourTest.cs.meta",
    "content": "fileFormatVersion: 2\nguid: a002d3737b873954395b7cf862873ab8\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/MonoBehaviourTest/MonoBehaviourTest.cs",
    "content": "namespace UnityEngine.TestTools\n{\n    public class MonoBehaviourTest<T> : CustomYieldInstruction where T : MonoBehaviour, IMonoBehaviourTest\n    {\n        public T component { get; }\n        public GameObject gameObject { get { return component.gameObject; } }\n\n        public MonoBehaviourTest(bool dontDestroyOnLoad = true)\n        {\n            var go = new GameObject(\"MonoBehaviourTest: \" + typeof(T).FullName);\n            component = go.AddComponent<T>();\n            if (dontDestroyOnLoad)\n            {\n                Object.DontDestroyOnLoad(go);\n            }\n        }\n\n        public override bool keepWaiting\n        {\n            get { return !component.IsTestFinished; }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/MonoBehaviourTest/MonoBehaviourTest.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 164c9b1458eaab743a4b45c37a4d720d\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/MonoBehaviourTest.meta",
    "content": "fileFormatVersion: 2\nguid: ce8da628f68c7594b8b9a597fa52db7b\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/PostBuildCleanupAttribute.cs",
    "content": "using System;\n\nnamespace UnityEngine.TestTools\n{\n    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]\n    public class PostBuildCleanupAttribute : Attribute\n    {\n        public PostBuildCleanupAttribute(Type targetClass)\n        {\n            TargetClass = targetClass;\n        }\n\n        public PostBuildCleanupAttribute(string targetClassName)\n        {\n            TargetClass = AttributeHelper.GetTargetClassFromName(targetClassName, typeof(IPostBuildCleanup));\n        }\n\n        internal Type TargetClass { get; private set; }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/PostBuildCleanupAttribute.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 621fd19bcb071b64aa1d68f0271aa780\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/PrebuildSceneSetupAttribute.cs",
    "content": "using System;\n\nnamespace UnityEngine.TestTools\n{\n    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]\n    public class PrebuildSetupAttribute : Attribute\n    {\n        public PrebuildSetupAttribute(Type targetClass)\n        {\n            TargetClass = targetClass;\n        }\n\n        public PrebuildSetupAttribute(string targetClassName)\n        {\n            TargetClass = AttributeHelper.GetTargetClassFromName(targetClassName, typeof(IPrebuildSetup));\n        }\n\n        internal Type TargetClass { get; private set; }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/PrebuildSceneSetupAttribute.cs.meta",
    "content": "fileFormatVersion: 2\nguid: d1b7ce919aa8864409412e809073cf96\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/QuaternionEqualityComparer.cs",
    "content": "using System.Collections.Generic;\n\nnamespace UnityEngine.TestTools.Utils\n{\n    public class QuaternionEqualityComparer : IEqualityComparer<Quaternion>\n    {\n        private const float k_DefaultError = 0.00001f;\n        private readonly float AllowedError;\n\n        private static readonly QuaternionEqualityComparer m_Instance = new QuaternionEqualityComparer();\n        public static QuaternionEqualityComparer Instance { get { return m_Instance; } }\n\n\n        private QuaternionEqualityComparer() : this(k_DefaultError) {}\n\n        public QuaternionEqualityComparer(float allowedError)\n        {\n            AllowedError = allowedError;\n        }\n\n        public bool Equals(Quaternion expected, Quaternion actual)\n        {\n            return Mathf.Abs(Quaternion.Dot(expected, actual)) > (1.0f - AllowedError);\n        }\n\n        public int GetHashCode(Quaternion quaternion)\n        {\n            return 0;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/QuaternionEqualityComparer.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 3b28913f21577de429da928d6d05219f\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/StacktraceFilter.cs",
    "content": "using System.Linq;\nusing System.Text;\n\nnamespace UnityEngine.TestTools.Utils\n{\n    internal static class StackTraceFilter\n    {\n        private static readonly string[] s_FilteredLogMessages =\n        {\n            @\"UnityEngine.DebugLogHandler:Internal_Log\",\n            @\"UnityEngine.DebugLogHandler:Log\",\n            @\"UnityEngine.Logger:Log\",\n            @\"UnityEngine.Debug\"\n        };\n\n        private static readonly string[] s_LastMessages =\n        {\n            @\"System.Reflection.MonoMethod:InternalInvoke(Object, Object[], Exception&)\",\n            @\"UnityEditor.TestTools.TestRunner.EditModeRunner:InvokeDelegator\"\n        };\n\n        public static string Filter(string inputStackTrace)\n        {\n            int idx;\n            foreach (var lastMessage in s_LastMessages)\n            {\n                idx = inputStackTrace.IndexOf(lastMessage);\n                if (idx != -1)\n                    inputStackTrace = inputStackTrace.Substring(0, idx);\n            }\n\n            var inputStackTraceLines = inputStackTrace.Split('\\n');\n            var result = new StringBuilder();\n            foreach (var line in inputStackTraceLines)\n            {\n                if (s_FilteredLogMessages.Any(s => line.StartsWith(s)))\n                    continue;\n                result.AppendLine(line);\n            }\n            return result.ToString();\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/StacktraceFilter.cs.meta",
    "content": "fileFormatVersion: 2\nguid: fc748d99f1f0d484a811a566fc7915ec\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/Utils.cs",
    "content": "using System;\n\nnamespace UnityEngine.TestTools.Utils\n{\n    public static class Utils\n    {\n        public static bool AreFloatsEqual(float expected, float actual, float epsilon)\n        {\n            // special case for infinity\n            if (expected == Mathf.Infinity || actual == Mathf.Infinity || expected == Mathf.NegativeInfinity || actual == Mathf.NegativeInfinity)\n                return expected == actual;\n\n            // we cover both relative and absolute tolerance with this check\n            // which is better than just relative in case of small (in abs value) args\n            // please note that \"usually\" approximation is used [i.e. abs(x)+abs(y)+1]\n            // but we speak about test code so we dont care that much about performance\n            // but we do care about checks being more precise\n            return Math.Abs(actual - expected) <= epsilon * Mathf.Max(Mathf.Max(Mathf.Abs(actual), Mathf.Abs(expected)), 1.0f);\n        }\n\n        public static bool AreFloatsEqualAbsoluteError(float expected, float actual, float allowedAbsoluteError)\n        {\n            return Math.Abs(actual - expected) <= allowedAbsoluteError;\n        }\n\n        /// <summary>\n        /// Analogous to GameObject.CreatePrimitive, but creates a primitive mesh renderer with fast shader instead of a default builtin shader.\n        /// Optimized for testing performance.\n        /// </summary>\n        /// <returns>A GameObject with primitive mesh renderer and collider.</returns>\n        public static GameObject CreatePrimitive(PrimitiveType type)\n        {\n            var prim = GameObject.CreatePrimitive(type);\n            var renderer = prim.GetComponent<Renderer>();\n            if (renderer)\n                renderer.sharedMaterial = new Material(Shader.Find(\"VertexLit\"));\n            return prim;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/Utils.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 9502550ba4785e3499d6c9251fa2114b\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/Vector2ComparerWithEqualsOperator.cs",
    "content": "using System.Collections.Generic;\n\nnamespace UnityEngine.TestTools.Utils\n{\n    public class Vector2ComparerWithEqualsOperator : IEqualityComparer<Vector2>\n    {\n        private static readonly Vector2ComparerWithEqualsOperator m_Instance = new Vector2ComparerWithEqualsOperator();\n        public static Vector2ComparerWithEqualsOperator Instance { get { return m_Instance; } }\n\n        private Vector2ComparerWithEqualsOperator() {}\n\n        public bool Equals(Vector2 expected, Vector2 actual)\n        {\n            return expected == actual;\n        }\n\n        public int GetHashCode(Vector2 vec2)\n        {\n            return 0;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/Vector2ComparerWithEqualsOperator.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 65701ebe8bada6b4785e9c7afe7f5bee\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/Vector2EqualityComparer.cs",
    "content": "using System.Collections.Generic;\n\nnamespace UnityEngine.TestTools.Utils\n{\n    public class Vector2EqualityComparer : IEqualityComparer<Vector2>\n    {\n        private const float k_DefaultError = 0.0001f;\n        private readonly float AllowedError;\n\n        private static readonly Vector2EqualityComparer m_Instance = new Vector2EqualityComparer();\n        public static Vector2EqualityComparer Instance { get { return m_Instance; } }\n\n        private Vector2EqualityComparer() : this(k_DefaultError)\n        {\n        }\n\n        public Vector2EqualityComparer(float error)\n        {\n            this.AllowedError = error;\n        }\n\n        public bool Equals(Vector2 expected, Vector2 actual)\n        {\n            return Utils.AreFloatsEqual(expected.x, actual.x, AllowedError) &&\n                Utils.AreFloatsEqual(expected.y, actual.y, AllowedError);\n        }\n\n        public int GetHashCode(Vector2 vec2)\n        {\n            return 0;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/Vector2EqualityComparer.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 58ad09607a0d62d458a78d7174665566\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/Vector3ComparerWithEqualsOperator.cs",
    "content": "using System.Collections.Generic;\n\nnamespace UnityEngine.TestTools.Utils\n{\n    public class Vector3ComparerWithEqualsOperator : IEqualityComparer<Vector3>\n    {\n        private static readonly Vector3ComparerWithEqualsOperator m_Instance = new Vector3ComparerWithEqualsOperator();\n        public static Vector3ComparerWithEqualsOperator Instance { get { return m_Instance; } }\n\n        private Vector3ComparerWithEqualsOperator() {}\n\n        public bool Equals(Vector3 expected, Vector3 actual)\n        {\n            return expected == actual;\n        }\n\n        public int GetHashCode(Vector3 vec3)\n        {\n            return 0;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/Vector3ComparerWithEqualsOperator.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 5b994928117e3db418da69c821da7e19\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/Vector3EqualityComparer.cs",
    "content": "using System.Collections.Generic;\n\n\nnamespace UnityEngine.TestTools.Utils\n{\n    public class Vector3EqualityComparer : IEqualityComparer<Vector3>\n    {\n        private const float k_DefaultError = 0.0001f;\n        private readonly float AllowedError;\n\n        private static readonly Vector3EqualityComparer m_Instance = new Vector3EqualityComparer();\n        public static Vector3EqualityComparer Instance { get { return m_Instance; } }\n\n        private Vector3EqualityComparer() : this(k_DefaultError) {}\n        public Vector3EqualityComparer(float allowedError)\n        {\n            this.AllowedError = allowedError;\n        }\n\n        public bool Equals(Vector3 expected, Vector3 actual)\n        {\n            return Utils.AreFloatsEqual(expected.x, actual.x, AllowedError) &&\n                Utils.AreFloatsEqual(expected.y, actual.y, AllowedError) &&\n                Utils.AreFloatsEqual(expected.z, actual.z, AllowedError);\n        }\n\n        public int GetHashCode(Vector3 vec3)\n        {\n            return 0;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/Vector3EqualityComparer.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 4bd2bc28ff24d5c488844851cb785db0\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/Vector4ComparerWithEqualsOperator.cs",
    "content": "using System.Collections.Generic;\n\nnamespace UnityEngine.TestTools.Utils\n{\n    public class Vector4ComparerWithEqualsOperator : IEqualityComparer<Vector4>\n    {\n        private static readonly Vector4ComparerWithEqualsOperator m_Instance = new Vector4ComparerWithEqualsOperator();\n        public static Vector4ComparerWithEqualsOperator Instance { get { return m_Instance; } }\n\n        private Vector4ComparerWithEqualsOperator() {}\n\n        public bool Equals(Vector4 expected, Vector4 actual)\n        {\n            return expected == actual;\n        }\n\n        public int GetHashCode(Vector4 vec4)\n        {\n            return 0;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/Vector4ComparerWithEqualsOperator.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 44100f5f60f351348b9719b46d46cebe\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/Vector4EqualityComparer.cs",
    "content": "using System.Collections.Generic;\n\nnamespace UnityEngine.TestTools.Utils\n{\n    public class Vector4EqualityComparer : IEqualityComparer<Vector4>\n    {\n        private const float k_DefaultError = 0.0001f;\n        private readonly float AllowedError;\n\n        private static readonly Vector4EqualityComparer m_Instance = new Vector4EqualityComparer();\n        public static Vector4EqualityComparer Instance { get { return m_Instance; } }\n\n        private Vector4EqualityComparer() : this(k_DefaultError) {}\n        public Vector4EqualityComparer(float allowedError)\n        {\n            this.AllowedError = allowedError;\n        }\n\n        public bool Equals(Vector4 expected, Vector4 actual)\n        {\n            return Utils.AreFloatsEqual(expected.x, actual.x, AllowedError) &&\n                Utils.AreFloatsEqual(expected.y, actual.y, AllowedError) &&\n                Utils.AreFloatsEqual(expected.z, actual.z, AllowedError) &&\n                Utils.AreFloatsEqual(expected.w, actual.w, AllowedError);\n        }\n\n        public int GetHashCode(Vector4 vec4)\n        {\n            return 0;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils/Vector4EqualityComparer.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 32da81683c22faf458026716a2b821aa\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner/Utils.meta",
    "content": "fileFormatVersion: 2\nguid: bb32bccaf32a6db448d1c0cc99c78688\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/UnityEngine.TestRunner.meta",
    "content": "fileFormatVersion: 2\nguid: 950890083f4907541a6ed06d70959e49\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/package.json",
    "content": "{\n  \"name\": \"com.unity.test-framework\",\n  \"displayName\":  \"Test Framework\",\n  \"version\": \"1.0.13\",\n  \"unity\": \"2019.2\",\n  \"unityRelease\": \"0a10\",\n  \"description\": \"Test framework for running Edit mode and Play mode test in Unity.\",\n  \"keywords\": [ \"Test\", \"TestFramework\" ],\n  \"category\": \"Unity Test Framework\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git@gitlab.cds.internal.unity3d.com/upm-packages/core/com.unity.test-framework.git\",\n    \"revision\": \"8d09534f1c9f96b37fa38167a8697e5965ab58b8\"\n  }, \n  \"dependencies\": {\n    \"com.unity.ext.nunit\": \"1.0.0\"\n  },\n  \"relatedPackages\": {\n    \"com.unity.test-framework.tests\": \"1.0.13\"\n  }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.test-framework@1.0.13/package.json.meta",
    "content": "fileFormatVersion: 2\nguid: d6a2e6e4803de7b43baacdc355fc144d\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/.gitlab-ci.yml",
    "content": "image: node:6.10.0\n\nstages:\n  - push_to_packman_staging\n\npush_to_packman_staging:\n  stage: push_to_packman_staging\n  only:\n    - tags\n  script:\n    - curl -u $USER_NAME:$API_KEY https://staging-packages.unity.com/auth > .npmrc\n    - npm publish\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/CHANGELOG.md",
    "content": "# Changelog\nThese are the release notes for the TextMesh Pro UPM package which was first introduced with Unity 2018.1. Please see the following link for the Release Notes for prior versions of TextMesh Pro. http://digitalnativestudios.com/forum/index.php?topic=1363.0\n\n## [2.0.1] - 2019-05-08\n### Changes\n- See Release 1.4.1\n- Requires .Net 4.x Scripting Runtime.\n\n## [2.0.0] - 2019-03-01\n### Changes\n- Same release as 1.4.0\n\n## [1.4.1] - 2019-05-08\n### Changes\n- Improved handling of automatic Font Asset upgrade to version 1.1.0 which is required to support the new Dynamic SDF system. See Case #1144858\n- Made release compatible with .Net 3.5 Scripting Runtime.\n- Added support for Stereo rendering to the TMP SDF Overlay shaders.\n- Fixed Caret positioning issue when using IME. Case #1146626\n\n## [1.4.0] - 2019-03-07\n### Changes\n- Same release as 1.4.0-preview.3a.\n\n## [1.4.0-preview.3a] - 2019-02-28\n### Changes\n- Improved performance of the Project Files GUID Remapping Tool.\n- Fixed an issue with the TMP_FontAsset.TryAddCharacters() functions which was resulting in an error when added characters exceeded the capacity of the atlas texture.\n- Updated TMP_FontAsset.TryAddCharacters functions to add new overloads returning list of characters that could not be added.\n- Added function in OnEnable of FontAsset Editor's to clean up Fallback list to remove any null / empty entries.\n- Added support for Stereo rendering to the TMP Distance Field and Mobile Distance Field shaders.\n\n## [1.4.0-preview.2a] - 2019-02-14\n### Changes\n- Fixed an issue with SDF Scale handling where the text object would not render correctly after the object scale had been set to zero.\n- Fixed an issue with the TMP_UpdateManager where text objects were not getting unregistered correctly.\n- Any changes to Font Asset Creation Settings' padding, atlas width and / or atlas height will now result in all Material Presets for the given font asset to also be updated.\n- Added new section in the TMP Settings related to the new Dynamic Font System. \n- Added new property in the Dynamic Font System section to determine if OpenType Font Features will be retrieved from source font files at runtime as new characters are added to font assets. Glyph Adjustment Data (Kerning) is the only feature currently supported.\n- Fix an issue where font assets created at runtime were not getting their asset version number set to \"1.1.0\".\n- Improved parsing of the text file used in the Font Asset Creator and \"Characters from File\" option to handle UTF16 \"\\u\" and UTF32 \"\\U\" escape character sequences.\n- Fixed a Null Reference Error (NRE) that could occur when using the &ltfont&gt tag with an invalid font name followed by the &ltsprite&gt tag.\n- The Glyph Adjustment Table presentation and internal data structure has been changed to facilitate the future addition of OpenType font features. See https://forum.unity.com/threads/version-1-4-0-preview-with-dynamic-sdf-for-unity-2018-3-now-available.622420/#post-4206595 for more details.\n- Fixed an issue with the &ltrotate&gt tag incorrectly affecting character spacing. \n\n## [1.4.0-preview.1] - 2019-01-30\n### Changes\n- Renamed TMPro_FontUtilities to TMP_FontAssetCommon to more accurately reflect the content of this file.\n- Accessing the TextMesh Pro Settings via the new Edit - Settings menu when TMP Essential Resources have not yet been imported in the project will no longer open a new window to provide the options to import these resources.\n- Fixed an issue where using int.MaxValue, int.MinValue, float.MaxValue and float.MinValue in conjunction with SetText() would display incorrect numerical values. Case #1078521.\n- Added public setter to the TMP Settings' missingGlyphCharacter to allow changing which character will be used for missing characters via scripting.\n- Fixed a potential Null Reference Exception related to loading the Default Style Sheet.\n- Added compiler conditional to TMP_UpdateManager.cs to address changes to SRP.\n- Improved the &ltmargin&gt tag to make it possible to define both left and right margin values. Example: &ltmargin left=10% right=10px&gt.\n- Added new menu option to allow the quick creation of a UI Button using TMP. New menu option is located in Create - UI - Button (TextMeshPro).\n- Renamed TMP related create menu options.\n- Fixed TMP object creation handling when using Prefab isolation mode. Case #1077392\n- Fixed another issue related to Prefabs where some serialized properties of the text object would incorrectly show up in the Overrides prefab options. Case #1093101\n- Fixed issue where changing the Sorting Layer or Sorting Order of a <TextMeshPro> object would not dirty the scene. Case #1069776\n- Fixed a text alignment issue when setting text alignment on disabled text objects. Case #1047771\n- Fixed an issue where text object bounds were not set correctly on newly created text objects or in some cases when setting the text to null or string.empty. Case #1093388\n- Fixed an issue in the IntToString() function that could result in Index Out Of Bounds error. Case #1102007\n- Changed the TMP_InputField IsValidChar function to protected virtual.\n- The \"Allow Rich Text Editing\" property of the TMP_InputField is now set to false by default.\n- Added new option to the Sprite Asset context menu to make it easier to update sprite glyphs edited via the Unity Sprite Editor.\n- Added new Sharpness slider in the Debug section of the SDF Material inspector.\n- Fixed an error that would occur when using the context menu Reset on text component. Case #1044726\n- Fixed issue where CharacterInfo.index would be incorrect as a result of using Surrogate Pairs in the text. Case #1037828\n- The TMP_EditorPanel and TMP_UiEditorPanel now have their \"UseForChildren\" flag set to true to enable user / custom inspectors to inherit from them.\n- Fixed an issue where rich text tags using pixel (px) or font units (em) were not correctly accounting for orthographic camera mode. This change only affects the normal TMP text component.\n- Fixed an inspector issue related to changes to the margin in the TMP Extra Settings panel. Case #1114253\n- Added new property to Glyph Adjustment Pairs which determines if Character Spacing Adjustments should affect the given pair.\n- Updated the Glyph Adjustment Table where ID now represents the unicode (hex) value for the character instead of its decimal value.\n- Added new SetValueWithoutNotify() function to TMP_DropDown and SetTextWithoutNotify() function to TMP_InputField allowing these to be set without triggering OnValueChanged event.\n- Geometry buffer deallocation which normally takes place when current allocations exceed those of the new text by more than 256 characters will no longer occur if the new text is set to null or string.empty.\n- Fixed a minor issue where the underline SDF scale would be incorrect when the underline text sequence contained normal size characters and ended with a subscript or superscript character.\n- Fixed an error that would occur when using the Reset Context menu on a Material using the SDF Surface or Mobile SDF Surface Shaders. Case #1122279\n- Resolved a Null Reference Error that would appear when cycling through the text overflow modes. Case #1121624\n\n## [1.3.0] - 2018-08-09\n### Changes\n- Revamped UI to conform to Unity Human Interface Guidelines.\n- Updated the title text on the Font Asset Creator window tab to \"Font Asset Creator\".\n- Using TMP_Text.SetCharArray() with an empty char[] array will now clear the text.\n- Made a small improvement to the TMP Input Field when using nested 2d RectMasks.\n- Renamed symbol defines used by TMP to append TMP_ in front of the define to avoid potential conflicts with user defines.\n- Improved the Project Files GUID Remapping tool to allow specifying a target folder to scan.\n- Added the ability to cancel the scanning process used by the Project Files GUID Remapping tool.\n- Moved TMP Settings to universal settings window in 2018.3 and above.\n- Changing style sheet in the TMP Settings will now be reflected automatically on existing text objects in the editor.\n- Added new function TMP_StyleSheet.UpdateStyleSheet() to update the internal reference to which style sheet text objects should be using in conjunction with the style tag.\n\n## [1.2.4] - 2018-06-10\n### Changes\n- Fixed a minor issue when using Justified and Flush alignment in conjunction with \\u00A0.\n- The Font Asset creationSettings field is no longer an Editor only serialized field.\n\n## [1.2.3] - 2018-05-29\n### Changes\n- Added new bitmap shader with support for Custom Font Atlas texture. This shader also includes a new property \"Padding\" to provide control over the geometry padding to closely fit a modified / custom font atlas texture.\n- Fixed an issue with ForceMeshUpdate(bool ignoreActiveState) not being handled correctly.\n- Cleaned up memory allocations from repeated use of the Font Asset Creator.\n- Sprites are now scaled based on the current font instead of the primary font asset assigned to the text object.\n- It is now possible to recall the most recent settings used when creating a font asset in the Font Asset Creator.\n- Newly created font assets now contain the settings used when they were last created. This will make the process of updating / regenerating font assets much easier.\n- New context menu \"Update Font Asset\" was added to the Font Asset inspector which will open the Font Asset Creator with the most recently used settings for that font asset.\n- New Context Menu \"Create Font Asset\" was added to the Font inspector panel which will open the Font Asset Creator with this source font file already selected.\n- Fixed 3 compiler warnings that would appear when using .Net 4.x.\n- Modified the TMP Settings to place the Missing Glyph options in their own section.\n- Renamed a symbol used for internal debugging to avoid potential conflicts with other user project defines.\n- TMP Sprite Importer \"Create Sprite Asset\" and \"Save Sprite Asset\" options are disabled unless a Sprite Data Source, Import Format and Sprite Texture Atlas are provided.\n- Improved the performance of the Project Files GUID Remapping tool.\n- Users will now be prompted to import the TMP Essential Resources when using the Font Asset Creator if such resources have not already been imported.\n\n## [1.2.2] - 2018-03-28\n### Changes\n- Calling SetAllDirty() on a TMP text component will now force a regeneration of the text object including re-parsing of the text.\n- Fixed potential Null Reference Exception that could occur when assigning a new fallback font asset.\n- Removed public from test classes.\n- Fixed an issue where using nested links (which doesn't make sense conceptually) would result in an error. Should accidental use of nested links occurs, the last / most nested ends up being used.\n- Fixed a potential text alignment issue where an hyphen at the end of a line followed by a new line containing a single word too long to fit the text container would result in miss alignment of the hyphen.\n- Updated package license.\n- Non-Breaking Space character (0xA0) will now be excluded from word spacing adjustments when using Justified or Flush text alignment.\n- Improved handling of Underline, Strikethrough and Mark tag with regards to vertex color and Color tag alpha.\n- Improved TMP_FontAsset.HasCharacter(char character, bool searchFallbacks) to include a recursive search of fallbacks as well as TMP Settings fallback list and default font asset.\n- The &ltgradient&gt tag will now also apply to sprites provided the sprite tint attribute is set to a value of 1. Ex. &ltsprite=\"Sprite Asset\" index=0 tint=1&gt.\n- Updated Font Asset Creator Plugin to allow for cancellation of the font asset generation process.\n- Added callback to support the Scriptable Render Pipeline (SRP) with the normal TextMeshPro component.\n- Improved handling of some non-breaking space characters which should not be ignored at the end of a line.\n- Sprite Asset fallbacks will now be searched when using the &ltsprite&gt tag and referencing a sprite by Unicode or by Name.\n- Updated EmojiOne samples from https://www.emojione.com/ and added attribution.\n- Removed the 32bit versions of the TMP Plugins used by the Font Asset Creator since the Unity Editor is now only available as 64bit.\n- The isTextTruncated property is now serialized.\n- Added new event handler to the TMP_TextEventHandler.cs script included in Example 12a to allow tracking of interactions with Sprites.\n\n## [1.2.1] - 2018-02-14\n### Changes\n- Package is now backwards compatible with Unity 2018.1.\n- Renamed Assembly Definitions (.asmdef) to new UPM package conventions.\n- Added DisplayName for TMP UPM package.\n- Revised Editor and Playmode tests to ignore / skip over the tests if the required resources are not present in the project.\n- Revised implementation of Font Asset Creator progress bar to use Unity's EditorGUI.ProgressBar instead of custom texture.\n- Fixed an issue where using the material tag in conjunction with fallback font assets was not handled correctly.\n- Fixed an issue where changing the fontStyle property in conjunction with using alternative typefaces / font weights would not correctly trigger a regeneration of the text object.\n\n## [1.2.0] - 2018-01-23\n### Changes\n- Package version # increased to 1.2.0 which is the first release for Unity 2018.2.\n\n## [1.1.0] - 2018-01-23\n### Changes\n- Package version # increased to 1.1.0 which is the first release for Unity 2018.1. \n\n## [1.0.27] - 2018-01-16\n### Changes\n- Fixed an issue where setting the TMP_InputField.text property to null would result in an error.\n- Fixed issue with Raycast Target state not getting serialized properly when saving / reloading a scene.\n- Changed reference to PrefabUtility.GetPrefabParent() to PrefabUtility.GetCorrespondingObjectFromSource() to reflect public API change in 2018.2\n- Option to import package essential resources will only be presented to users when accessing a TMP component or the TMP Settings file via the project menu.\n\n## [1.0.26] - 2018-01-10\n### Added\n- Removed Tizen player references in the TMP_InputField as the Tizen player is no longer supported as of Unity 2018.1.\n\n## [1.0.25] - 2018-01-05\n### Added\n- Fixed a minor issue with PreferredValues calculation in conjunction with using text auto-sizing.\n- Improved Kerning handling where it is now possible to define positional adjustments for the first and second glyph in the pair.\n- Renamed Kerning Info Table to Glyph Adjustment Table to better reflect the added functionality of this table.\n- Added Search toolbar to the Glyph Adjustment Table.\n- Fixed incorrect detection / handling of Asset Serialization mode in the Project Conversion Utility.\n- Removed SelectionBase attribute from TMP components.\n- Revised TMP Shaders to support the new UNITY_UI_CLIP_RECT shader keyword which can provide a performance improvement of up to 30% on some devices.\n- Added TMP_PRESENT define as per the request of several third party asset publishers.\n\n## [1.0.23] - 2017-11-14\n### Added\n- New menu option added to Import Examples and additional content like Font Assets, Materials Presets, etc for TextMesh Pro. This new menu option is located in \"Window -> TextMeshPro -> Import Examples and Extra Content\".\n- New menu option added to Convert existing project files and assets created with either the Source Code or DLL only version of TextMesh Pro. Please be sure to backup your project before using this option. The new menu option is located in \"Window -> TextMeshPro -> Project Files GUID Remapping Tool\".\n- Added Assembly Definitions for the TMP Runtime and Editor scripts.\n- Added support for the UI DirtyLayoutCallback, DirtyVerticesCallback and DirtyMaterialCallback."
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/CHANGELOG.md.meta",
    "content": "fileFormatVersion: 2\nguid: 22464cf7ab0243a6bf9c79851183b002\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Documentation~/TextMeshPro.md",
    "content": "# **_TextMesh Pro User Guide_**\n\n#### **Overview**\nThis User Guide was designed to provide first time users of TextMesh Pro with a basic overview of the features and functionality of the tool.\n\n#### **Installation**\nThe TextMesh Pro UPM package is already included with the Unity Editor and as such does not require installation. TextMesh Pro \"TMP\" does however require adding resources to your project which are essential for using TextMesh Pro. \n\nTo import the \"*TMP Essential Resources*\", please use the \"*Window -> TextMeshPro -> Import TMP Essential Resources*\" menu option. These resources will be added at the root of your project in the \"*TextMesh Pro*\" folder.\n\nThe TextMesh Pro package also includes additional resources and examples that will make discovering and learning about TextMesh Pro's powerful features easier. It is strongly recommended that first time users import these additional resources. \n\nTo import the \"*TMP Examples & Extras*\", please use the \"*Window -> TextMeshPro -> Import TMP Examples & Extras*\" menu option. These resources will also be added in the same \"*TextMesh Pro*\" folder inside your project. \n\n\n#### **Quick Start**\nThere are two TextMesh Pro components available. The first TMP text component is of type &lt;TextMeshPro&gt; and designed to work with the MeshRenderer. This component is an ideal replacement for the legacy TextMesh component. \n\nTo add a new &lt;TextMeshPro&gt; text object, go to: *GameObject->3D Object->TextMeshPro Text*. \n\nThe second TMP text component is of type  &lt;TextMeshProUGUI&gt; and designed to work with the CanvasRenderer and Canvas system. This component is an ideal replacement for the UI.Text component. \n\nTo add a new &lt;TextMeshProUGUI&gt; text object, go to: *GameObject->UI->TextMeshPro Text*. \n\nYou may also wish to watch this [Getting Started](https://youtu.be/olnxlo-Wri4) short video which covers this topic.\n\nWe strongly recommend that you also watch the [Font Asset Creation](https://youtu.be/qzJNIGCFFtY) video as well as the [Working with Material Presets](https://youtu.be/d2MARbDNeaA) as these two topics is also key to working and getting the most out of TextMesh Pro. \n\nAs mentionned in the Installation section of this guide, it is recommended that you import the \"*TMP Examples & Extras*\" and take the time to explore each of the examples as they provide a great overview of the functionality of the tool and the many text layout and [rich text tags](http://digitalnativestudios.com/textmeshpro/docs/rich-text/) available in TextMesh Pro.\n\n#### **Support & API Documentation**\nShould you have questions or require assistance, please visit the [Unity UI & TextMesh Pro](https://forum.unity.com/forums/unity-ui-textmesh-pro.60/) section of the Unity forum as well as the [TextMesh Pro User Forum](http://digitalnativestudios.com/forum/index.php) where you will find additional information, [Video Tutorials](http://digitalnativestudios.com/forum/index.php?board=4.0) and [FAQ](http://digitalnativestudios.com/forum/index.php?topic=890.0). In the event you are unable to find the information you seek, always feel free to post on the [Unity UI & TextMesh Pro](https://forum.unity.com/forums/unity-ui-textmesh-pro.60/) section user forum.\n\n[Online Documentation](http://digitalnativestudios.com/textmeshpro/docs/) is also available on TextMesh Pro including Rich Text tags, Shaders, Scripting API and more.\n\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Documentation~/TextMeshPro.md.meta",
    "content": "fileFormatVersion: 2\nguid: ca77d26d10b9455ca5a4b22c93be2a31\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Gizmos/TMP - Dropdown Icon.psd.meta",
    "content": "fileFormatVersion: 2\nguid: a7ec9e7ad8b847b7ae4510af83c5d868\nTextureImporter:\n  fileIDToRecycleName: {}\n  externalObjects: {}\n  serializedVersion: 7\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 0\n    sRGBTexture: 1\n    linearTexture: 1\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapsPreserveCoverage: 0\n    alphaTestReferenceValue: 0.5\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: 0.25\n    normalMapFilter: 0\n  isReadable: 0\n  streamingMipmaps: 0\n  streamingMipmapsPriority: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 6\n  cubemapConvolution: 0\n  seamlessCubemap: 0\n  textureFormat: -2\n  maxTextureSize: 128\n  textureSettings:\n    serializedVersion: 2\n    filterMode: -1\n    aniso: 1\n    mipBias: -100\n    wrapU: 1\n    wrapV: 1\n    wrapW: 1\n  nPOTScale: 0\n  lightmap: 0\n  compressionQuality: 50\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: 0.5, y: 0.5}\n  spritePixelsToUnits: 100\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spriteGenerateFallbackPhysicsShape: 1\n  alphaUsage: 1\n  alphaIsTransparency: 1\n  spriteTessellationDetail: -1\n  textureType: 2\n  textureShape: 1\n  singleChannelComponent: 0\n  maxTextureSizeSet: 0\n  compressionQualitySet: 0\n  textureFormatSet: 0\n  platformSettings:\n  - serializedVersion: 2\n    buildTarget: DefaultTexturePlatform\n    maxTextureSize: 128\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 0\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n  - serializedVersion: 2\n    buildTarget: Standalone\n    maxTextureSize: 128\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 0\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n  - serializedVersion: 2\n    buildTarget: iPhone\n    maxTextureSize: 128\n    resizeAlgorithm: 0\n    textureFormat: 2\n    textureCompression: 0\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n  - serializedVersion: 2\n    buildTarget: Android\n    maxTextureSize: 128\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 0\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n  - serializedVersion: 2\n    buildTarget: Windows Store Apps\n    maxTextureSize: 128\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 0\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n  - serializedVersion: 2\n    buildTarget: WebGL\n    maxTextureSize: 128\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 0\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n  spriteSheet:\n    serializedVersion: 2\n    sprites: []\n    outline: []\n    physicsShape: []\n    bones: []\n    spriteID: \n    vertices: []\n    indices: \n    edges: []\n    weights: []\n  spritePackingTag: \n  pSDRemoveMatte: 1\n  pSDShowRemoveMatteOption: 1\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Gizmos/TMP - Font Asset Icon.psd.meta",
    "content": "fileFormatVersion: 2\nguid: ee148e281f3c41c5b4ff5f8a5afe5a6c\ntimeCreated: 1463559213\nlicenseType: Pro\nTextureImporter:\n  fileIDToRecycleName: {}\n  serializedVersion: 2\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 0\n    linearTexture: 1\n    correctGamma: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: 0.25\n    normalMapFilter: 0\n  isReadable: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 0\n  cubemapConvolution: 0\n  cubemapConvolutionSteps: 7\n  cubemapConvolutionExponent: 1.5\n  seamlessCubemap: 0\n  textureFormat: -3\n  maxTextureSize: 128\n  textureSettings:\n    filterMode: -1\n    aniso: 1\n    mipBias: -1\n    wrapMode: 1\n  nPOTScale: 0\n  lightmap: 0\n  rGBM: 0\n  compressionQuality: 50\n  allowsAlphaSplitting: 0\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: 0.5, y: 0.5}\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spritePixelsToUnits: 100\n  alphaIsTransparency: 1\n  textureType: 2\n  buildTargetSettings: []\n  spriteSheet:\n    sprites: []\n    outline: []\n  spritePackingTag: \n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Gizmos/TMP - Input Field Icon.psd.meta",
    "content": "fileFormatVersion: 2\nguid: 3ee40aa79cd242a5b53b0b0ca4f13f0f\ntimeCreated: 1457860876\nlicenseType: Pro\nTextureImporter:\n  fileIDToRecycleName: {}\n  serializedVersion: 2\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 0\n    linearTexture: 1\n    correctGamma: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: 0.25\n    normalMapFilter: 0\n  isReadable: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 0\n  cubemapConvolution: 0\n  cubemapConvolutionSteps: 8\n  cubemapConvolutionExponent: 1.5\n  seamlessCubemap: 0\n  textureFormat: -3\n  maxTextureSize: 128\n  textureSettings:\n    filterMode: -1\n    aniso: 1\n    mipBias: -1\n    wrapMode: 1\n  nPOTScale: 0\n  lightmap: 0\n  rGBM: 0\n  compressionQuality: 50\n  allowsAlphaSplitting: 0\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: 0.5, y: 0.5}\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spritePixelsToUnits: 100\n  alphaIsTransparency: 1\n  textureType: 2\n  buildTargetSettings: []\n  spriteSheet:\n    sprites: []\n    outline: []\n  spritePackingTag: \n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Gizmos/TMP - Sprite Asset Icon.psd.meta",
    "content": "fileFormatVersion: 2\nguid: ec7c645d93308c04d8840982af12101e\ntimeCreated: 1463559213\nlicenseType: Pro\nTextureImporter:\n  fileIDToRecycleName: {}\n  serializedVersion: 2\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 0\n    linearTexture: 1\n    correctGamma: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: 0.25\n    normalMapFilter: 0\n  isReadable: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 0\n  cubemapConvolution: 0\n  cubemapConvolutionSteps: 7\n  cubemapConvolutionExponent: 1.5\n  seamlessCubemap: 0\n  textureFormat: -3\n  maxTextureSize: 128\n  textureSettings:\n    filterMode: -1\n    aniso: 1\n    mipBias: -1\n    wrapMode: 1\n  nPOTScale: 0\n  lightmap: 0\n  rGBM: 0\n  compressionQuality: 50\n  allowsAlphaSplitting: 0\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: 0.5, y: 0.5}\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spritePixelsToUnits: 100\n  alphaIsTransparency: 1\n  textureType: 2\n  buildTargetSettings: []\n  spriteSheet:\n    sprites: []\n    outline: []\n  spritePackingTag: \n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Gizmos/TMP - Text Component Icon.psd.meta",
    "content": "fileFormatVersion: 2\nguid: 2fd6421f253b4ef1a19526541f9ffc0c\nTextureImporter:\n  fileIDToRecycleName: {}\n  serializedVersion: 2\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 0\n    linearTexture: 1\n    correctGamma: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: .25\n    normalMapFilter: 0\n  isReadable: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 0\n  cubemapConvolution: 0\n  cubemapConvolutionSteps: 8\n  cubemapConvolutionExponent: 1.5\n  seamlessCubemap: 0\n  textureFormat: -3\n  maxTextureSize: 128\n  textureSettings:\n    filterMode: -1\n    aniso: 1\n    mipBias: -1\n    wrapMode: 1\n  nPOTScale: 0\n  lightmap: 0\n  rGBM: 0\n  compressionQuality: 50\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: .5, y: .5}\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spritePixelsToUnits: 100\n  alphaIsTransparency: 1\n  textureType: 2\n  buildTargetSettings: []\n  spriteSheet:\n    sprites: []\n  spritePackingTag: \n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Gizmos.meta",
    "content": "fileFormatVersion: 2\nguid: e93ec7eb6de342aabd156833e253f838\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Shaders/TMP_Properties.cginc",
    "content": "// UI Editable properties\nuniform sampler2D\t_FaceTex;\t\t\t\t\t// Alpha : Signed Distance\nuniform float\t\t_FaceUVSpeedX;\nuniform float\t\t_FaceUVSpeedY;\nuniform fixed4\t\t_FaceColor;\t\t\t\t\t// RGBA : Color + Opacity\nuniform float\t\t_FaceDilate;\t\t\t\t// v[ 0, 1]\nuniform float\t\t_OutlineSoftness;\t\t\t// v[ 0, 1]\n\nuniform sampler2D\t_OutlineTex;\t\t\t\t// RGBA : Color + Opacity\nuniform float\t\t_OutlineUVSpeedX;\nuniform float\t\t_OutlineUVSpeedY;\nuniform fixed4\t\t_OutlineColor;\t\t\t\t// RGBA : Color + Opacity\nuniform float\t\t_OutlineWidth;\t\t\t\t// v[ 0, 1]\n\nuniform float\t\t_Bevel;\t\t\t\t\t\t// v[ 0, 1]\nuniform float\t\t_BevelOffset;\t\t\t\t// v[-1, 1]\nuniform float\t\t_BevelWidth;\t\t\t\t// v[-1, 1]\nuniform float\t\t_BevelClamp;\t\t\t\t// v[ 0, 1]\nuniform float\t\t_BevelRoundness;\t\t\t// v[ 0, 1]\n\nuniform sampler2D\t_BumpMap;\t\t\t\t\t// Normal map\nuniform float\t\t_BumpOutline;\t\t\t\t// v[ 0, 1]\nuniform float\t\t_BumpFace;\t\t\t\t\t// v[ 0, 1]\n\nuniform samplerCUBE\t_Cube;\t\t\t\t\t\t// Cube / sphere map\nuniform fixed4 \t\t_ReflectFaceColor;\t\t\t// RGB intensity\nuniform fixed4\t\t_ReflectOutlineColor;\n//uniform float\t\t_EnvTiltX;\t\t\t\t\t// v[-1, 1]\n//uniform float\t\t_EnvTiltY;\t\t\t\t\t// v[-1, 1]\nuniform float3      _EnvMatrixRotation;\nuniform float4x4\t_EnvMatrix;\n\nuniform fixed4\t\t_SpecularColor;\t\t\t\t// RGB intensity\nuniform float\t\t_LightAngle;\t\t\t\t// v[ 0,Tau]\nuniform float\t\t_SpecularPower;\t\t\t\t// v[ 0, 1]\nuniform float\t\t_Reflectivity;\t\t\t\t// v[ 5, 15]\nuniform float\t\t_Diffuse;\t\t\t\t\t// v[ 0, 1]\nuniform float\t\t_Ambient;\t\t\t\t\t// v[ 0, 1]\n\nuniform fixed4\t\t_UnderlayColor;\t\t\t\t// RGBA : Color + Opacity\nuniform float\t\t_UnderlayOffsetX;\t\t\t// v[-1, 1]\nuniform float\t\t_UnderlayOffsetY;\t\t\t// v[-1, 1]\nuniform float\t\t_UnderlayDilate;\t\t\t// v[-1, 1]\nuniform float\t\t_UnderlaySoftness;\t\t\t// v[ 0, 1]\n\nuniform fixed4 \t\t_GlowColor;\t\t\t\t\t// RGBA : Color + Intesity\nuniform float \t\t_GlowOffset;\t\t\t\t// v[-1, 1]\nuniform float \t\t_GlowOuter;\t\t\t\t\t// v[ 0, 1]\nuniform float \t\t_GlowInner;\t\t\t\t\t// v[ 0, 1]\nuniform float \t\t_GlowPower;\t\t\t\t\t// v[ 1, 1/(1+4*4)]\n\n// API Editable properties\nuniform float \t\t_ShaderFlags;\nuniform float\t\t_WeightNormal;\nuniform float\t\t_WeightBold;\n\nuniform float\t\t_ScaleRatioA;\nuniform float\t\t_ScaleRatioB;\nuniform float\t\t_ScaleRatioC;\n\nuniform float\t\t_VertexOffsetX;\nuniform float\t\t_VertexOffsetY;\n\n//uniform float\t\t_UseClipRect;\nuniform float\t\t_MaskID;\nuniform sampler2D\t_MaskTex;\nuniform float4\t\t_MaskCoord;\nuniform float4\t\t_ClipRect;\t// bottom left(x,y) : top right(z,w)\n//uniform float\t\t_MaskWipeControl;\n//uniform float\t\t_MaskEdgeSoftness;\n//uniform fixed4\t\t_MaskEdgeColor;\n//uniform bool\t\t_MaskInverse;\n\nuniform float\t\t_MaskSoftnessX;\nuniform float\t\t_MaskSoftnessY;\n\n// Font Atlas properties\nuniform sampler2D\t_MainTex;\nuniform float\t\t_TextureWidth;\nuniform float\t\t_TextureHeight;\nuniform float \t\t_GradientScale;\nuniform float\t\t_ScaleX;\nuniform float\t\t_ScaleY;\nuniform float\t\t_PerspectiveFilter;\nuniform float\t\t_Sharpness;\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Shaders/TMP_Properties.cginc.meta",
    "content": "fileFormatVersion: 2\nguid: 3c6c403084eacec478a1129ce20061ea\nShaderImporter:\n  externalObjects: {}\n  defaultTextures: []\n  nonModifiableTextures: []\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Shaders/TMP_SDF Internal SSD.shader",
    "content": "// Simplified SDF shader:\n// - No Shading Option (bevel / bump / env map)\n// - No Glow Option\n// - Softness is applied on both side of the outline\n\nShader \"Hidden/TextMeshPro/Internal/Distance Field SSD\" {\n\nProperties {\n\t_FaceColor\t\t\t(\"Face Color\", Color) = (1,1,1,1)\n\t_FaceDilate\t\t\t(\"Face Dilate\", Range(-1,1)) = 0\n\n\t_OutlineSoftness\t(\"Outline Softness\", Range(0,1)) = 0.02\n\n\t_WeightNormal\t\t(\"Weight Normal\", float) = 0\n\t_WeightBold\t\t\t(\"Weight Bold\", float) = .5\n\n\t_MainTex\t\t\t(\"Font Atlas\", 2D) = \"white\" {}\n\t_TextureWidth\t\t(\"Texture Width\", float) = 512\n\t_TextureHeight\t\t(\"Texture Height\", float) = 512\n\t_GradientScale\t\t(\"Gradient Scale\", float) = 5\n\t_ScaleX\t\t\t\t(\"Scale X\", float) = 1\n\t_ScaleY\t\t\t\t(\"Scale Y\", float) = 1\n\t_Sharpness\t\t\t(\"Sharpness\", Range(-1,1)) = 0\n\n\t_VertexOffsetX\t\t(\"Vertex OffsetX\", float) = 0\n\t_VertexOffsetY\t\t(\"Vertex OffsetY\", float) = 0\n\t\n\t_ColorMask\t\t\t(\"Color Mask\", Float) = 15\n}\n\nSubShader {\n\tTags \n\t{\n\t\t\"ForceSupported\" = \"True\"\n\t}\n\n\tLighting Off\n\tBlend One OneMinusSrcAlpha\n\tCull Off\n\tZWrite Off\n\tZTest Always\n\n\tPass {\n\t\tCGPROGRAM\n\t\t#pragma vertex VertShader\n\t\t#pragma fragment PixShader\n\n\t\t#include \"UnityCG.cginc\"\n\t\t#include \"TMP_Properties.cginc\"\n\n\t\tsampler2D _GUIClipTexture;\n\t\tuniform float4x4 unity_GUIClipTextureMatrix;\n\n\t\tstruct vertex_t {\n\t\t\tfloat4\tvertex\t\t\t: POSITION;\n\t\t\tfloat3\tnormal\t\t\t: NORMAL;\n\t\t\tfixed4\tcolor\t\t\t: COLOR;\n\t\t\tfloat2\ttexcoord0\t\t: TEXCOORD0;\n\t\t\tfloat2\ttexcoord1\t\t: TEXCOORD1;\n\t\t};\n\n\t\tstruct pixel_t {\n\t\t\tfloat4\tvertex\t\t\t: SV_POSITION;\n\t\t\tfixed4\tfaceColor\t\t: COLOR;\n\t\t\tfloat2\ttexcoord0\t\t: TEXCOORD0;\n\t\t\tfloat2\tclipUV\t\t\t: TEXCOORD1;\n\t\t};\n\n\n\t\tpixel_t VertShader(vertex_t input)\n\t\t{\n\t\t\t// Does not handle simulated bold correctly.\n\t\t\t\n\t\t\tfloat4 vert = input.vertex;\n\t\t\tvert.x += _VertexOffsetX;\n\t\t\tvert.y += _VertexOffsetY;\n\t\t\tfloat4 vPosition = UnityObjectToClipPos(vert);\n\n\t\t\tfloat opacity = input.color.a;\n\n\t\t\tfixed4 faceColor = fixed4(input.color.rgb, opacity) * _FaceColor;\n\t\t\tfaceColor.rgb *= faceColor.a;\n\n\t\t\t// Generate UV for the Clip Texture\n\t\t\tfloat3 eyePos = UnityObjectToViewPos(input.vertex);\n\t\t\tfloat2 clipUV = mul(unity_GUIClipTextureMatrix, float4(eyePos.xy, 0, 1.0));\n\n\t\t\t// Structure for pixel shader\n\t\t\tpixel_t output = {\n\t\t\t\tvPosition,\n\t\t\t\tfaceColor,\n\t\t\t\tfloat2(input.texcoord0.x, input.texcoord0.y),\n\t\t\t\tclipUV,\n\t\t\t};\n\n\t\t\treturn output;\n\t\t}\n\n\t\thalf transition(half2 range, half distance)\n        {\n            return smoothstep(range.x, range.y, distance);\n        }\n\n\t\t// PIXEL SHADER\n\t\tfixed4 PixShader(pixel_t input) : SV_Target\n\t\t{\n\t\t\thalf distanceSample = tex2D(_MainTex, input.texcoord0).a;\n            half smoothing = fwidth(distanceSample) * (1 - _Sharpness) + _OutlineSoftness;\n            half contour = 0.5 - _FaceDilate * 0.5;\n            half2 edgeRange = half2(contour - smoothing, contour + smoothing);\n\n\t\t\thalf4 c = input.faceColor;\n            \n            half edgeTransition = transition(edgeRange, distanceSample);\n            c *= edgeTransition;\n\n\t\t\tc *= tex2D(_GUIClipTexture, input.clipUV).a;\n\n\t\t\treturn c;\n\t\t}\n\t\tENDCG\n\t}\n}\n\nCustomEditor \"TMPro.EditorUtilities.TMP_SDFShaderGUI\"\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Shaders/TMP_SDF Internal SSD.shader.meta",
    "content": "fileFormatVersion: 2\nguid: ce4ec0f498d1b1a4f90fe94e115b6f9a\nShaderImporter:\n  externalObjects: {}\n  defaultTextures: []\n  nonModifiableTextures: []\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Shaders.meta",
    "content": "fileFormatVersion: 2\nguid: 2da27f5fe80a3a549ac7331d9f52f5f0\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/SectionHeader_Dark.psd.meta",
    "content": "fileFormatVersion: 2\nguid: fb5730e24283d0c489e5c7d0bee023d9\nTextureImporter:\n  fileIDToRecycleName: {}\n  serializedVersion: 2\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 0\n    linearTexture: 1\n    correctGamma: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: .25\n    normalMapFilter: 0\n  isReadable: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 0\n  cubemapConvolution: 0\n  cubemapConvolutionSteps: 8\n  cubemapConvolutionExponent: 1.5\n  seamlessCubemap: 0\n  textureFormat: -3\n  maxTextureSize: 32\n  textureSettings:\n    filterMode: 0\n    aniso: 1\n    mipBias: -1\n    wrapMode: 1\n  nPOTScale: 0\n  lightmap: 0\n  rGBM: 0\n  compressionQuality: 50\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: .5, y: .5}\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spritePixelsToUnits: 100\n  alphaIsTransparency: 1\n  textureType: 2\n  buildTargetSettings: []\n  spriteSheet:\n    sprites: []\n  spritePackingTag: \n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/SectionHeader_Light.psd.meta",
    "content": "fileFormatVersion: 2\nguid: e3b0f810fdea84e40ab4ba20f256f7e8\nTextureImporter:\n  fileIDToRecycleName: {}\n  serializedVersion: 2\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 0\n    linearTexture: 1\n    correctGamma: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: .25\n    normalMapFilter: 0\n  isReadable: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 0\n  cubemapConvolution: 0\n  cubemapConvolutionSteps: 8\n  cubemapConvolutionExponent: 1.5\n  seamlessCubemap: 0\n  textureFormat: -3\n  maxTextureSize: 32\n  textureSettings:\n    filterMode: 0\n    aniso: 1\n    mipBias: -1\n    wrapMode: 1\n  nPOTScale: 0\n  lightmap: 0\n  rGBM: 0\n  compressionQuality: 50\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: .5, y: .5}\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spritePixelsToUnits: 100\n  alphaIsTransparency: 1\n  textureType: 2\n  buildTargetSettings: []\n  spriteSheet:\n    sprites: []\n  spritePackingTag: \n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignBaseLine.psd.meta",
    "content": "fileFormatVersion: 2\nguid: 8bc445bb79654bf496c92d0407840a92\nTextureImporter:\n  fileIDToRecycleName: {}\n  serializedVersion: 2\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 0\n    linearTexture: 1\n    correctGamma: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: .25\n    normalMapFilter: 0\n  isReadable: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 0\n  cubemapConvolution: 0\n  cubemapConvolutionSteps: 8\n  cubemapConvolutionExponent: 1.5\n  seamlessCubemap: 0\n  textureFormat: -3\n  maxTextureSize: 32\n  textureSettings:\n    filterMode: 0\n    aniso: 1\n    mipBias: -1\n    wrapMode: 1\n  nPOTScale: 0\n  lightmap: 0\n  rGBM: 0\n  compressionQuality: 50\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: .5, y: .5}\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spritePixelsToUnits: 100\n  alphaIsTransparency: 1\n  textureType: 2\n  buildTargetSettings: []\n  spriteSheet:\n    sprites: []\n  spritePackingTag: \n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignBaseLine_Light.psd.meta",
    "content": "fileFormatVersion: 2\nguid: 18775b51e3bd42299fd30bd036ea982f\nTextureImporter:\n  fileIDToRecycleName: {}\n  serializedVersion: 2\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 0\n    linearTexture: 1\n    correctGamma: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: .25\n    normalMapFilter: 0\n  isReadable: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 0\n  cubemapConvolution: 0\n  cubemapConvolutionSteps: 8\n  cubemapConvolutionExponent: 1.5\n  seamlessCubemap: 0\n  textureFormat: -3\n  maxTextureSize: 32\n  textureSettings:\n    filterMode: 0\n    aniso: 1\n    mipBias: -1\n    wrapMode: 1\n  nPOTScale: 0\n  lightmap: 0\n  rGBM: 0\n  compressionQuality: 50\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: .5, y: .5}\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spritePixelsToUnits: 100\n  alphaIsTransparency: 1\n  textureType: 2\n  buildTargetSettings: []\n  spriteSheet:\n    sprites: []\n  spritePackingTag: \n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignBottom.psd.meta",
    "content": "fileFormatVersion: 2\nguid: ca51b19024094d1b87f3e07edb0a75fb\nTextureImporter:\n  fileIDToRecycleName: {}\n  serializedVersion: 2\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 0\n    linearTexture: 1\n    correctGamma: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: .25\n    normalMapFilter: 0\n  isReadable: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 0\n  cubemapConvolution: 0\n  cubemapConvolutionSteps: 8\n  cubemapConvolutionExponent: 1.5\n  seamlessCubemap: 0\n  textureFormat: -3\n  maxTextureSize: 32\n  textureSettings:\n    filterMode: 0\n    aniso: 1\n    mipBias: -1\n    wrapMode: 1\n  nPOTScale: 0\n  lightmap: 0\n  rGBM: 0\n  compressionQuality: 50\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: .5, y: .5}\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spritePixelsToUnits: 100\n  alphaIsTransparency: 1\n  textureType: 2\n  buildTargetSettings: []\n  spriteSheet:\n    sprites: []\n  spritePackingTag: \n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignBottom_Light.psd.meta",
    "content": "fileFormatVersion: 2\nguid: 585b70cb75dd43efbfead809c30a1731\nTextureImporter:\n  fileIDToRecycleName: {}\n  serializedVersion: 2\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 0\n    linearTexture: 1\n    correctGamma: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: .25\n    normalMapFilter: 0\n  isReadable: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 0\n  cubemapConvolution: 0\n  cubemapConvolutionSteps: 8\n  cubemapConvolutionExponent: 1.5\n  seamlessCubemap: 0\n  textureFormat: -3\n  maxTextureSize: 32\n  textureSettings:\n    filterMode: 0\n    aniso: 1\n    mipBias: -1\n    wrapMode: 1\n  nPOTScale: 0\n  lightmap: 0\n  rGBM: 0\n  compressionQuality: 50\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: .5, y: .5}\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spritePixelsToUnits: 100\n  alphaIsTransparency: 1\n  textureType: 2\n  buildTargetSettings: []\n  spriteSheet:\n    sprites: []\n  spritePackingTag: \n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCapLine.psd.meta",
    "content": "fileFormatVersion: 2\nguid: 0d9a36012a224080966c7b55896aa0f9\ntimeCreated: 1467964791\nlicenseType: Pro\nTextureImporter:\n  fileIDToRecycleName: {}\n  serializedVersion: 2\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 0\n    linearTexture: 1\n    correctGamma: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: 0.25\n    normalMapFilter: 0\n  isReadable: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 0\n  cubemapConvolution: 0\n  cubemapConvolutionSteps: 7\n  cubemapConvolutionExponent: 1.5\n  seamlessCubemap: 0\n  textureFormat: -3\n  maxTextureSize: 32\n  textureSettings:\n    filterMode: 0\n    aniso: 1\n    mipBias: -1\n    wrapMode: 1\n  nPOTScale: 0\n  lightmap: 0\n  rGBM: 0\n  compressionQuality: 50\n  allowsAlphaSplitting: 0\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: 0.5, y: 0.5}\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spritePixelsToUnits: 100\n  alphaIsTransparency: 1\n  textureType: 2\n  buildTargetSettings: []\n  spriteSheet:\n    serializedVersion: 2\n    sprites: []\n    outline: []\n  spritePackingTag: \n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCapLine_Light.psd.meta",
    "content": "fileFormatVersion: 2\nguid: 49679f302ac6408697f6b9314a38985c\ntimeCreated: 1467964413\nlicenseType: Pro\nTextureImporter:\n  fileIDToRecycleName: {}\n  serializedVersion: 2\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 0\n    linearTexture: 1\n    correctGamma: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: 0.25\n    normalMapFilter: 0\n  isReadable: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 0\n  cubemapConvolution: 0\n  cubemapConvolutionSteps: 7\n  cubemapConvolutionExponent: 1.5\n  seamlessCubemap: 0\n  textureFormat: -3\n  maxTextureSize: 32\n  textureSettings:\n    filterMode: 0\n    aniso: 1\n    mipBias: -1\n    wrapMode: 1\n  nPOTScale: 0\n  lightmap: 0\n  rGBM: 0\n  compressionQuality: 50\n  allowsAlphaSplitting: 0\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: 0.5, y: 0.5}\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spritePixelsToUnits: 100\n  alphaIsTransparency: 1\n  textureType: 2\n  buildTargetSettings: []\n  spriteSheet:\n    serializedVersion: 2\n    sprites: []\n    outline: []\n  spritePackingTag: \n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCenter.psd.meta",
    "content": "fileFormatVersion: 2\nguid: 81ed8c76d2bc4a4c95d092c98af4e58f\nTextureImporter:\n  fileIDToRecycleName: {}\n  serializedVersion: 2\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 0\n    linearTexture: 1\n    correctGamma: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: .25\n    normalMapFilter: 0\n  isReadable: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 0\n  cubemapConvolution: 0\n  cubemapConvolutionSteps: 8\n  cubemapConvolutionExponent: 1.5\n  seamlessCubemap: 0\n  textureFormat: -3\n  maxTextureSize: 32\n  textureSettings:\n    filterMode: 0\n    aniso: 1\n    mipBias: -1\n    wrapMode: 1\n  nPOTScale: 0\n  lightmap: 0\n  rGBM: 0\n  compressionQuality: 50\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: .5, y: .5}\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spritePixelsToUnits: 100\n  alphaIsTransparency: 1\n  textureType: 2\n  buildTargetSettings: []\n  spriteSheet:\n    sprites: []\n  spritePackingTag: \n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCenterGeo.psd.meta",
    "content": "fileFormatVersion: 2\nguid: c76700ea0062413d9f69409b4e9e151b\ntimeCreated: 1484171296\nlicenseType: Pro\nTextureImporter:\n  fileIDToRecycleName: {}\n  serializedVersion: 2\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 0\n    linearTexture: 1\n    correctGamma: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: .25\n    normalMapFilter: 0\n  isReadable: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 0\n  cubemapConvolution: 0\n  cubemapConvolutionSteps: 8\n  cubemapConvolutionExponent: 1.5\n  seamlessCubemap: 0\n  textureFormat: -3\n  maxTextureSize: 32\n  textureSettings:\n    filterMode: 0\n    aniso: 1\n    mipBias: -1\n    wrapMode: 1\n  nPOTScale: 0\n  lightmap: 0\n  rGBM: 0\n  compressionQuality: 50\n  allowsAlphaSplitting: 0\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: .5, y: .5}\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spritePixelsToUnits: 100\n  alphaIsTransparency: 1\n  textureType: 2\n  buildTargetSettings: []\n  spriteSheet:\n    sprites: []\n  spritePackingTag: \n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCenterGeo_Light.psd.meta",
    "content": "fileFormatVersion: 2\nguid: 35ff0937876540d3bd4b6a941df62a92\ntimeCreated: 1484171296\nlicenseType: Pro\nTextureImporter:\n  fileIDToRecycleName: {}\n  serializedVersion: 2\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 0\n    linearTexture: 1\n    correctGamma: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: .25\n    normalMapFilter: 0\n  isReadable: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 0\n  cubemapConvolution: 0\n  cubemapConvolutionSteps: 8\n  cubemapConvolutionExponent: 1.5\n  seamlessCubemap: 0\n  textureFormat: -3\n  maxTextureSize: 32\n  textureSettings:\n    filterMode: 0\n    aniso: 1\n    mipBias: -1\n    wrapMode: 1\n  nPOTScale: 0\n  lightmap: 0\n  rGBM: 0\n  compressionQuality: 50\n  allowsAlphaSplitting: 0\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: .5, y: .5}\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spritePixelsToUnits: 100\n  alphaIsTransparency: 1\n  textureType: 2\n  buildTargetSettings: []\n  spriteSheet:\n    sprites: []\n  spritePackingTag: \n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignCenter_Light.psd.meta",
    "content": "fileFormatVersion: 2\nguid: 6ace62d30f494c948b71d5594afce11d\nTextureImporter:\n  fileIDToRecycleName: {}\n  serializedVersion: 2\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 0\n    linearTexture: 1\n    correctGamma: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: .25\n    normalMapFilter: 0\n  isReadable: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 0\n  cubemapConvolution: 0\n  cubemapConvolutionSteps: 8\n  cubemapConvolutionExponent: 1.5\n  seamlessCubemap: 0\n  textureFormat: -3\n  maxTextureSize: 32\n  textureSettings:\n    filterMode: 0\n    aniso: 1\n    mipBias: -1\n    wrapMode: 1\n  nPOTScale: 0\n  lightmap: 0\n  rGBM: 0\n  compressionQuality: 50\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: .5, y: .5}\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spritePixelsToUnits: 100\n  alphaIsTransparency: 1\n  textureType: 2\n  buildTargetSettings: []\n  spriteSheet:\n    sprites: []\n  spritePackingTag: \n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignFlush.psd.meta",
    "content": "fileFormatVersion: 2\nguid: 691475c57a824010be0c6f474caeb7e1\nTextureImporter:\n  fileIDToRecycleName: {}\n  serializedVersion: 2\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 0\n    linearTexture: 1\n    correctGamma: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: .25\n    normalMapFilter: 0\n  isReadable: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 0\n  cubemapConvolution: 0\n  cubemapConvolutionSteps: 8\n  cubemapConvolutionExponent: 1.5\n  seamlessCubemap: 0\n  textureFormat: -3\n  maxTextureSize: 32\n  textureSettings:\n    filterMode: 0\n    aniso: 1\n    mipBias: -1\n    wrapMode: 1\n  nPOTScale: 0\n  lightmap: 0\n  rGBM: 0\n  compressionQuality: 50\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: .5, y: .5}\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spritePixelsToUnits: 100\n  alphaIsTransparency: 1\n  textureType: 2\n  buildTargetSettings: []\n  spriteSheet:\n    sprites: []\n  spritePackingTag: \n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignFlush_Light.psd.meta",
    "content": "fileFormatVersion: 2\nguid: 64b9fad609434c489c32b1cdf2004a1c\nTextureImporter:\n  fileIDToRecycleName: {}\n  serializedVersion: 2\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 0\n    linearTexture: 1\n    correctGamma: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: .25\n    normalMapFilter: 0\n  isReadable: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 0\n  cubemapConvolution: 0\n  cubemapConvolutionSteps: 8\n  cubemapConvolutionExponent: 1.5\n  seamlessCubemap: 0\n  textureFormat: -3\n  maxTextureSize: 32\n  textureSettings:\n    filterMode: 0\n    aniso: 1\n    mipBias: -1\n    wrapMode: 1\n  nPOTScale: 0\n  lightmap: 0\n  rGBM: 0\n  compressionQuality: 50\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: .5, y: .5}\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spritePixelsToUnits: 100\n  alphaIsTransparency: 1\n  textureType: 2\n  buildTargetSettings: []\n  spriteSheet:\n    sprites: []\n  spritePackingTag: \n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignJustified.psd.meta",
    "content": "fileFormatVersion: 2\nguid: 92027f7f8cfc4feaa477da0dc38d3d46\ntimeCreated: 1472535271\nlicenseType: Pro\nTextureImporter:\n  fileIDToRecycleName: {}\n  serializedVersion: 2\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 0\n    linearTexture: 1\n    correctGamma: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: 0.25\n    normalMapFilter: 0\n  isReadable: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 0\n  cubemapConvolution: 0\n  cubemapConvolutionSteps: 7\n  cubemapConvolutionExponent: 1.5\n  seamlessCubemap: 0\n  textureFormat: -3\n  maxTextureSize: 32\n  textureSettings:\n    filterMode: 0\n    aniso: 1\n    mipBias: -1\n    wrapMode: 1\n  nPOTScale: 0\n  lightmap: 0\n  rGBM: 0\n  compressionQuality: 50\n  allowsAlphaSplitting: 0\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: 0.5, y: 0.5}\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spritePixelsToUnits: 100\n  alphaIsTransparency: 1\n  spriteTessellationDetail: -1\n  textureType: 2\n  buildTargetSettings: []\n  spriteSheet:\n    serializedVersion: 2\n    sprites: []\n    outline: []\n  spritePackingTag: \n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignJustified_Light.psd.meta",
    "content": "fileFormatVersion: 2\nguid: fa6bd40a216346b783a4cce741d277a5\ntimeCreated: 1472535778\nlicenseType: Pro\nTextureImporter:\n  fileIDToRecycleName: {}\n  serializedVersion: 2\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 0\n    linearTexture: 1\n    correctGamma: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: 0.25\n    normalMapFilter: 0\n  isReadable: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 0\n  cubemapConvolution: 0\n  cubemapConvolutionSteps: 7\n  cubemapConvolutionExponent: 1.5\n  seamlessCubemap: 0\n  textureFormat: -3\n  maxTextureSize: 32\n  textureSettings:\n    filterMode: 0\n    aniso: 1\n    mipBias: -1\n    wrapMode: 1\n  nPOTScale: 0\n  lightmap: 0\n  rGBM: 0\n  compressionQuality: 50\n  allowsAlphaSplitting: 0\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: 0.5, y: 0.5}\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spritePixelsToUnits: 100\n  alphaIsTransparency: 1\n  spriteTessellationDetail: -1\n  textureType: 2\n  buildTargetSettings: []\n  spriteSheet:\n    serializedVersion: 2\n    sprites: []\n    outline: []\n  spritePackingTag: \n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignLeft.psd.meta",
    "content": "fileFormatVersion: 2\nguid: 9288066c33474b94b6ee5465f4df1cc0\nTextureImporter:\n  fileIDToRecycleName: {}\n  serializedVersion: 2\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 0\n    linearTexture: 1\n    correctGamma: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: .25\n    normalMapFilter: 0\n  isReadable: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 0\n  cubemapConvolution: 0\n  cubemapConvolutionSteps: 8\n  cubemapConvolutionExponent: 1.5\n  seamlessCubemap: 0\n  textureFormat: -3\n  maxTextureSize: 32\n  textureSettings:\n    filterMode: 0\n    aniso: 1\n    mipBias: -1\n    wrapMode: 1\n  nPOTScale: 0\n  lightmap: 0\n  rGBM: 0\n  compressionQuality: 50\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: .5, y: .5}\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spritePixelsToUnits: 100\n  alphaIsTransparency: 1\n  textureType: 2\n  buildTargetSettings: []\n  spriteSheet:\n    sprites: []\n  spritePackingTag: \n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignLeft_Light.psd.meta",
    "content": "fileFormatVersion: 2\nguid: 12736c98af174f91827a26b66d2b01b9\nTextureImporter:\n  fileIDToRecycleName: {}\n  serializedVersion: 2\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 0\n    linearTexture: 1\n    correctGamma: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: .25\n    normalMapFilter: 0\n  isReadable: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 0\n  cubemapConvolution: 0\n  cubemapConvolutionSteps: 8\n  cubemapConvolutionExponent: 1.5\n  seamlessCubemap: 0\n  textureFormat: -3\n  maxTextureSize: 32\n  textureSettings:\n    filterMode: 0\n    aniso: 1\n    mipBias: -1\n    wrapMode: 1\n  nPOTScale: 0\n  lightmap: 0\n  rGBM: 0\n  compressionQuality: 50\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: .5, y: .5}\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spritePixelsToUnits: 100\n  alphaIsTransparency: 1\n  textureType: 2\n  buildTargetSettings: []\n  spriteSheet:\n    sprites: []\n  spritePackingTag: \n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignMidLine.psd.meta",
    "content": "fileFormatVersion: 2\nguid: c2f7f6a88b4c4f20a53deb72f3d9144c\ntimeCreated: 1426240649\nlicenseType: Store\nTextureImporter:\n  fileIDToRecycleName: {}\n  serializedVersion: 2\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 0\n    linearTexture: 1\n    correctGamma: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: 0.25\n    normalMapFilter: 0\n  isReadable: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 0\n  cubemapConvolution: 0\n  cubemapConvolutionSteps: 8\n  cubemapConvolutionExponent: 1.5\n  seamlessCubemap: 0\n  textureFormat: -3\n  maxTextureSize: 32\n  textureSettings:\n    filterMode: 0\n    aniso: 1\n    mipBias: -1\n    wrapMode: 1\n  nPOTScale: 0\n  lightmap: 0\n  rGBM: 0\n  compressionQuality: 50\n  allowsAlphaSplitting: 0\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: 0.5, y: 0.5}\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spritePixelsToUnits: 100\n  alphaIsTransparency: 1\n  textureType: 2\n  buildTargetSettings: []\n  spriteSheet:\n    serializedVersion: 2\n    sprites: []\n    outline: []\n  spritePackingTag: \n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignMiddle.psd.meta",
    "content": "fileFormatVersion: 2\nguid: 41b96614b2e6494ba995ddcd252d11ae\nTextureImporter:\n  fileIDToRecycleName: {}\n  serializedVersion: 2\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 0\n    linearTexture: 1\n    correctGamma: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: .25\n    normalMapFilter: 0\n  isReadable: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 0\n  cubemapConvolution: 0\n  cubemapConvolutionSteps: 8\n  cubemapConvolutionExponent: 1.5\n  seamlessCubemap: 0\n  textureFormat: -3\n  maxTextureSize: 32\n  textureSettings:\n    filterMode: 0\n    aniso: 1\n    mipBias: -1\n    wrapMode: 1\n  nPOTScale: 0\n  lightmap: 0\n  rGBM: 0\n  compressionQuality: 50\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: .5, y: .5}\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spritePixelsToUnits: 100\n  alphaIsTransparency: 1\n  textureType: 2\n  buildTargetSettings: []\n  spriteSheet:\n    sprites: []\n  spritePackingTag: \n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignMiddle_Light.psd.meta",
    "content": "fileFormatVersion: 2\nguid: 066619c9c9c84f89acb1b48c11a7efe2\nTextureImporter:\n  fileIDToRecycleName: {}\n  serializedVersion: 2\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 0\n    linearTexture: 1\n    correctGamma: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: .25\n    normalMapFilter: 0\n  isReadable: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 0\n  cubemapConvolution: 0\n  cubemapConvolutionSteps: 8\n  cubemapConvolutionExponent: 1.5\n  seamlessCubemap: 0\n  textureFormat: -3\n  maxTextureSize: 32\n  textureSettings:\n    filterMode: 0\n    aniso: 1\n    mipBias: -1\n    wrapMode: 1\n  nPOTScale: 0\n  lightmap: 0\n  rGBM: 0\n  compressionQuality: 50\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: .5, y: .5}\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spritePixelsToUnits: 100\n  alphaIsTransparency: 1\n  textureType: 2\n  buildTargetSettings: []\n  spriteSheet:\n    sprites: []\n  spritePackingTag: \n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignMidline_Light.psd.meta",
    "content": "fileFormatVersion: 2\nguid: bb42b2d967d6427983c901a4ffc8ecd9\ntimeCreated: 1426240650\nlicenseType: Store\nTextureImporter:\n  fileIDToRecycleName: {}\n  serializedVersion: 2\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 0\n    linearTexture: 1\n    correctGamma: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: 0.25\n    normalMapFilter: 0\n  isReadable: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 0\n  cubemapConvolution: 0\n  cubemapConvolutionSteps: 8\n  cubemapConvolutionExponent: 1.5\n  seamlessCubemap: 0\n  textureFormat: -3\n  maxTextureSize: 32\n  textureSettings:\n    filterMode: 0\n    aniso: 1\n    mipBias: -1\n    wrapMode: 1\n  nPOTScale: 0\n  lightmap: 0\n  rGBM: 0\n  compressionQuality: 50\n  allowsAlphaSplitting: 0\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: 0.5, y: 0.5}\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spritePixelsToUnits: 100\n  alphaIsTransparency: 1\n  textureType: 2\n  buildTargetSettings: []\n  spriteSheet:\n    serializedVersion: 2\n    sprites: []\n    outline: []\n  spritePackingTag: \n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignRight.psd.meta",
    "content": "fileFormatVersion: 2\nguid: 342a0f8aca7f4f0691338912faec0494\nTextureImporter:\n  fileIDToRecycleName: {}\n  serializedVersion: 2\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 0\n    linearTexture: 1\n    correctGamma: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: .25\n    normalMapFilter: 0\n  isReadable: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 0\n  cubemapConvolution: 0\n  cubemapConvolutionSteps: 8\n  cubemapConvolutionExponent: 1.5\n  seamlessCubemap: 0\n  textureFormat: -3\n  maxTextureSize: 32\n  textureSettings:\n    filterMode: 0\n    aniso: 1\n    mipBias: -1\n    wrapMode: 1\n  nPOTScale: 0\n  lightmap: 0\n  rGBM: 0\n  compressionQuality: 50\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: .5, y: .5}\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spritePixelsToUnits: 100\n  alphaIsTransparency: 1\n  textureType: 2\n  buildTargetSettings: []\n  spriteSheet:\n    sprites: []\n  spritePackingTag: \n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignRight_Light.psd.meta",
    "content": "fileFormatVersion: 2\nguid: e05ace3bd15740cda0bad60d89092a5b\nTextureImporter:\n  fileIDToRecycleName: {}\n  serializedVersion: 2\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 0\n    linearTexture: 1\n    correctGamma: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: .25\n    normalMapFilter: 0\n  isReadable: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 0\n  cubemapConvolution: 0\n  cubemapConvolutionSteps: 8\n  cubemapConvolutionExponent: 1.5\n  seamlessCubemap: 0\n  textureFormat: -3\n  maxTextureSize: 32\n  textureSettings:\n    filterMode: 0\n    aniso: 1\n    mipBias: -1\n    wrapMode: 1\n  nPOTScale: 0\n  lightmap: 0\n  rGBM: 0\n  compressionQuality: 50\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: .5, y: .5}\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spritePixelsToUnits: 100\n  alphaIsTransparency: 1\n  textureType: 2\n  buildTargetSettings: []\n  spriteSheet:\n    sprites: []\n  spritePackingTag: \n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignTop.psd.meta",
    "content": "fileFormatVersion: 2\nguid: 48d034c499ee4697af9dd6e327110249\nTextureImporter:\n  fileIDToRecycleName: {}\n  serializedVersion: 2\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 0\n    linearTexture: 1\n    correctGamma: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: .25\n    normalMapFilter: 0\n  isReadable: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 0\n  cubemapConvolution: 0\n  cubemapConvolutionSteps: 8\n  cubemapConvolutionExponent: 1.5\n  seamlessCubemap: 0\n  textureFormat: -3\n  maxTextureSize: 32\n  textureSettings:\n    filterMode: 0\n    aniso: 1\n    mipBias: -1\n    wrapMode: 1\n  nPOTScale: 0\n  lightmap: 0\n  rGBM: 0\n  compressionQuality: 50\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: .5, y: .5}\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spritePixelsToUnits: 100\n  alphaIsTransparency: 1\n  textureType: 2\n  buildTargetSettings: []\n  spriteSheet:\n    sprites: []\n  spritePackingTag: \n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures/btn_AlignTop_Light.psd.meta",
    "content": "fileFormatVersion: 2\nguid: ed041e68439749a69d0efa0e3d896c2e\nTextureImporter:\n  fileIDToRecycleName: {}\n  serializedVersion: 2\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 0\n    linearTexture: 1\n    correctGamma: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: .25\n    normalMapFilter: 0\n  isReadable: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 0\n  cubemapConvolution: 0\n  cubemapConvolutionSteps: 8\n  cubemapConvolutionExponent: 1.5\n  seamlessCubemap: 0\n  textureFormat: -3\n  maxTextureSize: 32\n  textureSettings:\n    filterMode: 0\n    aniso: 1\n    mipBias: -1\n    wrapMode: 1\n  nPOTScale: 0\n  lightmap: 0\n  rGBM: 0\n  compressionQuality: 50\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: .5, y: .5}\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spritePixelsToUnits: 100\n  alphaIsTransparency: 1\n  textureType: 2\n  buildTargetSettings: []\n  spriteSheet:\n    sprites: []\n  spritePackingTag: \n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources/Textures.meta",
    "content": "fileFormatVersion: 2\nguid: f8e6a2d47aba4c6c9b3c5a72d9f48da5\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Editor Resources.meta",
    "content": "fileFormatVersion: 2\nguid: d1a0a27327b54c3bac52a08929c33f81\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/LICENSE.md",
    "content": "TextMesh Pro copyright © 2014-2019 Unity Technologies ApS\n\nLicensed under the Unity Companion License for Unity-dependent projects--see [Unity Companion License](http://www.unity3d.com/legal/licenses/Unity_Companion_License). \n\nUnless expressly provided otherwise, the Software under this license is made available strictly on an “AS IS” BASIS WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED. Please review the license for details on these and other terms and conditions."
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/LICENSE.md.meta",
    "content": "fileFormatVersion: 2\nguid: 0d2d0f36e67d4518a07df76235e91f9a\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Package Resources/TMP Essential Resources.unitypackage.meta",
    "content": "fileFormatVersion: 2\nguid: ce4ff17ca867d2b48b5c8a4181611901\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Package Resources/TMP Examples & Extras.unitypackage.meta",
    "content": "fileFormatVersion: 2\nguid: bc00e25696e4132499f56528d3fed2e3\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Package Resources.meta",
    "content": "fileFormatVersion: 2\nguid: 5ec95f4d5b2d1f14e9ff8682562553f9\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/PackageConversionData.json",
    "content": "{\n    \"assetRecords\": [\n        {\n            \"referencedResource\": \"Blue to Purple - Vertical.asset\",\n            \"target\": \"guid: 1e643bbd7e13d46418da3774e72bef60\",\n            \"replacement\": \"guid: 479a66fa4b094512a62b0a8e553ad95a\"\n        },\n        {\n            \"referencedResource\": \"Dark to Light Green - Vertical.asset\",\n            \"target\": \"guid: 90c9133b254e2184b8084dea4f392337\",\n            \"replacement\": \"guid: 4c86a3366cd840348ebe8dc438570ee4\"\n        },\n        {\n            \"referencedResource\": \"Light to Dark Green - Vertical.asset\",\n            \"target\": \"guid: 33c745f0979f3984182a138bcc6e57ec\",\n            \"replacement\": \"guid: 5cf8ae092ca54931b443bec5148f3c59\"\n        },\n        {\n            \"referencedResource\": \"Yellow to Orange - Vertical.asset\",\n            \"target\": \"guid: e002cb2a36d9e4a439a062867fa24e1e\",\n            \"replacement\": \"guid: 69a525efa7e6472eab268f6ea605f06e\"\n        },\n        {\n            \"referencedResource\": \"Crate - Surface Shader Scene.mat\",\n            \"target\": \"guid: e177c46c2a091564d88df2c2ca9dcf97\",\n            \"replacement\": \"guid: e6b9b44320f4448d9d5e0ee634259966\"\n        },\n        {\n            \"referencedResource\": \"Ground - Logo Scene.mat\",\n            \"target\": \"guid: 504ae362e57fc464b847f1e9fd0e4035\",\n            \"replacement\": \"guid: c719e38f25a9480abd2480ab621a2949\"\n        },\n        {\n            \"referencedResource\": \"Ground - Surface Shader Scene.mat\",\n            \"target\": \"guid: 9ed9aa864ec2d7f4dad266b9534c6d85\",\n            \"replacement\": \"guid: aadd5a709a48466c887296bb5b1b8110\"\n        },\n        {\n            \"referencedResource\": \"Small Crate_diffuse.mat\",\n            \"target\": \"guid: 92f161029a6d3c54a92d9d283352a135\",\n            \"replacement\": \"guid: 22262639920f43d6be32430e4e58350d\"\n        },\n        {\n            \"referencedResource\": \"Text Popup.prefab\",\n            \"target\": \"guid: c879e892866c8db4f8930b25672233ac\",\n            \"replacement\": \"guid: b06f0e6c1dfa4356ac918da1bb32c603\"\n        },\n        {\n            \"referencedResource\": \"TextMeshPro - Prefab 1.prefab\",\n            \"target\": \"guid: a6a60659abb4d9d4b934feebd3dcc952\",\n            \"replacement\": \"guid: a6e39ced0ea046bcb636c3f0b2e2a745\"\n        },\n        {\n            \"referencedResource\": \"TextMeshPro - Prefab 2.prefab\",\n            \"target\": \"guid: 1b190e3e0ab4c8e4881656b9160c59c2\",\n            \"replacement\": \"guid: fdad9d952ae84cafb74c63f2e694d042\"\n        },\n        {\n            \"referencedResource\": \"Anton SDF.asset\",\n            \"target\": \"guid: f76ef802b8b940c46a31f9027f2b0158\",\n            \"replacement\": \"guid: 8a89fa14b10d46a99122fd4f73fca9a2\"\n        },\n        {\n            \"referencedResource\": \"Anton SDF - Drop Shadow.mat\",\n            \"target\": \"guid: 250a1a103b3b4914c9707e6a423446d6\",\n            \"replacement\": \"guid: 749b9069dc4742c5bfa5c74644049926\"\n        },\n        {\n            \"referencedResource\": \"Anton SDF - Outline.mat\",\n            \"target\": \"guid: e077dc203e948b740859c1c0ca8b9691\",\n            \"replacement\": \"guid: a00013af81304728b2be1f4309ee2433\"\n        },\n        {\n            \"referencedResource\": \"Bangers SDF.asset\",\n            \"target\": \"guid: 808aa8f1ab804104aa7d0c337a6c1481\",\n            \"replacement\": \"guid: 125cb55b44b24c4393181402bc6200e6\"\n        },\n        {\n            \"referencedResource\": \"Bangers SDF - Drop Shadow.mat\",\n            \"target\": \"guid: c26f698d4eee19e4a8b8f42cd299bab5\",\n            \"replacement\": \"guid: f2dcf029949142e28b974630369c8b4e\"\n        },\n        {\n            \"referencedResource\": \"Bangers SDF - Outline.mat\",\n            \"target\": \"guid: db7f2cfbf23d6d54ca4e74a9abd55326\",\n            \"replacement\": \"guid: f629c6e43dba4bf38cb74d8860150664\"\n        },\n        {\n            \"referencedResource\": \"Bangers SDF Glow.mat\",\n            \"target\": \"guid: 7dd7006c58d8a3148a73aa211d8c13d0\",\n            \"replacement\": \"guid: d75b8f41e959450c84ac6e967084d3e1\"\n        },\n        {\n            \"referencedResource\": \"Bangers SDF Logo.mat\",\n            \"target\": \"guid: 4fb51aa7001a2244395ddf6a15d37389\",\n            \"replacement\": \"guid: f4e195ac1e204eff960149d1cb34e18c\"\n        },\n        {\n            \"referencedResource\": \"Electronic Highway Sign SDF.asset\",\n            \"target\": \"guid: 163292f6f226d954593d45b079f8aae0\",\n            \"replacement\": \"guid: dc36b3fdc14f47ebb36fd484a67e268a\"\n        },\n        {\n            \"referencedResource\": \"LiberationSans SDF - Drop Shadow.mat\",\n            \"target\": \"guid: 33db60c37b63f08448ded4b385e74e38\",\n            \"replacement\": \"guid: e73a58f6e2794ae7b1b7e50b7fb811b0\"\n        },\n        {\n            \"referencedResource\": \"LiberationSans SDF - Metalic Green.mat\",\n            \"target\": \"guid: 4f9843c79516ed1468b9b5a4f32e67e3\",\n            \"replacement\": \"guid: 8b29aaa3eec7468097ff07adfcf29ac9\"\n        },\n        {\n            \"referencedResource\": \"LiberationSans SDF - Outline.mat\",\n            \"target\": \"guid: 83a1b0fe6c3dbac44b66f09c82e1d509\",\n            \"replacement\": \"guid: 79459efec17a4d00a321bdcc27bbc385\"\n        },\n        {\n            \"referencedResource\": \"LiberationSans SDF - Overlay.mat\",\n            \"target\": \"guid: 55eb086ae18c76e4bb6cc7106d0dd6e2\",\n            \"replacement\": \"guid: 9ad269c99dcf42b7aedefd83dd5a7b9d\"\n        },\n        {\n            \"referencedResource\": \"LiberationSans SDF - Soft Mask.mat\",\n            \"target\": \"guid: 74e06d99c1657fc4abd33f20685ea9ff\",\n            \"replacement\": \"guid: 42df1c7856584b6b8db9a509b6b10074\"\n        },\n        {\n            \"referencedResource\": \"Oswald Bold SDF.asset\",\n            \"target\": \"guid: 09641b029dfa78843902b548a9de7553\",\n            \"replacement\": \"guid: 0161d805a3764c089bef00bfe00793f5\"\n        },\n        {\n            \"referencedResource\": \"Roboto-Bold SDF.asset\",\n            \"target\": \"guid: d62a573c923f5cb47b8ff65261033b90\",\n            \"replacement\": \"guid: 5302535af1044152a457ed104f1f4b91\"\n        },\n        {\n            \"referencedResource\": \"Roboto-Bold SDF - Drop Shadow.mat\",\n            \"target\": \"guid: 102e7c5c5e3b1f3468518cb166967d77\",\n            \"replacement\": \"guid: b246c4190f4e46ec9352fe15a7b09ce0\"\n        },\n        {\n            \"referencedResource\": \"Roboto-Bold SDF - Surface.mat\",\n            \"target\": \"guid: e2da38ead8f8238449c54a1ef49e080f\",\n            \"replacement\": \"guid: e6b276ec991f467aa14ef1f3cc665993\"\n        },\n        {\n            \"referencedResource\": \"DropCap Numbers.asset\",\n            \"target\": \"guid: c4fd2a959a50b584b92dedfefec1ffda\",\n            \"replacement\": \"guid: 14aa93acbb234d16aaef0e8b46814db6\"\n        },\n        {\n            \"referencedResource\": \"Benchmark01.cs\",\n            \"target\": \"guid: c5fb1b5c24460f745be29cc0eb06a58c\",\n            \"replacement\": \"guid: f970ea55f9f84bf79b05dab180b8c125\"\n        },\n        {\n            \"referencedResource\": \"Benchmark01_UGUI.cs\",\n            \"target\": \"guid: 5e6abf300e36c0a4eb43969c3f2172f8\",\n            \"replacement\": \"guid: 8ef7be1c625941f7ba8ed7cc71718c0d\"\n        },\n        {\n            \"referencedResource\": \"Benchmark02.cs\",\n            \"target\": \"guid: 3467f4170568a484d8b57e2051a27363\",\n            \"replacement\": \"guid: e8538afcddc14efbb5d9e94b7ae50197\"\n        },\n        {\n            \"referencedResource\": \"Benchmark03.cs\",\n            \"target\": \"guid: e6e9d20624a23da4c8b2b6fb7608bb9a\",\n            \"replacement\": \"guid: a73109742c8d47ac822895a473300c29\"\n        },\n        {\n            \"referencedResource\": \"Benchmark04.cs\",\n            \"target\": \"guid: 481dd67bdedc3104ea2156ed49f3acd5\",\n            \"replacement\": \"guid: dc20866c0d5e413ab7559440e15333ae\"\n        },\n        {\n            \"referencedResource\": \"CameraController.cs\",\n            \"target\": \"guid: a9f0e07aefca0cc459134ff9df622278\",\n            \"replacement\": \"guid: 2d687537154440a3913a9a3c7977978c\"\n        },\n        {\n            \"referencedResource\": \"ChatController.cs\",\n            \"target\": \"guid: eba5a4db2591a5844aea5f6f3ad8548e\",\n            \"replacement\": \"guid: 53d91f98a2664f5cb9af11de72ac54ec\"\n        },\n        {\n            \"referencedResource\": \"EnvMapAnimator.cs\",\n            \"target\": \"guid: 7e69f3f28c520ce4d9ab9964b2895b1a\",\n            \"replacement\": \"guid: a4b6f99e8bc54541bbd149b014ff441c\"\n        },\n        {\n            \"referencedResource\": \"ObjectSpin.cs\",\n            \"target\": \"guid: 5e7872ff51989434dabf7807265ada3c\",\n            \"replacement\": \"guid: 4f19c7f94c794c5097d8bd11e39c750d\"\n        },\n        {\n            \"referencedResource\": \"ShaderPropAnimator.cs\",\n            \"target\": \"guid: c56cf968fb6a5b6488e709242718845d\",\n            \"replacement\": \"guid: 2787a46a4dc848c1b4b7b9307b614bfd\"\n        },\n        {\n            \"referencedResource\": \"SimpleScript.cs\",\n            \"target\": \"guid: c64808ff5137c9044a583750e5b0468a\",\n            \"replacement\": \"guid: 9eff140b25d64601aabc6ba32245d099\"\n        },\n        {\n            \"referencedResource\": \"SkewTextExample.cs\",\n            \"target\": \"guid: 48d40dfeb33b717488f55ddbf676643a\",\n            \"replacement\": \"guid: d412675cfb3441efa3bf8dcd9b7624dc\"\n        },\n        {\n            \"referencedResource\": \"TeleType.cs\",\n            \"target\": \"guid: 9094c5c777af3f14489e8947748e86e6\",\n            \"replacement\": \"guid: e32c266ee6204b21a427753cb0694c81\"\n        },\n        {\n            \"referencedResource\": \"TextConsoleSimulator.cs\",\n            \"target\": \"guid: 45757dcc8f119454dac6365e8fd15e8b\",\n            \"replacement\": \"guid: 43bcd35a1c0c40ccb6d472893fe2093f\"\n        },\n        {\n            \"referencedResource\": \"TextMeshProFloatingText.cs\",\n            \"target\": \"guid: dd0e4b969aa70504382a89d2f208ae6c\",\n            \"replacement\": \"guid: a4d4c76e63944cba8c7d00f56334b98c\"\n        },\n        {\n            \"referencedResource\": \"TextMeshSpawner.cs\",\n            \"target\": \"guid: 385939aed18e82d41894437798c30ed8\",\n            \"replacement\": \"guid: 76c11bbcfddf44e0ba17d6c2751c8d84\"\n        },\n        {\n            \"referencedResource\": \"TMP_ExampleScript_01.cs\",\n            \"target\": \"guid: 36bafabb5572c6347923b971425ab3be\",\n            \"replacement\": \"guid: 6f2c5b59b6874405865e2616e4ec276a\"\n        },\n        {\n            \"referencedResource\": \"TMP_FrameRateCounter.cs\",\n            \"target\": \"guid: c0357609254b68d4881cab18f04dd4dc\",\n            \"replacement\": \"guid: 686ec78b56aa445795335fbadafcfaa4\"\n        },\n        {\n            \"referencedResource\": \"TMP_TextEventCheck.cs\",\n            \"target\": \"guid: ba181bda76b7f6047ba2188e94bf0894\",\n            \"replacement\": \"guid: d736ce056cf444ca96e424f4d9c42b76\"\n        },\n        {\n            \"referencedResource\": \"TMP_TextEventHandler.cs\",\n            \"target\": \"guid: 48a2fdbd95acd794caf78a85a0b6926a\",\n            \"replacement\": \"guid: 1312ae25639a4bae8e25ae223209cc50\"\n        },\n        {\n            \"referencedResource\": \"TMP_TextInfoDebugTool.cs\",\n            \"target\": \"guid: 5eeee4467ee5b6a4884a1ec94812d93e\",\n            \"replacement\": \"guid: 21256c5b62f346f18640dad779911e20\"\n        },\n        {\n            \"referencedResource\": \"TMP_TextSelector_A.cs\",\n            \"target\": \"guid: 68baf2864c88f4a43a50f16709de8717\",\n            \"replacement\": \"guid: 103e0a6a1d404693b9fb1a5173e0e979\"\n        },\n        {\n            \"referencedResource\": \"TMP_TextSelector_B.cs\",\n            \"target\": \"guid: f499ff45b9a3d0840a0df48d01b2877b\",\n            \"replacement\": \"guid: a05dcd8be7ec4ccbb35c26219884aa37\"\n        },\n        {\n            \"referencedResource\": \"TMP_UiFrameRateCounter.cs\",\n            \"target\": \"guid: dc33b7a34d20d5e4e8d54b6867ce81e3\",\n            \"replacement\": \"guid: 24b0dc2d1d494adbbec1f4db26b4cf83\"\n        },\n        {\n            \"referencedResource\": \"TMPro_InstructionOverlay.cs\",\n            \"target\": \"guid: 53b866620ba77504eaf52cab7dbd95c9\",\n            \"replacement\": \"guid: c3c1afeda5e545e0b19add5373896d2e\"\n        },\n        {\n            \"referencedResource\": \"VertexColorCycler.cs\",\n            \"target\": \"guid: c8d54cdd5913d4e4bb7b655d7d16835b\",\n            \"replacement\": \"guid: 91b8ba3d52e041fab2d0e0f169855539\"\n        },\n        {\n            \"referencedResource\": \"VertexJitter.cs\",\n            \"target\": \"guid: e4769cb37968ea948a763a9a89f9e583\",\n            \"replacement\": \"guid: 2ed57967c52645d390a89dcf8f61ba73\"\n        },\n        {\n            \"referencedResource\": \"VertexShakeA.cs\",\n            \"target\": \"guid: eaa12d191e718c945ac55da73fa469db\",\n            \"replacement\": \"guid: f7cfa58e417a46ea8889989684c2522e\"\n        },\n        {\n            \"referencedResource\": \"VertexShakeB.cs\",\n            \"target\": \"guid: 32c83a5d3ba42b84aa26386eac47566b\",\n            \"replacement\": \"guid: e4e0d9ccee5f4950be8979268c9014e0\"\n        },\n        {\n            \"referencedResource\": \"VertexZoom.cs\",\n            \"target\": \"guid: 5305493000edc7d4ea4302757dc19a99\",\n            \"replacement\": \"guid: 52ec835d14bd486f900952b77698b7eb\"\n        },\n        {\n            \"referencedResource\": \"WarpTextExample.cs\",\n            \"target\": \"guid: f3eef864a10f51045a7530e2afe7c179\",\n            \"replacement\": \"guid: 790744c462254b7ba8038e6ed28b3db2\"\n        },\n        {\n            \"referencedResource\": \"DropCap Numbers.psd\",\n            \"target\": \"guid: 28b41fef228d6814f90e541deaf9f262\",\n            \"replacement\": \"guid: fd09957580ac4326916010f1f260975b\"\n        },\n        {\n            \"referencedResource\": \"Brushed Metal 3.jpg\",\n            \"target\": \"guid: c30270e41dccf9441ab56d94261bdcfa\",\n            \"replacement\": \"guid: f88677df267a41d6be1e7a6133e7d227\"\n        },\n        {\n            \"referencedResource\": \"Engraved Wall.jpg\",\n            \"target\": \"guid: 93d6f74f2ef358e41989d4152b195f88\",\n            \"replacement\": \"guid: e0f91e6569da4934a48d85bf8d3063f0\"\n        },\n        {\n            \"referencedResource\": \"Engraved Wall Normal.jpg\",\n            \"target\": \"guid: 1edd0950293e8664094053a041548c23\",\n            \"replacement\": \"guid: 20f91c93e7fb490f9496609c52ef3904\"\n        },\n        {\n            \"referencedResource\": \"Floor Cement.jpg\",\n            \"target\": \"guid: ac5a0a5373b36e049bb7f98f88dbc244\",\n            \"replacement\": \"guid: 283f897e4925411ebbaa758b4cb13fc2\"\n        },\n        {\n            \"referencedResource\": \"Floor Tiles 1 - diffuse.jpg\",\n            \"target\": \"guid: 7bbfb8818476e4641ba3e75f5225eb69\",\n            \"replacement\": \"guid: 85ac55597b97403c82fc6601a93cf241\"\n        },\n        {\n            \"referencedResource\": \"Floor Tiles 1 - normal.jpg\",\n            \"target\": \"guid: e00d5a9a0944134448432ccacf221b95\",\n            \"replacement\": \"guid: c45cd05946364f32aba704f0853a975b\"\n        },\n        {\n            \"referencedResource\": \"Fruit Jelly (B&W).jpg\",\n            \"target\": \"guid: 74d8c208a0193e14ca6916bea88a2c52\",\n            \"replacement\": \"guid: 1cdc5b506b1a4a33a53c30669ced1f51\"\n        },\n        {\n            \"referencedResource\": \"Gradient Diagonal (Color).jpg\",\n            \"target\": \"guid: 2421a4955e71725448211e6bfbc7d7fb\",\n            \"replacement\": \"guid: 2ce5c55e85304b819a1826ecbc839aa5\"\n        },\n        {\n            \"referencedResource\": \"Gradient Horizontal (Color).jpg\",\n            \"target\": \"guid: 0bbb43aff4f7811419ffceb1b16cf3d6\",\n            \"replacement\": \"guid: 6eb184de103d4b3f812b38561065192f\"\n        },\n        {\n            \"referencedResource\": \"Gradient Vertical (Color).jpg\",\n            \"target\": \"guid: 3359915af07779e4e9a966df9eed764f\",\n            \"replacement\": \"guid: 03d0538de6e24c0f819bfc9ce084dfa9\"\n        },\n        {\n            \"referencedResource\": \"Mask Zig-n-Zag.psd\",\n            \"target\": \"guid: 04eb87e72b3c1c648ba47a869ee00505\",\n            \"replacement\": \"guid: bb8dfcd263ad4eb383a33d74a720be6f\"\n        },\n        {\n            \"referencedResource\": \"Sand Normal Map.jpg\",\n            \"target\": \"guid: 89e1b1c005d29cf4598ea861deb35a80\",\n            \"replacement\": \"guid: 8b8c8a10edf94ddc8cc4cc4fcd5696a9\"\n        },\n        {\n            \"referencedResource\": \"Small Crate_diffuse.jpg\",\n            \"target\": \"guid: 64734c9bc6df32149a0c9cb0b18693e1\",\n            \"replacement\": \"guid: 602cb87b6a29443b8636370ea0751574\"\n        },\n        {\n            \"referencedResource\": \"Small Crate_normal.jpg\",\n            \"target\": \"guid: 81b50d9cb6f3104448ec54c00a80101a\",\n            \"replacement\": \"guid: 8878a782f4334ecbbcf683b3ac780966\"\n        },\n        {\n            \"referencedResource\": \"Stainless 03.png\",\n            \"target\": \"guid: 40d7f27f614cc1043a1f7e19074f461c\",\n            \"replacement\": \"guid: 83cb272f9ee046f6ab6636ca38af8db4\"\n        },\n        {\n            \"referencedResource\": \"Text Overflow - Linked Text Image 1.png\",\n            \"target\": \"guid: 1fd8c568b1fcdbe43be65c1619cf3293\",\n            \"replacement\": \"guid: 4ccf43d26c4748c792174516f4a8fcef\"\n        },\n        {\n            \"referencedResource\": \"Text Overflow - Linked Text UI Screenshot.png\",\n            \"target\": \"guid: 7983d2ec0427c114a916ae3c4769dc10\",\n            \"replacement\": \"guid: c76d18757a194d618355f05f815cb0a1\"\n        },\n        {\n            \"referencedResource\": \"Wipe Pattern - Circle.psd\",\n            \"target\": \"guid: 6f5e9497d22a7a84193ec825e2eb41ac\",\n            \"replacement\": \"guid: 10c49fcd9c64421db7c0133e61e55f97\"\n        },\n        {\n            \"referencedResource\": \"Wipe Pattern - Diagonal.psd\",\n            \"target\": \"guid: 8ee4d366b96418044aa9f94b3e2de645\",\n            \"replacement\": \"guid: ed5290d8df18488780e2996b9b882f01\"\n        },\n        {\n            \"referencedResource\": \"Wipe Pattern - Radial Double.psd\",\n            \"target\": \"guid: 3e0e22da7c9570b498205179ef58ef38\",\n            \"replacement\": \"guid: 7631f4eff8f74ed38eb3eb9db17134e1\"\n        },\n        {\n            \"referencedResource\": \"Wipe Pattern - Radial Quad.psd\",\n            \"target\": \"guid: 05ffd580f33f74644a6025ec196860af\",\n            \"replacement\": \"guid: 2b5e9ae96c5644d8bae932f8b4ca68a2\"\n        },\n        {\n            \"referencedResource\": \"LiberationSans SDF.asset\",\n            \"target\": \"guid: 715b80e429c437e40867928a4e1fc975\",\n            \"replacement\": \"guid: 8f586378b4e144a9851e7b34d9b748ee\"\n        },\n        {\n            \"referencedResource\": \"LineBreaking Following Characters.txt\",\n            \"target\": \"guid: 312ba5b9e90627940866e19549a788cf\",\n            \"replacement\": \"guid: fade42e8bc714b018fac513c043d323b\"\n        },\n        {\n            \"referencedResource\": \"LineBreaking Leading Characters.txt\",\n            \"target\": \"guid: 8d713940fcbede142ae4a33ea0062b33\",\n            \"replacement\": \"guid: d82c1b31c7e74239bff1220585707d2b\"\n        },\n        {\n            \"referencedResource\": \"TMP_Bitmap.shader\",\n            \"target\": \"guid: edfcf888cd11d9245b91d2883049a57e\",\n            \"replacement\": \"guid: 128e987d567d4e2c824d754223b3f3b0\"\n        },\n        {\n            \"referencedResource\": \"TMP_Bitmap-Mobile.shader\",\n            \"target\": \"guid: d1cf17907700cb647aa3ea423ba38f2e\",\n            \"replacement\": \"guid: 1e3b057af24249748ff873be7fafee47\"\n        },\n        {\n            \"referencedResource\": \"TMP_SDF.shader\",\n            \"target\": \"guid: dca26082f9cb439469295791d9f76fe5\",\n            \"replacement\": \"guid: 68e6db2ebdc24f95958faec2be5558d6\"\n        },\n        {\n            \"referencedResource\": \"TMP_SDF Overlay.shader\",\n            \"target\": \"guid: 4a7755d6b5b67874f89c85f56f95fe97\",\n            \"replacement\": \"guid: dd89cf5b9246416f84610a006f916af7\"\n        },\n        {\n            \"referencedResource\": \"TMP_SDF-Mobile.shader\",\n            \"target\": \"guid: cafd18099dfc0114896e0a8b277b81b6\",\n            \"replacement\": \"guid: fe393ace9b354375a9cb14cdbbc28be4\"\n        },\n        {\n            \"referencedResource\": \"TMP_SDF-Mobile Masking.shader\",\n            \"target\": \"guid: afc255f7c2be52e41973a3d10a2e632d\",\n            \"replacement\": \"guid: bc1ede39bf3643ee8e493720e4259791\"\n        },\n        {\n            \"referencedResource\": \"TMP_SDF-Mobile Overlay.shader\",\n            \"target\": \"guid: 9ecb3fe313cb5f7478141eba4a2d54ed\",\n            \"replacement\": \"guid: a02a7d8c237544f1962732b55a9aebf1\"\n        },\n        {\n            \"referencedResource\": \"TMP_SDF-Surface.shader\",\n            \"target\": \"guid: 8e6b9842dbb1a5a4887378afab854e63\",\n            \"replacement\": \"guid: f7ada0af4f174f0694ca6a487b8f543d\"\n        },\n        {\n            \"referencedResource\": \"TMP_SDF-Surface-Mobile.shader\",\n            \"target\": \"guid: 3c2ea7753c1425145a74d106ec1cd852\",\n            \"replacement\": \"guid: 85187c2149c549c5b33f0cdb02836b17\"\n        },\n        {\n            \"referencedResource\": \"TMP_Sprite.shader\",\n            \"target\": \"guid: 3a1c68c8292caf046bd21158886c5e40\",\n            \"replacement\": \"guid: cf81c85f95fe47e1a27f6ae460cf182c\"\n        },\n        {\n            \"referencedResource\": \"Default Sprite Asset.asset\",\n            \"target\": \"guid: 273ca6c80b4b5d746b5e548f532bffd8\",\n            \"replacement\": \"guid: fbef3c704dce48f08a44612d6c856c8d\"\n        },\n        {\n            \"referencedResource\": \"EmojiOne.asset\",\n            \"target\": \"guid: 9a952e2781ef26940ae089f1053ef4ef\",\n            \"replacement\": \"guid: c41005c129ba4d66911b75229fd70b45\"\n        },\n        {\n            \"referencedResource\": \"TMP Default Style Sheet.asset\",\n            \"target\": \"guid: 54d1085f9a2fdea4587fcfc7dddcd4bc\",\n            \"replacement\": \"guid: f952c082cb03451daed3ee968ac6c63e\"\n        },\n        {\n            \"referencedResource\": \"TMP Settings.asset\",\n            \"target\": \"guid: 69ed5bac41eebaa4c97e9d2a4168c54f\",\n            \"replacement\": \"guid: 3f5b5dff67a942289a9defa416b206f3\"\n        },\n        {\n            \"referencedResource\": \"TextContainer.cs\",\n            \"target\": \"guid: 3b34fc186f40e8043b977d4fa70db8c5\",\n            \"replacement\": \"guid: 32d40088a6124c578ad6b428df586e2e\"\n        },\n\t\t{\n            \"referencedResource\": \"TextContainer.cs\",\n            \"target\": \"fileID: 311004786, guid: 89f0137620f6af44b9ba852b4190e64e\",\n            \"replacement\": \"fileID: 11500000, guid: 32d40088a6124c578ad6b428df586e2e\"\n        },\n        {\n            \"referencedResource\": \"TextMeshPro.cs\",\n            \"target\": \"guid: 1a1578b9753d2604f98d608cb4239e2f\",\n            \"replacement\": \"guid: 9541d86e2fd84c1d9990edf0852d74ab\"\n        },\n\t\t{\n            \"referencedResource\": \"TextMeshPro.cs\",\n            \"target\": \"fileID: -806885394, guid: 89f0137620f6af44b9ba852b4190e64e\",\n            \"replacement\": \"fileID: 11500000, guid: 9541d86e2fd84c1d9990edf0852d74ab\"\n        },\n        {\n            \"referencedResource\": \"TextMeshProUGUI.cs\",\n            \"target\": \"guid: 496f2e385b0c62542b5c739ccfafd8da\",\n            \"replacement\": \"guid: f4688fdb7df04437aeb418b961361dc5\"\n        },\n\t\t{\n            \"referencedResource\": \"TextMeshProUGUI.cs\",\n            \"target\": \"fileID: 1453722849, guid: 89f0137620f6af44b9ba852b4190e64e\",\n            \"replacement\": \"fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5\"\n        },\n        {\n            \"referencedResource\": \"TMP_Asset.cs\",\n            \"target\": \"guid: e2c4405608b405a4680436e183e53c45\",\n            \"replacement\": \"guid: 3bda1886f58f4e0ab1139400b160c3ee\"\n        },\n\t\t{\n            \"referencedResource\": \"TMP_Asset.cs\",\n            \"target\": \"fileID: -659140726, guid: 89f0137620f6af44b9ba852b4190e64e\",\n            \"replacement\": \"fileID: 11500000, guid: 3bda1886f58f4e0ab1139400b160c3ee\"\n        },\n        {\n            \"referencedResource\": \"TMP_ColorGradient.cs\",\n            \"target\": \"guid: e90e18dd4a044ff4394833216e6bf4d2\",\n            \"replacement\": \"guid: 54d21f6ece3b46479f0c328f8c6007e0\"\n        },\n\t\t{\n            \"referencedResource\": \"TMP_ColorGradient.cs\",\n            \"target\": \"fileID: 2108210716, guid: 89f0137620f6af44b9ba852b4190e64e\",\n            \"replacement\": \"fileID: 11500000, guid: 54d21f6ece3b46479f0c328f8c6007e0\"\n        },\n        {\n            \"referencedResource\": \"TMP_Dropdown.cs\",\n            \"target\": \"guid: 44cb1d34ddab9d449a05fc3747876be1\",\n            \"replacement\": \"guid: 7b743370ac3e4ec2a1668f5455a8ef8a\"\n        },\n\t\t{\n            \"referencedResource\": \"TMP_Dropdown.cs\",\n            \"target\": \"fileID: 1148083418, guid: 89f0137620f6af44b9ba852b4190e64e\",\n            \"replacement\": \"fileID: 11500000, guid: 7b743370ac3e4ec2a1668f5455a8ef8a\"\n        },\n        {\n            \"referencedResource\": \"TMP_FontAsset.cs\",\n            \"target\": \"guid: 74dfce233ddb29b4294c3e23c1d3650d\",\n            \"replacement\": \"guid: 71c1514a6bd24e1e882cebbe1904ce04\"\n        },\n\t\t{\n            \"referencedResource\": \"TMP_FontAsset.cs\",\n            \"target\": \"fileID: -667331979, guid: 89f0137620f6af44b9ba852b4190e64e\",\n            \"replacement\": \"fileID: 11500000, guid: 71c1514a6bd24e1e882cebbe1904ce04\"\n        },\n        {\n            \"referencedResource\": \"TMP_InputField.cs\",\n            \"target\": \"guid: 7b85855a3deaa2e44ac6741a6bbc85f6\",\n            \"replacement\": \"guid: 2da0c512f12947e489f739169773d7ca\"\n        },\n\t\t{\n            \"referencedResource\": \"TMP_InputField.cs\",\n            \"target\": \"fileID: -1620774994, guid: 89f0137620f6af44b9ba852b4190e64e\",\n            \"replacement\": \"fileID: 11500000, guid: 2da0c512f12947e489f739169773d7ca\"\n        },\n        {\n            \"referencedResource\": \"TMP_Settings.cs\",\n            \"target\": \"guid: aafc3c7b9e915d64e8ec3d2c88b3a231\",\n            \"replacement\": \"guid: 2705215ac5b84b70bacc50632be6e391\"\n        },\n\t\t{\n            \"referencedResource\": \"TMP_Settings.cs\",\n            \"target\": \"fileID: -395462249, guid: 89f0137620f6af44b9ba852b4190e64e\",\n            \"replacement\": \"fileID: 11500000, guid: 2705215ac5b84b70bacc50632be6e391\"\n        },\n        {\n            \"referencedResource\": \"TMP_SpriteAsset.cs\",\n            \"target\": \"guid: 90940d439ca0ef746af0b48419b92d2e\",\n            \"replacement\": \"guid: 84a92b25f83d49b9bc132d206b370281\"\n        },\n\t\t{\n            \"referencedResource\": \"TMP_SpriteAsset.cs\",\n            \"target\": \"fileID: 2019389346, guid: 89f0137620f6af44b9ba852b4190e64e\",\n            \"replacement\": \"fileID: 11500000, guid: 84a92b25f83d49b9bc132d206b370281\"\n        },\n        {\n            \"referencedResource\": \"TMP_StyleSheet.cs\",\n            \"target\": \"guid: 13259b4ce497b194eb52a33d8eda0bdc\",\n            \"replacement\": \"guid: ab2114bdc8544297b417dfefe9f1e410\"\n        },\n\t\t{\n            \"referencedResource\": \"TMP_StyleSheet.cs\",\n            \"target\": \"fileID: -1936749209, guid: 89f0137620f6af44b9ba852b4190e64e\",\n            \"replacement\": \"fileID: 11500000, guid: ab2114bdc8544297b417dfefe9f1e410\"\n        },\n        {\n            \"referencedResource\": \"TMP_SubMesh.cs\",\n            \"target\": \"guid: bd950677b2d06c74494b1c1118584fff\",\n            \"replacement\": \"guid: 07994bfe8b0e4adb97d706de5dea48d5\"\n        },\n\t\t{\n            \"referencedResource\": \"TMP_SubMesh.cs\",\n            \"target\": \"fileID: 1330537494, guid: 89f0137620f6af44b9ba852b4190e64e\",\n            \"replacement\": \"fileID: 11500000, guid: 07994bfe8b0e4adb97d706de5dea48d5\"\n        },\n        {\n            \"referencedResource\": \"TMP_SubMeshUI.cs\",\n            \"target\": \"guid: a5378e1f14d974d419f811d6b0861f20\",\n            \"replacement\": \"guid: 058cba836c1846c3aa1c5fd2e28aea77\"\n        },\n\t\t{\n            \"referencedResource\": \"TMP_SubMeshUI.cs\",\n            \"target\": \"fileID: 1908110080, guid: 89f0137620f6af44b9ba852b4190e64e\",\n            \"replacement\": \"fileID: 11500000, guid: 058cba836c1846c3aa1c5fd2e28aea77\"\n        },\n        {\n            \"referencedResource\": \"TMP_Text.cs\",\n            \"target\": \"guid: 9ec8dc9c3fa2e5d41b939b5888d2f1e8\",\n            \"replacement\": \"guid: 5143f58107604835ab1a5efa2d8818fd\"\n        },\n\t\t{\n            \"referencedResource\": \"TMP_Text.cs\",\n            \"target\": \"fileID: -1385168320, guid: 89f0137620f6af44b9ba852b4190e64e\",\n            \"replacement\": \"fileID: 11500000, guid: 5143f58107604835ab1a5efa2d8818fd\"\n        },\n        {\n            \"referencedResource\": \"Default Sprite Asset.png\",\n            \"target\": \"guid: 5b32c2d36abe44540bed74c1f787033b\",\n            \"replacement\": \"guid: a0fc465d6cf04254a2938578735e2383\"\n        },\n        {\n            \"referencedResource\": \"EmojiOne.png\",\n            \"target\": \"guid: 6ec706981a919c3489f0b061a40054e2\",\n            \"replacement\": \"guid: dffef66376be4fa480fb02b19edbe903\"\n        }\n    ]\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/PackageConversionData.json.meta",
    "content": "fileFormatVersion: 2\nguid: 05f5bfd584002f948982a1498890f9a9\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/PackageConversionData_Assets.json",
    "content": "{\n    \"assetRecords\": [\n        {\n            \"referencedResource\": \"TMP_FontAsset.cs\",\n            \"target\": \"guid: 74dfce233ddb29b4294c3e23c1d3650d\",\n            \"replacement\": \"guid: 71c1514a6bd24e1e882cebbe1904ce04\"\n        },\n\t\t{\n            \"referencedResource\": \"TMP_FontAsset.cs\",\n            \"target\": \"fileID: -667331979, guid: 89f0137620f6af44b9ba852b4190e64e\",\n            \"replacement\": \"fileID: 11500000, guid: 71c1514a6bd24e1e882cebbe1904ce04\"\n        },\n\t\t{\n            \"referencedResource\": \"Anton SDF.asset\",\n            \"target\": \"guid: f76ef802b8b940c46a31f9027f2b0158\",\n            \"replacement\": \"guid: 8a89fa14b10d46a99122fd4f73fca9a2\"\n        },\n        {\n            \"referencedResource\": \"Bangers SDF.asset\",\n            \"target\": \"guid: 808aa8f1ab804104aa7d0c337a6c1481\",\n            \"replacement\": \"guid: 125cb55b44b24c4393181402bc6200e6\"\n        },\n        {\n            \"referencedResource\": \"Electronic Highway Sign SDF.asset\",\n            \"target\": \"guid: 163292f6f226d954593d45b079f8aae0\",\n            \"replacement\": \"guid: dc36b3fdc14f47ebb36fd484a67e268a\"\n        },\n        {\n            \"referencedResource\": \"Oswald Bold SDF.asset\",\n            \"target\": \"guid: 09641b029dfa78843902b548a9de7553\",\n            \"replacement\": \"guid: 0161d805a3764c089bef00bfe00793f5\"\n        },\n        {\n            \"referencedResource\": \"Roboto-Bold SDF.asset\",\n            \"target\": \"guid: d62a573c923f5cb47b8ff65261033b90\",\n            \"replacement\": \"guid: 5302535af1044152a457ed104f1f4b91\"\n        },\n\t\t{\n            \"referencedResource\": \"LiberationSans SDF.asset\",\n            \"target\": \"guid: 715b80e429c437e40867928a4e1fc975\",\n            \"replacement\": \"guid: 8f586378b4e144a9851e7b34d9b748ee\"\n        },\n        {\n            \"referencedResource\": \"TMP_Bitmap.shader\",\n            \"target\": \"guid: edfcf888cd11d9245b91d2883049a57e\",\n            \"replacement\": \"guid: 128e987d567d4e2c824d754223b3f3b0\"\n        },\n        {\n            \"referencedResource\": \"TMP_Bitmap-Mobile.shader\",\n            \"target\": \"guid: d1cf17907700cb647aa3ea423ba38f2e\",\n            \"replacement\": \"guid: 1e3b057af24249748ff873be7fafee47\"\n        },\n        {\n            \"referencedResource\": \"TMP_SDF.shader\",\n            \"target\": \"guid: dca26082f9cb439469295791d9f76fe5\",\n            \"replacement\": \"guid: 68e6db2ebdc24f95958faec2be5558d6\"\n        },\n        {\n            \"referencedResource\": \"TMP_SDF Overlay.shader\",\n            \"target\": \"guid: 4a7755d6b5b67874f89c85f56f95fe97\",\n            \"replacement\": \"guid: dd89cf5b9246416f84610a006f916af7\"\n        },\n        {\n            \"referencedResource\": \"TMP_SDF-Mobile.shader\",\n            \"target\": \"guid: cafd18099dfc0114896e0a8b277b81b6\",\n            \"replacement\": \"guid: fe393ace9b354375a9cb14cdbbc28be4\"\n        },\n        {\n            \"referencedResource\": \"TMP_SDF-Mobile Masking.shader\",\n            \"target\": \"guid: afc255f7c2be52e41973a3d10a2e632d\",\n            \"replacement\": \"guid: bc1ede39bf3643ee8e493720e4259791\"\n        },\n        {\n            \"referencedResource\": \"TMP_SDF-Mobile Overlay.shader\",\n            \"target\": \"guid: 9ecb3fe313cb5f7478141eba4a2d54ed\",\n            \"replacement\": \"guid: a02a7d8c237544f1962732b55a9aebf1\"\n        },\n        {\n            \"referencedResource\": \"TMP_SDF-Surface.shader\",\n            \"target\": \"guid: 8e6b9842dbb1a5a4887378afab854e63\",\n            \"replacement\": \"guid: f7ada0af4f174f0694ca6a487b8f543d\"\n        },\n        {\n            \"referencedResource\": \"TMP_SDF-Surface-Mobile.shader\",\n            \"target\": \"guid: 3c2ea7753c1425145a74d106ec1cd852\",\n            \"replacement\": \"guid: 85187c2149c549c5b33f0cdb02836b17\"\n        },\n        {\n            \"referencedResource\": \"TMP_Sprite.shader\",\n            \"target\": \"guid: 3a1c68c8292caf046bd21158886c5e40\",\n            \"replacement\": \"guid: cf81c85f95fe47e1a27f6ae460cf182c\"\n        },\n        {\n            \"referencedResource\": \"TMP_ColorGradient.cs\",\n            \"target\": \"guid: e90e18dd4a044ff4394833216e6bf4d2\",\n            \"replacement\": \"guid: 54d21f6ece3b46479f0c328f8c6007e0\"\n        },\n\t\t{\n            \"referencedResource\": \"TMP_ColorGradient.cs\",\n            \"target\": \"fileID: 2108210716, guid: 89f0137620f6af44b9ba852b4190e64e\",\n            \"replacement\": \"fileID: 11500000, guid: 54d21f6ece3b46479f0c328f8c6007e0\"\n        },\n        {\n            \"referencedResource\": \"TMP_Settings.cs\",\n            \"target\": \"guid: aafc3c7b9e915d64e8ec3d2c88b3a231\",\n            \"replacement\": \"guid: 2705215ac5b84b70bacc50632be6e391\"\n        },\n\t\t{\n            \"referencedResource\": \"TMP_Settings.cs\",\n            \"target\": \"fileID: -395462249, guid: 89f0137620f6af44b9ba852b4190e64e\",\n            \"replacement\": \"fileID: 11500000, guid: 2705215ac5b84b70bacc50632be6e391\"\n        },\n\t\t{\n            \"referencedResource\": \"TMP Settings.asset\",\n            \"target\": \"guid: 69ed5bac41eebaa4c97e9d2a4168c54f\",\n            \"replacement\": \"guid: 3f5b5dff67a942289a9defa416b206f3\"\n        },\n\t\t{\n            \"referencedResource\": \"LineBreaking Following Characters.txt\",\n            \"target\": \"guid: 312ba5b9e90627940866e19549a788cf\",\n            \"replacement\": \"guid: fade42e8bc714b018fac513c043d323b\"\n        },\n        {\n            \"referencedResource\": \"LineBreaking Leading Characters.txt\",\n            \"target\": \"guid: 8d713940fcbede142ae4a33ea0062b33\",\n            \"replacement\": \"guid: d82c1b31c7e74239bff1220585707d2b\"\n        },\n        {\n            \"referencedResource\": \"TMP_StyleSheet.cs\",\n            \"target\": \"guid: 13259b4ce497b194eb52a33d8eda0bdc\",\n            \"replacement\": \"guid: ab2114bdc8544297b417dfefe9f1e410\"\n        },\n\t\t{\n            \"referencedResource\": \"TMP_StyleSheet.cs\",\n            \"target\": \"fileID: -1936749209, guid: 89f0137620f6af44b9ba852b4190e64e\",\n            \"replacement\": \"fileID: 11500000, guid: ab2114bdc8544297b417dfefe9f1e410\"\n        },\n\t\t{\n            \"referencedResource\": \"TMP Default Style Sheet.asset\",\n            \"target\": \"guid: 54d1085f9a2fdea4587fcfc7dddcd4bc\",\n            \"replacement\": \"guid: f952c082cb03451daed3ee968ac6c63e\"\n        },\n\t\t{\n            \"referencedResource\": \"TMP_SpriteAsset.cs\",\n            \"target\": \"guid: 90940d439ca0ef746af0b48419b92d2e\",\n            \"replacement\": \"guid: 84a92b25f83d49b9bc132d206b370281\"\n        },\n\t\t{\n            \"referencedResource\": \"TMP_SpriteAsset.cs\",\n            \"target\": \"fileID: 2019389346, guid: 89f0137620f6af44b9ba852b4190e64e\",\n            \"replacement\": \"fileID: 11500000, guid: 84a92b25f83d49b9bc132d206b370281\"\n        },\n\t\t{\n            \"referencedResource\": \"Default Sprite Asset.asset\",\n            \"target\": \"guid: 273ca6c80b4b5d746b5e548f532bffd8\",\n            \"replacement\": \"guid: fbef3c704dce48f08a44612d6c856c8d\"\n        },\n        {\n            \"referencedResource\": \"Default Sprite Asset.png\",\n            \"target\": \"guid: 5b32c2d36abe44540bed74c1f787033b\",\n            \"replacement\": \"guid: a0fc465d6cf04254a2938578735e2383\"\n        },\n\t\t{\n            \"referencedResource\": \"EmojiOne.asset\",\n            \"target\": \"guid: 9a952e2781ef26940ae089f1053ef4ef\",\n            \"replacement\": \"guid: c41005c129ba4d66911b75229fd70b45\"\n        },\n        {\n            \"referencedResource\": \"EmojiOne.png\",\n            \"target\": \"guid: 6ec706981a919c3489f0b061a40054e2\",\n            \"replacement\": \"guid: dffef66376be4fa480fb02b19edbe903\"\n        },\n\t\t{\n            \"referencedResource\": \"DropCap Numbers.asset\",\n            \"target\": \"guid: c4fd2a959a50b584b92dedfefec1ffda\",\n            \"replacement\": \"guid: 14aa93acbb234d16aaef0e8b46814db6\"\n        },     \n        {\n            \"referencedResource\": \"DropCap Numbers.psd\",\n            \"target\": \"guid: 28b41fef228d6814f90e541deaf9f262\",\n            \"replacement\": \"guid: fd09957580ac4326916010f1f260975b\"\n        }\n    ]\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/PackageConversionData_Assets.json.meta",
    "content": "fileFormatVersion: 2\nguid: 0e0afa652c0031c48896a97b424d027b\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/DropdownOptionListDrawer.cs",
    "content": "﻿using UnityEditorInternal;\nusing UnityEngine;\nusing UnityEngine.UI;\nusing UnityEditor;\n\nnamespace TMPro.EditorUtilities\n{\n    [CustomPropertyDrawer(typeof(TMP_Dropdown.OptionDataList), true)]\n    class DropdownOptionListDrawer : PropertyDrawer\n    {\n        private ReorderableList m_ReorderableList;\n\n        private void Init(SerializedProperty property)\n        {\n            if (m_ReorderableList != null)\n                return;\n\n            SerializedProperty array = property.FindPropertyRelative(\"m_Options\");\n\n            m_ReorderableList = new ReorderableList(property.serializedObject, array);\n            m_ReorderableList.drawElementCallback = DrawOptionData;\n            m_ReorderableList.drawHeaderCallback = DrawHeader;\n            m_ReorderableList.elementHeight += 16;\n        }\n\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\n        {\n            Init(property);\n\n            m_ReorderableList.DoList(position);\n        }\n\n        private void DrawHeader(Rect rect)\n        {\n            GUI.Label(rect, \"Options\");\n        }\n\n        private void DrawOptionData(Rect rect, int index, bool isActive, bool isFocused)\n        {\n            SerializedProperty itemData = m_ReorderableList.serializedProperty.GetArrayElementAtIndex(index);\n            SerializedProperty itemText = itemData.FindPropertyRelative(\"m_Text\");\n            SerializedProperty itemImage = itemData.FindPropertyRelative(\"m_Image\");\n\n            RectOffset offset = new RectOffset(0, 0, -1, -3);\n            rect = offset.Add(rect);\n            rect.height = EditorGUIUtility.singleLineHeight;\n\n            EditorGUI.PropertyField(rect, itemText, GUIContent.none);\n            rect.y += EditorGUIUtility.singleLineHeight;\n            EditorGUI.PropertyField(rect, itemImage, GUIContent.none);\n        }\n\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\n        {\n            Init(property);\n\n            return m_ReorderableList.GetHeight();\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/DropdownOptionListDrawer.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 9545c9eb3bf94265810463794fec8334\ntimeCreated: 1464818008\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/GlyphInfoDrawer.cs",
    "content": "﻿/*\nusing UnityEngine;\nusing UnityEditor;\nusing System.Collections;\n\n\nnamespace TMPro.EditorUtilities\n{\n\n    [CustomPropertyDrawer(typeof(TMP_Glyph))]\n    public class GlyphInfoDrawer : PropertyDrawer\n    {\n\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\n        {\n            SerializedProperty prop_id = property.FindPropertyRelative(\"id\");\n            SerializedProperty prop_x = property.FindPropertyRelative(\"x\");\n            SerializedProperty prop_y = property.FindPropertyRelative(\"y\");\n            SerializedProperty prop_width = property.FindPropertyRelative(\"width\");\n            SerializedProperty prop_height = property.FindPropertyRelative(\"height\");\n            SerializedProperty prop_xOffset = property.FindPropertyRelative(\"xOffset\");\n            SerializedProperty prop_yOffset = property.FindPropertyRelative(\"yOffset\");\n            SerializedProperty prop_xAdvance = property.FindPropertyRelative(\"xAdvance\");\n            SerializedProperty prop_scale = property.FindPropertyRelative(\"scale\");\n\n\n            // We get Rect since a valid position may not be provided by the caller.\n            Rect rect = GUILayoutUtility.GetRect(position.width, 48);\n            rect.y -= 15;\n\n            //GUI.enabled = false;\n            EditorGUIUtility.labelWidth = 40f;\n            EditorGUIUtility.fieldWidth = 45f;\n\n            bool prevGuiState = GUI.enabled;\n            GUI.enabled = true;\n            EditorGUI.LabelField(new Rect(rect.x + 5f, rect.y, 80f, 18), new GUIContent(\"Ascii: <color=#FFFF80>\" + prop_id.intValue + \"</color>\"), TMP_UIStyleManager.label);\n            EditorGUI.LabelField(new Rect(rect.x + 90f, rect.y, 80f, 18), new GUIContent(\"Hex: <color=#FFFF80>\" + prop_id.intValue.ToString(\"X\") + \"</color>\"), TMP_UIStyleManager.label);\n            EditorGUI.LabelField(new Rect(rect.x + 170f, rect.y, 80, 18), \"Char: [ <color=#FFFF80>\" + (char)prop_id.intValue + \"</color> ]\", TMP_UIStyleManager.label);\n            GUI.enabled = prevGuiState;\n\n            EditorGUIUtility.labelWidth = 35f;\n            EditorGUIUtility.fieldWidth = 10f;\n\n            float width = (rect.width - 5f) / 4;\n            EditorGUI.PropertyField(new Rect(rect.x + 5f + width * 0, rect.y + 22, width - 5f, 18), prop_x, new GUIContent(\"X:\"));\n            EditorGUI.PropertyField(new Rect(rect.x + 5f + width * 1, rect.y + 22, width - 5f, 18), prop_y, new GUIContent(\"Y:\"));\n            EditorGUI.PropertyField(new Rect(rect.x + 5f + width * 2, rect.y + 22, width - 5f, 18), prop_width, new GUIContent(\"W:\"));\n            EditorGUI.PropertyField(new Rect(rect.x + 5f + width * 3, rect.y + 22, width - 5f, 18), prop_height, new GUIContent(\"H:\"));\n\n            //GUI.enabled = true;\n            EditorGUI.PropertyField(new Rect(rect.x + 5f + width * 0, rect.y + 44, width - 5f, 18), prop_xOffset, new GUIContent(\"OX:\"));\n            EditorGUI.PropertyField(new Rect(rect.x + 5f + width * 1, rect.y + 44, width - 5f, 18), prop_yOffset, new GUIContent(\"OY:\"));\n            //GUI.enabled = true;\n            EditorGUI.PropertyField(new Rect(rect.x + 5f + width * 2, rect.y + 44, width - 5f, 18), prop_xAdvance, new GUIContent(\"ADV:\"));\n            EditorGUI.PropertyField(new Rect(rect.x + 5f + width * 3, rect.y + 44, width - 5f, 18), prop_scale, new GUIContent(\"SF:\"));\n        }\n\n    }\n}\n*/"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/GlyphInfoDrawer.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 900f1a451c764dc3bdcc0de815a15935\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/GlyphMetricsPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\nusing UnityEngine.TextCore;\nusing UnityEditor;\nusing System.Collections;\n\n\nnamespace TMPro.EditorUtilities\n{\n\n    [CustomPropertyDrawer(typeof(GlyphMetrics))]\n    public class GlyphMetricsPropertyDrawer : PropertyDrawer\n    {\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\n        {\n            SerializedProperty prop_Width = property.FindPropertyRelative(\"m_Width\");\n            SerializedProperty prop_Height = property.FindPropertyRelative(\"m_Height\");\n            SerializedProperty prop_HoriBearingX = property.FindPropertyRelative(\"m_HorizontalBearingX\");\n            SerializedProperty prop_HoriBearingY = property.FindPropertyRelative(\"m_HorizontalBearingY\");\n            SerializedProperty prop_HoriAdvance = property.FindPropertyRelative(\"m_HorizontalAdvance\");\n\n            // We get Rect since a valid position may not be provided by the caller.\n            Rect rect = new Rect(position.x, position.y, position.width, 49);\n\n            EditorGUI.LabelField(rect, new GUIContent(\"Glyph Metrics\"));\n\n            EditorGUIUtility.labelWidth = 30f;\n            EditorGUIUtility.fieldWidth = 10f;\n\n            //GUI.enabled = false;\n            float width = (rect.width - 75f) / 2;\n            EditorGUI.PropertyField(new Rect(rect.x + width * 0, rect.y + 20, width - 5f, 18), prop_Width, new GUIContent(\"W:\"));\n            EditorGUI.PropertyField(new Rect(rect.x + width * 1, rect.y + 20, width - 5f, 18), prop_Height, new GUIContent(\"H:\"));\n\n            //GUI.enabled = true;\n\n            width = (rect.width - 75f) / 3;\n            EditorGUI.BeginChangeCheck();\n            EditorGUI.PropertyField(new Rect(rect.x + width * 0, rect.y + 40, width - 5f, 18), prop_HoriBearingX, new GUIContent(\"BX:\"));\n            EditorGUI.PropertyField(new Rect(rect.x + width * 1, rect.y + 40, width - 5f, 18), prop_HoriBearingY, new GUIContent(\"BY:\"));\n            EditorGUI.PropertyField(new Rect(rect.x + width * 2, rect.y + 40, width - 5f, 18), prop_HoriAdvance, new GUIContent(\"AD:\"));\n            if (EditorGUI.EndChangeCheck())\n            {\n\n            }\n        }\n\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\n        {\n            return 65f;\n        }\n\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/GlyphMetricsPropertyDrawer.cs.meta",
    "content": "fileFormatVersion: 2\nguid: e3882522a08b6f5459b4dea6f8791278\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/GlyphRectPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\nusing UnityEngine.TextCore;\nusing UnityEditor;\nusing System.Collections;\n\n\nnamespace TMPro.EditorUtilities\n{\n\n    [CustomPropertyDrawer(typeof(GlyphRect))]\n    public class GlyphRectPropertyDrawer : PropertyDrawer\n    {\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\n        {\n            //EditorGUI.BeginProperty(position, label, property);\n\n            SerializedProperty prop_X = property.FindPropertyRelative(\"m_X\");\n            SerializedProperty prop_Y = property.FindPropertyRelative(\"m_Y\");\n            SerializedProperty prop_Width = property.FindPropertyRelative(\"m_Width\");\n            SerializedProperty prop_Height = property.FindPropertyRelative(\"m_Height\");\n\n            // We get Rect since a valid position may not be provided by the caller.\n            Rect rect = new Rect(position.x, position.y, position.width, 49);\n            EditorGUI.LabelField(rect, new GUIContent(\"Glyph Rect\"));\n\n            EditorGUIUtility.labelWidth = 30f;\n            EditorGUIUtility.fieldWidth = 10f;\n\n            //GUI.enabled = false;\n            float width = (rect.width - 75f) / 4;\n            EditorGUI.PropertyField(new Rect(rect.x + width * 0, rect.y + 20, width - 5f, 18), prop_X, new GUIContent(\"X:\"));\n            EditorGUI.PropertyField(new Rect(rect.x + width * 1, rect.y + 20, width - 5f, 18), prop_Y, new GUIContent(\"Y:\"));\n            EditorGUI.PropertyField(new Rect(rect.x + width * 2, rect.y + 20, width - 5f, 18), prop_Width, new GUIContent(\"W:\"));\n            EditorGUI.PropertyField(new Rect(rect.x + width * 3, rect.y + 20, width - 5f, 18), prop_Height, new GUIContent(\"H:\"));\n\n            //EditorGUI.EndProperty();\n        }\n\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\n        {\n            return 45f;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/GlyphRectPropertyDrawer.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 8bc2b083b068f3546a9509c805e0541c\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_BaseEditorPanel.cs",
    "content": "using UnityEngine;\nusing UnityEditor;\n\nnamespace TMPro.EditorUtilities\n{\n    public abstract class TMP_BaseEditorPanel : Editor\n    {\n        //Labels and Tooltips\n        static readonly GUIContent k_RtlToggleLabel = new GUIContent(\"Enable RTL Editor\", \"Reverses text direction and allows right to left editing.\");\n        static readonly GUIContent k_MainSettingsLabel = new GUIContent(\"Main Settings\");\n        static readonly GUIContent k_FontAssetLabel = new GUIContent(\"Font Asset\", \"The Font Asset containing the glyphs that can be rendered for this text.\");\n        static readonly GUIContent k_MaterialPresetLabel = new GUIContent(\"Material Preset\", \"The material used for rendering. Only materials created from the Font Asset can be used.\");\n        static readonly GUIContent k_AutoSizeLabel = new GUIContent(\"Auto Size\", \"Auto sizes the text to fit the available space.\");\n        static readonly GUIContent k_FontSizeLabel = new GUIContent(\"Font Size\", \"The size the text will be rendered at in points.\");\n        static readonly GUIContent k_AutoSizeOptionsLabel = new GUIContent(\"Auto Size Options\");\n        static readonly GUIContent k_MinLabel = new GUIContent(\"Min\", \"The minimum font size.\");\n        static readonly GUIContent k_MaxLabel = new GUIContent(\"Max\", \"The maximum font size.\");\n        static readonly GUIContent k_WdLabel = new GUIContent(\"WD%\", \"Compresses character width up to this value before reducing font size.\");\n        static readonly GUIContent k_LineLabel = new GUIContent(\"Line\", \"Negative value only. Compresses line height down to this value before reducing font size.\");\n        static readonly GUIContent k_FontStyleLabel = new GUIContent(\"Font Style\", \"Styles to apply to the text such as Bold or Italic.\");\n\n        static readonly GUIContent k_BoldLabel = new GUIContent(\"B\", \"Bold\");\n        static readonly GUIContent k_ItalicLabel = new GUIContent(\"I\", \"Italic\");\n        static readonly GUIContent k_UnderlineLabel = new GUIContent(\"U\", \"Underline\");\n        static readonly GUIContent k_StrikethroughLabel = new GUIContent(\"S\", \"Strikethrough\");\n        static readonly GUIContent k_LowercaseLabel = new GUIContent(\"ab\", \"Lowercase\");\n        static readonly GUIContent k_UppercaseLabel = new GUIContent(\"AB\", \"Uppercase\");\n        static readonly GUIContent k_SmallcapsLabel = new GUIContent(\"SC\", \"Smallcaps\");\n        \n        static readonly GUIContent k_ColorModeLabel = new GUIContent(\"Color Mode\", \"The type of gradient to use.\");\n        static readonly GUIContent k_BaseColorLabel = new GUIContent(\"Vertex Color\", \"The base color of the text vertices.\");\n        static readonly GUIContent k_ColorPresetLabel = new GUIContent(\"Color Preset\", \"A Color Preset which override the local color settings.\");\n        static readonly GUIContent k_ColorGradientLabel = new GUIContent(\"Color Gradient\", \"The gradient color applied over the Vertex Color. Can be locally set or driven by a Gradient Asset.\");\n        static readonly GUIContent k_CorenerColorsLabel = new GUIContent(\"Colors\", \"The color composition of the gradient.\");\n        static readonly GUIContent k_OverrideTagsLabel = new GUIContent(\"Override Tags\", \"Whether the color settings override the <color> tag.\");\n        \n        static readonly GUIContent k_SpacingOptionsLabel = new GUIContent(\"Spacing Options\", \"Spacing adjustments between different elements of the text.\");\n        static readonly GUIContent k_CharacterSpacingLabel = new GUIContent(\"Character\");\n        static readonly GUIContent k_WordSpacingLabel = new GUIContent(\"Word\");\n        static readonly GUIContent k_LineSpacingLabel = new GUIContent(\"Line\");\n        static readonly GUIContent k_ParagraphSpacingLabel = new GUIContent(\"Paragraph\");\n        \n        static readonly GUIContent k_AlignmentLabel = new GUIContent(\"Alignment\", \"Horizontal and vertical aligment of the text within its container.\");\n        static readonly GUIContent k_WrapMixLabel = new GUIContent(\"Wrap Mix (W <-> C)\", \"How much to favor words versus characters when distributing the text.\");\n\n        static readonly GUIContent k_WrappingLabel = new GUIContent(\"Wrapping\", \"Wraps text to the next line when reaching the edge of the container.\");\n        static readonly GUIContent[] k_WrappingOptions = { new GUIContent(\"Disabled\"), new GUIContent(\"Enabled\") };\n        static readonly GUIContent k_OverflowLabel = new GUIContent(\"Overflow\", \"How to display text which goes past the edge of the container.\");\n\n        static readonly GUIContent k_MarginsLabel = new GUIContent(\"Margins\", \"The space between the text and the edge of its container.\");\n        static readonly GUIContent k_GeometrySortingLabel = new GUIContent(\"Geometry Sorting\", \"The order in which text geometry is sorted. Used to adjust the way overlapping characters are displayed.\");\n        static readonly GUIContent k_RichTextLabel = new GUIContent(\"Rich Text\", \"Enables the use of rich text tags such as <color> and <font>.\");\n        static readonly GUIContent k_EscapeCharactersLabel = new GUIContent(\"Parse Escape Characters\", \"Whether to display strings such as \\\"\\\\n\\\" as is or replace them by the character they represent.\");\n        static readonly GUIContent k_VisibleDescenderLabel = new GUIContent(\"Visible Descender\", \"Compute descender values from visible characters only. Used to adjust layout behavior when hiding and revealing characters dynamically.\");\n        static readonly GUIContent k_SpriteAssetLabel = new GUIContent(\"Sprite Asset\", \"The Sprite Asset used when NOT specifically referencing one using <sprite=\\\"Sprite Asset Name\\\">.\");\n\n        static readonly GUIContent k_HorizontalMappingLabel = new GUIContent(\"Horizontal Mapping\", \"Horizontal UV mapping when using a shader with a texture face option.\");\n        static readonly GUIContent k_VerticalMappingLabel = new GUIContent(\"Vertical Mapping\", \"Vertical UV mapping when using a shader with a texture face option.\");\n        static readonly GUIContent k_LineOffsetLabel = new GUIContent(\"Line Offset\", \"Adds an horizontal offset to each successive line. Used for slanted texturing.\");\n\n        static readonly GUIContent k_KerningLabel = new GUIContent(\"Kerning\", \"Enables character specific spacing between pairs of characters.\");\n        static readonly GUIContent k_PaddingLabel = new GUIContent(\"Extra Padding\", \"Adds some padding between the characters and the edge of the text mesh. Can reduce graphical errors when displaying small text.\");\n        \n        static readonly GUIContent k_LeftLabel = new GUIContent(\"Left\");\n        static readonly GUIContent k_TopLabel = new GUIContent(\"Top\");\n        static readonly GUIContent k_RightLabel = new GUIContent(\"Right\");\n        static readonly GUIContent k_BottomLabel = new GUIContent(\"Bottom\");\n\n        protected static readonly GUIContent k_ExtraSettingsLabel = new GUIContent(\"Extra Settings\");\n\n        protected struct Foldout\n        {\n            // Track Inspector foldout panel states, globally.\n            public static bool extraSettings = false;\n            public static bool materialInspector = true;\n        }\n        \n        protected static int s_EventId;\n\n        public int selAlignGridA;\n        public int selAlignGridB;\n        \n        protected SerializedProperty m_TextProp;\n        \n        protected SerializedProperty m_IsRightToLeftProp;\n        protected string m_RtlText;\n\n        protected SerializedProperty m_FontAssetProp;\n\n        protected SerializedProperty m_FontSharedMaterialProp;\n        protected Material[] m_MaterialPresets;\n        protected GUIContent[] m_MaterialPresetNames;\n        protected int m_MaterialPresetSelectionIndex;\n        protected bool m_IsPresetListDirty;\n\n        protected SerializedProperty m_FontStyleProp;\n        \n        protected SerializedProperty m_FontColorProp;\n        protected SerializedProperty m_EnableVertexGradientProp;\n        protected SerializedProperty m_FontColorGradientProp;\n        protected SerializedProperty m_FontColorGradientPresetProp;\n        protected SerializedProperty m_OverrideHtmlColorProp;\n\n        protected SerializedProperty m_FontSizeProp;\n        protected SerializedProperty m_FontSizeBaseProp;\n\n        protected SerializedProperty m_AutoSizingProp;\n        protected SerializedProperty m_FontSizeMinProp;\n        protected SerializedProperty m_FontSizeMaxProp;\n        \n        protected SerializedProperty m_LineSpacingMaxProp;\n        protected SerializedProperty m_CharWidthMaxAdjProp;\n\n        protected SerializedProperty m_CharacterSpacingProp;\n        protected SerializedProperty m_WordSpacingProp;\n        protected SerializedProperty m_LineSpacingProp;\n        protected SerializedProperty m_ParagraphSpacingProp;\n\n        protected SerializedProperty m_TextAlignmentProp;\n\n        protected SerializedProperty m_HorizontalMappingProp;\n        protected SerializedProperty m_VerticalMappingProp;\n        protected SerializedProperty m_UvLineOffsetProp;\n\n        protected SerializedProperty m_EnableWordWrappingProp;\n        protected SerializedProperty m_WordWrappingRatiosProp;\n        protected SerializedProperty m_TextOverflowModeProp;\n        protected SerializedProperty m_PageToDisplayProp;\n        protected SerializedProperty m_LinkedTextComponentProp;\n        protected SerializedProperty m_IsLinkedTextComponentProp;\n\n        protected SerializedProperty m_EnableKerningProp;\n\n        protected SerializedProperty m_IsRichTextProp;\n\n        protected SerializedProperty m_HasFontAssetChangedProp;\n\n        protected SerializedProperty m_EnableExtraPaddingProp;\n        protected SerializedProperty m_CheckPaddingRequiredProp;\n        protected SerializedProperty m_EnableEscapeCharacterParsingProp;\n        protected SerializedProperty m_UseMaxVisibleDescenderProp;\n        protected SerializedProperty m_GeometrySortingOrderProp;\n        \n        protected SerializedProperty m_SpriteAssetProp;\n        \n        protected SerializedProperty m_MarginProp;\n\n        protected SerializedProperty m_ColorModeProp;\n\n        protected bool m_HavePropertiesChanged;\n        \n        protected TMP_Text m_TextComponent;\n        protected RectTransform m_RectTransform;\n        \n        protected Material m_TargetMaterial;\n        \n        protected Vector3[] m_RectCorners = new Vector3[4];\n        protected Vector3[] m_HandlePoints = new Vector3[4];\n        \n        protected virtual void OnEnable()\n        {\n            m_TextProp = serializedObject.FindProperty(\"m_text\");\n            m_IsRightToLeftProp = serializedObject.FindProperty(\"m_isRightToLeft\");\n            m_FontAssetProp = serializedObject.FindProperty(\"m_fontAsset\");\n            m_FontSharedMaterialProp = serializedObject.FindProperty(\"m_sharedMaterial\");\n\n            m_FontStyleProp = serializedObject.FindProperty(\"m_fontStyle\");\n\n            m_FontSizeProp = serializedObject.FindProperty(\"m_fontSize\");\n            m_FontSizeBaseProp = serializedObject.FindProperty(\"m_fontSizeBase\");\n\n            m_AutoSizingProp = serializedObject.FindProperty(\"m_enableAutoSizing\");\n            m_FontSizeMinProp = serializedObject.FindProperty(\"m_fontSizeMin\");\n            m_FontSizeMaxProp = serializedObject.FindProperty(\"m_fontSizeMax\");\n            \n            m_LineSpacingMaxProp = serializedObject.FindProperty(\"m_lineSpacingMax\");\n            m_CharWidthMaxAdjProp = serializedObject.FindProperty(\"m_charWidthMaxAdj\");\n\n            // Colors & Gradient\n            m_FontColorProp = serializedObject.FindProperty(\"m_fontColor\");\n            m_EnableVertexGradientProp = serializedObject.FindProperty(\"m_enableVertexGradient\");\n            m_FontColorGradientProp = serializedObject.FindProperty(\"m_fontColorGradient\");\n            m_FontColorGradientPresetProp = serializedObject.FindProperty(\"m_fontColorGradientPreset\");\n            m_OverrideHtmlColorProp = serializedObject.FindProperty(\"m_overrideHtmlColors\");\n\n            m_CharacterSpacingProp = serializedObject.FindProperty(\"m_characterSpacing\");\n            m_WordSpacingProp = serializedObject.FindProperty(\"m_wordSpacing\");\n            m_LineSpacingProp = serializedObject.FindProperty(\"m_lineSpacing\");\n            m_ParagraphSpacingProp = serializedObject.FindProperty(\"m_paragraphSpacing\");\n\n            m_TextAlignmentProp = serializedObject.FindProperty(\"m_textAlignment\");\n\n            m_HorizontalMappingProp = serializedObject.FindProperty(\"m_horizontalMapping\");\n            m_VerticalMappingProp = serializedObject.FindProperty(\"m_verticalMapping\");\n            m_UvLineOffsetProp = serializedObject.FindProperty(\"m_uvLineOffset\");\n\n            m_EnableWordWrappingProp = serializedObject.FindProperty(\"m_enableWordWrapping\");\n            m_WordWrappingRatiosProp = serializedObject.FindProperty(\"m_wordWrappingRatios\");\n            m_TextOverflowModeProp = serializedObject.FindProperty(\"m_overflowMode\");\n            m_PageToDisplayProp = serializedObject.FindProperty(\"m_pageToDisplay\");\n            m_LinkedTextComponentProp = serializedObject.FindProperty(\"m_linkedTextComponent\");\n            m_IsLinkedTextComponentProp = serializedObject.FindProperty(\"m_isLinkedTextComponent\");\n\n            m_EnableKerningProp = serializedObject.FindProperty(\"m_enableKerning\");\n            \n            m_EnableExtraPaddingProp = serializedObject.FindProperty(\"m_enableExtraPadding\");\n            m_IsRichTextProp = serializedObject.FindProperty(\"m_isRichText\");\n            m_CheckPaddingRequiredProp = serializedObject.FindProperty(\"checkPaddingRequired\");\n            m_EnableEscapeCharacterParsingProp = serializedObject.FindProperty(\"m_parseCtrlCharacters\");\n            m_UseMaxVisibleDescenderProp = serializedObject.FindProperty(\"m_useMaxVisibleDescender\");\n            \n            m_GeometrySortingOrderProp = serializedObject.FindProperty(\"m_geometrySortingOrder\");\n            \n            m_SpriteAssetProp = serializedObject.FindProperty(\"m_spriteAsset\");\n\n            m_MarginProp = serializedObject.FindProperty(\"m_margin\");\n\n            m_HasFontAssetChangedProp = serializedObject.FindProperty(\"m_hasFontAssetChanged\");\n\n            m_ColorModeProp = serializedObject.FindProperty(\"m_colorMode\");\n\n            m_TextComponent = (TMP_Text)target;\n            m_RectTransform = m_TextComponent.rectTransform;\n\n            // Create new Material Editor if one does not exists\n            m_TargetMaterial = m_TextComponent.fontSharedMaterial;\n\n            // Set material inspector visibility\n            if (m_TargetMaterial != null)\n                UnityEditorInternal.InternalEditorUtility.SetIsInspectorExpanded(m_TargetMaterial, Foldout.materialInspector);\n\n            // Find all Material Presets matching the current Font Asset Material\n            m_MaterialPresetNames = GetMaterialPresets();\n\n            // Initialize the Event Listener for Undo Events.\n            Undo.undoRedoPerformed += OnUndoRedo;\n        }\n\n        protected virtual void OnDisable()\n        {\n            // Set material inspector visibility\n            if (m_TargetMaterial != null)\n                Foldout.materialInspector = UnityEditorInternal.InternalEditorUtility.GetIsInspectorExpanded(m_TargetMaterial);\n\n            if (Undo.undoRedoPerformed != null)\n                Undo.undoRedoPerformed -= OnUndoRedo;\n        }\n\n        public override void OnInspectorGUI()\n        {\n            // Make sure Multi selection only includes TMP Text objects.\n            if (IsMixSelectionTypes()) return;\n\n            serializedObject.Update();\n\n            DrawTextInput();\n\n            DrawMainSettings();\n\n            DrawExtraSettings();\n\n            EditorGUILayout.Space();\n\n            if (m_HavePropertiesChanged)\n            {\n                m_HavePropertiesChanged = false;\n                m_TextComponent.havePropertiesChanged = true;\n                m_TextComponent.ComputeMarginSize();\n                EditorUtility.SetDirty(target);\n            }\n\n            serializedObject.ApplyModifiedProperties();\n        }\n\n        public void OnSceneGUI()\n        {\n            if (IsMixSelectionTypes()) return;\n\n            // Margin Frame & Handles\n            m_RectTransform.GetWorldCorners(m_RectCorners);\n            Vector4 marginOffset = m_TextComponent.margin;\n            Vector3 lossyScale = m_RectTransform.lossyScale;\n            \n            m_HandlePoints[0] = m_RectCorners[0] + m_RectTransform.TransformDirection(new Vector3(marginOffset.x * lossyScale.x, marginOffset.w * lossyScale.y, 0));\n            m_HandlePoints[1] = m_RectCorners[1] + m_RectTransform.TransformDirection(new Vector3(marginOffset.x * lossyScale.x, -marginOffset.y * lossyScale.y, 0));\n            m_HandlePoints[2] = m_RectCorners[2] + m_RectTransform.TransformDirection(new Vector3(-marginOffset.z * lossyScale.x, -marginOffset.y * lossyScale.y, 0));\n            m_HandlePoints[3] = m_RectCorners[3] + m_RectTransform.TransformDirection(new Vector3(-marginOffset.z * lossyScale.x, marginOffset.w * lossyScale.y, 0));\n\n            Handles.DrawSolidRectangleWithOutline(m_HandlePoints, new Color32(255, 255, 255, 0), new Color32(255, 255, 0, 255));\n            \n            // Draw & process FreeMoveHandles\n\n            // LEFT HANDLE\n            Vector3 oldLeft = (m_HandlePoints[0] + m_HandlePoints[1]) * 0.5f;\n            Vector3 newLeft = Handles.FreeMoveHandle(oldLeft, Quaternion.identity, HandleUtility.GetHandleSize(m_RectTransform.position) * 0.05f, Vector3.zero, Handles.DotHandleCap);\n            bool hasChanged = false;\n            if (oldLeft != newLeft)\n            {\n                float delta = oldLeft.x - newLeft.x;\n                marginOffset.x += -delta / lossyScale.x;\n                //Debug.Log(\"Left Margin H0:\" + handlePoints[0] + \"  H1:\" + handlePoints[1]);\n                hasChanged = true;\n            }\n\n            // TOP HANDLE\n            Vector3 oldTop = (m_HandlePoints[1] + m_HandlePoints[2]) * 0.5f;\n            Vector3 newTop = Handles.FreeMoveHandle(oldTop, Quaternion.identity, HandleUtility.GetHandleSize(m_RectTransform.position) * 0.05f, Vector3.zero, Handles.DotHandleCap);\n            if (oldTop != newTop)\n            {\n                float delta = oldTop.y - newTop.y;\n                marginOffset.y += delta / lossyScale.y;\n                //Debug.Log(\"Top Margin H1:\" + handlePoints[1] + \"  H2:\" + handlePoints[2]);   \n                hasChanged = true;\n            }\n\n            // RIGHT HANDLE\n            Vector3 oldRight = (m_HandlePoints[2] + m_HandlePoints[3]) * 0.5f;\n            Vector3 newRight = Handles.FreeMoveHandle(oldRight, Quaternion.identity, HandleUtility.GetHandleSize(m_RectTransform.position) * 0.05f, Vector3.zero, Handles.DotHandleCap);\n            if (oldRight != newRight)\n            {\n                float delta = oldRight.x - newRight.x;\n                marginOffset.z += delta / lossyScale.x;\n                hasChanged = true;\n                //Debug.Log(\"Right Margin H2:\" + handlePoints[2] + \"  H3:\" + handlePoints[3]);\n            }\n\n            // BOTTOM HANDLE\n            Vector3 oldBottom = (m_HandlePoints[3] + m_HandlePoints[0]) * 0.5f;\n            Vector3 newBottom = Handles.FreeMoveHandle(oldBottom, Quaternion.identity, HandleUtility.GetHandleSize(m_RectTransform.position) * 0.05f, Vector3.zero, Handles.DotHandleCap);\n            if (oldBottom != newBottom)\n            {\n                float delta = oldBottom.y - newBottom.y;\n                marginOffset.w += -delta / lossyScale.y;\n                hasChanged = true;\n                //Debug.Log(\"Bottom Margin H0:\" + handlePoints[0] + \"  H3:\" + handlePoints[3]);\n            }\n\n            if (hasChanged)\n            {\n                Undo.RecordObjects(new Object[] {m_RectTransform, m_TextComponent }, \"Margin Changes\");\n                m_TextComponent.margin = marginOffset;\n                EditorUtility.SetDirty(target);\n            }\n        }\n\n        protected void DrawTextInput()\n        {\n            EditorGUILayout.Space();\n\n            // If the text component is linked, disable the text input box.\n            if (m_IsLinkedTextComponentProp.boolValue)\n            {\n                EditorGUILayout.HelpBox(\"The Text Input Box is disabled due to this text component being linked to another.\", MessageType.Info);\n            }\n            else\n            {\n                EditorGUI.BeginChangeCheck();\n                EditorGUILayout.PropertyField(m_TextProp);\n\n                if (EditorGUI.EndChangeCheck() || (m_IsRightToLeftProp.boolValue && string.IsNullOrEmpty(m_RtlText)))\n                {\n                    m_TextComponent.m_inputSource = TMP_Text.TextInputSources.Text;\n                    m_TextComponent.m_isInputParsingRequired = true;\n                    m_HavePropertiesChanged = true;\n\n                    // Handle Left to Right or Right to Left Editor\n                    if (m_IsRightToLeftProp.boolValue)\n                    {\n                        m_RtlText = string.Empty;\n                        string sourceText = m_TextProp.stringValue;\n\n                        // Reverse Text displayed in Text Input Box\n                        for (int i = 0; i < sourceText.Length; i++)\n                        {\n                            m_RtlText += sourceText[sourceText.Length - i - 1];\n                        }\n                    }\n                }\n\n                // Toggle showing Rich Tags\n                m_IsRightToLeftProp.boolValue = EditorGUILayout.Toggle(k_RtlToggleLabel, m_IsRightToLeftProp.boolValue);\n\n                if (m_IsRightToLeftProp.boolValue)\n                {\n                    EditorGUI.BeginChangeCheck();\n                    m_RtlText = EditorGUILayout.TextArea(m_RtlText, TMP_UIStyleManager.wrappingTextArea, GUILayout.Height(EditorGUI.GetPropertyHeight(m_TextProp) - EditorGUIUtility.singleLineHeight), GUILayout.ExpandWidth(true));\n                    if (EditorGUI.EndChangeCheck())\n                    {\n                        // Convert RTL input\n                        string sourceText = string.Empty;\n\n                        // Reverse Text displayed in Text Input Box\n                        for (int i = 0; i < m_RtlText.Length; i++)\n                        {\n                            sourceText += m_RtlText[m_RtlText.Length - i - 1];\n                        }\n\n                        m_TextProp.stringValue = sourceText;\n                    }\n                }\n            }\n        }\n\n        protected void DrawMainSettings()\n        {\n            // MAIN SETTINGS SECTION\n            GUILayout.Label(k_MainSettingsLabel, EditorStyles.boldLabel);\n\n            EditorGUI.indentLevel += 1;\n\n            DrawFont();\n\n            DrawColor();\n\n            DrawSpacing();\n\n            DrawAlignment();\n\n            DrawWrappingOverflow();\n\n            DrawTextureMapping();\n            \n            EditorGUI.indentLevel -= 1;\n        }\n\n        void DrawFont()\n        {\n            // Update list of material presets if needed.\n            if (m_IsPresetListDirty)\n                m_MaterialPresetNames = GetMaterialPresets();\n\n            // FONT ASSET\n            EditorGUI.BeginChangeCheck();\n            EditorGUILayout.PropertyField(m_FontAssetProp, k_FontAssetLabel);\n            if (EditorGUI.EndChangeCheck())\n            {\n                m_HavePropertiesChanged = true;\n                m_HasFontAssetChangedProp.boolValue = true;\n\n                m_IsPresetListDirty = true;\n                m_MaterialPresetSelectionIndex = 0;\n            }\n\n            Rect rect;\n\n            // MATERIAL PRESET\n            if (m_MaterialPresetNames != null)\n            {\n                EditorGUI.BeginChangeCheck();\n                rect = EditorGUILayout.GetControlRect(false, 17);\n\n                float oldHeight = EditorStyles.popup.fixedHeight;\n                EditorStyles.popup.fixedHeight = rect.height;\n\n                int oldSize = EditorStyles.popup.fontSize;\n                EditorStyles.popup.fontSize = 11;\n\n                m_MaterialPresetSelectionIndex = EditorGUI.Popup(rect, k_MaterialPresetLabel, m_MaterialPresetSelectionIndex, m_MaterialPresetNames);\n                if (EditorGUI.EndChangeCheck())\n                {\n                    m_FontSharedMaterialProp.objectReferenceValue = m_MaterialPresets[m_MaterialPresetSelectionIndex];\n                    m_HavePropertiesChanged = true;\n                }\n\n                //Make sure material preset selection index matches the selection\n                if (m_MaterialPresetSelectionIndex < m_MaterialPresetNames.Length && m_TargetMaterial != m_MaterialPresets[m_MaterialPresetSelectionIndex] && !m_HavePropertiesChanged)\n                    m_IsPresetListDirty = true;\n\n                EditorStyles.popup.fixedHeight = oldHeight;\n                EditorStyles.popup.fontSize = oldSize;\n            }\n\n            // FONT STYLE\n            EditorGUI.BeginChangeCheck();\n\n            int v1, v2, v3, v4, v5, v6, v7;\n\n            if (EditorGUIUtility.wideMode)\n            {\n                rect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight + 2f);\n\n                EditorGUI.PrefixLabel(rect, k_FontStyleLabel);\n\n                int styleValue = m_FontStyleProp.intValue;\n\n                rect.x += EditorGUIUtility.labelWidth;\n                rect.width -= EditorGUIUtility.labelWidth;\n\n                rect.width = Mathf.Max(25f, rect.width / 7f);\n\n                v1 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 1) == 1, k_BoldLabel, TMP_UIStyleManager.alignmentButtonLeft) ? 1 : 0; // Bold\n                rect.x += rect.width;\n                v2 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 2) == 2, k_ItalicLabel, TMP_UIStyleManager.alignmentButtonMid) ? 2 : 0; // Italics\n                rect.x += rect.width;\n                v3 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 4) == 4, k_UnderlineLabel, TMP_UIStyleManager.alignmentButtonMid) ? 4 : 0; // Underline\n                rect.x += rect.width;\n                v7 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 64) == 64, k_StrikethroughLabel, TMP_UIStyleManager.alignmentButtonRight) ? 64 : 0; // Strikethrough\n                rect.x += rect.width;\n                \n                int selected = 0;\n                \n                EditorGUI.BeginChangeCheck();\n                v4 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 8) == 8, k_LowercaseLabel, TMP_UIStyleManager.alignmentButtonLeft) ? 8 : 0; // Lowercase\n                if (EditorGUI.EndChangeCheck() && v4 > 0)\n                {\n                    selected = v4;\n                }\n                rect.x += rect.width;\n                EditorGUI.BeginChangeCheck();\n                v5 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 16) == 16, k_UppercaseLabel, TMP_UIStyleManager.alignmentButtonMid) ? 16 : 0; // Uppercase\n                if (EditorGUI.EndChangeCheck() && v5 > 0)\n                {\n                    selected = v5;\n                }\n                rect.x += rect.width;\n                EditorGUI.BeginChangeCheck();\n                v6 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 32) == 32, k_SmallcapsLabel, TMP_UIStyleManager.alignmentButtonRight) ? 32 : 0; // Smallcaps\n                if (EditorGUI.EndChangeCheck() && v6 > 0)\n                {\n                    selected = v6;\n                }\n\n                if (selected > 0)\n                {\n                    v4 = selected == 8 ? 8 : 0;\n                    v5 = selected == 16 ? 16 : 0;\n                    v6 = selected == 32 ? 32 : 0;\n                }\n            }\n            else\n            {\n                rect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight + 2f);\n\n                EditorGUI.PrefixLabel(rect, k_FontStyleLabel);\n\n                int styleValue = m_FontStyleProp.intValue;\n\n                rect.x += EditorGUIUtility.labelWidth;\n                rect.width -= EditorGUIUtility.labelWidth;\n                rect.width = Mathf.Max(25f, rect.width / 4f);\n\n                v1 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 1) == 1, k_BoldLabel, TMP_UIStyleManager.alignmentButtonLeft) ? 1 : 0; // Bold\n                rect.x += rect.width;\n                v2 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 2) == 2, k_ItalicLabel, TMP_UIStyleManager.alignmentButtonMid) ? 2 : 0; // Italics\n                rect.x += rect.width;\n                v3 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 4) == 4, k_UnderlineLabel, TMP_UIStyleManager.alignmentButtonMid) ? 4 : 0; // Underline\n                rect.x += rect.width;\n                v7 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 64) == 64, k_StrikethroughLabel, TMP_UIStyleManager.alignmentButtonRight) ? 64 : 0; // Strikethrough\n\n                rect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight + 2f);\n                \n                rect.x += EditorGUIUtility.labelWidth;\n                rect.width -= EditorGUIUtility.labelWidth;\n\n                rect.width = Mathf.Max(25f, rect.width / 4f);\n\n                int selected = 0;\n                \n                EditorGUI.BeginChangeCheck();\n                v4 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 8) == 8, k_LowercaseLabel, TMP_UIStyleManager.alignmentButtonLeft) ? 8 : 0; // Lowercase\n                if (EditorGUI.EndChangeCheck() && v4 > 0)\n                {\n                    selected = v4;\n                }\n                rect.x += rect.width;\n                EditorGUI.BeginChangeCheck();\n                v5 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 16) == 16, k_UppercaseLabel, TMP_UIStyleManager.alignmentButtonMid) ? 16 : 0; // Uppercase\n                if (EditorGUI.EndChangeCheck() && v5 > 0)\n                {\n                    selected = v5;\n                }\n                rect.x += rect.width;\n                EditorGUI.BeginChangeCheck();\n                v6 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 32) == 32, k_SmallcapsLabel, TMP_UIStyleManager.alignmentButtonRight) ? 32 : 0; // Smallcaps\n                if (EditorGUI.EndChangeCheck() && v6 > 0)\n                {\n                    selected = v6;\n                }\n\n                if (selected > 0)\n                {\n                    v4 = selected == 8 ? 8 : 0;\n                    v5 = selected == 16 ? 16 : 0;\n                    v6 = selected == 32 ? 32 : 0;\n                }\n            }\n\n            if (EditorGUI.EndChangeCheck())\n            {\n                m_FontStyleProp.intValue = v1 + v2 + v3 + v4 + v5 + v6 + v7;\n                m_HavePropertiesChanged = true;\n            }\n\n            // FONT SIZE\n            EditorGUI.BeginChangeCheck();\n            \n            EditorGUI.BeginDisabledGroup(m_AutoSizingProp.boolValue);\n            EditorGUILayout.PropertyField(m_FontSizeProp, k_FontSizeLabel, GUILayout.MaxWidth(EditorGUIUtility.labelWidth + 50f));\n            EditorGUI.EndDisabledGroup();\n\n            if (EditorGUI.EndChangeCheck())\n            {\n                m_FontSizeBaseProp.floatValue = m_FontSizeProp.floatValue;\n                m_HavePropertiesChanged = true;\n            }\n\n            EditorGUI.indentLevel += 1;\n            \n            EditorGUI.BeginChangeCheck();\n            EditorGUILayout.PropertyField(m_AutoSizingProp, k_AutoSizeLabel);\n            if (EditorGUI.EndChangeCheck())\n            {\n                if (m_AutoSizingProp.boolValue == false)\n                    m_FontSizeProp.floatValue = m_FontSizeBaseProp.floatValue;\n\n                m_HavePropertiesChanged = true;\n            }\n\n            // Show auto sizing options\n            if (m_AutoSizingProp.boolValue)\n            {\n                rect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight);\n\n                EditorGUI.PrefixLabel(rect, k_AutoSizeOptionsLabel);\n\n                int previousIndent = EditorGUI.indentLevel;\n\n                EditorGUI.indentLevel = 0;\n\n                rect.width = (rect.width - EditorGUIUtility.labelWidth) / 4f;\n                rect.x += EditorGUIUtility.labelWidth;\n\n                EditorGUIUtility.labelWidth = 24;\n                EditorGUI.BeginChangeCheck();\n                EditorGUI.PropertyField(rect, m_FontSizeMinProp, k_MinLabel);\n                if (EditorGUI.EndChangeCheck())\n                {\n                    m_FontSizeMinProp.floatValue = Mathf.Min(m_FontSizeMinProp.floatValue, m_FontSizeMaxProp.floatValue);\n                    m_HavePropertiesChanged = true;\n                }\n                rect.x += rect.width;\n\n                EditorGUIUtility.labelWidth = 27;\n                EditorGUI.BeginChangeCheck();\n                EditorGUI.PropertyField(rect, m_FontSizeMaxProp, k_MaxLabel);\n                if (EditorGUI.EndChangeCheck())\n                {\n                    m_FontSizeMaxProp.floatValue = Mathf.Max(m_FontSizeMinProp.floatValue, m_FontSizeMaxProp.floatValue);\n                    m_HavePropertiesChanged = true;\n                }\n                rect.x += rect.width;\n\n                EditorGUI.BeginChangeCheck();\n                EditorGUIUtility.labelWidth = 36;\n                EditorGUI.PropertyField(rect, m_CharWidthMaxAdjProp, k_WdLabel);\n                rect.x += rect.width;\n                EditorGUIUtility.labelWidth = 28;\n                EditorGUI.PropertyField(rect, m_LineSpacingMaxProp, k_LineLabel);\n\n                EditorGUIUtility.labelWidth = 0;\n\n                if (EditorGUI.EndChangeCheck())\n                {\n                    m_CharWidthMaxAdjProp.floatValue = Mathf.Clamp(m_CharWidthMaxAdjProp.floatValue, 0, 50);\n                    m_LineSpacingMaxProp.floatValue = Mathf.Min(0, m_LineSpacingMaxProp.floatValue);\n                    m_HavePropertiesChanged = true;\n                }\n                \n                EditorGUI.indentLevel = previousIndent;\n            }\n\n            EditorGUI.indentLevel -= 1;\n\n            \n\n            EditorGUILayout.Space();\n        }\n\n        void DrawColor()\n        {\n            // FACE VERTEX COLOR\n            EditorGUI.BeginChangeCheck();\n            EditorGUILayout.PropertyField(m_FontColorProp, k_BaseColorLabel);\n\n            EditorGUILayout.PropertyField(m_EnableVertexGradientProp, k_ColorGradientLabel);\n            if (EditorGUI.EndChangeCheck())\n            {\n                m_HavePropertiesChanged = true;\n            }\n            \n            EditorGUIUtility.fieldWidth = 0;\n\n            if (m_EnableVertexGradientProp.boolValue)\n            {\n                EditorGUI.indentLevel += 1;\n                \n                EditorGUI.BeginChangeCheck();\n                \n                EditorGUILayout.PropertyField(m_FontColorGradientPresetProp, k_ColorPresetLabel);\n                \n                SerializedObject obj = null;\n\n                SerializedProperty colorMode;\n\n                SerializedProperty topLeft;\n                SerializedProperty topRight;\n                SerializedProperty bottomLeft;\n                SerializedProperty bottomRight;\n\n                if (m_FontColorGradientPresetProp.objectReferenceValue == null)\n                {\n                    colorMode = m_ColorModeProp;\n                    topLeft = m_FontColorGradientProp.FindPropertyRelative(\"topLeft\");\n                    topRight = m_FontColorGradientProp.FindPropertyRelative(\"topRight\");\n                    bottomLeft = m_FontColorGradientProp.FindPropertyRelative(\"bottomLeft\");\n                    bottomRight = m_FontColorGradientProp.FindPropertyRelative(\"bottomRight\");\n                }\n                else\n                {\n                    obj = new SerializedObject(m_FontColorGradientPresetProp.objectReferenceValue);\n                    colorMode = obj.FindProperty(\"colorMode\");\n                    topLeft = obj.FindProperty(\"topLeft\");\n                    topRight = obj.FindProperty(\"topRight\");\n                    bottomLeft = obj.FindProperty(\"bottomLeft\");\n                    bottomRight = obj.FindProperty(\"bottomRight\");\n                }\n\n                EditorGUILayout.PropertyField(colorMode, k_ColorModeLabel);\n\n                var rect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight * (EditorGUIUtility.wideMode ? 1 : 2));\n\n                EditorGUI.PrefixLabel(rect, k_CorenerColorsLabel);\n\n                rect.x += EditorGUIUtility.labelWidth;\n                rect.width = rect.width - EditorGUIUtility.labelWidth;\n\n                switch ((ColorMode)colorMode.enumValueIndex)\n                {\n                    case ColorMode.Single:\n                        TMP_EditorUtility.DrawColorProperty(rect, topLeft);\n\n                        topRight.colorValue = topLeft.colorValue;\n                        bottomLeft.colorValue = topLeft.colorValue;\n                        bottomRight.colorValue = topLeft.colorValue;\n                        break;\n                    case ColorMode.HorizontalGradient:\n                        rect.width /= 2f;\n\n                        TMP_EditorUtility.DrawColorProperty(rect, topLeft);\n\n                        rect.x += rect.width;\n                    \n                        TMP_EditorUtility.DrawColorProperty(rect, topRight);\n                        \n                        bottomLeft.colorValue = topLeft.colorValue;\n                        bottomRight.colorValue = topRight.colorValue;\n                        break;\n                    case ColorMode.VerticalGradient:\n                        TMP_EditorUtility.DrawColorProperty(rect, topLeft);\n\n                        rect = EditorGUILayout.GetControlRect(false, EditorGUIUtility.singleLineHeight * (EditorGUIUtility.wideMode ? 1 : 2));\n                        rect.x += EditorGUIUtility.labelWidth;\n                \n                        TMP_EditorUtility.DrawColorProperty(rect, bottomLeft);\n                        \n                        topRight.colorValue = topLeft.colorValue;\n                        bottomRight.colorValue = bottomLeft.colorValue;\n                        break;\n                    case ColorMode.FourCornersGradient:\n                        rect.width /= 2f;\n\n                        TMP_EditorUtility.DrawColorProperty(rect, topLeft);\n\n                        rect.x += rect.width;\n                    \n                        TMP_EditorUtility.DrawColorProperty(rect, topRight);\n\n                        rect = EditorGUILayout.GetControlRect(false, EditorGUIUtility.singleLineHeight * (EditorGUIUtility.wideMode ? 1 : 2));\n                        rect.x += EditorGUIUtility.labelWidth;\n                        rect.width = (rect.width - EditorGUIUtility.labelWidth) / 2f;\n                \n                        TMP_EditorUtility.DrawColorProperty(rect, bottomLeft);\n\n                        rect.x += rect.width;\n\n                        TMP_EditorUtility.DrawColorProperty(rect, bottomRight);\n                        break;\n                }\n                \n                if (EditorGUI.EndChangeCheck())\n                {\n                    m_HavePropertiesChanged = true;\n                    if (obj != null)\n                    {\n                        obj.ApplyModifiedProperties();\n                        TMPro_EventManager.ON_COLOR_GRAIDENT_PROPERTY_CHANGED(m_FontColorGradientPresetProp.objectReferenceValue as TMP_ColorGradient);\n                    }\n                }\n\n                EditorGUI.indentLevel -= 1;\n            }\n            \n            EditorGUILayout.PropertyField(m_OverrideHtmlColorProp, k_OverrideTagsLabel);\n            \n            EditorGUILayout.Space();\n        }\n\n        void DrawSpacing()\n        {\n            // CHARACTER, LINE & PARAGRAPH SPACING\n            EditorGUI.BeginChangeCheck();\n            \n            Rect rect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight);\n            \n            EditorGUI.PrefixLabel(rect, k_SpacingOptionsLabel);\n\n            int oldIndent = EditorGUI.indentLevel;\n            EditorGUI.indentLevel = 0;\n\n            rect.x += EditorGUIUtility.labelWidth;\n            rect.width = (rect.width - EditorGUIUtility.labelWidth - 3f) / 2f;\n            \n            EditorGUIUtility.labelWidth = Mathf.Min(rect.width * 0.55f, 80f);\n            \n            EditorGUI.PropertyField(rect, m_CharacterSpacingProp, k_CharacterSpacingLabel);\n            rect.x += rect.width + 3f;\n            EditorGUI.PropertyField(rect, m_WordSpacingProp, k_WordSpacingLabel);\n\n            rect = EditorGUILayout.GetControlRect(false, EditorGUIUtility.singleLineHeight);\n            EditorGUIUtility.labelWidth = 0;\n            rect.x += EditorGUIUtility.labelWidth;\n            rect.width = (rect.width - EditorGUIUtility.labelWidth -3f) / 2f;\n            EditorGUIUtility.labelWidth = Mathf.Min(rect.width * 0.55f, 80f);\n\n            EditorGUI.PropertyField(rect, m_LineSpacingProp, k_LineSpacingLabel);\n            rect.x += rect.width + 3f;\n            EditorGUI.PropertyField(rect, m_ParagraphSpacingProp, k_ParagraphSpacingLabel);\n\n            EditorGUIUtility.labelWidth = 0;\n            EditorGUI.indentLevel = oldIndent;\n\n            if (EditorGUI.EndChangeCheck())\n            {\n                m_HavePropertiesChanged = true;\n            }\n        }\n\n        void DrawAlignment()\n        {\n            // TEXT ALIGNMENT\n            EditorGUI.BeginChangeCheck();\n\n            EditorGUILayout.PropertyField(m_TextAlignmentProp, k_AlignmentLabel);\n\n            // WRAPPING RATIOS shown if Justified mode is selected.\n            if (((_HorizontalAlignmentOptions)m_TextAlignmentProp.intValue & _HorizontalAlignmentOptions.Justified) == _HorizontalAlignmentOptions.Justified || ((_HorizontalAlignmentOptions)m_TextAlignmentProp.intValue & _HorizontalAlignmentOptions.Flush) == _HorizontalAlignmentOptions.Flush)\n                DrawPropertySlider(k_WrapMixLabel, m_WordWrappingRatiosProp);\n\n            if (EditorGUI.EndChangeCheck())\n                m_HavePropertiesChanged = true;\n\n            EditorGUILayout.Space();\n        }\n\n        void DrawWrappingOverflow()\n        {\n            // TEXT WRAPPING\n            EditorGUI.BeginChangeCheck();\n            int wrapSelection = EditorGUILayout.Popup(k_WrappingLabel, m_EnableWordWrappingProp.boolValue ? 1 : 0, k_WrappingOptions);\n            if (EditorGUI.EndChangeCheck())\n            {\n                m_EnableWordWrappingProp.boolValue = wrapSelection == 1;\n                m_HavePropertiesChanged = true;\n                m_TextComponent.m_isInputParsingRequired = true;\n            }\n            \n            // TEXT OVERFLOW\n            EditorGUI.BeginChangeCheck();\n\n            // Cache Reference to Linked Text Component\n            TMP_Text oldLinkedComponent = m_LinkedTextComponentProp.objectReferenceValue as TMP_Text;\n\n            if ((TextOverflowModes)m_TextOverflowModeProp.enumValueIndex == TextOverflowModes.Linked)\n            {\n                EditorGUILayout.BeginHorizontal();\n                EditorGUILayout.PropertyField(m_TextOverflowModeProp, k_OverflowLabel);\n\n                EditorGUILayout.PropertyField(m_LinkedTextComponentProp, GUIContent.none);\n                \n                EditorGUILayout.EndHorizontal();\n\n                if (GUI.changed)\n                {\n                    TMP_Text linkedComponent = m_LinkedTextComponentProp.objectReferenceValue as TMP_Text;\n\n                    if (linkedComponent)\n                        m_TextComponent.linkedTextComponent = linkedComponent;\n\n                }\n            }\n            else if ((TextOverflowModes)m_TextOverflowModeProp.enumValueIndex == TextOverflowModes.Page)\n            {\n                EditorGUILayout.BeginHorizontal();\n                EditorGUILayout.PropertyField(m_TextOverflowModeProp, k_OverflowLabel);\n                EditorGUILayout.PropertyField(m_PageToDisplayProp, GUIContent.none);\n                EditorGUILayout.EndHorizontal();\n\n                if (oldLinkedComponent)\n                    m_TextComponent.linkedTextComponent = null;\n            }\n            else\n            {\n                EditorGUILayout.PropertyField(m_TextOverflowModeProp, k_OverflowLabel);\n\n                if (oldLinkedComponent)\n                    m_TextComponent.linkedTextComponent = null;\n            }\n\n            if (EditorGUI.EndChangeCheck())\n            {\n                m_HavePropertiesChanged = true;\n                m_TextComponent.m_isInputParsingRequired = true;\n            }\n\n            EditorGUILayout.Space();\n        }\n\n        protected abstract void DrawExtraSettings();\n\n        protected void DrawMargins()\n        {\n            EditorGUI.BeginChangeCheck();\n            DrawMarginProperty(m_MarginProp, k_MarginsLabel);\n            if (EditorGUI.EndChangeCheck())\n            {\n                m_HavePropertiesChanged = true;\n            }\n\n            EditorGUILayout.Space();\n        }\n\n        protected void DrawGeometrySorting()\n        {\n            EditorGUI.BeginChangeCheck();\n\n            EditorGUILayout.PropertyField(m_GeometrySortingOrderProp, k_GeometrySortingLabel);\n\n            if (EditorGUI.EndChangeCheck())\n                m_HavePropertiesChanged = true;\n\n            EditorGUILayout.Space();\n        }\n\n        protected void DrawRichText()\n        {\n            EditorGUI.BeginChangeCheck();\n                \n            EditorGUILayout.PropertyField(m_IsRichTextProp, k_RichTextLabel);\n            if (EditorGUI.EndChangeCheck())\n                m_HavePropertiesChanged = true;\n        }\n\n        protected void DrawParsing()\n        {\n            EditorGUI.BeginChangeCheck();\n            EditorGUILayout.PropertyField(m_EnableEscapeCharacterParsingProp, k_EscapeCharactersLabel);\n            EditorGUILayout.PropertyField(m_UseMaxVisibleDescenderProp, k_VisibleDescenderLabel);\n            \n            EditorGUILayout.Space();\n\n            EditorGUILayout.PropertyField(m_SpriteAssetProp, k_SpriteAssetLabel, true);\n\n            if (EditorGUI.EndChangeCheck())\n                m_HavePropertiesChanged = true;\n\n            EditorGUILayout.Space();\n        }\n\n        protected void DrawTextureMapping()\n        {\n            // TEXTURE MAPPING OPTIONS\n            EditorGUI.BeginChangeCheck();\n            EditorGUILayout.PropertyField(m_HorizontalMappingProp, k_HorizontalMappingLabel);\n            EditorGUILayout.PropertyField(m_VerticalMappingProp, k_VerticalMappingLabel);\n            if (EditorGUI.EndChangeCheck())\n            {\n                m_HavePropertiesChanged = true;\n            }\n\n            // UV OPTIONS\n            if (m_HorizontalMappingProp.enumValueIndex > 0)\n            {\n                EditorGUI.BeginChangeCheck();\n                EditorGUILayout.PropertyField(m_UvLineOffsetProp, k_LineOffsetLabel, GUILayout.MinWidth(70f));\n                if (EditorGUI.EndChangeCheck())\n                {\n                    m_HavePropertiesChanged = true;\n                }\n            }\n\n            EditorGUILayout.Space();\n        }\n\n        protected void DrawKerning()\n        {\n            // KERNING\n            EditorGUI.BeginChangeCheck();\n            EditorGUILayout.PropertyField(m_EnableKerningProp, k_KerningLabel);\n            if (EditorGUI.EndChangeCheck())\n            {\n                m_HavePropertiesChanged = true;\n            }\n        }\n\n        protected void DrawPadding()\n        {\n            // EXTRA PADDING\n            EditorGUI.BeginChangeCheck();\n            EditorGUILayout.PropertyField(m_EnableExtraPaddingProp, k_PaddingLabel);\n            if (EditorGUI.EndChangeCheck())\n            {\n                m_HavePropertiesChanged = true;\n                m_CheckPaddingRequiredProp.boolValue = true;\n            }\n        }\n\n        /// <summary>\n        /// Method to retrieve the material presets that match the currently selected font asset.\n        /// </summary>\n        protected GUIContent[] GetMaterialPresets()\n        {\n            TMP_FontAsset fontAsset = m_FontAssetProp.objectReferenceValue as TMP_FontAsset;\n            if (fontAsset == null) return null;\n\n            m_MaterialPresets = TMP_EditorUtility.FindMaterialReferences(fontAsset);\n            m_MaterialPresetNames = new GUIContent[m_MaterialPresets.Length];\n\n            for (int i = 0; i < m_MaterialPresetNames.Length; i++)\n            {\n                m_MaterialPresetNames[i] = new GUIContent(m_MaterialPresets[i].name);\n\n                if (m_TargetMaterial.GetInstanceID() == m_MaterialPresets[i].GetInstanceID())\n                    m_MaterialPresetSelectionIndex = i;\n            }\n\n            m_IsPresetListDirty = false;\n\n            return m_MaterialPresetNames;\n        }\n\n        // DRAW MARGIN PROPERTY\n        protected void DrawMarginProperty(SerializedProperty property, GUIContent label)\n        {\n            Rect rect = EditorGUILayout.GetControlRect(false, 2 * 18);\n\n            EditorGUI.BeginProperty(rect, label, property);\n\n            Rect pos0 = new Rect(rect.x + 15, rect.y + 2, rect.width - 15, 18);\n\n            float width = rect.width + 3;\n            pos0.width = EditorGUIUtility.labelWidth;\n            GUI.Label(pos0, label);\n\n            var vec = property.vector4Value;\n\n            float widthB = width - EditorGUIUtility.labelWidth;\n            float fieldWidth = widthB / 4;\n            pos0.width = Mathf.Max(fieldWidth - 5, 45f);\n\n            // Labels\n            pos0.x = EditorGUIUtility.labelWidth + 15;\n            GUI.Label(pos0, k_LeftLabel);\n\n            pos0.x += fieldWidth;\n            GUI.Label(pos0, k_TopLabel);\n\n            pos0.x += fieldWidth;\n            GUI.Label(pos0, k_RightLabel);\n\n            pos0.x += fieldWidth;\n            GUI.Label(pos0, k_BottomLabel);\n\n            pos0.y += 18;\n\n            pos0.x = EditorGUIUtility.labelWidth;\n            vec.x = EditorGUI.FloatField(pos0, GUIContent.none, vec.x);\n\n            pos0.x += fieldWidth;\n            vec.y = EditorGUI.FloatField(pos0, GUIContent.none, vec.y);\n\n            pos0.x += fieldWidth;\n            vec.z = EditorGUI.FloatField(pos0, GUIContent.none, vec.z);\n\n            pos0.x += fieldWidth;\n            vec.w = EditorGUI.FloatField(pos0, GUIContent.none, vec.w);\n\n            property.vector4Value = vec;\n\n            EditorGUI.EndProperty();\n        }\n\n        protected void DrawPropertySlider(GUIContent label, SerializedProperty property)\n        {\n            Rect rect = EditorGUILayout.GetControlRect(false, 17);\n\n            GUIContent content = label ?? GUIContent.none;\n            EditorGUI.Slider(new Rect(rect.x, rect.y, rect.width, rect.height), property, 0.0f, 1.0f, content);\n        }\n\n        protected abstract bool IsMixSelectionTypes();\n\n        // Special Handling of Undo / Redo Events.\n        protected abstract void OnUndoRedo();\n\n    }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_BaseEditorPanel.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 91950f78729ab144aa36e94690b28fad\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_BaseShaderGUI.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\n\nnamespace TMPro.EditorUtilities\n{\n    /// <summary>Base class for TextMesh Pro shader GUIs.</summary>\n    public abstract class TMP_BaseShaderGUI : ShaderGUI\n    {\n        /// <summary>Representation of a #pragma shader_feature.</summary>\n        /// <description>It is assumed that the first feature option is for no keyword (underscores).</description>\n        protected class ShaderFeature\n        {\n            public string undoLabel;\n\n            public GUIContent label;\n\n            /// <summary>The keyword labels, for display. Include the no-keyword as the first option.</summary>\n            public GUIContent[] keywordLabels;\n\n            /// <summary>The shader keywords. Exclude the no-keyword option.</summary>\n            public string[] keywords;\n\n            int m_State;\n\n            public bool Active\n            {\n                get { return m_State >= 0; }\n            }\n\n            public int State\n            {\n                get { return m_State; }\n            }\n\n            public void ReadState(Material material)\n            {\n                for (int i = 0; i < keywords.Length; i++)\n                {\n                    if (material.IsKeywordEnabled(keywords[i]))\n                    {\n                        m_State = i;\n                        return;\n                    }\n                }\n\n                m_State = -1;\n            }\n\n            public void SetActive(bool active, Material material)\n            {\n                m_State = active ? 0 : -1;\n                SetStateKeywords(material);\n            }\n\n            public void DoPopup(MaterialEditor editor, Material material)\n            {\n                EditorGUI.BeginChangeCheck();\n                int selection = EditorGUILayout.Popup(label, m_State + 1, keywordLabels);\n                if (EditorGUI.EndChangeCheck())\n                {\n                    m_State = selection - 1;\n                    editor.RegisterPropertyChangeUndo(undoLabel);\n                    SetStateKeywords(material);\n                }\n            }\n\n            void SetStateKeywords(Material material)\n            {\n                for (int i = 0; i < keywords.Length; i++)\n                {\n                    if (i == m_State)\n                    {\n                        material.EnableKeyword(keywords[i]);\n                    }\n                    else\n                    {\n                        material.DisableKeyword(keywords[i]);\n                    }\n                }\n            }\n        }\n\n        static GUIContent s_TempLabel = new GUIContent();\n\n        protected static bool s_DebugExtended;\n\n        static int s_UndoRedoCount, s_LastSeenUndoRedoCount;\n\n        static float[][] s_TempFloats =\n        {\n            null, new float[1], new float[2], new float[3], new float[4]\n        };\n\n        protected static GUIContent[] s_XywhVectorLabels =\n        {\n            new GUIContent(\"X\"),\n            new GUIContent(\"Y\"),\n            new GUIContent(\"W\", \"Width\"),\n            new GUIContent(\"H\", \"Height\")\n        };\n\n        protected static GUIContent[] s_LbrtVectorLabels =\n        {\n            new GUIContent(\"L\", \"Left\"),\n            new GUIContent(\"B\", \"Bottom\"),\n            new GUIContent(\"R\", \"Right\"),\n            new GUIContent(\"T\", \"Top\")\n        };\n\n        static TMP_BaseShaderGUI()\n        {\n            // Keep track of how many undo/redo events happened.\n            Undo.undoRedoPerformed += () => s_UndoRedoCount += 1;\n        }\n\n        bool m_IsNewGUI = true;\n\n        float m_DragAndDropMinY;\n\n        protected MaterialEditor m_Editor;\n\n        protected Material m_Material;\n\n        protected MaterialProperty[] m_Properties;\n\n        void PrepareGUI()\n        {\n            m_IsNewGUI = false;\n            ShaderUtilities.GetShaderPropertyIDs();\n\n            // New GUI just got constructed. This happens in response to a selection,\n            // but also after undo/redo events.\n            if (s_LastSeenUndoRedoCount != s_UndoRedoCount)\n            {\n                // There's been at least one undo/redo since the last time this GUI got constructed.\n                // Maybe the undo/redo was for this material? Assume that is was.\n                TMPro_EventManager.ON_MATERIAL_PROPERTY_CHANGED(true, m_Material as Material);\n            }\n\n            s_LastSeenUndoRedoCount = s_UndoRedoCount;\n        }\n\n        public override void OnGUI(MaterialEditor materialEditor, MaterialProperty[] properties)\n        {\n            m_Editor = materialEditor;\n            m_Material = materialEditor.target as Material;\n            this.m_Properties = properties;\n\n            if (m_IsNewGUI)\n            {\n                PrepareGUI();\n            }\n\n            DoDragAndDropBegin();\n            EditorGUI.BeginChangeCheck();\n            DoGUI();\n            if (EditorGUI.EndChangeCheck())\n            {\n                TMPro_EventManager.ON_MATERIAL_PROPERTY_CHANGED(true, m_Material);\n            }\n\n            DoDragAndDropEnd();\n        }\n\n        /// <summary>Override this method to create the specific shader GUI.</summary>\n        protected abstract void DoGUI();\n\n        static string[] s_PanelStateLabel = new string[] { \"\\t- <i>Click to collapse</i> -\", \"\\t- <i>Click to expand</i>  -\" };\n\n        protected bool BeginPanel(string panel, bool expanded)\n        {\n            EditorGUILayout.BeginVertical(EditorStyles.helpBox);\n\n            Rect r = EditorGUI.IndentedRect(GUILayoutUtility.GetRect(20, 18));\n            r.x += 20;\n            r.width += 6;\n\n            bool enabled = GUI.enabled;\n            GUI.enabled = true;\n            expanded = TMP_EditorUtility.EditorToggle(r, expanded, new GUIContent(panel), TMP_UIStyleManager.panelTitle);\n            r.width -= 30;\n            EditorGUI.LabelField(r, new GUIContent(expanded ? s_PanelStateLabel[0] : s_PanelStateLabel[1]), TMP_UIStyleManager.rightLabel);\n            GUI.enabled = enabled;\n\n            EditorGUI.indentLevel += 1;\n            EditorGUI.BeginDisabledGroup(false);\n\n            return expanded;\n        }\n\n        protected bool BeginPanel(string panel, ShaderFeature feature, bool expanded, bool readState = true)\n        {\n            if (readState)\n            {\n                feature.ReadState(m_Material);\n            }\n\n            EditorGUI.BeginChangeCheck();\n\n            EditorGUILayout.BeginVertical(EditorStyles.helpBox);\n            GUILayout.BeginHorizontal();\n\n            Rect r = EditorGUI.IndentedRect(GUILayoutUtility.GetRect(20, 20, GUILayout.Width(20f)));\n            bool active = EditorGUI.Toggle(r, feature.Active);\n\n            if (EditorGUI.EndChangeCheck())\n            {\n                m_Editor.RegisterPropertyChangeUndo(feature.undoLabel);\n                feature.SetActive(active, m_Material);\n            }\n\n            r = EditorGUI.IndentedRect(GUILayoutUtility.GetRect(20, 18));\n            r.width += 6;\n\n            bool enabled = GUI.enabled;\n            GUI.enabled = true;\n            expanded = TMP_EditorUtility.EditorToggle(r, expanded, new GUIContent(panel), TMP_UIStyleManager.panelTitle);\n            r.width -= 10;\n            EditorGUI.LabelField(r, new GUIContent(expanded ? s_PanelStateLabel[0] : s_PanelStateLabel[1]), TMP_UIStyleManager.rightLabel);\n            GUI.enabled = enabled;\n\n            GUILayout.EndHorizontal();\n\n            EditorGUI.indentLevel += 1;\n            EditorGUI.BeginDisabledGroup(!active);\n\n            return expanded;\n        }\n\n        public void EndPanel()\n        {\n            EditorGUI.EndDisabledGroup();\n            EditorGUI.indentLevel -= 1;\n            EditorGUILayout.EndVertical();\n        }\n\n        MaterialProperty BeginProperty(string name)\n        {\n            MaterialProperty property = FindProperty(name, m_Properties);\n            EditorGUI.BeginChangeCheck();\n            EditorGUI.showMixedValue = property.hasMixedValue;\n            m_Editor.BeginAnimatedCheck(Rect.zero, property);\n\n            return property;\n        }\n\n        bool EndProperty()\n        {\n            m_Editor.EndAnimatedCheck();\n            EditorGUI.showMixedValue = false;\n            return EditorGUI.EndChangeCheck();\n        }\n\n        protected void DoPopup(string name, string label, GUIContent[] options)\n        {\n            MaterialProperty property = BeginProperty(name);\n            s_TempLabel.text = label;\n            int index = EditorGUILayout.Popup(s_TempLabel, (int)property.floatValue, options);\n            if (EndProperty())\n            {\n                property.floatValue = index;\n            }\n        }\n\n        protected void DoCubeMap(string name, string label)\n        {\n            DoTexture(name, label, typeof(Cubemap));\n        }\n\n        protected void DoTexture2D(string name, string label, bool withTilingOffset = false, string[] speedNames = null)\n        {\n            DoTexture(name, label, typeof(Texture2D), withTilingOffset, speedNames);\n        }\n\n        void DoTexture(string name, string label, System.Type type, bool withTilingOffset = false, string[] speedNames = null)\n        {\n            MaterialProperty property = BeginProperty(name);\n            Rect rect = EditorGUILayout.GetControlRect(true, 60f);\n            float totalWidth = rect.width;\n            rect.width = EditorGUIUtility.labelWidth + 60f;\n            s_TempLabel.text = label;\n            Object tex = EditorGUI.ObjectField(rect, s_TempLabel, property.textureValue, type, false);\n\n            if (EndProperty())\n            {\n                property.textureValue = tex as Texture;\n            }\n\n            rect.x += rect.width + 4f;\n            rect.width = totalWidth - rect.width - 4f;\n            rect.height = EditorGUIUtility.singleLineHeight;\n\n            if (withTilingOffset)\n            {\n                DoTilingOffset(rect, property);\n                rect.y += (rect.height + 2f) * 2f;\n            }\n\n            if (speedNames != null)\n            {\n                DoUVSpeed(rect, speedNames);\n            }\n        }\n\n        void DoTilingOffset(Rect rect, MaterialProperty property)\n        {\n            float labelWidth = EditorGUIUtility.labelWidth;\n            int indentLevel = EditorGUI.indentLevel;\n            EditorGUI.indentLevel = 0;\n            EditorGUIUtility.labelWidth = Mathf.Min(40f, rect.width * 0.20f);\n\n            Vector4 vector = property.textureScaleAndOffset;\n\n            bool changed = false;\n            float[] values = s_TempFloats[2];\n\n            s_TempLabel.text = \"Tiling\";\n            Rect vectorRect = EditorGUI.PrefixLabel(rect, s_TempLabel);\n            values[0] = vector.x;\n            values[1] = vector.y;\n            EditorGUI.BeginChangeCheck();\n            EditorGUI.MultiFloatField(vectorRect, s_XywhVectorLabels, values);\n            if (EndProperty())\n            {\n                vector.x = values[0];\n                vector.y = values[1];\n                changed = true;\n            }\n\n            rect.y += rect.height + 2f;\n            s_TempLabel.text = \"Offset\";\n            vectorRect = EditorGUI.PrefixLabel(rect, s_TempLabel);\n            values[0] = vector.z;\n            values[1] = vector.w;\n            EditorGUI.BeginChangeCheck();\n            EditorGUI.MultiFloatField(vectorRect, s_XywhVectorLabels, values);\n            if (EndProperty())\n            {\n                vector.z = values[0];\n                vector.w = values[1];\n                changed = true;\n            }\n\n            if (changed)\n            {\n                property.textureScaleAndOffset = vector;\n            }\n\n            EditorGUIUtility.labelWidth = labelWidth;\n            EditorGUI.indentLevel = indentLevel;\n        }\n\n        protected void DoUVSpeed(Rect rect, string[] names)\n        {\n            float labelWidth = EditorGUIUtility.labelWidth;\n            int indentLevel = EditorGUI.indentLevel;\n            EditorGUI.indentLevel = 0;\n            EditorGUIUtility.labelWidth = Mathf.Min(40f, rect.width * 0.20f);\n\n            s_TempLabel.text = \"Speed\";\n            rect = EditorGUI.PrefixLabel(rect, s_TempLabel);\n\n            EditorGUIUtility.labelWidth = 13f;\n            rect.width = rect.width * 0.5f - 1f;\n            DoFloat(rect, names[0], \"X\");\n            rect.x += rect.width + 2f;\n            DoFloat(rect, names[1], \"Y\");\n            EditorGUIUtility.labelWidth = labelWidth;\n            EditorGUI.indentLevel = indentLevel;\n        }\n\n        protected void DoToggle(string name, string label)\n        {\n            MaterialProperty property = BeginProperty(name);\n            s_TempLabel.text = label;\n            bool value = EditorGUILayout.Toggle(s_TempLabel, property.floatValue == 1f);\n            if (EndProperty())\n            {\n                property.floatValue = value ? 1f : 0f;\n            }\n        }\n\n        protected void DoFloat(string name, string label)\n        {\n            MaterialProperty property = BeginProperty(name);\n            Rect rect = EditorGUILayout.GetControlRect();\n            rect.width = EditorGUIUtility.labelWidth + 55f;\n            s_TempLabel.text = label;\n            float value = EditorGUI.FloatField(rect, s_TempLabel, property.floatValue);\n            if (EndProperty())\n            {\n                property.floatValue = value;\n            }\n        }\n\n        protected void DoColor(string name, string label)\n        {\n            MaterialProperty property = BeginProperty(name);\n            s_TempLabel.text = label;\n            Color value = EditorGUI.ColorField(EditorGUILayout.GetControlRect(), s_TempLabel, property.colorValue);\n            if (EndProperty())\n            {\n                property.colorValue = value;\n            }\n        }\n\n        void DoFloat(Rect rect, string name, string label)\n        {\n            MaterialProperty property = BeginProperty(name);\n            s_TempLabel.text = label;\n            float value = EditorGUI.FloatField(rect, s_TempLabel, property.floatValue);\n            if (EndProperty())\n            {\n                property.floatValue = value;\n            }\n        }\n\n        protected void DoSlider(string name, string label)\n        {\n            MaterialProperty property = BeginProperty(name);\n            Vector2 range = property.rangeLimits;\n            s_TempLabel.text = label;\n            float value = EditorGUI.Slider(\n                EditorGUILayout.GetControlRect(), s_TempLabel, property.floatValue, range.x, range.y\n            );\n            if (EndProperty())\n            {\n                property.floatValue = value;\n            }\n        }\n\n        protected void DoVector3(string name, string label)\n        {\n            MaterialProperty property = BeginProperty(name);\n            s_TempLabel.text = label;\n            Vector4 value = EditorGUILayout.Vector3Field(s_TempLabel, property.vectorValue);\n            if (EndProperty())\n            {\n                property.vectorValue = value;\n            }\n        }\n\n        protected void DoVector(string name, string label, GUIContent[] subLabels)\n        {\n            MaterialProperty property = BeginProperty(name);\n            Rect rect = EditorGUILayout.GetControlRect();\n            s_TempLabel.text = label;\n            rect = EditorGUI.PrefixLabel(rect, s_TempLabel);\n            Vector4 vector = property.vectorValue;\n\n            float[] values = s_TempFloats[subLabels.Length];\n            for (int i = 0; i < subLabels.Length; i++)\n            {\n                values[i] = vector[i];\n            }\n\n            EditorGUI.MultiFloatField(rect, subLabels, values);\n            if (EndProperty())\n            {\n                for (int i = 0; i < subLabels.Length; i++)\n                {\n                    vector[i] = values[i];\n                }\n\n                property.vectorValue = vector;\n            }\n        }\n\n        void DoDragAndDropBegin()\n        {\n            m_DragAndDropMinY = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true)).y;\n        }\n\n        void DoDragAndDropEnd()\n        {\n            Rect rect = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true));\n            Event evt = Event.current;\n            if (evt.type == EventType.DragUpdated)\n            {\n                DragAndDrop.visualMode = DragAndDropVisualMode.Generic;\n                evt.Use();\n            }\n            else if (\n                evt.type == EventType.DragPerform &&\n                Rect.MinMaxRect(rect.xMin, m_DragAndDropMinY, rect.xMax, rect.yMax).Contains(evt.mousePosition)\n            )\n            {\n                DragAndDrop.AcceptDrag();\n                evt.Use();\n                Material droppedMaterial = DragAndDrop.objectReferences[0] as Material;\n                if (droppedMaterial && droppedMaterial != m_Material)\n                {\n                    PerformDrop(droppedMaterial);\n                }\n            }\n        }\n\n        void PerformDrop(Material droppedMaterial)\n        {\n            Texture droppedTex = droppedMaterial.GetTexture(ShaderUtilities.ID_MainTex);\n            if (!droppedTex)\n            {\n                return;\n            }\n\n            Texture currentTex = m_Material.GetTexture(ShaderUtilities.ID_MainTex);\n            TMP_FontAsset requiredFontAsset = null;\n            if (droppedTex != currentTex)\n            {\n                requiredFontAsset = TMP_EditorUtility.FindMatchingFontAsset(droppedMaterial);\n                if (!requiredFontAsset)\n                {\n                    return;\n                }\n            }\n\n            foreach (GameObject o in Selection.gameObjects)\n            {\n                if (requiredFontAsset)\n                {\n                    TMP_Text textComponent = o.GetComponent<TMP_Text>();\n                    if (textComponent)\n                    {\n                        Undo.RecordObject(textComponent, \"Font Asset Change\");\n                        textComponent.font = requiredFontAsset;\n                    }\n                }\n\n                TMPro_EventManager.ON_DRAG_AND_DROP_MATERIAL_CHANGED(o, m_Material, droppedMaterial);\n                EditorUtility.SetDirty(o);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_BaseShaderGUI.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 438efd46088d408d8a53f707fa68d976\ntimeCreated: 1469844810\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_BitmapShaderGUI.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\n\nnamespace TMPro.EditorUtilities\n{\n    public class TMP_BitmapShaderGUI : TMP_BaseShaderGUI\n    {\n        static bool s_Face = true;\n\n        protected override void DoGUI()\n        {\n            s_Face = BeginPanel(\"Face\", s_Face);\n            if (s_Face)\n            {\n                DoFacePanel();\n            }\n\n            EndPanel();\n\n            s_DebugExtended = BeginPanel(\"Debug Settings\", s_DebugExtended);\n            if (s_DebugExtended)\n            {\n                DoDebugPanel();\n            }\n\n            EndPanel();\n        }\n\n        void DoFacePanel()\n        {\n            EditorGUI.indentLevel += 1;\n            if (m_Material.HasProperty(ShaderUtilities.ID_FaceTex))\n            {\n                DoColor(\"_FaceColor\", \"Color\");\n                DoTexture2D(\"_FaceTex\", \"Texture\", true);\n            }\n            else\n            {\n                DoColor(\"_Color\", \"Color\");\n                DoSlider(\"_DiffusePower\", \"Diffuse Power\");\n            }\n\n            EditorGUI.indentLevel -= 1;\n\n            EditorGUILayout.Space();\n        }\n\n        void DoDebugPanel()\n        {\n            EditorGUI.indentLevel += 1;\n            DoTexture2D(\"_MainTex\", \"Font Atlas\");\n            if (m_Material.HasProperty(ShaderUtilities.ID_VertexOffsetX))\n            {\n                if (m_Material.HasProperty(ShaderUtilities.ID_Padding))\n                {\n                    EditorGUILayout.Space();\n                    DoFloat(\"_Padding\", \"Padding\");\n                }\n                \n                EditorGUILayout.Space();\n                DoFloat(\"_VertexOffsetX\", \"Offset X\");\n                DoFloat(\"_VertexOffsetY\", \"Offset Y\");\n            }\n\n            if (m_Material.HasProperty(ShaderUtilities.ID_MaskSoftnessX))\n            {\n                EditorGUILayout.Space();\n                DoFloat(\"_MaskSoftnessX\", \"Softness X\");\n                DoFloat(\"_MaskSoftnessY\", \"Softness Y\");\n                DoVector(\"_ClipRect\", \"Clip Rect\", s_LbrtVectorLabels);\n            }\n\n            if (m_Material.HasProperty(ShaderUtilities.ID_StencilID))\n            {\n                EditorGUILayout.Space();\n                DoFloat(\"_Stencil\", \"Stencil ID\");\n                DoFloat(\"_StencilComp\", \"Stencil Comp\");\n            }\n\n            EditorGUI.indentLevel -= 1;\n\n            EditorGUILayout.Space();\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_BitmapShaderGUI.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 806de5a9211448c8b65c8435ebb48dd4\ntimeCreated: 1469998850\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_CharacterPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\nusing UnityEngine.TextCore;\nusing UnityEngine.TextCore.LowLevel;\nusing UnityEditor;\nusing System.Collections;\n\n\nnamespace TMPro.EditorUtilities\n{\n    [CustomPropertyDrawer(typeof(TMP_Character))]\n    public class TMP_CharacterPropertyDrawer : PropertyDrawer\n    {\n        //[SerializeField]\n        //static Material s_InternalSDFMaterial;\n\n        //[SerializeField]\n        //static Material s_InternalBitmapMaterial;\n\n        int m_GlyphSelectedForEditing = -1;\n\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\n        {\n            SerializedProperty prop_Unicode = property.FindPropertyRelative(\"m_Unicode\");\n            SerializedProperty prop_GlyphIndex = property.FindPropertyRelative(\"m_GlyphIndex\");\n            SerializedProperty prop_Scale = property.FindPropertyRelative(\"m_Scale\");\n\n\n            GUIStyle style = new GUIStyle(EditorStyles.label);\n            style.richText = true;\n\n            EditorGUIUtility.labelWidth = 40f;\n            EditorGUIUtility.fieldWidth = 50;\n\n            Rect rect = new Rect(position.x + 50, position.y, position.width, 49);\n\n            // Display non-editable fields\n            if (GUI.enabled == false)\n            {\n                int unicode = prop_Unicode.intValue;\n                EditorGUI.LabelField(new Rect(rect.x, rect.y, 120f, 18), new GUIContent(\"Unicode: <color=#FFFF80>0x\" + unicode.ToString(\"X\") + \"</color>\"), style);\n                EditorGUI.LabelField(new Rect(rect.x + 115, rect.y, 120f, 18), unicode <= 0xFFFF ? new GUIContent(\"UTF16: <color=#FFFF80>\\\\u\" + unicode.ToString(\"X4\") + \"</color>\") : new GUIContent(\"UTF32: <color=#FFFF80>\\\\U\" + unicode.ToString(\"X8\") + \"</color>\"), style);\n                EditorGUI.LabelField(new Rect(rect.x, rect.y + 18, 120, 18), new GUIContent(\"Glyph ID: <color=#FFFF80>\" + prop_GlyphIndex.intValue + \"</color>\"), style);\n                EditorGUI.LabelField(new Rect(rect.x, rect.y + 36, 80, 18), new GUIContent(\"Scale: <color=#FFFF80>\" + prop_Scale.floatValue + \"</color>\"), style);\n\n                // Draw Glyph (if exists)\n                DrawGlyph(position, property);\n            }\n            else // Display editable fields\n            {\n                EditorGUIUtility.labelWidth = 55f;\n                GUI.SetNextControlName(\"Unicode Input\");\n                EditorGUI.BeginChangeCheck();\n                string unicode = EditorGUI.TextField(new Rect(rect.x, rect.y, 120, 18), \"Unicode:\", prop_Unicode.intValue.ToString(\"X\"));\n\n                if (GUI.GetNameOfFocusedControl() == \"Unicode Input\")\n                {\n                    //Filter out unwanted characters.\n                    char chr = Event.current.character;\n                    if ((chr < '0' || chr > '9') && (chr < 'a' || chr > 'f') && (chr < 'A' || chr > 'F'))\n                    {\n                        Event.current.character = '\\0';\n                    }\n                }\n\n                if (EditorGUI.EndChangeCheck())\n                {\n                    // Update Unicode value\n                    prop_Unicode.intValue = TMP_TextUtilities.StringHexToInt(unicode);\n                }\n\n                // Cache current glyph index in case it needs to be restored if the new glyph index is invalid.\n                int currentGlyphIndex = prop_GlyphIndex.intValue;\n\n                EditorGUIUtility.labelWidth = 59f;\n                EditorGUI.BeginChangeCheck();\n                EditorGUI.DelayedIntField(new Rect(rect.x, rect.y + 18, 100, 18), prop_GlyphIndex, new GUIContent(\"Glyph ID:\"));\n                if (EditorGUI.EndChangeCheck())\n                {\n                    // Get a reference to the font asset\n                    TMP_FontAsset fontAsset = property.serializedObject.targetObject as TMP_FontAsset;\n                    \n                    // Make sure new glyph index is valid.\n                    int elementIndex = fontAsset.glyphTable.FindIndex(item => item.index == prop_GlyphIndex.intValue);\n\n                    if (elementIndex == -1)\n                        prop_GlyphIndex.intValue = currentGlyphIndex;\n                    else\n                        fontAsset.m_IsFontAssetLookupTablesDirty = true;\n                }\n\n                int glyphIndex = prop_GlyphIndex.intValue;\n                \n                // Reset glyph selection if new character has been selected.\n                if (GUI.enabled && m_GlyphSelectedForEditing != glyphIndex)\n                    m_GlyphSelectedForEditing = -1;\n\n                // Display button to edit the glyph data.\n                if (GUI.Button(new Rect(rect.x + 120, rect.y + 18, 75, 18), new GUIContent(\"Edit Glyph\")))\n                {\n                    if (m_GlyphSelectedForEditing == -1)\n                        m_GlyphSelectedForEditing = glyphIndex;\n                    else\n                        m_GlyphSelectedForEditing = -1;\n\n                    // Button clicks should not result in potential change.\n                    GUI.changed = false;\n                }\n\n                // Show the glyph property drawer if selected\n                if (glyphIndex == m_GlyphSelectedForEditing && GUI.enabled)\n                {\n                    // Get a reference to the font asset\n                    TMP_FontAsset fontAsset = property.serializedObject.targetObject as TMP_FontAsset;\n\n                    if (fontAsset != null)\n                    {\n                        // Get the index of the glyph in the font asset glyph table.\n                        int elementIndex = fontAsset.glyphTable.FindIndex(item => item.index == glyphIndex);\n                        \n                        if (elementIndex != -1)\n                        {\n                            SerializedProperty prop_GlyphTable = property.serializedObject.FindProperty(\"m_GlyphTable\");\n                            SerializedProperty prop_Glyph = prop_GlyphTable.GetArrayElementAtIndex(elementIndex);\n\n                            SerializedProperty prop_GlyphMetrics = prop_Glyph.FindPropertyRelative(\"m_Metrics\");\n                            SerializedProperty prop_GlyphRect = prop_Glyph.FindPropertyRelative(\"m_GlyphRect\");\n\n                            Rect newRect = EditorGUILayout.GetControlRect(false, 115);\n                            EditorGUI.DrawRect(new Rect(newRect.x + 52, newRect.y - 20, newRect.width - 52, newRect.height - 5), new Color(0.1f, 0.1f, 0.1f, 0.45f));\n                            EditorGUI.DrawRect(new Rect(newRect.x + 53, newRect.y - 19, newRect.width - 54, newRect.height - 7), new Color(0.3f, 0.3f, 0.3f, 0.8f));\n\n                            // Display GlyphRect\n                            newRect.x += 55;\n                            newRect.y -= 18;\n                            newRect.width += 5;\n                            EditorGUI.PropertyField(newRect, prop_GlyphRect);\n\n                            // Display GlyphMetrics\n                            newRect.y += 45;\n                            EditorGUI.PropertyField(newRect, prop_GlyphMetrics);\n\n                            rect.y += 120;\n                        }\n                    }\n                }\n\n                EditorGUIUtility.labelWidth = 39f;\n                EditorGUI.PropertyField(new Rect(rect.x, rect.y + 36, 80, 18), prop_Scale, new GUIContent(\"Scale:\"));\n                \n                // Draw Glyph (if exists)\n                DrawGlyph(position, property);\n            }\n        }\n\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\n        {\n            return 58;\n        }\n\n        void DrawGlyph(Rect position, SerializedProperty property)\n        {\n            // Get a reference to the atlas texture\n            TMP_FontAsset fontAsset = property.serializedObject.targetObject as TMP_FontAsset;\n\n            if (fontAsset == null)\n                return;\n\n            // Get a reference to the Glyph Table\n            SerializedProperty prop_GlyphTable = property.serializedObject.FindProperty(\"m_GlyphTable\");\n            int glyphIndex = property.FindPropertyRelative(\"m_GlyphIndex\").intValue;\n            int elementIndex = fontAsset.glyphTable.FindIndex(item => item.index == glyphIndex);\n\n            // Return if we can't find the glyph\n            if (elementIndex == -1)\n                return;\n\n            SerializedProperty prop_Glyph = prop_GlyphTable.GetArrayElementAtIndex(elementIndex);\n\n            // Get reference to atlas texture.\n            int atlasIndex = prop_Glyph.FindPropertyRelative(\"m_AtlasIndex\").intValue;\n            Texture2D atlasTexture = fontAsset.atlasTextures.Length > atlasIndex ? fontAsset.atlasTextures[atlasIndex] : null;\n\n            if (atlasTexture == null)\n                return;\n\n            Material mat;\n            if (((GlyphRasterModes)fontAsset.atlasRenderMode & GlyphRasterModes.RASTER_MODE_BITMAP) == GlyphRasterModes.RASTER_MODE_BITMAP)\n            {\n                mat = TMP_FontAssetEditor.internalBitmapMaterial;\n\n                if (mat == null)\n                    return;\n\n                mat.mainTexture = atlasTexture;\n                mat.SetColor(\"_Color\", Color.white);\n            }\n            else\n            {\n                mat = TMP_FontAssetEditor.internalSDFMaterial;\n\n                if (mat == null)\n                    return;\n\n                mat.mainTexture = atlasTexture;\n                mat.SetFloat(ShaderUtilities.ID_GradientScale, fontAsset.atlasPadding + 1);\n            }\n\n            // Draw glyph\n            Rect glyphDrawPosition = new Rect(position.x, position.y, 48, 58);\n\n            SerializedProperty prop_GlyphRect = prop_Glyph.FindPropertyRelative(\"m_GlyphRect\");\n\n            int glyphOriginX = prop_GlyphRect.FindPropertyRelative(\"m_X\").intValue;\n            int glyphOriginY = prop_GlyphRect.FindPropertyRelative(\"m_Y\").intValue;\n            int glyphWidth = prop_GlyphRect.FindPropertyRelative(\"m_Width\").intValue;\n            int glyphHeight = prop_GlyphRect.FindPropertyRelative(\"m_Height\").intValue;\n\n            float normalizedHeight = fontAsset.faceInfo.ascentLine - fontAsset.faceInfo.descentLine;\n            float scale = glyphDrawPosition.width / normalizedHeight;\n\n            // Compute the normalized texture coordinates\n            Rect texCoords = new Rect((float)glyphOriginX / atlasTexture.width, (float)glyphOriginY / atlasTexture.height, (float)glyphWidth / atlasTexture.width, (float)glyphHeight / atlasTexture.height);\n\n            if (Event.current.type == EventType.Repaint)\n            {\n                glyphDrawPosition.x += (glyphDrawPosition.width - glyphWidth * scale) / 2;\n                glyphDrawPosition.y += (glyphDrawPosition.height - glyphHeight * scale) / 2;\n                glyphDrawPosition.width = glyphWidth * scale;\n                glyphDrawPosition.height = glyphHeight * scale;\n\n                // Could switch to using the default material of the font asset which would require passing scale to the shader.\n                Graphics.DrawTexture(glyphDrawPosition, atlasTexture, texCoords, 0, 0, 0, 0, new Color(1f, 1f, 1f), mat);\n            }\n        }\n\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_CharacterPropertyDrawer.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 01ada73c4792aba4c937ff5d92cce866\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_ColorGradientAssetMenu.cs",
    "content": "﻿using UnityEditor;\nusing UnityEngine;\nusing System.IO;\nusing System.Collections;\n\n\n\nnamespace TMPro.EditorUtilities\n{\n\n    public static class TMP_ColorGradientAssetMenu\n    {\n        [MenuItem(\"Assets/Create/TextMeshPro/Color Gradient\", false, 115)]\n        public static void CreateColorGradient(MenuCommand context)\n        {\n            string filePath;\n\n            if (Selection.assetGUIDs.Length == 0)\n                filePath = \"Assets/New TMP Color Gradient.asset\";\n            else\n                filePath = AssetDatabase.GUIDToAssetPath(Selection.assetGUIDs[0]);\n\n            if (Directory.Exists(filePath))\n            {\n                filePath += \"/New TMP Color Gradient.asset\";\n            }\n            else\n            {\n                filePath = Path.GetDirectoryName(filePath) + \"/New TMP Color Gradient.asset\";\n            }\n\n            filePath = AssetDatabase.GenerateUniqueAssetPath(filePath);\n\n            // Create new Color Gradient Asset.\n            TMP_ColorGradient colorGradient = ScriptableObject.CreateInstance<TMP_ColorGradient>();\n\n            // Create Asset\n            AssetDatabase.CreateAsset(colorGradient, filePath);\n\n            //EditorUtility.SetDirty(colorGradient);\n\n            AssetDatabase.SaveAssets();\n\n            AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(colorGradient));\n\n            EditorUtility.FocusProjectWindow();\n            Selection.activeObject = colorGradient;\n\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_ColorGradientAssetMenu.cs.meta",
    "content": "fileFormatVersion: 2\nguid: d9647b571c5e44729b71d756b3d55317\ntimeCreated: 1468187791\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_ColorGradientEditor.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.Collections;\n\n\nnamespace TMPro.EditorUtilities\n{\n    [CustomEditor(typeof(TMP_ColorGradient))]\n    public class TMP_ColorGradientEditor : Editor\n    {\n        SerializedProperty m_ColorMode;\n        SerializedProperty m_TopLeftColor;\n        SerializedProperty m_TopRightColor;\n        SerializedProperty m_BottomLeftColor;\n        SerializedProperty m_BottomRightColor;\n\n        void OnEnable()\n        {\n            m_ColorMode = serializedObject.FindProperty(\"colorMode\");\n            m_TopLeftColor = serializedObject.FindProperty(\"topLeft\");\n            m_TopRightColor = serializedObject.FindProperty(\"topRight\");\n            m_BottomLeftColor = serializedObject.FindProperty(\"bottomLeft\");\n            m_BottomRightColor = serializedObject.FindProperty(\"bottomRight\");\n        }\n        \n        public override void OnInspectorGUI()\n        {\n            serializedObject.Update();\n\n            EditorGUI.BeginChangeCheck();\n            EditorGUILayout.PropertyField(m_ColorMode, new GUIContent(\"Color Mode\"));\n            if (EditorGUI.EndChangeCheck())\n            {\n                switch ((ColorMode)m_ColorMode.enumValueIndex)\n                {\n                    case ColorMode.Single:\n                        m_TopRightColor.colorValue = m_TopLeftColor.colorValue;\n                        m_BottomLeftColor.colorValue = m_TopLeftColor.colorValue;\n                        m_BottomRightColor.colorValue = m_TopLeftColor.colorValue;\n                        break;\n                    case ColorMode.HorizontalGradient:\n                        m_BottomLeftColor.colorValue = m_TopLeftColor.colorValue;\n                        m_BottomRightColor.colorValue = m_TopRightColor.colorValue;\n                        break;\n                    case ColorMode.VerticalGradient:\n                        m_TopRightColor.colorValue = m_TopLeftColor.colorValue;\n                        m_BottomRightColor.colorValue = m_BottomLeftColor.colorValue;\n                        break;\n                }\n            }\n            Rect rect;\n            switch ((ColorMode)m_ColorMode.enumValueIndex)\n            {\n                case ColorMode.Single:\n                    EditorGUI.BeginChangeCheck();\n                    rect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight * (EditorGUIUtility.wideMode ? 1 : 2));\n                    EditorGUI.PrefixLabel(rect, new GUIContent(\"Colors\"));\n                    rect.x += EditorGUIUtility.labelWidth;\n                    rect.width = (rect.width - EditorGUIUtility.labelWidth) / (EditorGUIUtility.wideMode ? 1f : 2f);\n                    TMP_EditorUtility.DrawColorProperty(rect, m_TopLeftColor);\n                    if (EditorGUI.EndChangeCheck())\n                    {\n                        m_TopRightColor.colorValue = m_TopLeftColor.colorValue;\n                        m_BottomLeftColor.colorValue = m_TopLeftColor.colorValue;\n                        m_BottomRightColor.colorValue = m_TopLeftColor.colorValue;\n                    }\n                    break;\n\n                case ColorMode.HorizontalGradient:\n                    rect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight * (EditorGUIUtility.wideMode ? 1 : 2));\n                    EditorGUI.PrefixLabel(rect, new GUIContent(\"Colors\"));\n                    rect.x += EditorGUIUtility.labelWidth;\n                    rect.width = (rect.width - EditorGUIUtility.labelWidth) / 2f;\n\n                    EditorGUI.BeginChangeCheck();\n                    TMP_EditorUtility.DrawColorProperty(rect, m_TopLeftColor);\n                    if (EditorGUI.EndChangeCheck())\n                    {\n                        m_BottomLeftColor.colorValue = m_TopLeftColor.colorValue;\n                    }\n\n                    rect.x += rect.width;\n\n                    EditorGUI.BeginChangeCheck();\n                    TMP_EditorUtility.DrawColorProperty(rect, m_TopRightColor);\n                    if (EditorGUI.EndChangeCheck())\n                    {\n                        m_BottomRightColor.colorValue = m_TopRightColor.colorValue;\n                    }\n                    break;\n\n                case ColorMode.VerticalGradient:\n                    rect = EditorGUILayout.GetControlRect(false, EditorGUIUtility.singleLineHeight * (EditorGUIUtility.wideMode ? 1 : 2));\n                    EditorGUI.PrefixLabel(rect, new GUIContent(\"Colors\"));\n                    rect.x += EditorGUIUtility.labelWidth;\n                    rect.width = (rect.width - EditorGUIUtility.labelWidth) / (EditorGUIUtility.wideMode ? 1f : 2f);\n                    rect.height = EditorGUIUtility.singleLineHeight * (EditorGUIUtility.wideMode ? 1 : 2);\n\n                    EditorGUI.BeginChangeCheck();\n                    TMP_EditorUtility.DrawColorProperty(rect, m_TopLeftColor);\n                    if (EditorGUI.EndChangeCheck())\n                    {\n                        m_TopRightColor.colorValue = m_TopLeftColor.colorValue;\n                    }\n\n                    rect = EditorGUILayout.GetControlRect(false, EditorGUIUtility.singleLineHeight * (EditorGUIUtility.wideMode ? 1 : 2));\n                    rect.x += EditorGUIUtility.labelWidth;\n                    rect.width = (rect.width - EditorGUIUtility.labelWidth) / (EditorGUIUtility.wideMode ? 1f : 2f);\n                    rect.height = EditorGUIUtility.singleLineHeight * (EditorGUIUtility.wideMode ? 1 : 2);\n\n                    EditorGUI.BeginChangeCheck();\n                    TMP_EditorUtility.DrawColorProperty(rect, m_BottomLeftColor);\n                    if (EditorGUI.EndChangeCheck())\n                    {\n                        m_BottomRightColor.colorValue = m_BottomLeftColor.colorValue;\n                    }\n                    break;\n\n                case ColorMode.FourCornersGradient:\n                    rect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight * (EditorGUIUtility.wideMode ? 1 : 2));\n                    EditorGUI.PrefixLabel(rect, new GUIContent(\"Colors\"));\n                    rect.x += EditorGUIUtility.labelWidth;\n                    rect.width = (rect.width - EditorGUIUtility.labelWidth)  / 2f;\n                    rect.height = EditorGUIUtility.singleLineHeight * (EditorGUIUtility.wideMode ? 1 : 2);\n                    \n                    TMP_EditorUtility.DrawColorProperty(rect, m_TopLeftColor);\n                    rect.x += rect.width;\n                    TMP_EditorUtility.DrawColorProperty(rect, m_TopRightColor);\n\n                    rect = EditorGUILayout.GetControlRect(false, EditorGUIUtility.singleLineHeight * (EditorGUIUtility.wideMode ? 1 : 2));\n                    rect.x += EditorGUIUtility.labelWidth;\n                    rect.width = (rect.width - EditorGUIUtility.labelWidth) / 2f;\n                    rect.height = EditorGUIUtility.singleLineHeight * (EditorGUIUtility.wideMode ? 1 : 2);\n\n                    TMP_EditorUtility.DrawColorProperty(rect, m_BottomLeftColor);\n                    rect.x += rect.width;\n                    TMP_EditorUtility.DrawColorProperty(rect, m_BottomRightColor);\n                    break;\n            }\n\n            if (serializedObject.ApplyModifiedProperties())\n                TMPro_EventManager.ON_COLOR_GRAIDENT_PROPERTY_CHANGED(target as TMP_ColorGradient);\n\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_ColorGradientEditor.cs.meta",
    "content": "fileFormatVersion: 2\nguid: fcc60c1d6bb544d9b712b652f418ff3a\ntimeCreated: 1468400050\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_DropdownEditor.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing UnityEditor.UI;\nusing UnityEngine.UI;\n\nnamespace TMPro.EditorUtilities\n{\n    [CustomEditor(typeof(TMP_Dropdown), true)]\n    [CanEditMultipleObjects]\n    public class DropdownEditor : SelectableEditor\n    {\n        SerializedProperty m_Template;\n        SerializedProperty m_CaptionText;\n        SerializedProperty m_CaptionImage;\n        SerializedProperty m_ItemText;\n        SerializedProperty m_ItemImage;\n        SerializedProperty m_OnSelectionChanged;\n        SerializedProperty m_Value;\n        SerializedProperty m_Options;\n\n        protected override void OnEnable()\n        {\n            base.OnEnable();\n            m_Template = serializedObject.FindProperty(\"m_Template\");\n            m_CaptionText = serializedObject.FindProperty(\"m_CaptionText\");\n            m_CaptionImage = serializedObject.FindProperty(\"m_CaptionImage\");\n            m_ItemText = serializedObject.FindProperty(\"m_ItemText\");\n            m_ItemImage = serializedObject.FindProperty(\"m_ItemImage\");\n            m_OnSelectionChanged = serializedObject.FindProperty(\"m_OnValueChanged\");\n            m_Value = serializedObject.FindProperty(\"m_Value\");\n            m_Options = serializedObject.FindProperty(\"m_Options\");\n        }\n\n        public override void OnInspectorGUI()\n        {\n            base.OnInspectorGUI();\n            EditorGUILayout.Space();\n\n            serializedObject.Update();\n            EditorGUILayout.PropertyField(m_Template);\n            EditorGUILayout.PropertyField(m_CaptionText);\n            EditorGUILayout.PropertyField(m_CaptionImage);\n            EditorGUILayout.PropertyField(m_ItemText);\n            EditorGUILayout.PropertyField(m_ItemImage);\n            EditorGUILayout.PropertyField(m_Value);\n            EditorGUILayout.PropertyField(m_Options);\n            EditorGUILayout.PropertyField(m_OnSelectionChanged);\n            serializedObject.ApplyModifiedProperties();\n        }\n    }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_DropdownEditor.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 6dbcf248c987476181a37f01a1814975\ntimeCreated: 1446377461\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_EditorCoroutine.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing UnityEditor;\nusing UnityEngine;\n\n\nnamespace TMPro.EditorUtilities\n{\n    /// <summary>\n    /// Simple implementation of coroutine working in the Unity Editor.\n    /// </summary>\n    public class TMP_EditorCoroutine\n    {\n        //private static Dictionary<int, EditorCoroutine> s_ActiveCoroutines;\n\n        readonly IEnumerator coroutine;\n\n        /// <summary>\n        /// Constructor\n        /// </summary>\n        /// <param name=\"routine\"></param>\n        TMP_EditorCoroutine(IEnumerator routine)\n        {\n            this.coroutine = routine;\n        }\n\n\n        /// <summary>\n        /// Starts a new EditorCoroutine.\n        /// </summary>\n        /// <param name=\"newCoroutine\">Coroutine</param>\n        /// <returns>new EditorCoroutine</returns>\n        public static TMP_EditorCoroutine StartCoroutine(IEnumerator routine)\n        {\n            TMP_EditorCoroutine coroutine = new TMP_EditorCoroutine(routine);\n            coroutine.Start();\n\n            // Add coroutine to tracking list\n            //if (s_ActiveCoroutines == null)\n            //    s_ActiveCoroutines = new Dictionary<int, EditorCoroutine>();\n\n            // Add new instance of editor coroutine to dictionary.\n            //s_ActiveCoroutines.Add(coroutine.GetHashCode(), coroutine);\n\n            return coroutine;\n        }\n\n\n        /// <summary>\n        /// Clear delegate list \n        /// </summary>\n        //public static void StopAllEditorCoroutines()\n        //{\n        //    EditorApplication.update = null;\n        //}\n\n\n        /// <summary>\n        /// Register callback for editor updates\n        /// </summary>\n        void Start()\n        {\n            EditorApplication.update += EditorUpdate;\n        }\n\n\n        /// <summary>\n        /// Unregister callback for editor updates.\n        /// </summary>\n        public void Stop()\n        {\n            if (EditorApplication.update != null)\n                EditorApplication.update -= EditorUpdate;\n\n            //s_ActiveCoroutines.Remove(this.GetHashCode());\n        }\n \n\n        /// <summary>\n        /// Delegate function called on editor updates.\n        /// </summary>\n        void EditorUpdate()\n        {\n            // Stop editor coroutine if it does not continue.\n            if (coroutine.MoveNext() == false)\n                Stop();\n\n            // Process the different types of EditorCoroutines.\n            if (coroutine.Current != null)\n            {\n\n            }\n        }\n    }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_EditorCoroutine.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 27a0335dab59ec542aadd6636a5b4ebd\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_EditorPanel.cs",
    "content": "using UnityEngine;\nusing UnityEditor;\n\nnamespace TMPro.EditorUtilities\n{\n\n    [CustomEditor(typeof(TextMeshPro), true), CanEditMultipleObjects]\n    public class TMP_EditorPanel : TMP_BaseEditorPanel\n    {\n        static readonly GUIContent k_SortingLayerLabel = new GUIContent(\"Sorting Layer\", \"Name of the Renderer's sorting layer.\");\n        static readonly GUIContent k_OrderInLayerLabel = new GUIContent(\"Order in Layer\", \"Renderer's order within a sorting layer.\");\n        static readonly GUIContent k_OrthographicLabel = new GUIContent(\"Orthographic Mode\", \"Should be enabled when using an orthographic camera. Instructs the shader to not perform any perspective correction.\");\n        static readonly GUIContent k_VolumetricLabel = new GUIContent(\"Volumetric Setup\", \"Use cubes rather than quads to render the text. Allows for volumetric rendering when combined with a compatible shader.\");\n        \n        SerializedProperty m_IsVolumetricTextProp;\n        \n        SerializedProperty m_IsOrthographicProp;\n\n        Renderer m_Renderer;\n\n        protected override void OnEnable()\n        {\n            base.OnEnable();\n\n            m_IsOrthographicProp = serializedObject.FindProperty(\"m_isOrthographic\");\n            \n            m_IsVolumetricTextProp = serializedObject.FindProperty(\"m_isVolumetricText\");\n\n            m_Renderer = m_TextComponent.GetComponent<Renderer>();\n        }\n\n        protected override void DrawExtraSettings()\n        {\n            Foldout.extraSettings = EditorGUILayout.Foldout(Foldout.extraSettings, k_ExtraSettingsLabel, true, TMP_UIStyleManager.boldFoldout);\n            if (Foldout.extraSettings)\n            {\n                EditorGUI.indentLevel += 1;\n\n                DrawMargins();\n\n                DrawSortingLayer();\n\n                DrawGeometrySorting();\n\n                DrawOrthographicMode();\n                \n                DrawRichText();\n\n                DrawParsing();\n\n                DrawVolumetricSetup();\n\n                DrawKerning();\n\n                DrawPadding();\n\n                EditorGUI.indentLevel -= 1;\n            }\n        }\n\n        protected void DrawSortingLayer()\n        {\n            Undo.RecordObject(m_Renderer, \"Sorting Layer Change\");\n\n            EditorGUI.BeginChangeCheck();\n\n            // SORTING LAYERS\n            var sortingLayerNames = SortingLayerHelper.sortingLayerNames;\n\n            var textComponent = (TextMeshPro)m_TextComponent;\n\n            // Look up the layer name using the current layer ID\n            string oldName = SortingLayerHelper.GetSortingLayerNameFromID(textComponent.sortingLayerID);\n\n            // Use the name to look up our array index into the names list\n            int oldLayerIndex = System.Array.IndexOf(sortingLayerNames, oldName);\n\n            // Show the pop-up for the names\n            EditorGUIUtility.fieldWidth = 0f;\n            int newLayerIndex = EditorGUILayout.Popup(k_SortingLayerLabel, oldLayerIndex, sortingLayerNames);\n            \n            // If the index changes, look up the ID for the new index to store as the new ID\n            if (newLayerIndex != oldLayerIndex)\n            {\n                textComponent.sortingLayerID = SortingLayerHelper.GetSortingLayerIDForIndex(newLayerIndex);\n            }\n\n            // Expose the manual sorting order\n            int newSortingLayerOrder = EditorGUILayout.IntField(k_OrderInLayerLabel, textComponent.sortingOrder);\n            if (newSortingLayerOrder != textComponent.sortingOrder)\n            {\n                textComponent.sortingOrder = newSortingLayerOrder;\n            }\n\n            if (EditorGUI.EndChangeCheck())\n                m_HavePropertiesChanged = true;\n\n            EditorGUILayout.Space();\n        }\n\n        protected void DrawOrthographicMode()\n        {\n            EditorGUI.BeginChangeCheck();\n            EditorGUILayout.PropertyField(m_IsOrthographicProp, k_OrthographicLabel);\n            if (EditorGUI.EndChangeCheck())\n                m_HavePropertiesChanged = true;\n        }\n\n        protected void DrawVolumetricSetup()\n        {\n            EditorGUI.BeginChangeCheck();\n            EditorGUILayout.PropertyField(m_IsVolumetricTextProp, k_VolumetricLabel);\n            if (EditorGUI.EndChangeCheck())\n            {\n                m_HavePropertiesChanged = true;\n                m_TextComponent.textInfo.ResetVertexLayout(m_IsVolumetricTextProp.boolValue);\n            }\n\n            EditorGUILayout.Space();\n        }\n\n        // Method to handle multi object selection\n        protected override bool IsMixSelectionTypes()\n        {\n            GameObject[] objects = Selection.gameObjects;\n            if (objects.Length > 1)\n            {\n                for (int i = 0; i < objects.Length; i++)\n                {\n                    if (objects[i].GetComponent<TextMeshPro>() == null)\n                        return true;\n                }\n            }\n            return false;\n        }\n\n        protected override void OnUndoRedo()\n        {\n            int undoEventId = Undo.GetCurrentGroup();\n            int lastUndoEventId = s_EventId;\n\n            if (undoEventId != lastUndoEventId)\n            {\n                for (int i = 0; i < targets.Length; i++)\n                {\n                    //Debug.Log(\"Undo & Redo Performed detected in Editor Panel. Event ID:\" + Undo.GetCurrentGroup());\n                    TMPro_EventManager.ON_TEXTMESHPRO_PROPERTY_CHANGED(true, targets[i] as TextMeshPro);\n                    s_EventId = undoEventId;\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_EditorPanel.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 34f6695d37a94370a3697f6b068f5d5e\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_EditorUtility.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.Text;\nusing System.IO;\nusing System.Collections;\nusing System.Collections.Generic;\n\n\nnamespace TMPro.EditorUtilities\n{\n\n    public static class TMP_EditorUtility\n    {\n        /// <summary>\n        /// Returns the relative path of the package.\n        /// </summary>\n        public static string packageRelativePath\n        {\n            get\n            {\n                if (string.IsNullOrEmpty(m_PackagePath))\n                    m_PackagePath = GetPackageRelativePath();\n\n                return m_PackagePath;\n            }\n        }\n        [SerializeField]\n        private static string m_PackagePath;\n\n        /// <summary>\n        /// Returns the fully qualified path of the package.\n        /// </summary>\n        public static string packageFullPath\n        {\n            get\n            {\n                if (string.IsNullOrEmpty(m_PackageFullPath))\n                    m_PackageFullPath = GetPackageFullPath();\n\n                return m_PackageFullPath;\n            }\n        }\n        [SerializeField]\n        private static string m_PackageFullPath;\n\n        \n        // Static Fields Related to locating the TextMesh Pro Asset\n        private static string folderPath = \"Not Found\";\n        \n        private static EditorWindow Gameview;\n        private static bool isInitialized = false;\n\n        private static void GetGameview()\n        {\n            System.Reflection.Assembly assembly = typeof(UnityEditor.EditorWindow).Assembly;\n            System.Type type = assembly.GetType(\"UnityEditor.GameView\");\n            Gameview = EditorWindow.GetWindow(type);\n        }\n\n\n        public static void RepaintAll()\n        {\n            if (isInitialized == false)\n            {\n                GetGameview();\n                isInitialized = true;\n            }\n\n            SceneView.RepaintAll();\n            Gameview.Repaint();\n        }\n\n\n        /// <summary>\n        /// Create and return a new asset in a smart location based on the current selection and then select it.\n        /// </summary>\n        /// <param name=\"name\">\n        /// Name of the new asset. Do not include the .asset extension.\n        /// </param>\n        /// <returns>\n        /// The new asset.\n        /// </returns>\n        public static T CreateAsset<T>(string name) where T : ScriptableObject\n        {\n            string path = AssetDatabase.GetAssetPath(Selection.activeObject);\n            if (path.Length == 0)\n            {\n                // no asset selected, place in asset root\n                path = \"Assets/\" + name + \".asset\";\n            }\n            else if (Directory.Exists(path))\n            {\n                // place in currently selected directory\n                path += \"/\" + name + \".asset\";\n            }\n            else {\n                // place in current selection's containing directory\n                path = Path.GetDirectoryName(path) + \"/\" + name + \".asset\";\n            }\n            T asset = ScriptableObject.CreateInstance<T>();\n            AssetDatabase.CreateAsset(asset, AssetDatabase.GenerateUniqueAssetPath(path));\n            EditorUtility.FocusProjectWindow();\n            Selection.activeObject = asset;\n            return asset;\n        }\n\n\n\n        // Function used to find all materials which reference a font atlas so we can update all their references.\n        public static Material[] FindMaterialReferences(TMP_FontAsset fontAsset)\n        {\n            List<Material> refs = new List<Material>();\n            Material mat = fontAsset.material;\n            refs.Add(mat);\n\n            // Get materials matching the search pattern.\n            string searchPattern = \"t:Material\" + \" \" + fontAsset.name.Split(new char[] { ' ' })[0];\n            string[] materialAssetGUIDs = AssetDatabase.FindAssets(searchPattern);\n\n            for (int i = 0; i < materialAssetGUIDs.Length; i++)\n            {\n                string materialPath = AssetDatabase.GUIDToAssetPath(materialAssetGUIDs[i]);\n                Material targetMaterial = AssetDatabase.LoadAssetAtPath<Material>(materialPath);\n\n                if (targetMaterial.HasProperty(ShaderUtilities.ID_MainTex) && targetMaterial.GetTexture(ShaderUtilities.ID_MainTex) != null && mat.GetTexture(ShaderUtilities.ID_MainTex) != null && targetMaterial.GetTexture(ShaderUtilities.ID_MainTex).GetInstanceID() == mat.GetTexture(ShaderUtilities.ID_MainTex).GetInstanceID())\n                {\n                    if (!refs.Contains(targetMaterial))\n                        refs.Add(targetMaterial);\n                }\n                else\n                {\n                    // TODO: Find a more efficient method to unload resources.\n                    //Resources.UnloadAsset(targetMaterial.GetTexture(ShaderUtilities.ID_MainTex));\n                }\n            }\n\n            return refs.ToArray();\n        }\n\n\n        // Function used to find the Font Asset which matches the given Material Preset and Font Atlas Texture.\n        public static TMP_FontAsset FindMatchingFontAsset(Material mat)\n        {\n            if (mat.GetTexture(ShaderUtilities.ID_MainTex) == null) return null;\n\n            // Find the dependent assets of this material.\n            string[] dependentAssets = AssetDatabase.GetDependencies(AssetDatabase.GetAssetPath(mat), false);\n\n            for (int i = 0; i < dependentAssets.Length; i++)\n            {\n                TMP_FontAsset fontAsset = AssetDatabase.LoadAssetAtPath<TMP_FontAsset>(dependentAssets[i]);\n                if (fontAsset != null)\n                    return fontAsset;\n            }\n\n            return null;\n        }\n\n\n        private static string GetPackageRelativePath()\n        {\n            // Check for potential UPM package\n            string packagePath = Path.GetFullPath(\"Packages/com.unity.textmeshpro\");\n            if (Directory.Exists(packagePath))\n            {\n                return \"Packages/com.unity.textmeshpro\";\n            }\n\n            packagePath = Path.GetFullPath(\"Assets/..\");\n            if (Directory.Exists(packagePath))\n            {\n                // Search default location for development package\n                if (Directory.Exists(packagePath + \"/Assets/Packages/com.unity.TextMeshPro/Editor Resources\"))\n                {\n                    return \"Assets/Packages/com.unity.TextMeshPro\";\n                }\n\n                // Search for default location of normal TextMesh Pro AssetStore package\n                if (Directory.Exists(packagePath + \"/Assets/TextMesh Pro/Editor Resources\"))\n                {\n                    return \"Assets/TextMesh Pro\";\n                }\n\n                // Search for potential alternative locations in the user project\n                string[] matchingPaths = Directory.GetDirectories(packagePath, \"TextMesh Pro\", SearchOption.AllDirectories);\n                packagePath = ValidateLocation(matchingPaths, packagePath);\n                if (packagePath != null) return packagePath;\n            }\n\n            return null;\n        }\n\n        private static string GetPackageFullPath()\n        {\n            // Check for potential UPM package\n            string packagePath = Path.GetFullPath(\"Packages/com.unity.textmeshpro\");\n            if (Directory.Exists(packagePath))\n            {\n                return packagePath;\n            }\n\n            packagePath = Path.GetFullPath(\"Assets/..\");\n            if (Directory.Exists(packagePath))\n            {\n                // Search default location for development package\n                if (Directory.Exists(packagePath + \"/Assets/Packages/com.unity.TextMeshPro/Editor Resources\"))\n                {\n                    return packagePath + \"/Assets/Packages/com.unity.TextMeshPro\";\n                }\n\n                // Search for default location of normal TextMesh Pro AssetStore package\n                if (Directory.Exists(packagePath + \"/Assets/TextMesh Pro/Editor Resources\"))\n                {\n                    return packagePath + \"/Assets/TextMesh Pro\";\n                }\n\n                // Search for potential alternative locations in the user project\n                string[] matchingPaths = Directory.GetDirectories(packagePath, \"TextMesh Pro\", SearchOption.AllDirectories);\n                string path = ValidateLocation(matchingPaths, packagePath);\n                if (path != null) return packagePath + path;\n            }\n\n            return null;\n        }\n\n\n        /// <summary>\n        /// Method to validate the location of the asset folder by making sure the GUISkins folder exists.\n        /// </summary>\n        /// <param name=\"paths\"></param>\n        /// <returns></returns>\n        private static string ValidateLocation(string[] paths, string projectPath)\n        {\n            for (int i = 0; i < paths.Length; i++)\n            {\n                // Check if any of the matching directories contain a GUISkins directory.\n                if (Directory.Exists(paths[i] + \"/Editor Resources\"))\n                {\n                    folderPath = paths[i].Replace(projectPath, \"\");\n                    folderPath = folderPath.TrimStart('\\\\', '/');\n                    return folderPath;\n                }\n            }\n\n            return null;\n        }\n\n\n        /// <summary>\n        /// Function which returns a string containing a sequence of Decimal character ranges.\n        /// </summary>\n        /// <param name=\"characterSet\"></param>\n        /// <returns></returns>\n        public static string GetDecimalCharacterSequence(int[] characterSet)\n        {\n            if (characterSet == null || characterSet.Length == 0)\n                return string.Empty;\n\n            string characterSequence = string.Empty;\n            int count = characterSet.Length;\n            int first = characterSet[0];\n            int last = first;\n\n            for (int i = 1; i < count; i++)\n            {\n                if (characterSet[i - 1] + 1 == characterSet[i])\n                {\n                    last = characterSet[i];\n                }\n                else\n                {\n                    if (first == last)\n                        characterSequence += first + \",\";\n                    else\n                        characterSequence += first + \"-\" + last + \",\";\n\n                    first = last = characterSet[i];\n                }\n\n            }\n\n            // handle the final group\n            if (first == last)\n                characterSequence += first;\n            else\n                characterSequence += first + \"-\" + last;\n\n            return characterSequence;\n        }\n\n\n        /// <summary>\n        /// Function which returns a string containing a sequence of Unicode (Hex) character ranges.\n        /// </summary>\n        /// <param name=\"characterSet\"></param>\n        /// <returns></returns>\n        public static string GetUnicodeCharacterSequence(int[] characterSet)\n        {\n            if (characterSet == null || characterSet.Length == 0)\n                return string.Empty;\n\n            string characterSequence = string.Empty;\n            int count = characterSet.Length;\n            int first = characterSet[0];\n            int last = first;\n\n            for (int i = 1; i < count; i++)\n            {\n                if (characterSet[i - 1] + 1 == characterSet[i])\n                {\n                    last = characterSet[i];\n                }\n                else\n                {\n                    if (first == last)\n                        characterSequence += first.ToString(\"X2\") + \",\";\n                    else\n                        characterSequence += first.ToString(\"X2\") + \"-\" + last.ToString(\"X2\") + \",\";\n\n                    first = last = characterSet[i];\n                }\n\n            }\n\n            // handle the final group\n            if (first == last)\n                characterSequence += first.ToString(\"X2\");\n            else\n                characterSequence += first.ToString(\"X2\") + \"-\" + last.ToString(\"X2\");\n\n            return characterSequence;\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"rect\"></param>\n        /// <param name=\"thickness\"></param>\n        /// <param name=\"color\"></param>\n        public static void DrawBox(Rect rect, float thickness, Color color)\n        {\n            EditorGUI.DrawRect(new Rect(rect.x - thickness, rect.y + thickness, rect.width + thickness * 2, thickness), color);\n            EditorGUI.DrawRect(new Rect(rect.x - thickness, rect.y + thickness, thickness, rect.height - thickness * 2), color);\n            EditorGUI.DrawRect(new Rect(rect.x - thickness, rect.y + rect.height - thickness * 2, rect.width + thickness * 2, thickness), color);\n            EditorGUI.DrawRect(new Rect(rect.x + rect.width, rect.y + thickness, thickness, rect.height - thickness * 2), color);\n        }\n\n\n        /// <summary>\n        /// Function to return the horizontal alignment grid value.\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <returns></returns>\n        public static int GetHorizontalAlignmentGridValue(int value)\n        {\n            if ((value & 0x1) == 0x1)\n                return 0;\n            else if ((value & 0x2) == 0x2)\n                return 1;\n            else if ((value & 0x4) == 0x4)\n                return 2;\n            else if ((value & 0x8) == 0x8)\n                return 3;\n            else if ((value & 0x10) == 0x10)\n                return 4;\n            else if ((value & 0x20) == 0x20)\n                return 5;\n\n            return 0;\n        }\n\n        /// <summary>\n        /// Function to return the vertical alignment grid value.\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <returns></returns>\n        public static int GetVerticalAlignmentGridValue(int value)\n        {\n            if ((value & 0x100) == 0x100)\n                return 0;\n            if ((value & 0x200) == 0x200)\n                return 1;\n            if ((value & 0x400) == 0x400)\n                return 2;\n            if ((value & 0x800) == 0x800)\n                return 3;\n            if ((value & 0x1000) == 0x1000)\n                return 4;\n            if ((value & 0x2000) == 0x2000)\n                return 5;\n\n            return 0;\n        }\n\n        public static void DrawColorProperty(Rect rect, SerializedProperty property)\n        {\n            int oldIndent = EditorGUI.indentLevel;\n            EditorGUI.indentLevel = 0;\n            if (EditorGUIUtility.wideMode)\n            {\n                EditorGUI.PropertyField(new Rect(rect.x, rect.y, 50f, rect.height), property, GUIContent.none);\n                rect.x += 50f;\n                rect.width = Mathf.Min(100f, rect.width - 55f);\n            }\n            else\n            {\n                rect.height /= 2f;\n                rect.width = Mathf.Min(100f, rect.width - 5f);\n                EditorGUI.PropertyField(rect, property, GUIContent.none);\n                rect.y += rect.height;\n            }\n\n            EditorGUI.BeginChangeCheck();\n            string colorString = EditorGUI.TextField(rect, string.Format(\"#{0}\", ColorUtility.ToHtmlStringRGBA(property.colorValue)));\n            if (EditorGUI.EndChangeCheck())\n            {\n                if (ColorUtility.TryParseHtmlString(colorString, out Color color))\n                {\n                    property.colorValue = color;\n                }\n            }\n            EditorGUI.indentLevel = oldIndent;\n        }\n        \n        public static bool EditorToggle(Rect position, bool value, GUIContent content, GUIStyle style)\n        {\n            var id = GUIUtility.GetControlID(content, FocusType.Keyboard, position);\n            var evt = Event.current;\n\n            // Toggle selected toggle on space or return key\n            if (GUIUtility.keyboardControl == id && evt.type == EventType.KeyDown && (evt.keyCode == KeyCode.Space || evt.keyCode == KeyCode.Return || evt.keyCode == KeyCode.KeypadEnter))\n            {\n                value = !value;\n                evt.Use();\n                GUI.changed = true;\n            }\n\n            if (evt.type == EventType.MouseDown && position.Contains(Event.current.mousePosition))\n            {\n                GUIUtility.keyboardControl = id;\n                EditorGUIUtility.editingTextField = false;\n                HandleUtility.Repaint();\n            }\n            \n            return GUI.Toggle(position, id, value, content, style);\n        }\n\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_EditorUtility.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 2300e75732d74890b38a8ff257a3ae15\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_FontAssetEditor.cs",
    "content": "using UnityEngine;\nusing UnityEditor;\nusing UnityEditorInternal;\nusing System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine.TextCore;\nusing UnityEngine.TextCore.LowLevel;\n\n\nnamespace TMPro.EditorUtilities\n{\n\n    [CustomPropertyDrawer(typeof(TMP_FontWeightPair))]\n    public class FontWeightDrawer : PropertyDrawer\n    {\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\n        {\n            SerializedProperty prop_regular = property.FindPropertyRelative(\"regularTypeface\");\n            SerializedProperty prop_italic = property.FindPropertyRelative(\"italicTypeface\");\n\n            float width = position.width;\n\n            position.width = EditorGUIUtility.labelWidth;\n            EditorGUI.LabelField(position, label);\n\n            int oldIndent = EditorGUI.indentLevel;\n            EditorGUI.indentLevel = 0;\n\n            // NORMAL TYPEFACE\n            if (label.text[0] == '4') GUI.enabled = false;\n            position.x += position.width; position.width = (width - position.width) / 2;\n            EditorGUI.PropertyField(position, prop_regular, GUIContent.none);\n\n            // ITALIC TYPEFACE\n            GUI.enabled = true;\n            position.x += position.width;\n            EditorGUI.PropertyField(position, prop_italic, GUIContent.none);\n\n            EditorGUI.indentLevel = oldIndent;\n        }\n    }\n\n    [CustomEditor(typeof(TMP_FontAsset))]\n    public class TMP_FontAssetEditor : Editor\n    {\n        private struct UI_PanelState\n        {\n            public static bool faceInfoPanel = true;\n            public static bool generationSettingsPanel = true;\n            public static bool fontAtlasInfoPanel = true;\n            public static bool fontWeightPanel = true;\n            public static bool fallbackFontAssetPanel = true;\n            public static bool glyphTablePanel = false;\n            public static bool characterTablePanel = false;\n            public static bool fontFeatureTablePanel = false;\n        }\n\n        private struct AtlasSettings\n        {\n            public GlyphRenderMode glyphRenderMode;\n            public int pointSize;\n            public int padding;\n            public int atlasWidth;\n            public int atlasHeight;\n        }\n\n        /// <summary>\n        /// Material used to display SDF glyphs in the Character and Glyph tables.\n        /// </summary>\n        internal static Material internalSDFMaterial\n        {\n            get\n            {\n                if (s_InternalSDFMaterial == null)\n                {\n                    Shader shader = Shader.Find(\"Hidden/TextMeshPro/Internal/Distance Field SSD\");\n\n                    if (shader != null)\n                        s_InternalSDFMaterial = new Material(shader);\n                }\n\n                return s_InternalSDFMaterial;\n            }\n        }\n        static Material s_InternalSDFMaterial;\n\n        /// <summary>\n        /// Material used to display Bitmap glyphs in the Character and Glyph tables.\n        /// </summary>\n        internal static Material internalBitmapMaterial\n        {\n            get\n            {\n                if (s_InternalBitmapMaterial == null)\n                {\n                    Shader shader = Shader.Find(\"Hidden/Internal-GUITextureClipText\");\n\n                    if (shader != null)\n                        s_InternalBitmapMaterial = new Material(shader);\n                }\n\n                return s_InternalBitmapMaterial;\n            }\n        }\n        static Material s_InternalBitmapMaterial;\n\n        private static string[] s_UiStateLabel = new string[] { \"<i>(Click to collapse)</i> \", \"<i>(Click to expand)</i> \" };\n        private GUIContent[] m_AtlasResolutionLabels = { new GUIContent(\"8\"), new GUIContent(\"16\"), new GUIContent(\"32\"), new GUIContent(\"64\"), new GUIContent(\"128\"), new GUIContent(\"256\"), new GUIContent(\"512\"), new GUIContent(\"1024\"), new GUIContent(\"2048\"), new GUIContent(\"4096\"), new GUIContent(\"8192\") };\n        private int[] m_AtlasResolutions = { 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192 };\n\n        private struct Warning\n        {\n            public bool isEnabled;\n            public double expirationTime;\n        }\n\n        private int m_CurrentGlyphPage = 0;\n        private int m_CurrentCharacterPage = 0;\n        private int m_CurrentKerningPage = 0;\n\n        private int m_SelectedGlyphRecord = -1;\n        private int m_SelectedCharacterRecord = -1;\n        private int m_SelectedAdjustmentRecord = -1;\n\n        private string m_dstGlyphID;\n        private string m_dstUnicode;\n        private const string k_placeholderUnicodeHex = \"<i>New Unicode (Hex)</i>\";\n        private string m_unicodeHexLabel = k_placeholderUnicodeHex;\n        private const string k_placeholderGlyphID = \"<i>New Glyph ID</i>\";\n        private string m_GlyphIDLabel = k_placeholderGlyphID;\n\n        private Warning m_AddGlyphWarning;\n        private Warning m_AddCharacterWarning;\n        private bool m_DisplayDestructiveChangeWarning;\n        private AtlasSettings m_AtlasSettings;\n        private bool m_MaterialPresetsRequireUpdate;\n\n        private string m_GlyphSearchPattern;\n        private List<int> m_GlyphSearchList;\n\n        private string m_CharacterSearchPattern;\n        private List<int> m_CharacterSearchList;\n\n        private string m_KerningTableSearchPattern;\n        private List<int> m_KerningTableSearchList;\n        \n        private bool m_isSearchDirty;\n\n        private const string k_UndoRedo = \"UndoRedoPerformed\";\n\n        private SerializedProperty m_AtlasPopulationMode_prop;\n        private SerializedProperty font_atlas_prop;\n        private SerializedProperty font_material_prop;\n\n        private SerializedProperty m_AtlasRenderMode_prop;\n        private SerializedProperty m_SamplingPointSize_prop;\n        private SerializedProperty m_AtlasPadding_prop;\n        private SerializedProperty m_AtlasWidth_prop;\n        private SerializedProperty m_AtlasHeight_prop;\n\n        private SerializedProperty fontWeights_prop;\n\n        //private SerializedProperty fallbackFontAssets_prop;\n        private ReorderableList m_list;\n\n        private SerializedProperty font_normalStyle_prop;\n        private SerializedProperty font_normalSpacing_prop;\n\n        private SerializedProperty font_boldStyle_prop;\n        private SerializedProperty font_boldSpacing_prop;\n\n        private SerializedProperty font_italicStyle_prop;\n        private SerializedProperty font_tabSize_prop;\n\n        private SerializedProperty m_FaceInfo_prop;\n        private SerializedProperty m_GlyphTable_prop;\n        private SerializedProperty m_CharacterTable_prop;\n\n        private TMP_FontFeatureTable m_FontFeatureTable;\n        private SerializedProperty m_FontFeatureTable_prop;\n        private SerializedProperty m_GlyphPairAdjustmentRecords_prop;\n\n        private TMP_SerializedPropertyHolder m_SerializedPropertyHolder;\n        private SerializedProperty m_EmptyGlyphPairAdjustmentRecord_prop;\n\n        private TMP_FontAsset m_fontAsset;\n\n        private Material[] m_materialPresets;\n\n        private bool isAssetDirty = false;\n\n        private int errorCode;\n\n        private System.DateTime timeStamp;\n\n\n        public void OnEnable()\n        {\n            m_FaceInfo_prop = serializedObject.FindProperty(\"m_FaceInfo\");\n\n            font_atlas_prop = serializedObject.FindProperty(\"m_AtlasTextures\").GetArrayElementAtIndex(0);\n            font_material_prop = serializedObject.FindProperty(\"material\");\n\n            m_AtlasPopulationMode_prop = serializedObject.FindProperty(\"m_AtlasPopulationMode\");\n            m_AtlasRenderMode_prop = serializedObject.FindProperty(\"m_AtlasRenderMode\");\n            m_SamplingPointSize_prop = m_FaceInfo_prop.FindPropertyRelative(\"m_PointSize\");\n            m_AtlasPadding_prop = serializedObject.FindProperty(\"m_AtlasPadding\");\n            m_AtlasWidth_prop = serializedObject.FindProperty(\"m_AtlasWidth\");\n            m_AtlasHeight_prop = serializedObject.FindProperty(\"m_AtlasHeight\");\n\n            fontWeights_prop = serializedObject.FindProperty(\"m_FontWeightTable\");\n\n            m_list = new ReorderableList(serializedObject, serializedObject.FindProperty(\"m_FallbackFontAssetTable\"), true, true, true, true);\n\n            m_list.drawElementCallback = (Rect rect, int index, bool isActive, bool isFocused) =>\n            {\n                var element = m_list.serializedProperty.GetArrayElementAtIndex(index);\n                rect.y += 2;\n                EditorGUI.PropertyField(new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight), element, GUIContent.none);\n            };\n\n            m_list.drawHeaderCallback = rect =>\n            {\n                EditorGUI.LabelField(rect, \"Fallback List\");\n            };\n\n            // Clean up fallback list in the event if contains null elements.\n            CleanFallbackFontAssetTable();\n\n            font_normalStyle_prop = serializedObject.FindProperty(\"normalStyle\");\n            font_normalSpacing_prop = serializedObject.FindProperty(\"normalSpacingOffset\");\n\n            font_boldStyle_prop = serializedObject.FindProperty(\"boldStyle\");\n            font_boldSpacing_prop = serializedObject.FindProperty(\"boldSpacing\");\n\n            font_italicStyle_prop = serializedObject.FindProperty(\"italicStyle\");\n            font_tabSize_prop = serializedObject.FindProperty(\"tabSize\");\n\n            m_CharacterTable_prop = serializedObject.FindProperty(\"m_CharacterTable\");\n            m_GlyphTable_prop = serializedObject.FindProperty(\"m_GlyphTable\");\n\n            m_FontFeatureTable_prop = serializedObject.FindProperty(\"m_FontFeatureTable\");\n            m_GlyphPairAdjustmentRecords_prop = m_FontFeatureTable_prop.FindPropertyRelative(\"m_GlyphPairAdjustmentRecords\");\n\n            m_fontAsset = target as TMP_FontAsset;\n            m_FontFeatureTable = m_fontAsset.fontFeatureTable;\n\n            // Upgrade Font Feature Table if necessary\n            if (m_fontAsset.m_KerningTable != null && m_fontAsset.m_KerningTable.kerningPairs != null && m_fontAsset.m_KerningTable.kerningPairs.Count > 0)\n                m_fontAsset.ReadFontAssetDefinition();\n\n            // Create serialized object to allow us to use a serialized property of an empty kerning pair.\n            m_SerializedPropertyHolder = CreateInstance<TMP_SerializedPropertyHolder>();\n            m_SerializedPropertyHolder.fontAsset = m_fontAsset;\n            SerializedObject internalSerializedObject = new SerializedObject(m_SerializedPropertyHolder);\n            m_EmptyGlyphPairAdjustmentRecord_prop = internalSerializedObject.FindProperty(\"glyphPairAdjustmentRecord\");\n\n            m_materialPresets = TMP_EditorUtility.FindMaterialReferences(m_fontAsset);\n\n            m_GlyphSearchList = new List<int>();\n            m_KerningTableSearchList = new List<int>();\n        }\n\n\n        public void OnDisable()\n        {\n            // Revert changes if user closes or changes selection without having made a choice.\n            if (m_DisplayDestructiveChangeWarning)\n            {\n                m_DisplayDestructiveChangeWarning = false;\n                RestoreAtlasGenerationSettings();\n                GUIUtility.keyboardControl = 0;\n\n                serializedObject.ApplyModifiedProperties();\n            }\n        }\n\n\n        public override void OnInspectorGUI()\n        {\n            //Debug.Log(\"OnInspectorGUI Called.\");\n\n            Event currentEvent = Event.current;\n\n            serializedObject.Update();\n\n            Rect rect = EditorGUILayout.GetControlRect(false, 24);\n            float labelWidth = EditorGUIUtility.labelWidth;\n            float fieldWidth = EditorGUIUtility.fieldWidth;\n\n            // FACE INFO PANEL\n            #region Face info\n            GUI.Label(rect, new GUIContent(\"<b>Face Info</b> - v\" + m_fontAsset.version), TMP_UIStyleManager.sectionHeader);\n\n            rect.x += rect.width - 132f;\n            rect.y += 2;\n            rect.width = 130f;\n            rect.height = 18f;\n            if (GUI.Button(rect, new GUIContent(\"Update Atlas Texture\")))\n            {\n                TMPro_FontAssetCreatorWindow.ShowFontAtlasCreatorWindow(target as TMP_FontAsset);\n            }\n\n            EditorGUI.indentLevel = 1;\n            GUI.enabled = false; // Lock UI\n\n            // TODO : Consider creating a property drawer for these.\n            EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative(\"m_FamilyName\"));\n            EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative(\"m_StyleName\"));\n            EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative(\"m_PointSize\"));\n\n            GUI.enabled = true;\n\n            EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative(\"m_Scale\"));\n            EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative(\"m_LineHeight\"));\n\n            EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative(\"m_AscentLine\"));\n            EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative(\"m_CapLine\"));\n            EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative(\"m_MeanLine\"));\n            EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative(\"m_Baseline\"));\n            EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative(\"m_DescentLine\"));\n            EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative(\"m_UnderlineOffset\"));\n            EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative(\"m_UnderlineThickness\"));\n            EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative(\"m_StrikethroughOffset\"));\n            //EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative(\"strikethroughThickness\"));\n            EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative(\"m_SuperscriptOffset\"));\n            EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative(\"m_SuperscriptSize\"));\n            EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative(\"m_SubscriptOffset\"));\n            EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative(\"m_SubscriptSize\"));\n            EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative(\"m_TabWidth\"));\n            // TODO : Add clamping for some of these values.\n            //subSize_prop.floatValue = Mathf.Clamp(subSize_prop.floatValue, 0.25f, 1f);\n\n            EditorGUILayout.Space();\n            #endregion\n\n            // GENERATION SETTINGS\n            #region Generation Settings\n            rect = EditorGUILayout.GetControlRect(false, 24);\n\n            if (GUI.Button(rect, new GUIContent(\"<b>Generation Settings</b>\"), TMP_UIStyleManager.sectionHeader))\n                UI_PanelState.generationSettingsPanel = !UI_PanelState.generationSettingsPanel;\n\n            GUI.Label(rect, (UI_PanelState.generationSettingsPanel ? \"\" : s_UiStateLabel[1]), TMP_UIStyleManager.rightLabel);\n\n            if (UI_PanelState.generationSettingsPanel)\n            {\n                EditorGUI.indentLevel = 1;\n\n                EditorGUI.BeginChangeCheck();\n                Font sourceFont = (Font)EditorGUILayout.ObjectField(\"Source Font File\", m_fontAsset.m_SourceFontFile_EditorRef, typeof(Font), false);\n                if (EditorGUI.EndChangeCheck())\n                {\n                    string guid = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(sourceFont));\n                    m_fontAsset.m_SourceFontFileGUID = guid;\n                    m_fontAsset.m_SourceFontFile_EditorRef = sourceFont;\n                }\n\n                EditorGUI.BeginChangeCheck();\n                EditorGUILayout.PropertyField(m_AtlasPopulationMode_prop, new GUIContent(\"Atlas Population Mode\"));\n                if (EditorGUI.EndChangeCheck())\n                {\n                    serializedObject.ApplyModifiedProperties();\n\n                    bool isDatabaseRefreshRequired = false;\n\n                    if (m_AtlasPopulationMode_prop.intValue == 0)\n                    {\n                        m_fontAsset.sourceFontFile = null;\n\n                        // Set atlas textures to non readable.\n                        //for (int i = 0; i < m_fontAsset.atlasTextures.Length; i++)\n                        //{\n                        //    Texture2D tex = m_fontAsset.atlasTextures[i];\n\n                        //    if (tex != null && tex.isReadable)\n                        //    {\n                        //        string texPath = AssetDatabase.GetAssetPath(tex);\n                        //        var texImporter = AssetImporter.GetAtPath(texPath) as TextureImporter;\n                        //        if (texImporter != null)\n                        //        {\n                        //            texImporter.isReadable = false;\n                        //            AssetDatabase.ImportAsset(texPath);\n                        //            isDatabaseRefreshRequired = true;\n                        //        }\n                        //    }\n                        //}\n\n                        Debug.Log(\"Atlas Population mode set to [Static].\");\n                    }\n                    else if (m_AtlasPopulationMode_prop.intValue == 1)\n                    {\n                        if (m_fontAsset.m_SourceFontFile_EditorRef.dynamic == false)\n                        {\n                            Debug.LogWarning(\"Please set the [\" + m_fontAsset.name + \"] font to dynamic mode as this is required for Dynamic SDF support.\", m_fontAsset.m_SourceFontFile_EditorRef);\n                            m_AtlasPopulationMode_prop.intValue = 0;\n\n                            serializedObject.ApplyModifiedProperties();\n                        }\n                        else\n                        {\n                            m_fontAsset.sourceFontFile = m_fontAsset.m_SourceFontFile_EditorRef;\n\n                            /*\n                            // Set atlas textures to non readable.\n                            for (int i = 0; i < m_fontAsset.atlasTextures.Length; i++)\n                            {\n                                Texture2D tex = m_fontAsset.atlasTextures[i];\n\n                                if (tex != null && tex.isReadable == false)\n                                {\n                                    string texPath = AssetDatabase.GetAssetPath(tex.GetInstanceID());\n                                    Object[] paths = AssetDatabase.LoadAllAssetsAtPath(texPath);\n                                    var texImporter = AssetImporter.GetAtPath(texPath) as TextureImporter;\n                                    if (texImporter != null)\n                                    {\n                                        texImporter.isReadable = true;\n                                        AssetDatabase.ImportAsset(texPath);\n                                        isDatabaseRefreshRequired = true;\n                                    }\n                                }\n                            }\n                            */\n                            Debug.Log(\"Atlas Population mode set to [Dynamic].\");\n                        }\n                    }\n\n                    if (isDatabaseRefreshRequired)\n                        AssetDatabase.Refresh();\n\n                    serializedObject.Update();\n                    isAssetDirty = true;\n                }\n\n                GUI.enabled = true;\n                // Save state of atlas settings\n                if (m_DisplayDestructiveChangeWarning == false)\n                {\n                    SavedAtlasGenerationSettings();\n                    //Undo.RegisterCompleteObjectUndo(m_fontAsset, \"Font Asset Changes\");\n                }\n\n                EditorGUI.BeginChangeCheck();\n                // TODO: Switch shaders depending on GlyphRenderMode.\n                EditorGUILayout.PropertyField(m_AtlasRenderMode_prop);\n                EditorGUILayout.PropertyField(m_SamplingPointSize_prop, new GUIContent(\"Sampling Point Size\"));\n                if (EditorGUI.EndChangeCheck())\n                {\n                    m_DisplayDestructiveChangeWarning = true;\n                }\n\n                // Changes to these properties require updating Material Presets for this font asset.\n                EditorGUI.BeginChangeCheck();\n                EditorGUILayout.PropertyField(m_AtlasPadding_prop, new GUIContent(\"Padding\"));\n                EditorGUILayout.IntPopup(m_AtlasWidth_prop, m_AtlasResolutionLabels, m_AtlasResolutions, new GUIContent(\"Atlas Width\"));\n                EditorGUILayout.IntPopup(m_AtlasHeight_prop, m_AtlasResolutionLabels, m_AtlasResolutions, new GUIContent(\"Atlas Height\"));\n                if (EditorGUI.EndChangeCheck())\n                {\n                    m_MaterialPresetsRequireUpdate = true;\n                    m_DisplayDestructiveChangeWarning = true;\n                }\n\n                if (m_DisplayDestructiveChangeWarning)\n                {\n                    // These changes are destructive on the font asset\n                    rect = EditorGUILayout.GetControlRect(false, 60);\n                    rect.x += 15;\n                    rect.width -= 15;\n                    EditorGUI.HelpBox(rect, \"Changing these settings will clear the font asset's character, glyph and texture data.\", MessageType.Warning);\n\n                    if (GUI.Button(new Rect(rect.width - 140, rect.y + 36, 80, 18), new GUIContent(\"Apply\")))\n                    {\n                        m_DisplayDestructiveChangeWarning = false;\n\n                        // Update face info is sampling point size was changed.\n                        if (m_AtlasSettings.pointSize != m_SamplingPointSize_prop.intValue)\n                        {\n                            FontEngine.LoadFontFace(m_fontAsset.sourceFontFile, m_SamplingPointSize_prop.intValue);\n                            m_fontAsset.faceInfo = FontEngine.GetFaceInfo();\n                        }\n\n                        // Update material\n                        m_fontAsset.material.SetFloat(ShaderUtilities.ID_TextureWidth, m_AtlasWidth_prop.intValue);\n                        m_fontAsset.material.SetFloat(ShaderUtilities.ID_TextureHeight, m_AtlasHeight_prop.intValue);\n                        m_fontAsset.material.SetFloat(ShaderUtilities.ID_GradientScale, m_AtlasPadding_prop.intValue + 1);\n\n                        // Update material presets if any of the relevant properties have been changed.\n                        if (m_MaterialPresetsRequireUpdate)\n                        {\n                            m_MaterialPresetsRequireUpdate = false;\n\n                            Material[] materialPresets = TMP_EditorUtility.FindMaterialReferences(m_fontAsset);\n                            for (int i = 0; i < materialPresets.Length; i++)\n                            {\n                                Material mat = materialPresets[i];\n\n                                mat.SetFloat(ShaderUtilities.ID_TextureWidth, m_AtlasWidth_prop.intValue);\n                                mat.SetFloat(ShaderUtilities.ID_TextureHeight, m_AtlasHeight_prop.intValue);\n                                mat.SetFloat(ShaderUtilities.ID_GradientScale, m_AtlasPadding_prop.intValue + 1);\n                            }\n                        }\n\n                        m_fontAsset.ClearFontAssetData();\n                        GUIUtility.keyboardControl = 0;\n                        isAssetDirty = true;\n\n                        // Update Font Asset Creation Settings to reflect new changes.\n                        UpdateFontAssetCreationSettings();\n\n                        // TODO: Clear undo buffers.\n                        //Undo.ClearUndo(m_fontAsset);\n                    }\n\n                    if (GUI.Button(new Rect(rect.width - 56, rect.y + 36, 80, 18), new GUIContent(\"Revert\")))\n                    {\n                        m_DisplayDestructiveChangeWarning = false;\n                        RestoreAtlasGenerationSettings();\n                        GUIUtility.keyboardControl = 0;\n\n                        // TODO: Clear undo buffers.\n                        //Undo.ClearUndo(m_fontAsset);\n                    }\n                }\n                EditorGUILayout.Space();\n            }\n            #endregion\n\n            // ATLAS & MATERIAL PANEL\n            #region Atlas & Material\n            rect = EditorGUILayout.GetControlRect(false, 24);\n\n            if (GUI.Button(rect, new GUIContent(\"<b>Atlas & Material</b>\"), TMP_UIStyleManager.sectionHeader))\n                UI_PanelState.fontAtlasInfoPanel = !UI_PanelState.fontAtlasInfoPanel;\n\n            GUI.Label(rect, (UI_PanelState.fontAtlasInfoPanel ? \"\" : s_UiStateLabel[1]), TMP_UIStyleManager.rightLabel);\n\n            if (UI_PanelState.fontAtlasInfoPanel)\n            {\n                EditorGUI.indentLevel = 1;\n\n                GUI.enabled = false;\n                EditorGUILayout.PropertyField(font_atlas_prop, new GUIContent(\"Font Atlas\"));\n                EditorGUILayout.PropertyField(font_material_prop, new GUIContent(\"Font Material\"));\n                GUI.enabled = true;\n                EditorGUILayout.Space();\n            }\n            #endregion\n\n            string evt_cmd = Event.current.commandName; // Get Current Event CommandName to check for Undo Events\n\n            // FONT WEIGHT PANEL\n            #region Font Weights\n            rect = EditorGUILayout.GetControlRect(false, 24);\n\n            if (GUI.Button(rect, new GUIContent(\"<b>Font Weights</b>\", \"The Font Assets that will be used for different font weights and the settings used to simulate a typeface when no asset is available.\"), TMP_UIStyleManager.sectionHeader))\n                UI_PanelState.fontWeightPanel = !UI_PanelState.fontWeightPanel;\n\n            GUI.Label(rect, (UI_PanelState.fontWeightPanel ? \"\" : s_UiStateLabel[1]), TMP_UIStyleManager.rightLabel);\n\n            if (UI_PanelState.fontWeightPanel)\n            {\n                EditorGUIUtility.labelWidth *= 0.75f;\n                EditorGUIUtility.fieldWidth *= 0.25f;\n\n                EditorGUILayout.BeginVertical();\n                EditorGUI.indentLevel = 1;\n                rect = EditorGUILayout.GetControlRect(true);\n                rect.x += EditorGUIUtility.labelWidth;\n                rect.width = (rect.width - EditorGUIUtility.labelWidth) / 2f;\n                GUI.Label(rect, \"Regular Tyepface\", EditorStyles.label);\n                rect.x += rect.width;\n                GUI.Label(rect, \"Italic Typeface\", EditorStyles.label);\n                \n                EditorGUI.indentLevel = 1;\n\n                EditorGUILayout.PropertyField(fontWeights_prop.GetArrayElementAtIndex(1), new GUIContent(\"100 - Thin\"));\n                EditorGUILayout.PropertyField(fontWeights_prop.GetArrayElementAtIndex(2), new GUIContent(\"200 - Extra-Light\"));\n                EditorGUILayout.PropertyField(fontWeights_prop.GetArrayElementAtIndex(3), new GUIContent(\"300 - Light\"));\n                EditorGUILayout.PropertyField(fontWeights_prop.GetArrayElementAtIndex(4), new GUIContent(\"400 - Regular\"));\n                EditorGUILayout.PropertyField(fontWeights_prop.GetArrayElementAtIndex(5), new GUIContent(\"500 - Medium\"));\n                EditorGUILayout.PropertyField(fontWeights_prop.GetArrayElementAtIndex(6), new GUIContent(\"600 - Semi-Bold\"));\n                EditorGUILayout.PropertyField(fontWeights_prop.GetArrayElementAtIndex(7), new GUIContent(\"700 - Bold\"));\n                EditorGUILayout.PropertyField(fontWeights_prop.GetArrayElementAtIndex(8), new GUIContent(\"800 - Heavy\"));\n                EditorGUILayout.PropertyField(fontWeights_prop.GetArrayElementAtIndex(9), new GUIContent(\"900 - Black\"));\n\n                EditorGUILayout.EndVertical();\n\n                EditorGUILayout.Space();\n\n                EditorGUILayout.BeginVertical();\n\n                EditorGUILayout.BeginHorizontal();\n                EditorGUILayout.PropertyField(font_normalStyle_prop, new GUIContent(\"Normal Weight\"));\n                font_normalStyle_prop.floatValue = Mathf.Clamp(font_normalStyle_prop.floatValue, -3.0f, 3.0f);\n                if (GUI.changed || evt_cmd == k_UndoRedo)\n                {\n                    GUI.changed = false;\n\n                    // Modify the material property on matching material presets.\n                    for (int i = 0; i < m_materialPresets.Length; i++)\n                        m_materialPresets[i].SetFloat(\"_WeightNormal\", font_normalStyle_prop.floatValue);\n                }\n\n                EditorGUILayout.PropertyField(font_boldStyle_prop, new GUIContent(\"Bold Weight\"));\n                font_boldStyle_prop.floatValue = Mathf.Clamp(font_boldStyle_prop.floatValue, -3.0f, 3.0f);\n                if (GUI.changed || evt_cmd == k_UndoRedo)\n                {\n                    GUI.changed = false;\n\n                    // Modify the material property on matching material presets.\n                    for (int i = 0; i < m_materialPresets.Length; i++)\n                        m_materialPresets[i].SetFloat(\"_WeightBold\", font_boldStyle_prop.floatValue);\n                }\n                EditorGUILayout.EndHorizontal();\n                \n                EditorGUILayout.BeginHorizontal();\n                EditorGUILayout.PropertyField(font_normalSpacing_prop, new GUIContent(\"Spacing Offset\"));\n                font_normalSpacing_prop.floatValue = Mathf.Clamp(font_normalSpacing_prop.floatValue, -100, 100);\n                if (GUI.changed || evt_cmd == k_UndoRedo)\n                {\n                    GUI.changed = false;\n                }\n\n                EditorGUILayout.PropertyField(font_boldSpacing_prop, new GUIContent(\"Bold Spacing\"));\n                font_boldSpacing_prop.floatValue = Mathf.Clamp(font_boldSpacing_prop.floatValue, 0, 100);\n                if (GUI.changed || evt_cmd == k_UndoRedo)\n                {\n                    GUI.changed = false;\n                }\n                EditorGUILayout.EndHorizontal();\n                \n                EditorGUILayout.BeginHorizontal();\n                EditorGUILayout.PropertyField(font_italicStyle_prop, new GUIContent(\"Italic Style\"));\n                font_italicStyle_prop.intValue = Mathf.Clamp(font_italicStyle_prop.intValue, 15, 60);\n                \n                EditorGUILayout.PropertyField(font_tabSize_prop, new GUIContent(\"Tab Multiple\"));\n                EditorGUILayout.EndHorizontal();\n                EditorGUILayout.EndVertical();\n                EditorGUILayout.Space();\n            }\n\n            EditorGUIUtility.labelWidth = 0;\n            EditorGUIUtility.fieldWidth = 0;\n            #endregion\n\n            // FALLBACK FONT ASSETS\n            #region Fallback Font Asset\n            rect = EditorGUILayout.GetControlRect(false, 24);\n            EditorGUI.indentLevel = 0;\n            if (GUI.Button(rect, new GUIContent(\"<b>Fallback Font Assets</b>\", \"Select the Font Assets that will be searched and used as fallback when characters are missing from this font asset.\"), TMP_UIStyleManager.sectionHeader))\n                UI_PanelState.fallbackFontAssetPanel = !UI_PanelState.fallbackFontAssetPanel;\n\n            GUI.Label(rect, (UI_PanelState.fallbackFontAssetPanel ? \"\" : s_UiStateLabel[1]), TMP_UIStyleManager.rightLabel);\n\n            if (UI_PanelState.fallbackFontAssetPanel)\n            {\n                EditorGUIUtility.labelWidth = 120;\n                EditorGUI.indentLevel = 0;\n\n                m_list.DoLayoutList();\n                EditorGUILayout.Space();\n            }\n            #endregion\n\n            // CHARACTER TABLE TABLE\n            #region Character Table\n            EditorGUIUtility.labelWidth = labelWidth;\n            EditorGUIUtility.fieldWidth = fieldWidth;\n            EditorGUI.indentLevel = 0;\n            rect = EditorGUILayout.GetControlRect(false, 24);\n\n            if (GUI.Button(rect, new GUIContent(\"<b>Character Table</b>\", \"List of characters contained in this font asset.\"), TMP_UIStyleManager.sectionHeader)) \n                UI_PanelState.characterTablePanel = !UI_PanelState.characterTablePanel;\n\n            GUI.Label(rect, (UI_PanelState.characterTablePanel ? \"\" : s_UiStateLabel[1]), TMP_UIStyleManager.rightLabel);\n\n            if (UI_PanelState.characterTablePanel)\n            {\n                int arraySize = m_CharacterTable_prop.arraySize;\n                int itemsPerPage = 15;\n\n                // Display Glyph Management Tools\n                EditorGUILayout.BeginVertical(EditorStyles.helpBox);\n                {\n                    // Search Bar implementation\n                    #region DISPLAY SEARCH BAR\n                    EditorGUILayout.BeginHorizontal();\n                    {\n                        EditorGUIUtility.labelWidth = 130f;\n                        EditorGUI.BeginChangeCheck();\n                        string searchPattern = EditorGUILayout.TextField(\"Character Search\", m_CharacterSearchPattern, \"SearchTextField\");\n                        if (EditorGUI.EndChangeCheck() || m_isSearchDirty)\n                        {\n                            if (string.IsNullOrEmpty(searchPattern) == false)\n                            {\n                                m_CharacterSearchPattern = searchPattern;\n\n                                // Search Character Table for potential matches\n                                SearchCharacterTable (m_CharacterSearchPattern, ref m_CharacterSearchList);\n                            }\n                            else\n                                m_CharacterSearchPattern = null;\n\n                            m_isSearchDirty = false;\n                        }\n\n                        string styleName = string.IsNullOrEmpty(m_CharacterSearchPattern) ? \"SearchCancelButtonEmpty\" : \"SearchCancelButton\";\n                        if (GUILayout.Button(GUIContent.none, styleName))\n                        {\n                            GUIUtility.keyboardControl = 0;\n                            m_CharacterSearchPattern = string.Empty;\n                        }\n                    }\n                    EditorGUILayout.EndHorizontal();\n                    #endregion\n\n                    // Display Page Navigation\n                    if (!string.IsNullOrEmpty(m_CharacterSearchPattern))\n                        arraySize = m_CharacterSearchList.Count;\n\n                    DisplayPageNavigation(ref m_CurrentCharacterPage, arraySize, itemsPerPage);\n                }\n                EditorGUILayout.EndVertical();\n\n                // Display Character Table Elements\n                if (arraySize > 0)\n                {\n                    // Display each character entry using the CharacterPropertyDrawer.\n                    for (int i = itemsPerPage * m_CurrentCharacterPage; i < arraySize && i < itemsPerPage * (m_CurrentCharacterPage + 1); i++)\n                    {\n                        // Define the start of the selection region of the element.\n                        Rect elementStartRegion = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true));\n\n                        int elementIndex = i;\n                        if (!string.IsNullOrEmpty(m_CharacterSearchPattern))\n                            elementIndex = m_CharacterSearchList[i];\n\n                        SerializedProperty characterProperty = m_CharacterTable_prop.GetArrayElementAtIndex(elementIndex);\n\n                        EditorGUILayout.BeginVertical(EditorStyles.helpBox);\n\n                        EditorGUI.BeginDisabledGroup(i != m_SelectedCharacterRecord);\n                        {\n                            EditorGUILayout.PropertyField(characterProperty);\n                        }\n                        EditorGUI.EndDisabledGroup();\n\n                        EditorGUILayout.EndVertical();\n\n                        // Define the end of the selection region of the element.\n                        Rect elementEndRegion = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true));\n\n                        // Check for Item selection\n                        Rect selectionArea = new Rect(elementStartRegion.x, elementStartRegion.y, elementEndRegion.width, elementEndRegion.y - elementStartRegion.y);\n                        if (DoSelectionCheck(selectionArea))\n                        {\n                            if (m_SelectedCharacterRecord == i)\n                                m_SelectedCharacterRecord = -1;\n                            else\n                            {\n                                m_SelectedCharacterRecord = i;\n                                m_AddCharacterWarning.isEnabled = false;\n                                m_unicodeHexLabel = k_placeholderUnicodeHex;\n                                GUIUtility.keyboardControl = 0;\n                            }\n                        }\n\n                        // Draw Selection Highlight and Glyph Options\n                        if (m_SelectedCharacterRecord == i)\n                        {\n                            TMP_EditorUtility.DrawBox(selectionArea, 2f, new Color32(40, 192, 255, 255));\n\n                            // Draw Glyph management options\n                            Rect controlRect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight * 1f);\n                            float optionAreaWidth = controlRect.width * 0.6f;\n                            float btnWidth = optionAreaWidth / 3;\n\n                            Rect position = new Rect(controlRect.x + controlRect.width * .4f, controlRect.y, btnWidth, controlRect.height);\n\n                            // Copy Selected Glyph to Target Glyph ID\n                            GUI.enabled = !string.IsNullOrEmpty(m_dstUnicode);\n                            if (GUI.Button(position, new GUIContent(\"Copy to\")))\n                            {\n                                GUIUtility.keyboardControl = 0;\n\n                                // Convert Hex Value to Decimal\n                                int dstGlyphID = TMP_TextUtilities.StringHexToInt(m_dstUnicode);\n\n                                //Add new glyph at target Unicode hex id.\n                                if (!AddNewCharacter(elementIndex, dstGlyphID))\n                                {\n                                    m_AddCharacterWarning.isEnabled = true;\n                                    m_AddCharacterWarning.expirationTime = EditorApplication.timeSinceStartup + 1;\n                                }\n\n                                m_dstUnicode = string.Empty;\n                                m_isSearchDirty = true;\n\n                                TMPro_EventManager.ON_FONT_PROPERTY_CHANGED(true, m_fontAsset);\n                            }\n\n                            // Target Glyph ID\n                            GUI.enabled = true;\n                            position.x += btnWidth;\n\n                            GUI.SetNextControlName(\"CharacterID_Input\");\n                            m_dstUnicode = EditorGUI.TextField(position, m_dstUnicode);\n\n                            // Placeholder text\n                            EditorGUI.LabelField(position, new GUIContent(m_unicodeHexLabel, \"The Unicode (Hex) ID of the duplicated Character\"), TMP_UIStyleManager.label);\n\n                            // Only filter the input when the destination glyph ID text field has focus.\n                            if (GUI.GetNameOfFocusedControl() == \"CharacterID_Input\")\n                            {\n                                m_unicodeHexLabel = string.Empty;\n\n                                //Filter out unwanted characters.\n                                char chr = Event.current.character;\n                                if ((chr < '0' || chr > '9') && (chr < 'a' || chr > 'f') && (chr < 'A' || chr > 'F'))\n                                {\n                                    Event.current.character = '\\0';\n                                }\n                            }\n                            else\n                            {\n                                m_unicodeHexLabel = k_placeholderUnicodeHex;\n                                //m_dstUnicode = string.Empty;\n                            }\n\n\n                            // Remove Glyph\n                            position.x += btnWidth;\n                            if (GUI.Button(position, \"Remove\"))\n                            {\n                                GUIUtility.keyboardControl = 0;\n\n                                RemoveCharacterFromList(elementIndex);\n\n                                isAssetDirty = true;\n                                m_SelectedCharacterRecord = -1;\n                                m_isSearchDirty = true;\n                                break;\n                            }\n\n                            if (m_AddCharacterWarning.isEnabled && EditorApplication.timeSinceStartup < m_AddCharacterWarning.expirationTime)\n                            {\n                                EditorGUILayout.HelpBox(\"The Destination Character ID already exists\", MessageType.Warning);\n                            }\n\n                        }\n                    }\n                }\n\n                DisplayPageNavigation(ref m_CurrentCharacterPage, arraySize, itemsPerPage);\n\n                EditorGUILayout.Space();\n            }\n            #endregion\n\n            // GLYPH TABLE\n            #region Glyph Table\n            EditorGUIUtility.labelWidth = labelWidth;\n            EditorGUIUtility.fieldWidth = fieldWidth;\n            EditorGUI.indentLevel = 0;\n            rect = EditorGUILayout.GetControlRect(false, 24);\n\n            GUIStyle glyphPanelStyle = new GUIStyle(EditorStyles.helpBox);\n\n            if (GUI.Button(rect, new GUIContent(\"<b>Glyph Table</b>\", \"List of glyphs contained in this font asset.\"), TMP_UIStyleManager.sectionHeader))\n                UI_PanelState.glyphTablePanel = !UI_PanelState.glyphTablePanel;\n\n            GUI.Label(rect, (UI_PanelState.glyphTablePanel ? \"\" : s_UiStateLabel[1]), TMP_UIStyleManager.rightLabel);\n\n            if (UI_PanelState.glyphTablePanel)\n            {\n                int arraySize = m_GlyphTable_prop.arraySize;\n                int itemsPerPage = 15;\n\n                // Display Glyph Management Tools\n                EditorGUILayout.BeginVertical(EditorStyles.helpBox);\n                {\n                    // Search Bar implementation\n                    #region DISPLAY SEARCH BAR\n                    EditorGUILayout.BeginHorizontal();\n                    {\n                        EditorGUIUtility.labelWidth = 130f;\n                        EditorGUI.BeginChangeCheck();\n                        string searchPattern = EditorGUILayout.TextField(\"Glyph Search\", m_GlyphSearchPattern, \"SearchTextField\");\n                        if (EditorGUI.EndChangeCheck() || m_isSearchDirty)\n                        {\n                            if (string.IsNullOrEmpty(searchPattern) == false)\n                            {\n                                m_GlyphSearchPattern = searchPattern;\n\n                                // Search Glyph Table for potential matches\n                                SearchGlyphTable(m_GlyphSearchPattern, ref m_GlyphSearchList);\n                            }\n                            else\n                                m_GlyphSearchPattern = null;\n\n                            m_isSearchDirty = false;\n                        }\n\n                        string styleName = string.IsNullOrEmpty(m_GlyphSearchPattern) ? \"SearchCancelButtonEmpty\" : \"SearchCancelButton\";\n                        if (GUILayout.Button(GUIContent.none, styleName))\n                        {\n                            GUIUtility.keyboardControl = 0;\n                            m_GlyphSearchPattern = string.Empty;\n                        }\n                    }\n                    EditorGUILayout.EndHorizontal();\n                    #endregion\n\n                    // Display Page Navigation\n                    if (!string.IsNullOrEmpty(m_GlyphSearchPattern))\n                        arraySize = m_GlyphSearchList.Count;\n\n                    DisplayPageNavigation(ref m_CurrentGlyphPage, arraySize, itemsPerPage);\n                }\n                EditorGUILayout.EndVertical();\n\n                // Display Glyph Table Elements\n                \n                if (arraySize > 0)\n                {\n                    // Display each GlyphInfo entry using the GlyphInfo property drawer.\n                    for (int i = itemsPerPage * m_CurrentGlyphPage; i < arraySize && i < itemsPerPage * (m_CurrentGlyphPage + 1); i++)\n                    {\n                        // Define the start of the selection region of the element.\n                        Rect elementStartRegion = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true));\n\n                        int elementIndex = i;\n                        if (!string.IsNullOrEmpty(m_GlyphSearchPattern))\n                            elementIndex = m_GlyphSearchList[i];\n\n                        SerializedProperty glyphProperty = m_GlyphTable_prop.GetArrayElementAtIndex(elementIndex);\n\n                        EditorGUILayout.BeginVertical(glyphPanelStyle);\n\n                        using (new EditorGUI.DisabledScope(i != m_SelectedGlyphRecord))\n                        {\n                            EditorGUILayout.PropertyField(glyphProperty);\n                        }\n\n                        EditorGUILayout.EndVertical();\n\n                        // Define the end of the selection region of the element.\n                        Rect elementEndRegion = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true));\n\n                        // Check for Item selection\n                        Rect selectionArea = new Rect(elementStartRegion.x, elementStartRegion.y, elementEndRegion.width, elementEndRegion.y - elementStartRegion.y);\n                        if (DoSelectionCheck(selectionArea))\n                        {\n                            if (m_SelectedGlyphRecord == i)\n                                m_SelectedGlyphRecord = -1;\n                            else\n                            {\n                                m_SelectedGlyphRecord = i;\n                                m_AddGlyphWarning.isEnabled = false;\n                                m_unicodeHexLabel = k_placeholderUnicodeHex;\n                                GUIUtility.keyboardControl = 0;\n                            }\n                        }\n\n                        // Draw Selection Highlight and Glyph Options\n                        if (m_SelectedGlyphRecord == i)\n                        {\n                            TMP_EditorUtility.DrawBox(selectionArea, 2f, new Color32(40, 192, 255, 255));\n\n                            // Draw Glyph management options\n                            Rect controlRect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight * 1f);\n                            float optionAreaWidth = controlRect.width * 0.6f;\n                            float btnWidth = optionAreaWidth / 3;\n\n                            Rect position = new Rect(controlRect.x + controlRect.width * .4f, controlRect.y, btnWidth, controlRect.height);\n\n                            // Copy Selected Glyph to Target Glyph ID\n                            GUI.enabled = !string.IsNullOrEmpty(m_dstGlyphID);\n                            if (GUI.Button(position, new GUIContent(\"Copy to\")))\n                            {\n                                GUIUtility.keyboardControl = 0;\n\n                                // Convert Hex Value to Decimal\n                                int.TryParse(m_dstGlyphID, out int dstGlyphID);\n\n                                //Add new glyph at target Unicode hex id.\n                                if (!AddNewGlyph(elementIndex, dstGlyphID))\n                                {\n                                    m_AddGlyphWarning.isEnabled = true;\n                                    m_AddGlyphWarning.expirationTime = EditorApplication.timeSinceStartup + 1;\n                                }\n\n                                m_dstGlyphID = string.Empty;\n                                m_isSearchDirty = true;\n\n                                TMPro_EventManager.ON_FONT_PROPERTY_CHANGED(true, m_fontAsset);\n                            }\n\n                            // Target Glyph ID\n                            GUI.enabled = true;\n                            position.x += btnWidth;\n\n                            GUI.SetNextControlName(\"GlyphID_Input\");\n                            m_dstGlyphID = EditorGUI.TextField(position, m_dstGlyphID);\n\n                            // Placeholder text\n                            EditorGUI.LabelField(position, new GUIContent(m_GlyphIDLabel, \"The Glyph ID of the duplicated Glyph\"), TMP_UIStyleManager.label);\n\n                            // Only filter the input when the destination glyph ID text field has focus.\n                            if (GUI.GetNameOfFocusedControl() == \"GlyphID_Input\")\n                            {\n                                m_GlyphIDLabel = string.Empty;\n\n                                //Filter out unwanted characters.\n                                char chr = Event.current.character;\n                                if ((chr < '0' || chr > '9'))\n                                {\n                                    Event.current.character = '\\0';\n                                }\n                            }\n                            else\n                            {\n                                m_GlyphIDLabel = k_placeholderGlyphID;\n                                //m_dstGlyphID = string.Empty;\n                            }\n\n                            // Remove Glyph\n                            position.x += btnWidth;\n                            if (GUI.Button(position, \"Remove\"))\n                            {\n                                GUIUtility.keyboardControl = 0;\n\n                                RemoveGlyphFromList(elementIndex);\n\n                                isAssetDirty = true;\n                                m_SelectedGlyphRecord = -1;\n                                m_isSearchDirty = true;\n                                break;\n                            }\n\n                            if (m_AddGlyphWarning.isEnabled && EditorApplication.timeSinceStartup < m_AddGlyphWarning.expirationTime)\n                            {\n                                EditorGUILayout.HelpBox(\"The Destination Glyph ID already exists\", MessageType.Warning);\n                            }\n\n                        }\n                    }\n                }\n\n                DisplayPageNavigation(ref m_CurrentGlyphPage, arraySize, itemsPerPage);\n\n                EditorGUILayout.Space();\n            }\n            #endregion\n\n            // FONT FEATURE TABLE\n            #region Font Feature Table\n            EditorGUIUtility.labelWidth = labelWidth;\n            EditorGUIUtility.fieldWidth = fieldWidth;\n            EditorGUI.indentLevel = 0;\n            rect = EditorGUILayout.GetControlRect(false, 24);\n\n            if (GUI.Button(rect, new GUIContent(\"<b>Glyph Adjustment Table</b>\", \"List of glyph adjustment / advanced kerning pairs.\"), TMP_UIStyleManager.sectionHeader))\n                UI_PanelState.fontFeatureTablePanel = !UI_PanelState.fontFeatureTablePanel;\n\n            GUI.Label(rect, (UI_PanelState.fontFeatureTablePanel ? \"\" : s_UiStateLabel[1]), TMP_UIStyleManager.rightLabel);\n\n            if (UI_PanelState.fontFeatureTablePanel)\n            {\n                int arraySize = m_GlyphPairAdjustmentRecords_prop.arraySize;\n                int itemsPerPage = 20;\n\n                // Display Kerning Pair Management Tools\n                EditorGUILayout.BeginVertical(EditorStyles.helpBox);\n                {\n                    // Search Bar implementation\n                    #region DISPLAY SEARCH BAR\n                    EditorGUILayout.BeginHorizontal();\n                    {\n                        EditorGUIUtility.labelWidth = 150f;\n                        EditorGUI.BeginChangeCheck();\n                        string searchPattern = EditorGUILayout.TextField(\"Adjustment Pair Search\", m_KerningTableSearchPattern, \"SearchTextField\");\n                        if (EditorGUI.EndChangeCheck() || m_isSearchDirty)\n                        {\n                            if (string.IsNullOrEmpty(searchPattern) == false)\n                            {\n                                m_KerningTableSearchPattern = searchPattern;\n\n                                // Search Glyph Table for potential matches\n                                SearchKerningTable(m_KerningTableSearchPattern, ref m_KerningTableSearchList);\n                            }\n                            else\n                                m_KerningTableSearchPattern = null;\n\n                            m_isSearchDirty = false;\n                        }\n\n                        string styleName = string.IsNullOrEmpty(m_KerningTableSearchPattern) ? \"SearchCancelButtonEmpty\" : \"SearchCancelButton\";\n                        if (GUILayout.Button(GUIContent.none, styleName))\n                        {\n                            GUIUtility.keyboardControl = 0;\n                            m_KerningTableSearchPattern = string.Empty;\n                        }\n                    }\n                    EditorGUILayout.EndHorizontal();\n                    #endregion\n\n                    // Display Page Navigation\n                    if (!string.IsNullOrEmpty(m_KerningTableSearchPattern))\n                        arraySize = m_KerningTableSearchList.Count;\n\n                    DisplayPageNavigation(ref m_CurrentKerningPage, arraySize, itemsPerPage);\n                }\n                EditorGUILayout.EndVertical();\n\n                if (arraySize > 0)\n                {\n                    // Display each GlyphInfo entry using the GlyphInfo property drawer.\n                    for (int i = itemsPerPage * m_CurrentKerningPage; i < arraySize && i < itemsPerPage * (m_CurrentKerningPage + 1); i++)\n                    {\n                        // Define the start of the selection region of the element.\n                        Rect elementStartRegion = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true));\n\n                        int elementIndex = i;\n                        if (!string.IsNullOrEmpty(m_KerningTableSearchPattern))\n                            elementIndex = m_KerningTableSearchList[i];\n\n                        SerializedProperty pairAdjustmentRecordProperty = m_GlyphPairAdjustmentRecords_prop.GetArrayElementAtIndex(elementIndex);\n\n                        EditorGUILayout.BeginVertical(EditorStyles.helpBox);\n\n                        using (new EditorGUI.DisabledScope(i != m_SelectedAdjustmentRecord))\n                        {\n                            EditorGUILayout.PropertyField(pairAdjustmentRecordProperty, new GUIContent(\"Selectable\"));\n                        }\n\n                        EditorGUILayout.EndVertical();\n\n                        // Define the end of the selection region of the element.\n                        Rect elementEndRegion = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true));\n\n                        // Check for Item selection\n                        Rect selectionArea = new Rect(elementStartRegion.x, elementStartRegion.y, elementEndRegion.width, elementEndRegion.y - elementStartRegion.y);\n                        if (DoSelectionCheck(selectionArea))\n                        {\n                            if (m_SelectedAdjustmentRecord == i)\n                            {\n                                m_SelectedAdjustmentRecord = -1;\n                            }\n                            else\n                            {\n                                m_SelectedAdjustmentRecord = i;\n                                GUIUtility.keyboardControl = 0;\n                            }\n                        }\n\n                        // Draw Selection Highlight and Kerning Pair Options\n                        if (m_SelectedAdjustmentRecord == i)\n                        {\n                            TMP_EditorUtility.DrawBox(selectionArea, 2f, new Color32(40, 192, 255, 255));\n\n                            // Draw Glyph management options\n                            Rect controlRect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight * 1f);\n                            float optionAreaWidth = controlRect.width;\n                            float btnWidth = optionAreaWidth / 4;\n\n                            Rect position = new Rect(controlRect.x + controlRect.width - btnWidth, controlRect.y, btnWidth, controlRect.height);\n\n                            // Remove Kerning pair\n                            GUI.enabled = true;\n                            if (GUI.Button(position, \"Remove\"))\n                            {\n                                GUIUtility.keyboardControl = 0;\n\n                                RemoveAdjustmentPairFromList(i);\n\n                                isAssetDirty = true;\n                                m_SelectedAdjustmentRecord = -1;\n                                m_isSearchDirty = true;\n                                break;\n                            }\n                        }\n                    }\n                }\n\n                DisplayPageNavigation(ref m_CurrentKerningPage, arraySize, itemsPerPage);\n\n                GUILayout.Space(5);\n\n                // Add new kerning pair\n                EditorGUILayout.BeginVertical(EditorStyles.helpBox);\n                {\n                    EditorGUILayout.PropertyField(m_EmptyGlyphPairAdjustmentRecord_prop);\n                }\n                EditorGUILayout.EndVertical();\n\n                if (GUILayout.Button(\"Add New Glyph Adjustment Record\"))\n                {\n                    SerializedProperty firstAdjustmentRecordProperty = m_EmptyGlyphPairAdjustmentRecord_prop.FindPropertyRelative(\"m_FirstAdjustmentRecord\");\n                    SerializedProperty secondAdjustmentRecordProperty = m_EmptyGlyphPairAdjustmentRecord_prop.FindPropertyRelative(\"m_SecondAdjustmentRecord\");\n\n                    uint firstGlyphIndex = (uint)firstAdjustmentRecordProperty.FindPropertyRelative(\"m_GlyphIndex\").intValue;\n                    uint secondGlyphIndex = (uint)secondAdjustmentRecordProperty.FindPropertyRelative(\"m_GlyphIndex\").intValue;\n\n                    TMP_GlyphValueRecord firstValueRecord = GetValueRecord(firstAdjustmentRecordProperty.FindPropertyRelative(\"m_GlyphValueRecord\"));\n                    TMP_GlyphValueRecord secondValueRecord = GetValueRecord(secondAdjustmentRecordProperty.FindPropertyRelative(\"m_GlyphValueRecord\"));\n\n                    errorCode = -1;\n                    long pairKey = (long)secondGlyphIndex << 32 | firstGlyphIndex;\n                    if (m_FontFeatureTable.m_GlyphPairAdjustmentRecordLookupDictionary.ContainsKey(pairKey) == false)\n                    {\n                        TMP_GlyphPairAdjustmentRecord adjustmentRecord = new TMP_GlyphPairAdjustmentRecord(new TMP_GlyphAdjustmentRecord(firstGlyphIndex, firstValueRecord), new TMP_GlyphAdjustmentRecord(secondGlyphIndex, secondValueRecord));\n                        m_FontFeatureTable.m_GlyphPairAdjustmentRecords.Add(adjustmentRecord);\n                        m_FontFeatureTable.m_GlyphPairAdjustmentRecordLookupDictionary.Add(pairKey, adjustmentRecord);\n                        errorCode = 0;\n                    }\n\n                    // Add glyphs and characters\n                    uint firstCharacter = m_SerializedPropertyHolder.firstCharacter;\n                    if (!m_fontAsset.characterLookupTable.ContainsKey(firstCharacter))\n                        m_fontAsset.TryAddCharacterInternal(firstCharacter, out TMP_Character character);\n\n                    uint secondCharacter = m_SerializedPropertyHolder.secondCharacter;\n                    if (!m_fontAsset.characterLookupTable.ContainsKey(secondCharacter))\n                        m_fontAsset.TryAddCharacterInternal(secondCharacter, out TMP_Character character);\n\n                    // Sort Kerning Pairs & Reload Font Asset if new kerning pair was added.\n                    if (errorCode != -1)\n                    {\n                        m_FontFeatureTable.SortGlyphPairAdjustmentRecords();\n                        serializedObject.ApplyModifiedProperties();\n                        isAssetDirty = true;\n                        m_isSearchDirty = true;\n                    }\n                    else\n                    {\n                        timeStamp = System.DateTime.Now.AddSeconds(5);\n                    }\n\n                    // Clear Add Kerning Pair Panel\n                    // TODO\n                }\n\n                if (errorCode == -1)\n                {\n                    GUILayout.BeginHorizontal();\n                    GUILayout.FlexibleSpace();\n                    GUILayout.Label(\"Kerning Pair already <color=#ffff00>exists!</color>\", TMP_UIStyleManager.label);\n                    GUILayout.FlexibleSpace();\n                    GUILayout.EndHorizontal();\n\n                    if (System.DateTime.Now > timeStamp)\n                        errorCode = 0;\n                }\n            }\n            #endregion\n\n            if (serializedObject.ApplyModifiedProperties() || evt_cmd == k_UndoRedo || isAssetDirty)\n            {\n                // Delay callback until user has decided to Apply or Revert the changes.\n                if (m_DisplayDestructiveChangeWarning == false)\n                    TMPro_EventManager.ON_FONT_PROPERTY_CHANGED(true, m_fontAsset);\n\n                if (m_fontAsset.m_IsFontAssetLookupTablesDirty || evt_cmd == k_UndoRedo)\n                    m_fontAsset.ReadFontAssetDefinition();\n\n                isAssetDirty = false;\n                EditorUtility.SetDirty(target);\n            }\n\n\n            // Clear selection if mouse event was not consumed. \n            GUI.enabled = true;\n            if (currentEvent.type == EventType.MouseDown && currentEvent.button == 0)\n                m_SelectedAdjustmentRecord = -1;\n\n        }\n\n        void CleanFallbackFontAssetTable()\n        {\n            SerializedProperty m_FallbackFontAsseTable = serializedObject.FindProperty(\"m_FallbackFontAssetTable\");\n\n            bool isListDirty = false;\n\n            int elementCount = m_FallbackFontAsseTable.arraySize;\n\n            for (int i = 0; i < elementCount; i++)\n            {\n                SerializedProperty element = m_FallbackFontAsseTable.GetArrayElementAtIndex(i);\n                if (element.objectReferenceValue == null)\n                {\n                    m_FallbackFontAsseTable.DeleteArrayElementAtIndex(i);\n                    elementCount -= 1;\n                    i -= 1;\n\n                    isListDirty = true;\n                }\n            }\n\n            if (isListDirty)\n            {\n                serializedObject.ApplyModifiedProperties();\n                serializedObject.Update();\n            }\n        }\n\n        void SavedAtlasGenerationSettings()\n        {\n            m_AtlasSettings.glyphRenderMode = (GlyphRenderMode)m_AtlasRenderMode_prop.intValue;\n            m_AtlasSettings.pointSize       = m_SamplingPointSize_prop.intValue;\n            m_AtlasSettings.padding         = m_AtlasPadding_prop.intValue;\n            m_AtlasSettings.atlasWidth      = m_AtlasWidth_prop.intValue;\n            m_AtlasSettings.atlasHeight     = m_AtlasHeight_prop.intValue;\n        }\n\n        void RestoreAtlasGenerationSettings()\n        {\n            m_AtlasRenderMode_prop.intValue = (int)m_AtlasSettings.glyphRenderMode;\n            m_SamplingPointSize_prop.intValue = m_AtlasSettings.pointSize;\n            m_AtlasPadding_prop.intValue = m_AtlasSettings.padding;\n            m_AtlasWidth_prop.intValue = m_AtlasSettings.atlasWidth;\n            m_AtlasHeight_prop.intValue = m_AtlasSettings.atlasHeight;\n        }\n\n\n        void UpdateFontAssetCreationSettings()\n        {\n            m_fontAsset.m_CreationSettings.pointSize = m_SamplingPointSize_prop.intValue;\n            m_fontAsset.m_CreationSettings.renderMode = m_AtlasRenderMode_prop.intValue;\n            m_fontAsset.m_CreationSettings.padding = m_AtlasPadding_prop.intValue;\n            m_fontAsset.m_CreationSettings.atlasWidth = m_AtlasWidth_prop.intValue;\n            m_fontAsset.m_CreationSettings.atlasHeight = m_AtlasHeight_prop.intValue;\n        }\n\n\n        void UpdateCharacterData(SerializedProperty property, int index)\n        {\n            TMP_Character character = m_fontAsset.characterTable[index];\n\n            character.unicode = (uint)property.FindPropertyRelative(\"m_Unicode\").intValue;\n            character.scale = property.FindPropertyRelative(\"m_Scale\").floatValue;\n\n            SerializedProperty glyphProperty = property.FindPropertyRelative(\"m_Glyph\");\n            character.glyph.index = (uint)glyphProperty.FindPropertyRelative(\"m_Index\").intValue;\n\n            SerializedProperty glyphRectProperty = glyphProperty.FindPropertyRelative(\"m_GlyphRect\");\n            character.glyph.glyphRect = new GlyphRect(glyphRectProperty.FindPropertyRelative(\"m_X\").intValue, glyphRectProperty.FindPropertyRelative(\"m_Y\").intValue, glyphRectProperty.FindPropertyRelative(\"m_Width\").intValue, glyphRectProperty.FindPropertyRelative(\"m_Height\").intValue);\n\n            SerializedProperty glyphMetricsProperty = glyphProperty.FindPropertyRelative(\"m_Metrics\");\n            character.glyph.metrics = new GlyphMetrics(glyphMetricsProperty.FindPropertyRelative(\"m_Width\").floatValue, glyphMetricsProperty.FindPropertyRelative(\"m_Height\").floatValue, glyphMetricsProperty.FindPropertyRelative(\"m_HorizontalBearingX\").floatValue, glyphMetricsProperty.FindPropertyRelative(\"m_HorizontalBearingY\").floatValue, glyphMetricsProperty.FindPropertyRelative(\"m_HorizontalAdvance\").floatValue);\n\n            character.glyph.scale = glyphProperty.FindPropertyRelative(\"m_Scale\").floatValue;\n\n            character.glyph.atlasIndex = glyphProperty.FindPropertyRelative(\"m_AtlasIndex\").intValue;\n        }\n\n\n        void UpdateGlyphData(SerializedProperty property, int index)\n        {\n            Glyph glyph = m_fontAsset.glyphTable[index];\n\n            glyph.index = (uint)property.FindPropertyRelative(\"m_Index\").intValue;\n\n            SerializedProperty glyphRect = property.FindPropertyRelative(\"m_GlyphRect\");\n            glyph.glyphRect = new GlyphRect(glyphRect.FindPropertyRelative(\"m_X\").intValue, glyphRect.FindPropertyRelative(\"m_Y\").intValue, glyphRect.FindPropertyRelative(\"m_Width\").intValue, glyphRect.FindPropertyRelative(\"m_Height\").intValue);\n\n            SerializedProperty glyphMetrics = property.FindPropertyRelative(\"m_Metrics\");\n            glyph.metrics = new GlyphMetrics(glyphMetrics.FindPropertyRelative(\"m_Width\").floatValue, glyphMetrics.FindPropertyRelative(\"m_Height\").floatValue, glyphMetrics.FindPropertyRelative(\"m_HorizontalBearingX\").floatValue, glyphMetrics.FindPropertyRelative(\"m_HorizontalBearingY\").floatValue, glyphMetrics.FindPropertyRelative(\"m_HorizontalAdvance\").floatValue);\n\n            glyph.scale = property.FindPropertyRelative(\"m_Scale\").floatValue;\n        }\n\n\n        void DisplayPageNavigation(ref int currentPage, int arraySize, int itemsPerPage)\n        {\n            Rect pagePos = EditorGUILayout.GetControlRect(false, 20);\n            pagePos.width /= 3;\n\n            int shiftMultiplier = Event.current.shift ? 10 : 1; // Page + Shift goes 10 page forward\n\n            // Previous Page\n            GUI.enabled = currentPage > 0;\n\n            if (GUI.Button(pagePos, \"Previous Page\"))\n                currentPage -= 1 * shiftMultiplier;\n\n\n            // Page Counter\n            GUI.enabled = true;\n            pagePos.x += pagePos.width;\n            int totalPages = (int)(arraySize / (float)itemsPerPage + 0.999f);\n            GUI.Label(pagePos, \"Page \" + (currentPage + 1) + \" / \" + totalPages, TMP_UIStyleManager.centeredLabel);\n\n            // Next Page\n            pagePos.x += pagePos.width;\n            GUI.enabled = itemsPerPage * (currentPage + 1) < arraySize;\n\n            if (GUI.Button(pagePos, \"Next Page\"))\n                currentPage += 1 * shiftMultiplier;\n\n            // Clamp page range\n            currentPage = Mathf.Clamp(currentPage, 0, arraySize / itemsPerPage);\n\n            GUI.enabled = true;\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"srcGlyphID\"></param>\n        /// <param name=\"dstGlyphID\"></param>\n        bool AddNewGlyph(int srcIndex, int dstGlyphID)\n        {\n            // Make sure Destination Glyph ID doesn't already contain a Glyph\n            if (m_fontAsset.glyphLookupTable.ContainsKey((uint)dstGlyphID))\n                return false;\n\n            // Add new element to glyph list.\n            m_GlyphTable_prop.arraySize += 1;\n\n            // Get a reference to the source glyph.\n            SerializedProperty sourceGlyph = m_GlyphTable_prop.GetArrayElementAtIndex(srcIndex);\n\n            int dstIndex = m_GlyphTable_prop.arraySize - 1;\n\n            // Get a reference to the target / destination glyph.\n            SerializedProperty targetGlyph = m_GlyphTable_prop.GetArrayElementAtIndex(dstIndex);\n\n            CopyGlyphSerializedProperty(sourceGlyph, ref targetGlyph);\n\n            // Update the ID of the glyph\n            targetGlyph.FindPropertyRelative(\"m_Index\").intValue = dstGlyphID;\n\n            serializedObject.ApplyModifiedProperties();\n\n            m_fontAsset.SortGlyphTable();\n\n            m_fontAsset.ReadFontAssetDefinition();\n\n            return true;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"glyphID\"></param>\n        void RemoveGlyphFromList(int index)\n        {\n            if (index > m_GlyphTable_prop.arraySize)\n                return;\n\n            int targetGlyphIndex = m_GlyphTable_prop.GetArrayElementAtIndex(index).FindPropertyRelative(\"m_Index\").intValue;\n\n            m_GlyphTable_prop.DeleteArrayElementAtIndex(index);\n\n            // Remove all characters referencing this glyph.\n            for (int i = 0; i < m_CharacterTable_prop.arraySize; i++)\n            {\n                int glyphIndex = m_CharacterTable_prop.GetArrayElementAtIndex(i).FindPropertyRelative(\"m_GlyphIndex\").intValue;\n\n                if (glyphIndex == targetGlyphIndex)\n                {\n                    // Remove character\n                    m_CharacterTable_prop.DeleteArrayElementAtIndex(i);\n                }\n            }\n\n            serializedObject.ApplyModifiedProperties();\n\n            m_fontAsset.ReadFontAssetDefinition();\n        }\n\n        bool AddNewCharacter(int srcIndex, int dstGlyphID)\n        {\n            // Make sure Destination Glyph ID doesn't already contain a Glyph\n            if (m_fontAsset.characterLookupTable.ContainsKey((uint)dstGlyphID))\n                return false;\n\n            // Add new element to glyph list.\n            m_CharacterTable_prop.arraySize += 1;\n\n            // Get a reference to the source glyph.\n            SerializedProperty sourceCharacter = m_CharacterTable_prop.GetArrayElementAtIndex(srcIndex);\n\n            int dstIndex = m_CharacterTable_prop.arraySize - 1;\n\n            // Get a reference to the target / destination glyph.\n            SerializedProperty targetCharacter = m_CharacterTable_prop.GetArrayElementAtIndex(dstIndex);\n\n            CopyCharacterSerializedProperty(sourceCharacter, ref targetCharacter);\n\n            // Update the ID of the glyph\n            targetCharacter.FindPropertyRelative(\"m_Unicode\").intValue = dstGlyphID;\n\n            serializedObject.ApplyModifiedProperties();\n\n            m_fontAsset.SortCharacterTable();\n\n            m_fontAsset.ReadFontAssetDefinition();\n\n            return true;\n        }\n\n        void RemoveCharacterFromList(int index)\n        {\n            if (index > m_CharacterTable_prop.arraySize)\n                return;\n\n            m_CharacterTable_prop.DeleteArrayElementAtIndex(index);\n\n            serializedObject.ApplyModifiedProperties();\n\n            m_fontAsset.ReadFontAssetDefinition();\n        }\n\n\n        // Check if any of the Style elements were clicked on.\n        private bool DoSelectionCheck(Rect selectionArea)\n        {\n            Event currentEvent = Event.current;\n\n            switch (currentEvent.type)\n            {\n                case EventType.MouseDown:\n                    if (selectionArea.Contains(currentEvent.mousePosition) && currentEvent.button == 0)\n                    {\n                        currentEvent.Use();\n                        return true;\n                    }\n\n                    break;\n            }\n\n            return false;\n        }\n\n        TMP_GlyphValueRecord GetValueRecord(SerializedProperty property)\n        {\n            TMP_GlyphValueRecord record = new TMP_GlyphValueRecord();\n            record.xPlacement = property.FindPropertyRelative(\"m_XPlacement\").floatValue;\n            record.yPlacement = property.FindPropertyRelative(\"m_YPlacement\").floatValue;\n            record.xAdvance = property.FindPropertyRelative(\"m_XAdvance\").floatValue;\n            record.yAdvance = property.FindPropertyRelative(\"m_YAdvance\").floatValue;\n\n            return record;\n        }\n\n        void RemoveAdjustmentPairFromList(int index)\n        {\n            if (index > m_GlyphPairAdjustmentRecords_prop.arraySize)\n                return;\n\n            m_GlyphPairAdjustmentRecords_prop.DeleteArrayElementAtIndex(index);\n\n            serializedObject.ApplyModifiedProperties();\n\n            m_fontAsset.ReadFontAssetDefinition();\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"srcGlyph\"></param>\n        /// <param name=\"dstGlyph\"></param>\n        void CopyGlyphSerializedProperty(SerializedProperty srcGlyph, ref SerializedProperty dstGlyph)\n        {\n            // TODO : Should make a generic function which copies each of the properties.\n            dstGlyph.FindPropertyRelative(\"m_Index\").intValue = srcGlyph.FindPropertyRelative(\"m_Index\").intValue;\n\n            // Glyph -> GlyphMetrics\n            SerializedProperty srcGlyphMetrics = srcGlyph.FindPropertyRelative(\"m_Metrics\");\n            SerializedProperty dstGlyphMetrics = dstGlyph.FindPropertyRelative(\"m_Metrics\");\n\n            dstGlyphMetrics.FindPropertyRelative(\"m_Width\").floatValue = srcGlyphMetrics.FindPropertyRelative(\"m_Width\").floatValue;\n            dstGlyphMetrics.FindPropertyRelative(\"m_Height\").floatValue = srcGlyphMetrics.FindPropertyRelative(\"m_Height\").floatValue;\n            dstGlyphMetrics.FindPropertyRelative(\"m_HorizontalBearingX\").floatValue = srcGlyphMetrics.FindPropertyRelative(\"m_HorizontalBearingX\").floatValue;\n            dstGlyphMetrics.FindPropertyRelative(\"m_HorizontalBearingY\").floatValue = srcGlyphMetrics.FindPropertyRelative(\"m_HorizontalBearingY\").floatValue;\n            dstGlyphMetrics.FindPropertyRelative(\"m_HorizontalAdvance\").floatValue = srcGlyphMetrics.FindPropertyRelative(\"m_HorizontalAdvance\").floatValue;\n\n            // Glyph -> GlyphRect\n            SerializedProperty srcGlyphRect = srcGlyph.FindPropertyRelative(\"m_GlyphRect\");\n            SerializedProperty dstGlyphRect = dstGlyph.FindPropertyRelative(\"m_GlyphRect\");\n\n            dstGlyphRect.FindPropertyRelative(\"m_X\").intValue = srcGlyphRect.FindPropertyRelative(\"m_X\").intValue;\n            dstGlyphRect.FindPropertyRelative(\"m_Y\").intValue = srcGlyphRect.FindPropertyRelative(\"m_Y\").intValue;\n            dstGlyphRect.FindPropertyRelative(\"m_Width\").intValue = srcGlyphRect.FindPropertyRelative(\"m_Width\").intValue;\n            dstGlyphRect.FindPropertyRelative(\"m_Height\").intValue = srcGlyphRect.FindPropertyRelative(\"m_Height\").intValue;\n\n            dstGlyph.FindPropertyRelative(\"m_Scale\").floatValue = srcGlyph.FindPropertyRelative(\"m_Scale\").floatValue;\n            dstGlyph.FindPropertyRelative(\"m_AtlasIndex\").intValue = srcGlyph.FindPropertyRelative(\"m_AtlasIndex\").intValue;\n        }\n\n\n        void CopyCharacterSerializedProperty(SerializedProperty source, ref SerializedProperty target)\n        {\n            // TODO : Should make a generic function which copies each of the properties.\n            int unicode = source.FindPropertyRelative(\"m_Unicode\").intValue;\n            target.FindPropertyRelative(\"m_Unicode\").intValue = unicode;\n\n            int srcGlyphIndex = source.FindPropertyRelative(\"m_GlyphIndex\").intValue;\n            target.FindPropertyRelative(\"m_GlyphIndex\").intValue = srcGlyphIndex;\n\n            target.FindPropertyRelative(\"m_Scale\").floatValue = source.FindPropertyRelative(\"m_Scale\").floatValue;\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"searchPattern\"></param>\n        /// <returns></returns>\n        void SearchGlyphTable (string searchPattern, ref List<int> searchResults)\n        {\n            if (searchResults == null) searchResults = new List<int>();\n\n            searchResults.Clear();\n\n            int arraySize = m_GlyphTable_prop.arraySize;\n\n            for (int i = 0; i < arraySize; i++)\n            {\n                SerializedProperty sourceGlyph = m_GlyphTable_prop.GetArrayElementAtIndex(i);\n\n                int id = sourceGlyph.FindPropertyRelative(\"m_Index\").intValue;\n\n                // Check for potential match against a character.\n                //if (searchPattern.Length == 1 && id == searchPattern[0])\n                //    searchResults.Add(i);\n\n                // Check for potential match against decimal id\n                if (id.ToString().Contains(searchPattern))\n                    searchResults.Add(i);\n\n                //if (id.ToString(\"x\").Contains(searchPattern))\n                //    searchResults.Add(i);\n\n                //if (id.ToString(\"X\").Contains(searchPattern))\n                //    searchResults.Add(i);\n            }\n        }\n\n\n        void SearchCharacterTable(string searchPattern, ref List<int> searchResults)\n        {\n            if (searchResults == null) searchResults = new List<int>();\n\n            searchResults.Clear();\n\n            int arraySize = m_CharacterTable_prop.arraySize;\n\n            for (int i = 0; i < arraySize; i++)\n            {\n                SerializedProperty sourceCharacter = m_CharacterTable_prop.GetArrayElementAtIndex(i);\n\n                int id = sourceCharacter.FindPropertyRelative(\"m_Unicode\").intValue;\n\n                // Check for potential match against a character.\n                if (searchPattern.Length == 1 && id == searchPattern[0])\n                    searchResults.Add(i);\n                else if (id.ToString(\"x\").Contains(searchPattern))\n                    searchResults.Add(i);\n                else if (id.ToString(\"X\").Contains(searchPattern))\n                    searchResults.Add(i);\n                \n                // Check for potential match against decimal id\n                //if (id.ToString().Contains(searchPattern))\n                //    searchResults.Add(i);\n            }\n        }\n\n\n        void SearchKerningTable(string searchPattern, ref List<int> searchResults)\n        {\n            if (searchResults == null) searchResults = new List<int>();\n\n            searchResults.Clear();\n\n            // Lookup glyph index of potential characters contained in the search pattern.\n            uint firstGlyphIndex = 0;\n            if (searchPattern.Length > 0 && m_fontAsset.characterLookupTable.TryGetValue(searchPattern[0], out TMP_Character firstCharacterSearch))\n                firstGlyphIndex = firstCharacterSearch.glyphIndex;\n\n            uint secondGlyphIndex = 0;\n            if (searchPattern.Length > 1 && m_fontAsset.characterLookupTable.TryGetValue(searchPattern[1], out TMP_Character secondCharacterSearch))\n                secondGlyphIndex = secondCharacterSearch.glyphIndex;\n\n            int arraySize = m_GlyphPairAdjustmentRecords_prop.arraySize;\n\n            for (int i = 0; i < arraySize; i++)\n            {\n                SerializedProperty record = m_GlyphPairAdjustmentRecords_prop.GetArrayElementAtIndex(i);\n\n                SerializedProperty firstAdjustmentRecord = record.FindPropertyRelative(\"m_FirstAdjustmentRecord\");\n                SerializedProperty secondAdjustmentRecord = record.FindPropertyRelative(\"m_SecondAdjustmentRecord\");\n\n                int firstGlyph = firstAdjustmentRecord.FindPropertyRelative(\"m_GlyphIndex\").intValue;\n                int secondGlyph = secondAdjustmentRecord.FindPropertyRelative(\"m_GlyphIndex\").intValue;\n\n                if (firstGlyphIndex == firstGlyph && secondGlyphIndex == secondGlyph)\n                    searchResults.Add(i);\n                else if (searchPattern.Length == 1 && (firstGlyphIndex == firstGlyph || firstGlyphIndex == secondGlyph))\n                    searchResults.Add(i);\n                else if (firstGlyph.ToString().Contains(searchPattern))\n                    searchResults.Add(i);\n                else if (secondGlyph.ToString().Contains(searchPattern))\n                    searchResults.Add(i);\n            }\n        }\n    }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_FontAssetEditor.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 96b44f7d98314b139324a8a87eb66067\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_FontAsset_CreationMenu.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.Linq;\nusing System.IO;\nusing System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine.TextCore;\nusing UnityEngine.TextCore.LowLevel;\nusing TMPro;\n\n\nnamespace TMPro\n{\n    public static class TMP_FontAsset_CreationMenu\n    {\n        /*\n        [MenuItem(\"Assets/Create/TextMeshPro/Font Asset Fallback\", false, 105)]\n        public static void CreateFallbackFontAsset()\n        {\n            Object target = Selection.activeObject;\n\n            // Make sure the selection is a font file\n            if (target == null || target.GetType() != typeof(TMP_FontAsset))\n            {\n                Debug.LogWarning(\"A Font file must first be selected in order to create a Font Asset.\");\n                return;\n            }\n\n            TMP_FontAsset sourceFontAsset = (TMP_FontAsset)target; \n\n            string sourceFontFilePath = AssetDatabase.GetAssetPath(target);\n\n            string folderPath = Path.GetDirectoryName(sourceFontFilePath);\n            string assetName = Path.GetFileNameWithoutExtension(sourceFontFilePath);\n\n            string newAssetFilePathWithName = AssetDatabase.GenerateUniqueAssetPath(folderPath + \"/\" + assetName + \" - Fallback.asset\");\n\n            //// Create new TM Font Asset.\n            TMP_FontAsset fontAsset = ScriptableObject.CreateInstance<TMP_FontAsset>();\n            AssetDatabase.CreateAsset(fontAsset, newAssetFilePathWithName);\n\n            fontAsset.version = \"1.1.0\";\n\n            fontAsset.faceInfo = sourceFontAsset.faceInfo;\n\n            fontAsset.m_SourceFontFileGUID = sourceFontAsset.m_SourceFontFileGUID;\n            fontAsset.m_SourceFontFile_EditorRef = sourceFontAsset.m_SourceFontFile_EditorRef;\n            fontAsset.atlasPopulationMode = TMP_FontAsset.AtlasPopulationMode.Dynamic;\n\n            int atlasWidth = fontAsset.atlasWidth = sourceFontAsset.atlasWidth;\n            int atlasHeight = fontAsset.atlasHeight = sourceFontAsset.atlasHeight;\n            int atlasPadding = fontAsset.atlasPadding = sourceFontAsset.atlasPadding;\n            fontAsset.atlasRenderMode = sourceFontAsset.atlasRenderMode;\n\n            // Initialize array for the font atlas textures.\n            fontAsset.atlasTextures = new Texture2D[1];\n\n            // Create and add font atlas texture\n            Texture2D texture = new Texture2D(atlasWidth, atlasHeight, TextureFormat.Alpha8, false);\n            Color32[] colors = new Color32[atlasWidth * atlasHeight];\n            texture.SetPixels32(colors);\n\n            texture.name = assetName + \" Atlas\";\n            fontAsset.atlasTextures[0] = texture;\n            AssetDatabase.AddObjectToAsset(texture, fontAsset);\n\n            // Add free rectangle of the size of the texture.\n            int packingModifier = ((GlyphRasterModes)fontAsset.atlasRenderMode & GlyphRasterModes.RASTER_MODE_BITMAP) == GlyphRasterModes.RASTER_MODE_BITMAP ? 0 : 1;\n            fontAsset.m_FreeGlyphRects = new List<GlyphRect>() { new GlyphRect(0, 0, atlasWidth - packingModifier, atlasHeight - packingModifier) };\n            fontAsset.m_UsedGlyphRects = new List<GlyphRect>();\n\n            // Create new Material and Add it as Sub-Asset\n            Material tmp_material = new Material(sourceFontAsset.material);\n\n            tmp_material.name = texture.name + \" Material\";\n            tmp_material.SetTexture(ShaderUtilities.ID_MainTex, texture);\n            tmp_material.SetFloat(ShaderUtilities.ID_TextureWidth, atlasWidth);\n            tmp_material.SetFloat(ShaderUtilities.ID_TextureHeight, atlasHeight);\n\n            tmp_material.SetFloat(ShaderUtilities.ID_GradientScale, atlasPadding + packingModifier);\n\n            tmp_material.SetFloat(ShaderUtilities.ID_WeightNormal, fontAsset.normalStyle);\n            tmp_material.SetFloat(ShaderUtilities.ID_WeightBold, fontAsset.boldStyle);\n\n            fontAsset.material = tmp_material;\n\n            AssetDatabase.AddObjectToAsset(tmp_material, fontAsset);\n\n            // Add Font Asset Creation Settings\n            // TODO\n\n            // Not sure if this is still necessary in newer versions of Unity.\n            EditorUtility.SetDirty(fontAsset);\n\n            AssetDatabase.SaveAssets();\n        }\n        */\n\n        //[MenuItem(\"Assets/Create/TextMeshPro/Font Asset #%F12\", true)]\n        //public static bool CreateFontAssetMenuValidation()\n        //{\n        //    return false;\n        //}\n\n        [MenuItem(\"Assets/Create/TextMeshPro/Font Asset #%F12\", false, 100)]\n        public static void CreateFontAsset()\n        {\n            Object target = Selection.activeObject;\n\n            // Make sure the selection is a font file\n            if (target == null || target.GetType() != typeof(Font))\n            {\n                Debug.LogWarning(\"A Font file must first be selected in order to create a Font Asset.\");\n                return;\n            }\n\n            Font sourceFont = (Font)target;\n\n            string sourceFontFilePath = AssetDatabase.GetAssetPath(target);\n\n            string folderPath = Path.GetDirectoryName(sourceFontFilePath);\n            string assetName = Path.GetFileNameWithoutExtension(sourceFontFilePath);\n\n            string newAssetFilePathWithName = AssetDatabase.GenerateUniqueAssetPath(folderPath + \"/\" + assetName + \" SDF.asset\");\n\n            //// Create new TM Font Asset.\n            TMP_FontAsset fontAsset = ScriptableObject.CreateInstance<TMP_FontAsset>();\n            AssetDatabase.CreateAsset(fontAsset, newAssetFilePathWithName);\n\n            fontAsset.version = \"1.1.0\";\n\n            // Set face information\n            FontEngine.InitializeFontEngine();\n            FontEngine.LoadFontFace(sourceFont, 90);\n            fontAsset.faceInfo = FontEngine.GetFaceInfo();\n\n            // Set font reference and GUID\n            fontAsset.m_SourceFontFileGUID = AssetDatabase.AssetPathToGUID(sourceFontFilePath);\n            fontAsset.m_SourceFontFile_EditorRef = sourceFont;\n            fontAsset.atlasPopulationMode = AtlasPopulationMode.Dynamic;\n\n            // Default atlas resolution is 1024 x 1024.\n            int atlasWidth = fontAsset.atlasWidth = 1024;\n            int atlasHeight = fontAsset.atlasHeight = 1024;\n            int atlasPadding = fontAsset.atlasPadding = 9;\n            fontAsset.atlasRenderMode = GlyphRenderMode.SDFAA;\n\n            // Initialize array for the font atlas textures.\n            fontAsset.atlasTextures = new Texture2D[1];\n\n            // Create atlas texture of size zero.\n            Texture2D texture = new Texture2D(0, 0, TextureFormat.Alpha8, false);\n\n            texture.name = assetName + \" Atlas\";\n            fontAsset.atlasTextures[0] = texture;\n            AssetDatabase.AddObjectToAsset(texture, fontAsset);\n\n            // Add free rectangle of the size of the texture.\n            int packingModifier = ((GlyphRasterModes)fontAsset.atlasRenderMode & GlyphRasterModes.RASTER_MODE_BITMAP) == GlyphRasterModes.RASTER_MODE_BITMAP ? 0 : 1;\n            fontAsset.freeGlyphRects = new List<GlyphRect>() { new GlyphRect(0, 0, atlasWidth - packingModifier, atlasHeight - packingModifier) };\n            fontAsset.usedGlyphRects = new List<GlyphRect>();\n\n            // Create new Material and Add it as Sub-Asset\n            Shader default_Shader = Shader.Find(\"TextMeshPro/Distance Field\");\n            Material tmp_material = new Material(default_Shader);\n\n            tmp_material.name = texture.name + \" Material\";\n            tmp_material.SetTexture(ShaderUtilities.ID_MainTex, texture);\n            tmp_material.SetFloat(ShaderUtilities.ID_TextureWidth, atlasWidth);\n            tmp_material.SetFloat(ShaderUtilities.ID_TextureHeight, atlasHeight);\n\n            tmp_material.SetFloat(ShaderUtilities.ID_GradientScale, atlasPadding + packingModifier);\n\n            tmp_material.SetFloat(ShaderUtilities.ID_WeightNormal, fontAsset.normalStyle);\n            tmp_material.SetFloat(ShaderUtilities.ID_WeightBold, fontAsset.boldStyle);\n\n            fontAsset.material = tmp_material;\n\n            AssetDatabase.AddObjectToAsset(tmp_material, fontAsset);\n\n            // Add Font Asset Creation Settings\n            fontAsset.creationSettings = new FontAssetCreationSettings(fontAsset.m_SourceFontFileGUID, fontAsset.faceInfo.pointSize, 0, atlasPadding, 0, 1024, 1024, 7, string.Empty, (int)GlyphRenderMode.SDFAA);\n\n            // Not sure if this is still necessary in newer versions of Unity.\n            EditorUtility.SetDirty(fontAsset);\n\n            AssetDatabase.SaveAssets();\n        }\n    }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_FontAsset_CreationMenu.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 7496af95dfe67cf429ac65edaaf99106\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_GlyphPairAdjustmentRecordPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\nusing UnityEngine.TextCore;\nusing UnityEngine.TextCore.LowLevel;\nusing UnityEditor;\nusing System.Collections;\nusing System.Text.RegularExpressions;\n\n\nnamespace TMPro.EditorUtilities\n{\n\n    [CustomPropertyDrawer(typeof(TMP_GlyphPairAdjustmentRecord))]\n    public class TMP_GlyphPairAdjustmentRecordPropertyDrawer : PropertyDrawer\n    {\n        private bool isEditingEnabled = false;\n        private bool isSelectable = false;\n\n        private string m_FirstCharacter = string.Empty;\n        private string m_SecondCharacter = string.Empty;\n        private string m_PreviousInput;\n\n        static GUIContent s_CharacterTextFieldLabel = new GUIContent(\"Char:\", \"Enter the character or its UTF16 or UTF32 Unicode character escape sequence. For UTF16 use \\\"\\\\uFF00\\\" and for UTF32 use \\\"\\\\UFF00FF00\\\" representation.\");\n\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\n        {\n            SerializedProperty prop_FirstAdjustmentRecord = property.FindPropertyRelative(\"m_FirstAdjustmentRecord\");\n            SerializedProperty prop_SecondAdjustmentRecord = property.FindPropertyRelative(\"m_SecondAdjustmentRecord\");\n\n            SerializedProperty prop_FirstGlyphIndex = prop_FirstAdjustmentRecord.FindPropertyRelative(\"m_GlyphIndex\");\n            SerializedProperty prop_FirstGlyphValueRecord = prop_FirstAdjustmentRecord.FindPropertyRelative(\"m_GlyphValueRecord\");\n\n            SerializedProperty prop_SecondGlyphIndex = prop_SecondAdjustmentRecord.FindPropertyRelative(\"m_GlyphIndex\");\n            SerializedProperty prop_SecondGlyphValueRecord = prop_SecondAdjustmentRecord.FindPropertyRelative(\"m_GlyphValueRecord\");\n\n            SerializedProperty prop_FontFeatureLookupFlags = property.FindPropertyRelative(\"m_FeatureLookupFlags\");\n\n            position.yMin += 2;\n\n            float width = position.width / 2;\n            float padding = 5.0f;\n\n            Rect rect;\n\n            isEditingEnabled = GUI.enabled;\n            isSelectable = label.text == \"Selectable\" ? true : false;\n\n            if (isSelectable)\n                GUILayoutUtility.GetRect(position.width, 75);\n            else\n                GUILayoutUtility.GetRect(position.width, 55);\n\n            GUIStyle style = new GUIStyle(EditorStyles.label);\n            style.richText = true;\n\n            // First Glyph\n            GUI.enabled = isEditingEnabled;\n            if (isSelectable)\n            {\n                rect = new Rect(position.x + 70, position.y, position.width, 49);\n\n                float labelWidth = GUI.skin.label.CalcSize(new GUIContent(\"ID: \" + prop_FirstGlyphIndex.intValue)).x;\n                EditorGUI.LabelField(new Rect(position.x + (64 - labelWidth) / 2, position.y + 60, 64f, 18f), new GUIContent(\"ID: <color=#FFFF80>\" + prop_FirstGlyphIndex.intValue + \"</color>\"), style);\n\n                GUI.enabled = isEditingEnabled;\n                EditorGUIUtility.labelWidth = 30f;\n\n                rect = new Rect(position.x + 70, position.y + 10, (width - 70) - padding, 18);\n                EditorGUI.PropertyField(rect, prop_FirstGlyphValueRecord.FindPropertyRelative(\"m_XPlacement\"), new GUIContent(\"OX:\"));\n\n                rect.y += 20;\n                EditorGUI.PropertyField(rect, prop_FirstGlyphValueRecord.FindPropertyRelative(\"m_YPlacement\"), new GUIContent(\"OY:\"));\n\n                rect.y += 20;\n                EditorGUI.PropertyField(rect, prop_FirstGlyphValueRecord.FindPropertyRelative(\"m_XAdvance\"), new GUIContent(\"AX:\"));\n\n                //rect.y += 20;\n                //EditorGUI.PropertyField(rect, prop_FirstGlyphValueRecord.FindPropertyRelative(\"m_YAdvance\"), new GUIContent(\"AY:\"));\n\n                DrawGlyph((uint)prop_FirstGlyphIndex.intValue, new Rect(position.x, position.y, position.width, position.height), property);\n            }\n            else\n            {\n                rect = new Rect(position.x, position.y, width / 2 * 0.8f - padding, 18);\n                EditorGUIUtility.labelWidth = 40f;\n\n                // First Character Lookup\n                GUI.SetNextControlName(\"FirstCharacterField\");\n                EditorGUI.BeginChangeCheck();\n                string firstCharacter = EditorGUI.TextField(rect, s_CharacterTextFieldLabel, m_FirstCharacter);\n\n                if (GUI.GetNameOfFocusedControl() == \"FirstCharacterField\")\n                {\n                    if (ValidateInput(firstCharacter))\n                    {\n                        //Debug.Log(\"1st Unicode value: [\" + firstCharacter + \"]\");\n\n                        uint unicode = GetUnicodeCharacter(firstCharacter);\n\n                        // Lookup glyph index\n                        TMP_SerializedPropertyHolder propertyHolder = property.serializedObject.targetObject as TMP_SerializedPropertyHolder;\n                        TMP_FontAsset fontAsset = propertyHolder.fontAsset;\n                        if (fontAsset != null)\n                        {\n                            prop_FirstGlyphIndex.intValue = (int)fontAsset.GetGlyphIndex(unicode);\n                            propertyHolder.firstCharacter = unicode;\n                        }\n                    }\n                }\n\n                if (EditorGUI.EndChangeCheck())\n                    m_FirstCharacter = firstCharacter;\n\n                // First Glyph Index\n                rect.x += width / 2 * 0.8f;\n\n                EditorGUIUtility.labelWidth = 25f;\n                EditorGUI.BeginChangeCheck();\n                EditorGUI.PropertyField(rect, prop_FirstGlyphIndex, new GUIContent(\"ID:\"));\n                if (EditorGUI.EndChangeCheck())\n                {\n\n                }\n\n                GUI.enabled = isEditingEnabled;\n                EditorGUIUtility.labelWidth = 25f;\n\n                rect = new Rect(position.x, position.y + 20, width * 0.5f - padding, 18);\n                EditorGUI.PropertyField(rect, prop_FirstGlyphValueRecord.FindPropertyRelative(\"m_XPlacement\"), new GUIContent(\"OX\"));\n\n                rect.x += width * 0.5f;\n                EditorGUI.PropertyField(rect, prop_FirstGlyphValueRecord.FindPropertyRelative(\"m_YPlacement\"), new GUIContent(\"OY\"));\n\n                rect.x = position.x;\n                rect.y += 20;\n                EditorGUI.PropertyField(rect, prop_FirstGlyphValueRecord.FindPropertyRelative(\"m_XAdvance\"), new GUIContent(\"AX\"));\n\n                //rect.x += width * 0.5f;\n                //EditorGUI.PropertyField(rect, prop_FirstGlyphAdjustment.FindPropertyRelative(\"m_YAdvance\"), new GUIContent(\"AY\"));\n\n            }\n\n\n            // Second Glyph\n            GUI.enabled = isEditingEnabled;\n            if (isSelectable)\n            {\n                float labelWidth = GUI.skin.label.CalcSize(new GUIContent(\"ID: \" + prop_SecondGlyphIndex.intValue)).x;\n                EditorGUI.LabelField(new Rect(position.width / 2 + 20 + (64 - labelWidth) / 2, position.y + 60, 64f, 18f), new GUIContent(\"ID: <color=#FFFF80>\" + prop_SecondGlyphIndex.intValue + \"</color>\"), style);\n\n                GUI.enabled = isEditingEnabled;\n                EditorGUIUtility.labelWidth = 30f;\n\n                rect = new Rect(position.width / 2 + 20 + 70, position.y + 10, (width - 70) - padding, 18);\n                EditorGUI.PropertyField(rect, prop_SecondGlyphValueRecord.FindPropertyRelative(\"m_XPlacement\"), new GUIContent(\"OX:\"));\n\n                rect.y += 20;\n                EditorGUI.PropertyField(rect, prop_SecondGlyphValueRecord.FindPropertyRelative(\"m_YPlacement\"), new GUIContent(\"OY:\"));\n\n                rect.y += 20;\n                EditorGUI.PropertyField(rect, prop_SecondGlyphValueRecord.FindPropertyRelative(\"m_XAdvance\"), new GUIContent(\"AX:\"));\n\n                //rect.y += 20;\n                //EditorGUI.PropertyField(rect, prop_SecondGlyphAdjustment.FindPropertyRelative(\"m_YAdvance\"), new GUIContent(\"AY\"));\n\n                DrawGlyph((uint)prop_SecondGlyphIndex.intValue, new Rect(position.width / 2 + 20, position.y, position.width, position.height), property);\n            }\n            else\n            {\n                rect = new Rect(position.width / 2 + 20, position.y, width / 2 * 0.8f - padding, 18);\n                EditorGUIUtility.labelWidth = 40f;\n\n                // Second Character Lookup\n                GUI.SetNextControlName(\"SecondCharacterField\");\n                EditorGUI.BeginChangeCheck();\n                string secondCharacter = EditorGUI.TextField(rect, s_CharacterTextFieldLabel, m_SecondCharacter);\n\n                if (GUI.GetNameOfFocusedControl() == \"SecondCharacterField\")\n                {\n                    if (ValidateInput(secondCharacter))\n                    {\n                        //Debug.Log(\"2nd Unicode value: [\" + secondCharacter + \"]\");\n\n                        uint unicode = GetUnicodeCharacter(secondCharacter);\n\n                        // Lookup glyph index\n                        TMP_SerializedPropertyHolder propertyHolder = property.serializedObject.targetObject as TMP_SerializedPropertyHolder;\n                        TMP_FontAsset fontAsset = propertyHolder.fontAsset;\n                        if (fontAsset != null)\n                        {\n                            prop_SecondGlyphIndex.intValue = (int)fontAsset.GetGlyphIndex(unicode);\n                            propertyHolder.secondCharacter = unicode;\n                        }\n                    }\n                }\n\n                if (EditorGUI.EndChangeCheck())\n                    m_SecondCharacter = secondCharacter;\n\n                // Second Glyph Index\n                rect.x += width / 2 * 0.8f;\n\n                EditorGUIUtility.labelWidth = 25f;\n                EditorGUI.BeginChangeCheck();\n                EditorGUI.PropertyField(rect, prop_SecondGlyphIndex, new GUIContent(\"ID:\"));\n                if (EditorGUI.EndChangeCheck())\n                {\n\n                }\n\n                GUI.enabled = isEditingEnabled;\n                EditorGUIUtility.labelWidth = 25f;\n\n                rect = new Rect(position.width / 2 + 20, position.y + 20, width * 0.5f - padding, 18);\n                EditorGUI.PropertyField(rect, prop_SecondGlyphValueRecord.FindPropertyRelative(\"m_XPlacement\"), new GUIContent(\"OX\"));\n\n                rect.x += width * 0.5f;\n                EditorGUI.PropertyField(rect, prop_SecondGlyphValueRecord.FindPropertyRelative(\"m_YPlacement\"), new GUIContent(\"OY\"));\n\n                rect.x = position.width / 2 + 20;\n                rect.y += 20;\n                EditorGUI.PropertyField(rect, prop_SecondGlyphValueRecord.FindPropertyRelative(\"m_XAdvance\"), new GUIContent(\"AX\"));\n\n                //rect.x += width * 0.5f;\n                //EditorGUI.PropertyField(rect, prop_SecondGlyphAdjustment.FindPropertyRelative(\"m_YAdvance\"), new GUIContent(\"AY\"));\n            }\n\n            // Font Feature Lookup Flags\n            if (isSelectable)\n            {\n                EditorGUIUtility.labelWidth = 55f;\n\n                rect.x = position.width - 255;\n                rect.y += 23;\n                rect.width = 270; // width - 70 - padding;\n\n                FontFeatureLookupFlags flags = (FontFeatureLookupFlags)prop_FontFeatureLookupFlags.intValue;\n\n                EditorGUI.BeginChangeCheck();\n                flags = (FontFeatureLookupFlags)EditorGUI.EnumFlagsField(rect, new GUIContent(\"Options:\"), flags);\n                if (EditorGUI.EndChangeCheck())\n                {\n                    prop_FontFeatureLookupFlags.intValue = (int)flags;\n                }\n            }\n\n        }\n\n        bool ValidateInput(string source)\n        {\n            int length = string.IsNullOrEmpty(source) ? 0 : source.Length;\n\n            ////Filter out unwanted characters.\n            Event evt = Event.current;\n\n            char c = evt.character;\n\n            if (c != '\\0')\n            {\n                switch (length)\n                {\n                    case 0:\n                        break;\n                    case 1:\n                        if (source != m_PreviousInput)\n                            return true;\n\n                        if ((source[0] == '\\\\' && (c == 'u' || c == 'U')) == false)\n                            evt.character = '\\0';\n\n                        break;\n                    case 2:\n                    case 3:\n                    case 4:\n                    case 5:\n                        if ((c < '0' || c > '9') && (c < 'a' || c > 'f') && (c < 'A' || c > 'F'))\n                            evt.character = '\\0';\n                        break;\n                    case 6:\n                    case 7:\n                    case 8:\n                    case 9:\n                        if (source[1] == 'u' || (c < '0' || c > '9') && (c < 'a' || c > 'f') && (c < 'A' || c > 'F'))\n                            evt.character = '\\0';\n\n                        // Validate input\n                        if (length == 6 && source[1] == 'u' && source != m_PreviousInput)\n                            return true;\n                        break;\n                    case 10:\n                        if (source != m_PreviousInput)\n                            return true;\n\n                        evt.character = '\\0';\n                        break;\n                }\n            }\n\n            m_PreviousInput = source;\n\n            return false;\n        }\n\n        uint GetUnicodeCharacter (string source)\n        {\n            uint unicode;\n\n            if (source.Length == 1)\n                unicode = source[0];\n            else if (source.Length == 6)\n                unicode = (uint)TMP_TextUtilities.StringHexToInt(source.Replace(\"\\\\u\", \"\"));\n            else\n                unicode = (uint)TMP_TextUtilities.StringHexToInt(source.Replace(\"\\\\U\", \"\"));\n\n            return unicode;\n        }\n\n        void DrawGlyph(uint glyphIndex, Rect position, SerializedProperty property)\n        {\n            // Get a reference to the sprite texture\n            TMP_FontAsset fontAsset = property.serializedObject.targetObject as TMP_FontAsset;\n\n            if (fontAsset == null)\n                return;\n\n            // Check if glyph currently exists in the atlas texture.\n            if (!fontAsset.glyphLookupTable.TryGetValue(glyphIndex, out Glyph glyph))\n                return;\n\n            // Get reference to atlas texture.\n            int atlasIndex = fontAsset.m_AtlasTextureIndex;\n            Texture2D atlasTexture = fontAsset.atlasTextures.Length > atlasIndex ? fontAsset.atlasTextures[atlasIndex] : null;\n\n            if (atlasTexture == null)\n                return;\n\n            Material mat;\n            if (((GlyphRasterModes)fontAsset.atlasRenderMode & GlyphRasterModes.RASTER_MODE_BITMAP) == GlyphRasterModes.RASTER_MODE_BITMAP)\n            {\n                mat = TMP_FontAssetEditor.internalBitmapMaterial;\n\n                if (mat == null)\n                    return;\n\n                mat.mainTexture = atlasTexture;\n            }\n            else\n            {\n                mat = TMP_FontAssetEditor.internalSDFMaterial;\n\n                if (mat == null)\n                    return;\n\n                mat.mainTexture = atlasTexture;\n                mat.SetFloat(ShaderUtilities.ID_GradientScale, fontAsset.atlasPadding + 1);\n            }\n\n            // Draw glyph from atlas texture.\n            Rect glyphDrawPosition = new Rect(position.x, position.y + 2, 64, 60);\n\n            GlyphRect glyphRect = glyph.glyphRect;\n\n            float normalizedHeight = fontAsset.faceInfo.ascentLine - fontAsset.faceInfo.descentLine;\n            float scale = glyphDrawPosition.width / normalizedHeight;\n\n            // Compute the normalized texture coordinates\n            Rect texCoords = new Rect((float)glyphRect.x / atlasTexture.width, (float)glyphRect.y / atlasTexture.height, (float)glyphRect.width / atlasTexture.width, (float)glyphRect.height / atlasTexture.height);\n\n            if (Event.current.type == EventType.Repaint)\n            {\n                glyphDrawPosition.x += (glyphDrawPosition.width - glyphRect.width * scale) / 2;\n                glyphDrawPosition.y += (glyphDrawPosition.height - glyphRect.height * scale) / 2;\n                glyphDrawPosition.width = glyphRect.width * scale;\n                glyphDrawPosition.height = glyphRect.height * scale;\n\n                // Could switch to using the default material of the font asset which would require passing scale to the shader.\n                Graphics.DrawTexture(glyphDrawPosition, atlasTexture, texCoords, 0, 0, 0, 0, new Color(1f, 1f, 1f), mat);\n            }\n        }\n\n\n    }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_GlyphPairAdjustmentRecordPropertyDrawer.cs.meta",
    "content": "fileFormatVersion: 2\nguid: d256fa541faf5d4409992c631adb98a1\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_GlyphPropertyDrawer.cs",
    "content": "﻿ using UnityEngine;\nusing UnityEngine.TextCore;\nusing UnityEngine.TextCore.LowLevel;\nusing UnityEditor;\nusing System.Collections;\n\n\nnamespace TMPro.EditorUtilities\n{\n\n    [CustomPropertyDrawer(typeof(Glyph))]\n    public class TMP_GlyphPropertyDrawer : PropertyDrawer\n    {\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\n        {\n            SerializedProperty prop_GlyphIndex = property.FindPropertyRelative(\"m_Index\");\n            SerializedProperty prop_GlyphMetrics = property.FindPropertyRelative(\"m_Metrics\");\n            SerializedProperty prop_GlyphRect = property.FindPropertyRelative(\"m_GlyphRect\");\n            SerializedProperty prop_Scale = property.FindPropertyRelative(\"m_Scale\");\n            SerializedProperty prop_AtlasIndex = property.FindPropertyRelative(\"m_AtlasIndex\");\n\n            GUIStyle style = new GUIStyle(EditorStyles.label);\n            style.richText = true;\n\n            Rect rect = new Rect(position.x + 70, position.y, position.width, 49);\n\n            float labelWidth = GUI.skin.label.CalcSize(new GUIContent(\"ID: \" + prop_GlyphIndex.intValue)).x;\n            EditorGUI.LabelField(new Rect(position.x + (64 - labelWidth) / 2, position.y + 85, 64f, 18f), new GUIContent(\"ID: <color=#FFFF80>\" + prop_GlyphIndex.intValue + \"</color>\"), style);\n            //EditorGUIUtility.labelWidth = 22f;\n            //EditorGUI.DelayedIntField(new Rect(position.x + (64 - labelWidth) / 2, position.y + 89, 58f, 18f), prop_GlyphIndex, new GUIContent(\"ID:\"));\n\n            // We get Rect since a valid position may not be provided by the caller.\n            EditorGUI.PropertyField(new Rect(rect.x, rect.y, position.width, 49), prop_GlyphRect);\n\n            rect.y += 45;\n            EditorGUI.PropertyField(rect, prop_GlyphMetrics);\n\n            EditorGUIUtility.labelWidth = 40f;\n            EditorGUI.PropertyField(new Rect(rect.x, rect.y + 65, 75, 18), prop_Scale, new GUIContent(\"Scale:\")); // new GUIContent(\"Scale: <color=#FFFF80>\" + prop_Scale.floatValue + \"</color>\"), style);\n\n            EditorGUIUtility.labelWidth = 74f;\n            EditorGUI.PropertyField(new Rect(rect.x + 85, rect.y + 65, 95, 18), prop_AtlasIndex, new GUIContent(\"Atlas Index:\")); //  new GUIContent(\"Atlas Index: <color=#FFFF80>\" + prop_AtlasIndex.intValue + \"</color>\"), style);\n\n            DrawGlyph(position, property);\n        }\n\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\n        {\n            return 130f;\n        }\n\n        void DrawGlyph(Rect position, SerializedProperty property)\n        {\n            // Get a reference to the sprite texture\n            TMP_FontAsset fontAsset = property.serializedObject.targetObject as TMP_FontAsset;\n\n            if (fontAsset == null)\n                return;\n\n            // Get reference to atlas texture.\n            int atlasIndex = property.FindPropertyRelative(\"m_AtlasIndex\").intValue;\n            Texture2D atlasTexture = fontAsset.atlasTextures.Length > atlasIndex ? fontAsset.atlasTextures[atlasIndex] : null;\n\n            if (atlasTexture == null)\n                return;\n\n            Material mat;\n            if (((GlyphRasterModes)fontAsset.atlasRenderMode & GlyphRasterModes.RASTER_MODE_BITMAP) == GlyphRasterModes.RASTER_MODE_BITMAP)\n            {\n                mat = TMP_FontAssetEditor.internalBitmapMaterial;\n\n                if (mat == null)\n                    return;\n\n                mat.mainTexture = atlasTexture;\n                mat.SetColor(\"_Color\", Color.white);\n            }\n            else\n            {\n                mat = TMP_FontAssetEditor.internalSDFMaterial;\n\n                if (mat == null)\n                    return;\n\n                mat.mainTexture = atlasTexture;\n                mat.SetFloat(ShaderUtilities.ID_GradientScale, fontAsset.atlasPadding + 1);\n            }\n\n            // Draw glyph from atlas texture.\n            Rect glyphDrawPosition = new Rect(position.x, position.y + 2, 64, 80);\n\n            SerializedProperty prop_GlyphRect = property.FindPropertyRelative(\"m_GlyphRect\");\n\n            int glyphOriginX = prop_GlyphRect.FindPropertyRelative(\"m_X\").intValue;\n            int glyphOriginY = prop_GlyphRect.FindPropertyRelative(\"m_Y\").intValue;\n            int glyphWidth = prop_GlyphRect.FindPropertyRelative(\"m_Width\").intValue;\n            int glyphHeight = prop_GlyphRect.FindPropertyRelative(\"m_Height\").intValue;\n\n            float normalizedHeight = fontAsset.faceInfo.ascentLine - fontAsset.faceInfo.descentLine;\n            float scale = glyphDrawPosition.width / normalizedHeight;\n\n            // Compute the normalized texture coordinates\n            Rect texCoords = new Rect((float)glyphOriginX / atlasTexture.width, (float)glyphOriginY / atlasTexture.height, (float)glyphWidth / atlasTexture.width, (float)glyphHeight / atlasTexture.height);\n\n            if (Event.current.type == EventType.Repaint)\n            {\n                glyphDrawPosition.x += (glyphDrawPosition.width - glyphWidth * scale) / 2;\n                glyphDrawPosition.y += (glyphDrawPosition.height - glyphHeight * scale) / 2;\n                glyphDrawPosition.width = glyphWidth * scale;\n                glyphDrawPosition.height = glyphHeight * scale;\n\n                // Could switch to using the default material of the font asset which would require passing scale to the shader.\n                Graphics.DrawTexture(glyphDrawPosition, atlasTexture, texCoords, 0, 0, 0, 0, new Color(1f, 1f, 1f), mat);\n            }\n        }\n\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_GlyphPropertyDrawer.cs.meta",
    "content": "fileFormatVersion: 2\nguid: c4777500b5da6094e956c3d4f04de4db\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_InputFieldEditor.cs",
    "content": "﻿using UnityEngine;\nusing UnityEngine.UI;\nusing UnityEditor;\nusing UnityEditor.UI;\nusing UnityEditor.AnimatedValues;\n\n\nnamespace TMPro.EditorUtilities\n{\n    [CanEditMultipleObjects]\n    [CustomEditor(typeof(TMP_InputField), true)]\n    public class TMP_InputFieldEditor : SelectableEditor\n    {\n        private struct m_foldout\n        { // Track Inspector foldout panel states, globally.\n            public static bool textInput = true;\n            public static bool fontSettings = true;\n            public static bool extraSettings = true;\n            //public static bool shadowSetting = false;\n            //public static bool materialEditor = true;\n        }\n\n        SerializedProperty m_TextViewport;\n        SerializedProperty m_TextComponent;\n        SerializedProperty m_Text;\n        SerializedProperty m_ContentType;\n        SerializedProperty m_LineType;\n        SerializedProperty m_LineLimit;\n        SerializedProperty m_InputType;\n        SerializedProperty m_CharacterValidation;\n        SerializedProperty m_InputValidator;\n        SerializedProperty m_RegexValue;\n        SerializedProperty m_KeyboardType;\n        SerializedProperty m_CharacterLimit;\n        SerializedProperty m_CaretBlinkRate;\n        SerializedProperty m_CaretWidth;\n        SerializedProperty m_CaretColor;\n        SerializedProperty m_CustomCaretColor;\n        SerializedProperty m_SelectionColor;\n        SerializedProperty m_HideMobileKeyboard;\n        SerializedProperty m_HideMobileInput;\n        SerializedProperty m_Placeholder;\n        SerializedProperty m_VerticalScrollbar;\n        SerializedProperty m_ScrollbarScrollSensitivity;\n        SerializedProperty m_OnValueChanged;\n        SerializedProperty m_OnEndEdit;\n        SerializedProperty m_OnSelect;\n        SerializedProperty m_OnDeselect;\n        SerializedProperty m_ReadOnly;\n        SerializedProperty m_RichText;\n        SerializedProperty m_RichTextEditingAllowed;\n        SerializedProperty m_ResetOnDeActivation;\n        SerializedProperty m_RestoreOriginalTextOnEscape;\n\n        SerializedProperty m_OnFocusSelectAll;\n        SerializedProperty m_GlobalPointSize;\n        SerializedProperty m_GlobalFontAsset;\n\n        AnimBool m_CustomColor;\n\n        //TMP_InputValidator m_ValidationScript;\n\n        protected override void OnEnable()\n        {\n            base.OnEnable();\n\n            m_TextViewport = serializedObject.FindProperty(\"m_TextViewport\");\n            m_TextComponent = serializedObject.FindProperty(\"m_TextComponent\");\n            m_Text = serializedObject.FindProperty(\"m_Text\");\n            m_ContentType = serializedObject.FindProperty(\"m_ContentType\");\n            m_LineType = serializedObject.FindProperty(\"m_LineType\");\n            m_LineLimit = serializedObject.FindProperty(\"m_LineLimit\");\n            m_InputType = serializedObject.FindProperty(\"m_InputType\");\n            m_CharacterValidation = serializedObject.FindProperty(\"m_CharacterValidation\");\n            m_InputValidator = serializedObject.FindProperty(\"m_InputValidator\");\n            m_RegexValue = serializedObject.FindProperty(\"m_RegexValue\");\n            m_KeyboardType = serializedObject.FindProperty(\"m_KeyboardType\");\n            m_CharacterLimit = serializedObject.FindProperty(\"m_CharacterLimit\");\n            m_CaretBlinkRate = serializedObject.FindProperty(\"m_CaretBlinkRate\");\n            m_CaretWidth = serializedObject.FindProperty(\"m_CaretWidth\");\n            m_CaretColor = serializedObject.FindProperty(\"m_CaretColor\");\n            m_CustomCaretColor = serializedObject.FindProperty(\"m_CustomCaretColor\");\n            m_SelectionColor = serializedObject.FindProperty(\"m_SelectionColor\");\n\n            m_HideMobileKeyboard = serializedObject.FindProperty(\"m_HideSoftKeyboard\");\n            m_HideMobileInput = serializedObject.FindProperty(\"m_HideMobileInput\");\n\n            m_Placeholder = serializedObject.FindProperty(\"m_Placeholder\");\n            m_VerticalScrollbar = serializedObject.FindProperty(\"m_VerticalScrollbar\");\n            m_ScrollbarScrollSensitivity = serializedObject.FindProperty(\"m_ScrollSensitivity\");\n\n            m_OnValueChanged = serializedObject.FindProperty(\"m_OnValueChanged\");\n            m_OnEndEdit = serializedObject.FindProperty(\"m_OnEndEdit\");\n            m_OnSelect = serializedObject.FindProperty(\"m_OnSelect\");\n            m_OnDeselect = serializedObject.FindProperty(\"m_OnDeselect\");\n            m_ReadOnly = serializedObject.FindProperty(\"m_ReadOnly\");\n            m_RichText = serializedObject.FindProperty(\"m_RichText\");\n            m_RichTextEditingAllowed = serializedObject.FindProperty(\"m_isRichTextEditingAllowed\");\n            m_ResetOnDeActivation = serializedObject.FindProperty(\"m_ResetOnDeActivation\");\n            m_RestoreOriginalTextOnEscape = serializedObject.FindProperty(\"m_RestoreOriginalTextOnEscape\");\n\n            m_OnFocusSelectAll = serializedObject.FindProperty(\"m_OnFocusSelectAll\");\n            m_GlobalPointSize = serializedObject.FindProperty(\"m_GlobalPointSize\");\n            m_GlobalFontAsset = serializedObject.FindProperty(\"m_GlobalFontAsset\");\n\n            m_CustomColor = new AnimBool(m_CustomCaretColor.boolValue);\n            m_CustomColor.valueChanged.AddListener(Repaint);\n        }\n\n        protected override void OnDisable()\n        {\n            base.OnDisable();\n            m_CustomColor.valueChanged.RemoveListener(Repaint);\n        }\n\n        public override void OnInspectorGUI()\n        {\n            serializedObject.Update();\n\n            base.OnInspectorGUI();\n\n            EditorGUILayout.Space();\n\n            EditorGUILayout.PropertyField(m_TextViewport);\n\n            EditorGUILayout.PropertyField(m_TextComponent);\n\n            TextMeshProUGUI text = null;\n            if (m_TextComponent != null && m_TextComponent.objectReferenceValue != null)\n            {\n                text = m_TextComponent.objectReferenceValue as TextMeshProUGUI;\n                //if (text.supportRichText)\n                //{\n                //    EditorGUILayout.HelpBox(\"Using Rich Text with input is unsupported.\", MessageType.Warning);\n                //}\n            }\n\n            EditorGUI.BeginDisabledGroup(m_TextComponent == null || m_TextComponent.objectReferenceValue == null);\n\n            // TEXT INPUT BOX\n            EditorGUILayout.PropertyField(m_Text);\n\n            // INPUT FIELD SETTINGS\n            #region INPUT FIELD SETTINGS\n\n            m_foldout.fontSettings = EditorGUILayout.Foldout(m_foldout.fontSettings, \"Input Field Settings\", true, TMP_UIStyleManager.boldFoldout);\n\n            if (m_foldout.fontSettings)\n            {\n                EditorGUI.indentLevel++;\n                EditorGUI.BeginChangeCheck();\n                EditorGUILayout.PropertyField(m_GlobalFontAsset, new GUIContent(\"Font Asset\", \"Set the Font Asset for both Placeholder and Input Field text object.\"));\n                if (EditorGUI.EndChangeCheck())\n                {\n                    TMP_InputField inputField = target as TMP_InputField;\n                    inputField.SetGlobalFontAsset(m_GlobalFontAsset.objectReferenceValue as TMP_FontAsset);\n                }\n\n\n                EditorGUI.BeginChangeCheck();\n                EditorGUILayout.PropertyField(m_GlobalPointSize, new GUIContent(\"Point Size\", \"Set the point size of both Placeholder and Input Field text object.\"));\n                if (EditorGUI.EndChangeCheck())\n                {\n                    TMP_InputField inputField = target as TMP_InputField;\n                    inputField.SetGlobalPointSize(m_GlobalPointSize.floatValue);\n                }\n\n                EditorGUI.BeginChangeCheck();\n                EditorGUILayout.PropertyField(m_CharacterLimit);\n\n                EditorGUILayout.Space();\n\n                EditorGUILayout.PropertyField(m_ContentType);\n                if (!m_ContentType.hasMultipleDifferentValues)\n                {\n                    EditorGUI.indentLevel++;\n\n                    if (m_ContentType.enumValueIndex == (int)TMP_InputField.ContentType.Standard ||\n                        m_ContentType.enumValueIndex == (int)TMP_InputField.ContentType.Autocorrected ||\n                        m_ContentType.enumValueIndex == (int)TMP_InputField.ContentType.Custom)\n                    {\n                        EditorGUI.BeginChangeCheck();\n                        EditorGUILayout.PropertyField(m_LineType);\n                        if (EditorGUI.EndChangeCheck())\n                        {\n                            if (text != null)\n                            {\n                                if (m_LineType.enumValueIndex == (int)TMP_InputField.LineType.SingleLine)\n                                    text.enableWordWrapping = false;\n                                else\n                                {\n                                    text.enableWordWrapping = true;\n                                }\n                            }\n                        }\n\n                        if (m_LineType.enumValueIndex != (int)TMP_InputField.LineType.SingleLine)\n                        {\n                            EditorGUILayout.PropertyField(m_LineLimit);\n                        }\n                    }\n\n                    if (m_ContentType.enumValueIndex == (int)TMP_InputField.ContentType.Custom)\n                    {\n                        EditorGUILayout.PropertyField(m_InputType);\n                        EditorGUILayout.PropertyField(m_KeyboardType);\n                        EditorGUILayout.PropertyField(m_CharacterValidation);\n                        if (m_CharacterValidation.enumValueIndex == (int)TMP_InputField.CharacterValidation.Regex)\n                        {\n                            EditorGUILayout.PropertyField(m_RegexValue);\n                        }\n                        else if (m_CharacterValidation.enumValueIndex == (int)TMP_InputField.CharacterValidation.CustomValidator)\n                        {\n                            EditorGUILayout.PropertyField(m_InputValidator);\n                        }\n                    }\n\n                    EditorGUI.indentLevel--;\n                }\n\n                EditorGUILayout.Space();\n\n                EditorGUILayout.PropertyField(m_Placeholder);\n                EditorGUILayout.PropertyField(m_VerticalScrollbar);\n\n                if (m_VerticalScrollbar.objectReferenceValue != null)\n                    EditorGUILayout.PropertyField(m_ScrollbarScrollSensitivity);\n\n                EditorGUILayout.PropertyField(m_CaretBlinkRate);\n                EditorGUILayout.PropertyField(m_CaretWidth);\n\n                EditorGUILayout.PropertyField(m_CustomCaretColor);\n\n                m_CustomColor.target = m_CustomCaretColor.boolValue;\n\n                if (EditorGUILayout.BeginFadeGroup(m_CustomColor.faded))\n                {\n                    EditorGUILayout.PropertyField(m_CaretColor);\n                }\n                EditorGUILayout.EndFadeGroup();\n\n                EditorGUILayout.PropertyField(m_SelectionColor);\n                \n                EditorGUI.indentLevel--;\n            }\n            #endregion\n\n\n            // CONTROL SETTINGS\n            #region CONTROL SETTINGS\n            m_foldout.extraSettings = EditorGUILayout.Foldout(m_foldout.extraSettings, \"Control Settings\", true, TMP_UIStyleManager.boldFoldout);\n\n            if (m_foldout.extraSettings)\n            {\n                EditorGUI.indentLevel++;\n\n                EditorGUILayout.PropertyField(m_OnFocusSelectAll, new GUIContent(\"OnFocus - Select All\", \"Should all the text be selected when the Input Field is selected.\"));\n                EditorGUILayout.PropertyField(m_ResetOnDeActivation, new GUIContent(\"Reset On DeActivation\", \"Should the Text and Caret position be reset when Input Field is DeActivated.\"));\n                EditorGUILayout.PropertyField(m_RestoreOriginalTextOnEscape, new GUIContent(\"Restore On ESC Key\", \"Should the original text be restored when pressing ESC.\"));\n                EditorGUILayout.PropertyField(m_HideMobileKeyboard, new GUIContent(\"Hide Soft Keyboard\", \"Controls the visibility of the mobile virtual keyboard.\"));\n                EditorGUILayout.PropertyField(m_HideMobileInput, new GUIContent(\"Hide Mobile Input\", \"Controls the visibility of the editable text field above the mobile virtual keyboard. Not supported on all mobile platforms.\"));\n                EditorGUILayout.PropertyField(m_ReadOnly);\n                EditorGUILayout.PropertyField(m_RichText);\n                EditorGUILayout.PropertyField(m_RichTextEditingAllowed, new GUIContent(\"Allow Rich Text Editing\"));\n                \n                EditorGUI.indentLevel--;\n            }\n            #endregion\n\n\n            EditorGUILayout.Space();\n\n            EditorGUILayout.PropertyField(m_OnValueChanged);\n            EditorGUILayout.PropertyField(m_OnEndEdit);\n            EditorGUILayout.PropertyField(m_OnSelect);\n            EditorGUILayout.PropertyField(m_OnDeselect);\n\n            EditorGUI.EndDisabledGroup();\n\n            serializedObject.ApplyModifiedProperties();\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_InputFieldEditor.cs.meta",
    "content": "fileFormatVersion: 2\nguid: aa160f27c3fe4052a5850e21108811b6\ntimeCreated: 1457861621\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_MeshRendererEditor.cs",
    "content": "﻿// When enabled, allows setting the material by dropping a material onto the MeshRenderer inspector component. \n// The drawback is that the MeshRenderer inspector will not have properties for light probes, so if you need light probe support, do not enable this.\n//#define ALLOW_MESHRENDERER_MATERIAL_DRAG_N_DROP\n\nusing UnityEngine;\nusing UnityEditor;\nusing System.Collections;\n\n\nnamespace TMPro.EditorUtilities\n{\n    // Disabled for compatibility reason as lightprobe setup isn't supported due to inability to inherit from MeshRendererEditor class\n#if ALLOW_MESHRENDERER_MATERIAL_DRAG_N_DROP\n    [CanEditMultipleObjects]\n    [CustomEditor(typeof(MeshRenderer))]\n    public class TMP_MeshRendererEditor : Editor\n    {\n        private SerializedProperty m_Materials;\n\n        void OnEnable()\n        {\n            m_Materials = serializedObject.FindProperty(\"m_Materials\");\n        }\n\n\n        public override void OnInspectorGUI()\n        {\n            serializedObject.Update();\n\n            // Get a reference to the current material.\n            SerializedProperty material_prop = m_Materials.GetArrayElementAtIndex(0);\n            Material currentMaterial = material_prop.objectReferenceValue as Material;\n\n            EditorGUI.BeginChangeCheck();\n            base.OnInspectorGUI();\n            if (EditorGUI.EndChangeCheck())\n            {\n                material_prop = m_Materials.GetArrayElementAtIndex(0);\n\n                TMP_FontAsset newFontAsset = null;\n                Material newMaterial = null;\n\n                if (material_prop != null)\n                    newMaterial = material_prop.objectReferenceValue as Material;\n\n                // Check if the new material is referencing a different font atlas texture.\n                if (newMaterial != null && currentMaterial.GetInstanceID() != newMaterial.GetInstanceID())\n                {\n                    // Search for the Font Asset matching the new font atlas texture.\n                    newFontAsset = TMP_EditorUtility.FindMatchingFontAsset(newMaterial);\n                }\n\n\n                GameObject[] objects = Selection.gameObjects;\n\n                for (int i = 0; i < objects.Length; i++)\n                {\n                    // Assign new font asset\n                    if (newFontAsset != null)\n                    {\n                        TMP_Text textComponent = objects[i].GetComponent<TMP_Text>();\n\n                        if (textComponent != null)\n                        {\n                            Undo.RecordObject(textComponent, \"Font Asset Change\");\n                            textComponent.font = newFontAsset;\n                        }\n                    }\n\n                    TMPro_EventManager.ON_DRAG_AND_DROP_MATERIAL_CHANGED(objects[i], currentMaterial, newMaterial);\n                }\n            }\n        }\n    }\n#endif\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_MeshRendererEditor.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 6d437b997e074079b4b2f6e395394f4b\ntimeCreated: 1462864011\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_PackageUtilities.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System;\nusing System.IO;\nusing System.Linq;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing TMPro.EditorUtilities;\n\n\nnamespace TMPro\n{\n    /// <summary>\n    /// Data structure containing the target and replacement fileIDs and GUIDs which will require remapping from previous version of TextMesh Pro to the new TextMesh Pro UPM package.\n    /// </summary>\n    [System.Serializable]\n    struct AssetConversionRecord\n    {\n        public string referencedResource;\n        public string target;\n        public string replacement;\n    }\n\n\n    /// <summary>\n    /// Data structure containing a list of target and replacement fileID and GUID requiring remapping from previous versions of TextMesh Pro to the new TextMesh Pro UPM package.\n    /// This data structure is populated with the data contained in the PackageConversionData.json file included in the package.\n    /// </summary>\n    [System.Serializable]\n    class AssetConversionData\n    {\n        public List<AssetConversionRecord> assetRecords;\n    }\n\n\n    public class TMP_ProjectConversionUtility : EditorWindow\n    {\n        // Create Sprite Asset Editor Window\n        [MenuItem(\"Window/TextMeshPro/Project Files GUID Remapping Tool\", false, 2100)]\n        static void ShowConverterWindow()\n        {\n            var window = GetWindow<TMP_ProjectConversionUtility>();\n            window.titleContent = new GUIContent(\"Conversion Tool\");\n            window.Focus();\n        }\n\n        private static HashSet<Type> m_IgnoreAssetTypes = new HashSet<Type>()\n        {\n            typeof(AnimatorOverrideController),\n            typeof(AudioClip),\n            typeof(AvatarMask),\n            typeof(ComputeShader),\n            typeof(Cubemap),\n            typeof(DefaultAsset),\n            typeof(Flare),\n            typeof(Font),\n            typeof(GUISkin),\n            typeof(HumanTemplate),\n            typeof(LightingDataAsset),\n            typeof(Mesh),\n            typeof(MonoScript),\n            typeof(PhysicMaterial),\n            typeof(PhysicsMaterial2D),\n            typeof(RenderTexture),\n            typeof(Shader),\n            typeof(TerrainData),\n            typeof(TextAsset),\n            typeof(Texture2D),\n            typeof(Texture2DArray),\n            typeof(Texture3D),\n            typeof(UnityEditor.Animations.AnimatorController),\n            typeof(UnityEditorInternal.AssemblyDefinitionAsset),\n            typeof(UnityEngine.AI.NavMeshData),\n            typeof(UnityEngine.Tilemaps.Tile),\n            typeof(UnityEngine.U2D.SpriteAtlas),\n            typeof(UnityEngine.Video.VideoClip),\n        };\n\n        /// <summary>\n        /// \n        /// </summary>\n        struct AssetModificationRecord\n        {\n            public string assetFilePath;\n            public string assetDataFile;\n        }\n\n        struct AssetFileRecord\n        {\n            public string assetFilePath;\n            public string assetMetaFilePath;\n\n            public AssetFileRecord(string filePath, string metaFilePath)\n            {\n                this.assetFilePath = filePath;\n                this.assetMetaFilePath = metaFilePath;\n            }\n        }\n\n        private static string m_ProjectPath;\n        private static string m_ProjectFolderToScan;\n        private static bool m_IsAlreadyScanningProject;\n        private static bool m_CancelScanProcess;\n        private static string k_ProjectScanReportDefaultText = \"<color=#FFFF80><b>Project Scan Results</b></color>\\n\";\n        private static string k_ProjectScanLabelPrefix = \"Scanning: \";\n        private static string m_ProjectScanResults = string.Empty;\n        private static Vector2 m_ProjectScanResultScrollPosition;\n        private static float m_ProgressPercentage = 0;\n\n        private static int m_ScanningTotalFiles;\n        private static int m_RemainingFilesToScan;\n        private static int m_ScanningCurrentFileIndex;\n        private static string m_ScanningCurrentFileName;\n\n        private static AssetConversionData m_ConversionData;\n\n        private static List<AssetModificationRecord> m_ModifiedAssetList = new List<AssetModificationRecord>();\n\n\n        void OnEnable()\n        {\n            // Set Editor Window Size\n            SetEditorWindowSize();\n\n            m_ProjectScanResults = k_ProjectScanReportDefaultText;\n        }\n\n\n        void OnGUI()\n        {\n            GUILayout.BeginVertical();\n            {\n                // Scan project files and resources\n                GUILayout.BeginVertical(EditorStyles.helpBox);\n                {\n                    GUILayout.Label(\"Scan Project Files\", EditorStyles.boldLabel);\n                    GUILayout.Label(\"Press the <i>Scan Project Files</i> button to begin scanning your project for files & resources that were created with a previous version of TextMesh Pro.\", TMP_UIStyleManager.label);\n                    GUILayout.Space(10f);\n                    GUILayout.Label(\"Project folder to be scanned. Example \\\"Assets/TextMesh Pro\\\"\");\n                    m_ProjectFolderToScan = EditorGUILayout.TextField(\"Folder Path:      Assets/\", m_ProjectFolderToScan);\n                    GUILayout.Space(5f);\n\n                    GUI.enabled = m_IsAlreadyScanningProject == false ? true : false;\n                    if (GUILayout.Button(\"Scan Project Files\"))\n                    {\n                        m_CancelScanProcess = false;\n\n                        // Make sure Asset Serialization mode is set to ForceText and Version Control mode to Visible Meta Files.\n                        if (CheckProjectSerializationAndSourceControlModes() == true)\n                        {\n                            m_ProjectPath = Path.GetFullPath(\"Assets/..\");\n                            TMP_EditorCoroutine.StartCoroutine(ScanProjectFiles());\n                        }\n                        else\n                        {\n                            EditorUtility.DisplayDialog(\"Project Settings Change Required\", \"In menu options \\\"Edit - Project Settings - Editor\\\", please change Asset Serialization Mode to ForceText and Source Control Mode to Visible Meta Files.\", \"OK\", string.Empty);\n                        }\n                    }\n                    GUI.enabled = true;\n\n                    // Display progress bar\n                    Rect rect = GUILayoutUtility.GetRect(0f, 20f, GUILayout.ExpandWidth(true));\n                    EditorGUI.ProgressBar(rect, m_ProgressPercentage, \"Scan Progress (\" + m_ScanningCurrentFileIndex + \"/\" + m_ScanningTotalFiles + \")\");\n\n                    // Display cancel button and name of file currently being scanned.\n                    if (m_IsAlreadyScanningProject)\n                    {\n                        Rect cancelRect = new Rect(rect.width - 20, rect.y + 2, 20, 16);\n                        if (GUI.Button(cancelRect, \"X\"))\n                        {\n                            m_CancelScanProcess = true;\n                        }\n                        GUILayout.Label(k_ProjectScanLabelPrefix + m_ScanningCurrentFileName, TMP_UIStyleManager.label);\n                    }\n                    else\n                        GUILayout.Label(string.Empty);\n\n                    GUILayout.Space(5);\n\n                    // Creation Feedback\n                    GUILayout.BeginVertical(TMP_UIStyleManager.textAreaBoxWindow, GUILayout.ExpandHeight(true));\n                    {\n                        m_ProjectScanResultScrollPosition = EditorGUILayout.BeginScrollView(m_ProjectScanResultScrollPosition, GUILayout.ExpandHeight(true));\n                        EditorGUILayout.LabelField(m_ProjectScanResults, TMP_UIStyleManager.label);\n                        EditorGUILayout.EndScrollView();\n                    }\n                    GUILayout.EndVertical();\n                    GUILayout.Space(5f);\n                }\n                GUILayout.EndVertical();\n\n                // Scan project files and resources\n                GUILayout.BeginVertical(EditorStyles.helpBox);\n                {\n                    GUILayout.Label(\"Save Modified Project Files\", EditorStyles.boldLabel);\n                    GUILayout.Label(\"Pressing the <i>Save Modified Project Files</i> button will update the files in the <i>Project Scan Results</i> listed above. <color=#FFFF80>Please make sure that you have created a backup of your project first</color> as these file modifications are permanent and cannot be undone.\", TMP_UIStyleManager.label);\n                    GUILayout.Space(5f);\n\n                    GUI.enabled = m_IsAlreadyScanningProject == false && m_ModifiedAssetList.Count > 0 ? true : false;\n                    if (GUILayout.Button(\"Save Modified Project Files\"))\n                    {\n                        UpdateProjectFiles();\n                    }\n                    GUILayout.Space(10f);\n                }\n                GUILayout.EndVertical();\n\n            }\n            GUILayout.EndVertical();\n            GUILayout.Space(5f);\n        }\n\n        void OnInspectorUpdate()\n        {\n            Repaint();\n        }\n\n\n        /// <summary>\n        /// Limits the minimum size of the editor window.\n        /// </summary>\n        void SetEditorWindowSize()\n        {\n            EditorWindow editorWindow = this;\n\n            Vector2 currentWindowSize = editorWindow.minSize;\n\n            editorWindow.minSize = new Vector2(Mathf.Max(640, currentWindowSize.x), Mathf.Max(420, currentWindowSize.y));\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"filePath\"></param>\n        /// <returns></returns>\n        private static bool ShouldIgnoreFile(string filePath)\n        {\n            string fileExtension = Path.GetExtension(filePath);\n            Type fileType = AssetDatabase.GetMainAssetTypeAtPath(filePath);\n\n            if (m_IgnoreAssetTypes.Contains(fileType))\n                return true;\n\n            // Exclude FBX\n            if (fileType == typeof(GameObject) && fileExtension.ToLower() == \".fbx\") { return true; }\n            return false;\n        }\n\n\n        private IEnumerator ScanProjectFiles()\n        {\n            m_IsAlreadyScanningProject = true;\n            string packageFullPath = EditorUtilities.TMP_EditorUtility.packageFullPath;\n\n            // List containing assets that have been modified.\n            m_ProjectScanResults = k_ProjectScanReportDefaultText;\n            m_ModifiedAssetList.Clear();\n            m_ProgressPercentage = 0;\n\n            // Read Conversion Data from Json file.\n            if (m_ConversionData == null)\n                m_ConversionData = JsonUtility.FromJson<AssetConversionData>(File.ReadAllText(packageFullPath + \"/PackageConversionData.json\"));\n\n            // Get list of GUIDs for assets that might contain references to previous GUIDs that require updating.\n            string searchFolder = string.IsNullOrEmpty(m_ProjectFolderToScan) ? \"Assets\" : (\"Assets/\" + m_ProjectFolderToScan);\n            string[] guids = AssetDatabase.FindAssets(\"t:Object\", new string[] { searchFolder }).Distinct().ToArray();\n\n            k_ProjectScanLabelPrefix = \"<b>Phase 1 - Filtering:</b> \";\n            m_ScanningTotalFiles = guids.Length;\n            m_ScanningCurrentFileIndex = 0;\n\n            List<AssetFileRecord> projectFilesToScan = new List<AssetFileRecord>();\n\n            foreach (var guid in guids)\n            {\n                if (m_CancelScanProcess)\n                    break;\n\n                string assetFilePath = AssetDatabase.GUIDToAssetPath(guid);\n\n                m_ScanningCurrentFileIndex += 1;\n                m_ScanningCurrentFileName = assetFilePath;\n                m_ProgressPercentage = (float)m_ScanningCurrentFileIndex / m_ScanningTotalFiles;\n\n                // Filter out file types we have no interest in searching\n                if (ShouldIgnoreFile(assetFilePath))\n                    continue;\n\n                string assetMetaFilePath = AssetDatabase.GetTextMetaFilePathFromAssetPath(assetFilePath);\n\n                projectFilesToScan.Add(new AssetFileRecord(assetFilePath, assetMetaFilePath));\n\n                yield return null;\n            }\n\n            m_RemainingFilesToScan = m_ScanningTotalFiles = projectFilesToScan.Count;\n\n            k_ProjectScanLabelPrefix = \"<b>Phase 2 - Scanning:</b> \";\n\n            for (int i = 0; i < m_ScanningTotalFiles; i++)\n            {\n                if (m_CancelScanProcess)\n                    break;\n\n                AssetFileRecord fileRecord = projectFilesToScan[i];\n\n                Task.Run(() =>\n                {\n                    ScanProjectFileAsync(fileRecord);\n\n                    m_ScanningCurrentFileName = fileRecord.assetFilePath;\n\n                    int completedScans = m_ScanningTotalFiles - Interlocked.Decrement(ref m_RemainingFilesToScan);\n\n                    m_ScanningCurrentFileIndex = completedScans;\n                    m_ProgressPercentage = (float)completedScans / m_ScanningTotalFiles;\n                });\n\n                if (i % 64 == 0)\n                    yield return new WaitForSeconds(2.0f);\n\n            }\n\n            while (m_RemainingFilesToScan > 0 && !m_CancelScanProcess)\n                yield return null;\n\n            m_IsAlreadyScanningProject = false;\n            m_ScanningCurrentFileName = string.Empty;\n        }\n\n\n        static void ScanProjectFileAsync(AssetFileRecord fileRecord)\n        {\n            if (m_CancelScanProcess)\n                return;\n\n            // Read the asset data file\n            string assetDataFile = string.Empty;\n            bool hasFileChanged = false;\n\n            try\n            {\n                assetDataFile = File.ReadAllText(m_ProjectPath + \"/\" + fileRecord.assetFilePath);\n            }\n            catch\n            {\n                // Continue to the next asset if we can't read the current one.\n                return;\n            }\n\n            // Read the asset meta data file\n            string assetMetaFile = File.ReadAllText(m_ProjectPath + \"/\" + fileRecord.assetMetaFilePath);\n            bool hasMetaFileChanges = false;\n\n            foreach (AssetConversionRecord record in m_ConversionData.assetRecords)\n            {\n                if (assetDataFile.Contains(record.target))\n                {\n                    hasFileChanged = true;\n\n                    assetDataFile = assetDataFile.Replace(record.target, record.replacement);\n                }\n\n                //// Check meta file\n                if (assetMetaFile.Contains(record.target))\n                {\n                    hasMetaFileChanges = true;\n\n                    assetMetaFile = assetMetaFile.Replace(record.target, record.replacement);\n                }\n            }\n\n            if (hasFileChanged)\n            {\n                AssetModificationRecord modifiedAsset;\n                modifiedAsset.assetFilePath = fileRecord.assetFilePath;\n                modifiedAsset.assetDataFile = assetDataFile;\n\n                m_ModifiedAssetList.Add(modifiedAsset);\n\n                m_ProjectScanResults += fileRecord.assetFilePath + \"\\n\";\n            }\n\n            if (hasMetaFileChanges)\n            {\n                AssetModificationRecord modifiedAsset;\n                modifiedAsset.assetFilePath = fileRecord.assetMetaFilePath;\n                modifiedAsset.assetDataFile = assetMetaFile;\n\n                m_ModifiedAssetList.Add(modifiedAsset);\n\n                m_ProjectScanResults += fileRecord.assetMetaFilePath + \"\\n\";\n            }\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        private static void ResetScanProcess()\n        {\n            m_IsAlreadyScanningProject = false;\n            m_ScanningCurrentFileName = string.Empty;\n            m_ProgressPercentage = 0;\n            m_ScanningCurrentFileIndex = 0;\n            m_ScanningTotalFiles = 0;\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        private static void UpdateProjectFiles()\n        {\n            // Make sure Asset Serialization mode is set to ForceText with Visible Meta Files.\n            CheckProjectSerializationAndSourceControlModes();\n\n            string projectPath = Path.GetFullPath(\"Assets/..\");\n\n            // Display dialogue to show user a list of project files that will be modified upon their consent.\n            if (EditorUtility.DisplayDialog(\"Save Modified Asset(s)?\", \"Are you sure you want to save all modified assets?\", \"YES\", \"NO\"))\n            {\n                for (int i = 0; i < m_ModifiedAssetList.Count; i++)\n                {\n                    // Make sure all file streams that might have been opened by Unity are closed.\n                    //AssetDatabase.ReleaseCachedFileHandles();\n\n                    //Debug.Log(\"Writing asset file [\" + m_ModifiedAssetList[i].assetFilePath + \"].\");\n\n                    File.WriteAllText(projectPath + \"/\" + m_ModifiedAssetList[i].assetFilePath, m_ModifiedAssetList[i].assetDataFile);\n                }\n            }\n\n            AssetDatabase.Refresh();\n\n            m_ProgressPercentage = 0;\n            m_ProjectScanResults = k_ProjectScanReportDefaultText;\n        }\n\n\n        /// <summary>\n        /// Check project Asset Serialization and Source Control modes\n        /// </summary>\n        private static bool CheckProjectSerializationAndSourceControlModes()\n        {\n            // Check Project Asset Serialization and Visible Meta Files mode.\n            if (EditorSettings.serializationMode != SerializationMode.ForceText || EditorSettings.externalVersionControl != \"Visible Meta Files\")\n            {\n                return false;\n            }\n\n            return true;\n        }\n    }\n\n\n\n    public class TMP_PackageUtilities : Editor\n    {\n\n        enum SaveAssetDialogueOptions { Unset = 0, Save = 1, SaveAll = 2, DoNotSave = 3 };\n\n        private static SerializationMode m_ProjectAssetSerializationMode;\n        private static string m_ProjectExternalVersionControl;\n\n        struct AssetRemappingRecord\n        {\n            public string oldGuid;\n            public string newGuid;\n            public string assetPath;\n        }\n\n        struct AssetModificationRecord\n        {\n            public string assetFilePath;\n            public string assetDataFile;\n        }\n\n        // Create Sprite Asset Editor Window\n        //[MenuItem(\"Window/TextMeshPro/Generate New Package GUIDs\", false, 1500)]\n        public static void GenerateNewPackageGUIDs_Menu()\n        {\n            GenerateNewPackageGUIDs();\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        [MenuItem(\"Window/TextMeshPro/Import TMP Essential Resources\", false, 2050)]\n        public static void ImportProjectResourcesMenu()\n        {\n            ImportProjectResources();\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        [MenuItem(\"Window/TextMeshPro/Import TMP Examples and Extras\", false, 2051)]\n        public static void ImportExamplesContentMenu()\n        {\n            ImportExtraContent();\n        }\n\n\n        // Create Sprite Asset Editor Window\n        //[MenuItem(\"Window/TextMeshPro/Convert TMP Project Files to UPM\", false, 1510)]\n        public static void ConvertProjectGUIDsMenu()\n        {\n            ConvertProjectGUIDsToUPM();\n\n            //GetVersionInfo();\n        }\n\n\n        // Create Sprite Asset Editor Window\n        //[MenuItem(\"Window/TextMeshPro/Convert GUID (Source to DLL)\", false, 2010)]\n        public static void ConvertGUIDFromSourceToDLLMenu()\n        {\n            //ConvertGUIDFromSourceToDLL();\n\n            //GetVersionInfo();\n        }\n\n\n        // Create Sprite Asset Editor Window\n        //[MenuItem(\"Window/TextMeshPro/Convert GUID (DLL to Source)\", false, 2020)]\n        public static void ConvertGUIDFromDllToSourceMenu()\n        {\n            //ConvertGUIDFromDLLToSource();\n\n            //GetVersionInfo();\n        }\n\n\n        // Create Sprite Asset Editor Window\n        //[MenuItem(\"Window/TextMeshPro/Extract Package GUIDs\", false, 1530)]\n        public static void ExtractPackageGUIDMenu()\n        {\n            ExtractPackageGUIDs();\n        }\n\n\n        private static void GetVersionInfo()\n        {\n            string version = TMP_Settings.version;\n            Debug.Log(\"The version of this TextMesh Pro UPM package is (\" + version + \").\");\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        private static void ImportExtraContent()\n        {\n            string packageFullPath = EditorUtilities.TMP_EditorUtility.packageFullPath;\n\n            AssetDatabase.ImportPackage(packageFullPath + \"/Package Resources/TMP Examples & Extras.unitypackage\", true);\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        private static void ImportProjectResources()\n        {\n            string packageFullPath = EditorUtilities.TMP_EditorUtility.packageFullPath;\n\n            AssetDatabase.ImportPackage(packageFullPath + \"/Package Resources/TMP Essential Resources.unitypackage\", true);\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        private static void GenerateNewPackageGUIDs()\n        {\n            // Make sure Asset Serialization mode is set to ForceText with Visible Meta Files.\n            SetProjectSerializationAndSourceControlModes();\n\n            string projectPath = Path.GetFullPath(\"Assets/..\");\n\n            // Clear existing dictionary of AssetRecords\n            List<AssetRemappingRecord> assetRecords = new List<AssetRemappingRecord>();\n\n            // Get full list of GUIDs used in the package which including folders.\n            string[] packageGUIDs = AssetDatabase.FindAssets(\"t:Object\", new string[] { \"Assets/Packages/com.unity.TextMeshPro\" });\n\n            for (int i = 0; i < packageGUIDs.Length; i++)\n            {\n                // Could add a progress bar for this process (if needed)\n\n                string guid = packageGUIDs[i];\n                string assetFilePath = AssetDatabase.GUIDToAssetPath(guid);\n                string assetMetaFilePath = AssetDatabase.GetTextMetaFilePathFromAssetPath(assetFilePath);\n                //System.Type assetType = AssetDatabase.GetMainAssetTypeAtPath(assetFilePath);\n\n                AssetRemappingRecord assetRecord;\n                assetRecord.oldGuid = guid;\n                assetRecord.assetPath = assetFilePath;\n\n                string newGUID = GenerateUniqueGUID();\n\n                assetRecord.newGuid = newGUID;\n\n                if (assetRecords.FindIndex(item => item.oldGuid == guid) != -1)\n                    continue;\n\n                assetRecords.Add(assetRecord);\n\n                // Read the meta file for the given asset.\n                string assetMetaFile = File.ReadAllText(projectPath + \"/\" + assetMetaFilePath);\n\n                assetMetaFile = assetMetaFile.Replace(\"guid: \" + guid, \"guid: \" + newGUID);\n\n                File.WriteAllText(projectPath + \"/\" + assetMetaFilePath, assetMetaFile);\n\n                //Debug.Log(\"Asset: [\" + assetFilePath + \"]   Type: \" + assetType + \"   Current GUID: [\" + guid + \"]   New GUID: [\" + newGUID + \"]\");\n            }\n\n            AssetDatabase.Refresh();\n\n            // Get list of GUIDs for assets that might need references to previous GUIDs which need to be updated.\n            packageGUIDs = AssetDatabase.FindAssets(\"t:Object\"); //  (\"t:Object\", new string[] { \"Assets/Asset Importer\" });\n\n            for (int i = 0; i < packageGUIDs.Length; i++)\n            {\n                // Could add a progress bar for this process\n\n                string guid = packageGUIDs[i];\n                string assetFilePath = AssetDatabase.GUIDToAssetPath(guid);\n                System.Type assetType = AssetDatabase.GetMainAssetTypeAtPath(assetFilePath);\n\n                // Filter out file types we are not interested in\n                if (assetType == typeof(DefaultAsset) || assetType == typeof(MonoScript) || assetType == typeof(Texture2D) || assetType == typeof(TextAsset) || assetType == typeof(Shader))\n                    continue;\n\n                // Read the asset data file\n                string assetDataFile = File.ReadAllText(projectPath + \"/\" + assetFilePath);\n\n                //Debug.Log(\"Searching Asset: [\" + assetFilePath + \"] of type: \" + assetType);\n\n                bool hasFileChanged = false;\n\n                foreach (AssetRemappingRecord record in assetRecords)\n                {\n                    if (assetDataFile.Contains(record.oldGuid))\n                    {\n                        hasFileChanged = true;\n\n                        assetDataFile = assetDataFile.Replace(record.oldGuid, record.newGuid);\n\n                        Debug.Log(\"Replacing old GUID: [\" + record.oldGuid + \"] by new GUID: [\" + record.newGuid + \"] in asset file: [\" + assetFilePath + \"].\");\n                    }\n                }\n\n                if (hasFileChanged)\n                {\n                    // Add file to list of changed files\n                    File.WriteAllText(projectPath + \"/\" + assetFilePath, assetDataFile);\n                }\n\n            }\n\n            AssetDatabase.Refresh();\n\n            // Restore project Asset Serialization and Source Control modes.\n            RestoreProjectSerializationAndSourceControlModes();\n        }\n\n\n        private static void ExtractPackageGUIDs()\n        {\n            // Make sure Asset Serialization mode is set to ForceText with Visible Meta Files.\n            SetProjectSerializationAndSourceControlModes();\n\n            string projectPath = Path.GetFullPath(\"Assets/..\");\n\n            // Create new instance of AssetConversionData file\n            AssetConversionData data = new AssetConversionData();\n            data.assetRecords = new List<AssetConversionRecord>();\n\n            // Get full list of GUIDs used in the package which including folders.\n            string[] packageGUIDs = AssetDatabase.FindAssets(\"t:Object\", new string[] { \"Assets/Packages/com.unity.TextMeshPro\" });\n\n            for (int i = 0; i < packageGUIDs.Length; i++)\n            {\n                // Could add a progress bar for this process (if needed)\n\n                string guid = packageGUIDs[i];\n                string assetFilePath = AssetDatabase.GUIDToAssetPath(guid);\n                //string assetMetaFilePath = AssetDatabase.GetTextMetaFilePathFromAssetPath(assetFilePath);\n\n                //ObjectIdentifier[] localIdentifider = BundleBuildInterface.GetPlayerObjectIdentifiersInAsset(new GUID(guid), BuildTarget.NoTarget);\n                //System.Type[] types = BundleBuildInterface.GetTypeForObjects(localIdentifider);\n\n                System.Type assetType = AssetDatabase.GetMainAssetTypeAtPath(assetFilePath);\n\n                // Filter out file types we are not interested in\n                if (assetType == typeof(DefaultAsset))\n                    continue;\n\n                string newGuid = GenerateUniqueGUID();\n\n                AssetConversionRecord record;\n                record.referencedResource = Path.GetFileName(assetFilePath);\n                record.target = \"fileID: 2108210716, guid: \" + newGuid;\n\n                record.replacement = \"fileID: 11500000, guid: \" + guid;\n\n                //if (m_AssetRecords.FindIndex(item => item.oldGuid == guid) != -1)\n                //    continue;\n\n                data.assetRecords.Add(record);\n\n                // Read the meta file for the given asset.\n                //string assetMetaFile = File.ReadAllText(projectPath + \"/\" + assetMetaFilePath);\n\n                //assetMetaFile = assetMetaFile.Replace(\"guid: \" + guid, \"guid: \" + newGUID);\n\n                //File.WriteAllText(projectPath + \"/\" + assetMetaFilePath, assetMetaFile);\n\n                Debug.Log(\"Asset: [\" + Path.GetFileName(assetFilePath) + \"]   Type: \" + assetType + \"   Current GUID: [\" + guid + \"]   New GUID: [\" + newGuid + \"]\");\n            }\n\n            // Write new information into JSON file\n            string dataFile = JsonUtility.ToJson(data, true);\n\n            File.WriteAllText(projectPath + \"/Assets/Packages/com.unity.TextMeshPro/PackageConversionData.json\", dataFile);\n\n            // Restore project Asset Serialization and Source Control modes.\n            RestoreProjectSerializationAndSourceControlModes();\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        private static void ConvertProjectGUIDsToUPM()\n        {\n            // Make sure Asset Serialization mode is set to ForceText with Visible Meta Files.\n            SetProjectSerializationAndSourceControlModes();\n\n            string projectPath = Path.GetFullPath(\"Assets/..\");\n            string packageFullPath = EditorUtilities.TMP_EditorUtility.packageFullPath;\n\n            // List containing assets that have been modified.\n            List<AssetModificationRecord> modifiedAssetList = new List<AssetModificationRecord>();\n\n            // Read Conversion Data from Json file.\n            AssetConversionData conversionData = JsonUtility.FromJson<AssetConversionData>(File.ReadAllText(packageFullPath + \"/PackageConversionData.json\"));\n\n            // Get list of GUIDs for assets that might contain references to previous GUIDs that require updating.\n            string[] projectGUIDs = AssetDatabase.FindAssets(\"t:Object\");\n\n            for (int i = 0; i < projectGUIDs.Length; i++)\n            {\n                // Could add a progress bar for this process\n\n                string guid = projectGUIDs[i];\n                string assetFilePath = AssetDatabase.GUIDToAssetPath(guid);\n                System.Type assetType = AssetDatabase.GetMainAssetTypeAtPath(assetFilePath);\n\n                // Filter out file types we are not interested in\n                if (assetType == typeof(DefaultAsset) || assetType == typeof(MonoScript) || assetType == typeof(Texture2D) || assetType == typeof(TextAsset) || assetType == typeof(Shader))\n                    continue;\n\n                // Read the asset data file\n                string assetDataFile = File.ReadAllText(projectPath + \"/\" + assetFilePath);\n\n                //Debug.Log(\"Searching Asset: [\" + assetFilePath + \"] of type: \" + assetType);\n\n                bool hasFileChanged = false;\n\n                foreach (AssetConversionRecord record in conversionData.assetRecords)\n                {\n                    if (assetDataFile.Contains(record.target))\n                    {\n                        hasFileChanged = true;\n\n                        assetDataFile = assetDataFile.Replace(record.target, record.replacement);\n\n                        Debug.Log(\"Replacing Reference to [\" + record.referencedResource + \"] using [\" + record.target + \"] with [\" + record.replacement + \"] in asset file: [\" + assetFilePath + \"].\");\n                    }\n                }\n\n                if (hasFileChanged)\n                {\n                    Debug.Log(\"Adding [\" + assetFilePath + \"] to list of assets to be modified.\");\n\n                    AssetModificationRecord modifiedAsset;\n                    modifiedAsset.assetFilePath = assetFilePath;\n                    modifiedAsset.assetDataFile = assetDataFile;\n\n                    modifiedAssetList.Add(modifiedAsset);\n                }\n\n            }\n\n            // Scan project meta files to update GUIDs of assets whose GUID has changed.\n            projectGUIDs = AssetDatabase.FindAssets(\"t:Object\");\n\n            for (int i = 0; i < projectGUIDs.Length; i++)\n            {\n                string guid = projectGUIDs[i];\n                string assetFilePath = AssetDatabase.GUIDToAssetPath(guid);\n                string assetMetaFilePath = AssetDatabase.GetTextMetaFilePathFromAssetPath(assetFilePath);\n\n                // Read the asset meta data file\n                string assetMetaFile = File.ReadAllText(projectPath + \"/\" + assetMetaFilePath);\n\n                bool hasFileChanged = false;\n\n                foreach (AssetConversionRecord record in conversionData.assetRecords)\n                {\n                    if (assetMetaFile.Contains(record.target))\n                    {\n                        hasFileChanged = true;\n\n                        assetMetaFile = assetMetaFile.Replace(record.target, record.replacement);\n\n                        Debug.Log(\"Replacing Reference to [\" + record.referencedResource + \"] using [\" + record.target + \"] with [\" + record.replacement + \"] in asset file: [\" + assetMetaFilePath + \"].\");\n                    }\n                }\n\n                if (hasFileChanged)\n                {\n                    Debug.Log(\"Adding [\" + assetMetaFilePath + \"] to list of meta files to be modified.\");\n\n                    AssetModificationRecord modifiedAsset;\n                    modifiedAsset.assetFilePath = assetMetaFilePath;\n                    modifiedAsset.assetDataFile = assetMetaFile;\n\n                    modifiedAssetList.Add(modifiedAsset);\n                }\n            }\n\n            // Display dialogue to show user a list of project files that will be modified upon their consent.\n            if (EditorUtility.DisplayDialog(\"Save Modified Asset(s)?\", \"Are you sure you want to save all modified assets?\", \"YES\", \"NO\"))\n            {\n                for (int i = 0; i < modifiedAssetList.Count; i++)\n                {\n                    // Make sure all file streams that might have been opened by Unity are closed.\n                    //AssetDatabase.ReleaseCachedFileHandles();\n\n                    Debug.Log(\"Writing asset file [\" + modifiedAssetList[i].assetFilePath + \"].\");\n\n                    //File.WriteAllText(projectPath + \"/\" + modifiedAssetList[i].assetFilePath, modifiedAssetList[i].assetDataFile);\n                }\n\n            }\n\n            AssetDatabase.Refresh();\n\n            // Restore project Asset Serialization and Source Control modes.\n            RestoreProjectSerializationAndSourceControlModes();\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        private static string GenerateUniqueGUID()\n        {\n            string monoGuid = System.Guid.NewGuid().ToString();\n\n            char[] charGuid = new char[32];\n            int index = 0;\n            for (int i = 0; i < monoGuid.Length; i++)\n            {\n                if (monoGuid[i] != '-')\n                    charGuid[index++] = monoGuid[i];\n            }\n\n            string guid = new string(charGuid);\n\n            // Make sure new GUID is not already used by some other asset.\n            if (AssetDatabase.GUIDToAssetPath(guid) != string.Empty)\n                guid = GenerateUniqueGUID();\n\n            return guid;\n        }\n\n\n        /// <summary>\n        /// Change project asset serialization mode to ForceText (if necessary)\n        /// </summary>\n        private static void SetProjectSerializationAndSourceControlModes()\n        {\n            // Make sure Asset Serialization mode is set to ForceText with Visible Meta Files.\n            m_ProjectAssetSerializationMode = EditorSettings.serializationMode;\n            if (m_ProjectAssetSerializationMode != SerializationMode.ForceText)\n                UnityEditor.EditorSettings.serializationMode = SerializationMode.ForceText;\n\n            m_ProjectExternalVersionControl = EditorSettings.externalVersionControl;\n            if (m_ProjectExternalVersionControl != \"Visible Meta Files\")\n                UnityEditor.EditorSettings.externalVersionControl = \"Visible Meta Files\";\n        }\n\n\n        /// <summary>\n        /// Revert potential change to asset serialization mode (if necessary)\n        /// </summary>\n        private static void RestoreProjectSerializationAndSourceControlModes()\n        {\n            // Make sure Asset Serialization mode is set to ForceText with Visible Meta Files.\n            if (m_ProjectAssetSerializationMode != EditorSettings.serializationMode)\n                EditorSettings.serializationMode = m_ProjectAssetSerializationMode;\n\n            if (m_ProjectExternalVersionControl != EditorSettings.externalVersionControl)\n                EditorSettings.externalVersionControl = m_ProjectExternalVersionControl;\n        }\n\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_PackageUtilities.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 68eedd4e5b33b37429c02c4add0036fe\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_PostBuildProcessHandler.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing UnityEditor.Callbacks;\nusing System.IO;\n\n\nnamespace TMPro\n{\n    public class TMP_PostBuildProcessHandler\n    {\n        [PostProcessBuildAttribute(10000)]\n        public static void OnPostprocessBuild(BuildTarget target, string pathToBuiltProject)\n        {\n            // Check if TMP Essential Resource are present in user project.\n            if (target == BuildTarget.iOS && File.Exists(GetEssentialProjectResourcesPath() + \"/Resources/TMP Settings.asset\") && TMP_Settings.enableEmojiSupport)\n            {\n                string file = Path.Combine(pathToBuiltProject, \"Classes/UI/Keyboard.mm\");\n                string content = File.ReadAllText(file);\n                content = content.Replace(\"FILTER_EMOJIS_IOS_KEYBOARD 1\", \"FILTER_EMOJIS_IOS_KEYBOARD 0\");\n                File.WriteAllText(file, content);\n            }\n        }\n\n\n        private static string GetEssentialProjectResourcesPath()\n        {\n            // Find the potential location of the TextMesh Pro folder in the user project.\n            string projectPath = Path.GetFullPath(\"Assets/..\");\n            if (Directory.Exists(projectPath))\n            {\n                // Search for default location of TMP Essential Resources\n                if (Directory.Exists(projectPath + \"/Assets/TextMesh Pro/Resources\"))\n                {\n                    return \"Assets/TextMesh Pro\";\n                }\n\n                // Search for potential alternative locations in the user project\n                string[] matchingPaths = Directory.GetDirectories(projectPath, \"TextMesh Pro\", SearchOption.AllDirectories);\n                projectPath = ValidateLocation(matchingPaths, projectPath);\n                if (projectPath != null) return projectPath;\n            }\n\n            return null;\n        }\n\n\n        private static string ValidateLocation(string[] paths, string projectPath)\n        {\n            for (int i = 0; i < paths.Length; i++)\n            {\n                // Check if any of the matching directories contain a GUISkins directory.\n                if (Directory.Exists(paths[i] + \"/Resources\"))\n                {\n                    string folderPath = paths[i].Replace(projectPath, \"\");\n                    folderPath = folderPath.TrimStart('\\\\', '/');\n                    return folderPath;\n                }\n            }\n\n            return null;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_PostBuildProcessHandler.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 6fdea2af3daa40fe8f88e5e9cfc17abb\ntimeCreated: 1479886230\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_ProjectTextSettings.cs",
    "content": "﻿#if !UNITY_2018_3_OR_NEWER\nusing UnityEditor;\n\nnamespace TMPro\n{\n\n    public static class TMP_ProjectTextSettings\n    {\n        // Open Project Text Settings\n        [MenuItem(\"Edit/Project Settings/TextMeshPro Settings\", false, 309)]\n        public static void SelectProjectTextSettings()\n        {\n            TMP_Settings textSettings = TMP_Settings.instance;\n\n            if (textSettings)\n            {\n                Selection.activeObject = textSettings;\n\n                // TODO: Do we want to ping the Project Text Settings asset in the Project Inspector\n                EditorUtility.FocusProjectWindow();\n                EditorGUIUtility.PingObject(textSettings);\n            }\n            else\n                TMPro_EventManager.RESOURCE_LOAD_EVENT.Add(ON_RESOURCES_LOADED);\n        }\n\n\n        // Event received when TMP resources have been loaded.\n        static void ON_RESOURCES_LOADED()\n        {\n            TMPro_EventManager.RESOURCE_LOAD_EVENT.Remove(ON_RESOURCES_LOADED);\n\n            TMP_Settings textSettings = TMP_Settings.instance;\n\n            Selection.activeObject = textSettings;\n\n            // TODO: Do we want to ping the Project Text Settings asset in the Project Inspector\n            EditorUtility.FocusProjectWindow();\n            EditorGUIUtility.PingObject(textSettings);\n        }\n    }\n}\n#endif"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_ProjectTextSettings.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 0e751e877ed14d71a6b8e63ac54949cf\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_ResourcesLoader.cs",
    "content": "﻿using UnityEditor;\nusing UnityEngine;\nusing System.Collections;\n\nnamespace TMPro.EditorUtilities\n{\n\n    //[InitializeOnLoad]\n    class TMP_ResourcesLoader\n    {\n\n        /// <summary>\n        /// Function to pre-load the TMP Resources\n        /// </summary>\n        public static void LoadTextMeshProResources()\n        {\n            //TMP_Settings.LoadDefaultSettings();\n            //TMP_StyleSheet.LoadDefaultStyleSheet();\n        }\n\n\n        static TMP_ResourcesLoader()\n        {\n            //Debug.Log(\"Loading TMP Resources...\");\n\n            // Get current targetted platform\n\n\n            //string Settings = PlayerSettings.GetScriptingDefineSymbolsForGroup(BuildTargetGroup.Standalone);\n            //TMPro.TMP_Settings.LoadDefaultSettings();\n            //TMPro.TMP_StyleSheet.LoadDefaultStyleSheet();\n        }\n\n\n\n        //[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]\n        //static void OnBeforeSceneLoaded()\n        //{\n            //Debug.Log(\"Before scene is loaded.\");\n\n            //    //TMPro.TMP_Settings.LoadDefaultSettings();\n            //    //TMPro.TMP_StyleSheet.LoadDefaultStyleSheet();\n\n            //    //ShaderVariantCollection collection = new ShaderVariantCollection();\n            //    //Shader s0 = Shader.Find(\"TextMeshPro/Mobile/Distance Field\");\n            //    //ShaderVariantCollection.ShaderVariant tmp_Variant = new ShaderVariantCollection.ShaderVariant(s0, UnityEngine.Rendering.PassType.Normal, string.Empty);\n\n            //    //collection.Add(tmp_Variant);\n            //    //collection.WarmUp();\n        //}\n\n    }\n\n    //static class TMP_ProjectSettings\n    //{\n    //    [InitializeOnLoadMethod]\n    //    static void SetProjectDefineSymbols()\n    //    {\n    //        string currentBuildSettings = PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup);\n\n    //        //Check for and inject TMP_INSTALLED\n    //        if (!currentBuildSettings.Contains(\"TMP_PRESENT\"))\n    //        {\n    //            PlayerSettings.SetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup, currentBuildSettings + \";TMP_PRESENT\");\n    //        }\n    //    }\n    //}\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_ResourcesLoader.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 7241c7dc25374fc1a6ab3ef9da79c363\ntimeCreated: 1465441092\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SDFShaderGUI.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\n\nnamespace TMPro.EditorUtilities\n{\n    public class TMP_SDFShaderGUI : TMP_BaseShaderGUI\n    {\n        static ShaderFeature s_OutlineFeature, s_UnderlayFeature, s_BevelFeature, s_GlowFeature, s_MaskFeature;\n\n        static bool s_Face = true, s_Outline = true, s_Underlay, s_Lighting, s_Glow, s_Bevel, s_Light, s_Bump, s_Env;\n\n        static string[]\n            s_FaceUvSpeedNames = { \"_FaceUVSpeedX\", \"_FaceUVSpeedY\" },\n            s_OutlineUvSpeedNames = { \"_OutlineUVSpeedX\", \"_OutlineUVSpeedY\" };\n\n        static TMP_SDFShaderGUI()\n        {\n            s_OutlineFeature = new ShaderFeature()\n            {\n                undoLabel = \"Outline\",\n                keywords = new[] { \"OUTLINE_ON\" }\n            };\n\n            s_UnderlayFeature = new ShaderFeature()\n            {\n                undoLabel = \"Underlay\",\n                keywords = new[] { \"UNDERLAY_ON\", \"UNDERLAY_INNER\" },\n                label = new GUIContent(\"Underlay Type\"),\n                keywordLabels = new[]\n                {\n                    new GUIContent(\"None\"), new GUIContent(\"Normal\"), new GUIContent(\"Inner\")\n                }\n            };\n\n            s_BevelFeature = new ShaderFeature()\n            {\n                undoLabel = \"Bevel\",\n                keywords = new[] { \"BEVEL_ON\" }\n            };\n\n            s_GlowFeature = new ShaderFeature()\n            {\n                undoLabel = \"Glow\",\n                keywords = new[] { \"GLOW_ON\" }\n            };\n\n            s_MaskFeature = new ShaderFeature()\n            {\n                undoLabel = \"Mask\",\n                keywords = new[] { \"MASK_HARD\", \"MASK_SOFT\" },\n                label = new GUIContent(\"Mask\"),\n                keywordLabels = new[]\n                {\n                    new GUIContent(\"Mask Off\"), new GUIContent(\"Mask Hard\"), new GUIContent(\"Mask Soft\")\n                }\n            };\n        }\n\n        protected override void DoGUI()\n        {\n            s_Face = BeginPanel(\"Face\", s_Face);\n            if (s_Face)\n            {\n                DoFacePanel();\n            }\n\n            EndPanel();\n\n            s_Outline = m_Material.HasProperty(ShaderUtilities.ID_OutlineTex) ? BeginPanel(\"Outline\", s_Outline) : BeginPanel(\"Outline\", s_OutlineFeature, s_Outline);\n            if (s_Outline)\n            {\n                DoOutlinePanel();\n            }\n\n            EndPanel();\n\n            if (m_Material.HasProperty(ShaderUtilities.ID_UnderlayColor))\n            {\n                s_Underlay = BeginPanel(\"Underlay\", s_UnderlayFeature, s_Underlay);\n                if (s_Underlay)\n                {\n                    DoUnderlayPanel();\n                }\n\n                EndPanel();\n            }\n\n            if (m_Material.HasProperty(\"_SpecularColor\"))\n            {\n                s_Lighting = BeginPanel(\"Lighting\", s_BevelFeature, s_Lighting);\n                if (s_Lighting)\n                {\n                    s_Bevel = BeginPanel(\"Bevel\", s_Bevel);\n                    if (s_Bevel)\n                    {\n                        DoBevelPanel();\n                    }\n\n                    EndPanel();\n\n                    s_Light = BeginPanel(\"Local Lighting\", s_Light);\n                    if (s_Light)\n                    {\n                        DoLocalLightingPanel();\n                    }\n\n                    EndPanel();\n\n                    s_Bump = BeginPanel(\"Bump Map\", s_Bump);\n                    if (s_Bump)\n                    {\n                        DoBumpMapPanel();\n                    }\n\n                    EndPanel();\n\n                    s_Env = BeginPanel(\"Environment Map\", s_Env);\n                    if (s_Env)\n                    {\n                        DoEnvMapPanel();\n                    }\n\n                    EndPanel();\n                }\n\n                EndPanel();\n            }\n            else if (m_Material.HasProperty(\"_SpecColor\"))\n            {\n                s_Bevel = BeginPanel(\"Bevel\", s_Bevel);\n                if (s_Bevel)\n                {\n                    DoBevelPanel();\n                }\n\n                EndPanel();\n\n                s_Light = BeginPanel(\"Surface Lighting\", s_Light);\n                if (s_Light)\n                {\n                    DoSurfaceLightingPanel();\n                }\n\n                EndPanel();\n\n                s_Bump = BeginPanel(\"Bump Map\", s_Bump);\n                if (s_Bump)\n                {\n                    DoBumpMapPanel();\n                }\n\n                EndPanel();\n\n                s_Env = BeginPanel(\"Environment Map\", s_Env);\n                if (s_Env)\n                {\n                    DoEnvMapPanel();\n                }\n\n                EndPanel();\n            }\n\n            if (m_Material.HasProperty(ShaderUtilities.ID_GlowColor))\n            {\n                s_Glow = BeginPanel(\"Glow\", s_GlowFeature, s_Glow);\n                if (s_Glow)\n                {\n                    DoGlowPanel();\n                }\n\n                EndPanel();\n            }\n\n            s_DebugExtended = BeginPanel(\"Debug Settings\", s_DebugExtended);\n            if (s_DebugExtended)\n            {\n                DoDebugPanel();\n            }\n\n            EndPanel();\n        }\n\n        void DoFacePanel()\n        {\n            EditorGUI.indentLevel += 1;\n            DoColor(\"_FaceColor\", \"Color\");\n            if (m_Material.HasProperty(ShaderUtilities.ID_FaceTex))\n            {\n                if (m_Material.HasProperty(\"_FaceUVSpeedX\"))\n                {\n                    DoTexture2D(\"_FaceTex\", \"Texture\", true, s_FaceUvSpeedNames);\n                }\n                else\n                {\n                    DoTexture2D(\"_FaceTex\", \"Texture\", true);\n                }\n            }\n\n            DoSlider(\"_OutlineSoftness\", \"Softness\");\n            DoSlider(\"_FaceDilate\", \"Dilate\");\n            if (m_Material.HasProperty(ShaderUtilities.ID_Shininess))\n            {\n                DoSlider(\"_FaceShininess\", \"Gloss\");\n            }\n\n            EditorGUI.indentLevel -= 1;\n            EditorGUILayout.Space();\n        }\n\n        void DoOutlinePanel()\n        {\n            EditorGUI.indentLevel += 1;\n            DoColor(\"_OutlineColor\", \"Color\");\n            if (m_Material.HasProperty(ShaderUtilities.ID_OutlineTex))\n            {\n                if (m_Material.HasProperty(\"_OutlineUVSpeedX\"))\n                {\n                    DoTexture2D(\"_OutlineTex\", \"Texture\", true, s_OutlineUvSpeedNames);\n                }\n                else\n                {\n                    DoTexture2D(\"_OutlineTex\", \"Texture\", true);\n                }\n            }\n\n            DoSlider(\"_OutlineWidth\", \"Thickness\");\n            if (m_Material.HasProperty(\"_OutlineShininess\"))\n            {\n                DoSlider(\"_OutlineShininess\", \"Gloss\");\n            }\n\n            EditorGUI.indentLevel -= 1;\n            EditorGUILayout.Space();\n        }\n\n        void DoUnderlayPanel()\n        {\n            EditorGUI.indentLevel += 1;\n            s_UnderlayFeature.DoPopup(m_Editor, m_Material);\n            DoColor(\"_UnderlayColor\", \"Color\");\n            DoSlider(\"_UnderlayOffsetX\", \"Offset X\");\n            DoSlider(\"_UnderlayOffsetY\", \"Offset Y\");\n            DoSlider(\"_UnderlayDilate\", \"Dilate\");\n            DoSlider(\"_UnderlaySoftness\", \"Softness\");\n            EditorGUI.indentLevel -= 1;\n            EditorGUILayout.Space();\n        }\n\n        static GUIContent[] s_BevelTypeLabels =\n        {\n            new GUIContent(\"Outer Bevel\"),\n            new GUIContent(\"Inner Bevel\")\n        };\n\n        void DoBevelPanel()\n        {\n            EditorGUI.indentLevel += 1;\n            DoPopup(\"_ShaderFlags\", \"Type\", s_BevelTypeLabels);\n            DoSlider(\"_Bevel\", \"Amount\");\n            DoSlider(\"_BevelOffset\", \"Offset\");\n            DoSlider(\"_BevelWidth\", \"Width\");\n            DoSlider(\"_BevelRoundness\", \"Roundness\");\n            DoSlider(\"_BevelClamp\", \"Clamp\");\n            EditorGUI.indentLevel -= 1;\n            EditorGUILayout.Space();\n        }\n\n        void DoLocalLightingPanel()\n        {\n            EditorGUI.indentLevel += 1;\n            DoSlider(\"_LightAngle\", \"Light Angle\");\n            DoColor(\"_SpecularColor\", \"Specular Color\");\n            DoSlider(\"_SpecularPower\", \"Specular Power\");\n            DoSlider(\"_Reflectivity\", \"Reflectivity Power\");\n            DoSlider(\"_Diffuse\", \"Diffuse Shadow\");\n            DoSlider(\"_Ambient\", \"Ambient Shadow\");\n            EditorGUI.indentLevel -= 1;\n            EditorGUILayout.Space();\n        }\n\n        void DoSurfaceLightingPanel()\n        {\n            EditorGUI.indentLevel += 1;\n            DoColor(\"_SpecColor\", \"Specular Color\");\n            EditorGUI.indentLevel -= 1;\n            EditorGUILayout.Space();\n        }\n\n        void DoBumpMapPanel()\n        {\n            EditorGUI.indentLevel += 1;\n            DoTexture2D(\"_BumpMap\", \"Texture\");\n            DoSlider(\"_BumpFace\", \"Face\");\n            DoSlider(\"_BumpOutline\", \"Outline\");\n            EditorGUI.indentLevel -= 1;\n            EditorGUILayout.Space();\n        }\n\n        void DoEnvMapPanel()\n        {\n            EditorGUI.indentLevel += 1;\n            DoColor(\"_ReflectFaceColor\", \"Face Color\");\n            DoColor(\"_ReflectOutlineColor\", \"Outline Color\");\n            DoCubeMap(\"_Cube\", \"Texture\");\n            DoVector3(\"_EnvMatrixRotation\", \"Rotation\");\n            EditorGUI.indentLevel -= 1;\n            EditorGUILayout.Space();\n        }\n\n        void DoGlowPanel()\n        {\n            EditorGUI.indentLevel += 1;\n            DoColor(\"_GlowColor\", \"Color\");\n            DoSlider(\"_GlowOffset\", \"Offset\");\n            DoSlider(\"_GlowInner\", \"Inner\");\n            DoSlider(\"_GlowOuter\", \"Outer\");\n            DoSlider(\"_GlowPower\", \"Power\");\n            EditorGUI.indentLevel -= 1;\n            EditorGUILayout.Space();\n        }\n\n        void DoDebugPanel()\n        {\n            EditorGUI.indentLevel += 1;\n            DoTexture2D(\"_MainTex\", \"Font Atlas\");\n            DoFloat(\"_GradientScale\", \"Gradient Scale\");\n            DoFloat(\"_TextureWidth\", \"Texture Width\");\n            DoFloat(\"_TextureHeight\", \"Texture Height\");\n            EditorGUILayout.Space();\n            DoFloat(\"_ScaleX\", \"Scale X\");\n            DoFloat(\"_ScaleY\", \"Scale Y\");\n\n            if (m_Material.HasProperty(ShaderUtilities.ID_Sharpness))\n                DoSlider(\"_Sharpness\", \"Sharpness\");\n\n            DoSlider(\"_PerspectiveFilter\", \"Perspective Filter\");\n            EditorGUILayout.Space();\n            DoFloat(\"_VertexOffsetX\", \"Offset X\");\n            DoFloat(\"_VertexOffsetY\", \"Offset Y\");\n\n            if (m_Material.HasProperty(ShaderUtilities.ID_MaskCoord))\n            {\n                EditorGUILayout.Space();\n                s_MaskFeature.ReadState(m_Material);\n                s_MaskFeature.DoPopup(m_Editor, m_Material);\n                if (s_MaskFeature.Active)\n                {\n                    DoMaskSubgroup();\n                }\n\n                EditorGUILayout.Space();\n                DoVector(\"_ClipRect\", \"Clip Rect\", s_LbrtVectorLabels);\n            }\n            else if (m_Material.HasProperty(\"_MaskTex\"))\n            {\n                DoMaskTexSubgroup();\n            }\n            else if (m_Material.HasProperty(ShaderUtilities.ID_MaskSoftnessX))\n            {\n                EditorGUILayout.Space();\n                DoFloat(\"_MaskSoftnessX\", \"Softness X\");\n                DoFloat(\"_MaskSoftnessY\", \"Softness Y\");\n                DoVector(\"_ClipRect\", \"Clip Rect\", s_LbrtVectorLabels);\n            }\n\n            if (m_Material.HasProperty(ShaderUtilities.ID_StencilID))\n            {\n                EditorGUILayout.Space();\n                DoFloat(\"_Stencil\", \"Stencil ID\");\n                DoFloat(\"_StencilComp\", \"Stencil Comp\");\n            }\n\n            EditorGUILayout.Space();\n\n            EditorGUI.BeginChangeCheck();\n            bool useRatios = EditorGUILayout.Toggle(\"Use Ratios\", !m_Material.IsKeywordEnabled(\"RATIOS_OFF\"));\n            if (EditorGUI.EndChangeCheck())\n            {\n                m_Editor.RegisterPropertyChangeUndo(\"Use Ratios\");\n                if (useRatios)\n                {\n                    m_Material.DisableKeyword(\"RATIOS_OFF\");\n                }\n                else\n                {\n                    m_Material.EnableKeyword(\"RATIOS_OFF\");\n                }\n            }\n\n            EditorGUI.BeginDisabledGroup(true);\n            DoFloat(\"_ScaleRatioA\", \"Scale Ratio A\");\n            DoFloat(\"_ScaleRatioB\", \"Scale Ratio B\");\n            DoFloat(\"_ScaleRatioC\", \"Scale Ratio C\");\n            EditorGUI.EndDisabledGroup();\n            EditorGUI.indentLevel -= 1;\n            EditorGUILayout.Space();\n        }\n\n        void DoMaskSubgroup()\n        {\n            DoVector(\"_MaskCoord\", \"Mask Bounds\", s_XywhVectorLabels);\n            if (Selection.activeGameObject != null)\n            {\n                Renderer renderer = Selection.activeGameObject.GetComponent<Renderer>();\n                if (renderer != null)\n                {\n                    Rect rect = EditorGUILayout.GetControlRect();\n                    rect.x += EditorGUIUtility.labelWidth;\n                    rect.width -= EditorGUIUtility.labelWidth;\n                    if (GUI.Button(rect, \"Match Renderer Bounds\"))\n                    {\n                        FindProperty(\"_MaskCoord\", m_Properties).vectorValue = new Vector4(\n                            0,\n                            0,\n                            Mathf.Round(renderer.bounds.extents.x * 1000) / 1000,\n                            Mathf.Round(renderer.bounds.extents.y * 1000) / 1000\n                        );\n                    }\n                }\n            }\n\n            if (s_MaskFeature.State == 1)\n            {\n                DoFloat(\"_MaskSoftnessX\", \"Softness X\");\n                DoFloat(\"_MaskSoftnessY\", \"Softness Y\");\n            }\n        }\n\n        void DoMaskTexSubgroup()\n        {\n            EditorGUILayout.Space();\n            DoTexture2D(\"_MaskTex\", \"Mask Texture\");\n            DoToggle(\"_MaskInverse\", \"Inverse Mask\");\n            DoColor(\"_MaskEdgeColor\", \"Edge Color\");\n            DoSlider(\"_MaskEdgeSoftness\", \"Edge Softness\");\n            DoSlider(\"_MaskWipeControl\", \"Wipe Position\");\n            DoFloat(\"_MaskSoftnessX\", \"Softness X\");\n            DoFloat(\"_MaskSoftnessY\", \"Softness Y\");\n            DoVector(\"_ClipRect\", \"Clip Rect\", s_LbrtVectorLabels);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SDFShaderGUI.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 8413ca0e506d42a1a4bd9769f204ad16\ntimeCreated: 1469844718\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SerializedPropertyHolder.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\n\nnamespace TMPro\n{\n    class TMP_SerializedPropertyHolder : ScriptableObject\n    {\n        public TMP_FontAsset fontAsset;\n        public uint firstCharacter;\n        public uint secondCharacter;\n\n        public TMP_GlyphPairAdjustmentRecord glyphPairAdjustmentRecord = new TMP_GlyphPairAdjustmentRecord(new TMP_GlyphAdjustmentRecord(), new TMP_GlyphAdjustmentRecord());\n    }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SerializedPropertyHolder.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 9c4a050f089abb04ebd4125e419f4548\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SettingsEditor.cs",
    "content": "using System.Collections.Generic;\nusing UnityEngine;\nusing UnityEditor;\nusing UnityEditorInternal;\n\n#pragma warning disable 0414 // Disabled a few warnings for not yet implemented features.\n\nnamespace TMPro.EditorUtilities\n{\n    [CustomEditor(typeof(TMP_Settings))]\n    public class TMP_SettingsEditor : Editor\n    {\n        internal class Styles\n        {\n            public static readonly GUIContent defaultFontAssetLabel = new GUIContent(\"Default Font Asset\", \"The Font Asset that will be assigned by default to newly created text objects when no Font Asset is specified.\");\n            public static readonly GUIContent defaultFontAssetPathLabel = new GUIContent(\"Path:        Resources/\", \"The relative path to a Resources folder where the Font Assets and Material Presets are located.\\nExample \\\"Fonts & Materials/\\\"\");\n\n            public static readonly GUIContent fallbackFontAssetsLabel = new GUIContent(\"Fallback Font Assets\", \"The Font Assets that will be searched to locate and replace missing characters from a given Font Asset.\");\n            public static readonly GUIContent fallbackFontAssetsListLabel = new GUIContent(\"Fallback Font Assets List\", \"The Font Assets that will be searched to locate and replace missing characters from a given Font Asset.\");\n\n            public static readonly GUIContent fallbackMaterialSettingsLabel = new GUIContent(\"Fallback Material Settings\");\n            public static readonly GUIContent matchMaterialPresetLabel = new GUIContent(\"Match Material Presets\");\n\n            public static readonly GUIContent containerDefaultSettingsLabel = new GUIContent(\"Text Container Default Settings\");\n\n            public static readonly GUIContent textMeshProLabel = new GUIContent(\"TextMeshPro\");\n            public static readonly GUIContent textMeshProUiLabel = new GUIContent(\"TextMeshPro UI\");\n            public static readonly GUIContent enableRaycastTarget = new GUIContent(\"Enable Raycast Target\");\n            public static readonly GUIContent autoSizeContainerLabel = new GUIContent(\"Auto Size Text Container\", \"Set the size of the text container to match the text.\");\n\n            public static readonly GUIContent textComponentDefaultSettingsLabel = new GUIContent(\"Text Component Default Settings\");\n            public static readonly GUIContent defaultFontSize = new GUIContent(\"Default Font Size\");\n            public static readonly GUIContent autoSizeRatioLabel = new GUIContent(\"Text Auto Size Ratios\");\n            public static readonly GUIContent minLabel = new GUIContent(\"Min\");\n            public static readonly GUIContent maxLabel = new GUIContent(\"Max\");\n\n            public static readonly GUIContent wordWrappingLabel = new GUIContent(\"Word Wrapping\");\n            public static readonly GUIContent kerningLabel = new GUIContent(\"Kerning\");\n            public static readonly GUIContent extraPaddingLabel = new GUIContent(\"Extra Padding\");\n            public static readonly GUIContent tintAllSpritesLabel = new GUIContent(\"Tint All Sprites\");\n            public static readonly GUIContent parseEscapeCharactersLabel = new GUIContent(\"Parse Escape Sequence\");\n\n            public static readonly GUIContent dynamicFontSystemSettingsLabel = new GUIContent(\"Dynamic Font System Settings\");\n            public static readonly GUIContent getFontFeaturesAtRuntime = new GUIContent(\"Get Font Features at Runtime\", \"Determines if Glyph Adjustment Data will be retrieved from font files at runtime when new characters and glyphs are added to font assets.\");\n\n            public static readonly GUIContent missingGlyphLabel = new GUIContent(\"Replacement Character\", \"The character to be displayed when the requested character is not found in any font asset or fallbacks.\");\n            public static readonly GUIContent disableWarningsLabel = new GUIContent(\"Disable warnings\", \"Disable warning messages in the Console.\");\n\n            public static readonly GUIContent defaultSpriteAssetLabel = new GUIContent(\"Default Sprite Asset\", \"The Sprite Asset that will be assigned by default when using the <sprite> tag when no Sprite Asset is specified.\");\n            public static readonly GUIContent enableEmojiSupportLabel = new GUIContent(\"iOS Emoji Support\", \"Enables Emoji support for Touch Screen Keyboards on target devices.\");\n            public static readonly GUIContent spriteAssetsPathLabel = new GUIContent(\"Path:        Resources/\", \"The relative path to a Resources folder where the Sprite Assets are located.\\nExample \\\"Sprite Assets/\\\"\");\n\n            public static readonly GUIContent defaultStyleSheetLabel = new GUIContent(\"Default Style Sheet\", \"The Style Sheet that will be used for all text objects in this project.\");\n\n            public static readonly GUIContent colorGradientPresetsLabel = new GUIContent(\"Color Gradient Presets\", \"The relative path to a Resources folder where the Color Gradient Presets are located.\\nExample \\\"Color Gradient Presets/\\\"\");\n            public static readonly GUIContent colorGradientsPathLabel = new GUIContent(\"Path:        Resources/\", \"The relative path to a Resources folder where the Color Gradient Presets are located.\\nExample \\\"Color Gradient Presets/\\\"\");\n\n            public static readonly GUIContent lineBreakingLabel = new GUIContent(\"Line Breaking for Asian languages\", \"The text assets that contain the Leading and Following characters which define the rules for line breaking with Asian languages.\");\n        }\n\n        SerializedProperty m_PropFontAsset;\n        SerializedProperty m_PropDefaultFontAssetPath;\n        SerializedProperty m_PropDefaultFontSize;\n        SerializedProperty m_PropDefaultAutoSizeMinRatio;\n        SerializedProperty m_PropDefaultAutoSizeMaxRatio;\n        SerializedProperty m_PropDefaultTextMeshProTextContainerSize;\n        SerializedProperty m_PropDefaultTextMeshProUITextContainerSize;\n        SerializedProperty m_PropAutoSizeTextContainer;\n        SerializedProperty m_PropEnableRaycastTarget;\n\n        SerializedProperty m_PropSpriteAsset;\n        SerializedProperty m_PropSpriteAssetPath;\n        SerializedProperty m_PropEnableEmojiSupport;\n        SerializedProperty m_PropStyleSheet;\n        ReorderableList m_List;\n\n        SerializedProperty m_PropColorGradientPresetsPath;\n\n        SerializedProperty m_PropMatchMaterialPreset;\n        SerializedProperty m_PropWordWrapping;\n        SerializedProperty m_PropKerning;\n        SerializedProperty m_PropExtraPadding;\n        SerializedProperty m_PropTintAllSprites;\n        SerializedProperty m_PropParseEscapeCharacters;\n        SerializedProperty m_PropMissingGlyphCharacter;\n\n        SerializedProperty m_GetFontFeaturesAtRuntime;\n\n        SerializedProperty m_PropWarningsDisabled;\n\n        SerializedProperty m_PropLeadingCharacters;\n        SerializedProperty m_PropFollowingCharacters;\n\n        public void OnEnable()\n        {\n            if (target == null)\n                return;\n\n            m_PropFontAsset = serializedObject.FindProperty(\"m_defaultFontAsset\");\n            m_PropDefaultFontAssetPath = serializedObject.FindProperty(\"m_defaultFontAssetPath\");\n            m_PropDefaultFontSize = serializedObject.FindProperty(\"m_defaultFontSize\");\n            m_PropDefaultAutoSizeMinRatio = serializedObject.FindProperty(\"m_defaultAutoSizeMinRatio\");\n            m_PropDefaultAutoSizeMaxRatio = serializedObject.FindProperty(\"m_defaultAutoSizeMaxRatio\");\n            m_PropDefaultTextMeshProTextContainerSize = serializedObject.FindProperty(\"m_defaultTextMeshProTextContainerSize\");\n            m_PropDefaultTextMeshProUITextContainerSize = serializedObject.FindProperty(\"m_defaultTextMeshProUITextContainerSize\");\n            m_PropAutoSizeTextContainer = serializedObject.FindProperty(\"m_autoSizeTextContainer\");\n            m_PropEnableRaycastTarget = serializedObject.FindProperty(\"m_EnableRaycastTarget\");\n\n            m_PropSpriteAsset = serializedObject.FindProperty(\"m_defaultSpriteAsset\");\n            m_PropSpriteAssetPath = serializedObject.FindProperty(\"m_defaultSpriteAssetPath\");\n            m_PropEnableEmojiSupport = serializedObject.FindProperty(\"m_enableEmojiSupport\");\n            m_PropStyleSheet = serializedObject.FindProperty(\"m_defaultStyleSheet\");\n            m_PropColorGradientPresetsPath = serializedObject.FindProperty(\"m_defaultColorGradientPresetsPath\");\n\n            m_List = new ReorderableList(serializedObject, serializedObject.FindProperty(\"m_fallbackFontAssets\"), true, true, true, true);\n\n            m_List.drawElementCallback = (rect, index, isActive, isFocused) =>\n            {\n                var element = m_List.serializedProperty.GetArrayElementAtIndex(index);\n                rect.y += 2;\n                EditorGUI.PropertyField(new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight), element, GUIContent.none);\n            };\n\n            m_List.drawHeaderCallback = rect =>\n            {\n                EditorGUI.LabelField(rect, Styles.fallbackFontAssetsListLabel);\n            };\n\n            m_PropMatchMaterialPreset = serializedObject.FindProperty(\"m_matchMaterialPreset\");\n\n            m_PropWordWrapping = serializedObject.FindProperty(\"m_enableWordWrapping\");\n            m_PropKerning = serializedObject.FindProperty(\"m_enableKerning\");\n            m_PropExtraPadding = serializedObject.FindProperty(\"m_enableExtraPadding\");\n            m_PropTintAllSprites = serializedObject.FindProperty(\"m_enableTintAllSprites\");\n            m_PropParseEscapeCharacters = serializedObject.FindProperty(\"m_enableParseEscapeCharacters\");\n            m_PropMissingGlyphCharacter = serializedObject.FindProperty(\"m_missingGlyphCharacter\");\n\n            m_PropWarningsDisabled = serializedObject.FindProperty(\"m_warningsDisabled\");\n\n            m_GetFontFeaturesAtRuntime = serializedObject.FindProperty(\"m_GetFontFeaturesAtRuntime\");\n\n            m_PropLeadingCharacters = serializedObject.FindProperty(\"m_leadingCharacters\");\n            m_PropFollowingCharacters = serializedObject.FindProperty(\"m_followingCharacters\");\n        }\n\n        public override void OnInspectorGUI()\n        {\n            serializedObject.Update();\n\n            float labelWidth = EditorGUIUtility.labelWidth;\n            float fieldWidth = EditorGUIUtility.fieldWidth;\n\n            // TextMeshPro Font Info Panel\n            EditorGUI.indentLevel = 0;\n\n            // FONT ASSET\n            EditorGUILayout.BeginVertical(EditorStyles.helpBox);\n            GUILayout.Label(Styles.defaultFontAssetLabel, EditorStyles.boldLabel);\n            EditorGUI.indentLevel = 1;\n            EditorGUILayout.PropertyField(m_PropFontAsset, Styles.defaultFontAssetLabel);\n            EditorGUILayout.PropertyField(m_PropDefaultFontAssetPath, Styles.defaultFontAssetPathLabel);\n            EditorGUI.indentLevel = 0;\n\n            EditorGUILayout.Space();\n            EditorGUILayout.EndVertical();\n\n            // FALLBACK FONT ASSETs\n            EditorGUILayout.BeginVertical(EditorStyles.helpBox);\n            GUILayout.Label(Styles.fallbackFontAssetsLabel, EditorStyles.boldLabel);\n            m_List.DoLayoutList();\n\n            GUILayout.Label(Styles.fallbackMaterialSettingsLabel, EditorStyles.boldLabel);\n            EditorGUI.indentLevel = 1;\n            EditorGUILayout.PropertyField(m_PropMatchMaterialPreset, Styles.matchMaterialPresetLabel);\n            EditorGUI.indentLevel = 0;\n\n            EditorGUILayout.Space();\n            EditorGUILayout.EndVertical();\n\n            // MISSING GLYPHS\n            EditorGUILayout.BeginVertical(EditorStyles.helpBox);\n            GUILayout.Label(Styles.dynamicFontSystemSettingsLabel, EditorStyles.boldLabel);\n            EditorGUI.indentLevel = 1;\n            EditorGUILayout.PropertyField(m_GetFontFeaturesAtRuntime, Styles.getFontFeaturesAtRuntime);\n            EditorGUILayout.PropertyField(m_PropMissingGlyphCharacter, Styles.missingGlyphLabel);\n            EditorGUILayout.PropertyField(m_PropWarningsDisabled, Styles.disableWarningsLabel);\n            EditorGUI.indentLevel = 0;\n\n            EditorGUILayout.Space();\n            EditorGUILayout.EndVertical();\n\n            // TEXT OBJECT DEFAULT PROPERTIES\n            EditorGUILayout.BeginVertical(EditorStyles.helpBox);\n            GUILayout.Label(Styles.containerDefaultSettingsLabel, EditorStyles.boldLabel);\n            EditorGUI.indentLevel = 1;\n\n            EditorGUILayout.PropertyField(m_PropDefaultTextMeshProTextContainerSize, Styles.textMeshProLabel);\n            EditorGUILayout.PropertyField(m_PropDefaultTextMeshProUITextContainerSize, Styles.textMeshProUiLabel);\n            EditorGUILayout.PropertyField(m_PropEnableRaycastTarget, Styles.enableRaycastTarget);\n            EditorGUILayout.PropertyField(m_PropAutoSizeTextContainer, Styles.autoSizeContainerLabel);\n            EditorGUI.indentLevel = 0;\n\n            EditorGUILayout.Space();\n\n            GUILayout.Label(Styles.textComponentDefaultSettingsLabel, EditorStyles.boldLabel);\n            EditorGUI.indentLevel = 1;\n            EditorGUILayout.PropertyField(m_PropDefaultFontSize, Styles.defaultFontSize);\n\n            EditorGUILayout.BeginHorizontal();\n            {\n                EditorGUILayout.PrefixLabel(Styles.autoSizeRatioLabel);\n                EditorGUIUtility.labelWidth = 32;\n                EditorGUIUtility.fieldWidth = 10;\n\n                EditorGUI.indentLevel = 0;\n                EditorGUILayout.PropertyField(m_PropDefaultAutoSizeMinRatio, Styles.minLabel);\n                EditorGUILayout.PropertyField(m_PropDefaultAutoSizeMaxRatio, Styles.maxLabel);\n                EditorGUI.indentLevel = 1;\n            }\n            EditorGUILayout.EndHorizontal();\n\n            EditorGUIUtility.labelWidth = labelWidth;\n            EditorGUIUtility.fieldWidth = fieldWidth;\n\n            EditorGUILayout.PropertyField(m_PropWordWrapping, Styles.wordWrappingLabel);\n            EditorGUILayout.PropertyField(m_PropKerning, Styles.kerningLabel);\n\n            EditorGUILayout.PropertyField(m_PropExtraPadding, Styles.extraPaddingLabel);\n            EditorGUILayout.PropertyField(m_PropTintAllSprites, Styles.tintAllSpritesLabel);\n\n            EditorGUILayout.PropertyField(m_PropParseEscapeCharacters, Styles.parseEscapeCharactersLabel);\n\n            EditorGUI.indentLevel = 0;\n\n            EditorGUILayout.Space();\n            EditorGUILayout.EndVertical();\n\n            // SPRITE ASSET\n            EditorGUILayout.BeginVertical(EditorStyles.helpBox);\n            GUILayout.Label(Styles.defaultSpriteAssetLabel, EditorStyles.boldLabel);\n            EditorGUI.indentLevel = 1;\n            EditorGUILayout.PropertyField(m_PropSpriteAsset, Styles.defaultSpriteAssetLabel);\n            EditorGUILayout.PropertyField(m_PropEnableEmojiSupport, Styles.enableEmojiSupportLabel);\n            EditorGUILayout.PropertyField(m_PropSpriteAssetPath, Styles.spriteAssetsPathLabel);\n            EditorGUI.indentLevel = 0;\n\n            EditorGUILayout.Space();\n            EditorGUILayout.EndVertical();\n\n            // STYLE SHEET\n            EditorGUILayout.BeginVertical(EditorStyles.helpBox);\n            GUILayout.Label(Styles.defaultStyleSheetLabel, EditorStyles.boldLabel);\n            EditorGUI.indentLevel = 1;\n            EditorGUI.BeginChangeCheck();\n            EditorGUILayout.PropertyField(m_PropStyleSheet, Styles.defaultStyleSheetLabel);\n            if (EditorGUI.EndChangeCheck())\n            {\n                serializedObject.ApplyModifiedProperties();\n                TMP_StyleSheet.UpdateStyleSheet();\n            }\n            EditorGUI.indentLevel = 0;\n\n            EditorGUILayout.Space();\n            EditorGUILayout.EndVertical();\n\n            // COLOR GRADIENT PRESETS\n            EditorGUILayout.BeginVertical(EditorStyles.helpBox);\n            GUILayout.Label(Styles.colorGradientPresetsLabel, EditorStyles.boldLabel);\n            EditorGUI.indentLevel = 1;\n            EditorGUILayout.PropertyField(m_PropColorGradientPresetsPath, Styles.colorGradientsPathLabel);\n            EditorGUI.indentLevel = 0;\n\n            EditorGUILayout.Space();\n            EditorGUILayout.EndVertical();\n\n            // LINE BREAKING RULE\n            EditorGUILayout.BeginVertical(EditorStyles.helpBox);\n            GUILayout.Label(Styles.lineBreakingLabel, EditorStyles.boldLabel);\n            EditorGUI.indentLevel = 1;\n            EditorGUILayout.PropertyField(m_PropLeadingCharacters);\n            EditorGUILayout.PropertyField(m_PropFollowingCharacters);\n            EditorGUI.indentLevel = 0;\n\n            EditorGUILayout.Space();\n            EditorGUILayout.EndVertical();\n\n            if (serializedObject.ApplyModifiedProperties())\n            {\n                EditorUtility.SetDirty(target);\n                TMPro_EventManager.ON_TMP_SETTINGS_CHANGED();\n            }\n        }\n    }\n\n#if UNITY_2018_3_OR_NEWER\n    class TMP_ResourceImporterProvider : SettingsProvider\n    {\n        TMP_PackageResourceImporter m_ResourceImporter;\n\n        public TMP_ResourceImporterProvider()\n            : base(\"Project/TextMesh Pro\", SettingsScope.Project)\n        {\n        }\n\n        public override void OnGUI(string searchContext)\n        {\n            // Lazy creation that supports domain reload\n            if (m_ResourceImporter == null)\n                m_ResourceImporter = new TMP_PackageResourceImporter();\n\n            m_ResourceImporter.OnGUI();\n        }\n\n        public override void OnDeactivate()\n        {\n            if (m_ResourceImporter != null)\n                m_ResourceImporter.OnDestroy();\n        }\n\n        static UnityEngine.Object GetTMPSettings()\n        {\n            return Resources.Load<TMP_Settings>(\"TMP Settings\");\n        }\n\n        [SettingsProviderGroup]\n        static SettingsProvider[] CreateTMPSettingsProvider()\n        {\n            var providers = new List<SettingsProvider> { new TMP_ResourceImporterProvider() };\n\n            if (GetTMPSettings() != null)\n            {\n                var provider = new AssetSettingsProvider(\"Project/TextMesh Pro/Settings\", GetTMPSettings);\n                provider.PopulateSearchKeywordsFromGUIContentProperties<TMP_SettingsEditor.Styles>();\n                providers.Add(provider);\n            }\n\n            return providers.ToArray();\n        }\n    }\n#endif\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SettingsEditor.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 0386b6eb838c47138cd51d1c1b879a35\ntimeCreated: 1436658550\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SpriteAssetEditor.cs",
    "content": "using UnityEngine;\nusing UnityEngine.TextCore;\nusing UnityEditor;\nusing UnityEditorInternal;\nusing System.Collections.Generic;\n\n\n\n\nnamespace TMPro.EditorUtilities\n{\n\n    [CustomEditor(typeof(TMP_SpriteAsset))]\n    public class TMP_SpriteAssetEditor : Editor\n    {\n        struct UI_PanelState\n        {\n            public static bool spriteAssetInfoPanel = true;\n            public static bool fallbackSpriteAssetPanel = true;\n            public static bool spriteCharacterTablePanel;\n            public static bool spriteGlyphTablePanel;\n        }\n\n        private static string[] s_UiStateLabel = new string[] { \"<i>(Click to collapse)</i> \", \"<i>(Click to expand)</i> \" };\n\n        int m_moveToIndex;\n        int m_selectedElement = -1;\n        int m_CurrentCharacterPage;\n        int m_CurrentGlyphPage;\n\n        const string k_UndoRedo = \"UndoRedoPerformed\";\n\n        string m_CharacterSearchPattern;\n        List<int> m_CharacterSearchList;\n        bool m_IsCharacterSearchDirty;\n\n        string m_GlyphSearchPattern;\n        List<int> m_GlyphSearchList;\n        bool m_IsGlyphSearchDirty;\n\n        SerializedProperty m_spriteAtlas_prop;\n        SerializedProperty m_material_prop;\n        SerializedProperty m_SpriteCharacterTableProperty;\n        SerializedProperty m_SpriteGlyphTableProperty;\n        ReorderableList m_fallbackSpriteAssetList;\n\n        TMP_SpriteAsset m_SpriteAsset;\n\n        bool isAssetDirty;\n\n        float m_xOffset;\n        float m_yOffset;\n        float m_xAdvance;\n        float m_scale;\n\n        public void OnEnable()\n        {\n            m_SpriteAsset = target as TMP_SpriteAsset;\n\n            m_spriteAtlas_prop = serializedObject.FindProperty(\"spriteSheet\");\n            m_material_prop = serializedObject.FindProperty(\"material\");\n            m_SpriteCharacterTableProperty = serializedObject.FindProperty(\"m_SpriteCharacterTable\");\n            m_SpriteGlyphTableProperty = serializedObject.FindProperty(\"m_SpriteGlyphTable\");\n\n            // Fallback TMP Sprite Asset list\n            m_fallbackSpriteAssetList = new ReorderableList(serializedObject, serializedObject.FindProperty(\"fallbackSpriteAssets\"), true, true, true, true);\n\n            m_fallbackSpriteAssetList.drawElementCallback = (Rect rect, int index, bool isActive, bool isFocused) =>\n            {\n                var element = m_fallbackSpriteAssetList.serializedProperty.GetArrayElementAtIndex(index);\n                rect.y += 2;\n                EditorGUI.PropertyField(new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight), element, GUIContent.none);\n            };\n\n            m_fallbackSpriteAssetList.drawHeaderCallback = rect =>\n            {\n                EditorGUI.LabelField(rect, new GUIContent(\"Fallback Sprite Asset List\", \"Select the Sprite Assets that will be searched and used as fallback when a given sprite is missing from this sprite asset.\"));\n            };\n        }\n\n\n        public override void OnInspectorGUI()\n        {\n\n            //Debug.Log(\"OnInspectorGUI Called.\");\n            Event currentEvent = Event.current;\n            string evt_cmd = currentEvent.commandName; // Get Current Event CommandName to check for Undo Events\n\n            serializedObject.Update();\n\n            Rect rect;\n\n            // TEXTMESHPRO SPRITE INFO PANEL\n            GUILayout.Label(\"Sprite Info\", EditorStyles.boldLabel);\n            EditorGUI.indentLevel = 1;\n            \n            EditorGUI.BeginChangeCheck();\n            EditorGUILayout.PropertyField(m_spriteAtlas_prop , new GUIContent(\"Sprite Atlas\"));\n            if (EditorGUI.EndChangeCheck())\n            {\n                // Assign the new sprite atlas texture to the current material\n                Texture2D tex = m_spriteAtlas_prop.objectReferenceValue as Texture2D;\n                if (tex != null)\n                {\n                    Material mat = m_material_prop.objectReferenceValue as Material;\n                    if (mat != null)\n                        mat.mainTexture = tex;\n                }\n            }\n\n            EditorGUILayout.PropertyField(m_material_prop, new GUIContent(\"Default Material\"));\n             \n            EditorGUILayout.Space();\n\n            // FALLBACK SPRITE ASSETS\n            EditorGUI.indentLevel = 0;\n            UI_PanelState.fallbackSpriteAssetPanel = EditorGUILayout.Foldout(UI_PanelState.fallbackSpriteAssetPanel, new GUIContent(\"Fallback Sprite Assets\", \"Select the Sprite Assets that will be searched and used as fallback when a given sprite is missing from this sprite asset.\"), true, TMP_UIStyleManager.boldFoldout);\n            \n            if (UI_PanelState.fallbackSpriteAssetPanel)\n            {\n                m_fallbackSpriteAssetList.DoLayoutList();\n            }\n\n            // SPRITE CHARACTER TABLE\n            #region Display Sprite Character Table\n            EditorGUI.indentLevel = 0;\n            rect = EditorGUILayout.GetControlRect(false, 24);\n\n            if (GUI.Button(rect, new GUIContent(\"<b>Sprite Character Table</b>\", \"List of sprite characters contained in this sprite asset.\"), TMP_UIStyleManager.sectionHeader))\n                UI_PanelState.spriteCharacterTablePanel = !UI_PanelState.spriteCharacterTablePanel;\n\n            GUI.Label(rect, (UI_PanelState.spriteCharacterTablePanel ? \"\" : s_UiStateLabel[1]), TMP_UIStyleManager.rightLabel);\n\n            if (UI_PanelState.spriteCharacterTablePanel)\n            {\n                int arraySize = m_SpriteCharacterTableProperty.arraySize;\n                int itemsPerPage = 10;\n\n                // Display Glyph Management Tools\n                EditorGUILayout.BeginVertical(EditorStyles.helpBox, GUILayout.ExpandWidth(true));\n                {\n                    // Search Bar implementation\n                    #region DISPLAY SEARCH BAR\n                    EditorGUILayout.BeginHorizontal();\n                    {\n                        EditorGUIUtility.labelWidth = 110f;\n                        EditorGUI.BeginChangeCheck();\n                        string searchPattern = EditorGUILayout.TextField(\"Sprite Search\", m_CharacterSearchPattern, \"SearchTextField\");\n                        if (EditorGUI.EndChangeCheck() || m_IsCharacterSearchDirty)\n                        {\n                            if (string.IsNullOrEmpty(searchPattern) == false)\n                            {\n                                //GUIUtility.keyboardControl = 0;\n                                m_CharacterSearchPattern = searchPattern.ToLower(System.Globalization.CultureInfo.InvariantCulture).Trim();\n\n                                // Search Glyph Table for potential matches\n                                SearchCharacterTable(m_CharacterSearchPattern, ref m_CharacterSearchList);\n                            }\n                            else\n                                m_CharacterSearchPattern = null;\n\n                            m_IsCharacterSearchDirty = false;\n                        }\n\n                        string styleName = string.IsNullOrEmpty(m_CharacterSearchPattern) ? \"SearchCancelButtonEmpty\" : \"SearchCancelButton\";\n                        if (GUILayout.Button(GUIContent.none, styleName))\n                        {\n                            GUIUtility.keyboardControl = 0;\n                            m_CharacterSearchPattern = string.Empty;\n                        }\n                    }\n                    EditorGUILayout.EndHorizontal();\n                    #endregion\n\n                    // Display Page Navigation\n                    if (!string.IsNullOrEmpty(m_CharacterSearchPattern))\n                        arraySize = m_CharacterSearchList.Count;\n\n                    // Display Page Navigation\n                    DisplayPageNavigation(ref m_CurrentCharacterPage, arraySize, itemsPerPage);\n                }\n                EditorGUILayout.EndVertical();\n\n                if (arraySize > 0)\n                {\n                    // Display each SpriteInfo entry using the SpriteInfo property drawer.\n                    for (int i = itemsPerPage * m_CurrentCharacterPage; i < arraySize && i < itemsPerPage * (m_CurrentCharacterPage + 1); i++)\n                    {\n                        // Define the start of the selection region of the element.\n                        Rect elementStartRegion = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true));\n\n                        int elementIndex = i;\n                        if (!string.IsNullOrEmpty(m_CharacterSearchPattern))\n                            elementIndex = m_CharacterSearchList[i];\n\n                        SerializedProperty spriteCharacterProperty = m_SpriteCharacterTableProperty.GetArrayElementAtIndex(elementIndex);\n\n                        EditorGUILayout.BeginVertical(EditorStyles.helpBox);\n                        {\n                            EditorGUI.BeginDisabledGroup(i != m_selectedElement);\n                            {\n                                EditorGUILayout.PropertyField(spriteCharacterProperty);\n                            }\n                            EditorGUI.EndDisabledGroup();\n                        }\n                        EditorGUILayout.EndVertical();\n\n                        // Define the end of the selection region of the element.\n                        Rect elementEndRegion = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true));\n\n                        // Check for Item selection\n                        Rect selectionArea = new Rect(elementStartRegion.x, elementStartRegion.y, elementEndRegion.width, elementEndRegion.y - elementStartRegion.y);\n                        if (DoSelectionCheck(selectionArea))\n                        {\n                            if (m_selectedElement == i)\n                            {\n                                m_selectedElement = -1;\n                            }\n                            else\n                            {\n                                m_selectedElement = i;\n                                GUIUtility.keyboardControl = 0;\n                            }\n                        }\n\n                        // Draw & Handle Section Area\n                        if (m_selectedElement == i)\n                        {\n                            // Draw selection highlight\n                            TMP_EditorUtility.DrawBox(selectionArea, 2f, new Color32(40, 192, 255, 255));\n\n                            // Draw options to MoveUp, MoveDown, Add or Remove Sprites\n                            Rect controlRect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight * 1f);\n                            controlRect.width /= 8;\n\n                            // Move sprite up.\n                            bool guiEnabled = GUI.enabled;\n                            if (i == 0) { GUI.enabled = false; }\n                            if (GUI.Button(controlRect, \"Up\"))\n                            {\n                                SwapCharacterElements(i, i - 1);\n                            }\n                            GUI.enabled = guiEnabled;\n\n                            // Move sprite down.\n                            controlRect.x += controlRect.width;\n                            if (i == arraySize - 1) { GUI.enabled = false; }\n                            if (GUI.Button(controlRect, \"Down\"))\n                            {\n                                SwapCharacterElements(i, i + 1);\n                            }\n                            GUI.enabled = guiEnabled;\n\n                            // Move sprite to new index\n                            controlRect.x += controlRect.width * 2;\n                            //if (i == arraySize - 1) { GUI.enabled = false; }\n                            m_moveToIndex = EditorGUI.IntField(controlRect, m_moveToIndex);\n                            controlRect.x -= controlRect.width;\n                            if (GUI.Button(controlRect, \"Goto\"))\n                            {\n                                MoveCharacterToIndex(i, m_moveToIndex);\n                            }\n                            //controlRect.x += controlRect.width;\n                            GUI.enabled = guiEnabled;\n\n                            // Add new Sprite\n                            controlRect.x += controlRect.width * 4;\n                            if (GUI.Button(controlRect, \"+\"))\n                            {\n                                m_SpriteCharacterTableProperty.arraySize += 1;\n\n                                int index = m_SpriteCharacterTableProperty.arraySize - 1;\n\n                                SerializedProperty spriteInfo_prop = m_SpriteCharacterTableProperty.GetArrayElementAtIndex(index);\n\n                                // Copy properties of the selected element\n                                CopyCharacterSerializedProperty(m_SpriteCharacterTableProperty.GetArrayElementAtIndex(elementIndex), ref spriteInfo_prop);\n\n                                //spriteInfo_prop.FindPropertyRelative(\"m_Index\").intValue = index;\n                                serializedObject.ApplyModifiedProperties();\n\n                                m_IsCharacterSearchDirty = true;\n                            }\n\n                            // Delete selected Sprite\n                            controlRect.x += controlRect.width;\n                            if (m_selectedElement == -1) GUI.enabled = false;\n                            if (GUI.Button(controlRect, \"-\"))\n                            {\n                                m_SpriteCharacterTableProperty.DeleteArrayElementAtIndex(elementIndex);\n\n                                m_selectedElement = -1;\n                                serializedObject.ApplyModifiedProperties();\n\n                                m_IsCharacterSearchDirty = true;\n\n                                return;\n                            }\n\n\n                        }\n                    }\n                }\n\n                DisplayPageNavigation(ref m_CurrentCharacterPage, arraySize, itemsPerPage);\n\n                EditorGUIUtility.labelWidth = 40f;\n                EditorGUIUtility.fieldWidth = 20f;\n\n                GUILayout.Space(5f);\n\n                // GLOBAL TOOLS\n                #region Global Tools\n                /*\n                GUI.enabled = true;\n                EditorGUILayout.BeginVertical(EditorStyles.helpBox);\n                rect = EditorGUILayout.GetControlRect(false, 40);\n               \n                float width = (rect.width - 75f) / 4;\n                EditorGUI.LabelField(rect, \"Global Offsets & Scale\", EditorStyles.boldLabel);\n                \n                \n                rect.x += 70;\n                bool old_ChangedState = GUI.changed;\n\n                GUI.changed = false;\n                m_xOffset = EditorGUI.FloatField(new Rect(rect.x + 5f + width * 0, rect.y + 20, width - 5f, 18), new GUIContent(\"OX:\"), m_xOffset);\n                if (GUI.changed) UpdateGlobalProperty(\"m_HorizontalBearingX\", m_xOffset);\n                \n                m_yOffset = EditorGUI.FloatField(new Rect(rect.x + 5f + width * 1, rect.y + 20, width - 5f, 18), new GUIContent(\"OY:\"), m_yOffset);\n                if (GUI.changed) UpdateGlobalProperty(\"m_HorizontalBearingY\", m_yOffset);\n                \n                m_xAdvance = EditorGUI.FloatField(new Rect(rect.x + 5f + width * 2, rect.y + 20, width - 5f, 18), new GUIContent(\"ADV.\"), m_xAdvance);\n                if (GUI.changed) UpdateGlobalProperty(\"m_HorizontalAdvance\", m_xAdvance);\n                \n                m_scale = EditorGUI.FloatField(new Rect(rect.x + 5f + width * 3, rect.y + 20, width - 5f, 18), new GUIContent(\"SF.\"), m_scale);\n                if (GUI.changed) UpdateGlobalProperty(\"m_Scale\", m_scale);\n\n                EditorGUILayout.EndVertical();\n                \n                GUI.changed = old_ChangedState;\n                */\n                #endregion\n \n            }\n            #endregion\n\n\n            // SPRITE GLYPH TABLE\n            #region Display Sprite Glyph Table\n            EditorGUI.indentLevel = 0;\n            rect = EditorGUILayout.GetControlRect(false, 24);\n\n            if (GUI.Button(rect, new GUIContent(\"<b>Sprite Glyph Table</b>\", \"A list of the SpriteGlyphs contained in this sprite asset.\"), TMP_UIStyleManager.sectionHeader))\n                UI_PanelState.spriteGlyphTablePanel = !UI_PanelState.spriteGlyphTablePanel;\n\n            GUI.Label(rect, (UI_PanelState.spriteGlyphTablePanel ? \"\" : s_UiStateLabel[1]), TMP_UIStyleManager.rightLabel);\n\n            if (UI_PanelState.spriteGlyphTablePanel)\n            {\n                int arraySize = m_SpriteGlyphTableProperty.arraySize;\n                int itemsPerPage = 10;\n\n                // Display Glyph Management Tools\n                EditorGUILayout.BeginVertical(EditorStyles.helpBox, GUILayout.ExpandWidth(true));\n                {\n                    // Search Bar implementation\n                    #region DISPLAY SEARCH BAR\n                    EditorGUILayout.BeginHorizontal();\n                    {\n                        EditorGUIUtility.labelWidth = 110f;\n                        EditorGUI.BeginChangeCheck();\n                        string searchPattern = EditorGUILayout.TextField(\"Sprite Search\", m_GlyphSearchPattern, \"SearchTextField\");\n                        if (EditorGUI.EndChangeCheck() || m_IsGlyphSearchDirty)\n                        {\n                            if (string.IsNullOrEmpty(searchPattern) == false)\n                            {\n                                //GUIUtility.keyboardControl = 0;\n                                m_GlyphSearchPattern = searchPattern.ToLower(System.Globalization.CultureInfo.InvariantCulture).Trim();\n\n                                // Search Glyph Table for potential matches\n                                SearchCharacterTable(m_GlyphSearchPattern, ref m_GlyphSearchList);\n                            }\n                            else\n                                m_GlyphSearchPattern = null;\n\n                            m_IsGlyphSearchDirty = false;\n                        }\n\n                        string styleName = string.IsNullOrEmpty(m_GlyphSearchPattern) ? \"SearchCancelButtonEmpty\" : \"SearchCancelButton\";\n                        if (GUILayout.Button(GUIContent.none, styleName))\n                        {\n                            GUIUtility.keyboardControl = 0;\n                            m_GlyphSearchPattern = string.Empty;\n                        }\n                    }\n                    EditorGUILayout.EndHorizontal();\n                    #endregion\n\n                    // Display Page Navigation\n                    if (!string.IsNullOrEmpty(m_GlyphSearchPattern))\n                        arraySize = m_GlyphSearchList.Count;\n\n                    // Display Page Navigation\n                    DisplayPageNavigation(ref m_CurrentGlyphPage, arraySize, itemsPerPage);\n                }\n                EditorGUILayout.EndVertical();\n\n                if (arraySize > 0)\n                {\n                    // Display each SpriteInfo entry using the SpriteInfo property drawer.\n                    for (int i = itemsPerPage * m_CurrentGlyphPage; i < arraySize && i < itemsPerPage * (m_CurrentGlyphPage + 1); i++)\n                    {\n                        // Define the start of the selection region of the element.\n                        Rect elementStartRegion = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true));\n\n                        int elementIndex = i;\n                        if (!string.IsNullOrEmpty(m_GlyphSearchPattern))\n                            elementIndex = m_GlyphSearchList[i];\n\n                        SerializedProperty spriteGlyphProperty = m_SpriteGlyphTableProperty.GetArrayElementAtIndex(elementIndex);\n\n                        EditorGUILayout.BeginVertical(EditorStyles.helpBox);\n                        {\n                            EditorGUI.BeginDisabledGroup(i != m_selectedElement);\n                            {\n                                EditorGUILayout.PropertyField(spriteGlyphProperty);\n                            }\n                            EditorGUI.EndDisabledGroup();\n                        }\n                        EditorGUILayout.EndVertical();\n\n                        // Define the end of the selection region of the element.\n                        Rect elementEndRegion = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true));\n\n                        // Check for Item selection\n                        Rect selectionArea = new Rect(elementStartRegion.x, elementStartRegion.y, elementEndRegion.width, elementEndRegion.y - elementStartRegion.y);\n                        if (DoSelectionCheck(selectionArea))\n                        {\n                            if (m_selectedElement == i)\n                            {\n                                m_selectedElement = -1;\n                            }\n                            else\n                            {\n                                m_selectedElement = i;\n                                GUIUtility.keyboardControl = 0;\n                            }\n                        }\n\n                        // Draw & Handle Section Area\n                        if (m_selectedElement == i)\n                        {\n                            // Draw selection highlight\n                            TMP_EditorUtility.DrawBox(selectionArea, 2f, new Color32(40, 192, 255, 255));\n\n                            // Draw options to MoveUp, MoveDown, Add or Remove Sprites\n                            Rect controlRect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight * 1f);\n                            controlRect.width /= 8;\n\n                            // Move sprite up.\n                            bool guiEnabled = GUI.enabled;\n                            if (i == 0) { GUI.enabled = false; }\n                            if (GUI.Button(controlRect, \"Up\"))\n                            {\n                                SwapGlyphElements(i, i - 1);\n                            }\n                            GUI.enabled = guiEnabled;\n\n                            // Move sprite down.\n                            controlRect.x += controlRect.width;\n                            if (i == arraySize - 1) { GUI.enabled = false; }\n                            if (GUI.Button(controlRect, \"Down\"))\n                            {\n                                SwapGlyphElements(i, i + 1);\n                            }\n                            GUI.enabled = guiEnabled;\n\n                            // Move sprite to new index\n                            controlRect.x += controlRect.width * 2;\n                            //if (i == arraySize - 1) { GUI.enabled = false; }\n                            m_moveToIndex = EditorGUI.IntField(controlRect, m_moveToIndex);\n                            controlRect.x -= controlRect.width;\n                            if (GUI.Button(controlRect, \"Goto\"))\n                            {\n                                MoveGlyphToIndex(i, m_moveToIndex);\n                            }\n                            //controlRect.x += controlRect.width;\n                            GUI.enabled = guiEnabled;\n\n                            // Add new Sprite\n                            controlRect.x += controlRect.width * 4;\n                            if (GUI.Button(controlRect, \"+\"))\n                            {\n                                m_SpriteGlyphTableProperty.arraySize += 1;\n\n                                int index = m_SpriteGlyphTableProperty.arraySize - 1;\n\n                                SerializedProperty newSpriteGlyphProperty = m_SpriteGlyphTableProperty.GetArrayElementAtIndex(index);\n\n                                // Copy properties of the selected element\n                                CopyGlyphSerializedProperty(m_SpriteGlyphTableProperty.GetArrayElementAtIndex(elementIndex), ref newSpriteGlyphProperty);\n\n                                newSpriteGlyphProperty.FindPropertyRelative(\"m_Index\").intValue = index;\n\n                                serializedObject.ApplyModifiedProperties();\n\n                                m_IsGlyphSearchDirty = true;\n                                \n                                //m_SpriteAsset.UpdateLookupTables();\n                            }\n\n                            // Delete selected Sprite\n                            controlRect.x += controlRect.width;\n                            if (m_selectedElement == -1) GUI.enabled = false;\n                            if (GUI.Button(controlRect, \"-\"))\n                            {\n                                SerializedProperty selectedSpriteGlyphProperty = m_SpriteGlyphTableProperty.GetArrayElementAtIndex(elementIndex);\n\n                                int selectedGlyphIndex = selectedSpriteGlyphProperty.FindPropertyRelative(\"m_Index\").intValue;\n\n                                m_SpriteGlyphTableProperty.DeleteArrayElementAtIndex(elementIndex);\n\n                                // Remove all Sprite Characters referencing this glyph.\n                                for (int j = 0; j < m_SpriteCharacterTableProperty.arraySize; j++)\n                                {\n                                    int glyphIndex = m_SpriteCharacterTableProperty.GetArrayElementAtIndex(j).FindPropertyRelative(\"m_GlyphIndex\").intValue;\n\n                                    if (glyphIndex == selectedGlyphIndex)\n                                    {\n                                        // Remove character\n                                        m_SpriteCharacterTableProperty.DeleteArrayElementAtIndex(j);\n                                    }\n                                }\n\n                                m_selectedElement = -1;\n                                serializedObject.ApplyModifiedProperties();\n\n                                m_IsGlyphSearchDirty = true;\n\n                                //m_SpriteAsset.UpdateLookupTables();\n\n                                return;\n                            }\n\n\n                        }\n                    }\n                }\n\n                DisplayPageNavigation(ref m_CurrentGlyphPage, arraySize, itemsPerPage);\n\n                EditorGUIUtility.labelWidth = 40f;\n                EditorGUIUtility.fieldWidth = 20f;\n\n                GUILayout.Space(5f);\n\n                // GLOBAL TOOLS\n                #region Global Tools\n                GUI.enabled = true;\n                EditorGUILayout.BeginVertical(EditorStyles.helpBox);\n                rect = EditorGUILayout.GetControlRect(false, 40);\n\n                float width = (rect.width - 75f) / 4;\n                EditorGUI.LabelField(rect, \"Global Offsets & Scale\", EditorStyles.boldLabel);\n\n\n                rect.x += 70;\n                bool old_ChangedState = GUI.changed;\n\n                GUI.changed = false;\n                m_xOffset = EditorGUI.FloatField(new Rect(rect.x + 5f + width * 0, rect.y + 20, width - 5f, 18), new GUIContent(\"OX:\"), m_xOffset);\n                if (GUI.changed) UpdateGlobalProperty(\"m_HorizontalBearingX\", m_xOffset);\n\n                m_yOffset = EditorGUI.FloatField(new Rect(rect.x + 5f + width * 1, rect.y + 20, width - 5f, 18), new GUIContent(\"OY:\"), m_yOffset);\n                if (GUI.changed) UpdateGlobalProperty(\"m_HorizontalBearingY\", m_yOffset);\n\n                m_xAdvance = EditorGUI.FloatField(new Rect(rect.x + 5f + width * 2, rect.y + 20, width - 5f, 18), new GUIContent(\"ADV.\"), m_xAdvance);\n                if (GUI.changed) UpdateGlobalProperty(\"m_HorizontalAdvance\", m_xAdvance);\n\n                m_scale = EditorGUI.FloatField(new Rect(rect.x + 5f + width * 3, rect.y + 20, width - 5f, 18), new GUIContent(\"SF.\"), m_scale);\n                if (GUI.changed) UpdateGlobalProperty(\"m_Scale\", m_scale);\n\n                EditorGUILayout.EndVertical();\n                #endregion\n\n                GUI.changed = old_ChangedState;\n\n            }\n            #endregion\n\n\n            if (serializedObject.ApplyModifiedProperties() || evt_cmd == k_UndoRedo || isAssetDirty)\n            {\n                if (m_SpriteAsset.m_IsSpriteAssetLookupTablesDirty || evt_cmd == k_UndoRedo)\n                    m_SpriteAsset.UpdateLookupTables();\n\n                TMPro_EventManager.ON_SPRITE_ASSET_PROPERTY_CHANGED(true, m_SpriteAsset);\n\n                isAssetDirty = false;\n                EditorUtility.SetDirty(target);\n            }\n\n            // Clear selection if mouse event was not consumed. \n            GUI.enabled = true;\n            if (currentEvent.type == EventType.MouseDown && currentEvent.button == 0)\n                m_selectedElement = -1;\n\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"arraySize\"></param>\n        /// <param name=\"itemsPerPage\"></param>\n        void DisplayPageNavigation(ref int currentPage, int arraySize, int itemsPerPage)\n        {\n            Rect pagePos = EditorGUILayout.GetControlRect(false, 20);\n            pagePos.width /= 3;\n\n            int shiftMultiplier = Event.current.shift ? 10 : 1; // Page + Shift goes 10 page forward\n\n            // Previous Page\n            GUI.enabled = currentPage > 0;\n\n            if (GUI.Button(pagePos, \"Previous Page\"))\n            {\n                currentPage -= 1 * shiftMultiplier;\n                //m_isNewPage = true;\n            }\n\n            // Page Counter\n            GUI.enabled = true;\n            pagePos.x += pagePos.width;\n            int totalPages = (int)(arraySize / (float)itemsPerPage + 0.999f);\n            GUI.Label(pagePos, \"Page \" + (currentPage + 1) + \" / \" + totalPages, TMP_UIStyleManager.centeredLabel);\n\n            // Next Page\n            pagePos.x += pagePos.width;\n            GUI.enabled = itemsPerPage * (currentPage + 1) < arraySize;\n\n            if (GUI.Button(pagePos, \"Next Page\"))\n            {\n                currentPage += 1 * shiftMultiplier;\n                //m_isNewPage = true;\n            }\n\n            // Clamp page range\n            currentPage = Mathf.Clamp(currentPage, 0, arraySize / itemsPerPage);\n\n            GUI.enabled = true;\n        }\n\n\n        /// <summary>\n        /// Method to update the properties of all sprites\n        /// </summary>\n        /// <param name=\"property\"></param>\n        /// <param name=\"value\"></param>\n        void UpdateGlobalProperty(string property, float value)\n        {\n            int arraySize = m_SpriteGlyphTableProperty.arraySize;\n\n            for (int i = 0; i < arraySize; i++)\n            {\n                // Get a reference to the sprite glyph.\n                SerializedProperty spriteGlyphProperty = m_SpriteGlyphTableProperty.GetArrayElementAtIndex(i);\n\n                if (property == \"m_Scale\")\n                {\n                    spriteGlyphProperty.FindPropertyRelative(property).floatValue = value;\n                }\n                else\n                {\n                    SerializedProperty glyphMetricsProperty = spriteGlyphProperty.FindPropertyRelative(\"m_Metrics\");\n                    glyphMetricsProperty.FindPropertyRelative(property).floatValue = value;\n                }\n            }\n\n            GUI.changed = false;\n        }\n\n        // Check if any of the Style elements were clicked on.\n        private bool DoSelectionCheck(Rect selectionArea)\n        {\n            Event currentEvent = Event.current;\n\n            switch (currentEvent.type)\n            {\n                case EventType.MouseDown:\n                    if (selectionArea.Contains(currentEvent.mousePosition) && currentEvent.button == 0)\n                    {\n                        currentEvent.Use();\n                        return true;\n                    }\n                    break;\n            }\n\n            return false;\n        }\n\n\n        /// <summary>\n        /// Swap the sprite item at the currently selected array index to another index.\n        /// </summary>\n        /// <param name=\"selectedIndex\">Selected index.</param>\n        /// <param name=\"newIndex\">New index.</param>\n        void SwapCharacterElements(int selectedIndex, int newIndex)\n        {\n            m_SpriteCharacterTableProperty.MoveArrayElement(selectedIndex, newIndex);\n            m_selectedElement = newIndex;\n            m_IsCharacterSearchDirty = true;\n            m_SpriteAsset.m_IsSpriteAssetLookupTablesDirty = true;\n        }\n\n        /// <summary>\n        /// Move Sprite Element at selected index to another index and reorder sprite list.\n        /// </summary>\n        /// <param name=\"selectedIndex\"></param>\n        /// <param name=\"newIndex\"></param>\n        void MoveCharacterToIndex(int selectedIndex, int newIndex)\n        {\n            int arraySize = m_SpriteCharacterTableProperty.arraySize;\n\n            if (newIndex >= arraySize)\n                newIndex = arraySize - 1;\n\n            m_SpriteCharacterTableProperty.MoveArrayElement(selectedIndex, newIndex);\n\n            m_selectedElement = newIndex;\n            m_IsCharacterSearchDirty = true;\n            m_SpriteAsset.m_IsSpriteAssetLookupTablesDirty = true;\n\n            // TODO: Need to handle switching pages if the character or glyph is moved to a different page.\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"selectedIndex\"></param>\n        /// <param name=\"newIndex\"></param>\n        void SwapGlyphElements(int selectedIndex, int newIndex)\n        {\n            m_SpriteGlyphTableProperty.MoveArrayElement(selectedIndex, newIndex);\n            m_selectedElement = newIndex;\n            m_IsGlyphSearchDirty = true;\n            m_SpriteAsset.m_IsSpriteAssetLookupTablesDirty = true;\n        }\n\n        /// <summary>\n        /// Move Sprite Element at selected index to another index and reorder sprite list.\n        /// </summary>\n        /// <param name=\"selectedIndex\"></param>\n        /// <param name=\"newIndex\"></param>\n        void MoveGlyphToIndex(int selectedIndex, int newIndex)\n        {\n            int arraySize = m_SpriteGlyphTableProperty.arraySize;\n\n            if (newIndex >= arraySize)\n                newIndex = arraySize - 1;\n\n            m_SpriteGlyphTableProperty.MoveArrayElement(selectedIndex, newIndex);\n\n            m_selectedElement = newIndex;\n            m_IsGlyphSearchDirty = true;\n            m_SpriteAsset.m_IsSpriteAssetLookupTablesDirty = true;\n\n            // TODO: Need to handle switching pages if the character or glyph is moved to a different page.\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"source\"></param>\n        /// <param name=\"target\"></param>\n        void CopyCharacterSerializedProperty(SerializedProperty source, ref SerializedProperty target)\n        {\n            target.FindPropertyRelative(\"m_Name\").stringValue = source.FindPropertyRelative(\"m_Name\").stringValue;\n            target.FindPropertyRelative(\"m_HashCode\").intValue = source.FindPropertyRelative(\"m_HashCode\").intValue;\n            target.FindPropertyRelative(\"m_Unicode\").intValue = source.FindPropertyRelative(\"m_Unicode\").intValue;\n            target.FindPropertyRelative(\"m_GlyphIndex\").intValue = source.FindPropertyRelative(\"m_GlyphIndex\").intValue;\n            target.FindPropertyRelative(\"m_Scale\").floatValue = source.FindPropertyRelative(\"m_Scale\").floatValue;\n        }\n\n        void CopyGlyphSerializedProperty(SerializedProperty srcGlyph, ref SerializedProperty dstGlyph)\n        {\n            // TODO : Should make a generic function which copies each of the properties.\n\n            // Index\n            dstGlyph.FindPropertyRelative(\"m_Index\").intValue = srcGlyph.FindPropertyRelative(\"m_Index\").intValue;\n\n            // GlyphMetrics\n            SerializedProperty srcGlyphMetrics = srcGlyph.FindPropertyRelative(\"m_Metrics\");\n            SerializedProperty dstGlyphMetrics = dstGlyph.FindPropertyRelative(\"m_Metrics\");\n\n            dstGlyphMetrics.FindPropertyRelative(\"m_Width\").floatValue = srcGlyphMetrics.FindPropertyRelative(\"m_Width\").floatValue;\n            dstGlyphMetrics.FindPropertyRelative(\"m_Height\").floatValue = srcGlyphMetrics.FindPropertyRelative(\"m_Height\").floatValue;\n            dstGlyphMetrics.FindPropertyRelative(\"m_HorizontalBearingX\").floatValue = srcGlyphMetrics.FindPropertyRelative(\"m_HorizontalBearingX\").floatValue;\n            dstGlyphMetrics.FindPropertyRelative(\"m_HorizontalBearingY\").floatValue = srcGlyphMetrics.FindPropertyRelative(\"m_HorizontalBearingY\").floatValue;\n            dstGlyphMetrics.FindPropertyRelative(\"m_HorizontalAdvance\").floatValue = srcGlyphMetrics.FindPropertyRelative(\"m_HorizontalAdvance\").floatValue;\n\n            // GlyphRect\n            SerializedProperty srcGlyphRect = srcGlyph.FindPropertyRelative(\"m_GlyphRect\");\n            SerializedProperty dstGlyphRect = dstGlyph.FindPropertyRelative(\"m_GlyphRect\");\n\n            dstGlyphRect.FindPropertyRelative(\"m_X\").intValue = srcGlyphRect.FindPropertyRelative(\"m_X\").intValue;\n            dstGlyphRect.FindPropertyRelative(\"m_Y\").intValue = srcGlyphRect.FindPropertyRelative(\"m_Y\").intValue;\n            dstGlyphRect.FindPropertyRelative(\"m_Width\").intValue = srcGlyphRect.FindPropertyRelative(\"m_Width\").intValue;\n            dstGlyphRect.FindPropertyRelative(\"m_Height\").intValue = srcGlyphRect.FindPropertyRelative(\"m_Height\").intValue;\n\n            dstGlyph.FindPropertyRelative(\"m_Scale\").floatValue = srcGlyph.FindPropertyRelative(\"m_Scale\").floatValue;\n            dstGlyph.FindPropertyRelative(\"m_AtlasIndex\").intValue = srcGlyph.FindPropertyRelative(\"m_AtlasIndex\").intValue;\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"searchPattern\"></param>\n        /// <returns></returns>\n        void SearchCharacterTable(string searchPattern, ref List<int> searchResults)\n        {\n            if (searchResults == null) searchResults = new List<int>();\n            searchResults.Clear();\n\n            int arraySize = m_SpriteCharacterTableProperty.arraySize;\n\n            for (int i = 0; i < arraySize; i++)\n            {\n                SerializedProperty sourceSprite = m_SpriteCharacterTableProperty.GetArrayElementAtIndex(i);\n\n                // Check for potential match against array index\n                if (i.ToString().Contains(searchPattern))\n                {\n                    searchResults.Add(i);\n                    continue;\n                }\n\n                // Check for potential match against decimal id\n                int id = sourceSprite.FindPropertyRelative(\"m_GlyphIndex\").intValue;\n                if (id.ToString().Contains(searchPattern))\n                {\n                    searchResults.Add(i);\n                    continue;\n                }\n\n                // Check for potential match against name\n                string name = sourceSprite.FindPropertyRelative(\"m_Name\").stringValue.ToLower(System.Globalization.CultureInfo.InvariantCulture).Trim();\n                if (name.Contains(searchPattern))\n                {\n                    searchResults.Add(i);\n                    continue;\n                }\n            }\n        }\n\n        void SearchGlyphTable(string searchPattern, ref List<int> searchResults)\n        {\n            if (searchResults == null) searchResults = new List<int>();\n            searchResults.Clear();\n\n            int arraySize = m_SpriteGlyphTableProperty.arraySize;\n\n            for (int i = 0; i < arraySize; i++)\n            {\n                SerializedProperty sourceSprite = m_SpriteGlyphTableProperty.GetArrayElementAtIndex(i);\n\n                // Check for potential match against array index\n                if (i.ToString().Contains(searchPattern))\n                {\n                    searchResults.Add(i);\n                    continue;\n                }\n\n                // Check for potential match against decimal id\n                int id = sourceSprite.FindPropertyRelative(\"m_GlyphIndex\").intValue;\n                if (id.ToString().Contains(searchPattern))\n                {\n                    searchResults.Add(i);\n                    continue;\n                }\n\n                // Check for potential match against name\n                string name = sourceSprite.FindPropertyRelative(\"m_Name\").stringValue.ToLower(System.Globalization.CultureInfo.InvariantCulture).Trim();\n                if (name.Contains(searchPattern))\n                {\n                    searchResults.Add(i);\n                    continue;\n                }\n            }\n        }\n\n    }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SpriteAssetEditor.cs.meta",
    "content": "fileFormatVersion: 2\nguid: b09be1f217d34247af54863a2f5587e1\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SpriteAssetImporter.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.IO;\nusing System.Collections.Generic;\nusing TMPro.EditorUtilities;\nusing TMPro.SpriteAssetUtilities;\n\nnamespace TMPro\n{\n    public class TMP_SpriteAssetImporter : EditorWindow\n    {\n        // Create Sprite Asset Editor Window\n        [MenuItem(\"Window/TextMeshPro/Sprite Importer\", false, 2026)]\n        public static void ShowFontAtlasCreatorWindow()\n        {\n            var window = GetWindow<TMP_SpriteAssetImporter>();\n            window.titleContent = new GUIContent(\"Sprite Importer\");\n            window.Focus();\n        }\n\n        Texture2D m_SpriteAtlas;\n        SpriteAssetImportFormats m_SpriteDataFormat = SpriteAssetImportFormats.TexturePacker;\n        TextAsset m_JsonFile;\n\n        string m_CreationFeedback;\n\n        TMP_SpriteAsset m_SpriteAsset;\n        List<TMP_Sprite> m_SpriteInfoList = new List<TMP_Sprite>();\n\n\n        void OnEnable()\n        {\n            // Set Editor Window Size\n            SetEditorWindowSize();\n        }\n\n        public void OnGUI()\n        {\n            DrawEditorPanel();\n        }\n\n\n        void DrawEditorPanel()\n        {\n            // label\n            GUILayout.Label(\"Import Settings\", EditorStyles.boldLabel);\n\n            EditorGUI.BeginChangeCheck();\n\n            // Sprite Texture Selection\n            m_JsonFile = EditorGUILayout.ObjectField(\"Sprite Data Source\", m_JsonFile, typeof(TextAsset), false) as TextAsset;\n\n            m_SpriteDataFormat = (SpriteAssetImportFormats)EditorGUILayout.EnumPopup(\"Import Format\", m_SpriteDataFormat);\n                    \n            // Sprite Texture Selection\n            m_SpriteAtlas = EditorGUILayout.ObjectField(\"Sprite Texture Atlas\", m_SpriteAtlas, typeof(Texture2D), false) as Texture2D;\n\n            if (EditorGUI.EndChangeCheck())\n            {\n                m_CreationFeedback = string.Empty;\n            }\n\n            GUILayout.Space(10);\n\n            GUI.enabled = m_JsonFile != null && m_SpriteAtlas != null && m_SpriteDataFormat == SpriteAssetImportFormats.TexturePacker;\n\n            // Create Sprite Asset\n            if (GUILayout.Button(\"Create Sprite Asset\"))\n            {\n                m_CreationFeedback = string.Empty;\n\n                // Read json data file\n                if (m_JsonFile != null && m_SpriteDataFormat == SpriteAssetImportFormats.TexturePacker)\n                {\n                    TexturePacker.SpriteDataObject sprites = JsonUtility.FromJson<TexturePacker.SpriteDataObject>(m_JsonFile.text);\n\n                    if (sprites != null && sprites.frames != null && sprites.frames.Count > 0)\n                    {\n                        int spriteCount = sprites.frames.Count;\n\n                        // Update import results\n                        m_CreationFeedback = \"<b>Import Results</b>\\n--------------------\\n\";\n                        m_CreationFeedback += \"<color=#C0ffff><b>\" + spriteCount + \"</b></color> Sprites were imported from file.\";\n\n                        // Create sprite info list\n                        m_SpriteInfoList = CreateSpriteInfoList(sprites);\n                    }\n                }\n\n            }\n\n            GUI.enabled = true;\n\n            // Creation Feedback\n            GUILayout.Space(5);\n            GUILayout.BeginVertical(EditorStyles.helpBox, GUILayout.Height(60));\n            {\n                EditorGUILayout.LabelField(m_CreationFeedback, TMP_UIStyleManager.label);\n            }\n            GUILayout.EndVertical();\n\n            GUILayout.Space(5);\n            GUI.enabled = m_JsonFile != null && m_SpriteAtlas && m_SpriteInfoList != null && m_SpriteInfoList.Count > 0;    // Enable Save Button if font_Atlas is not Null.\n            if (GUILayout.Button(\"Save Sprite Asset\") && m_JsonFile != null)\n            {\n                string filePath = EditorUtility.SaveFilePanel(\"Save Sprite Asset File\", new FileInfo(AssetDatabase.GetAssetPath(m_JsonFile)).DirectoryName, m_JsonFile.name, \"asset\");\n\n                if (filePath.Length == 0)\n                    return;\n\n                SaveSpriteAsset(filePath);\n            }\n            GUI.enabled = true;\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        List<TMP_Sprite> CreateSpriteInfoList(TexturePacker.SpriteDataObject spriteDataObject)\n        {\n            List<TexturePacker.SpriteData> importedSprites = spriteDataObject.frames;\n\n            List<TMP_Sprite> spriteInfoList = new List<TMP_Sprite>();\n\n            for (int i = 0; i < importedSprites.Count; i++)\n            {\n                TMP_Sprite sprite = new TMP_Sprite();\n\n                sprite.id = i;\n                sprite.name = Path.GetFileNameWithoutExtension(importedSprites[i].filename) ?? \"\";\n                sprite.hashCode = TMP_TextUtilities.GetSimpleHashCode(sprite.name);\n\n                // Attempt to extract Unicode value from name\n                int unicode;\n                int indexOfSeperator = sprite.name.IndexOf('-');\n                if (indexOfSeperator != -1)\n                    unicode = TMP_TextUtilities.StringHexToInt(sprite.name.Substring(indexOfSeperator + 1));\n                else\n                    unicode = TMP_TextUtilities.StringHexToInt(sprite.name);\n\n                sprite.unicode = unicode;\n\n                sprite.x = importedSprites[i].frame.x;\n                sprite.y = m_SpriteAtlas.height - (importedSprites[i].frame.y + importedSprites[i].frame.h);\n                sprite.width = importedSprites[i].frame.w;\n                sprite.height = importedSprites[i].frame.h;\n\n                //Calculate sprite pivot position\n                sprite.pivot = importedSprites[i].pivot;\n\n                // Properties the can be modified\n                sprite.xAdvance = sprite.width;\n                sprite.scale = 1.0f;\n                sprite.xOffset = 0 - (sprite.width * sprite.pivot.x);\n                sprite.yOffset = sprite.height - (sprite.height * sprite.pivot.y);\n\n                spriteInfoList.Add(sprite);\n            }\n\n            return spriteInfoList;\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"filePath\"></param>\n        void SaveSpriteAsset(string filePath)\n        {\n            filePath = filePath.Substring(0, filePath.Length - 6); // Trim file extension from filePath.\n\n            string dataPath = Application.dataPath;\n\n            if (filePath.IndexOf(dataPath, System.StringComparison.InvariantCultureIgnoreCase) == -1)\n            {\n                Debug.LogError(\"You're saving the font asset in a directory outside of this project folder. This is not supported. Please select a directory under \\\"\" + dataPath + \"\\\"\");\n                return;\n            }\n\n            string relativeAssetPath = filePath.Substring(dataPath.Length - 6);\n            string dirName = Path.GetDirectoryName(relativeAssetPath);\n            string fileName = Path.GetFileNameWithoutExtension(relativeAssetPath);\n            string pathNoExt = dirName + \"/\" + fileName;\n\n\n            // Create new Sprite Asset using this texture\n            m_SpriteAsset = CreateInstance<TMP_SpriteAsset>();\n            AssetDatabase.CreateAsset(m_SpriteAsset, pathNoExt + \".asset\");\n\n            // Compute the hash code for the sprite asset.\n            m_SpriteAsset.hashCode = TMP_TextUtilities.GetSimpleHashCode(m_SpriteAsset.name);\n\n            // Assign new Sprite Sheet texture to the Sprite Asset.\n            m_SpriteAsset.spriteSheet = m_SpriteAtlas;\n            m_SpriteAsset.spriteInfoList = m_SpriteInfoList;\n\n            // Add new default material for sprite asset.\n            AddDefaultMaterial(m_SpriteAsset);\n        }\n\n\n        /// <summary>\n        /// Create and add new default material to sprite asset.\n        /// </summary>\n        /// <param name=\"spriteAsset\"></param>\n        static void AddDefaultMaterial(TMP_SpriteAsset spriteAsset)\n        {\n            Shader shader = Shader.Find(\"TextMeshPro/Sprite\");\n            Material material = new Material(shader);\n            material.SetTexture(ShaderUtilities.ID_MainTex, spriteAsset.spriteSheet);\n\n            spriteAsset.material = material;\n            material.hideFlags = HideFlags.HideInHierarchy;\n            AssetDatabase.AddObjectToAsset(material, spriteAsset);\n        }\n\n\n        /// <summary>\n        /// Limits the minimum size of the editor window.\n        /// </summary>\n        void SetEditorWindowSize()\n        {\n            EditorWindow editorWindow = this;\n\n            Vector2 currentWindowSize = editorWindow.minSize;\n\n            editorWindow.minSize = new Vector2(Mathf.Max(230, currentWindowSize.x), Mathf.Max(300, currentWindowSize.y));\n        }\n\n    }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SpriteAssetImporter.cs.meta",
    "content": "fileFormatVersion: 2\nguid: f1ea944dcf8849ebab391e461b99ccb7\ntimeCreated: 1480023525\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SpriteAssetMenu.cs",
    "content": "﻿using UnityEngine;\nusing UnityEngine.TextCore;\nusing UnityEditor;\nusing System.Linq;\nusing System.IO;\nusing System.Collections;\nusing System.Collections.Generic;\n\n\nnamespace TMPro.EditorUtilities\n{\n\n    public static class TMP_SpriteAssetMenu\n    {\n        // Add a Context Menu to the Sprite Asset Editor Panel to Create and Add a Default Material.\n        [MenuItem(\"CONTEXT/TMP_SpriteAsset/Add Default Material\", false, 2200)]\n        static void CopyTexture(MenuCommand command)\n        {\n            TMP_SpriteAsset spriteAsset = (TMP_SpriteAsset)command.context;\n\n            // Make sure the sprite asset already contains a default material\n            if (spriteAsset != null && spriteAsset.material == null)\n            {\n                // Add new default material for sprite asset.\n                AddDefaultMaterial(spriteAsset);\n            }\n        }\n\n        // Add a Context Menu to the Sprite Asset Editor Panel to update existing sprite assets.\n        [MenuItem(\"CONTEXT/TMP_SpriteAsset/Update Sprite Asset\", false, 2100)]\n        static void UpdateSpriteAsset(MenuCommand command)\n        {\n            TMP_SpriteAsset spriteAsset = (TMP_SpriteAsset)command.context;\n\n            if (spriteAsset == null)\n                return;\n\n            // Get a list of all the sprites contained in the texture referenced by the sprite asset.\n            // This only works if the texture is set to sprite mode.\n            string filePath = AssetDatabase.GetAssetPath(spriteAsset.spriteSheet);\n\n            if (string.IsNullOrEmpty(filePath))\n                return;\n\n            // Get all the Sprites sorted Left to Right / Top to Bottom\n            Sprite[] sprites = AssetDatabase.LoadAllAssetsAtPath(filePath).Select(x => x as Sprite).Where(x => x != null).OrderByDescending(x => x.rect.y).ThenBy(x => x.rect.x).ToArray();\n\n            List<TMP_SpriteGlyph> spriteGlyphTable = spriteAsset.spriteGlyphTable;\n\n            // Finding available glyph indexes to insert new glyphs into.\n            var tempGlyphTable = spriteGlyphTable.OrderBy(glyph => glyph.index).ToList();\n            List<uint> availableGlyphIndexes = new List<uint>();\n\n            int elementIndex = 0;\n            for (uint i = 0; i < tempGlyphTable[tempGlyphTable.Count - 1].index; i++)\n            {\n                uint currentElementIndex = tempGlyphTable[elementIndex].index;\n\n                if (i == currentElementIndex)\n                    elementIndex += 1;\n                else\n                    availableGlyphIndexes.Add(i);\n            }\n\n            // Iterate over each of the sprites in the texture to try to match them to existing sprites in the sprite asset.\n            for (int i = 0; i < sprites.Length; i++)\n            {\n                int id = sprites[i].GetInstanceID();\n\n                int glyphIndex = spriteGlyphTable.FindIndex(item => item.sprite.GetInstanceID() == id);\n\n                if (glyphIndex == -1)\n                {\n                    // Add new Sprite Glyph to the table\n                    Sprite sprite = sprites[i];\n\n                    TMP_SpriteGlyph spriteGlyph = new TMP_SpriteGlyph();\n\n                    // Get available glyph index\n                    if (availableGlyphIndexes.Count > 0)\n                    {\n                        spriteGlyph.index = availableGlyphIndexes[0];\n                        availableGlyphIndexes.RemoveAt(0);\n                    }\n                    else\n                        spriteGlyph.index = (uint)spriteGlyphTable.Count;\n\n                    spriteGlyph.metrics = new GlyphMetrics(sprite.rect.width, sprite.rect.height, -sprite.pivot.x, sprite.rect.height - sprite.pivot.y, sprite.rect.width);\n                    spriteGlyph.glyphRect = new GlyphRect(sprite.rect);\n                    spriteGlyph.scale = 1.0f;\n                    spriteGlyph.sprite = sprite;\n\n                    spriteGlyphTable.Add(spriteGlyph);\n\n                    TMP_SpriteCharacter spriteCharacter = new TMP_SpriteCharacter(0, spriteGlyph);\n                    spriteCharacter.name = sprite.name;\n                    spriteCharacter.scale = 1.0f;\n\n                    spriteAsset.spriteCharacterTable.Add(spriteCharacter);\n                }\n                else\n                {\n                    // Look for changes in existing Sprite Glyph\n                    Sprite sprite = sprites[i];\n\n                    TMP_SpriteGlyph spriteGlyph = spriteGlyphTable[glyphIndex];\n\n                    // We only update changes to the sprite position / glyph rect.\n                    if (spriteGlyph.glyphRect.x != sprite.rect.x || spriteGlyph.glyphRect.y != sprite.rect.y || spriteGlyph.glyphRect.width != sprite.rect.width || spriteGlyph.glyphRect.height != sprite.rect.height)\n                        spriteGlyph.glyphRect = new GlyphRect(sprite.rect);\n                }\n            }\n\n            // Sort glyph table by glyph index\n            spriteAsset.SortGlyphTable();\n            spriteAsset.UpdateLookupTables();\n            TMPro_EventManager.ON_SPRITE_ASSET_PROPERTY_CHANGED(true, spriteAsset);\n        }\n\n\n        [MenuItem(\"Assets/Create/TextMeshPro/Sprite Asset\", false, 110)]\n        public static void CreateSpriteAsset()\n        {\n            Object target = Selection.activeObject;\n\n            // Make sure the selection is a texture.\n            if (target == null || target.GetType() != typeof(Texture2D))\n            {\n                Debug.LogWarning(\"A texture which contains sprites must first be selected in order to create a TextMesh Pro Sprite Asset.\");\n                return;\n            }\n\n            Texture2D sourceTex = target as Texture2D;\n\n            // Get the path to the selected texture.\n            string filePathWithName = AssetDatabase.GetAssetPath(sourceTex);\n            string fileNameWithExtension = Path.GetFileName(filePathWithName);\n            string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(filePathWithName);\n            string filePath = filePathWithName.Replace(fileNameWithExtension, \"\");\n             \n            // Check if Sprite Asset already exists\n            TMP_SpriteAsset spriteAsset = AssetDatabase.LoadAssetAtPath(filePath + fileNameWithoutExtension + \".asset\", typeof(TMP_SpriteAsset)) as TMP_SpriteAsset;\n            bool isNewAsset = spriteAsset == null ? true : false;\n\n            if (isNewAsset)\n            {\n                // Create new Sprite Asset using this texture\n                spriteAsset = ScriptableObject.CreateInstance<TMP_SpriteAsset>();\n                AssetDatabase.CreateAsset(spriteAsset, filePath + fileNameWithoutExtension + \".asset\");\n\n                spriteAsset.version = \"1.1.0\";\n\n                // Compute the hash code for the sprite asset.\n                spriteAsset.hashCode = TMP_TextUtilities.GetSimpleHashCode(spriteAsset.name);\n\n                // Assign new Sprite Sheet texture to the Sprite Asset.\n                spriteAsset.spriteSheet = sourceTex;\n\n                List<TMP_SpriteGlyph> spriteGlyphTable = new List<TMP_SpriteGlyph>();\n                List<TMP_SpriteCharacter> spriteCharacterTable = new List<TMP_SpriteCharacter>();\n\n                PopulateSpriteTables(sourceTex, ref spriteCharacterTable, ref spriteGlyphTable);\n\n                spriteAsset.spriteCharacterTable = spriteCharacterTable;\n                spriteAsset.spriteGlyphTable = spriteGlyphTable;\n\n                // Add new default material for sprite asset.\n                AddDefaultMaterial(spriteAsset);\n            }\n            //else\n            //{\n            //    spriteAsset.spriteInfoList = UpdateSpriteInfo(spriteAsset);\n\n            //    // Make sure the sprite asset already contains a default material\n            //    if (spriteAsset.material == null)\n            //    {\n            //        // Add new default material for sprite asset.\n            //        AddDefaultMaterial(spriteAsset);\n            //    }\n\n            //}\n\n            // Update Lookup tables.\n            spriteAsset.UpdateLookupTables();\n\n            // Get the Sprites contained in the Sprite Sheet\n            EditorUtility.SetDirty(spriteAsset);\n            \n            //spriteAsset.sprites = sprites;\n\n            // Set source texture back to Not Readable.\n            //texImporter.isReadable = false;\n\n\n            AssetDatabase.SaveAssets();\n\n            AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(spriteAsset));  // Re-import font asset to get the new updated version.\n\n            //AssetDatabase.Refresh();\n        }\n\n\n        private static void PopulateSpriteTables(Texture source, ref List<TMP_SpriteCharacter> spriteCharacterTable, ref List<TMP_SpriteGlyph> spriteGlyphTable)\n        {\n            //Debug.Log(\"Creating new Sprite Asset.\");\n            \n            string filePath = AssetDatabase.GetAssetPath(source);\n\n            // Get all the Sprites sorted by Index\n            Sprite[] sprites = AssetDatabase.LoadAllAssetsAtPath(filePath).Select(x => x as Sprite).Where(x => x != null).OrderByDescending(x => x.rect.y).ThenBy(x => x.rect.x).ToArray();\n            \n            for (int i = 0; i < sprites.Length; i++)\n            {\n                Sprite sprite = sprites[i];\n\n                TMP_SpriteGlyph spriteGlyph = new TMP_SpriteGlyph();\n                spriteGlyph.index = (uint)i;\n                spriteGlyph.metrics = new GlyphMetrics(sprite.rect.width, sprite.rect.height, -sprite.pivot.x, sprite.rect.height - sprite.pivot.y, sprite.rect.width);\n                spriteGlyph.glyphRect = new GlyphRect(sprite.rect);\n                spriteGlyph.scale = 1.0f;\n                spriteGlyph.sprite = sprite;\n\n                spriteGlyphTable.Add(spriteGlyph);\n\n                TMP_SpriteCharacter spriteCharacter = new TMP_SpriteCharacter(0, spriteGlyph);\n                spriteCharacter.name = sprite.name;\n                spriteCharacter.scale = 1.0f;\n\n                spriteCharacterTable.Add(spriteCharacter);\n            }\n        }\n\n\n        /// <summary>\n        /// Create and add new default material to sprite asset.\n        /// </summary>\n        /// <param name=\"spriteAsset\"></param>\n        private static void AddDefaultMaterial(TMP_SpriteAsset spriteAsset)\n        {\n            Shader shader = Shader.Find(\"TextMeshPro/Sprite\");\n            Material material = new Material(shader);\n            material.SetTexture(ShaderUtilities.ID_MainTex, spriteAsset.spriteSheet);\n\n            spriteAsset.material = material;\n            material.hideFlags = HideFlags.HideInHierarchy;\n            AssetDatabase.AddObjectToAsset(material, spriteAsset);\n        }\n\n\n        // Update existing SpriteInfo\n        private static List<TMP_Sprite> UpdateSpriteInfo(TMP_SpriteAsset spriteAsset)\n        {\n            //Debug.Log(\"Updating Sprite Asset.\");\n\n            string filePath = AssetDatabase.GetAssetPath(spriteAsset.spriteSheet);\n\n            // Get all the Sprites sorted Left to Right / Top to Bottom\n            Sprite[] sprites = AssetDatabase.LoadAllAssetsAtPath(filePath).Select(x => x as Sprite).Where(x => x != null).OrderByDescending(x => x.rect.y).ThenBy(x => x.rect.x).ToArray();\n\n            for (int i = 0; i < sprites.Length; i++)\n            {\n                Sprite sprite = sprites[i];\n\n                // Check if the sprite is already contained in the SpriteInfoList\n                int index = -1;\n                if (spriteAsset.spriteInfoList.Count > i && spriteAsset.spriteInfoList[i].sprite != null)\n                    index = spriteAsset.spriteInfoList.FindIndex(item => item.sprite.GetInstanceID() == sprite.GetInstanceID());\n\n                // Use existing SpriteInfo if it already exists\n                TMP_Sprite spriteInfo = index == -1 ? new TMP_Sprite() : spriteAsset.spriteInfoList[index];\n\n                Rect spriteRect = sprite.rect;\n                spriteInfo.x = spriteRect.x;\n                spriteInfo.y = spriteRect.y;\n                spriteInfo.width = spriteRect.width;\n                spriteInfo.height = spriteRect.height;\n\n                // Get Sprite Pivot\n                Vector2 pivot = new Vector2(0 - (sprite.bounds.min.x) / (sprite.bounds.extents.x * 2), 0 - (sprite.bounds.min.y) / (sprite.bounds.extents.y * 2));\n\n                // The position of the pivot influences the Offset position.\n                spriteInfo.pivot = new Vector2(0 - pivot.x * spriteRect.width, spriteRect.height - pivot.y * spriteRect.height);\n\n                if (index == -1)\n                {\n                    // Find the next available index for this Sprite\n                    int[] ids = spriteAsset.spriteInfoList.Select(item => item.id).ToArray();\n\n                    int id = 0;\n                    for (int j = 0; j < ids.Length; j++ )\n                    {\n                        if (ids[0] != 0) break;\n \n                        if (j > 0 && (ids[j] - ids[j - 1]) > 1)\n                        {\n                            id = ids[j - 1] + 1;\n                            break;\n                        }\n\n                        id = j + 1;\n                    }\n\n                    spriteInfo.sprite = sprite;\n                    spriteInfo.name = sprite.name;\n                    spriteInfo.hashCode = TMP_TextUtilities.GetSimpleHashCode(spriteInfo.name);\n                    spriteInfo.id = id;\n                    spriteInfo.xAdvance = spriteRect.width;\n                    spriteInfo.scale = 1.0f;\n\n                    spriteInfo.xOffset = spriteInfo.pivot.x;\n                    spriteInfo.yOffset = spriteInfo.pivot.y;\n\n                    spriteAsset.spriteInfoList.Add(spriteInfo);\n\n                    // Sort the Sprites by ID\n                    spriteAsset.spriteInfoList = spriteAsset.spriteInfoList.OrderBy(s => s.id).ToList();\n                }\n                else\n                {\n                    spriteAsset.spriteInfoList[index] = spriteInfo;\n                }\n            }\n\n            return spriteAsset.spriteInfoList;\n        }\n\n       \n    }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SpriteAssetMenu.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 1048a87135154606808bf2030da32d18\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SpriteCharacterPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\nusing UnityEngine.TextCore;\nusing UnityEditor;\nusing System.Collections;\n\n\nnamespace TMPro.EditorUtilities\n{\n\n    [CustomPropertyDrawer(typeof(TMP_SpriteCharacter))]\n    public class TMP_SpriteCharacterPropertyDrawer : PropertyDrawer\n    {\n        int m_GlyphSelectedForEditing = -1;\n\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\n        {\n            SerializedProperty prop_SpriteName = property.FindPropertyRelative(\"m_Name\");\n            SerializedProperty prop_SpriteNameHashCode = property.FindPropertyRelative(\"m_HashCode\");\n            SerializedProperty prop_SpriteUnicode = property.FindPropertyRelative(\"m_Unicode\");\n            SerializedProperty prop_SpriteGlyphIndex = property.FindPropertyRelative(\"m_GlyphIndex\");\n            SerializedProperty prop_SpriteScale = property.FindPropertyRelative(\"m_Scale\");\n\n\n            GUIStyle style = new GUIStyle(EditorStyles.label);\n            style.richText = true;\n\n            EditorGUIUtility.labelWidth = 40f;\n            EditorGUIUtility.fieldWidth = 50;\n\n            Rect rect = new Rect(position.x + 60, position.y, position.width, 49);\n\n            // Display non-editable fields\n            if (GUI.enabled == false)\n            {\n                // Sprite Character Index\n                int.TryParse(property.displayName.Split(' ')[1], out int spriteCharacterIndex);\n                EditorGUI.LabelField(new Rect(rect.x, rect.y, 75f, 18), new GUIContent(\"Index: <color=#FFFF80>\" + spriteCharacterIndex + \"</color>\"), style);\n\n                EditorGUI.LabelField(new Rect(rect.x + 75f, rect.y, 120f, 18), new GUIContent(\"Unicode: <color=#FFFF80>0x\" + prop_SpriteUnicode.intValue.ToString(\"X\") + \"</color>\"), style);\n                EditorGUI.LabelField(new Rect(rect.x + 195f, rect.y, rect.width - 255, 18), new GUIContent(\"Name: <color=#FFFF80>\" + prop_SpriteName.stringValue + \"</color>\"), style);\n\n                EditorGUI.LabelField(new Rect(rect.x, rect.y + 18, 120, 18), new GUIContent(\"Glyph ID: <color=#FFFF80>\" + prop_SpriteGlyphIndex.intValue + \"</color>\"), style);\n\n                // Draw Sprite Glyph (if exists)\n                DrawSpriteGlyph(position, property);\n\n                EditorGUI.LabelField(new Rect(rect.x, rect.y + 36, 80, 18), new GUIContent(\"Scale: <color=#FFFF80>\" + prop_SpriteScale.floatValue + \"</color>\"), style);\n            }\n            else // Display editable fields\n            {\n                // Get a reference to the underlying Sprite Asset\n                TMP_SpriteAsset spriteAsset = property.serializedObject.targetObject as TMP_SpriteAsset;\n\n                // Sprite Character Index\n                int.TryParse(property.displayName.Split(' ')[1], out int spriteCharacterIndex);\n\n                EditorGUI.LabelField(new Rect(rect.x, rect.y, 75f, 18), new GUIContent(\"Index: <color=#FFFF80>\" + spriteCharacterIndex + \"</color>\"), style);\n\n                EditorGUIUtility.labelWidth = 55f;\n                GUI.SetNextControlName(\"Unicode Input\");\n                EditorGUI.BeginChangeCheck();\n                string unicode = EditorGUI.DelayedTextField(new Rect(rect.x + 75f, rect.y, 120, 18), \"Unicode:\", prop_SpriteUnicode.intValue.ToString(\"X\"));\n\n                if (GUI.GetNameOfFocusedControl() == \"Unicode Input\")\n                {\n                    //Filter out unwanted characters.\n                    char chr = Event.current.character;\n                    if ((chr < '0' || chr > '9') && (chr < 'a' || chr > 'f') && (chr < 'A' || chr > 'F'))\n                    {\n                        Event.current.character = '\\0';\n                    }\n                }\n\n                if (EditorGUI.EndChangeCheck())\n                {\n                    // Update Unicode value\n                    prop_SpriteUnicode.intValue = TMP_TextUtilities.StringHexToInt(unicode);\n                    spriteAsset.m_IsSpriteAssetLookupTablesDirty = true;\n                }\n\n                EditorGUIUtility.labelWidth = 41f;\n                EditorGUI.BeginChangeCheck();\n                EditorGUI.DelayedTextField(new Rect(rect.x + 195f, rect.y, rect.width - 255, 18), prop_SpriteName, new GUIContent(\"Name:\"));\n                if (EditorGUI.EndChangeCheck())\n                {\n                    // Recompute hashCode for new name\n                    prop_SpriteNameHashCode.intValue = TMP_TextUtilities.GetSimpleHashCode(prop_SpriteName.stringValue);\n                    spriteAsset.m_IsSpriteAssetLookupTablesDirty = true;\n                }\n\n                EditorGUIUtility.labelWidth = 59f;\n                EditorGUI.BeginChangeCheck();\n                EditorGUI.DelayedIntField(new Rect(rect.x, rect.y + 18, 100, 18), prop_SpriteGlyphIndex, new GUIContent(\"Glyph ID:\"));\n                if (EditorGUI.EndChangeCheck())\n                {\n                    spriteAsset.m_IsSpriteAssetLookupTablesDirty = true;\n                }\n\n                // Draw Sprite Glyph (if exists)\n                DrawSpriteGlyph(position, property);\n\n                int glyphIndex = prop_SpriteGlyphIndex.intValue;\n\n                // Reset glyph selection if new character has been selected.\n                if (GUI.enabled && m_GlyphSelectedForEditing != glyphIndex)\n                    m_GlyphSelectedForEditing = -1;\n\n                // Display button to edit the glyph data.\n                if (GUI.Button(new Rect(rect.x + 120, rect.y + 18, 75, 18), new GUIContent(\"Edit Glyph\")))\n                {\n                    if (m_GlyphSelectedForEditing == -1)\n                        m_GlyphSelectedForEditing = glyphIndex;\n                    else\n                        m_GlyphSelectedForEditing = -1;\n\n                    // Button clicks should not result in potential change.\n                    GUI.changed = false;\n                }\n\n                // Show the glyph property drawer if selected\n                if (glyphIndex == m_GlyphSelectedForEditing && GUI.enabled)\n                {\n                    if (spriteAsset != null)\n                    {\n                        // Lookup glyph and draw glyph (if available)\n                        int elementIndex = spriteAsset.spriteGlyphTable.FindIndex(item => item.index == glyphIndex);\n\n                        if (elementIndex != -1)\n                        {\n                            // Get a reference to the Sprite Glyph Table\n                            SerializedProperty prop_SpriteGlyphTable = property.serializedObject.FindProperty(\"m_SpriteGlyphTable\");\n\n                            SerializedProperty prop_SpriteGlyph = prop_SpriteGlyphTable.GetArrayElementAtIndex(elementIndex);\n                            SerializedProperty prop_GlyphMetrics = prop_SpriteGlyph.FindPropertyRelative(\"m_Metrics\");\n                            SerializedProperty prop_GlyphRect = prop_SpriteGlyph.FindPropertyRelative(\"m_GlyphRect\");\n\n                            Rect newRect = EditorGUILayout.GetControlRect(false, 115);\n                            EditorGUI.DrawRect(new Rect(newRect.x + 62, newRect.y - 20, newRect.width - 62, newRect.height - 5), new Color(0.1f, 0.1f, 0.1f, 0.45f));\n                            EditorGUI.DrawRect(new Rect(newRect.x + 63, newRect.y - 19, newRect.width - 64, newRect.height - 7), new Color(0.3f, 0.3f, 0.3f, 0.8f));\n\n                            // Display GlyphRect\n                            newRect.x += 65;\n                            newRect.y -= 18;\n                            newRect.width += 5;\n                            EditorGUI.PropertyField(newRect, prop_GlyphRect);\n\n                            // Display GlyphMetrics\n                            newRect.y += 45;\n                            EditorGUI.PropertyField(newRect, prop_GlyphMetrics);\n\n                            rect.y += 120;\n                        }\n                    }\n                }\n\n                EditorGUIUtility.labelWidth = 39f;\n                EditorGUI.PropertyField(new Rect(rect.x, rect.y + 36, 80, 18), prop_SpriteScale, new GUIContent(\"Scale:\"));\n            }\n        }\n\n\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\n        {\n            return 58;\n        }\n\n\n        void DrawSpriteGlyph(Rect position, SerializedProperty property)\n        {\n            // Get a reference to the sprite glyph table\n            TMP_SpriteAsset spriteAsset = property.serializedObject.targetObject as TMP_SpriteAsset;\n\n            if (spriteAsset == null)\n                return;\n\n            int glyphIndex = property.FindPropertyRelative(\"m_GlyphIndex\").intValue;\n\n            // Lookup glyph and draw glyph (if available)\n            int elementIndex = spriteAsset.spriteGlyphTable.FindIndex(item => item.index == glyphIndex);\n\n            if (elementIndex != -1)\n            {\n                // Get a reference to the Sprite Glyph Table\n                SerializedProperty prop_SpriteGlyphTable = property.serializedObject.FindProperty(\"m_SpriteGlyphTable\");\n                SerializedProperty prop_SpriteGlyph = prop_SpriteGlyphTable.GetArrayElementAtIndex(elementIndex);\n                SerializedProperty prop_GlyphRect = prop_SpriteGlyph.FindPropertyRelative(\"m_GlyphRect\");\n\n                // Get a reference to the sprite texture\n                Texture tex = spriteAsset.spriteSheet;\n\n                // Return if we don't have a texture assigned to the sprite asset.\n                if (tex == null)\n                {\n                    Debug.LogWarning(\"Please assign a valid Sprite Atlas texture to the [\" + spriteAsset.name + \"] Sprite Asset.\", spriteAsset);\n                    return;\n                }\n\n                Vector2 spriteTexPosition = new Vector2(position.x, position.y);\n                Vector2 spriteSize = new Vector2(48, 48);\n                Vector2 alignmentOffset = new Vector2((58 - spriteSize.x) / 2, (58 - spriteSize.y) / 2);\n\n                float x = prop_GlyphRect.FindPropertyRelative(\"m_X\").intValue;\n                float y = prop_GlyphRect.FindPropertyRelative(\"m_Y\").intValue;\n                float spriteWidth = prop_GlyphRect.FindPropertyRelative(\"m_Width\").intValue;\n                float spriteHeight = prop_GlyphRect.FindPropertyRelative(\"m_Height\").intValue;\n\n                if (spriteWidth >= spriteHeight)\n                {\n                    spriteSize.y = spriteHeight * spriteSize.x / spriteWidth;\n                    spriteTexPosition.y += (spriteSize.x - spriteSize.y) / 2;\n                }\n                else\n                {\n                    spriteSize.x = spriteWidth * spriteSize.y / spriteHeight;\n                    spriteTexPosition.x += (spriteSize.y - spriteSize.x) / 2;\n                }\n\n                // Compute the normalized texture coordinates\n                Rect texCoords = new Rect(x / tex.width, y / tex.height, spriteWidth / tex.width, spriteHeight / tex.height);\n                GUI.DrawTextureWithTexCoords(new Rect(spriteTexPosition.x + alignmentOffset.x, spriteTexPosition.y + alignmentOffset.y, spriteSize.x, spriteSize.y), tex, texCoords, true);\n            }\n        }\n\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SpriteCharacterPropertyDrawer.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 37cff9f5a86ae494c8cb04423580480d\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SpriteGlyphPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\nusing UnityEngine.TextCore;\nusing UnityEditor;\nusing System.Collections;\n\n\nnamespace TMPro.EditorUtilities\n{\n\n    [CustomPropertyDrawer(typeof(TMP_SpriteGlyph))]\n    public class TMP_SpriteGlyphPropertyDrawer : PropertyDrawer\n    {\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\n        {\n            SerializedProperty prop_GlyphIndex = property.FindPropertyRelative(\"m_Index\");\n            SerializedProperty prop_GlyphMetrics = property.FindPropertyRelative(\"m_Metrics\");\n            SerializedProperty prop_GlyphRect = property.FindPropertyRelative(\"m_GlyphRect\");\n            SerializedProperty prop_Scale = property.FindPropertyRelative(\"m_Scale\");\n            SerializedProperty prop_AtlasIndex = property.FindPropertyRelative(\"m_AtlasIndex\");\n\n            GUIStyle style = new GUIStyle(EditorStyles.label);\n            style.richText = true;\n\n            Rect rect = new Rect(position.x + 70, position.y, position.width, 49);\n\n            // Draw GlyphRect\n            EditorGUI.PropertyField(rect, prop_GlyphRect);\n\n            // Draw GlyphMetrics\n            rect.y += 45;\n            EditorGUI.PropertyField(rect, prop_GlyphMetrics);\n\n            EditorGUIUtility.labelWidth = 40f;\n            EditorGUI.PropertyField(new Rect(rect.x, rect.y + 65, 75, 18), prop_Scale, new GUIContent(\"Scale:\"));\n\n            EditorGUIUtility.labelWidth = 74f;\n            EditorGUI.PropertyField(new Rect(rect.x + 85, rect.y + 65, 95, 18), prop_AtlasIndex, new GUIContent(\"Atlas Index:\"));\n\n            DrawGlyph(position, property);\n\n            int.TryParse(property.displayName.Split(' ')[1], out int spriteCharacterIndex);\n            float labelWidthIndex = GUI.skin.label.CalcSize(new GUIContent(\"#\" + spriteCharacterIndex)).x;\n            EditorGUI.LabelField(new Rect(position.x, position.y + 5, 64f, 18f), new GUIContent(\"#\" + spriteCharacterIndex), style);\n\n            float labelWidthID = GUI.skin.label.CalcSize(new GUIContent(\"ID: \" + prop_GlyphIndex.intValue)).x;\n            EditorGUI.LabelField(new Rect(position.x + (64 - labelWidthID) / 2, position.y + 110, 64f, 18f), new GUIContent(\"ID: <color=#FFFF80>\" + prop_GlyphIndex.intValue + \"</color>\"), style);\n        }\n\n        void DrawGlyph(Rect position, SerializedProperty property)\n        {\n            // Get a reference to the sprite texture\n            Texture tex = (property.serializedObject.targetObject as TMP_SpriteAsset).spriteSheet;\n\n            // Return if we don't have a texture assigned to the sprite asset.\n            if (tex == null)\n            {\n                Debug.LogWarning(\"Please assign a valid Sprite Atlas texture to the [\" + property.serializedObject.targetObject.name + \"] Sprite Asset.\", property.serializedObject.targetObject);\n                return;\n            }\n\n            Vector2 spriteTexPosition = new Vector2(position.x, position.y);\n            Vector2 spriteSize = new Vector2(65, 65);\n\n            SerializedProperty prop_GlyphRect = property.FindPropertyRelative(\"m_GlyphRect\");\n\n            int spriteImageX = prop_GlyphRect.FindPropertyRelative(\"m_X\").intValue;\n            int spriteImageY = prop_GlyphRect.FindPropertyRelative(\"m_Y\").intValue;\n            int spriteImageWidth = prop_GlyphRect.FindPropertyRelative(\"m_Width\").intValue;\n            int spriteImageHeight = prop_GlyphRect.FindPropertyRelative(\"m_Height\").intValue;\n\n            if (spriteImageWidth >= spriteImageHeight)\n            {\n                spriteSize.y = spriteImageHeight * spriteSize.x / spriteImageWidth;\n                spriteTexPosition.y += (spriteSize.x - spriteSize.y) / 2;\n            }\n            else\n            {\n                spriteSize.x = spriteImageWidth * spriteSize.y / spriteImageHeight;\n                spriteTexPosition.x += (spriteSize.y - spriteSize.x) / 2;\n            }\n\n            // Compute the normalized texture coordinates\n            Rect texCoords = new Rect((float)spriteImageX / tex.width, (float)spriteImageY / tex.height, (float)spriteImageWidth / tex.width, (float)spriteImageHeight / tex.height);\n            GUI.DrawTextureWithTexCoords(new Rect(spriteTexPosition.x + 5, spriteTexPosition.y + 32f, spriteSize.x, spriteSize.y), tex, texCoords, true);\n        }\n\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\n        {\n            return 130f;\n        }\n\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SpriteGlyphPropertyDrawer.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 056819c66570ca54cadb72330a354050\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_StyleAssetMenu.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.IO;\nusing System.Collections;\n\n\nnamespace TMPro.EditorUtilities\n{\n\n    public static class TMP_StyleAssetMenu\n    {\n\n        [MenuItem(\"Assets/Create/TextMeshPro/Style Sheet\", false, 120)]\n        public static void CreateTextMeshProObjectPerform()\n        {\n            string filePath;\n            if (Selection.assetGUIDs.Length == 0)\n            {\n                // No asset selected.\n                filePath = \"Assets\";\n            }\n            else\n            {\n                // Get the path of the selected folder or asset.\n                filePath = AssetDatabase.GUIDToAssetPath(Selection.assetGUIDs[0]);\n\n                // Get the file extension of the selected asset as it might need to be removed.\n                string fileExtension = Path.GetExtension(filePath);\n                if (fileExtension != \"\")\n                {\n                    filePath = Path.GetDirectoryName(filePath);\n                }\n            }\n\n\n            string filePathWithName = AssetDatabase.GenerateUniqueAssetPath(filePath + \"/TMP StyleSheet.asset\");\n\n            //// Create new Style Sheet Asset.\n            TMP_StyleSheet styleSheet = ScriptableObject.CreateInstance<TMP_StyleSheet>();\n\n            AssetDatabase.CreateAsset(styleSheet, filePathWithName);\n\n            EditorUtility.SetDirty(styleSheet);\n\n            AssetDatabase.SaveAssets();\n        }\n    }\n\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_StyleAssetMenu.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 23a562f2cac6401f9f91251c68a1a794\ntimeCreated: 1432690168\nlicenseType: Store\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_StyleSheetEditor.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\n\n\nnamespace TMPro.EditorUtilities\n{\n\n    [CustomPropertyDrawer(typeof(TMP_Style))]\n    public class StyleDrawer : PropertyDrawer\n    {\n        public static readonly float height = 95f;\n\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\n        {\n            return height;\n        }\n\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\n        {\n            SerializedProperty nameProperty = property.FindPropertyRelative(\"m_Name\");\n            SerializedProperty hashCodeProperty = property.FindPropertyRelative(\"m_HashCode\");\n            SerializedProperty openingDefinitionProperty = property.FindPropertyRelative(\"m_OpeningDefinition\");\n            SerializedProperty closingDefinitionProperty = property.FindPropertyRelative(\"m_ClosingDefinition\");\n            SerializedProperty openingDefinitionArray = property.FindPropertyRelative(\"m_OpeningTagArray\");\n            SerializedProperty closingDefinitionArray = property.FindPropertyRelative(\"m_ClosingTagArray\");\n\n\n            EditorGUIUtility.labelWidth = 90;\n            position.height = EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;\n            float labelHeight = position.height + 2f;\n\n            EditorGUI.BeginChangeCheck();\n            Rect rect0 = new Rect(position.x, position.y, (position.width) / 2 + 5, position.height);\n            EditorGUI.PropertyField(rect0, nameProperty);\n            if (EditorGUI.EndChangeCheck())\n            {\n                // Recompute HashCode if name has changed.\n                hashCodeProperty.intValue = TMP_TextUtilities.GetSimpleHashCode(nameProperty.stringValue);\n\n                property.serializedObject.ApplyModifiedProperties();\n                // Dictionary needs to be updated since HashCode has changed.\n                TMP_StyleSheet.RefreshStyles();\n            }\n\n            // HashCode\n            Rect rect1 = new Rect(rect0.x + rect0.width + 5, position.y, 65, position.height);\n            GUI.Label(rect1, \"HashCode\");\n            GUI.enabled = false;\n            rect1.x += 65;\n            rect1.width = position.width / 2 - 75;\n            EditorGUI.PropertyField(rect1, hashCodeProperty, GUIContent.none);\n            \n            GUI.enabled = true;\n\n            // Text Tags\n            EditorGUI.BeginChangeCheck();\n            \n            // Opening Tags\n            position.y += labelHeight;\n            GUI.Label(position, \"Opening Tags\");\n            Rect textRect1 = new Rect(108, position.y, position.width - 86, 35);\n            openingDefinitionProperty.stringValue = EditorGUI.TextArea(textRect1, openingDefinitionProperty.stringValue);\n            if (EditorGUI.EndChangeCheck())\n            {\n                // If any properties have changed, we need to update the Opening and Closing Arrays.\n                int size = openingDefinitionProperty.stringValue.Length;\n\n                // Adjust array size to match new string length.\n                if (openingDefinitionArray.arraySize != size) openingDefinitionArray.arraySize = size;\n\n                for (int i = 0; i < size; i++)\n                {\n                    SerializedProperty element = openingDefinitionArray.GetArrayElementAtIndex(i);\n                    element.intValue = openingDefinitionProperty.stringValue[i];\n                }\n            }\n\n            EditorGUI.BeginChangeCheck();\n\n            // Closing Tags\n            position.y += 38;\n            GUI.Label(position, \"Closing Tags\");\n            Rect textRect2 = new Rect(108, position.y, position.width - 86, 35);\n            closingDefinitionProperty.stringValue = EditorGUI.TextArea(textRect2, closingDefinitionProperty.stringValue);\n\n            if (EditorGUI.EndChangeCheck())\n            {\n                // If any properties have changed, we need to update the Opening and Closing Arrays.\n                int size = closingDefinitionProperty.stringValue.Length;\n                \n                // Adjust array size to match new string length.\n                if (closingDefinitionArray.arraySize != size) closingDefinitionArray.arraySize = size;\n                \n                for (int i = 0; i < size; i++)\n                {\n                    SerializedProperty element = closingDefinitionArray.GetArrayElementAtIndex(i);\n                    element.intValue = closingDefinitionProperty.stringValue[i];\n                }            \n            }\n\n        }\n    }\n\n\n\n    [CustomEditor(typeof(TMP_StyleSheet)), CanEditMultipleObjects]\n    public class TMP_StyleEditor : Editor\n    {\n\n        SerializedProperty m_StyleListProp;\n\n        int m_SelectedElement = -1;\n\n        //private Event m_CurrentEvent;\n        int m_Page;\n\n\n       \n        void OnEnable()\n        {\n            m_StyleListProp = serializedObject.FindProperty(\"m_StyleList\");\n        }\n\n\n        public override void OnInspectorGUI()\n        {\n            Event currentEvent = Event.current;\n\n            serializedObject.Update();\n\n            int arraySize = m_StyleListProp.arraySize;\n            int itemsPerPage = (Screen.height - 178) / 111;\n\n            if (arraySize > 0)\n            {\n                // Display each Style entry using the StyleDrawer PropertyDrawer.\n                for (int i = itemsPerPage * m_Page; i < arraySize && i < itemsPerPage * (m_Page + 1); i++)\n                {\n\n                    // Define the start of the selection region of the element.\n                    Rect elementStartRegion = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true));\n\n                    EditorGUILayout.BeginVertical(EditorStyles.helpBox);\n   \n                    SerializedProperty spriteInfo = m_StyleListProp.GetArrayElementAtIndex(i);\n                    EditorGUI.BeginChangeCheck();\n                    EditorGUILayout.PropertyField(spriteInfo);\n                    EditorGUILayout.EndVertical();\n                    if (EditorGUI.EndChangeCheck())\n                    {\n                        //\n                    }\n      \n                    // Define the end of the selection region of the element.\n                    Rect elementEndRegion = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true));\n\n                    // Check for Item selection\n                    Rect selectionArea = new Rect(elementStartRegion.x, elementStartRegion.y, elementEndRegion.width, elementEndRegion.y - elementStartRegion.y);\n                    if (DoSelectionCheck(selectionArea))\n                    {\n                        if (m_SelectedElement == i)\n                        {\n                            m_SelectedElement = -1;\n                        }\n                        else\n                        {\n                            m_SelectedElement = i;\n                            GUIUtility.keyboardControl = 0;\n                        }\n                    }\n                    \n                    // Handle Selection Highlighting\n                    if (m_SelectedElement == i)\n                    {\n                        TMP_EditorUtility.DrawBox(selectionArea, 2f, new Color32(40, 192, 255, 255));\n                    }\n                }\n            }\n\n            int shiftMultiplier = currentEvent.shift ? 10 : 1; // Page + Shift goes 10 page forward\n\n            GUILayout.Space(-3f);\n\n            Rect pagePos = EditorGUILayout.GetControlRect(false, 20);\n            pagePos.width /= 6;\n\n            // Return if we can't display any items.\n            if (itemsPerPage == 0) return;\n\n\n            // Add new style.\n            pagePos.x += pagePos.width * 4;\n            if (GUI.Button(pagePos, \"+\"))\n            {\n                m_StyleListProp.arraySize += 1;\n                serializedObject.ApplyModifiedProperties();\n                TMP_StyleSheet.RefreshStyles();\n            }\n\n\n            // Delete selected style.\n            pagePos.x += pagePos.width;\n            if (m_SelectedElement == -1) GUI.enabled = false;\n            if (GUI.Button(pagePos, \"-\"))\n            {\n                if (m_SelectedElement != -1)\n                    m_StyleListProp.DeleteArrayElementAtIndex(m_SelectedElement);\n\n                m_SelectedElement = -1;\n                serializedObject.ApplyModifiedProperties();\n                TMP_StyleSheet.RefreshStyles();\n            }\n\n            GUILayout.Space(5f);\n\n            pagePos = EditorGUILayout.GetControlRect(false, 20);\n            pagePos.width /= 3;\n\n           \n            // Previous Page\n            if (m_Page > 0) GUI.enabled = true;\n            else GUI.enabled = false;\n\n            if (GUI.Button(pagePos, \"Previous\"))\n                m_Page -= 1 * shiftMultiplier;\n\n            // PAGE COUNTER\n            GUI.enabled = true;\n            pagePos.x += pagePos.width;\n            int totalPages = (int)(arraySize / (float)itemsPerPage + 0.999f);\n            GUI.Label(pagePos, \"Page \" + (m_Page + 1) + \" / \" + totalPages, TMP_UIStyleManager.centeredLabel);\n\n            // Next Page\n            pagePos.x += pagePos.width;\n            if (itemsPerPage * (m_Page + 1) < arraySize) GUI.enabled = true;\n            else GUI.enabled = false;\n\n            if (GUI.Button(pagePos, \"Next\"))\n                m_Page += 1 * shiftMultiplier;\n\n            // Clamp page range\n            m_Page = Mathf.Clamp(m_Page, 0, arraySize / itemsPerPage);\n\n\n            if (serializedObject.ApplyModifiedProperties())\n                TMPro_EventManager.ON_TEXT_STYLE_PROPERTY_CHANGED(true);\n\n            // Clear selection if mouse event was not consumed. \n            GUI.enabled = true;\n            if (currentEvent.type == EventType.MouseDown && currentEvent.button == 0)\n                m_SelectedElement = -1;\n            \n\n        }\n\n\n        // Check if any of the Style elements were clicked on.\n        static bool DoSelectionCheck(Rect selectionArea)\n        {\n            Event currentEvent = Event.current;\n\n            switch (currentEvent.type)\n            {\n                case EventType.MouseDown:\n                    if (selectionArea.Contains(currentEvent.mousePosition) && currentEvent.button == 0)\n                    {\n                        currentEvent.Use();\n                        return true;\n                    }\n                    break;\n            }\n\n            return false;\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_StyleSheetEditor.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 34e2c9b9d9e44953933afe37461f44e6\ntimeCreated: 1432683777\nlicenseType: Store\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SubMeshUI_Editor.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.Collections;\n\nnamespace TMPro.EditorUtilities\n{\n    [CustomEditor(typeof(TMP_SubMeshUI)), CanEditMultipleObjects]\n    public class TMP_SubMeshUI_Editor : Editor\n    {\n        private struct m_foldout\n        { // Track Inspector foldout panel states, globally.\n            //public static bool textInput = true;\n            public static bool fontSettings = true;\n            //public static bool extraSettings = false;\n            //public static bool shadowSetting = false;\n            //public static bool materialEditor = true;\n        }\n\n        private SerializedProperty fontAsset_prop;\n        private SerializedProperty spriteAsset_prop;\n\n        private TMP_SubMeshUI m_SubMeshComponent;\n\n        private CanvasRenderer m_canvasRenderer;\n        private Editor m_materialEditor;\n        private Material m_targetMaterial;\n\n\n        public void OnEnable()\n        {\n            fontAsset_prop = serializedObject.FindProperty(\"m_fontAsset\");\n            spriteAsset_prop = serializedObject.FindProperty(\"m_spriteAsset\");\n\n            m_SubMeshComponent = target as TMP_SubMeshUI;\n            //m_rectTransform = m_SubMeshComponent.rectTransform;\n            m_canvasRenderer = m_SubMeshComponent.canvasRenderer;\n\n\n            // Create new Material Editor if one does not exists\n            if (m_canvasRenderer != null && m_canvasRenderer.GetMaterial() != null)\n            {\n                m_materialEditor = Editor.CreateEditor(m_canvasRenderer.GetMaterial());\n                m_targetMaterial = m_canvasRenderer.GetMaterial();\n            }\n        }\n\n\n        public void OnDisable()\n        {\n            // Destroy material editor if one exists\n            if (m_materialEditor != null)\n            {\n                //Debug.Log(\"Destroying Inline Material Editor.\");\n                DestroyImmediate(m_materialEditor);\n            }\n        }\n\n\n\n        public override void OnInspectorGUI()\n        {\n            GUI.enabled = false;\n            EditorGUILayout.PropertyField(fontAsset_prop);\n            EditorGUILayout.PropertyField(spriteAsset_prop);\n            GUI.enabled = true;\n\n            EditorGUILayout.Space();\n\n            // If a Custom Material Editor exists, we use it.\n            if (m_canvasRenderer != null && m_canvasRenderer.GetMaterial() != null)\n            {\n                Material mat = m_canvasRenderer.GetMaterial();\n\n                //Debug.Log(mat + \"  \" + m_targetMaterial);\n\n                if (mat != m_targetMaterial)\n                {\n                    // Destroy previous Material Instance\n                    //Debug.Log(\"New Material has been assigned.\");\n                    m_targetMaterial = mat;\n                    DestroyImmediate(m_materialEditor);\n                }\n\n\n                if (m_materialEditor == null)\n                {\n                    m_materialEditor = Editor.CreateEditor(mat);\n                }\n\n                m_materialEditor.DrawHeader();\n\n\n                m_materialEditor.OnInspectorGUI();\n            }\n        }\n\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SubMeshUI_Editor.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 6b01141ed8f74d198965c86f25eb7040\ntimeCreated: 1452757501\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SubMesh_Editor.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.Collections;\n\nnamespace TMPro.EditorUtilities\n{\n    [CustomEditor(typeof(TMP_SubMesh)), CanEditMultipleObjects]\n    public class TMP_SubMesh_Editor : Editor\n    {\n        private struct m_foldout\n        { // Track Inspector foldout panel states, globally.\n            //public static bool textInput = true;\n            public static bool fontSettings = true;\n            //public static bool extraSettings = false;\n            //public static bool shadowSetting = false;\n            //public static bool materialEditor = true;\n        }\n        \n        private SerializedProperty fontAsset_prop;\n        private SerializedProperty spriteAsset_prop;\n\n        private TMP_SubMesh m_SubMeshComponent;\n        private Renderer m_Renderer;\n\n        public void OnEnable()\n        {\n            fontAsset_prop = serializedObject.FindProperty(\"m_fontAsset\");\n            spriteAsset_prop = serializedObject.FindProperty(\"m_spriteAsset\");\n\n            m_SubMeshComponent = target as TMP_SubMesh;\n\n            m_Renderer = m_SubMeshComponent.renderer;\n        }\n\n\n        public override void OnInspectorGUI()\n        {\n            EditorGUI.indentLevel = 0;\n            \n            GUI.enabled = false;\n            EditorGUILayout.PropertyField(fontAsset_prop);\n            EditorGUILayout.PropertyField(spriteAsset_prop);\n            GUI.enabled = true;\n            \n            EditorGUI.BeginChangeCheck();\n\n            // SORTING LAYERS\n            var sortingLayerNames = SortingLayerHelper.sortingLayerNames;\n\n            // Look up the layer name using the current layer ID\n            string oldName = SortingLayerHelper.GetSortingLayerNameFromID(m_Renderer.sortingLayerID);\n\n            // Use the name to look up our array index into the names list\n            int oldLayerIndex = System.Array.IndexOf(sortingLayerNames, oldName);\n\n            // Show the pop-up for the names\n            int newLayerIndex = EditorGUILayout.Popup(\"Sorting Layer\", oldLayerIndex, sortingLayerNames);\n\n            // If the index changes, look up the ID for the new index to store as the new ID\n            if (newLayerIndex != oldLayerIndex)\n            {\n                //Undo.RecordObject(renderer, \"Edit Sorting Layer\");\n                m_Renderer.sortingLayerID = SortingLayerHelper.GetSortingLayerIDForIndex(newLayerIndex);\n                //EditorUtility.SetDirty(renderer);\n            }\n\n            // Expose the manual sorting order\n            int newSortingLayerOrder = EditorGUILayout.IntField(\"Order in Layer\", m_Renderer.sortingOrder);\n            if (newSortingLayerOrder != m_Renderer.sortingOrder)\n            {\n                //Undo.RecordObject(renderer, \"Edit Sorting Order\");\n                m_Renderer.sortingOrder = newSortingLayerOrder;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_SubMesh_Editor.cs.meta",
    "content": "fileFormatVersion: 2\nguid: dd2fe74169b54bf58fca17288513ef38\ntimeCreated: 1456189048\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_TextAlignmentDrawer.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\n\nnamespace TMPro.EditorUtilities\n{\n\n    [CustomPropertyDrawer(typeof(TextAlignmentOptions))]\n    public class TMP_TextAlignmentDrawer : PropertyDrawer\n    {\n        const int k_AlignmentButtonWidth = 24;\n        const int k_AlignmentButtonHeight = 20;\n        const int k_WideViewWidth = 504;\n        const int k_ControlsSpacing = 6;\n        const int k_GroupWidth = k_AlignmentButtonWidth * 6;\n        static readonly int k_TextAlignmentHash = \"DoTextAligmentControl\".GetHashCode();\n\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\n        {\n            return EditorGUIUtility.currentViewWidth > k_WideViewWidth ? k_AlignmentButtonHeight : k_AlignmentButtonHeight * 2 + 3;\n        }\n\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\n        {\n            var id = GUIUtility.GetControlID(k_TextAlignmentHash, FocusType.Keyboard, position);\n            \n            EditorGUI.BeginProperty(position, label, property);\n            {\n                var controlArea = EditorGUI.PrefixLabel(position, id, label);\n                \n                var horizontalAligment = new Rect(controlArea.x, controlArea.y, k_GroupWidth, k_AlignmentButtonHeight);\n                var verticalAligment = new Rect(!(EditorGUIUtility.currentViewWidth > k_WideViewWidth) ? controlArea.x : horizontalAligment.xMax + k_ControlsSpacing, !(EditorGUIUtility.currentViewWidth > k_WideViewWidth) ? controlArea.y + k_AlignmentButtonHeight + 3 : controlArea.y, k_GroupWidth, k_AlignmentButtonHeight);\n\n                EditorGUI.BeginChangeCheck();\n\n                var selectedHorizontal = DoHorizontalAligmentControl(horizontalAligment, property);\n                var selectedVertical = DoVerticalAligmentControl(verticalAligment, property);\n\n                if (EditorGUI.EndChangeCheck())\n                {\n                    var value = (0x1 << selectedHorizontal) | (0x100 << selectedVertical);\n                    property.intValue = value;\n                }\n            }\n            EditorGUI.EndProperty();\n        }\n\n        static int DoHorizontalAligmentControl(Rect position, SerializedProperty alignment)\n        {\n            var selected = TMP_EditorUtility.GetHorizontalAlignmentGridValue(alignment.intValue);\n\n            var values = new bool[6];\n\n            values[selected] = true;\n\n            if (alignment.hasMultipleDifferentValues)\n            {\n                foreach (var obj in alignment.serializedObject.targetObjects)\n                {\n                    var text = obj as TMP_Text;\n                    if (text != null)\n                    {\n                        values[TMP_EditorUtility.GetHorizontalAlignmentGridValue((int)text.alignment)] = true;\n                    }\n                }\n            }\n\n            position.width = k_AlignmentButtonWidth;\n\n            for (var i = 0; i < values.Length; i++)\n            {\n                var oldValue = values[i];\n                var newValue = TMP_EditorUtility.EditorToggle(position, oldValue, TMP_UIStyleManager.alignContentA[i], i == 0 ? TMP_UIStyleManager.alignmentButtonLeft : (i == 5 ? TMP_UIStyleManager.alignmentButtonRight : TMP_UIStyleManager.alignmentButtonMid));\n                if (newValue != oldValue)\n                {\n                    selected = i;\n                }\n                position.x += position.width;\n            }\n\n            return selected;\n        }\n\n        static int DoVerticalAligmentControl(Rect position, SerializedProperty alignment)\n        {\n            var selected = TMP_EditorUtility.GetVerticalAlignmentGridValue(alignment.intValue);\n\n            var values = new bool[6];\n\n            values[selected] = true;\n\n            if (alignment.hasMultipleDifferentValues)\n            {\n                foreach (var obj in alignment.serializedObject.targetObjects)\n                {\n                    var text = obj as TMP_Text;\n                    if (text != null)\n                    {\n                        values[TMP_EditorUtility.GetVerticalAlignmentGridValue((int)text.alignment)] = true;\n                    }\n                }\n            }\n\n            position.width = k_AlignmentButtonWidth;\n\n            for (var i = 0; i < values.Length; i++)\n            {\n                var oldValue = values[i];\n                var newValue = TMP_EditorUtility.EditorToggle(position, oldValue, TMP_UIStyleManager.alignContentB[i], i == 0 ? TMP_UIStyleManager.alignmentButtonLeft : (i == 5 ? TMP_UIStyleManager.alignmentButtonRight : TMP_UIStyleManager.alignmentButtonMid));\n                if (newValue != oldValue)\n                {\n                    selected = i;\n                }\n                position.x += position.width;\n            }\n\n            return selected;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_TextAlignmentDrawer.cs.meta",
    "content": "fileFormatVersion: 2\nguid: c55a64c7570474f47a94abe39ebfef04\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_UIStyleManager.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.Collections;\n\n\nnamespace TMPro.EditorUtilities\n{\n\n    public static class TMP_UIStyleManager\n    {\n        public static GUIStyle label;\n        public static GUIStyle textAreaBoxWindow;\n        public static GUIStyle boldFoldout;\n        public static GUIStyle panelTitle;\n        public static GUIStyle sectionHeader;\n        public static GUIStyle centeredLabel;\n        public static GUIStyle rightLabel;\n        public static GUIStyle wrappingTextArea;\n\n        public static GUIStyle alignmentButtonLeft;\n        public static GUIStyle alignmentButtonMid;\n        public static GUIStyle alignmentButtonRight;\n\n        // Alignment Button Textures\n        public static Texture2D alignLeft;\n        public static Texture2D alignCenter;\n        public static Texture2D alignRight;\n        public static Texture2D alignJustified;\n        public static Texture2D alignFlush;\n        public static Texture2D alignGeoCenter;\n        public static Texture2D alignTop;\n        public static Texture2D alignMiddle;\n        public static Texture2D alignBottom;\n        public static Texture2D alignBaseline;\n        public static Texture2D alignMidline;\n        public static Texture2D alignCapline;\n        public static Texture2D sectionHeaderTexture;\n        \n        public static GUIContent[] alignContentA;\n        public static GUIContent[] alignContentB;\n\n        static TMP_UIStyleManager()\n        {\n            // Find to location of the TextMesh Pro Asset Folder (as users may have moved it)\n            var tmproAssetFolderPath = TMP_EditorUtility.packageRelativePath;\n\n            if (EditorGUIUtility.isProSkin)\n            {\n                alignLeft = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + \"/Editor Resources/Textures/btn_AlignLeft.psd\", typeof(Texture2D)) as Texture2D;\n                alignCenter = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + \"/Editor Resources/Textures/btn_AlignCenter.psd\", typeof(Texture2D)) as Texture2D;\n                alignRight = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + \"/Editor Resources/Textures/btn_AlignRight.psd\", typeof(Texture2D)) as Texture2D;\n                alignJustified = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + \"/Editor Resources/Textures/btn_AlignJustified.psd\", typeof(Texture2D)) as Texture2D;\n                alignFlush = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + \"/Editor Resources/Textures/btn_AlignFlush.psd\", typeof(Texture2D)) as Texture2D;\n                alignGeoCenter = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + \"/Editor Resources/Textures/btn_AlignCenterGeo.psd\", typeof(Texture2D)) as Texture2D;\n                alignTop = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + \"/Editor Resources/Textures/btn_AlignTop.psd\", typeof(Texture2D)) as Texture2D;\n                alignMiddle = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + \"/Editor Resources/Textures/btn_AlignMiddle.psd\", typeof(Texture2D)) as Texture2D;\n                alignBottom = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + \"/Editor Resources/Textures/btn_AlignBottom.psd\", typeof(Texture2D)) as Texture2D;\n                alignBaseline = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + \"/Editor Resources/Textures/btn_AlignBaseLine.psd\", typeof(Texture2D)) as Texture2D;\n                alignMidline = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + \"/Editor Resources/Textures/btn_AlignMidLine.psd\", typeof(Texture2D)) as Texture2D;\n                alignCapline = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + \"/Editor Resources/Textures/btn_AlignCapLine.psd\", typeof(Texture2D)) as Texture2D;\n                sectionHeaderTexture = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + \"/Editor Resources/Textures/SectionHeader_Dark.psd\", typeof(Texture2D)) as Texture2D;\n            }\n            else\n            {\n                alignLeft = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + \"/Editor Resources/Textures/btn_AlignLeft_Light.psd\", typeof(Texture2D)) as Texture2D;\n                alignCenter = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + \"/Editor Resources/Textures/btn_AlignCenter_Light.psd\", typeof(Texture2D)) as Texture2D;\n                alignRight = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + \"/Editor Resources/Textures/btn_AlignRight_Light.psd\", typeof(Texture2D)) as Texture2D;\n                alignJustified = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + \"/Editor Resources/Textures/btn_AlignJustified_Light.psd\", typeof(Texture2D)) as Texture2D;\n                alignFlush = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + \"/Editor Resources/Textures/btn_AlignFlush_Light.psd\", typeof(Texture2D)) as Texture2D;\n                alignGeoCenter = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + \"/Editor Resources/Textures/btn_AlignCenterGeo_Light.psd\", typeof(Texture2D)) as Texture2D;\n                alignTop = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + \"/Editor Resources/Textures/btn_AlignTop_Light.psd\", typeof(Texture2D)) as Texture2D;\n                alignMiddle = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + \"/Editor Resources/Textures/btn_AlignMiddle_Light.psd\", typeof(Texture2D)) as Texture2D;\n                alignBottom = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + \"/Editor Resources/Textures/btn_AlignBottom_Light.psd\", typeof(Texture2D)) as Texture2D;\n                alignBaseline = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + \"/Editor Resources/Textures/btn_AlignBaseLine_Light.psd\", typeof(Texture2D)) as Texture2D;\n                alignMidline = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + \"/Editor Resources/Textures/btn_AlignMidLine_Light.psd\", typeof(Texture2D)) as Texture2D;\n                alignCapline = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + \"/Editor Resources/Textures/btn_AlignCapLine_Light.psd\", typeof(Texture2D)) as Texture2D;\n                sectionHeaderTexture = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + \"/Editor Resources/Textures/SectionHeader_Light.psd\", typeof(Texture2D)) as Texture2D;\n            }\n\n            label = new GUIStyle(EditorStyles.label) { richText = true, wordWrap = true, stretchWidth = true };\n            textAreaBoxWindow = new GUIStyle(EditorStyles.textArea) { richText = true };\n            boldFoldout = new GUIStyle(EditorStyles.foldout) { fontStyle = FontStyle.Bold };\n            panelTitle = new GUIStyle(EditorStyles.label) { fontStyle = FontStyle.Bold };\n\n            sectionHeader = new GUIStyle(EditorStyles.label) { fixedHeight = 22, richText = true, border = new RectOffset(9, 9, 0, 0), overflow = new RectOffset(9, 0, 0, 0), padding = new RectOffset(0, 0, 4, 0) };\n            sectionHeader.normal.background = sectionHeaderTexture;\n\n            centeredLabel = new GUIStyle(EditorStyles.label) { alignment = TextAnchor.MiddleCenter};\n            rightLabel = new GUIStyle(EditorStyles.label) { alignment = TextAnchor.MiddleRight, richText = true };\n\n\n            alignmentButtonLeft = new GUIStyle(EditorStyles.miniButtonLeft);\n            alignmentButtonLeft.padding.left = 4;\n            alignmentButtonLeft.padding.right = 4;\n            alignmentButtonLeft.padding.top = 2;\n            alignmentButtonLeft.padding.bottom = 2;\n\n            alignmentButtonMid = new GUIStyle(EditorStyles.miniButtonMid);\n            alignmentButtonMid.padding.left = 4;\n            alignmentButtonMid.padding.right = 4;\n            alignmentButtonLeft.padding.top = 2;\n            alignmentButtonLeft.padding.bottom = 2;\n\n            alignmentButtonRight = new GUIStyle(EditorStyles.miniButtonRight);\n            alignmentButtonRight.padding.left = 4;\n            alignmentButtonRight.padding.right = 4;\n            alignmentButtonLeft.padding.top = 2;\n            alignmentButtonLeft.padding.bottom = 2;\n\n            wrappingTextArea = new GUIStyle(EditorStyles.textArea);\n            wrappingTextArea.wordWrap = true;\n\n            alignContentA = new []\n            { \n                new GUIContent(alignLeft, \"Left\"), \n                new GUIContent(alignCenter, \"Center\"), \n                new GUIContent(alignRight, \"Right\"), \n                new GUIContent(alignJustified, \"Justified\"),\n                new GUIContent(alignFlush, \"Flush\"),\n                new GUIContent(alignGeoCenter, \"Geometry Center\")\n            };\n\n            alignContentB = new []\n            { \n                new GUIContent(alignTop, \"Top\"), \n                new GUIContent(alignMiddle, \"Middle\"), \n                new GUIContent(alignBottom, \"Bottom\"),\n                new GUIContent(alignBaseline, \"Baseline\"),\n                new GUIContent(alignMidline, \"Midline\"),\n                new GUIContent(alignCapline, \"Capline\")\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_UIStyleManager.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 30a939dce2fd4073955f2f20e659d506\ntimeCreated: 1426454127\nlicenseType: Store\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_UiEditorPanel.cs",
    "content": "using UnityEngine;\nusing UnityEngine.UI;\nusing UnityEditor;\n\nnamespace TMPro.EditorUtilities\n{\n\n    [CustomEditor(typeof(TextMeshProUGUI), true), CanEditMultipleObjects]\n    public class TMP_UiEditorPanel : TMP_BaseEditorPanel\n    {\n        static readonly GUIContent k_RaycastTargetLabel = new GUIContent(\"Raycast Target\", \"Whether the text blocks raycasts from the Graphic Raycaster.\");\n\n        SerializedProperty m_RaycastTargetProp;\n\n        protected override void OnEnable()\n        {\n            base.OnEnable();\n            m_RaycastTargetProp = serializedObject.FindProperty(\"m_RaycastTarget\");\n        }\n\n        protected override void DrawExtraSettings()\n        {\n            Foldout.extraSettings = EditorGUILayout.Foldout(Foldout.extraSettings, k_ExtraSettingsLabel, true, TMP_UIStyleManager.boldFoldout);\n            if (Foldout.extraSettings)\n            {\n                EditorGUI.indentLevel += 1;\n\n                DrawMargins();\n\n                DrawGeometrySorting();\n\n                DrawRichText();\n\n                DrawRaycastTarget();\n\n                DrawParsing();\n                \n                DrawKerning();\n\n                DrawPadding();\n\n                EditorGUI.indentLevel -= 1;\n            }\n        }\n\n        protected void DrawRaycastTarget()\n        {\n            EditorGUI.BeginChangeCheck();\n            EditorGUILayout.PropertyField(m_RaycastTargetProp, k_RaycastTargetLabel);\n            if (EditorGUI.EndChangeCheck())\n            {\n                // Change needs to propagate to the child sub objects.\n                Graphic[] graphicComponents = m_TextComponent.GetComponentsInChildren<Graphic>();\n                for (int i = 1; i < graphicComponents.Length; i++)\n                    graphicComponents[i].raycastTarget = m_RaycastTargetProp.boolValue;\n\n                m_HavePropertiesChanged = true;\n            }\n        }\n\n        // Method to handle multi object selection\n        protected override bool IsMixSelectionTypes()\n        {\n            GameObject[] objects = Selection.gameObjects;\n            if (objects.Length > 1)\n            {\n                for (int i = 0; i < objects.Length; i++)\n                {\n\t\t\t\t\tif (objects[i].GetComponent<TextMeshProUGUI>() == null)\n                        return true;\n                }\n            }\n            return false;\n        }\n        protected override void OnUndoRedo()\n        {\n            int undoEventId = Undo.GetCurrentGroup();\n            int lastUndoEventId = s_EventId;\n\n            if (undoEventId != lastUndoEventId)\n            {\n                for (int i = 0; i < targets.Length; i++)\n                {\n                    //Debug.Log(\"Undo & Redo Performed detected in Editor Panel. Event ID:\" + Undo.GetCurrentGroup());\n                    TMPro_EventManager.ON_TEXTMESHPRO_UGUI_PROPERTY_CHANGED(true, targets[i] as TextMeshProUGUI);\n                    s_EventId = undoEventId;\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMP_UiEditorPanel.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 21c0044a7f964773be90d197a78e4703\ntimeCreated: 1443571501\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_ContextMenus.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.IO;\nusing System.Collections;\n\n\nnamespace TMPro.EditorUtilities\n{\n\n    public class TMP_ContextMenus : Editor\n    {\n\n        private static Texture m_copiedTexture;\n\n        private static Material m_copiedProperties;\n        private static Material m_copiedAtlasProperties;\n\n\n        // Add a Context Menu to the Texture Editor Panel to allow Copy / Paste of Texture.\n        [MenuItem(\"CONTEXT/Texture/Copy\", false, 2000)]\n        static void CopyTexture(MenuCommand command)\n        {\n            m_copiedTexture = command.context as Texture;\n        }\n\n\n        // Select the currently assigned material or material preset.\n        [MenuItem(\"CONTEXT/Material/Select Material\", false, 500)]\n        static void SelectMaterial(MenuCommand command)\n        {\n            Material mat = command.context as Material;\n\n            // Select current material\n            EditorUtility.FocusProjectWindow();\n            EditorGUIUtility.PingObject(mat);\n        }\n\n\n        // Add a Context Menu to allow easy duplication of the Material.\n        [MenuItem(\"CONTEXT/Material/Create Material Preset\", false)]\n        static void DuplicateMaterial(MenuCommand command)\n        {\n            // Get the type of text object\n            // If material is not a base material, we get material leaks...\n\n            Material source_Mat = (Material)command.context;\n            if (!EditorUtility.IsPersistent(source_Mat))\n            {\n                Debug.LogWarning(\"Material is an instance and cannot be converted into a permanent asset.\");\n                return;\n            }\n\n\n            string assetPath = AssetDatabase.GetAssetPath(source_Mat).Split('.')[0];\n\n            Material duplicate = new Material(source_Mat);\n\n            // Need to manually copy the shader keywords\n            duplicate.shaderKeywords = source_Mat.shaderKeywords;\n\n            AssetDatabase.CreateAsset(duplicate, AssetDatabase.GenerateUniqueAssetPath(assetPath + \".mat\"));\n\n            // Assign duplicate Material to selected object (if one is)\n            if (Selection.activeGameObject != null)\n            {\n                TMP_Text textObject = Selection.activeGameObject.GetComponent<TMP_Text>();\n                if (textObject != null)\n                {\n                    textObject.fontSharedMaterial = duplicate;\n                }\n                else\n                {\n                    TMP_SubMesh subMeshObject = Selection.activeGameObject.GetComponent<TMP_SubMesh>();\n\n                    if (subMeshObject != null)\n                        subMeshObject.sharedMaterial = duplicate;\n                    else\n                    {\n                        TMP_SubMeshUI subMeshUIObject = Selection.activeGameObject.GetComponent<TMP_SubMeshUI>();\n\n                        if (subMeshUIObject != null)\n                            subMeshUIObject.sharedMaterial = duplicate;\n                    }\n                }\n            }\n\n            // Ping newly created Material Preset.\n            EditorUtility.FocusProjectWindow();\n            EditorGUIUtility.PingObject(duplicate);\n        }\n\n\n        //[MenuItem(\"CONTEXT/MaterialComponent/Copy Material Properties\", false)]\n        [MenuItem(\"CONTEXT/Material/Copy Material Properties\", false)]\n        static void CopyMaterialProperties(MenuCommand command)\n        {\n            Material mat = null;\n            if (command.context.GetType() == typeof(Material))\n                mat = (Material)command.context;\n            else\n            {\n                mat = Selection.activeGameObject.GetComponent<CanvasRenderer>().GetMaterial();\n            }\n\n            m_copiedProperties = new Material(mat);\n\n            m_copiedProperties.shaderKeywords = mat.shaderKeywords;\n\n            m_copiedProperties.hideFlags = HideFlags.DontSave;\n        }\n\n\n        // PASTE MATERIAL\n        //[MenuItem(\"CONTEXT/MaterialComponent/Paste Material Properties\", false)]\n        [MenuItem(\"CONTEXT/Material/Paste Material Properties\", false)]\n        static void PasteMaterialProperties(MenuCommand command)\n        {\n\n            if (m_copiedProperties == null)\n            {\n                Debug.LogWarning(\"No Material Properties to Paste. Use Copy Material Properties first.\");\n                return;\n            }\n\n            Material mat = null;\n            if (command.context.GetType() == typeof(Material))\n                mat = (Material)command.context;\n            else\n            {\n                mat = Selection.activeGameObject.GetComponent<CanvasRenderer>().GetMaterial();\n            }\n\n            Undo.RecordObject(mat, \"Paste Material\");\n\n            ShaderUtilities.GetShaderPropertyIDs(); // Make sure we have valid Property IDs\n            if (mat.HasProperty(ShaderUtilities.ID_GradientScale))\n            {\n                // Preserve unique SDF properties from destination material.\n                m_copiedProperties.SetTexture(ShaderUtilities.ID_MainTex, mat.GetTexture(ShaderUtilities.ID_MainTex));\n                m_copiedProperties.SetFloat(ShaderUtilities.ID_GradientScale, mat.GetFloat(ShaderUtilities.ID_GradientScale));\n                m_copiedProperties.SetFloat(ShaderUtilities.ID_TextureWidth, mat.GetFloat(ShaderUtilities.ID_TextureWidth));\n                m_copiedProperties.SetFloat(ShaderUtilities.ID_TextureHeight, mat.GetFloat(ShaderUtilities.ID_TextureHeight));\n            }\n\n            EditorShaderUtilities.CopyMaterialProperties(m_copiedProperties, mat);\n\n            // Copy ShaderKeywords from one material to the other.\n            mat.shaderKeywords = m_copiedProperties.shaderKeywords;\n\n            // Let TextMeshPro Objects that this mat has changed.\n            TMPro_EventManager.ON_MATERIAL_PROPERTY_CHANGED(true, mat);\n        }\n\n\n        // Enable Resetting of Material properties without losing unique properties of the font atlas.\n        [MenuItem(\"CONTEXT/Material/Reset\", false, 2100)]\n        static void ResetSettings(MenuCommand command)\n        {\n\n            Material mat = null;\n            if (command.context.GetType() == typeof(Material))\n                mat = (Material)command.context;\n            else\n            {\n                mat = Selection.activeGameObject.GetComponent<CanvasRenderer>().GetMaterial();\n            }\n\n            Undo.RecordObject(mat, \"Reset Material\");\n\n            ShaderUtilities.GetShaderPropertyIDs(); // Make sure we have valid Property IDs\n            if (mat.HasProperty(ShaderUtilities.ID_GradientScale))\n            {\n                // Copy unique properties of the SDF Material\n                var texture = mat.GetTexture(ShaderUtilities.ID_MainTex);\n                var gradientScale = mat.GetFloat(ShaderUtilities.ID_GradientScale);\n                var texWidth = mat.GetFloat(ShaderUtilities.ID_TextureWidth);\n                var texHeight = mat.GetFloat(ShaderUtilities.ID_TextureHeight);\n\n                var stencilId = 0.0f;\n                var stencilComp = 0.0f;\n\n                if (mat.HasProperty(ShaderUtilities.ID_StencilID))\n                {\n                    stencilId = mat.GetFloat(ShaderUtilities.ID_StencilID);\n                    stencilComp = mat.GetFloat(ShaderUtilities.ID_StencilComp);\n                }\n\n                var normalWeight = mat.GetFloat(ShaderUtilities.ID_WeightNormal);\n                var boldWeight = mat.GetFloat(ShaderUtilities.ID_WeightBold);\n\n                // Reset the material\n                Unsupported.SmartReset(mat);\n\n                // Reset ShaderKeywords\n                mat.shaderKeywords = new string[0]; // { \"BEVEL_OFF\", \"GLOW_OFF\", \"UNDERLAY_OFF\" };\n\n                // Copy unique material properties back to the material.\n                mat.SetTexture(ShaderUtilities.ID_MainTex, texture);\n                mat.SetFloat(ShaderUtilities.ID_GradientScale, gradientScale);\n                mat.SetFloat(ShaderUtilities.ID_TextureWidth, texWidth);\n                mat.SetFloat(ShaderUtilities.ID_TextureHeight, texHeight);\n\n                if (mat.HasProperty(ShaderUtilities.ID_StencilID))\n                {\n                    mat.SetFloat(ShaderUtilities.ID_StencilID, stencilId);\n                    mat.SetFloat(ShaderUtilities.ID_StencilComp, stencilComp);\n                }\n\n                mat.SetFloat(ShaderUtilities.ID_WeightNormal, normalWeight);\n                mat.SetFloat(ShaderUtilities.ID_WeightBold, boldWeight);\n            }\n            else\n            {\n                Unsupported.SmartReset(mat);\n            }\n\n            TMPro_EventManager.ON_MATERIAL_PROPERTY_CHANGED(true, mat);\n        }\n\n\n\n        //This function is used for debugging and fixing potentially broken font atlas links.\n        [MenuItem(\"CONTEXT/Material/Copy Atlas\", false, 2000)]\n        static void CopyAtlas(MenuCommand command)\n        {\n            Material mat = command.context as Material;\n\n            m_copiedAtlasProperties = new Material(mat);\n            m_copiedAtlasProperties.hideFlags = HideFlags.DontSave;\n        }\n\n\n        // This function is used for debugging and fixing potentially broken font atlas links\n        [MenuItem(\"CONTEXT/Material/Paste Atlas\", false, 2001)]\n        static void PasteAtlas(MenuCommand command)\n        {\n            Material mat = command.context as Material;\n\n            if (m_copiedAtlasProperties != null)\n            {\n                Undo.RecordObject(mat, \"Paste Texture\");\n\n                ShaderUtilities.GetShaderPropertyIDs(); // Make sure we have valid Property IDs\n                mat.SetTexture(ShaderUtilities.ID_MainTex, m_copiedAtlasProperties.GetTexture(ShaderUtilities.ID_MainTex));\n                mat.SetFloat(ShaderUtilities.ID_GradientScale, m_copiedAtlasProperties.GetFloat(ShaderUtilities.ID_GradientScale));\n                mat.SetFloat(ShaderUtilities.ID_TextureWidth, m_copiedAtlasProperties.GetFloat(ShaderUtilities.ID_TextureWidth));\n                mat.SetFloat(ShaderUtilities.ID_TextureHeight, m_copiedAtlasProperties.GetFloat(ShaderUtilities.ID_TextureHeight));\n            }\n            else if (m_copiedTexture != null)\n            {\n                Undo.RecordObject(mat, \"Paste Texture\");\n\n                mat.SetTexture(ShaderUtilities.ID_MainTex, m_copiedTexture);\n            }\n\n            //DestroyImmediate(m_copiedAtlasProperties);\n        }\n\n\n        // Context Menus for TMPro Font Assets\n        //This function is used for debugging and fixing potentially broken font atlas links.\n        [MenuItem(\"CONTEXT/TMP_FontAsset/Extract Atlas\", false, 2100)]\n        static void ExtractAtlas(MenuCommand command)\n        {\n            TMP_FontAsset font = command.context as TMP_FontAsset;\n\n            string fontPath = AssetDatabase.GetAssetPath(font);\n            string texPath = Path.GetDirectoryName(fontPath) + \"/\" + Path.GetFileNameWithoutExtension(fontPath) + \" Atlas.png\";\n\n            // Create a Serialized Object of the texture to allow us to make it readable.\n            SerializedObject texprop = new SerializedObject(font.material.GetTexture(ShaderUtilities.ID_MainTex));\n            texprop.FindProperty(\"m_IsReadable\").boolValue = true;\n            texprop.ApplyModifiedProperties();\n\n            // Create a copy of the texture.\n            Texture2D tex = Instantiate(font.material.GetTexture(ShaderUtilities.ID_MainTex)) as Texture2D;\n\n            // Set the texture to not readable again.\n            texprop.FindProperty(\"m_IsReadable\").boolValue = false;\n            texprop.ApplyModifiedProperties();\n\n            Debug.Log(texPath);\n            // Saving File for Debug\n            var pngData = tex.EncodeToPNG();\n            File.WriteAllBytes(texPath, pngData);\n\n            AssetDatabase.Refresh();\n            DestroyImmediate(tex);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"command\"></param>\n        [MenuItem(\"CONTEXT/TMP_FontAsset/Update Atlas Texture...\", false, 2000)]\n        static void RegenerateFontAsset(MenuCommand command)\n        {\n            TMP_FontAsset fontAsset = command.context as TMP_FontAsset;\n\n            if (fontAsset != null)\n            {\n                TMPro_FontAssetCreatorWindow.ShowFontAtlasCreatorWindow(fontAsset);\n            }\n        }\n\n\n        /// <summary>\n        /// Clear Font Asset Data\n        /// </summary>\n        /// <param name=\"command\"></param>\n        [MenuItem(\"CONTEXT/TMP_FontAsset/Reset\", false, 100)]\n        static void ClearFontAssetData(MenuCommand command)\n        {\n            TMP_FontAsset fontAsset = command.context as TMP_FontAsset;\n\n            if (fontAsset != null && Selection.activeObject != fontAsset)\n            {\n                Selection.activeObject = fontAsset;\n            }\n\n            fontAsset.ClearFontAssetData(true);\n\n            TMPro_EventManager.ON_FONT_PROPERTY_CHANGED(true, fontAsset);\n        }\n\n\n        [MenuItem(\"CONTEXT/TrueTypeFontImporter/Create TMP Font Asset...\", false, 200)]\n        static void CreateFontAsset(MenuCommand command)\n        {\n            TrueTypeFontImporter importer = command.context as TrueTypeFontImporter;\n\n            if (importer != null)\n            {\n                Font sourceFontFile = AssetDatabase.LoadAssetAtPath<Font>(importer.assetPath);\n\n                if (sourceFontFile)\n                    TMPro_FontAssetCreatorWindow.ShowFontAtlasCreatorWindow(sourceFontFile);\n            }\n        }\n    }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_ContextMenus.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 44e1d646473a40178712cb2150f54cec\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_CreateObjectMenu.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing UnityEditor.SceneManagement;\nusing UnityEditor.Experimental.SceneManagement;\nusing UnityEngine.SceneManagement;\nusing UnityEngine.UI;\nusing UnityEngine.EventSystems;\n\n\nnamespace TMPro.EditorUtilities\n{\n    public static class TMPro_CreateObjectMenu\n    {\n\n        /// <summary>\n        /// Create a TextMeshPro object that works with the Mesh Renderer\n        /// </summary>\n        /// <param name=\"command\"></param>\n        [MenuItem(\"GameObject/3D Object/Text - TextMeshPro\", false, 30)]\n        static void CreateTextMeshProObjectPerform(MenuCommand command)\n        {\n            GameObject go = new GameObject(\"Text (TMP)\");\n\n            // Add support for new prefab mode\n            StageUtility.PlaceGameObjectInCurrentStage(go);\n\n            TextMeshPro textMeshPro = go.AddComponent<TextMeshPro>();\n            textMeshPro.text = \"Sample text\";\n            textMeshPro.alignment = TextAlignmentOptions.TopLeft;\n\n            Undo.RegisterCreatedObjectUndo((Object)go, \"Create \" + go.name);\n\n            GameObject contextObject = command.context as GameObject;\n            if (contextObject != null)\n            {\n                GameObjectUtility.SetParentAndAlign(go, contextObject);\n                Undo.SetTransformParent(go.transform, contextObject.transform, \"Parent \" + go.name);\n            }\n\n            Selection.activeGameObject = go;\n        }\n\n\n        /// <summary>\n        /// Create a TextMeshPro object that works with the CanvasRenderer\n        /// </summary>\n        /// <param name=\"command\"></param>\n        [MenuItem(\"GameObject/UI/Text - TextMeshPro\", false, 2001)]\n        static void CreateTextMeshProGuiObjectPerform(MenuCommand menuCommand)\n        {\n            GameObject go = TMP_DefaultControls.CreateText(GetStandardResources());\n\n            // Override text color and font size\n            TMP_Text textComponent = go.GetComponent<TMP_Text>();\n            textComponent.color = Color.white;\n            if (textComponent.m_isWaitingOnResourceLoad == false)\n                textComponent.fontSize = TMP_Settings.defaultFontSize;\n\n            PlaceUIElementRoot(go, menuCommand);\n        }\n\n        [MenuItem(\"GameObject/UI/Button - TextMeshPro\", false, 2031)]\n        static public void AddButton(MenuCommand menuCommand)\n        {\n            GameObject go = TMP_DefaultControls.CreateButton(GetStandardResources());\n\n            // Override font size\n            TMP_Text textComponent = go.GetComponentInChildren<TMP_Text>();\n            textComponent.fontSize = 24;\n\n            PlaceUIElementRoot(go, menuCommand);\n        }\n\n\n\n        [MenuItem(\"GameObject/UI/Input Field - TextMeshPro\", false, 2037)]\n        static void AddTextMeshProInputField(MenuCommand menuCommand)\n        {\n            GameObject go = TMP_DefaultControls.CreateInputField(GetStandardResources());\n            PlaceUIElementRoot(go, menuCommand);\n        }\n\n\n        [MenuItem(\"GameObject/UI/Dropdown - TextMeshPro\", false, 2036)]\n        static public void AddDropdown(MenuCommand menuCommand)\n        {\n            GameObject go = TMP_DefaultControls.CreateDropdown(GetStandardResources());\n            PlaceUIElementRoot(go, menuCommand);\n        }\n\n\n        private const string kUILayerName = \"UI\";\n\n        private const string kStandardSpritePath = \"UI/Skin/UISprite.psd\";\n        private const string kBackgroundSpritePath = \"UI/Skin/Background.psd\";\n        private const string kInputFieldBackgroundPath = \"UI/Skin/InputFieldBackground.psd\";\n        private const string kKnobPath = \"UI/Skin/Knob.psd\";\n        private const string kCheckmarkPath = \"UI/Skin/Checkmark.psd\";\n        private const string kDropdownArrowPath = \"UI/Skin/DropdownArrow.psd\";\n        private const string kMaskPath = \"UI/Skin/UIMask.psd\";\n\n        static private TMP_DefaultControls.Resources s_StandardResources;\n\n\n        static private TMP_DefaultControls.Resources GetStandardResources()\n        {\n            if (s_StandardResources.standard == null)\n            {\n                s_StandardResources.standard = AssetDatabase.GetBuiltinExtraResource<Sprite>(kStandardSpritePath);\n                s_StandardResources.background = AssetDatabase.GetBuiltinExtraResource<Sprite>(kBackgroundSpritePath);\n                s_StandardResources.inputField = AssetDatabase.GetBuiltinExtraResource<Sprite>(kInputFieldBackgroundPath);\n                s_StandardResources.knob = AssetDatabase.GetBuiltinExtraResource<Sprite>(kKnobPath);\n                s_StandardResources.checkmark = AssetDatabase.GetBuiltinExtraResource<Sprite>(kCheckmarkPath);\n                s_StandardResources.dropdown = AssetDatabase.GetBuiltinExtraResource<Sprite>(kDropdownArrowPath);\n                s_StandardResources.mask = AssetDatabase.GetBuiltinExtraResource<Sprite>(kMaskPath);\n            }\n            return s_StandardResources;\n        }\n\n\n        private static void SetPositionVisibleinSceneView(RectTransform canvasRTransform, RectTransform itemTransform)\n        {\n            // Find the best scene view\n            SceneView sceneView = SceneView.lastActiveSceneView;\n            if (sceneView == null && SceneView.sceneViews.Count > 0)\n                sceneView = SceneView.sceneViews[0] as SceneView;\n\n            // Couldn't find a SceneView. Don't set position.\n            if (sceneView == null || sceneView.camera == null)\n                return;\n\n            // Create world space Plane from canvas position.\n            Camera camera = sceneView.camera;\n            Vector3 position = Vector3.zero;\n            if (RectTransformUtility.ScreenPointToLocalPointInRectangle(canvasRTransform, new Vector2(camera.pixelWidth / 2, camera.pixelHeight / 2), camera, out Vector2 localPlanePosition))\n            {\n                // Adjust for canvas pivot\n                localPlanePosition.x = localPlanePosition.x + canvasRTransform.sizeDelta.x * canvasRTransform.pivot.x;\n                localPlanePosition.y = localPlanePosition.y + canvasRTransform.sizeDelta.y * canvasRTransform.pivot.y;\n\n                localPlanePosition.x = Mathf.Clamp(localPlanePosition.x, 0, canvasRTransform.sizeDelta.x);\n                localPlanePosition.y = Mathf.Clamp(localPlanePosition.y, 0, canvasRTransform.sizeDelta.y);\n\n                // Adjust for anchoring\n                position.x = localPlanePosition.x - canvasRTransform.sizeDelta.x * itemTransform.anchorMin.x;\n                position.y = localPlanePosition.y - canvasRTransform.sizeDelta.y * itemTransform.anchorMin.y;\n\n                Vector3 minLocalPosition;\n                minLocalPosition.x = canvasRTransform.sizeDelta.x * (0 - canvasRTransform.pivot.x) + itemTransform.sizeDelta.x * itemTransform.pivot.x;\n                minLocalPosition.y = canvasRTransform.sizeDelta.y * (0 - canvasRTransform.pivot.y) + itemTransform.sizeDelta.y * itemTransform.pivot.y;\n\n                Vector3 maxLocalPosition;\n                maxLocalPosition.x = canvasRTransform.sizeDelta.x * (1 - canvasRTransform.pivot.x) - itemTransform.sizeDelta.x * itemTransform.pivot.x;\n                maxLocalPosition.y = canvasRTransform.sizeDelta.y * (1 - canvasRTransform.pivot.y) - itemTransform.sizeDelta.y * itemTransform.pivot.y;\n\n                position.x = Mathf.Clamp(position.x, minLocalPosition.x, maxLocalPosition.x);\n                position.y = Mathf.Clamp(position.y, minLocalPosition.y, maxLocalPosition.y);\n            }\n\n            itemTransform.anchoredPosition = position;\n            itemTransform.localRotation = Quaternion.identity;\n            itemTransform.localScale = Vector3.one;\n        }\n\n\n        private static void PlaceUIElementRoot(GameObject element, MenuCommand menuCommand)\n        {\n            GameObject parent = menuCommand.context as GameObject;\n            bool explicitParentChoice = true;\n            if (parent == null)\n            {\n                parent = GetOrCreateCanvasGameObject();\n                explicitParentChoice = false;\n\n                // If in Prefab Mode, Canvas has to be part of Prefab contents,\n                // otherwise use Prefab root instead.\n                PrefabStage prefabStage = PrefabStageUtility.GetCurrentPrefabStage();\n                if (prefabStage != null && !prefabStage.IsPartOfPrefabContents(parent))\n                    parent = prefabStage.prefabContentsRoot;\n            }\n            if (parent.GetComponentInParent<Canvas>() == null)\n            {\n                // Create canvas under context GameObject,\n                // and make that be the parent which UI element is added under.\n                GameObject canvas = CreateNewUI();\n                canvas.transform.SetParent(parent.transform, false);\n                parent = canvas;\n            }\n\n            // Setting the element to be a child of an element already in the scene should\n            // be sufficient to also move the element to that scene.\n            // However, it seems the element needs to be already in its destination scene when the\n            // RegisterCreatedObjectUndo is performed; otherwise the scene it was created in is dirtied.\n            SceneManager.MoveGameObjectToScene(element, parent.scene);\n\n            if (element.transform.parent == null)\n            {\n                Undo.SetTransformParent(element.transform, parent.transform, \"Parent \" + element.name);\n            }\n\n            GameObjectUtility.EnsureUniqueNameForSibling(element);\n\n            // We have to fix up the undo name since the name of the object was only known after reparenting it.\n            Undo.SetCurrentGroupName(\"Create \" + element.name);\n\n            GameObjectUtility.SetParentAndAlign(element, parent);\n            if (!explicitParentChoice) // not a context click, so center in sceneview\n                SetPositionVisibleinSceneView(parent.GetComponent<RectTransform>(), element.GetComponent<RectTransform>());\n\n            Undo.RegisterCreatedObjectUndo(element, \"Create \" + element.name);\n\n            Selection.activeGameObject = element;\n        }\n\n\n        static public GameObject CreateNewUI()\n        {\n            // Root for the UI\n            var root = new GameObject(\"Canvas\");\n            root.layer = LayerMask.NameToLayer(kUILayerName);\n            Canvas canvas = root.AddComponent<Canvas>();\n            canvas.renderMode = RenderMode.ScreenSpaceOverlay;\n            root.AddComponent<CanvasScaler>();\n            root.AddComponent<GraphicRaycaster>();\n\n            // Works for all stages.\n            StageUtility.PlaceGameObjectInCurrentStage(root);\n            bool customScene = false;\n            PrefabStage prefabStage = PrefabStageUtility.GetCurrentPrefabStage();\n            if (prefabStage != null)\n            {\n                root.transform.SetParent(prefabStage.prefabContentsRoot.transform, false);\n                customScene = true;\n            }\n\n            Undo.RegisterCreatedObjectUndo(root, \"Create \" + root.name);\n\n            // If there is no event system add one...\n            // No need to place event system in custom scene as these are temporary anyway.\n            // It can be argued for or against placing it in the user scenes,\n            // but let's not modify scene user is not currently looking at.\n            if (!customScene)\n                CreateEventSystem(false);\n            return root;\n        }\n\n\n        private static void CreateEventSystem(bool select)\n        {\n            CreateEventSystem(select, null);\n        }\n\n\n        private static void CreateEventSystem(bool select, GameObject parent)\n        {\n            var esys = Object.FindObjectOfType<EventSystem>();\n            if (esys == null)\n            {\n                var eventSystem = new GameObject(\"EventSystem\");\n                GameObjectUtility.SetParentAndAlign(eventSystem, parent);\n                esys = eventSystem.AddComponent<EventSystem>();\n                eventSystem.AddComponent<StandaloneInputModule>();\n\n                Undo.RegisterCreatedObjectUndo(eventSystem, \"Create \" + eventSystem.name);\n            }\n\n            if (select && esys != null)\n            {\n                Selection.activeGameObject = esys.gameObject;\n            }\n        }\n\n\n        // Helper function that returns a Canvas GameObject; preferably a parent of the selection, or other existing Canvas.\n        static public GameObject GetOrCreateCanvasGameObject()\n        {\n            GameObject selectedGo = Selection.activeGameObject;\n\n            // Try to find a gameobject that is the selected GO or one if its parents.\n            Canvas canvas = (selectedGo != null) ? selectedGo.GetComponentInParent<Canvas>() : null;\n            if (IsValidCanvas(canvas))\n                return canvas.gameObject;\n\n            // No canvas in selection or its parents? Then use any valid canvas.\n            // We have to find all loaded Canvases, not just the ones in main scenes.\n            Canvas[] canvasArray = StageUtility.GetCurrentStageHandle().FindComponentsOfType<Canvas>();\n            for (int i = 0; i < canvasArray.Length; i++)\n                if (IsValidCanvas(canvasArray[i]))\n                    return canvasArray[i].gameObject;\n\n            // No canvas in the scene at all? Then create a new one.\n            return CreateNewUI();\n        }\n\n        static bool IsValidCanvas(Canvas canvas)\n        {\n            if (canvas == null || !canvas.gameObject.activeInHierarchy)\n                return false;\n\n            // It's important that the non-editable canvas from a prefab scene won't be rejected,\n            // but canvases not visible in the Hierarchy at all do. Don't check for HideAndDontSave.\n            if (EditorUtility.IsPersistent(canvas) || (canvas.hideFlags & HideFlags.HideInHierarchy) != 0)\n                return false;\n\n            if (StageUtility.GetStageHandle(canvas.gameObject) != StageUtility.GetCurrentStageHandle())\n                return false;\n\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_CreateObjectMenu.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 7065397ff8184621aa3ca4f854491259\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_EditorShaderUtilities.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.Linq;\nusing System.Collections;\n\n\nnamespace TMPro.EditorUtilities\n{\n\n    public static class EditorShaderUtilities \n    {\n\n        /// <summary>\n        /// Copy Shader properties from source to destination material.\n        /// </summary>\n        /// <param name=\"source\"></param>\n        /// <returns></returns>\n        public static void CopyMaterialProperties(Material source, Material destination)\n        {\n            MaterialProperty[] source_prop = MaterialEditor.GetMaterialProperties(new Material[] { source });\n\n            for (int i = 0; i < source_prop.Length; i++)\n            {\n                int property_ID = Shader.PropertyToID(source_prop[i].name);\n                if (destination.HasProperty(property_ID))\n                {\n                    //Debug.Log(source_prop[i].name + \"  Type:\" + ShaderUtil.GetPropertyType(source.shader, i));\n                    switch (ShaderUtil.GetPropertyType(source.shader, i))\n                    {\n                        case ShaderUtil.ShaderPropertyType.Color:\n                            destination.SetColor(property_ID, source.GetColor(property_ID));                          \n                            break;\n                        case ShaderUtil.ShaderPropertyType.Float:\n                            destination.SetFloat(property_ID, source.GetFloat(property_ID));\n                            break;\n                        case ShaderUtil.ShaderPropertyType.Range:\n                            destination.SetFloat(property_ID, source.GetFloat(property_ID));\n                            break;\n                        case ShaderUtil.ShaderPropertyType.TexEnv:\n                            destination.SetTexture(property_ID, source.GetTexture(property_ID));\n                            break;\n                        case ShaderUtil.ShaderPropertyType.Vector:\n                            destination.SetVector(property_ID, source.GetVector(property_ID));\n                            break;\n                    }\n                }\n            }\n\n        }\n      \n    }\n\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_EditorShaderUtilities.cs.meta",
    "content": "fileFormatVersion: 2\nguid: aa76955fe5bb44f7915d91db8c7043c4\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_FontAssetCreatorWindow.cs",
    "content": "using System;\nusing UnityEngine;\nusing UnityEditor;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Threading;\nusing System.IO;\nusing System.Text.RegularExpressions;\nusing UnityEngine.TextCore;\nusing UnityEngine.TextCore.LowLevel;\nusing Object = UnityEngine.Object;\n\nnamespace TMPro.EditorUtilities\n{\n    public class TMPro_FontAssetCreatorWindow : EditorWindow\n    {\n        [MenuItem(\"Window/TextMeshPro/Font Asset Creator\", false, 2025)]\n        public static void ShowFontAtlasCreatorWindow()\n        {\n            var window = GetWindow<TMPro_FontAssetCreatorWindow>();\n            window.titleContent = new GUIContent(\"Font Asset Creator\");\n            window.Focus();\n\n            // Make sure TMP Essential Resources have been imported.\n            window.CheckEssentialResources();\n        }\n\n\n        public static void ShowFontAtlasCreatorWindow(Font sourceFontFile)\n        {\n            var window = GetWindow<TMPro_FontAssetCreatorWindow>();\n\n            window.titleContent = new GUIContent(\"Font Asset Creator\");\n            window.Focus();\n\n            window.ClearGeneratedData();\n            window.m_LegacyFontAsset = null;\n            window.m_SelectedFontAsset = null;\n\n            // Override selected font asset\n            window.m_SourceFontFile = sourceFontFile;\n\n            // Make sure TMP Essential Resources have been imported.\n            window.CheckEssentialResources();\n        }\n\n\n        public static void ShowFontAtlasCreatorWindow(TMP_FontAsset fontAsset)\n        {\n            var window = GetWindow<TMPro_FontAssetCreatorWindow>();\n\n            window.titleContent = new GUIContent(\"Font Asset Creator\");\n            window.Focus();\n\n            // Clear any previously generated data\n            window.ClearGeneratedData();\n            window.m_LegacyFontAsset = null;\n\n            // Load font asset creation settings if we have valid settings\n            if (string.IsNullOrEmpty(fontAsset.creationSettings.sourceFontFileGUID) == false)\n            {\n                window.LoadFontCreationSettings(fontAsset.creationSettings);\n\n                // Override settings to inject character list from font asset\n                window.m_CharacterSetSelectionMode = 6;\n                window.m_CharacterSequence = TMP_EditorUtility.GetUnicodeCharacterSequence(TMP_FontAsset.GetCharactersArray(fontAsset));\n\n\n                window.m_ReferencedFontAsset = fontAsset;\n                window.m_SavedFontAtlas = fontAsset.atlasTexture;\n            }\n            else\n            {\n                window.m_WarningMessage = \"Font Asset [\" + fontAsset.name + \"] does not contain any previous \\\"Font Asset Creation Settings\\\". This usually means [\" + fontAsset.name + \"] was created before this new functionality was added.\";\n                window.m_SourceFontFile = null;\n                window.m_LegacyFontAsset = fontAsset;\n            }\n\n            // Even if we don't have any saved generation settings, we still want to pre-select the source font file.\n            window.m_SelectedFontAsset = fontAsset;\n\n            // Make sure TMP Essential Resources have been imported.\n            window.CheckEssentialResources();\n        }\n        \n        [System.Serializable]\n        class FontAssetCreationSettingsContainer\n        {\n            public List<FontAssetCreationSettings> fontAssetCreationSettings;\n        }\n        \n        FontAssetCreationSettingsContainer m_FontAssetCreationSettingsContainer;\n        \n        //static readonly string[] m_FontCreationPresets = new string[] { \"Recent 1\", \"Recent 2\", \"Recent 3\", \"Recent 4\" };\n        int m_FontAssetCreationSettingsCurrentIndex = 0;\n\n        const string k_FontAssetCreationSettingsContainerKey = \"TextMeshPro.FontAssetCreator.RecentFontAssetCreationSettings.Container\";\n        const string k_FontAssetCreationSettingsCurrentIndexKey = \"TextMeshPro.FontAssetCreator.RecentFontAssetCreationSettings.CurrentIndex\";\n        const float k_TwoColumnControlsWidth = 335f;\n\n        // Diagnostics\n        System.Diagnostics.Stopwatch m_StopWatch;\n        double m_GlyphPackingGenerationTime;\n        double m_GlyphRenderingGenerationTime;\n        \n        string[] m_FontSizingOptions = { \"Auto Sizing\", \"Custom Size\" };\n        int m_PointSizeSamplingMode;\n        string[] m_FontResolutionLabels = { \"8\", \"16\",\"32\", \"64\", \"128\", \"256\", \"512\", \"1024\", \"2048\", \"4096\", \"8192\" };\n        int[] m_FontAtlasResolutions = { 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192 };\n        string[] m_FontCharacterSets = { \"ASCII\", \"Extended ASCII\", \"ASCII Lowercase\", \"ASCII Uppercase\", \"Numbers + Symbols\", \"Custom Range\", \"Unicode Range (Hex)\", \"Custom Characters\", \"Characters from File\" };\n        enum FontPackingModes { Fast = 0, Optimum = 4 };\n        FontPackingModes m_PackingMode = FontPackingModes.Fast;\n\n        int m_CharacterSetSelectionMode;\n\n        string m_CharacterSequence = \"\";\n        string m_OutputFeedback = \"\";\n        string m_WarningMessage;\n        int m_CharacterCount;\n        Vector2 m_ScrollPosition;\n        Vector2 m_OutputScrollPosition;\n        \n        bool m_IsRepaintNeeded;\n\n        float m_AtlasGenerationProgress;\n        string m_AtlasGenerationProgressLabel = string.Empty;\n        float m_RenderingProgress;\n        bool m_IsRenderingDone;\n        bool m_IsProcessing;\n        bool m_IsGenerationDisabled;\n        bool m_IsGenerationCancelled;\n\n        bool m_IsFontAtlasInvalid;\n        Object m_SourceFontFile;\n        TMP_FontAsset m_SelectedFontAsset;\n        TMP_FontAsset m_LegacyFontAsset;\n        TMP_FontAsset m_ReferencedFontAsset;\n\n        TextAsset m_CharactersFromFile;\n        int m_PointSize;\n        int m_Padding = 5;\n        //FaceStyles m_FontStyle = FaceStyles.Normal;\n        //float m_FontStyleValue = 2;\n\n        GlyphRenderMode m_GlyphRenderMode = GlyphRenderMode.SDFAA;\n        int m_AtlasWidth = 512;\n        int m_AtlasHeight = 512;\n        byte[] m_AtlasTextureBuffer;\n        Texture2D m_FontAtlasTexture;\n        Texture2D m_SavedFontAtlas;\n\n        // \n        List<Glyph> m_FontGlyphTable = new List<Glyph>();\n        List<TMP_Character> m_FontCharacterTable = new List<TMP_Character>();\n\n        Dictionary<uint, uint> m_CharacterLookupMap = new Dictionary<uint, uint>();\n        Dictionary<uint, List<uint>> m_GlyphLookupMap = new Dictionary<uint, List<uint>>();\n\n        List<Glyph> m_GlyphsToPack = new List<Glyph>();\n        List<Glyph> m_GlyphsPacked = new List<Glyph>();\n        List<GlyphRect> m_FreeGlyphRects = new List<GlyphRect>();\n        List<GlyphRect> m_UsedGlyphRects = new List<GlyphRect>();\n        List<Glyph> m_GlyphsToRender = new List<Glyph>();\n        List<uint> m_AvailableGlyphsToAdd = new List<uint>();\n        List<uint> m_MissingCharacters = new List<uint>();\n        List<uint> m_ExcludedCharacters = new List<uint>();\n\n        private FaceInfo m_FaceInfo;\n\n        bool m_IncludeFontFeatures;\n\n\n        public void OnEnable()\n        {\n            // Used for Diagnostics\n            m_StopWatch = new System.Diagnostics.Stopwatch();\n            \n            // Set Editor window size.\n            minSize = new Vector2(315, minSize.y);\n\n            // Initialize & Get shader property IDs.\n            ShaderUtilities.GetShaderPropertyIDs();\n\n            // Load last selected preset if we are not already in the process of regenerating an existing font asset (via the Context menu)\n            if (EditorPrefs.HasKey(k_FontAssetCreationSettingsContainerKey))\n            {\n                if (m_FontAssetCreationSettingsContainer == null)\n                    m_FontAssetCreationSettingsContainer = JsonUtility.FromJson<FontAssetCreationSettingsContainer>(EditorPrefs.GetString(k_FontAssetCreationSettingsContainerKey));\n\n                if (m_FontAssetCreationSettingsContainer.fontAssetCreationSettings != null && m_FontAssetCreationSettingsContainer.fontAssetCreationSettings.Count > 0)\n                {\n                    // Load Font Asset Creation Settings preset.\n                    if (EditorPrefs.HasKey(k_FontAssetCreationSettingsCurrentIndexKey))\n                        m_FontAssetCreationSettingsCurrentIndex = EditorPrefs.GetInt(k_FontAssetCreationSettingsCurrentIndexKey);\n\n                    LoadFontCreationSettings(m_FontAssetCreationSettingsContainer.fontAssetCreationSettings[m_FontAssetCreationSettingsCurrentIndex]);\n                }\n            }\n\n            ClearGeneratedData();\n        }\n\n\n        public void OnDisable()\n        {\n            //Debug.Log(\"TextMeshPro Editor Window has been disabled.\");\n\n            // Destroy Engine only if it has been initialized already\n            FontEngine.DestroyFontEngine();\n\n            ClearGeneratedData();\n\n            // Remove Glyph Report if one was created.\n            if (File.Exists(\"Assets/TextMesh Pro/Glyph Report.txt\"))\n            {\n                File.Delete(\"Assets/TextMesh Pro/Glyph Report.txt\");\n                File.Delete(\"Assets/TextMesh Pro/Glyph Report.txt.meta\");\n\n                AssetDatabase.Refresh();\n            }\n\n            // Save Font Asset Creation Settings Index\n            SaveCreationSettingsToEditorPrefs(SaveFontCreationSettings());\n            EditorPrefs.SetInt(k_FontAssetCreationSettingsCurrentIndexKey, m_FontAssetCreationSettingsCurrentIndex);\n\n            // Unregister to event\n            TMPro_EventManager.RESOURCE_LOAD_EVENT.Remove(ON_RESOURCES_LOADED);\n\n            Resources.UnloadUnusedAssets();\n        }\n\n\n        // Event received when TMP resources have been loaded.\n        void ON_RESOURCES_LOADED()\n        {\n            TMPro_EventManager.RESOURCE_LOAD_EVENT.Remove(ON_RESOURCES_LOADED);\n\n            m_IsGenerationDisabled = false;\n        }\n\n        // Make sure TMP Essential Resources have been imported.\n        void CheckEssentialResources()\n        {\n            if (TMP_Settings.instance == null)\n            {\n                if (m_IsGenerationDisabled == false)\n                    TMPro_EventManager.RESOURCE_LOAD_EVENT.Add(ON_RESOURCES_LOADED);\n\n                m_IsGenerationDisabled = true;\n            }\n        }\n\n\n        public void OnGUI()\n        {\n            GUILayout.BeginHorizontal();\n            DrawControls();\n            if (position.width > position.height && position.width > k_TwoColumnControlsWidth)\n            {\n                DrawPreview();\n            }\n            GUILayout.EndHorizontal();\n        }\n\n\n        public void Update()\n        {\n            if (m_IsRepaintNeeded)\n            {\n                //Debug.Log(\"Repainting...\");\n                m_IsRepaintNeeded = false;\n                Repaint();\n            }\n\n            // Update Progress bar is we are Rendering a Font.\n            if (m_IsProcessing)\n            {\n                m_AtlasGenerationProgress = FontEngine.generationProgress;\n\n                m_IsRepaintNeeded = true;\n            }\n\n            // Update Feedback Window & Create Font Texture once Rendering is done.\n            if (m_IsRenderingDone)\n            {\n                m_IsProcessing = false;\n                m_IsRenderingDone = false;\n\n                if (m_IsGenerationCancelled == false)\n                {\n                    m_AtlasGenerationProgressLabel = \"Generation completed in: \" + (m_GlyphPackingGenerationTime + m_GlyphRenderingGenerationTime).ToString(\"0.00 ms.\");\n\n                    UpdateRenderFeedbackWindow();\n                    CreateFontAtlasTexture();\n\n                    // If dynamic make readable ...\n                    m_FontAtlasTexture.Apply(false, false);\n                }\n                Repaint();\n            }\n        }\n\n\n        /// <summary>\n        /// Method which returns the character corresponding to a decimal value.\n        /// </summary>\n        /// <param name=\"sequence\"></param>\n        /// <returns></returns>\n        static uint[] ParseNumberSequence(string sequence)\n        {\n            List<uint> unicodeList = new List<uint>();\n            string[] sequences = sequence.Split(',');\n\n            foreach (string seq in sequences)\n            {\n                string[] s1 = seq.Split('-');\n\n                if (s1.Length == 1)\n                    try\n                    {\n                        unicodeList.Add(uint.Parse(s1[0]));\n                    }\n                    catch\n                    {\n                        Debug.Log(\"No characters selected or invalid format.\");\n                    }\n                else\n                {\n                    for (uint j = uint.Parse(s1[0]); j < uint.Parse(s1[1]) + 1; j++)\n                    {\n                        unicodeList.Add(j);\n                    }\n                }\n            }\n\n            return unicodeList.ToArray();\n        }\n\n\n        /// <summary>\n        /// Method which returns the character (decimal value) from a hex sequence.\n        /// </summary>\n        /// <param name=\"sequence\"></param>\n        /// <returns></returns>\n        static uint[] ParseHexNumberSequence(string sequence)\n        {\n            List<uint> unicodeList = new List<uint>();\n            string[] sequences = sequence.Split(',');\n\n            foreach (string seq in sequences)\n            {\n                string[] s1 = seq.Split('-');\n\n                if (s1.Length == 1)\n                    try\n                    {\n                        unicodeList.Add(uint.Parse(s1[0], NumberStyles.AllowHexSpecifier));\n                    }\n                    catch\n                    {\n                        Debug.Log(\"No characters selected or invalid format.\");\n                    }\n                else\n                {\n                    for (uint j = uint.Parse(s1[0], NumberStyles.AllowHexSpecifier); j < uint.Parse(s1[1], NumberStyles.AllowHexSpecifier) + 1; j++)\n                    {\n                        unicodeList.Add(j);\n                    }\n                }\n            }\n\n            return unicodeList.ToArray();\n        }\n\n\n        void DrawControls()\n        {\n            GUILayout.Space(5f);\n\n            if (position.width > position.height && position.width > k_TwoColumnControlsWidth)\n            {\n                m_ScrollPosition = EditorGUILayout.BeginScrollView(m_ScrollPosition, GUILayout.Width(315));\n            }\n            else\n            {\n                m_ScrollPosition = EditorGUILayout.BeginScrollView(m_ScrollPosition);\n            }\n            \n            GUILayout.Space(5f);\n\n            GUILayout.Label(m_SelectedFontAsset != null ? string.Format(\"Font Settings [{0}]\", m_SelectedFontAsset.name) : \"Font Settings\", EditorStyles.boldLabel);\n\n            EditorGUILayout.BeginVertical(EditorStyles.helpBox);\n\n            EditorGUIUtility.labelWidth = 125f;\n            EditorGUIUtility.fieldWidth = 5f;\n            \n            // Disable Options if already generating a font atlas texture.\n            EditorGUI.BeginDisabledGroup(m_IsProcessing);\n            {\n                // FONT TTF SELECTION\n                EditorGUI.BeginChangeCheck();\n                m_SourceFontFile = EditorGUILayout.ObjectField(\"Source Font File\", m_SourceFontFile, typeof(Font), false) as Font;\n                if (EditorGUI.EndChangeCheck())\n                {\n                    m_SelectedFontAsset = null;\n                    m_IsFontAtlasInvalid = true;\n                }\n\n                // FONT SIZING\n                EditorGUI.BeginChangeCheck();\n                if (m_PointSizeSamplingMode == 0)\n                {\n                    m_PointSizeSamplingMode = EditorGUILayout.Popup(\"Sampling Point Size\", m_PointSizeSamplingMode, m_FontSizingOptions);\n                }\n                else\n                {\n                    GUILayout.BeginHorizontal();\n                    m_PointSizeSamplingMode = EditorGUILayout.Popup(\"Sampling Point Size\", m_PointSizeSamplingMode, m_FontSizingOptions, GUILayout.Width(225));\n                    m_PointSize = EditorGUILayout.IntField(m_PointSize);\n                    GUILayout.EndHorizontal();\n                }\n                if (EditorGUI.EndChangeCheck())\n                {\n                    m_IsFontAtlasInvalid = true;\n                }\n\n                // FONT PADDING\n                EditorGUI.BeginChangeCheck();\n                m_Padding = EditorGUILayout.IntField(\"Padding\", m_Padding);\n                m_Padding = (int)Mathf.Clamp(m_Padding, 0f, 64f);\n                if (EditorGUI.EndChangeCheck())\n                {\n                    m_IsFontAtlasInvalid = true;\n                }\n\n                // FONT PACKING METHOD SELECTION\n                EditorGUI.BeginChangeCheck();\n                m_PackingMode = (FontPackingModes)EditorGUILayout.EnumPopup(\"Packing Method\", m_PackingMode);\n                if (EditorGUI.EndChangeCheck())\n                {\n                    m_IsFontAtlasInvalid = true;\n                }\n\n                // FONT ATLAS RESOLUTION SELECTION\n                GUILayout.BeginHorizontal();\n                GUI.changed = false;\n\n                EditorGUI.BeginChangeCheck();\n                EditorGUILayout.PrefixLabel(\"Atlas Resolution\");\n                m_AtlasWidth = EditorGUILayout.IntPopup(m_AtlasWidth, m_FontResolutionLabels, m_FontAtlasResolutions);\n                m_AtlasHeight = EditorGUILayout.IntPopup(m_AtlasHeight, m_FontResolutionLabels, m_FontAtlasResolutions);\n                if (EditorGUI.EndChangeCheck())\n                {\n                    m_IsFontAtlasInvalid = true;\n                }\n\n                GUILayout.EndHorizontal();\n\n\n                // FONT CHARACTER SET SELECTION\n                EditorGUI.BeginChangeCheck();\n                bool hasSelectionChanged = false;\n                m_CharacterSetSelectionMode = EditorGUILayout.Popup(\"Character Set\", m_CharacterSetSelectionMode, m_FontCharacterSets);\n                if (EditorGUI.EndChangeCheck())\n                {\n                    m_CharacterSequence = \"\";\n                    hasSelectionChanged = true;\n                    m_IsFontAtlasInvalid = true;\n                }\n\n                switch (m_CharacterSetSelectionMode)\n                {\n                    case 0: // ASCII\n                        //characterSequence = \"32 - 126, 130, 132 - 135, 139, 145 - 151, 153, 155, 161, 166 - 167, 169 - 174, 176, 181 - 183, 186 - 187, 191, 8210 - 8226, 8230, 8240, 8242 - 8244, 8249 - 8250, 8252 - 8254, 8260, 8286\";\n                        m_CharacterSequence = \"32 - 126, 160, 8203, 8230, 9633\";\n                        break;\n\n                    case 1: // EXTENDED ASCII\n                        m_CharacterSequence = \"32 - 126, 160 - 255, 8192 - 8303, 8364, 8482, 9633\";\n                        // Could add 9632 for missing glyph\n                        break;\n\n                    case 2: // Lowercase\n                        m_CharacterSequence = \"32 - 64, 91 - 126, 160\";\n                        break;\n\n                    case 3: // Uppercase\n                        m_CharacterSequence = \"32 - 96, 123 - 126, 160\";\n                        break;\n\n                    case 4: // Numbers & Symbols\n                        m_CharacterSequence = \"32 - 64, 91 - 96, 123 - 126, 160\";\n                        break;\n\n                    case 5: // Custom Range\n                        EditorGUILayout.BeginVertical(EditorStyles.helpBox);\n                        GUILayout.Label(\"Enter a sequence of decimal values to define the characters to be included in the font asset or retrieve one from another font asset.\", TMP_UIStyleManager.label);\n                        GUILayout.Space(10f);\n\n                        EditorGUI.BeginChangeCheck();\n                        m_ReferencedFontAsset = EditorGUILayout.ObjectField(\"Select Font Asset\", m_ReferencedFontAsset, typeof(TMP_FontAsset), false) as TMP_FontAsset;\n                        if (EditorGUI.EndChangeCheck() || hasSelectionChanged)\n                        {\n                            if (m_ReferencedFontAsset != null)\n                                m_CharacterSequence = TMP_EditorUtility.GetDecimalCharacterSequence(TMP_FontAsset.GetCharactersArray(m_ReferencedFontAsset));\n                            \n                            m_IsFontAtlasInvalid = true;\n                        }\n\n                        // Filter out unwanted characters.\n                        char chr = Event.current.character;\n                        if ((chr < '0' || chr > '9') && (chr < ',' || chr > '-'))\n                        {\n                            Event.current.character = '\\0';\n                        }\n                        GUILayout.Label(\"Character Sequence (Decimal)\", EditorStyles.boldLabel);\n                        EditorGUI.BeginChangeCheck();\n                        m_CharacterSequence = EditorGUILayout.TextArea(m_CharacterSequence, TMP_UIStyleManager.textAreaBoxWindow, GUILayout.Height(120), GUILayout.ExpandWidth(true));\n                        if (EditorGUI.EndChangeCheck())\n                        {\n                            m_IsFontAtlasInvalid = true;\n                        }\n                        \n                        EditorGUILayout.EndVertical();\n                        break;\n\n                    case 6: // Unicode HEX Range\n                        EditorGUILayout.BeginVertical(EditorStyles.helpBox);\n                        GUILayout.Label(\"Enter a sequence of Unicode (hex) values to define the characters to be included in the font asset or retrieve one from another font asset.\", TMP_UIStyleManager.label);\n                        GUILayout.Space(10f);\n\n                        EditorGUI.BeginChangeCheck();\n                        m_ReferencedFontAsset = EditorGUILayout.ObjectField(\"Select Font Asset\", m_ReferencedFontAsset, typeof(TMP_FontAsset), false) as TMP_FontAsset;\n                        if (EditorGUI.EndChangeCheck() || hasSelectionChanged)\n                        {\n                            if (m_ReferencedFontAsset != null)\n                                m_CharacterSequence = TMP_EditorUtility.GetUnicodeCharacterSequence(TMP_FontAsset.GetCharactersArray(m_ReferencedFontAsset));\n                            \n                            m_IsFontAtlasInvalid = true;\n                        }\n\n                        // Filter out unwanted characters.\n                        chr = Event.current.character;\n                        if ((chr < '0' || chr > '9') && (chr < 'a' || chr > 'f') && (chr < 'A' || chr > 'F') && (chr < ',' || chr > '-'))\n                        {\n                            Event.current.character = '\\0';\n                        }\n                        GUILayout.Label(\"Character Sequence (Hex)\", EditorStyles.boldLabel);\n                        EditorGUI.BeginChangeCheck();\n                        m_CharacterSequence = EditorGUILayout.TextArea(m_CharacterSequence, TMP_UIStyleManager.textAreaBoxWindow, GUILayout.Height(120), GUILayout.ExpandWidth(true));\n                        if (EditorGUI.EndChangeCheck())\n                        {\n                            m_IsFontAtlasInvalid = true;\n                        }\n\n                        EditorGUILayout.EndVertical();\n                        break;\n\n                    case 7: // Characters from Font Asset\n                        EditorGUILayout.BeginVertical(EditorStyles.helpBox);\n                        GUILayout.Label(\"Type the characters to be included in the font asset or retrieve them from another font asset.\", TMP_UIStyleManager.label);\n                        GUILayout.Space(10f);\n\n                        EditorGUI.BeginChangeCheck();\n                        m_ReferencedFontAsset = EditorGUILayout.ObjectField(\"Select Font Asset\", m_ReferencedFontAsset, typeof(TMP_FontAsset), false) as TMP_FontAsset;\n                        if (EditorGUI.EndChangeCheck() || hasSelectionChanged)\n                        {\n                            if (m_ReferencedFontAsset != null)\n                                m_CharacterSequence = TMP_FontAsset.GetCharacters(m_ReferencedFontAsset);\n                            \n                            m_IsFontAtlasInvalid = true;\n                        }\n\n                        EditorGUI.indentLevel = 0;\n                        \n                        GUILayout.Label(\"Custom Character List\", EditorStyles.boldLabel);\n                        EditorGUI.BeginChangeCheck();\n                        m_CharacterSequence = EditorGUILayout.TextArea(m_CharacterSequence, TMP_UIStyleManager.textAreaBoxWindow, GUILayout.Height(120), GUILayout.ExpandWidth(true));\n                        if (EditorGUI.EndChangeCheck())\n                        {\n                            m_IsFontAtlasInvalid = true;\n                        }\n                        EditorGUILayout.EndVertical();\n                        break;\n\n                    case 8: // Character List from File\n                        EditorGUI.BeginChangeCheck();\n                        m_CharactersFromFile = EditorGUILayout.ObjectField(\"Character File\", m_CharactersFromFile, typeof(TextAsset), false) as TextAsset;\n                        if (EditorGUI.EndChangeCheck())\n                        {\n                            m_IsFontAtlasInvalid = true;\n                        }\n\n                        if (m_CharactersFromFile != null)\n                        {\n                            Regex rx = new Regex(@\"(?<!\\\\)(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8})\");\n\n                            m_CharacterSequence = rx.Replace(m_CharactersFromFile.text,\n                                match =>\n                                {\n                                    if (match.Value.StartsWith(\"\\\\U\"))\n                                        return char.ConvertFromUtf32(int.Parse(match.Value.Replace(\"\\\\U\", \"\"), NumberStyles.HexNumber));\n\n                                    return char.ConvertFromUtf32(int.Parse(match.Value.Replace(\"\\\\u\", \"\"), NumberStyles.HexNumber));\n                                });\n                        }\n                        break;\n                }\n\n                // FONT STYLE SELECTION\n                //GUILayout.BeginHorizontal();\n                //EditorGUI.BeginChangeCheck();\n                ////m_FontStyle = (FaceStyles)EditorGUILayout.EnumPopup(\"Font Style\", m_FontStyle, GUILayout.Width(225));\n                ////m_FontStyleValue = EditorGUILayout.IntField((int)m_FontStyleValue);\n                //if (EditorGUI.EndChangeCheck())\n                //{\n                //    m_IsFontAtlasInvalid = true;\n                //}\n                //GUILayout.EndHorizontal();\n\n                // Render Mode Selection\n                CheckForLegacyGlyphRenderMode();\n\n                EditorGUI.BeginChangeCheck();\n                m_GlyphRenderMode = (GlyphRenderMode)EditorGUILayout.EnumPopup(\"Render Mode\", m_GlyphRenderMode);\n                if (EditorGUI.EndChangeCheck())\n                {\n                    m_IsFontAtlasInvalid = true;\n                }\n\n                m_IncludeFontFeatures = EditorGUILayout.Toggle(\"Get Kerning Pairs\", m_IncludeFontFeatures);\n\n                EditorGUILayout.Space();\n            }\n\n            EditorGUI.EndDisabledGroup();\n\n            if (!string.IsNullOrEmpty(m_WarningMessage))\n            {\n                EditorGUILayout.HelpBox(m_WarningMessage, MessageType.Warning);\n            }\n            \n            GUI.enabled = m_SourceFontFile != null && !m_IsProcessing && !m_IsGenerationDisabled; // Enable Preview if we are not already rendering a font.\n            if (GUILayout.Button(\"Generate Font Atlas\") && GUI.enabled)\n            {\n                if (!m_IsProcessing && m_SourceFontFile != null)\n                {\n                    DestroyImmediate(m_FontAtlasTexture);\n                    m_FontAtlasTexture = null;\n                    m_SavedFontAtlas = null;\n\n                    // Initialize font engine\n                    FontEngineError errorCode = FontEngine.InitializeFontEngine();\n                    if (errorCode != FontEngineError.Success)\n                    {\n                        Debug.Log(\"Font Asset Creator - Error [\" + errorCode + \"] has occurred while Initializing the FreeType Library.\");\n                    }\n                    \n                    // Get file path of the source font file.\n                    string fontPath = AssetDatabase.GetAssetPath(m_SourceFontFile);\n\n                    if (errorCode == FontEngineError.Success)\n                    {\n                        errorCode = FontEngine.LoadFontFace(fontPath);\n\n                        if (errorCode != FontEngineError.Success)\n                        {\n                            Debug.Log(\"Font Asset Creator - Error Code [\" + errorCode + \"] has occurred trying to load the [\" + m_SourceFontFile.name + \"] font file. This typically results from the use of an incompatible or corrupted font file.\");\n                        }\n                    }\n\n\n                    // Define an array containing the characters we will render.\n                    if (errorCode == FontEngineError.Success)\n                    {\n                        uint[] characterSet = null;\n\n                        // Get list of characters that need to be packed and rendered to the atlas texture.\n                        if (m_CharacterSetSelectionMode == 7 || m_CharacterSetSelectionMode == 8)\n                        {\n                            List<uint> char_List = new List<uint>();\n\n                            for (int i = 0; i < m_CharacterSequence.Length; i++)\n                            {\n                                uint unicode = m_CharacterSequence[i];\n\n                                // Handle surrogate pairs\n                                if (i < m_CharacterSequence.Length - 1 && char.IsHighSurrogate((char)unicode) && char.IsLowSurrogate(m_CharacterSequence[i + 1]))\n                                {\n                                    unicode = (uint)char.ConvertToUtf32(m_CharacterSequence[i], m_CharacterSequence[i + 1]);\n                                    i += 1;\n                                }\n\n                                // Check to make sure we don't include duplicates\n                                if (char_List.FindIndex(item => item == unicode) == -1)\n                                    char_List.Add(unicode);\n                            }\n\n                            characterSet = char_List.ToArray();\n                        }\n                        else if (m_CharacterSetSelectionMode == 6)\n                        {\n                            characterSet = ParseHexNumberSequence(m_CharacterSequence);\n                        }\n                        else\n                        {\n                            characterSet = ParseNumberSequence(m_CharacterSequence);\n                        }\n\n                        m_CharacterCount = characterSet.Length;\n                        \n                        m_AtlasGenerationProgress = 0;\n                        m_IsProcessing = true;\n                        m_IsGenerationCancelled = false;\n\n                        GlyphLoadFlags glyphLoadFlags = ((GlyphRasterModes)m_GlyphRenderMode & GlyphRasterModes.RASTER_MODE_HINTED) == GlyphRasterModes.RASTER_MODE_HINTED ? GlyphLoadFlags.LOAD_RENDER : GlyphLoadFlags.LOAD_RENDER | GlyphLoadFlags.LOAD_NO_HINTING;\n\n                        // \n                        AutoResetEvent autoEvent = new AutoResetEvent(false);\n\n                        // Worker thread to pack glyphs in the given texture space.\n                        ThreadPool.QueueUserWorkItem(PackGlyphs =>\n                        {\n                            // Start Stop Watch\n                            m_StopWatch = System.Diagnostics.Stopwatch.StartNew();\n\n                            // Clear the various lists used in the generation process.\n                            m_AvailableGlyphsToAdd.Clear();\n                            m_MissingCharacters.Clear();\n                            m_ExcludedCharacters.Clear();\n                            m_CharacterLookupMap.Clear();\n                            m_GlyphLookupMap.Clear();\n                            m_GlyphsToPack.Clear();\n                            m_GlyphsPacked.Clear();\n\n                            // Check if requested characters are available in the source font file.\n                            for (int i = 0; i < characterSet.Length; i++)\n                            {\n                                uint unicode = characterSet[i];\n\n                                if (FontEngine.TryGetGlyphIndex(unicode, out uint glyphIndex))\n                                {\n                                    // Skip over potential duplicate characters.\n                                    if (m_CharacterLookupMap.ContainsKey(unicode))\n                                        continue;\n\n                                    // Add character to character lookup map.\n                                    m_CharacterLookupMap.Add(unicode, glyphIndex);\n\n                                    // Skip over potential duplicate glyph references.\n                                    if (m_GlyphLookupMap.ContainsKey(glyphIndex))\n                                    {\n                                        // Add additional glyph reference for this character.\n                                        m_GlyphLookupMap[glyphIndex].Add(unicode);\n                                        continue;\n                                    }\n\n                                    // Add glyph reference to glyph lookup map.\n                                    m_GlyphLookupMap.Add(glyphIndex, new List<uint>() { unicode });\n\n                                    // Add glyph index to list of glyphs to add to texture.\n                                    m_AvailableGlyphsToAdd.Add(glyphIndex);\n                                }\n                                else\n                                {\n                                    // Add Unicode to list of missing characters.\n                                    m_MissingCharacters.Add(unicode);\n                                }\n                            }\n\n                            // Pack available glyphs in the provided texture space.\n                            if (m_AvailableGlyphsToAdd.Count > 0)\n                            {\n                                int packingModifier = ((GlyphRasterModes)m_GlyphRenderMode & GlyphRasterModes.RASTER_MODE_BITMAP) == GlyphRasterModes.RASTER_MODE_BITMAP ? 0 : 1;\n\n                                if (m_PointSizeSamplingMode == 0) // Auto-Sizing Point Size Mode\n                                {\n                                    // Estimate min / max range for auto sizing of point size.\n                                    int minPointSize = 0;\n                                    int maxPointSize = (int)Mathf.Sqrt((m_AtlasWidth * m_AtlasHeight) / m_AvailableGlyphsToAdd.Count) * 3;\n\n                                    m_PointSize = (maxPointSize + minPointSize) / 2;\n\n                                    bool optimumPointSizeFound = false;\n                                    for (int iteration = 0; iteration < 15 && optimumPointSizeFound == false; iteration++)\n                                    {\n                                        m_AtlasGenerationProgressLabel = \"Packing glyphs - Pass (\" + iteration + \")\";\n\n                                        FontEngine.SetFaceSize(m_PointSize);\n\n                                        m_GlyphsToPack.Clear();\n                                        m_GlyphsPacked.Clear();\n\n                                        m_FreeGlyphRects.Clear();\n                                        m_FreeGlyphRects.Add(new GlyphRect(0, 0, m_AtlasWidth - packingModifier, m_AtlasHeight - packingModifier));\n                                        m_UsedGlyphRects.Clear();\n\n                                        for (int i = 0; i < m_AvailableGlyphsToAdd.Count; i++)\n                                        {\n                                            uint glyphIndex = m_AvailableGlyphsToAdd[i];\n\n                                            if (FontEngine.TryGetGlyphWithIndexValue(glyphIndex, glyphLoadFlags, out Glyph glyph))\n                                            {\n                                                if (glyph.glyphRect.width > 0 && glyph.glyphRect.height > 0)\n                                                {\n                                                    m_GlyphsToPack.Add(glyph);\n                                                }\n                                                else\n                                                {\n                                                    m_GlyphsPacked.Add(glyph);\n                                                }\n                                            }\n                                        }\n\n                                        FontEngine.TryPackGlyphsInAtlas(m_GlyphsToPack, m_GlyphsPacked, m_Padding, (GlyphPackingMode)m_PackingMode, m_GlyphRenderMode, m_AtlasWidth, m_AtlasHeight, m_FreeGlyphRects, m_UsedGlyphRects);\n\n                                        if (m_IsGenerationCancelled)\n                                        {\n                                            DestroyImmediate(m_FontAtlasTexture);\n                                            m_FontAtlasTexture = null;\n                                            return;\n                                        }\n\n                                        //Debug.Log(\"Glyphs remaining to add [\" + m_GlyphsToAdd.Count + \"]. Glyphs added [\" + m_GlyphsAdded.Count + \"].\");\n\n                                        if (m_GlyphsToPack.Count > 0)\n                                        {\n                                            if (m_PointSize > minPointSize)\n                                            {\n                                                maxPointSize = m_PointSize;\n                                                m_PointSize = (m_PointSize + minPointSize) / 2;\n\n                                                //Debug.Log(\"Decreasing point size from [\" + maxPointSize + \"] to [\" + m_PointSize + \"].\");\n                                            }\n                                        }\n                                        else\n                                        {\n                                            if (maxPointSize - minPointSize > 1 && m_PointSize < maxPointSize)\n                                            {\n                                                minPointSize = m_PointSize;\n                                                m_PointSize = (m_PointSize + maxPointSize) / 2;\n\n                                                //Debug.Log(\"Increasing point size from [\" + minPointSize + \"] to [\" + m_PointSize + \"].\");\n                                            }\n                                            else\n                                            {\n                                                //Debug.Log(\"[\" + iteration + \"] iterations to find the optimum point size of : [\" + m_PointSize + \"].\");\n                                                optimumPointSizeFound = true;\n                                            }\n                                        }\n                                    }\n                                }\n                                else // Custom Point Size Mode\n                                {\n                                    m_AtlasGenerationProgressLabel = \"Packing glyphs...\";\n\n                                    // Set point size\n                                    FontEngine.SetFaceSize(m_PointSize);\n\n                                    m_GlyphsToPack.Clear();\n                                    m_GlyphsPacked.Clear();\n\n                                    m_FreeGlyphRects.Clear();\n                                    m_FreeGlyphRects.Add(new GlyphRect(0, 0, m_AtlasWidth - packingModifier, m_AtlasHeight - packingModifier));\n                                    m_UsedGlyphRects.Clear();\n\n                                    for (int i = 0; i < m_AvailableGlyphsToAdd.Count; i++)\n                                    {\n                                        uint glyphIndex = m_AvailableGlyphsToAdd[i];\n\n                                        if (FontEngine.TryGetGlyphWithIndexValue(glyphIndex, glyphLoadFlags, out Glyph glyph))\n                                        {\n                                            if (glyph.glyphRect.width > 0 && glyph.glyphRect.height > 0)\n                                            {\n                                                m_GlyphsToPack.Add(glyph);\n                                            }\n                                            else\n                                            {\n                                                m_GlyphsPacked.Add(glyph);\n                                            }\n                                        }\n                                    }\n\n                                    FontEngine.TryPackGlyphsInAtlas(m_GlyphsToPack, m_GlyphsPacked, m_Padding, (GlyphPackingMode)m_PackingMode, m_GlyphRenderMode, m_AtlasWidth, m_AtlasHeight, m_FreeGlyphRects, m_UsedGlyphRects);\n\n                                    if (m_IsGenerationCancelled)\n                                    {\n                                        DestroyImmediate(m_FontAtlasTexture);\n                                        m_FontAtlasTexture = null;\n                                        return;\n                                    }\n                                    //Debug.Log(\"Glyphs remaining to add [\" + m_GlyphsToAdd.Count + \"]. Glyphs added [\" + m_GlyphsAdded.Count + \"].\");\n                                }\n\n                            }\n                            else\n                            {\n                                int packingModifier = ((GlyphRasterModes)m_GlyphRenderMode & GlyphRasterModes.RASTER_MODE_BITMAP) == GlyphRasterModes.RASTER_MODE_BITMAP ? 0 : 1;\n\n                                FontEngine.SetFaceSize(m_PointSize);\n\n                                m_GlyphsToPack.Clear();\n                                m_GlyphsPacked.Clear();\n\n                                m_FreeGlyphRects.Clear();\n                                m_FreeGlyphRects.Add(new GlyphRect(0, 0, m_AtlasWidth - packingModifier, m_AtlasHeight - packingModifier));\n                                m_UsedGlyphRects.Clear();\n                            }\n\n                            //Stop StopWatch\n                            m_StopWatch.Stop();\n                            m_GlyphPackingGenerationTime = m_StopWatch.Elapsed.TotalMilliseconds;\n                            Debug.Log(\"Glyph packing completed in: \" + m_GlyphPackingGenerationTime.ToString(\"0.000 ms.\"));\n                            m_StopWatch.Reset();\n\n                            m_FontCharacterTable.Clear();\n                            m_FontGlyphTable.Clear();\n                            m_GlyphsToRender.Clear();\n\n                            // Add glyphs and characters successfully added to texture to their respective font tables.\n                            foreach (Glyph glyph in m_GlyphsPacked)\n                            {\n                                uint glyphIndex = glyph.index;\n\n                                m_FontGlyphTable.Add(glyph);\n\n                                // Add glyphs to list of glyphs that need to be rendered.\n                                if (glyph.glyphRect.width > 0 && glyph.glyphRect.height > 0)\n                                    m_GlyphsToRender.Add(glyph);\n                        \n                                foreach (uint unicode in m_GlyphLookupMap[glyphIndex])\n                                {\n                                    // Create new Character\n                                    m_FontCharacterTable.Add(new TMP_Character(unicode, glyph));\n                                }\n                            }\n\n                            // \n                            foreach (Glyph glyph in m_GlyphsToPack)\n                            {\n                                foreach (uint unicode in m_GlyphLookupMap[glyph.index])\n                                {\n                                    m_ExcludedCharacters.Add(unicode);\n                                }\n                            }\n\n                            // Get the face info for the current sampling point size.\n                            m_FaceInfo = FontEngine.GetFaceInfo();\n\n                            autoEvent.Set();\n                        });\n\n                        // Worker thread to render glyphs in texture buffer.\n                        ThreadPool.QueueUserWorkItem(RenderGlyphs =>\n                        {\n                            autoEvent.WaitOne();\n\n                            // Start Stop Watch\n                            m_StopWatch = System.Diagnostics.Stopwatch.StartNew();\n\n                            m_IsRenderingDone = false;\n\n                            // Allocate texture data\n                            m_AtlasTextureBuffer = new byte[m_AtlasWidth * m_AtlasHeight];\n\n                            m_AtlasGenerationProgressLabel = \"Rendering glyphs...\";\n\n                            // Render and add glyphs to the given atlas texture.\n                            if (m_GlyphsToRender.Count > 0)\n                            {\n                                FontEngine.RenderGlyphsToTexture(m_GlyphsToRender, m_Padding, m_GlyphRenderMode, m_AtlasTextureBuffer, m_AtlasWidth, m_AtlasHeight);\n                            }\n\n                            m_IsRenderingDone = true;\n\n                            // Stop StopWatch\n                            m_StopWatch.Stop();\n                            m_GlyphRenderingGenerationTime = m_StopWatch.Elapsed.TotalMilliseconds;\n                            Debug.Log(\"Font Atlas generation completed in: \" + m_GlyphRenderingGenerationTime.ToString(\"0.000 ms.\"));\n                            m_StopWatch.Reset();\n                        });\n                    }\n\n                    SaveCreationSettingsToEditorPrefs(SaveFontCreationSettings());\n                }\n            }\n\n            // FONT RENDERING PROGRESS BAR\n            GUILayout.Space(1);\n            Rect progressRect = EditorGUILayout.GetControlRect(false, 20);\n\n            GUI.enabled = true;\n            progressRect.width -= 22;\n            EditorGUI.ProgressBar(progressRect, Mathf.Max(0.01f, m_AtlasGenerationProgress), m_AtlasGenerationProgressLabel);\n            progressRect.x = progressRect.x + progressRect.width + 2;\n            progressRect.y -= 1;\n            progressRect.width = 20;\n            progressRect.height = 20;\n\n            GUI.enabled = m_IsProcessing;\n            if (GUI.Button(progressRect, \"X\"))\n            {\n                FontEngine.SendCancellationRequest();\n                m_AtlasGenerationProgress = 0;\n                m_IsProcessing = false;\n                m_IsGenerationCancelled = true;\n            }\n            GUILayout.Space(5);\n\n            // FONT STATUS & INFORMATION\n            GUI.enabled = true;\n            \n            GUILayout.BeginVertical(EditorStyles.helpBox, GUILayout.Height(200));\n            m_OutputScrollPosition = EditorGUILayout.BeginScrollView(m_OutputScrollPosition);\n            EditorGUILayout.LabelField(m_OutputFeedback, TMP_UIStyleManager.label);\n            EditorGUILayout.EndScrollView();\n            GUILayout.EndVertical();\n\n            // SAVE TEXTURE & CREATE and SAVE FONT XML FILE\n            GUI.enabled = m_FontAtlasTexture != null && !m_IsProcessing;    // Enable Save Button if font_Atlas is not Null.\n            \n            EditorGUILayout.BeginHorizontal();\n                \n            if (GUILayout.Button(\"Save\") && GUI.enabled)\n            {\n                if (m_SelectedFontAsset == null)\n                {\n                    if (m_LegacyFontAsset != null)\n                        SaveNewFontAssetWithSameName(m_LegacyFontAsset);\n                    else\n                        SaveNewFontAsset(m_SourceFontFile);\n                }\n                else\n                {\n                    // Save over exiting Font Asset\n                    string filePath = Path.GetFullPath(AssetDatabase.GetAssetPath(m_SelectedFontAsset)).Replace('\\\\', '/');\n\n                    if (((GlyphRasterModes)m_GlyphRenderMode & GlyphRasterModes.RASTER_MODE_BITMAP) == GlyphRasterModes.RASTER_MODE_BITMAP)\n                            Save_Bitmap_FontAsset(filePath);\n                        else\n                        Save_SDF_FontAsset(filePath);\n                }\n            }\n            if (GUILayout.Button(\"Save as...\") && GUI.enabled)\n            {\n                if (m_SelectedFontAsset == null)\n                {\n                    SaveNewFontAsset(m_SourceFontFile);\n                }\n                else\n                {\n                    SaveNewFontAssetWithSameName(m_SelectedFontAsset);\n                }\n            }\n                \n            EditorGUILayout.EndHorizontal();\n\n            EditorGUILayout.Space();\n\n            EditorGUILayout.EndVertical();\n            \n            GUI.enabled = true; // Re-enable GUI\n\n            if (position.height > position.width || position.width < k_TwoColumnControlsWidth)\n            {\n                DrawPreview();\n                GUILayout.Space(5);\n            }\n            \n            EditorGUILayout.EndScrollView();\n\n            if (m_IsFontAtlasInvalid)\n                ClearGeneratedData();\n        }\n\n\n        /// <summary>\n        /// Clear the previously generated data.\n        /// </summary>\n        void ClearGeneratedData()\n        {\n            m_IsFontAtlasInvalid = false;\n\n            if (m_FontAtlasTexture != null && !EditorUtility.IsPersistent(m_FontAtlasTexture))\n            {\n                DestroyImmediate(m_FontAtlasTexture);\n                m_FontAtlasTexture = null;\n            }\n        \n            m_AtlasGenerationProgressLabel = string.Empty;\n            m_AtlasGenerationProgress = 0;\n            m_SavedFontAtlas = null;\n\n            m_OutputFeedback = string.Empty;\n            m_WarningMessage = string.Empty;\n        }\n\n\n        /// <summary>\n        /// Function to update the feedback window showing the results of the latest generation.\n        /// </summary>\n        void UpdateRenderFeedbackWindow()\n        {\n            m_PointSize = m_FaceInfo.pointSize;\n\n            string missingGlyphReport = string.Empty;\n\n            //string colorTag = m_FontCharacterTable.Count == m_CharacterCount ? \"<color=#C0ffff>\" : \"<color=#ffff00>\";\n            string colorTag2 = \"<color=#C0ffff>\";\n\n            missingGlyphReport = \"Font: <b>\" + colorTag2 + m_FaceInfo.familyName + \"</color></b>  Style: <b>\" + colorTag2 + m_FaceInfo.styleName + \"</color></b>\";\n\n            missingGlyphReport += \"\\nPoint Size: <b>\" + colorTag2 + m_FaceInfo.pointSize + \"</color></b>   SP/PD Ratio: <b>\" + colorTag2 +  ((float)m_Padding / m_FaceInfo.pointSize).ToString(\"0.0%\" + \"</color></b>\");\n\n            missingGlyphReport += \"\\n\\nCharacters included: <color=#ffff00><b>\" + m_FontCharacterTable.Count + \"/\" + m_CharacterCount + \"</b></color>\";\n            missingGlyphReport += \"\\nMissing characters: <color=#ffff00><b>\" + m_MissingCharacters.Count + \"</b></color>\";\n            missingGlyphReport += \"\\nExcluded characters: <color=#ffff00><b>\" + m_ExcludedCharacters.Count + \"</b></color>\";\n\n            // Report characters missing from font file\n            missingGlyphReport += \"\\n\\n<b><color=#ffff00>Characters missing from font file:</color></b>\";\n            missingGlyphReport += \"\\n----------------------------------------\";\n            \n            m_OutputFeedback = missingGlyphReport;\n\n            for (int i = 0; i < m_MissingCharacters.Count; i++)\n            {\n                missingGlyphReport += \"\\nID: <color=#C0ffff>\" + m_MissingCharacters[i] + \"\\t</color>Hex: <color=#C0ffff>\" + m_MissingCharacters[i].ToString(\"X\") + \"\\t</color>Char [<color=#C0ffff>\" + (char)m_MissingCharacters[i] + \"</color>]\";\n\n                if (missingGlyphReport.Length < 16300)\n                    m_OutputFeedback = missingGlyphReport;\n            }\n\n            // Report characters that did not fit in the atlas texture\n            missingGlyphReport += \"\\n\\n<b><color=#ffff00>Characters excluded from packing:</color></b>\";\n            missingGlyphReport += \"\\n----------------------------------------\";\n\n            for (int i = 0; i < m_ExcludedCharacters.Count; i++)\n                {\n                missingGlyphReport += \"\\nID: <color=#C0ffff>\" + m_ExcludedCharacters[i] + \"\\t</color>Hex: <color=#C0ffff>\" + m_ExcludedCharacters[i].ToString(\"X\") + \"\\t</color>Char [<color=#C0ffff>\" + (char)m_ExcludedCharacters[i] + \"</color>]\";\n\n                    if (missingGlyphReport.Length < 16300)\n                    m_OutputFeedback = missingGlyphReport;\n            }\n\n            if (missingGlyphReport.Length > 16300)\n                m_OutputFeedback += \"\\n\\n<color=#ffff00>Report truncated.</color>\\n<color=#c0ffff>See</color> \\\"TextMesh Pro\\\\Glyph Report.txt\\\"\";\n\n            // Save Missing Glyph Report file\n            if (Directory.Exists(\"Assets/TextMesh Pro\"))\n            {\n                missingGlyphReport = System.Text.RegularExpressions.Regex.Replace(missingGlyphReport, @\"<[^>]*>\", string.Empty);\n                File.WriteAllText(\"Assets/TextMesh Pro/Glyph Report.txt\", missingGlyphReport);\n                AssetDatabase.Refresh();\n            }\n        }\n\n\n        void CreateFontAtlasTexture()\n        {\n            if (m_FontAtlasTexture != null)\n                DestroyImmediate(m_FontAtlasTexture);\n\n            m_FontAtlasTexture = new Texture2D(m_AtlasWidth, m_AtlasHeight, TextureFormat.Alpha8, false, true);\n\n            Color32[] colors = new Color32[m_AtlasWidth * m_AtlasHeight];\n\n            for (int i = 0; i < colors.Length; i++)\n            {\n                byte c = m_AtlasTextureBuffer[i];\n                colors[i] = new Color32(c, c, c, c);\n            }\n\n            // Clear allocation of \n            m_AtlasTextureBuffer = null;\n\n            if ((m_GlyphRenderMode & GlyphRenderMode.RASTER) == GlyphRenderMode.RASTER || (m_GlyphRenderMode & GlyphRenderMode.RASTER_HINTED) == GlyphRenderMode.RASTER_HINTED)\n                m_FontAtlasTexture.filterMode = FilterMode.Point;\n\n            m_FontAtlasTexture.SetPixels32(colors, 0);\n            m_FontAtlasTexture.Apply(false, false);\n\n            // Saving File for Debug\n            //var pngData = m_FontAtlasTexture.EncodeToPNG();\n            //File.WriteAllBytes(\"Assets/Textures/Debug Font Texture.png\", pngData);\n        }\n\n\n        /// <summary>\n        /// Open Save Dialog to provide the option save the font asset using the name of the source font file. This also appends SDF to the name if using any of the SDF Font Asset creation modes.\n        /// </summary>\n        /// <param name=\"sourceObject\"></param>\n        void SaveNewFontAsset(Object sourceObject)\n        {\n            string filePath;\n            \n            // Save new Font Asset and open save file requester at Source Font File location.\n            string saveDirectory = new FileInfo(AssetDatabase.GetAssetPath(sourceObject)).DirectoryName;\n\n            if (((GlyphRasterModes)m_GlyphRenderMode & GlyphRasterModes.RASTER_MODE_BITMAP) == GlyphRasterModes.RASTER_MODE_BITMAP)\n            {\n                filePath = EditorUtility.SaveFilePanel(\"Save TextMesh Pro! Font Asset File\", saveDirectory, sourceObject.name, \"asset\");\n\n                if (filePath.Length == 0)\n                    return;\n\n                Save_Bitmap_FontAsset(filePath);\n            }\n            else\n            {\n                filePath = EditorUtility.SaveFilePanel(\"Save TextMesh Pro! Font Asset File\", saveDirectory, sourceObject.name + \" SDF\", \"asset\");\n\n                if (filePath.Length == 0)\n                    return;\n\n                Save_SDF_FontAsset(filePath);\n            }\n        }\n\n\n        /// <summary>\n        /// Open Save Dialog to provide the option to save the font asset under the same name.\n        /// </summary>\n        /// <param name=\"sourceObject\"></param>\n        void SaveNewFontAssetWithSameName(Object sourceObject)\n        {\n            string filePath;\n\n            // Save new Font Asset and open save file requester at Source Font File location.\n            string saveDirectory = new FileInfo(AssetDatabase.GetAssetPath(sourceObject)).DirectoryName;\n\n            filePath = EditorUtility.SaveFilePanel(\"Save TextMesh Pro! Font Asset File\", saveDirectory, sourceObject.name, \"asset\");\n\n            if (filePath.Length == 0)\n                return;\n\n            if (((GlyphRasterModes)m_GlyphRenderMode & GlyphRasterModes.RASTER_MODE_BITMAP) == GlyphRasterModes.RASTER_MODE_BITMAP)\n            {\n                Save_Bitmap_FontAsset(filePath);\n            }\n            else\n            {\n                Save_SDF_FontAsset(filePath);\n            }\n        }\n\n\n        void Save_Bitmap_FontAsset(string filePath)\n        {\n            filePath = filePath.Substring(0, filePath.Length - 6); // Trim file extension from filePath.\n\n            string dataPath = Application.dataPath;\n\n            if (filePath.IndexOf(dataPath, System.StringComparison.InvariantCultureIgnoreCase) == -1)\n            {\n                Debug.LogError(\"You're saving the font asset in a directory outside of this project folder. This is not supported. Please select a directory under \\\"\" + dataPath + \"\\\"\");\n                return;\n            }\n\n            string relativeAssetPath = filePath.Substring(dataPath.Length - 6);\n            string tex_DirName = Path.GetDirectoryName(relativeAssetPath);\n            string tex_FileName = Path.GetFileNameWithoutExtension(relativeAssetPath);\n            string tex_Path_NoExt = tex_DirName + \"/\" + tex_FileName;\n\n            // Check if TextMeshPro font asset already exists. If not, create a new one. Otherwise update the existing one.\n            TMP_FontAsset fontAsset = AssetDatabase.LoadAssetAtPath(tex_Path_NoExt + \".asset\", typeof(TMP_FontAsset)) as TMP_FontAsset;\n            if (fontAsset == null)\n            {\n                //Debug.Log(\"Creating TextMeshPro font asset!\");\n                fontAsset = ScriptableObject.CreateInstance<TMP_FontAsset>(); // Create new TextMeshPro Font Asset.\n                AssetDatabase.CreateAsset(fontAsset, tex_Path_NoExt + \".asset\");\n\n                // Set version number of font asset\n                fontAsset.version = \"1.1.0\";\n\n                //Set Font Asset Type\n                fontAsset.atlasRenderMode = m_GlyphRenderMode;\n\n                // Reference to the source font file GUID.\n                fontAsset.m_SourceFontFileGUID = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(m_SourceFontFile));\n\n                // Add FaceInfo to Font Asset\n                fontAsset.faceInfo = m_FaceInfo;\n\n                // Add GlyphInfo[] to Font Asset\n                fontAsset.glyphTable = m_FontGlyphTable;\n\n                // Add CharacterTable[] to font asset.\n                fontAsset.characterTable = m_FontCharacterTable;\n\n                // Sort glyph and character tables.\n                fontAsset.SortGlyphAndCharacterTables();\n\n                // Get and Add Kerning Pairs to Font Asset\n                if (m_IncludeFontFeatures)\n                    fontAsset.fontFeatureTable = GetKerningTable();\n\n\n                // Add Font Atlas as Sub-Asset\n                fontAsset.atlasTextures = new Texture2D[] { m_FontAtlasTexture };\n                m_FontAtlasTexture.name = tex_FileName + \" Atlas\";\n                fontAsset.atlasWidth = m_AtlasWidth;\n                fontAsset.atlasHeight = m_AtlasHeight;\n                fontAsset.atlasPadding = m_Padding;\n\n                AssetDatabase.AddObjectToAsset(m_FontAtlasTexture, fontAsset);\n\n                // Create new Material and Add it as Sub-Asset\n                Shader default_Shader = Shader.Find(\"TextMeshPro/Bitmap\"); // m_shaderSelection;\n                Material tmp_material = new Material(default_Shader);\n                tmp_material.name = tex_FileName + \" Material\";\n                tmp_material.SetTexture(ShaderUtilities.ID_MainTex, m_FontAtlasTexture);\n                fontAsset.material = tmp_material;\n\n                AssetDatabase.AddObjectToAsset(tmp_material, fontAsset);\n\n            }\n            else\n            {\n                // Find all Materials referencing this font atlas.\n                Material[] material_references = TMP_EditorUtility.FindMaterialReferences(fontAsset);\n\n                // Set version number of font asset\n                fontAsset.version = \"1.1.0\";\n\n                // Special handling to remove legacy font asset data\n                if (fontAsset.m_glyphInfoList != null && fontAsset.m_glyphInfoList.Count > 0)\n                    fontAsset.m_glyphInfoList = null;\n\n                // Destroy Assets that will be replaced.\n                if (fontAsset.atlasTextures != null && fontAsset.atlasTextures.Length > 0)\n                    DestroyImmediate(fontAsset.atlasTextures[0], true);\n\n                //Set Font Asset Type\n                fontAsset.atlasRenderMode = m_GlyphRenderMode;\n\n                // Add FaceInfo to Font Asset\n                fontAsset.faceInfo = m_FaceInfo;\n\n                // Add GlyphInfo[] to Font Asset\n                fontAsset.glyphTable = m_FontGlyphTable;\n\n                // Add CharacterTable[] to font asset.\n                fontAsset.characterTable = m_FontCharacterTable;\n\n                // Sort glyph and character tables.\n                fontAsset.SortGlyphAndCharacterTables();\n\n                // Get and Add Kerning Pairs to Font Asset\n                if (m_IncludeFontFeatures)\n                    fontAsset.fontFeatureTable = GetKerningTable();\n\n                // Add Font Atlas as Sub-Asset\n                fontAsset.atlasTextures = new Texture2D[] { m_FontAtlasTexture };\n                m_FontAtlasTexture.name = tex_FileName + \" Atlas\";\n                fontAsset.atlasWidth = m_AtlasWidth;\n                fontAsset.atlasHeight = m_AtlasHeight;\n                fontAsset.atlasPadding = m_Padding;\n\n                // Special handling due to a bug in earlier versions of Unity.\n                m_FontAtlasTexture.hideFlags = HideFlags.None;\n                fontAsset.material.hideFlags = HideFlags.None;\n\n                AssetDatabase.AddObjectToAsset(m_FontAtlasTexture, fontAsset);\n\n                // Assign new font atlas texture to the existing material.\n                fontAsset.material.SetTexture(ShaderUtilities.ID_MainTex, fontAsset.atlasTextures[0]);\n\n                // Update the Texture reference on the Material\n                for (int i = 0; i < material_references.Length; i++)\n                {\n                    material_references[i].SetTexture(ShaderUtilities.ID_MainTex, m_FontAtlasTexture);\n                }\n            }\n\n            // Add list of GlyphRects to font asset.\n            fontAsset.freeGlyphRects = m_FreeGlyphRects;\n            fontAsset.usedGlyphRects = m_UsedGlyphRects;\n\n            // Save Font Asset creation settings\n            m_SelectedFontAsset = fontAsset;\n            m_LegacyFontAsset = null;\n            fontAsset.creationSettings = SaveFontCreationSettings();\n\n            AssetDatabase.SaveAssets();\n\n            AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(fontAsset));  // Re-import font asset to get the new updated version.\n\n            //EditorUtility.SetDirty(font_asset);\n            fontAsset.ReadFontAssetDefinition();\n\n            AssetDatabase.Refresh();\n\n            m_FontAtlasTexture = null;\n\n            // NEED TO GENERATE AN EVENT TO FORCE A REDRAW OF ANY TEXTMESHPRO INSTANCES THAT MIGHT BE USING THIS FONT ASSET\n            TMPro_EventManager.ON_FONT_PROPERTY_CHANGED(true, fontAsset);\n        }\n\n\n        void Save_SDF_FontAsset(string filePath)\n        {\n            filePath = filePath.Substring(0, filePath.Length - 6); // Trim file extension from filePath.\n\n            string dataPath = Application.dataPath;\n\n            if (filePath.IndexOf(dataPath, System.StringComparison.InvariantCultureIgnoreCase) == -1)\n            {\n                Debug.LogError(\"You're saving the font asset in a directory outside of this project folder. This is not supported. Please select a directory under \\\"\" + dataPath + \"\\\"\");\n                return;\n            }\n\n            string relativeAssetPath = filePath.Substring(dataPath.Length - 6);\n            string tex_DirName = Path.GetDirectoryName(relativeAssetPath);\n            string tex_FileName = Path.GetFileNameWithoutExtension(relativeAssetPath);\n            string tex_Path_NoExt = tex_DirName + \"/\" + tex_FileName;\n\n\n            // Check if TextMeshPro font asset already exists. If not, create a new one. Otherwise update the existing one.\n            TMP_FontAsset fontAsset = AssetDatabase.LoadAssetAtPath<TMP_FontAsset>(tex_Path_NoExt + \".asset\");\n            if (fontAsset == null)\n            {\n                //Debug.Log(\"Creating TextMeshPro font asset!\");\n                fontAsset = ScriptableObject.CreateInstance<TMP_FontAsset>(); // Create new TextMeshPro Font Asset.\n                AssetDatabase.CreateAsset(fontAsset, tex_Path_NoExt + \".asset\");\n\n                // Set version number of font asset\n                fontAsset.version = \"1.1.0\";\n\n                // Reference to source font file GUID.\n                fontAsset.m_SourceFontFileGUID = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(m_SourceFontFile));\n\n                //Set Font Asset Type\n                fontAsset.atlasRenderMode = m_GlyphRenderMode;\n\n                // Add FaceInfo to Font Asset\n                fontAsset.faceInfo = m_FaceInfo;\n\n                // Add GlyphInfo[] to Font Asset\n                fontAsset.glyphTable = m_FontGlyphTable;\n\n                // Add CharacterTable[] to font asset.\n                fontAsset.characterTable = m_FontCharacterTable;\n\n                // Sort glyph and character tables.\n                fontAsset.SortGlyphAndCharacterTables();\n\n                // Get and Add Kerning Pairs to Font Asset\n                if (m_IncludeFontFeatures)\n                    fontAsset.fontFeatureTable = GetKerningTable();\n\n                // Add Font Atlas as Sub-Asset\n                fontAsset.atlasTextures = new Texture2D[] { m_FontAtlasTexture };\n                m_FontAtlasTexture.name = tex_FileName + \" Atlas\";\n                fontAsset.atlasWidth = m_AtlasWidth;\n                fontAsset.atlasHeight = m_AtlasHeight;\n                fontAsset.atlasPadding = m_Padding;\n\n                AssetDatabase.AddObjectToAsset(m_FontAtlasTexture, fontAsset);\n\n                // Create new Material and Add it as Sub-Asset\n                Shader default_Shader = Shader.Find(\"TextMeshPro/Distance Field\");\n                Material tmp_material = new Material(default_Shader);\n\n                tmp_material.name = tex_FileName + \" Material\";\n                tmp_material.SetTexture(ShaderUtilities.ID_MainTex, m_FontAtlasTexture);\n                tmp_material.SetFloat(ShaderUtilities.ID_TextureWidth, m_FontAtlasTexture.width);\n                tmp_material.SetFloat(ShaderUtilities.ID_TextureHeight, m_FontAtlasTexture.height);\n\n                int spread = m_Padding + 1;\n                tmp_material.SetFloat(ShaderUtilities.ID_GradientScale, spread); // Spread = Padding for Brute Force SDF.\n\n                tmp_material.SetFloat(ShaderUtilities.ID_WeightNormal, fontAsset.normalStyle);\n                tmp_material.SetFloat(ShaderUtilities.ID_WeightBold, fontAsset.boldStyle);\n\n                fontAsset.material = tmp_material;\n\n                AssetDatabase.AddObjectToAsset(tmp_material, fontAsset);\n\n            }\n            else\n            {\n                // Find all Materials referencing this font atlas.\n                Material[] material_references = TMP_EditorUtility.FindMaterialReferences(fontAsset);\n\n                // Destroy Assets that will be replaced.\n                if (fontAsset.atlasTextures != null && fontAsset.atlasTextures.Length > 0)\n                    DestroyImmediate(fontAsset.atlasTextures[0], true);\n\n                // Set version number of font asset\n                fontAsset.version = \"1.1.0\";\n\n                // Special handling to remove legacy font asset data\n                if (fontAsset.m_glyphInfoList != null && fontAsset.m_glyphInfoList.Count > 0)\n                    fontAsset.m_glyphInfoList = null;\n\n                //Set Font Asset Type\n                fontAsset.atlasRenderMode = m_GlyphRenderMode;\n\n                // Add FaceInfo to Font Asset  \n                fontAsset.faceInfo = m_FaceInfo;\n\n                // Add GlyphInfo[] to Font Asset\n                fontAsset.glyphTable = m_FontGlyphTable;\n\n                // Add CharacterTable[] to font asset.\n                fontAsset.characterTable = m_FontCharacterTable;\n\n                // Sort glyph and character tables.\n                fontAsset.SortGlyphAndCharacterTables();\n\n                // Get and Add Kerning Pairs to Font Asset\n                // TODO: Check and preserve existing adjustment pairs.\n                if (m_IncludeFontFeatures)\n                    fontAsset.fontFeatureTable = GetKerningTable();\n\n                // Add Font Atlas as Sub-Asset\n                fontAsset.atlasTextures = new Texture2D[] { m_FontAtlasTexture };\n                m_FontAtlasTexture.name = tex_FileName + \" Atlas\";\n                fontAsset.atlasWidth = m_AtlasWidth;\n                fontAsset.atlasHeight = m_AtlasHeight;\n                fontAsset.atlasPadding = m_Padding;\n\n                // Special handling due to a bug in earlier versions of Unity.\n                m_FontAtlasTexture.hideFlags = HideFlags.None;\n                fontAsset.material.hideFlags = HideFlags.None;\n\n                AssetDatabase.AddObjectToAsset(m_FontAtlasTexture, fontAsset);\n\n                // Assign new font atlas texture to the existing material.\n                fontAsset.material.SetTexture(ShaderUtilities.ID_MainTex, fontAsset.atlasTextures[0]);\n\n                // Update the Texture reference on the Material\n                for (int i = 0; i < material_references.Length; i++)\n                {\n                    material_references[i].SetTexture(ShaderUtilities.ID_MainTex, m_FontAtlasTexture);\n                    material_references[i].SetFloat(ShaderUtilities.ID_TextureWidth, m_FontAtlasTexture.width);\n                    material_references[i].SetFloat(ShaderUtilities.ID_TextureHeight, m_FontAtlasTexture.height);\n\n                    int spread = m_Padding + 1;\n                    material_references[i].SetFloat(ShaderUtilities.ID_GradientScale, spread); // Spread = Padding for Brute Force SDF.\n\n                    material_references[i].SetFloat(ShaderUtilities.ID_WeightNormal, fontAsset.normalStyle);\n                    material_references[i].SetFloat(ShaderUtilities.ID_WeightBold, fontAsset.boldStyle);\n                }\n            }\n\n            // Saving File for Debug\n            //var pngData = destination_Atlas.EncodeToPNG();\n            //File.WriteAllBytes(\"Assets/Textures/Debug Distance Field.png\", pngData);\n\n            // Add list of GlyphRects to font asset.\n            fontAsset.freeGlyphRects = m_FreeGlyphRects;\n            fontAsset.usedGlyphRects = m_UsedGlyphRects;\n\n            // Save Font Asset creation settings\n            m_SelectedFontAsset = fontAsset;\n            m_LegacyFontAsset = null;\n            fontAsset.creationSettings = SaveFontCreationSettings();\n\n            AssetDatabase.SaveAssets();\n\n            AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(fontAsset));  // Re-import font asset to get the new updated version.\n\n            fontAsset.ReadFontAssetDefinition();\n\n            AssetDatabase.Refresh();\n\n            m_FontAtlasTexture = null;\n\n            // NEED TO GENERATE AN EVENT TO FORCE A REDRAW OF ANY TEXTMESHPRO INSTANCES THAT MIGHT BE USING THIS FONT ASSET\n            TMPro_EventManager.ON_FONT_PROPERTY_CHANGED(true, fontAsset);\n        }\n\n\n        /// <summary>\n        /// Internal method to save the Font Asset Creation Settings\n        /// </summary>\n        /// <returns></returns>\n        FontAssetCreationSettings SaveFontCreationSettings()\n        {\n            FontAssetCreationSettings settings = new FontAssetCreationSettings();\n\n            //settings.sourceFontFileName = m_SourceFontFile.name;\n            settings.sourceFontFileGUID = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(m_SourceFontFile));\n            settings.pointSizeSamplingMode = m_PointSizeSamplingMode;\n            settings.pointSize = m_PointSize;\n            settings.padding = m_Padding;\n            settings.packingMode = (int)m_PackingMode;\n            settings.atlasWidth = m_AtlasWidth;\n            settings.atlasHeight = m_AtlasHeight;\n            settings.characterSetSelectionMode = m_CharacterSetSelectionMode;\n            settings.characterSequence = m_CharacterSequence;\n            settings.referencedFontAssetGUID = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(m_ReferencedFontAsset));\n            settings.referencedTextAssetGUID = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(m_CharactersFromFile));\n            //settings.fontStyle = (int)m_FontStyle;\n            //settings.fontStyleModifier = m_FontStyleValue;\n            settings.renderMode = (int)m_GlyphRenderMode;\n            settings.includeFontFeatures = m_IncludeFontFeatures;\n\n            return settings;\n        }\n\n\n        /// <summary>\n        /// Internal method to load the Font Asset Creation Settings\n        /// </summary>\n        /// <param name=\"settings\"></param>\n        void LoadFontCreationSettings(FontAssetCreationSettings settings)\n        {\n            m_SourceFontFile = AssetDatabase.LoadAssetAtPath<Font>(AssetDatabase.GUIDToAssetPath(settings.sourceFontFileGUID));\n            m_PointSizeSamplingMode  = settings.pointSizeSamplingMode;\n            m_PointSize = settings.pointSize;\n            m_Padding = settings.padding;\n            m_PackingMode = (FontPackingModes)settings.packingMode;\n            m_AtlasWidth = settings.atlasWidth;\n            m_AtlasHeight = settings.atlasHeight;\n            m_CharacterSetSelectionMode = settings.characterSetSelectionMode;\n            m_CharacterSequence = settings.characterSequence;\n            m_ReferencedFontAsset = AssetDatabase.LoadAssetAtPath<TMP_FontAsset>(AssetDatabase.GUIDToAssetPath(settings.referencedFontAssetGUID));\n            m_CharactersFromFile = AssetDatabase.LoadAssetAtPath<TextAsset>(AssetDatabase.GUIDToAssetPath(settings.referencedTextAssetGUID));\n            //m_FontStyle = (FaceStyles)settings.fontStyle;\n            //m_FontStyleValue = settings.fontStyleModifier;\n            m_GlyphRenderMode = (GlyphRenderMode)settings.renderMode;\n            m_IncludeFontFeatures = settings.includeFontFeatures;\n        }\n\n\n        /// <summary>\n        /// Save the latest font asset creation settings to EditorPrefs.\n        /// </summary>\n        /// <param name=\"settings\"></param>\n        void SaveCreationSettingsToEditorPrefs(FontAssetCreationSettings settings)\n        {\n            // Create new list if one does not already exist\n            if (m_FontAssetCreationSettingsContainer == null)\n            {\n                m_FontAssetCreationSettingsContainer = new FontAssetCreationSettingsContainer();\n                m_FontAssetCreationSettingsContainer.fontAssetCreationSettings = new List<FontAssetCreationSettings>();\n            }\n\n            // Add new creation settings to the list\n            m_FontAssetCreationSettingsContainer.fontAssetCreationSettings.Add(settings);\n\n            // Since list should only contain the most 4 recent settings, we remove the first element if list exceeds 4 elements.\n            if (m_FontAssetCreationSettingsContainer.fontAssetCreationSettings.Count > 4)\n                m_FontAssetCreationSettingsContainer.fontAssetCreationSettings.RemoveAt(0);\n\n            m_FontAssetCreationSettingsCurrentIndex = m_FontAssetCreationSettingsContainer.fontAssetCreationSettings.Count - 1;\n\n            // Serialize list to JSON\n            string serializedSettings = JsonUtility.ToJson(m_FontAssetCreationSettingsContainer, true);\n\n            EditorPrefs.SetString(k_FontAssetCreationSettingsContainerKey, serializedSettings);\n        }\n\n        void DrawPreview()\n        {\n            Rect pixelRect;\n            if (position.width > position.height && position.width > k_TwoColumnControlsWidth)\n            {\n                float minSide = Mathf.Min(position.height - 15f, position.width - k_TwoColumnControlsWidth);\n\n                EditorGUILayout.BeginVertical(EditorStyles.helpBox, GUILayout.MaxWidth(minSide));\n\n                pixelRect = GUILayoutUtility.GetRect(minSide, minSide, GUILayout.ExpandHeight(false), GUILayout.ExpandWidth(false));\n            }\n            else\n            {\n                EditorGUILayout.BeginVertical(EditorStyles.helpBox);\n\n                pixelRect = GUILayoutUtility.GetAspectRect(1f);\n            }\n            \n            if (m_FontAtlasTexture != null)\n            {\n                EditorGUI.DrawTextureAlpha(pixelRect, m_FontAtlasTexture, ScaleMode.StretchToFill);\n            }\n            else if (m_SavedFontAtlas != null)\n            {\n                EditorGUI.DrawTextureAlpha(pixelRect, m_SavedFontAtlas, ScaleMode.StretchToFill);\n            }\n\n            EditorGUILayout.EndVertical();\n        }\n\n\n        void CheckForLegacyGlyphRenderMode()\n        {\n            // Special handling for legacy glyph render mode\n            if ((int)m_GlyphRenderMode < 0x100)\n            {\n                switch ((int)m_GlyphRenderMode)\n                {\n                    case 0:\n                        m_GlyphRenderMode = GlyphRenderMode.SMOOTH_HINTED;\n                        break;\n                    case 1:\n                        m_GlyphRenderMode = GlyphRenderMode.SMOOTH;\n                        break;\n                    case 2:\n                        m_GlyphRenderMode = GlyphRenderMode.RASTER_HINTED;\n                        break;\n                    case 3:\n                        m_GlyphRenderMode = GlyphRenderMode.RASTER;\n                        break;\n                    case 6:\n                    case 7:\n                        m_GlyphRenderMode = GlyphRenderMode.SDFAA;\n                        break;\n                }\n            }\n        }\n\n\n        // Get Kerning Pairs\n        public TMP_FontFeatureTable GetKerningTable()\n        {\n            GlyphPairAdjustmentRecord[] adjustmentRecords = FontEngine.GetGlyphPairAdjustmentTable(m_AvailableGlyphsToAdd.ToArray());\n\n            if (adjustmentRecords == null)\n                return null;\n\n            TMP_FontFeatureTable fontFeatureTable = new TMP_FontFeatureTable();\n\n            for (int i = 0; i < adjustmentRecords.Length; i++)\n            {\n                fontFeatureTable.glyphPairAdjustmentRecords.Add(new TMP_GlyphPairAdjustmentRecord(adjustmentRecords[i]));\n            }\n\n            fontFeatureTable.SortGlyphPairAdjustmentRecords();\n\n            return fontFeatureTable;\n        }\n    }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_FontAssetCreatorWindow.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 383966e89d344865a36addd5d378ffd3\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_FontPlugin.cs",
    "content": "using UnityEngine;\nusing UnityEditor;\nusing System.Collections;\nusing System;\nusing System.Runtime.InteropServices;\n\n\nnamespace TMPro.EditorUtilities \n{\n    /*\n    public class TMPro_FontPlugin\n    {\n        [UnmanagedFunctionPointer(CallingConvention.StdCall)]\n        private delegate void DebugLog(string log);\n        private static readonly DebugLog debugLog = DebugWrapper;\n        private static readonly IntPtr functionPointer = Marshal.GetFunctionPointerForDelegate(debugLog);\n\n        private static void DebugWrapper(string log)\n        {\n            Debug.Log(log);\n        }\n\n        public static void LinkDebugLog()\n        {\n            LinkDebug(functionPointer);\n        }\n\n        [DllImport(\"TMPro_Plugin\")]\n        private static extern void LinkDebug([MarshalAs(UnmanagedType.FunctionPtr)]IntPtr debugCall);\n\n        [DllImport(\"TMPro_Plugin\")]\n        public static extern\n            int Initialize_FontEngine();\n\n        [DllImport(\"TMPro_Plugin\")]\n        public static extern\n            int Destroy_FontEngine();\n\n        [DllImport(\"TMPro_Plugin\")]\n        public static extern\n            int Load_TrueType_Font(string fontPath);\n\n        [DllImport(\"TMPro_Plugin\")]\n        public static extern\n            int FT_Size_Font(int fontSize);\n\n        [DllImport(\"TMPro_Plugin\")]\n        public static extern\n            int Render_Character(byte[] buffer_fill, byte[] buffer_edge, int buffer_width, int buffer_height, int offset, int asc, FaceStyles style, float thickness, RenderModes rasterMode, ref FT_GlyphInfo glyphInfo);\n\n        [DllImport(\"TMPro_Plugin\")]\n        public static extern\n            int Render_Characters(byte[] buffer, int buffer_width, int buffer_height, int character_padding, int[] asc_set, int char_count, FaceStyles style, float style_mod, bool autoSize, RenderModes renderMode, int method, ref FT_FaceInfo fontData, FT_GlyphInfo[] Output);\n\n        [DllImport(\"TMPro_Plugin\")]\n        public static extern\n            int FT_GetKerningPairs(string fontPath, int[] characterSet, int setCount, FT_KerningPair[] kerningPairs);\n\n        [DllImport(\"TMPro_Plugin\")]\n        public static extern\n            float Check_RenderProgress();\n\n        [DllImport(\"TMPro_Plugin\")]\n        internal static extern\n            void SendCancellationRequest(CancellationRequestType request);\n    }\n\n        public enum FaceStyles { Normal, Bold, Italic, Bold_Italic, Outline, Bold_Sim };\n        public enum RenderModes { HintedSmooth = 0, Smooth = 1, RasterHinted = 2, Raster = 3, DistanceField16 = 6, DistanceField32 = 7 };  // SignedDistanceField64 = 8\n\n        internal enum CancellationRequestType : byte { None = 0x0, CancelInProgess = 0x1, WindowClosed = 0x2 };\n\n        [StructLayout(LayoutKind.Sequential)]\n        public struct FT_KerningPair\n        {\n            public int ascII_Left;\n            public int ascII_Right;\n            public float xAdvanceOffset;\n        }\n    \n    \n        [StructLayout(LayoutKind.Sequential)]\n        public struct FT_GlyphInfo\n        {\n            public int id;\n            public float x;\n            public float y;\n            public float width;\n            public float height;\n            public float xOffset;\n            public float yOffset;\n            public float xAdvance;\n        }\n\n\n        [StructLayout(LayoutKind.Sequential)] \n        public struct FT_FaceInfo\n        {\n            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]\n            public string name;\n            public int pointSize;\n            public int padding;\n            public float lineHeight;\n            public float baseline;\n            public float ascender;\n            public float descender;\n            public float centerLine;\n            public float underline;\n            public float underlineThickness;\n            public int characterCount;\n            public int atlasWidth;\n            public int atlasHeight;\n        }\n     */\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_FontPlugin.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 9edc9283e7d6409fab242fe8fb6a822c\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_SortingLayerHelper.cs",
    "content": "﻿/*\n * Copyright (c) 2014, Nick Gravelyn.\n *\n * This software is provided 'as-is', without any express or implied\n * warranty. In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n *    1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n *\n *    2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n *\n *    3. This notice may not be removed or altered from any source\n *    distribution.\n */\n\nusing UnityEngine;\nusing UnityEditor;\nusing System;\nusing System.Reflection;\n\nnamespace TMPro\n{\n    // Helpers used by the different sorting layer classes.\n    public static class SortingLayerHelper\n    {\n        private static Type _utilityType;\n        private static PropertyInfo _sortingLayerNamesProperty;\n        private static MethodInfo _getSortingLayerUserIdMethod;\n\n        static SortingLayerHelper()\n        {\n            _utilityType = Type.GetType(\"UnityEditorInternal.InternalEditorUtility, UnityEditor\");\n            _sortingLayerNamesProperty = _utilityType.GetProperty(\"sortingLayerNames\", BindingFlags.Static | BindingFlags.NonPublic);\n            _getSortingLayerUserIdMethod = _utilityType.GetMethod(\"GetSortingLayerUniqueID\", BindingFlags.Static | BindingFlags.NonPublic);\n        }\n\n        // Gets an array of sorting layer names.\n        // Since this uses reflection, callers should check for 'null' which will be returned if the reflection fails.\n        public static string[] sortingLayerNames\n        {\n            get\n            {\n                if (_sortingLayerNamesProperty == null)\n                {\n                    return null;\n                }\n\n                return _sortingLayerNamesProperty.GetValue(null, null) as string[];\n            }\n        }\n\n        // Given the ID of a sorting layer, returns the sorting layer's name\n        public static string GetSortingLayerNameFromID(int id)\n        {\n            string[] names = sortingLayerNames;\n            if (names == null)\n            {\n                return null;\n            }\n\n            for (int i = 0; i < names.Length; i++)\n            {\n                if (GetSortingLayerIDForIndex(i) == id)\n                {\n                    return names[i];\n                }\n            }\n\n            return null;\n        }\n\n        // Given the name of a sorting layer, returns the ID.\n        public static int GetSortingLayerIDForName(string name)\n        {\n            string[] names = sortingLayerNames;\n            if (names == null)\n            {\n                return 0;\n            }\n\n            return GetSortingLayerIDForIndex(Array.IndexOf(names, name));\n        }\n\n        // Helper to convert from a sorting layer INDEX to a sorting layer ID. These are not the same thing.\n        // IDs are based on the order in which layers were created and do not change when reordering the layers.\n        // Thankfully there is a private helper we can call to get the ID for a layer given its index.\n        public static int GetSortingLayerIDForIndex(int index)\n        {\n            if (_getSortingLayerUserIdMethod == null)\n            {\n                return 0;\n            }\n\n            return (int)_getSortingLayerUserIdMethod.Invoke(null, new object[] { index });\n        }\n    }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_SortingLayerHelper.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 88ed537c17c34f339121fe9a7d6d7a0e\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_TextContainerEditor.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.Collections;\n\n\nnamespace TMPro.EditorUtilities\n{\n    [CustomEditor(typeof(TextContainer)), CanEditMultipleObjects]\n    public class TMPro_TextContainerEditor : Editor\n    {\n        \n        // Serialized Properties \n        private SerializedProperty anchorPosition_prop;\n        private SerializedProperty pivot_prop;\n        private SerializedProperty rectangle_prop;\n        private SerializedProperty margins_prop;\n       \n\n        private TextContainer m_textContainer;\n        //private Transform m_transform;\n        //private Vector3[] m_Rect_handlePoints = new Vector3[4];\n        //private Vector3[] m_Margin_handlePoints = new Vector3[4];\n\n        //private Vector2 m_anchorPosition;\n\n        //private Vector3 m_mousePreviousPOS;\n        //private Vector2 m_previousStartPOS;\n        //private int m_mouseDragFlag = 0;\n\n        //private static Transform m_visualHelper;\n\n\n        void OnEnable()\n        {\n         \n            // Serialized Properties\n            anchorPosition_prop = serializedObject.FindProperty(\"m_anchorPosition\");\n            pivot_prop = serializedObject.FindProperty(\"m_pivot\");\n            rectangle_prop = serializedObject.FindProperty(\"m_rect\"); \n            margins_prop = serializedObject.FindProperty(\"m_margins\");\n\n            m_textContainer = (TextContainer)target;\n            //m_transform = m_textContainer.transform;\n            \n\n            /*\n            if (m_visualHelper == null)\n            {\n                m_visualHelper = GameObject.CreatePrimitive(PrimitiveType.Sphere).transform;\n                m_visualHelper.localScale = new Vector3(0.25f, 0.25f, 0.25f);\n            }\n            */\n        }\n\n        void OnDisable()\n        {\n            /*\n            if (m_visualHelper != null)\n                DestroyImmediate (m_visualHelper.gameObject);\n            */\n        }\n\n     \n\n\n        public override void OnInspectorGUI()\n        {\n            serializedObject.Update();\n\n            EditorGUI.BeginChangeCheck();\n            EditorGUILayout.PropertyField(anchorPosition_prop);\n            if (anchorPosition_prop.enumValueIndex == 9)\n            {\n                EditorGUI.indentLevel += 1;\n                EditorGUILayout.PropertyField(pivot_prop, new GUIContent(\"Pivot Position\"));\n                EditorGUI.indentLevel -= 1;\n            }\n\n\n            DrawDimensionProperty(rectangle_prop, \"Dimensions\");\n            DrawMaginProperty(margins_prop, \"Margins\");\n            if (EditorGUI.EndChangeCheck())\n            {\n                // Re-compute pivot position when changes are made.\n                if (anchorPosition_prop.enumValueIndex != 9)\n                    pivot_prop.vector2Value = GetAnchorPosition(anchorPosition_prop.enumValueIndex);\n                \n                m_textContainer.hasChanged = true;\n            }\n\n            serializedObject.ApplyModifiedProperties();\n\n            EditorGUILayout.Space();\n        }\n\n\n        private void DrawDimensionProperty(SerializedProperty property, string label)\n        {\n            float old_LabelWidth = EditorGUIUtility.labelWidth;\n            float old_FieldWidth = EditorGUIUtility.fieldWidth;\n                     \n            Rect rect = EditorGUILayout.GetControlRect(false, 18);\n            Rect pos0 = new Rect(rect.x, rect.y + 2, rect.width, 18);\n\n            float width = rect.width + 3;\n            pos0.width = old_LabelWidth;\n            GUI.Label(pos0, label);\n\n            Rect rectangle = property.rectValue;\n            \n            float width_B = width - old_LabelWidth;\n            float fieldWidth = width_B / 4;\n            pos0.width = fieldWidth - 5;\n\n            pos0.x = old_LabelWidth + 15;\n            GUI.Label(pos0, \"Width\");\n\n            pos0.x += fieldWidth; \n            rectangle.width = EditorGUI.FloatField(pos0, GUIContent.none, rectangle.width);\n\n            pos0.x += fieldWidth;\n            GUI.Label(pos0, \"Height\");\n\n            pos0.x += fieldWidth; \n            rectangle.height = EditorGUI.FloatField(pos0, GUIContent.none, rectangle.height);\n\n            property.rectValue = rectangle;\n            EditorGUIUtility.labelWidth = old_LabelWidth;\n            EditorGUIUtility.fieldWidth = old_FieldWidth;\n        }\n\n\n        private void DrawMaginProperty(SerializedProperty property, string label)\n        {\n            float old_LabelWidth = EditorGUIUtility.labelWidth;\n            float old_FieldWidth = EditorGUIUtility.fieldWidth;\n          \n            Rect rect = EditorGUILayout.GetControlRect(false, 2 * 18);\n            Rect pos0 = new Rect(rect.x, rect.y + 2, rect.width, 18);\n\n            float width = rect.width + 3;\n            pos0.width = old_LabelWidth;\n            GUI.Label(pos0, label);\n\n            //Vector4 vec = property.vector4Value;\n            Vector4 vec = Vector4.zero;\n            vec.x = property.FindPropertyRelative(\"x\").floatValue;\n            vec.y = property.FindPropertyRelative(\"y\").floatValue;\n            vec.z = property.FindPropertyRelative(\"z\").floatValue;\n            vec.w = property.FindPropertyRelative(\"w\").floatValue;\n\n\n            float widthB = width - old_LabelWidth;\n            float fieldWidth = widthB / 4;\n            pos0.width = fieldWidth - 5;\n\n            // Labels\n            pos0.x = old_LabelWidth + 15;\n            GUI.Label(pos0, \"Left\");\n\n            pos0.x += fieldWidth;\n            GUI.Label(pos0, \"Top\");\n\n            pos0.x += fieldWidth;\n            GUI.Label(pos0, \"Right\");\n\n            pos0.x += fieldWidth;\n            GUI.Label(pos0, \"Bottom\");\n\n            pos0.y += 18;\n\n            pos0.x = old_LabelWidth + 15;\n            vec.x = EditorGUI.FloatField(pos0, GUIContent.none, vec.x);\n\n            pos0.x += fieldWidth;\n            vec.y = EditorGUI.FloatField(pos0, GUIContent.none, vec.y);\n\n            pos0.x += fieldWidth;\n            vec.z = EditorGUI.FloatField(pos0, GUIContent.none, vec.z);\n\n            pos0.x += fieldWidth;\n            vec.w = EditorGUI.FloatField(pos0, GUIContent.none, vec.w);\n\n            //property.vector4Value = vec;         \n            property.FindPropertyRelative(\"x\").floatValue = vec.x;\n            property.FindPropertyRelative(\"y\").floatValue = vec.y;\n            property.FindPropertyRelative(\"z\").floatValue = vec.z;\n            property.FindPropertyRelative(\"w\").floatValue = vec.w;\n\n            EditorGUIUtility.labelWidth = old_LabelWidth;\n            EditorGUIUtility.fieldWidth = old_FieldWidth;\n        }\n\n\n        Vector2 GetAnchorPosition(int index)\n        {\n            Vector2 anchorPosition = Vector2.zero;\n                   \n            switch (index)\n            {\n                case 0: // TOP LEFT\n                    anchorPosition = new Vector2(0, 1);\n                    break;\n                case 1: // TOP\n                    anchorPosition = new Vector2(0.5f, 1);\n                    break;\n                case 2: // TOP RIGHT\n                    anchorPosition = new Vector2(1, 1);\n                    break;\n                case 3: // LEFT\n                    anchorPosition = new Vector2(0, 0.5f);\n                    break;\n                case 4: // MIDDLE\n                    anchorPosition = new Vector2(0.5f, 0.5f);\n                    break;\n                case 5: // RIGHT\n                    anchorPosition = new Vector2(1, 0.5f);\n                    break;\n                case 6: // BOTTOM LEFT\n                    anchorPosition = new Vector2(0, 0);\n                    break;\n                case 7: // BOTTOM\n                    anchorPosition = new Vector2(0.5f, 0);\n                    break;\n                case 8: // BOTTOM RIGHT\n                    anchorPosition = new Vector2(1, 0);\n                    break;\n            }\n          \n            return anchorPosition;\n        }\n\n\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_TextContainerEditor.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 02893ffb522b490a9fa28eedd2584309\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_TexturePostProcessor.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.Collections;\n\n\nnamespace TMPro.EditorUtilities\n{\n\n    public class TMPro_TexturePostProcessor : AssetPostprocessor\n    {\n\n        void OnPostprocessTexture(Texture2D texture)\n        {\n            //var importer = assetImporter as TextureImporter;\n\n            Texture2D tex = AssetDatabase.LoadAssetAtPath(assetPath, typeof(Texture2D)) as Texture2D;\n\n            // Send Event Sub Objects\n            if (tex != null)\n                TMPro_EventManager.ON_SPRITE_ASSET_PROPERTY_CHANGED(true, tex);\n        }\n\n    }\n\n\n    //public class TMPro_PackageImportPostProcessor : AssetPostprocessor\n    //{\n    //    static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)\n    //    {\n    //        for (int i = 0; i < importedAssets.Length; i++)\n    //        {\n    //            if (importedAssets[i].Contains(\"TextMesh Pro/Resources/TMP Settings.asset\"))\n    //            {\n    //                Debug.Log(\"New TMP Settings file was just imported.\");\n\n    //                // TMP Settings file was just re-imported.\n    //                // Check if project already contains \n    //            }\n\n\n    //            if (importedAssets[i].Contains(\"com.unity.TextMeshPro/Examples\"))\n    //            {\n    //                //Debug.Log(\"New TMP Examples folder was just imported.\");\n    //            }\n\n    //            //Debug.Log(\"[\" + importedAssets[i] + \"] was just imported.\");\n    //        }\n            \n            \n            \n    //        //for (int i = 0; i < deletedAssets.Length; i++)\n    //        //{\n    //        //    if (deletedAssets[i] == \"Assets/TextMesh Pro\")\n    //        //    {\n    //        //        //Debug.Log(\"Asset [\" + deletedAssets[i] + \"] has been deleted.\");\n    //        //        string currentBuildSettings = PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup);\n\n    //        //        //Check for and inject TMP_PRESENT\n    //        //        if (currentBuildSettings.Contains(\"TMP_PRESENT;\"))\n    //        //        {\n    //        //            currentBuildSettings = currentBuildSettings.Replace(\"TMP_PRESENT;\", \"\");\n\n    //        //            PlayerSettings.SetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup, currentBuildSettings);\n    //        //        }\n    //        //        else if (currentBuildSettings.Contains(\"TMP_PRESENT\"))\n    //        //        {\n    //        //            currentBuildSettings = currentBuildSettings.Replace(\"TMP_PRESENT\", \"\");\n\n    //        //            PlayerSettings.SetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup, currentBuildSettings);\n    //        //        }\n    //        //    }\n    //        //}\n    //    }\n    //}\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/TMPro_TexturePostProcessor.cs.meta",
    "content": "fileFormatVersion: 2\nguid: f4935fb862d54980b1bcbca942962642\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/Unity.TextMeshPro.Editor.asmdef",
    "content": "{\n    \"name\": \"Unity.TextMeshPro.Editor\",\n    \"references\": [\n        \"Unity.TextMeshPro\",\n\t\t\"Unity.ugui\",\n\t\t\"Unity.ugui.Editor\"\n    ],\n    \"optionalUnityReferences\": [],\n    \"includePlatforms\": [\n        \"Editor\"\n    ],\n    \"excludePlatforms\": []\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor/Unity.TextMeshPro.Editor.asmdef.meta",
    "content": "fileFormatVersion: 2\nguid: 6546d7765b4165b40850b3667f981c26\nAssemblyDefinitionImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Editor.meta",
    "content": "fileFormatVersion: 2\nguid: b5d6c28ed7b94775be9e2560f300247c\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/AssemblyInfo.cs.cs",
    "content": "﻿using System.Runtime.CompilerServices;\n\n// Allow internal visibility for testing purposes.\n[assembly: InternalsVisibleTo(\"Unity.TextCore\")]\n\n[assembly: InternalsVisibleTo(\"Unity.FontEngine.Tests\")]\n\n#if UNITY_EDITOR\n[assembly: InternalsVisibleTo(\"Unity.TextCore.Editor\")]\n[assembly: InternalsVisibleTo(\"Unity.TextMeshPro.Editor\")]\n#endif\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/AssemblyInfo.cs.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 1c147d10db452eb4b854a35f84472017\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/FastAction.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections;\nusing System.Collections.Generic;\n\n\nnamespace TMPro\n{\n    public class FastAction\n    {\n\n        LinkedList<System.Action> delegates = new LinkedList<System.Action>();\n\n        Dictionary<System.Action, LinkedListNode<System.Action>> lookup = new Dictionary<System.Action, LinkedListNode<System.Action>>();\n\n        public void Add(System.Action rhs)\n        {\n            if (lookup.ContainsKey(rhs)) return;\n\n            lookup[rhs] = delegates.AddLast(rhs);\n        }\n\n        public void Remove(System.Action rhs)\n        {\n            if (lookup.TryGetValue(rhs, out LinkedListNode<System.Action> node))\n            {\n                lookup.Remove(rhs);\n                delegates.Remove(node);\n            }\n        }\n\n        public void Call()\n        {\n            var node = delegates.First;\n            while (node != null)\n            {\n                node.Value();\n                node = node.Next;\n            }\n        }\n    }\n\n\n    public class FastAction<A>\n    {\n\n        LinkedList<System.Action<A>> delegates = new LinkedList<System.Action<A>>();\n\n        Dictionary<System.Action<A>, LinkedListNode<System.Action<A>>> lookup = new Dictionary<System.Action<A>, LinkedListNode<System.Action<A>>>();\n\n        public void Add(System.Action<A> rhs)\n        {\n            if (lookup.ContainsKey(rhs)) return;\n\n            lookup[rhs] = delegates.AddLast(rhs);\n        }\n\n        public void Remove(System.Action<A> rhs)\n        {\n            if (lookup.TryGetValue(rhs, out LinkedListNode<System.Action<A>> node))\n            {\n                lookup.Remove(rhs);\n                delegates.Remove(node);\n            }\n        }\n\n        public void Call(A a)\n        {\n            var node = delegates.First;\n            while (node != null)\n            {\n                node.Value(a);\n                node = node.Next;\n            }\n        }\n    }\n\n\n    public class FastAction<A, B>\n    {\n\n        LinkedList<System.Action<A, B>> delegates = new LinkedList<System.Action<A, B>>();\n\n        Dictionary<System.Action<A, B>, LinkedListNode<System.Action<A, B>>> lookup = new Dictionary<System.Action<A, B>, LinkedListNode<System.Action<A, B>>>();\n\n        public void Add(System.Action<A, B> rhs)\n        {\n            if (lookup.ContainsKey(rhs)) return;\n\n            lookup[rhs] = delegates.AddLast(rhs);\n        }\n\n        public void Remove(System.Action<A, B> rhs)\n        {\n            if (lookup.TryGetValue(rhs, out LinkedListNode<System.Action<A, B>> node))\n            {\n                lookup.Remove(rhs);\n                delegates.Remove(node);\n            }\n        }\n\n        public void Call(A a, B b)\n        {\n            var node = delegates.First;\n            while (node != null)\n            {\n                node.Value(a, b);\n                node = node.Next;\n            }\n        }\n    }\n\n\n    public class FastAction<A, B, C>\n    {\n\n        LinkedList<System.Action<A, B, C>> delegates = new LinkedList<System.Action<A, B, C>>();\n\n        Dictionary<System.Action<A, B, C>, LinkedListNode<System.Action<A, B, C>>> lookup = new Dictionary<System.Action<A, B, C>, LinkedListNode<System.Action<A, B, C>>>();\n\n        public void Add(System.Action<A, B, C> rhs)\n        {\n            if (lookup.ContainsKey(rhs)) return;\n\n            lookup[rhs] = delegates.AddLast(rhs);\n        }\n\n        public void Remove(System.Action<A, B, C> rhs)\n        {\n            if (lookup.TryGetValue(rhs, out LinkedListNode<System.Action<A, B, C>> node))\n            {\n                lookup.Remove(rhs);\n                delegates.Remove(node);\n            }\n        }\n\n        public void Call(A a, B b, C c)\n        {\n            var node = delegates.First;\n            while (node != null)\n            {\n                node.Value(a, b, c);\n                node = node.Next;\n            }\n        }\n    }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/FastAction.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 871f8edd56e84b8fb295b10cc3c78f36\ntimeCreated: 1435956061\nlicenseType: Store\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/MaterialReferenceManager.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections;\nusing System.Collections.Generic;\n\n\nnamespace TMPro\n{\n\n    public class MaterialReferenceManager\n    {\n        private static MaterialReferenceManager s_Instance;\n\n        // Dictionaries used to track Asset references.\n        private Dictionary<int, Material> m_FontMaterialReferenceLookup = new Dictionary<int, Material>();\n        private Dictionary<int, TMP_FontAsset> m_FontAssetReferenceLookup = new Dictionary<int, TMP_FontAsset>();\n        private Dictionary<int, TMP_SpriteAsset> m_SpriteAssetReferenceLookup = new Dictionary<int, TMP_SpriteAsset>();\n        private Dictionary<int, TMP_ColorGradient> m_ColorGradientReferenceLookup = new Dictionary<int, TMP_ColorGradient>();\n\n\n        /// <summary>\n        /// Get a singleton instance of the registry\n        /// </summary>\n        public static MaterialReferenceManager instance\n        {\n            get\n            {\n                if (MaterialReferenceManager.s_Instance == null)\n                    MaterialReferenceManager.s_Instance = new MaterialReferenceManager();\n                return MaterialReferenceManager.s_Instance;\n            }\n        }\n\n\n\n        /// <summary>\n        /// Add new font asset reference to dictionary.\n        /// </summary>\n        /// <param name=\"fontAsset\"></param>\n        public static void AddFontAsset(TMP_FontAsset fontAsset)\n        {\n            MaterialReferenceManager.instance.AddFontAssetInternal(fontAsset);\n        }\n\n        /// <summary>\n        ///  Add new Font Asset reference to dictionary.\n        /// </summary>\n        /// <param name=\"fontAsset\"></param>\n        private void AddFontAssetInternal(TMP_FontAsset fontAsset)\n        {\n            if (m_FontAssetReferenceLookup.ContainsKey(fontAsset.hashCode)) return;\n\n            // Add reference to the font asset.\n            m_FontAssetReferenceLookup.Add(fontAsset.hashCode, fontAsset);\n\n            // Add reference to the font material.\n            m_FontMaterialReferenceLookup.Add(fontAsset.materialHashCode, fontAsset.material);\n        }\n\n\n\n        /// <summary>\n        /// Add new Sprite Asset to dictionary.\n        /// </summary>\n        /// <param name=\"hashCode\"></param>\n        /// <param name=\"spriteAsset\"></param>\n        public static void AddSpriteAsset(TMP_SpriteAsset spriteAsset)\n        {\n            MaterialReferenceManager.instance.AddSpriteAssetInternal(spriteAsset);\n        }\n\n        /// <summary>\n        /// Internal method to add a new sprite asset to the dictionary.\n        /// </summary>\n        /// <param name=\"hashCode\"></param>\n        /// <param name=\"spriteAsset\"></param>\n        private void AddSpriteAssetInternal(TMP_SpriteAsset spriteAsset)\n        {\n            if (m_SpriteAssetReferenceLookup.ContainsKey(spriteAsset.hashCode)) return;\n\n            // Add reference to sprite asset.\n            m_SpriteAssetReferenceLookup.Add(spriteAsset.hashCode, spriteAsset);\n\n            // Adding reference to the sprite asset material as well\n            m_FontMaterialReferenceLookup.Add(spriteAsset.hashCode, spriteAsset.material);\n        }\n\n        /// <summary>\n        /// Add new Sprite Asset to dictionary.\n        /// </summary>\n        /// <param name=\"hashCode\"></param>\n        /// <param name=\"spriteAsset\"></param>\n        public static void AddSpriteAsset(int hashCode, TMP_SpriteAsset spriteAsset)\n        {\n            MaterialReferenceManager.instance.AddSpriteAssetInternal(hashCode, spriteAsset);\n        }\n\n        /// <summary>\n        /// Internal method to add a new sprite asset to the dictionary.\n        /// </summary>\n        /// <param name=\"hashCode\"></param>\n        /// <param name=\"spriteAsset\"></param>\n        private void AddSpriteAssetInternal(int hashCode, TMP_SpriteAsset spriteAsset)\n        {\n            if (m_SpriteAssetReferenceLookup.ContainsKey(hashCode)) return;\n\n            // Add reference to Sprite Asset.\n            m_SpriteAssetReferenceLookup.Add(hashCode, spriteAsset);\n\n            // Add reference to Sprite Asset using the asset hashcode.\n            m_FontMaterialReferenceLookup.Add(hashCode, spriteAsset.material);\n\n            // Compatibility check\n            if (spriteAsset.hashCode == 0) spriteAsset.hashCode = hashCode;\n        }\n\n\n        /// <summary>\n        /// Add new Material reference to dictionary.\n        /// </summary>\n        /// <param name=\"hashCode\"></param>\n        /// <param name=\"material\"></param>\n        public static void AddFontMaterial(int hashCode, Material material)\n        {\n            MaterialReferenceManager.instance.AddFontMaterialInternal(hashCode, material);\n        }\n\n        /// <summary>\n        /// Add new material reference to dictionary.\n        /// </summary>\n        /// <param name=\"hashCode\"></param>\n        /// <param name=\"material\"></param>\n        private void AddFontMaterialInternal(int hashCode, Material material)\n        {\n            // Since this function is called after checking if the material is\n            // contained in the dictionary, there is no need to check again.\n            m_FontMaterialReferenceLookup.Add(hashCode, material);\n        }\n\n\n        /// <summary>\n        /// Add new Color Gradient Preset to dictionary.\n        /// </summary>\n        /// <param name=\"hashCode\"></param>\n        /// <param name=\"spriteAsset\"></param>\n        public static void AddColorGradientPreset(int hashCode, TMP_ColorGradient spriteAsset)\n        {\n            MaterialReferenceManager.instance.AddColorGradientPreset_Internal(hashCode, spriteAsset);\n        }\n\n        /// <summary>\n        /// Internal method to add a new Color Gradient Preset to the dictionary.\n        /// </summary>\n        /// <param name=\"hashCode\"></param>\n        /// <param name=\"spriteAsset\"></param>\n        private void AddColorGradientPreset_Internal(int hashCode, TMP_ColorGradient spriteAsset)\n        {\n            if (m_ColorGradientReferenceLookup.ContainsKey(hashCode)) return;\n\n            // Add reference to Color Gradient Preset Asset.\n            m_ColorGradientReferenceLookup.Add(hashCode, spriteAsset);\n        }\n\n\n\n        /// <summary>\n        /// Add new material reference and return the index of this new reference in the materialReferences array.\n        /// </summary>\n        /// <param name=\"material\"></param>\n        /// <param name=\"materialHashCode\"></param>\n        /// <param name=\"fontAsset\"></param>\n        //public int AddMaterial(Material material, int materialHashCode, TMP_FontAsset fontAsset)\n        //{\n        //    if (!m_MaterialReferenceLookup.ContainsKey(materialHashCode))\n        //    {\n        //        int index = m_MaterialReferenceLookup.Count;\n\n        //        materialReferences[index].fontAsset = fontAsset;\n        //        materialReferences[index].material = material;\n        //        materialReferences[index].isDefaultMaterial = material.GetInstanceID() == fontAsset.material.GetInstanceID() ? true : false;\n        //        materialReferences[index].index = index;\n        //        materialReferences[index].referenceCount = 0;\n\n        //        m_MaterialReferenceLookup[materialHashCode] = index;\n\n        //        // Compute Padding value and store it\n        //        // TODO\n\n        //        int fontAssetHashCode = fontAsset.hashCode;\n\n        //        if (!m_FontAssetReferenceLookup.ContainsKey(fontAssetHashCode))\n        //            m_FontAssetReferenceLookup.Add(fontAssetHashCode, fontAsset);\n\n        //        m_countInternal += 1;\n\n        //        return index;\n        //    }\n        //    else\n        //    {\n        //        return m_MaterialReferenceLookup[materialHashCode];\n        //    }\n        //}\n\n\n        /// <summary>\n        /// Add new material reference and return the index of this new reference in the materialReferences array.\n        /// </summary>\n        /// <param name=\"material\"></param>\n        /// <param name=\"materialHashCode\"></param>\n        /// <param name=\"spriteAsset\"></param>\n        /// <returns></returns>\n        //public int AddMaterial(Material material, int materialHashCode, TMP_SpriteAsset spriteAsset)\n        //{\n        //    if (!m_MaterialReferenceLookup.ContainsKey(materialHashCode))\n        //    {\n        //        int index = m_MaterialReferenceLookup.Count;\n\n        //        materialReferences[index].fontAsset = materialReferences[0].fontAsset;\n        //        materialReferences[index].spriteAsset = spriteAsset;\n        //        materialReferences[index].material = material;\n        //        materialReferences[index].isDefaultMaterial = true;\n        //        materialReferences[index].index = index;\n        //        materialReferences[index].referenceCount = 0;\n\n        //        m_MaterialReferenceLookup[materialHashCode] = index;\n\n        //        int spriteAssetHashCode =  spriteAsset.hashCode;\n\n        //        if (!m_SpriteAssetReferenceLookup.ContainsKey(spriteAssetHashCode))\n        //            m_SpriteAssetReferenceLookup.Add(spriteAssetHashCode, spriteAsset);\n\n        //        m_countInternal += 1;\n\n        //        return index;\n        //    }\n        //    else\n        //    {\n        //        return m_MaterialReferenceLookup[materialHashCode];\n        //    }\n        //}\n\n\n        /// <summary>\n        /// Function to check if the font asset is already referenced.\n        /// </summary>\n        /// <param name=\"font\"></param>\n        /// <returns></returns>\n        public bool Contains(TMP_FontAsset font)\n        {\n            if (m_FontAssetReferenceLookup.ContainsKey(font.hashCode))\n                return true;\n\n            return false;\n        }\n\n\n        /// <summary>\n        /// Function to check if the sprite asset is already referenced.\n        /// </summary>\n        /// <param name=\"font\"></param>\n        /// <returns></returns>\n        public bool Contains(TMP_SpriteAsset sprite)\n        {\n            if (m_FontAssetReferenceLookup.ContainsKey(sprite.hashCode))\n                return true;\n\n            return false;\n        }\n\n\n\n        /// <summary>\n        /// Function returning the Font Asset corresponding to the provided hash code.\n        /// </summary>\n        /// <param name=\"hashCode\"></param>\n        /// <param name=\"fontAsset\"></param>\n        /// <returns></returns>\n        public static bool TryGetFontAsset(int hashCode, out TMP_FontAsset fontAsset)\n        {\n            return MaterialReferenceManager.instance.TryGetFontAssetInternal(hashCode, out fontAsset);\n        }\n\n        /// <summary>\n        /// Internal Function returning the Font Asset corresponding to the provided hash code.\n        /// </summary>\n        /// <param name=\"hashCode\"></param>\n        /// <param name=\"fontAsset\"></param>\n        /// <returns></returns>\n        private bool TryGetFontAssetInternal(int hashCode, out TMP_FontAsset fontAsset)\n        {\n            fontAsset = null;\n\n            if (m_FontAssetReferenceLookup.TryGetValue(hashCode, out fontAsset))\n            {\n                return true;\n            }\n\n            return false;\n        }\n\n\n\n        /// <summary>\n        /// Function returning the Sprite Asset corresponding to the provided hash code.\n        /// </summary>\n        /// <param name=\"hashCode\"></param>\n        /// <param name=\"spriteAsset\"></param>\n        /// <returns></returns>\n        public static bool TryGetSpriteAsset(int hashCode, out TMP_SpriteAsset spriteAsset)\n        {\n            return MaterialReferenceManager.instance.TryGetSpriteAssetInternal(hashCode, out spriteAsset);\n        }\n\n        /// <summary>\n        /// Internal function returning the Sprite Asset corresponding to the provided hash code.\n        /// </summary>\n        /// <param name=\"hashCode\"></param>\n        /// <param name=\"fontAsset\"></param>\n        /// <returns></returns>\n        private bool TryGetSpriteAssetInternal(int hashCode, out TMP_SpriteAsset spriteAsset)\n        {\n            spriteAsset = null;\n\n            if (m_SpriteAssetReferenceLookup.TryGetValue(hashCode, out spriteAsset))\n            {\n                return true;\n            }\n\n            return false;\n        }\n\n\n        /// <summary>\n        /// Function returning the Color Gradient Preset corresponding to the provided hash code.\n        /// </summary>\n        /// <param name=\"hashCode\"></param>\n        /// <param name=\"gradientPreset\"></param>\n        /// <returns></returns>\n        public static bool TryGetColorGradientPreset(int hashCode, out TMP_ColorGradient gradientPreset)\n        {\n            return MaterialReferenceManager.instance.TryGetColorGradientPresetInternal(hashCode, out gradientPreset);\n        }\n\n        /// <summary>\n        /// Internal function returning the Color Gradient Preset corresponding to the provided hash code.\n        /// </summary>\n        /// <param name=\"hashCode\"></param>\n        /// <param name=\"fontAsset\"></param>\n        /// <returns></returns>\n        private bool TryGetColorGradientPresetInternal(int hashCode, out TMP_ColorGradient gradientPreset)\n        {\n            gradientPreset = null;\n\n            if (m_ColorGradientReferenceLookup.TryGetValue(hashCode, out gradientPreset))\n            {\n                return true;\n            }\n\n            return false;\n        }\n\n\n        /// <summary>\n        /// Function returning the Font Material corresponding to the provided hash code.\n        /// </summary>\n        /// <param name=\"hashCode\"></param>\n        /// <param name=\"material\"></param>\n        /// <returns></returns>\n        public static bool TryGetMaterial(int hashCode, out Material material)\n        {\n            return MaterialReferenceManager.instance.TryGetMaterialInternal(hashCode, out material);\n        }\n\n        /// <summary>\n        /// Internal function returning the Font Material corresponding to the provided hash code.\n        /// </summary>\n        /// <param name=\"hashCode\"></param>\n        /// <param name=\"material\"></param>\n        /// <returns></returns>\n        private bool TryGetMaterialInternal(int hashCode, out Material material)\n        {\n            material = null;\n\n            if (m_FontMaterialReferenceLookup.TryGetValue(hashCode, out material))\n            {\n                return true;\n            }\n\n            return false;\n        }\n\n\n        /// <summary>\n        /// Function to lookup a material based on hash code and returning the MaterialReference containing this material.\n        /// </summary>\n        /// <param name=\"hashCode\"></param>\n        /// <param name=\"material\"></param>\n        /// <returns></returns>\n        //public bool TryGetMaterial(int hashCode, out MaterialReference materialReference)\n        //{\n        //    int materialIndex = -1;\n\n        //    if (m_MaterialReferenceLookup.TryGetValue(hashCode, out materialIndex))\n        //    {\n        //        materialReference = materialReferences[materialIndex];\n\n        //        return true;\n        //    }\n\n        //    materialReference = new MaterialReference();\n\n        //    return false;\n        //}\n\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"fontAsset\"></param>\n        /// <returns></returns>\n        //public int GetMaterialIndex(TMP_FontAsset fontAsset)\n        //{\n        //    if (m_MaterialReferenceLookup.ContainsKey(fontAsset.materialHashCode))\n        //        return m_MaterialReferenceLookup[fontAsset.materialHashCode];\n\n        //    return -1;\n        //}\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <returns></returns>\n        //public TMP_FontAsset GetFontAsset(int index)\n        //{\n        //    if (index >= 0  && index < materialReferences.Length)\n        //        return materialReferences[index].fontAsset;\n\n        //    return null;\n        //}\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"material\"></param>\n        /// <param name=\"materialHashCode\"></param>\n        /// <param name=\"fontAsset\"></param>\n        //public void SetDefaultMaterial(Material material, int materialHashCode, TMP_FontAsset fontAsset)\n        //{\n        //    if (!m_MaterialReferenceLookup.ContainsKey(materialHashCode))\n        //    {\n        //        materialReferences[0].fontAsset = fontAsset;\n        //        materialReferences[0].material = material;\n        //        materialReferences[0].index = 0;\n        //        materialReferences[0].isDefaultMaterial = material.GetInstanceID() == fontAsset.material.GetInstanceID() ? true : false;\n        //        materialReferences[0].referenceCount = 0;\n        //        m_MaterialReferenceLookup[materialHashCode] = 0;\n\n        //        // Compute Padding value and store it\n        //        // TODO\n\n        //        int fontHashCode = fontAsset.hashCode;\n\n        //        if (!m_FontAssetReferenceLookup.ContainsKey(fontHashCode))\n        //            m_FontAssetReferenceLookup.Add(fontHashCode, fontAsset);\n        //    }\n        //    else\n        //    {\n        //        materialReferences[0].fontAsset = fontAsset;\n        //        materialReferences[0].material = material;\n        //        materialReferences[0].index = 0;\n        //        materialReferences[0].referenceCount = 0;\n        //        m_MaterialReferenceLookup[materialHashCode] = 0;\n        //    }\n        //    // Compute padding\n        //    // TODO\n\n        //    m_countInternal = 1;\n        //}\n\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        //public void Clear()\n        //{\n        //    //m_currentIndex = 0;\n        //    m_MaterialReferenceLookup.Clear();\n        //    m_SpriteAssetReferenceLookup.Clear();\n        //    m_FontAssetReferenceLookup.Clear();\n        //}\n\n\n        /// <summary>\n        /// Function to clear the reference count for each of the material references.\n        /// </summary>\n        //public void ClearReferenceCount()\n        //{\n        //    m_countInternal = 0;\n\n        //    for (int i = 0; i < materialReferences.Length; i++)\n        //    {\n        //        if (materialReferences[i].fontAsset == null)\n        //            return;\n\n        //        materialReferences[i].referenceCount = 0;\n        //    }\n        //}\n\n    }\n\n\n\n    public struct MaterialReference\n    {\n\n        public int index;\n        public TMP_FontAsset fontAsset;\n        public TMP_SpriteAsset spriteAsset;\n        public Material material;\n        public bool isDefaultMaterial;\n        public bool isFallbackMaterial;\n        public Material fallbackMaterial;\n        public float padding;\n        public int referenceCount;\n\n\n        /// <summary>\n        /// Constructor for new Material Reference.\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <param name=\"fontAsset\"></param>\n        /// <param name=\"spriteAsset\"></param>\n        /// <param name=\"material\"></param>\n        /// <param name=\"padding\"></param>\n        public MaterialReference(int index, TMP_FontAsset fontAsset, TMP_SpriteAsset spriteAsset, Material material, float padding)\n        {\n            this.index = index;\n            this.fontAsset = fontAsset;\n            this.spriteAsset = spriteAsset;\n            this.material = material;\n            this.isDefaultMaterial = material.GetInstanceID() == fontAsset.material.GetInstanceID() ? true : false;\n            this.isFallbackMaterial = false;\n            this.fallbackMaterial = null;\n            this.padding = padding;\n            this.referenceCount = 0;\n        }\n\n\n        /// <summary>\n        /// Function to check if a certain font asset is contained in the material reference array.\n        /// </summary>\n        /// <param name=\"materialReferences\"></param>\n        /// <param name=\"fontAsset\"></param>\n        /// <returns></returns>\n        public static bool Contains(MaterialReference[] materialReferences, TMP_FontAsset fontAsset)\n        {\n            int id = fontAsset.GetInstanceID();\n\n            for (int i = 0; i < materialReferences.Length && materialReferences[i].fontAsset != null; i++)\n            {\n                if (materialReferences[i].fontAsset.GetInstanceID() == id)\n                    return true;\n            }\n\n            return false;\n        }\n\n\n        /// <summary>\n        /// Function to add a new material reference and returning its index in the material reference array.\n        /// </summary>\n        /// <param name=\"material\"></param>\n        /// <param name=\"fontAsset\"></param>\n        /// <param name=\"materialReferences\"></param>\n        /// <param name=\"materialReferenceIndexLookup\"></param>\n        /// <returns></returns>\n        public static int AddMaterialReference(Material material, TMP_FontAsset fontAsset, MaterialReference[] materialReferences, Dictionary<int, int> materialReferenceIndexLookup)\n        {\n            int materialID = material.GetInstanceID();\n\n            if (materialReferenceIndexLookup.TryGetValue(materialID, out int index))\n            {\n                return index;\n            }\n            else\n            {\n                index = materialReferenceIndexLookup.Count;\n\n                // Add new reference index\n                materialReferenceIndexLookup[materialID] = index;\n\n                materialReferences[index].index = index;\n                materialReferences[index].fontAsset = fontAsset;\n                materialReferences[index].spriteAsset = null;\n                materialReferences[index].material = material;\n                materialReferences[index].isDefaultMaterial = materialID == fontAsset.material.GetInstanceID() ? true : false;\n                //materialReferences[index].padding = 0;\n                materialReferences[index].referenceCount = 0;\n\n                return index;\n            }\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"material\"></param>\n        /// <param name=\"spriteAsset\"></param>\n        /// <param name=\"materialReferences\"></param>\n        /// <param name=\"materialReferenceIndexLookup\"></param>\n        /// <returns></returns>\n        public static int AddMaterialReference(Material material, TMP_SpriteAsset spriteAsset, MaterialReference[] materialReferences, Dictionary<int, int> materialReferenceIndexLookup)\n        {\n            int materialID = material.GetInstanceID();\n\n            if (materialReferenceIndexLookup.TryGetValue(materialID, out int index))\n            {\n                return index;\n            }\n            else\n            {\n                index = materialReferenceIndexLookup.Count;\n\n                // Add new reference index\n                materialReferenceIndexLookup[materialID] = index;\n\n                materialReferences[index].index = index;\n                materialReferences[index].fontAsset = materialReferences[0].fontAsset;\n                materialReferences[index].spriteAsset = spriteAsset;\n                materialReferences[index].material = material;\n                materialReferences[index].isDefaultMaterial = true;\n                //materialReferences[index].padding = 0;\n                materialReferences[index].referenceCount = 0;\n\n                return index;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/MaterialReferenceManager.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 11a6a034ab84493cbed6af5ae7aae78b\ntimeCreated: 1449743129\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_Asset.cs",
    "content": "﻿using UnityEngine;\n\nnamespace TMPro\n{\n\n    // Base class inherited by the various TextMeshPro Assets.\n    [System.Serializable]\n    public class TMP_Asset : ScriptableObject\n    {\n        /// <summary>\n        /// HashCode based on the name of the asset.\n        /// </summary>\n        public int hashCode;\n\n        /// <summary>\n        /// The material used by this asset.\n        /// </summary>\n        public Material material;\n\n        /// <summary>\n        /// HashCode based on the name of the material assigned to this asset.\n        /// </summary>\n        public int materialHashCode;\n\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_Asset.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 3bda1886f58f4e0ab1139400b160c3ee\ntimeCreated: 1459318952\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_Character.cs",
    "content": "﻿using System;\nusing UnityEngine.TextCore;\n\nnamespace TMPro\n{\n    /// <summary>\n    /// A basic element of text.\n    /// </summary>\n    [Serializable]\n    public class TMP_Character : TMP_TextElement\n    {\n        /// <summary>\n        /// Default constructor.\n        /// </summary>\n        public TMP_Character()\n        {\n            m_ElementType = TextElementType.Character;\n            this.scale = 1.0f;\n        }\n\n        /// <summary>\n        /// Constructor for new character\n        /// </summary>\n        /// <param name=\"unicode\">Unicode value.</param>\n        /// <param name=\"glyph\">Glyph</param>\n        public TMP_Character(uint unicode, Glyph glyph)\n        {\n            m_ElementType = TextElementType.Character;\n\n            this.unicode = unicode;\n            this.glyph = glyph;\n            this.glyphIndex = glyph.index;\n            this.scale = 1.0f;\n        }\n\n        /// <summary>\n        /// Constructor for new character\n        /// </summary>\n        /// <param name=\"unicode\">Unicode value.</param>\n        /// <param name=\"glyphIndex\">Glyph index.</param>\n        internal TMP_Character(uint unicode, uint glyphIndex)\n        {\n            m_ElementType = TextElementType.Character;\n\n            this.unicode = unicode;\n            this.glyph = null;\n            this.glyphIndex = glyphIndex;\n            this.scale = 1.0f;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_Character.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 4ac5b6a65aaeb59478e3b78660e9f134\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_CharacterInfo.cs",
    "content": "﻿using UnityEngine;\nusing UnityEngine.TextCore;\n\nnamespace TMPro\n{\n    public struct TMP_Vertex\n    {\n        public Vector3 position;\n        public Vector2 uv;\n        public Vector2 uv2;\n        public Vector2 uv4;\n        public Color32 color;\n\n        //public Vector3 normal;\n        //public Vector4 tangent;\n    }\n\n    /// <summary>\n    /// Structure containing information about individual text elements (character or sprites).\n    /// </summary>\n    public struct TMP_CharacterInfo\n    {\n        public char character; // Should be changed to an int to handle UTF 32\n        /// <summary>\n        /// Index of the character in the raw string.\n        /// </summary>\n        public int index; // Index of the character in the input string.\n        public int stringLength;\n        public TMP_TextElementType elementType;\n\n        public TMP_TextElement textElement;\n        public TMP_FontAsset fontAsset;\n        public TMP_SpriteAsset spriteAsset;\n        public int spriteIndex;\n        public Material material;\n        public int materialReferenceIndex;\n        public bool isUsingAlternateTypeface;\n\n        public float pointSize;\n\n        //public short wordNumber;\n        public int lineNumber;\n        //public short charNumber;\n        public int pageNumber;\n\n\n        public int vertexIndex;\n        public TMP_Vertex vertex_BL;\n        public TMP_Vertex vertex_TL;\n        public TMP_Vertex vertex_TR;\n        public TMP_Vertex vertex_BR;\n\n        public Vector3 topLeft;\n        public Vector3 bottomLeft;\n        public Vector3 topRight;\n        public Vector3 bottomRight;\n        public float origin;\n        public float ascender;\n        public float baseLine;\n        public float descender;\n\n        public float xAdvance;\n        public float aspectRatio;\n        public float scale;\n        public Color32 color;\n        public Color32 underlineColor;\n        public Color32 strikethroughColor;\n        public Color32 highlightColor;\n        public FontStyles style;\n        public bool isVisible;\n        //public bool isIgnoringAlignment;\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_CharacterInfo.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 90fe1c65e6bb3bc4e90862df7297719e\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_ColorGradient.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections;\n\nnamespace TMPro\n{\n    public enum ColorMode\n    {\n        Single,\n        HorizontalGradient,\n        VerticalGradient,\n        FourCornersGradient\n    }\n\n    [System.Serializable]\n    public class TMP_ColorGradient : ScriptableObject\n    {\n        public ColorMode colorMode = ColorMode.FourCornersGradient;\n\n        public Color topLeft;\n        public Color topRight;\n        public Color bottomLeft;\n        public Color bottomRight;\n\n        const ColorMode k_DefaultColorMode = ColorMode.FourCornersGradient;\n        static readonly Color k_DefaultColor = Color.white;\n\n        /// <summary>\n        /// Default Constructor which sets each of the colors as white.\n        /// </summary>\n        public TMP_ColorGradient()\n        {\n            colorMode = k_DefaultColorMode;\n            topLeft = k_DefaultColor;\n            topRight = k_DefaultColor;\n            bottomLeft = k_DefaultColor;\n            bottomRight = k_DefaultColor;\n        }\n\n        /// <summary>\n        /// Constructor allowing to set the default color of the Color Gradient.\n        /// </summary>\n        /// <param name=\"color\"></param>\n        public TMP_ColorGradient(Color color)\n        {\n            colorMode = k_DefaultColorMode;\n            topLeft = color;\n            topRight = color;\n            bottomLeft = color;\n            bottomRight = color;\n        }\n\n        /// <summary>\n        /// The vertex colors at the corners of the characters.\n        /// </summary>\n        /// <param name=\"color0\">Top left color.</param>\n        /// <param name=\"color1\">Top right color.</param>\n        /// <param name=\"color2\">Bottom left color.</param>\n        /// <param name=\"color3\">Bottom right color.</param>\n        public TMP_ColorGradient(Color color0, Color color1, Color color2, Color color3)\n        {\n            colorMode = k_DefaultColorMode;\n            this.topLeft = color0;\n            this.topRight = color1;\n            this.bottomLeft = color2;\n            this.bottomRight = color3;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_ColorGradient.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 54d21f6ece3b46479f0c328f8c6007e0\ntimeCreated: 1468187202\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_CoroutineTween.cs",
    "content": "﻿using UnityEngine;\nusing UnityEngine.Events;\nusing System.Collections;\n\n\nnamespace TMPro\n{\n    // Base interface for tweeners,\n    // using an interface instead of\n    // an abstract class as we want the\n    // tweens to be structs.\n    internal interface ITweenValue\n    {\n        void TweenValue(float floatPercentage);\n        bool ignoreTimeScale { get; }\n        float duration { get; }\n        bool ValidTarget();\n    }\n\n    // Color tween class, receives the\n    // TweenValue callback and then sets\n    // the value on the target.\n    internal struct ColorTween : ITweenValue\n    {\n        public enum ColorTweenMode\n        {\n            All,\n            RGB,\n            Alpha\n        }\n\n        public class ColorTweenCallback : UnityEvent<Color> { }\n\n        private ColorTweenCallback m_Target;\n        private Color m_StartColor;\n        private Color m_TargetColor;\n        private ColorTweenMode m_TweenMode;\n\n        private float m_Duration;\n        private bool m_IgnoreTimeScale;\n\n        public Color startColor\n        {\n            get { return m_StartColor; }\n            set { m_StartColor = value; }\n        }\n\n        public Color targetColor\n        {\n            get { return m_TargetColor; }\n            set { m_TargetColor = value; }\n        }\n\n        public ColorTweenMode tweenMode\n        {\n            get { return m_TweenMode; }\n            set { m_TweenMode = value; }\n        }\n\n        public float duration\n        {\n            get { return m_Duration; }\n            set { m_Duration = value; }\n        }\n\n        public bool ignoreTimeScale\n        {\n            get { return m_IgnoreTimeScale; }\n            set { m_IgnoreTimeScale = value; }\n        }\n\n        public void TweenValue(float floatPercentage)\n        {\n            if (!ValidTarget())\n                return;\n\n            var newColor = Color.Lerp(m_StartColor, m_TargetColor, floatPercentage);\n\n            if (m_TweenMode == ColorTweenMode.Alpha)\n            {\n                newColor.r = m_StartColor.r;\n                newColor.g = m_StartColor.g;\n                newColor.b = m_StartColor.b;\n            }\n            else if (m_TweenMode == ColorTweenMode.RGB)\n            {\n                newColor.a = m_StartColor.a;\n            }\n            m_Target.Invoke(newColor);\n        }\n\n        public void AddOnChangedCallback(UnityAction<Color> callback)\n        {\n            if (m_Target == null)\n                m_Target = new ColorTweenCallback();\n\n            m_Target.AddListener(callback);\n        }\n\n        public bool GetIgnoreTimescale()\n        {\n            return m_IgnoreTimeScale;\n        }\n\n        public float GetDuration()\n        {\n            return m_Duration;\n        }\n\n        public bool ValidTarget()\n        {\n            return m_Target != null;\n        }\n    }\n\n    // Float tween class, receives the\n    // TweenValue callback and then sets\n    // the value on the target.\n    internal struct FloatTween : ITweenValue\n    {\n        public class FloatTweenCallback : UnityEvent<float> { }\n\n        private FloatTweenCallback m_Target;\n        private float m_StartValue;\n        private float m_TargetValue;\n\n        private float m_Duration;\n        private bool m_IgnoreTimeScale;\n\n        public float startValue\n        {\n            get { return m_StartValue; }\n            set { m_StartValue = value; }\n        }\n\n        public float targetValue\n        {\n            get { return m_TargetValue; }\n            set { m_TargetValue = value; }\n        }\n\n        public float duration\n        {\n            get { return m_Duration; }\n            set { m_Duration = value; }\n        }\n\n        public bool ignoreTimeScale\n        {\n            get { return m_IgnoreTimeScale; }\n            set { m_IgnoreTimeScale = value; }\n        }\n\n        public void TweenValue(float floatPercentage)\n        {\n            if (!ValidTarget())\n                return;\n\n            var newValue = Mathf.Lerp(m_StartValue, m_TargetValue, floatPercentage);\n            m_Target.Invoke(newValue);\n        }\n\n        public void AddOnChangedCallback(UnityAction<float> callback)\n        {\n            if (m_Target == null)\n                m_Target = new FloatTweenCallback();\n\n            m_Target.AddListener(callback);\n        }\n\n        public bool GetIgnoreTimescale()\n        {\n            return m_IgnoreTimeScale;\n        }\n\n        public float GetDuration()\n        {\n            return m_Duration;\n        }\n\n        public bool ValidTarget()\n        {\n            return m_Target != null;\n        }\n    }\n\n    // Tween runner, executes the given tween.\n    // The coroutine will live within the given\n    // behaviour container.\n    internal class TweenRunner<T> where T : struct, ITweenValue\n    {\n        protected MonoBehaviour m_CoroutineContainer;\n        protected IEnumerator m_Tween;\n\n        // utility function for starting the tween\n        private static IEnumerator Start(T tweenInfo)\n        {\n            if (!tweenInfo.ValidTarget())\n                yield break;\n\n            var elapsedTime = 0.0f;\n            while (elapsedTime < tweenInfo.duration)\n            {\n                elapsedTime += tweenInfo.ignoreTimeScale ? Time.unscaledDeltaTime : Time.deltaTime;\n                var percentage = Mathf.Clamp01(elapsedTime / tweenInfo.duration);\n                tweenInfo.TweenValue(percentage);\n                yield return null;\n            }\n            tweenInfo.TweenValue(1.0f);\n        }\n\n        public void Init(MonoBehaviour coroutineContainer)\n        {\n            m_CoroutineContainer = coroutineContainer;\n        }\n\n        public void StartTween(T info)\n        {\n            if (m_CoroutineContainer == null)\n            {\n                Debug.LogWarning(\"Coroutine container not configured... did you forget to call Init?\");\n                return;\n            }\n\n            StopTween();\n\n            if (!m_CoroutineContainer.gameObject.activeInHierarchy)\n            {\n                info.TweenValue(1.0f);\n                return;\n            }\n\n            m_Tween = Start(info);\n            m_CoroutineContainer.StartCoroutine(m_Tween);\n        }\n\n        public void StopTween()\n        {\n            if (m_Tween != null)\n            {\n                m_CoroutineContainer.StopCoroutine(m_Tween);\n                m_Tween = null;\n            }\n        }\n    }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_CoroutineTween.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 658c1fb149e7498aa072b0c0f3bf13f0\ntimeCreated: 1464850953\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_DefaultControls.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections;\nusing UnityEngine.UI;\n\n\nnamespace TMPro\n{\n\n    public static class TMP_DefaultControls\n    {\n        public struct Resources\n        {\n            public Sprite standard;\n            public Sprite background;\n            public Sprite inputField;\n            public Sprite knob;\n            public Sprite checkmark;\n            public Sprite dropdown;\n            public Sprite mask;\n        }\n\n        private const float kWidth = 160f;\n        private const float kThickHeight = 30f;\n        private const float kThinHeight = 20f;\n        private static Vector2 s_ThickElementSize = new Vector2(kWidth, kThickHeight);\n        private static Vector2 s_ThinElementSize = new Vector2(kWidth, kThinHeight);\n        //private static Vector2 s_ImageElementSize = new Vector2(100f, 100f);\n        private static Color s_DefaultSelectableColor = new Color(1f, 1f, 1f, 1f);\n        //private static Color s_PanelColor = new Color(1f, 1f, 1f, 0.392f);\n        private static Color s_TextColor = new Color(50f / 255f, 50f / 255f, 50f / 255f, 1f);\n\n\n        private static GameObject CreateUIElementRoot(string name, Vector2 size)\n        {\n            GameObject child = new GameObject(name);\n            RectTransform rectTransform = child.AddComponent<RectTransform>();\n            rectTransform.sizeDelta = size;\n            return child;\n        }\n\n        static GameObject CreateUIObject(string name, GameObject parent)\n        {\n            GameObject go = new GameObject(name);\n            go.AddComponent<RectTransform>();\n            SetParentAndAlign(go, parent);\n            return go;\n        }\n\n        private static void SetDefaultTextValues(TMP_Text lbl)\n        {\n            // Set text values we want across UI elements in default controls.\n            // Don't set values which are the same as the default values for the Text component,\n            // since there's no point in that, and it's good to keep them as consistent as possible.\n            lbl.color = s_TextColor;\n            lbl.fontSize = 14;\n        }\n\n        private static void SetDefaultColorTransitionValues(Selectable slider)\n        {\n            ColorBlock colors = slider.colors;\n            colors.highlightedColor = new Color(0.882f, 0.882f, 0.882f);\n            colors.pressedColor = new Color(0.698f, 0.698f, 0.698f);\n            colors.disabledColor = new Color(0.521f, 0.521f, 0.521f);\n        }\n\n        private static void SetParentAndAlign(GameObject child, GameObject parent)\n        {\n            if (parent == null)\n                return;\n\n            child.transform.SetParent(parent.transform, false);\n            SetLayerRecursively(child, parent.layer);\n        }\n\n        private static void SetLayerRecursively(GameObject go, int layer)\n        {\n            go.layer = layer;\n            Transform t = go.transform;\n            for (int i = 0; i < t.childCount; i++)\n                SetLayerRecursively(t.GetChild(i).gameObject, layer);\n        }\n\n        // Actual controls\n\n        public static GameObject CreateScrollbar(Resources resources)\n        {\n            // Create GOs Hierarchy\n            GameObject scrollbarRoot = CreateUIElementRoot(\"Scrollbar\", s_ThinElementSize);\n\n            GameObject sliderArea = CreateUIObject(\"Sliding Area\", scrollbarRoot);\n            GameObject handle = CreateUIObject(\"Handle\", sliderArea);\n\n            Image bgImage = scrollbarRoot.AddComponent<Image>();\n            bgImage.sprite = resources.background;\n            bgImage.type = Image.Type.Sliced;\n            bgImage.color = s_DefaultSelectableColor;\n\n            Image handleImage = handle.AddComponent<Image>();\n            handleImage.sprite = resources.standard;\n            handleImage.type = Image.Type.Sliced;\n            handleImage.color = s_DefaultSelectableColor;\n\n            RectTransform sliderAreaRect = sliderArea.GetComponent<RectTransform>();\n            sliderAreaRect.sizeDelta = new Vector2(-20, -20);\n            sliderAreaRect.anchorMin = Vector2.zero;\n            sliderAreaRect.anchorMax = Vector2.one;\n\n            RectTransform handleRect = handle.GetComponent<RectTransform>();\n            handleRect.sizeDelta = new Vector2(20, 20);\n\n            Scrollbar scrollbar = scrollbarRoot.AddComponent<Scrollbar>();\n            scrollbar.handleRect = handleRect;\n            scrollbar.targetGraphic = handleImage;\n            SetDefaultColorTransitionValues(scrollbar);\n\n            return scrollbarRoot;\n        }\n\n        public static GameObject CreateButton(Resources resources)\n        {\n            GameObject buttonRoot = CreateUIElementRoot(\"Button\", s_ThickElementSize);\n\n            GameObject childText = new GameObject(\"Text (TMP)\");\n            childText.AddComponent<RectTransform>();\n            SetParentAndAlign(childText, buttonRoot);\n\n            Image image = buttonRoot.AddComponent<Image>();\n            image.sprite = resources.standard;\n            image.type = Image.Type.Sliced;\n            image.color = s_DefaultSelectableColor;\n\n            Button bt = buttonRoot.AddComponent<Button>();\n            SetDefaultColorTransitionValues(bt);\n\n            TextMeshProUGUI text = childText.AddComponent<TextMeshProUGUI>();\n            text.text = \"Button\";\n            text.alignment = TextAlignmentOptions.Center;\n            SetDefaultTextValues(text);\n\n            RectTransform textRectTransform = childText.GetComponent<RectTransform>();\n            textRectTransform.anchorMin = Vector2.zero;\n            textRectTransform.anchorMax = Vector2.one;\n            textRectTransform.sizeDelta = Vector2.zero;\n\n            return buttonRoot;\n        }\n\n        public static GameObject CreateText(Resources resources)\n        {\n            GameObject go = CreateUIElementRoot(\"Text (TMP)\", s_ThickElementSize);\n\n            TextMeshProUGUI lbl = go.AddComponent<TextMeshProUGUI>();\n            lbl.text = \"New Text\";\n            SetDefaultTextValues(lbl);\n\n            return go;\n        }\n\n\n        public static GameObject CreateInputField(Resources resources)\n        {\n            GameObject root = CreateUIElementRoot(\"InputField (TMP)\", s_ThickElementSize);\n\n            GameObject textArea = CreateUIObject(\"Text Area\", root);\n            GameObject childPlaceholder = CreateUIObject(\"Placeholder\", textArea);\n            GameObject childText = CreateUIObject(\"Text\", textArea);\n\n            Image image = root.AddComponent<Image>();\n            image.sprite = resources.inputField;\n            image.type = Image.Type.Sliced;\n            image.color = s_DefaultSelectableColor;\n\n            TMP_InputField inputField = root.AddComponent<TMP_InputField>();\n            SetDefaultColorTransitionValues(inputField);\n\n            // Use UI.Mask for Unity 5.0 - 5.1 and 2D RectMask for Unity 5.2 and up\n            textArea.AddComponent<RectMask2D>();\n\n            RectTransform textAreaRectTransform = textArea.GetComponent<RectTransform>();\n            textAreaRectTransform.anchorMin = Vector2.zero;\n            textAreaRectTransform.anchorMax = Vector2.one;\n            textAreaRectTransform.sizeDelta = Vector2.zero;\n            textAreaRectTransform.offsetMin = new Vector2(10, 6);\n            textAreaRectTransform.offsetMax = new Vector2(-10, -7);\n\n\n            TextMeshProUGUI text = childText.AddComponent<TextMeshProUGUI>();\n            text.text = \"\";\n            text.enableWordWrapping = false;\n            text.extraPadding = true;\n            text.richText = true;\n            SetDefaultTextValues(text);\n\n            TextMeshProUGUI placeholder = childPlaceholder.AddComponent<TextMeshProUGUI>();\n            placeholder.text = \"Enter text...\";\n            placeholder.fontSize = 14;\n            placeholder.fontStyle = FontStyles.Italic;\n            placeholder.enableWordWrapping = false;\n            placeholder.extraPadding = true;\n\n            // Make placeholder color half as opaque as normal text color.\n            Color placeholderColor = text.color;\n            placeholderColor.a *= 0.5f;\n            placeholder.color = placeholderColor;\n\n            RectTransform textRectTransform = childText.GetComponent<RectTransform>();\n            textRectTransform.anchorMin = Vector2.zero;\n            textRectTransform.anchorMax = Vector2.one;\n            textRectTransform.sizeDelta = Vector2.zero;\n            textRectTransform.offsetMin = new Vector2(0, 0);\n            textRectTransform.offsetMax = new Vector2(0, 0);\n\n            RectTransform placeholderRectTransform = childPlaceholder.GetComponent<RectTransform>();\n            placeholderRectTransform.anchorMin = Vector2.zero;\n            placeholderRectTransform.anchorMax = Vector2.one;\n            placeholderRectTransform.sizeDelta = Vector2.zero;\n            placeholderRectTransform.offsetMin = new Vector2(0, 0);\n            placeholderRectTransform.offsetMax = new Vector2(0, 0);\n\n            inputField.textViewport = textAreaRectTransform;\n            inputField.textComponent = text;\n            inputField.placeholder = placeholder;\n            inputField.fontAsset = text.font;\n\n            return root;\n        }\n\n        public static GameObject CreateDropdown(Resources resources)\n        {\n            GameObject root = CreateUIElementRoot(\"Dropdown\", s_ThickElementSize);\n\n            GameObject label = CreateUIObject(\"Label\", root);\n            GameObject arrow = CreateUIObject(\"Arrow\", root);\n            GameObject template = CreateUIObject(\"Template\", root);\n            GameObject viewport = CreateUIObject(\"Viewport\", template);\n            GameObject content = CreateUIObject(\"Content\", viewport);\n            GameObject item = CreateUIObject(\"Item\", content);\n            GameObject itemBackground = CreateUIObject(\"Item Background\", item);\n            GameObject itemCheckmark = CreateUIObject(\"Item Checkmark\", item);\n            GameObject itemLabel = CreateUIObject(\"Item Label\", item);\n\n            // Sub controls.\n\n            GameObject scrollbar = CreateScrollbar(resources);\n            scrollbar.name = \"Scrollbar\";\n            SetParentAndAlign(scrollbar, template);\n\n            Scrollbar scrollbarScrollbar = scrollbar.GetComponent<Scrollbar>();\n            scrollbarScrollbar.SetDirection(Scrollbar.Direction.BottomToTop, true);\n\n            RectTransform vScrollbarRT = scrollbar.GetComponent<RectTransform>();\n            vScrollbarRT.anchorMin = Vector2.right;\n            vScrollbarRT.anchorMax = Vector2.one;\n            vScrollbarRT.pivot = Vector2.one;\n            vScrollbarRT.sizeDelta = new Vector2(vScrollbarRT.sizeDelta.x, 0);\n\n            // Setup item UI components.\n\n            TextMeshProUGUI itemLabelText = itemLabel.AddComponent<TextMeshProUGUI>();\n            SetDefaultTextValues(itemLabelText);\n            itemLabelText.alignment = TextAlignmentOptions.Left;\n\n            Image itemBackgroundImage = itemBackground.AddComponent<Image>();\n            itemBackgroundImage.color = new Color32(245, 245, 245, 255);\n\n            Image itemCheckmarkImage = itemCheckmark.AddComponent<Image>();\n            itemCheckmarkImage.sprite = resources.checkmark;\n\n            Toggle itemToggle = item.AddComponent<Toggle>();\n            itemToggle.targetGraphic = itemBackgroundImage;\n            itemToggle.graphic = itemCheckmarkImage;\n            itemToggle.isOn = true;\n\n            // Setup template UI components.\n\n            Image templateImage = template.AddComponent<Image>();\n            templateImage.sprite = resources.standard;\n            templateImage.type = Image.Type.Sliced;\n\n            ScrollRect templateScrollRect = template.AddComponent<ScrollRect>();\n            templateScrollRect.content = (RectTransform)content.transform;\n            templateScrollRect.viewport = (RectTransform)viewport.transform;\n            templateScrollRect.horizontal = false;\n            templateScrollRect.movementType = ScrollRect.MovementType.Clamped;\n            templateScrollRect.verticalScrollbar = scrollbarScrollbar;\n            templateScrollRect.verticalScrollbarVisibility = ScrollRect.ScrollbarVisibility.AutoHideAndExpandViewport;\n            templateScrollRect.verticalScrollbarSpacing = -3;\n\n            Mask scrollRectMask = viewport.AddComponent<Mask>();\n            scrollRectMask.showMaskGraphic = false;\n\n            Image viewportImage = viewport.AddComponent<Image>();\n            viewportImage.sprite = resources.mask;\n            viewportImage.type = Image.Type.Sliced;\n\n            // Setup dropdown UI components.\n\n            TextMeshProUGUI labelText = label.AddComponent<TextMeshProUGUI>();\n            SetDefaultTextValues(labelText);\n            labelText.alignment = TextAlignmentOptions.Left;\n\n            Image arrowImage = arrow.AddComponent<Image>();\n            arrowImage.sprite = resources.dropdown;\n\n            Image backgroundImage = root.AddComponent<Image>();\n            backgroundImage.sprite = resources.standard;\n            backgroundImage.color = s_DefaultSelectableColor;\n            backgroundImage.type = Image.Type.Sliced;\n\n            TMP_Dropdown dropdown = root.AddComponent<TMP_Dropdown>();\n            dropdown.targetGraphic = backgroundImage;\n            SetDefaultColorTransitionValues(dropdown);\n            dropdown.template = template.GetComponent<RectTransform>();\n            dropdown.captionText = labelText;\n            dropdown.itemText = itemLabelText;\n\n            // Setting default Item list.\n            itemLabelText.text = \"Option A\";\n            dropdown.options.Add(new TMP_Dropdown.OptionData {text = \"Option A\" });\n            dropdown.options.Add(new TMP_Dropdown.OptionData {text = \"Option B\" });\n            dropdown.options.Add(new TMP_Dropdown.OptionData {text = \"Option C\" });\n            dropdown.RefreshShownValue();\n\n            // Set up RectTransforms.\n\n            RectTransform labelRT = label.GetComponent<RectTransform>();\n            labelRT.anchorMin = Vector2.zero;\n            labelRT.anchorMax = Vector2.one;\n            labelRT.offsetMin = new Vector2(10, 6);\n            labelRT.offsetMax = new Vector2(-25, -7);\n\n            RectTransform arrowRT = arrow.GetComponent<RectTransform>();\n            arrowRT.anchorMin = new Vector2(1, 0.5f);\n            arrowRT.anchorMax = new Vector2(1, 0.5f);\n            arrowRT.sizeDelta = new Vector2(20, 20);\n            arrowRT.anchoredPosition = new Vector2(-15, 0);\n\n            RectTransform templateRT = template.GetComponent<RectTransform>();\n            templateRT.anchorMin = new Vector2(0, 0);\n            templateRT.anchorMax = new Vector2(1, 0);\n            templateRT.pivot = new Vector2(0.5f, 1);\n            templateRT.anchoredPosition = new Vector2(0, 2);\n            templateRT.sizeDelta = new Vector2(0, 150);\n\n            RectTransform viewportRT = viewport.GetComponent<RectTransform>();\n            viewportRT.anchorMin = new Vector2(0, 0);\n            viewportRT.anchorMax = new Vector2(1, 1);\n            viewportRT.sizeDelta = new Vector2(-18, 0);\n            viewportRT.pivot = new Vector2(0, 1);\n\n            RectTransform contentRT = content.GetComponent<RectTransform>();\n            contentRT.anchorMin = new Vector2(0f, 1);\n            contentRT.anchorMax = new Vector2(1f, 1);\n            contentRT.pivot = new Vector2(0.5f, 1);\n            contentRT.anchoredPosition = new Vector2(0, 0);\n            contentRT.sizeDelta = new Vector2(0, 28);\n\n            RectTransform itemRT = item.GetComponent<RectTransform>();\n            itemRT.anchorMin = new Vector2(0, 0.5f);\n            itemRT.anchorMax = new Vector2(1, 0.5f);\n            itemRT.sizeDelta = new Vector2(0, 20);\n\n            RectTransform itemBackgroundRT = itemBackground.GetComponent<RectTransform>();\n            itemBackgroundRT.anchorMin = Vector2.zero;\n            itemBackgroundRT.anchorMax = Vector2.one;\n            itemBackgroundRT.sizeDelta = Vector2.zero;\n\n            RectTransform itemCheckmarkRT = itemCheckmark.GetComponent<RectTransform>();\n            itemCheckmarkRT.anchorMin = new Vector2(0, 0.5f);\n            itemCheckmarkRT.anchorMax = new Vector2(0, 0.5f);\n            itemCheckmarkRT.sizeDelta = new Vector2(20, 20);\n            itemCheckmarkRT.anchoredPosition = new Vector2(10, 0);\n\n            RectTransform itemLabelRT = itemLabel.GetComponent<RectTransform>();\n            itemLabelRT.anchorMin = Vector2.zero;\n            itemLabelRT.anchorMax = Vector2.one;\n            itemLabelRT.offsetMin = new Vector2(20, 1);\n            itemLabelRT.offsetMax = new Vector2(-10, -2);\n\n            template.SetActive(false);\n\n            return root;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_DefaultControls.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 322392995be44d23a3c86cfd972f838f\ntimeCreated: 1446378357\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_Dropdown.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\nusing UnityEngine.UI;\nusing UnityEngine.Events;\nusing UnityEngine.EventSystems;\nusing UnityEngine.UI.CoroutineTween;\n\nnamespace TMPro\n{\n    [AddComponentMenu(\"UI/Dropdown - TextMeshPro\", 35)]\n    [RequireComponent(typeof(RectTransform))]\n    /// <summary>\n    ///   A standard dropdown that presents a list of options when clicked, of which one can be chosen.\n    /// </summary>\n    /// <remarks>\n    /// The dropdown component is a Selectable. When an option is chosen, the label and/or image of the control changes to show the chosen option.\n    ///\n    /// When a dropdown event occurs a callback is sent to any registered listeners of onValueChanged.\n    /// </remarks>\n    public class TMP_Dropdown : Selectable, IPointerClickHandler, ISubmitHandler, ICancelHandler\n    {\n        protected internal class DropdownItem : MonoBehaviour, IPointerEnterHandler, ICancelHandler\n        {\n            [SerializeField]\n            private TMP_Text m_Text;\n            [SerializeField]\n            private Image m_Image;\n            [SerializeField]\n            private RectTransform m_RectTransform;\n            [SerializeField]\n            private Toggle m_Toggle;\n\n            public TMP_Text text { get { return m_Text; } set { m_Text = value; } }\n            public Image image { get { return m_Image; } set { m_Image = value; } }\n            public RectTransform rectTransform { get { return m_RectTransform; } set { m_RectTransform = value; } }\n            public Toggle toggle { get { return m_Toggle; } set { m_Toggle = value; } }\n\n            public virtual void OnPointerEnter(PointerEventData eventData)\n            {\n                EventSystem.current.SetSelectedGameObject(gameObject);\n            }\n\n            public virtual void OnCancel(BaseEventData eventData)\n            {\n                TMP_Dropdown dropdown = GetComponentInParent<TMP_Dropdown>();\n                if (dropdown)\n                    dropdown.Hide();\n            }\n        }\n\n        [Serializable]\n        /// <summary>\n        /// Class to store the text and/or image of a single option in the dropdown list.\n        /// </summary>\n        public class OptionData\n        {\n            [SerializeField]\n            private string m_Text;\n            [SerializeField]\n            private Sprite m_Image;\n\n            /// <summary>\n            /// The text associated with the option.\n            /// </summary>\n            public string text { get { return m_Text; } set { m_Text = value; } }\n\n            /// <summary>\n            /// The image associated with the option.\n            /// </summary>\n            public Sprite image { get { return m_Image; } set { m_Image = value; } }\n\n            public OptionData() { }\n\n            public OptionData(string text)\n            {\n                this.text = text;\n            }\n\n            public OptionData(Sprite image)\n            {\n                this.image = image;\n            }\n\n            /// <summary>\n            /// Create an object representing a single option for the dropdown list.\n            /// </summary>\n            /// <param name=\"text\">Optional text for the option.</param>\n            /// <param name=\"image\">Optional image for the option.</param>\n            public OptionData(string text, Sprite image)\n            {\n                this.text = text;\n                this.image = image;\n            }\n        }\n\n        [Serializable]\n        /// <summary>\n        /// Class used internally to store the list of options for the dropdown list.\n        /// </summary>\n        /// <remarks>\n        /// The usage of this class is not exposed in the runtime API. It's only relevant for the PropertyDrawer drawing the list of options.\n        /// </remarks>\n        public class OptionDataList\n        {\n            [SerializeField]\n            private List<OptionData> m_Options;\n\n            /// <summary>\n            /// The list of options for the dropdown list.\n            /// </summary>\n            public List<OptionData> options { get { return m_Options; } set { m_Options = value; } }\n\n\n            public OptionDataList()\n            {\n                options = new List<OptionData>();\n            }\n        }\n\n        [Serializable]\n        /// <summary>\n        /// UnityEvent callback for when a dropdown current option is changed.\n        /// </summary>\n        public class DropdownEvent : UnityEvent<int> { }\n\n        // Template used to create the dropdown.\n        [SerializeField]\n        private RectTransform m_Template;\n\n        /// <summary>\n        /// The Rect Transform of the template for the dropdown list.\n        /// </summary>\n        public RectTransform template { get { return m_Template; } set { m_Template = value; RefreshShownValue(); } }\n\n        // Text to be used as a caption for the current value. It's not required, but it's kept here for convenience.\n        [SerializeField]\n        private TMP_Text m_CaptionText;\n\n        /// <summary>\n        /// The Text component to hold the text of the currently selected option.\n        /// </summary>\n        public TMP_Text captionText { get { return m_CaptionText; } set { m_CaptionText = value; RefreshShownValue(); } }\n\n        [SerializeField]\n        private Image m_CaptionImage;\n\n        /// <summary>\n        /// The Image component to hold the image of the currently selected option.\n        /// </summary>\n        public Image captionImage { get { return m_CaptionImage; } set { m_CaptionImage = value; RefreshShownValue(); } }\n\n        [Space]\n\n        [SerializeField]\n        private TMP_Text m_ItemText;\n\n        /// <summary>\n        /// The Text component to hold the text of the item.\n        /// </summary>\n        public TMP_Text itemText { get { return m_ItemText; } set { m_ItemText = value; RefreshShownValue(); } }\n\n        [SerializeField]\n        private Image m_ItemImage;\n\n        /// <summary>\n        /// The Image component to hold the image of the item\n        /// </summary>\n        public Image itemImage { get { return m_ItemImage; } set { m_ItemImage = value; RefreshShownValue(); } }\n\n        [Space]\n\n        [SerializeField]\n        private int m_Value;\n\n        [Space]\n\n        // Items that will be visible when the dropdown is shown.\n        // We box this into its own class so we can use a Property Drawer for it.\n        [SerializeField]\n        private OptionDataList m_Options = new OptionDataList();\n\n        /// <summary>\n        /// The list of possible options. A text string and an image can be specified for each option.\n        /// </summary>\n        /// <remarks>\n        /// This is the list of options within the Dropdown. Each option contains Text and/or image data that you can specify using UI.Dropdown.OptionData before adding to the Dropdown list.\n        /// This also unlocks the ability to edit the Dropdown, including the insertion, removal, and finding of options, as well as other useful tools\n        /// </remarks>\n        /// /// <example>\n        /// <code>\n        /// //Create a new Dropdown GameObject by going to the Hierarchy and clicking Create>UI>Dropdown - TextMeshPro. Attach this script to the Dropdown GameObject.\n        ///\n        /// using UnityEngine;\n        /// using UnityEngine.UI;\n        /// using System.Collections.Generic;\n        /// using TMPro;\n        ///\n        /// public class Example : MonoBehaviour\n        /// {\n        ///     //Use these for adding options to the Dropdown List\n        ///     TMP_Dropdown.OptionData m_NewData, m_NewData2;\n        ///     //The list of messages for the Dropdown\n        ///     List<TMP_Dropdown.OptionData> m_Messages = new List<TMP_Dropdown.OptionData>();\n        ///\n        ///\n        ///     //This is the Dropdown\n        ///     TMP_Dropdown m_Dropdown;\n        ///     string m_MyString;\n        ///     int m_Index;\n        ///\n        ///     void Start()\n        ///     {\n        ///         //Fetch the Dropdown GameObject the script is attached to\n        ///         m_Dropdown = GetComponent<TMP_Dropdown>();\n        ///         //Clear the old options of the Dropdown menu\n        ///         m_Dropdown.ClearOptions();\n        ///\n        ///         //Create a new option for the Dropdown menu which reads \"Option 1\" and add to messages List\n        ///         m_NewData = new TMP_Dropdown.OptionData();\n        ///         m_NewData.text = \"Option 1\";\n        ///         m_Messages.Add(m_NewData);\n        ///\n        ///         //Create a new option for the Dropdown menu which reads \"Option 2\" and add to messages List\n        ///         m_NewData2 = new TMP_Dropdown.OptionData();\n        ///         m_NewData2.text = \"Option 2\";\n        ///         m_Messages.Add(m_NewData2);\n        ///\n        ///         //Take each entry in the message List\n        ///         foreach (TMP_Dropdown.OptionData message in m_Messages)\n        ///         {\n        ///             //Add each entry to the Dropdown\n        ///             m_Dropdown.options.Add(message);\n        ///             //Make the index equal to the total number of entries\n        ///             m_Index = m_Messages.Count - 1;\n        ///         }\n        ///     }\n        ///\n        ///     //This OnGUI function is used here for a quick demonstration. See the [[wiki:UISystem|UI Section]] for more information about setting up your own UI.\n        ///     void OnGUI()\n        ///     {\n        ///         //TextField for user to type new entry to add to Dropdown\n        ///         m_MyString = GUI.TextField(new Rect(0, 40, 100, 40), m_MyString);\n        ///\n        ///         //Press the \"Add\" Button to add a new entry to the Dropdown\n        ///         if (GUI.Button(new Rect(0, 0, 100, 40), \"Add\"))\n        ///         {\n        ///             //Make the index the last number of entries\n        ///             m_Index = m_Messages.Count;\n        ///             //Create a temporary option\n        ///             TMP_Dropdown.OptionData temp = new TMP_Dropdown.OptionData();\n        ///             //Make the option the data from the TextField\n        ///             temp.text = m_MyString;\n        ///\n        ///             //Update the messages list with the TextField data\n        ///             m_Messages.Add(temp);\n        ///\n        ///             //Add the Textfield data to the Dropdown\n        ///             m_Dropdown.options.Insert(m_Index, temp);\n        ///         }\n        ///\n        ///         //Press the \"Remove\" button to delete the selected option\n        ///         if (GUI.Button(new Rect(110, 0, 100, 40), \"Remove\"))\n        ///         {\n        ///             //Remove the current selected item from the Dropdown from the messages List\n        ///             m_Messages.RemoveAt(m_Dropdown.value);\n        ///             //Remove the current selection from the Dropdown\n        ///             m_Dropdown.options.RemoveAt(m_Dropdown.value);\n        ///         }\n        ///     }\n        /// }\n        /// </code>\n        /// </example>\n        public List<OptionData> options\n        {\n            get { return m_Options.options; }\n            set { m_Options.options = value; RefreshShownValue(); }\n        }\n\n        [Space]\n\n        // Notification triggered when the dropdown changes.\n        [SerializeField]\n        private DropdownEvent m_OnValueChanged = new DropdownEvent();\n\n        /// <summary>\n        /// A UnityEvent that is invoked when a user has clicked one of the options in the dropdown list.\n        /// </summary>\n        /// <remarks>\n        /// Use this to detect when a user selects one or more options in the Dropdown. Add a listener to perform an action when this UnityEvent detects a selection by the user. See https://unity3d.com/learn/tutorials/topics/scripting/delegates for more information on delegates.\n        /// </remarks>\n        /// <example>\n        ///  <code>\n        /// //Create a new Dropdown GameObject by going to the Hierarchy and clicking Create>UI>Dropdown - TextMeshPro. Attach this script to the Dropdown GameObject.\n        /// //Set your own Text in the Inspector window\n        ///\n        /// using UnityEngine;\n        /// using UnityEngine.UI;\n        /// using TMPro;\n        ///\n        /// public class Example : MonoBehaviour\n        /// {\n        ///     TMP_Dropdown m_Dropdown;\n        ///     public Text m_Text;\n        ///\n        ///     void Start()\n        ///     {\n        ///         //Fetch the Dropdown GameObject\n        ///         m_Dropdown = GetComponent<TMP_Dropdown>();\n        ///         //Add listener for when the value of the Dropdown changes, to take action\n        ///         m_Dropdown.onValueChanged.AddListener(delegate {\n        ///                 DropdownValueChanged(m_Dropdown);\n        ///             });\n        ///\n        ///         //Initialize the Text to say the first value of the Dropdown\n        ///         m_Text.text = \"First Value : \" + m_Dropdown.value;\n        ///     }\n        ///\n        ///     //Output the new value of the Dropdown into Text\n        ///     void DropdownValueChanged(TMP_Dropdown change)\n        ///     {\n        ///         m_Text.text =  \"New Value : \" + change.value;\n        ///     }\n        /// }\n        /// </code>\n        /// </example>\n        public DropdownEvent onValueChanged { get { return m_OnValueChanged; } set { m_OnValueChanged = value; } }\n\n        private GameObject m_Dropdown;\n        private GameObject m_Blocker;\n        private List<DropdownItem> m_Items = new List<DropdownItem>();\n        private TweenRunner<FloatTween> m_AlphaTweenRunner;\n        private bool validTemplate = false;\n\n        private static OptionData s_NoOptionData = new OptionData();\n\n        /// <summary>\n        /// The Value is the index number of the current selection in the Dropdown. 0 is the first option in the Dropdown, 1 is the second, and so on.\n        /// </summary>\n        /// <example>\n        /// <code>\n        /// //Create a new Dropdown GameObject by going to the Hierarchy and clicking Create>UI>Dropdown - TextMeshPro. Attach this script to the Dropdown GameObject.\n        /// //Set your own Text in the Inspector window\n        ///\n        /// using UnityEngine;\n        /// using UnityEngine.UI;\n        /// using TMPro;\n        ///\n        /// public class Example : MonoBehaviour\n        /// {\n        ///     //Attach this script to a Dropdown GameObject\n        ///     TMP_Dropdown m_Dropdown;\n        ///     //This is the string that stores the current selection m_Text of the Dropdown\n        ///     string m_Message;\n        ///     //This Text outputs the current selection to the screen\n        ///     public Text m_Text;\n        ///     //This is the index value of the Dropdown\n        ///     int m_DropdownValue;\n        ///\n        ///     void Start()\n        ///     {\n        ///         //Fetch the DropDown component from the GameObject\n        ///         m_Dropdown = GetComponent<TMP_Dropdown>();\n        ///         //Output the first Dropdown index value\n        ///         Debug.Log(\"Starting Dropdown Value : \" + m_Dropdown.value);\n        ///     }\n        ///\n        ///     void Update()\n        ///     {\n        ///         //Keep the current index of the Dropdown in a variable\n        ///         m_DropdownValue = m_Dropdown.value;\n        ///         //Change the message to say the name of the current Dropdown selection using the value\n        ///         m_Message = m_Dropdown.options[m_DropdownValue].text;\n        ///         //Change the on screen Text to reflect the current Dropdown selection\n        ///         m_Text.text = m_Message;\n        ///     }\n        /// }\n        /// </code>\n        /// </example>\n        public int value\n        {\n            get\n            {\n                return m_Value;\n            }\n            set\n            {\n                SetValue(value);\n            }\n        }\n\n        /// <summary>\n        /// Set index number of the current selection in the Dropdown without invoking onValueChanged callback.\n        /// </summary>\n        /// <param name=\"input\">The new index for the current selection.</param>\n        public void SetValueWithoutNotify(int input)\n        {\n            SetValue(input, false);\n        }\n\n        void SetValue(int value, bool sendCallback = true)\n        {\n            if (Application.isPlaying && (value == m_Value || options.Count == 0))\n                return;\n\n            m_Value = Mathf.Clamp(value, 0, options.Count - 1);\n            RefreshShownValue();\n\n            if (sendCallback)\n            {\n                // Notify all listeners\n                UISystemProfilerApi.AddMarker(\"Dropdown.value\", this);\n                m_OnValueChanged.Invoke(m_Value);\n            }\n        }\n\n        public bool IsExpanded { get { return m_Dropdown != null; } }\n\n        protected TMP_Dropdown() { }\n\n        protected override void Awake()\n        {\n            #if UNITY_EDITOR\n            if (!Application.isPlaying)\n                return;\n            #endif\n\n            m_AlphaTweenRunner = new TweenRunner<FloatTween>();\n            m_AlphaTweenRunner.Init(this);\n\n            if (m_CaptionImage)\n                m_CaptionImage.enabled = (m_CaptionImage.sprite != null);\n\n            if (m_Template)\n                m_Template.gameObject.SetActive(false);\n        }\n\n        protected override void Start()\n        {\n            base.Start();\n\n            RefreshShownValue();\n        }\n\n        #if UNITY_EDITOR\n        protected override void OnValidate()\n        {\n            base.OnValidate();\n\n            if (!IsActive())\n                return;\n\n            RefreshShownValue();\n        }\n        #endif\n\n        protected override void OnDisable()\n        {\n            //Destroy dropdown and blocker in case user deactivates the dropdown when they click an option (case 935649)\n            ImmediateDestroyDropdownList();\n\n            if (m_Blocker != null)\n                DestroyBlocker(m_Blocker);\n            m_Blocker = null;\n        }\n\n        /// <summary>\n        /// Refreshes the text and image (if available) of the currently selected option.\n        /// </summary>\n        /// <remarks>\n        /// If you have modified the list of options, you should call this method afterwards to ensure that the visual state of the dropdown corresponds to the updated options.\n        /// </remarks>\n        public void RefreshShownValue()\n        {\n            OptionData data = s_NoOptionData;\n\n            if (options.Count > 0)\n                data = options[Mathf.Clamp(m_Value, 0, options.Count - 1)];\n\n            if (m_CaptionText)\n            {\n                if (data != null && data.text != null)\n                    m_CaptionText.text = data.text;\n                else\n                    m_CaptionText.text = \"\";\n            }\n\n            if (m_CaptionImage)\n            {\n                if (data != null)\n                    m_CaptionImage.sprite = data.image;\n                else\n                    m_CaptionImage.sprite = null;\n                m_CaptionImage.enabled = (m_CaptionImage.sprite != null);\n            }\n        }\n\n        /// <summary>\n        /// Add multiple options to the options of the Dropdown based on a list of OptionData objects.\n        /// </summary>\n        /// <param name=\"options\">The list of OptionData to add.</param>\n        /// /// <remarks>\n        /// See AddOptions(List<string> options) for code example of usages.\n        /// </remarks>\n        public void AddOptions(List<OptionData> options)\n        {\n            this.options.AddRange(options);\n            RefreshShownValue();\n        }\n\n        /// <summary>\n        /// Add multiple text-only options to the options of the Dropdown based on a list of strings.\n        /// </summary>\n        /// <remarks>\n        /// Add a List of string messages to the Dropdown. The Dropdown shows each member of the list as a separate option.\n        /// </remarks>\n        /// <param name=\"options\">The list of text strings to add.</param>\n        /// <example>\n        /// <code>\n        /// //Create a new Dropdown GameObject by going to the Hierarchy and clicking Create>UI>Dropdown - TextMeshPro. Attach this script to the Dropdown GameObject.\n        ///\n        /// using System.Collections.Generic;\n        /// using UnityEngine;\n        /// using UnityEngine.UI;\n        /// using TMPro;\n        ///\n        /// public class Example : MonoBehaviour\n        /// {\n        ///     //Create a List of new Dropdown options\n        ///     List<string> m_DropOptions = new List<string> { \"Option 1\", \"Option 2\"};\n        ///     //This is the Dropdown\n        ///     TMP_Dropdown m_Dropdown;\n        ///\n        ///     void Start()\n        ///     {\n        ///         //Fetch the Dropdown GameObject the script is attached to\n        ///         m_Dropdown = GetComponent<TMP_Dropdown>();\n        ///         //Clear the old options of the Dropdown menu\n        ///         m_Dropdown.ClearOptions();\n        ///         //Add the options created in the List above\n        ///         m_Dropdown.AddOptions(m_DropOptions);\n        ///     }\n        /// }\n        /// </code>\n        /// </example>\n        public void AddOptions(List<string> options)\n        {\n            for (int i = 0; i < options.Count; i++)\n                this.options.Add(new OptionData(options[i]));\n\n            RefreshShownValue();\n        }\n\n        /// <summary>\n        /// Add multiple image-only options to the options of the Dropdown based on a list of Sprites.\n        /// </summary>\n        /// <param name=\"options\">The list of Sprites to add.</param>\n        /// <remarks>\n        /// See AddOptions(List<string> options) for code example of usages.\n        /// </remarks>\n        public void AddOptions(List<Sprite> options)\n        {\n            for (int i = 0; i < options.Count; i++)\n                this.options.Add(new OptionData(options[i]));\n\n            RefreshShownValue();\n        }\n\n        /// <summary>\n        /// Clear the list of options in the Dropdown.\n        /// </summary>\n        public void ClearOptions()\n        {\n            options.Clear();\n            m_Value = 0;\n            RefreshShownValue();\n        }\n\n        private void SetupTemplate()\n        {\n            validTemplate = false;\n\n            if (!m_Template)\n            {\n                Debug.LogError(\"The dropdown template is not assigned. The template needs to be assigned and must have a child GameObject with a Toggle component serving as the item.\", this);\n                return;\n            }\n\n            GameObject templateGo = m_Template.gameObject;\n            templateGo.SetActive(true);\n            Toggle itemToggle = m_Template.GetComponentInChildren<Toggle>();\n\n            validTemplate = true;\n            if (!itemToggle || itemToggle.transform == template)\n            {\n                validTemplate = false;\n                Debug.LogError(\"The dropdown template is not valid. The template must have a child GameObject with a Toggle component serving as the item.\", template);\n            }\n            else if (!(itemToggle.transform.parent is RectTransform))\n            {\n                validTemplate = false;\n                Debug.LogError(\"The dropdown template is not valid. The child GameObject with a Toggle component (the item) must have a RectTransform on its parent.\", template);\n            }\n            else if (itemText != null && !itemText.transform.IsChildOf(itemToggle.transform))\n            {\n                validTemplate = false;\n                Debug.LogError(\"The dropdown template is not valid. The Item Text must be on the item GameObject or children of it.\", template);\n            }\n            else if (itemImage != null && !itemImage.transform.IsChildOf(itemToggle.transform))\n            {\n                validTemplate = false;\n                Debug.LogError(\"The dropdown template is not valid. The Item Image must be on the item GameObject or children of it.\", template);\n            }\n\n            if (!validTemplate)\n            {\n                templateGo.SetActive(false);\n                return;\n            }\n\n            DropdownItem item = itemToggle.gameObject.AddComponent<DropdownItem>();\n            item.text = m_ItemText;\n            item.image = m_ItemImage;\n            item.toggle = itemToggle;\n            item.rectTransform = (RectTransform)itemToggle.transform;\n\n            Canvas popupCanvas = GetOrAddComponent<Canvas>(templateGo);\n            popupCanvas.overrideSorting = true;\n            popupCanvas.sortingOrder = 30000;\n\n            GetOrAddComponent<GraphicRaycaster>(templateGo);\n            GetOrAddComponent<CanvasGroup>(templateGo);\n            templateGo.SetActive(false);\n\n            validTemplate = true;\n        }\n\n        private static T GetOrAddComponent<T>(GameObject go) where T : Component\n        {\n            T comp = go.GetComponent<T>();\n            if (!comp)\n                comp = go.AddComponent<T>();\n            return comp;\n        }\n\n        /// <summary>\n        /// Handling for when the dropdown is initially 'clicked'. Typically shows the dropdown\n        /// </summary>\n        /// <param name=\"eventData\">The associated event data.</param>\n        public virtual void OnPointerClick(PointerEventData eventData)\n        {\n            Show();\n        }\n\n        /// <summary>\n        /// Handling for when the dropdown is selected and a submit event is processed. Typically shows the dropdown\n        /// </summary>\n        /// <param name=\"eventData\">The associated event data.</param>\n        public virtual void OnSubmit(BaseEventData eventData)\n        {\n            Show();\n        }\n\n        /// <summary>\n        /// This will hide the dropdown list.\n        /// </summary>\n        /// <remarks>\n        /// Called by a BaseInputModule when a Cancel event occurs.\n        /// </remarks>\n        /// <param name=\"eventData\">The associated event data.</param>\n        public virtual void OnCancel(BaseEventData eventData)\n        {\n            Hide();\n        }\n\n        /// <summary>\n        /// Show the dropdown.\n        ///\n        /// Plan for dropdown scrolling to ensure dropdown is contained within screen.\n        ///\n        /// We assume the Canvas is the screen that the dropdown must be kept inside.\n        /// This is always valid for screen space canvas modes.\n        /// For world space canvases we don't know how it's used, but it could be e.g. for an in-game monitor.\n        /// We consider it a fair constraint that the canvas must be big enough to contain dropdowns.\n        /// </summary>\n        public void Show()\n        {\n            if (!IsActive() || !IsInteractable() || m_Dropdown != null)\n                return;\n\n            // Get root Canvas.\n            var list = TMP_ListPool<Canvas>.Get();\n            gameObject.GetComponentsInParent(false, list);\n            if (list.Count == 0)\n                return;\n\n            Canvas rootCanvas = list[list.Count - 1];\n            for (int i = 0; i < list.Count; i++)\n            {\n                if (list[i].isRootCanvas)\n                {\n                    rootCanvas = list[i];\n                    break;\n                }\n            }\n\n            TMP_ListPool<Canvas>.Release(list);\n\n            if (!validTemplate)\n            {\n                SetupTemplate();\n                if (!validTemplate)\n                    return;\n            }\n\n            m_Template.gameObject.SetActive(true);\n\n            // popupCanvas used to assume the root canvas had the default sorting Layer, next line fixes (case 958281 - [UI] Dropdown list does not copy the parent canvas layer when the panel is opened)\n            m_Template.GetComponent<Canvas>().sortingLayerID = rootCanvas.sortingLayerID;\n\n            // Instantiate the drop-down template\n            m_Dropdown = CreateDropdownList(m_Template.gameObject);\n            m_Dropdown.name = \"Dropdown List\";\n            m_Dropdown.SetActive(true);\n\n            // Make drop-down RectTransform have same values as original.\n            RectTransform dropdownRectTransform = m_Dropdown.transform as RectTransform;\n            dropdownRectTransform.SetParent(m_Template.transform.parent, false);\n\n            // Instantiate the drop-down list items\n\n            // Find the dropdown item and disable it.\n            DropdownItem itemTemplate = m_Dropdown.GetComponentInChildren<DropdownItem>();\n\n            GameObject content = itemTemplate.rectTransform.parent.gameObject;\n            RectTransform contentRectTransform = content.transform as RectTransform;\n            itemTemplate.rectTransform.gameObject.SetActive(true);\n\n            // Get the rects of the dropdown and item\n            Rect dropdownContentRect = contentRectTransform.rect;\n            Rect itemTemplateRect = itemTemplate.rectTransform.rect;\n\n            // Calculate the visual offset between the item's edges and the background's edges\n            Vector2 offsetMin = itemTemplateRect.min - dropdownContentRect.min + (Vector2)itemTemplate.rectTransform.localPosition;\n            Vector2 offsetMax = itemTemplateRect.max - dropdownContentRect.max + (Vector2)itemTemplate.rectTransform.localPosition;\n            Vector2 itemSize = itemTemplateRect.size;\n\n            m_Items.Clear();\n\n            Toggle prev = null;\n            for (int i = 0; i < options.Count; ++i)\n            {\n                OptionData data = options[i];\n                DropdownItem item = AddItem(data, value == i, itemTemplate, m_Items);\n                if (item == null)\n                    continue;\n\n                // Automatically set up a toggle state change listener\n                item.toggle.isOn = value == i;\n                item.toggle.onValueChanged.AddListener(x => OnSelectItem(item.toggle));\n\n                // Select current option\n                if (item.toggle.isOn)\n                    item.toggle.Select();\n\n                // Automatically set up explicit navigation\n                if (prev != null)\n                {\n                    Navigation prevNav = prev.navigation;\n                    Navigation toggleNav = item.toggle.navigation;\n                    prevNav.mode = Navigation.Mode.Explicit;\n                    toggleNav.mode = Navigation.Mode.Explicit;\n\n                    prevNav.selectOnDown = item.toggle;\n                    prevNav.selectOnRight = item.toggle;\n                    toggleNav.selectOnLeft = prev;\n                    toggleNav.selectOnUp = prev;\n\n                    prev.navigation = prevNav;\n                    item.toggle.navigation = toggleNav;\n                }\n                prev = item.toggle;\n            }\n\n            // Reposition all items now that all of them have been added\n            Vector2 sizeDelta = contentRectTransform.sizeDelta;\n            sizeDelta.y = itemSize.y * m_Items.Count + offsetMin.y - offsetMax.y;\n            contentRectTransform.sizeDelta = sizeDelta;\n\n            float extraSpace = dropdownRectTransform.rect.height - contentRectTransform.rect.height;\n            if (extraSpace > 0)\n                dropdownRectTransform.sizeDelta = new Vector2(dropdownRectTransform.sizeDelta.x, dropdownRectTransform.sizeDelta.y - extraSpace);\n\n            // Invert anchoring and position if dropdown is partially or fully outside of canvas rect.\n            // Typically this will have the effect of placing the dropdown above the button instead of below,\n            // but it works as inversion regardless of initial setup.\n            Vector3[] corners = new Vector3[4];\n            dropdownRectTransform.GetWorldCorners(corners);\n\n            RectTransform rootCanvasRectTransform = rootCanvas.transform as RectTransform;\n            Rect rootCanvasRect = rootCanvasRectTransform.rect;\n            for (int axis = 0; axis < 2; axis++)\n            {\n                bool outside = false;\n                for (int i = 0; i < 4; i++)\n                {\n                    Vector3 corner = rootCanvasRectTransform.InverseTransformPoint(corners[i]);\n                    if ((corner[axis] < rootCanvasRect.min[axis] && !Mathf.Approximately(corner[axis], rootCanvasRect.min[axis])) ||\n                        (corner[axis] > rootCanvasRect.max[axis] && !Mathf.Approximately(corner[axis], rootCanvasRect.max[axis])))\n                    {\n                        outside = true;\n                        break;\n                    }\n                }\n                if (outside)\n                    RectTransformUtility.FlipLayoutOnAxis(dropdownRectTransform, axis, false, false);\n            }\n\n            for (int i = 0; i < m_Items.Count; i++)\n            {\n                RectTransform itemRect = m_Items[i].rectTransform;\n                itemRect.anchorMin = new Vector2(itemRect.anchorMin.x, 0);\n                itemRect.anchorMax = new Vector2(itemRect.anchorMax.x, 0);\n                itemRect.anchoredPosition = new Vector2(itemRect.anchoredPosition.x, offsetMin.y + itemSize.y * (m_Items.Count - 1 - i) + itemSize.y * itemRect.pivot.y);\n                itemRect.sizeDelta = new Vector2(itemRect.sizeDelta.x, itemSize.y);\n            }\n\n            // Fade in the popup\n            AlphaFadeList(0.15f, 0f, 1f);\n\n            // Make drop-down template and item template inactive\n            m_Template.gameObject.SetActive(false);\n            itemTemplate.gameObject.SetActive(false);\n\n            m_Blocker = CreateBlocker(rootCanvas);\n        }\n\n        /// <summary>\n        /// Create a blocker that blocks clicks to other controls while the dropdown list is open.\n        /// </summary>\n        /// <remarks>\n        /// Override this method to implement a different way to obtain a blocker GameObject.\n        /// </remarks>\n        /// <param name=\"rootCanvas\">The root canvas the dropdown is under.</param>\n        /// <returns>The created blocker object</returns>\n        protected virtual GameObject CreateBlocker(Canvas rootCanvas)\n        {\n            // Create blocker GameObject.\n            GameObject blocker = new GameObject(\"Blocker\");\n\n            // Setup blocker RectTransform to cover entire root canvas area.\n            RectTransform blockerRect = blocker.AddComponent<RectTransform>();\n            blockerRect.SetParent(rootCanvas.transform, false);\n            blockerRect.anchorMin = Vector3.zero;\n            blockerRect.anchorMax = Vector3.one;\n            blockerRect.sizeDelta = Vector2.zero;\n\n            // Make blocker be in separate canvas in same layer as dropdown and in layer just below it.\n            Canvas blockerCanvas = blocker.AddComponent<Canvas>();\n            blockerCanvas.overrideSorting = true;\n            Canvas dropdownCanvas = m_Dropdown.GetComponent<Canvas>();\n            blockerCanvas.sortingLayerID = dropdownCanvas.sortingLayerID;\n            blockerCanvas.sortingOrder = dropdownCanvas.sortingOrder - 1;\n\n            // Add raycaster since it's needed to block.\n            blocker.AddComponent<GraphicRaycaster>();\n\n            // Add image since it's needed to block, but make it clear.\n            Image blockerImage = blocker.AddComponent<Image>();\n            blockerImage.color = Color.clear;\n\n            // Add button since it's needed to block, and to close the dropdown when blocking area is clicked.\n            Button blockerButton = blocker.AddComponent<Button>();\n            blockerButton.onClick.AddListener(Hide);\n\n            return blocker;\n        }\n\n        /// <summary>\n        /// Convenience method to explicitly destroy the previously generated blocker object\n        /// </summary>\n        /// <remarks>\n        /// Override this method to implement a different way to dispose of a blocker GameObject that blocks clicks to other controls while the dropdown list is open.\n        /// </remarks>\n        /// <param name=\"blocker\">The blocker object to destroy.</param>\n        protected virtual void DestroyBlocker(GameObject blocker)\n        {\n            Destroy(blocker);\n        }\n\n        /// <summary>\n        /// Create the dropdown list to be shown when the dropdown is clicked. The dropdown list should correspond to the provided template GameObject, equivalent to instantiating a copy of it.\n        /// </summary>\n        /// <remarks>\n        /// Override this method to implement a different way to obtain a dropdown list GameObject.\n        /// </remarks>\n        /// <param name=\"template\">The template to create the dropdown list from.</param>\n        /// <returns>The created drop down list gameobject.</returns>\n        protected virtual GameObject CreateDropdownList(GameObject template)\n        {\n            return (GameObject)Instantiate(template);\n        }\n\n        /// <summary>\n        /// Convenience method to explicitly destroy the previously generated dropdown list\n        /// </summary>\n        /// <remarks>\n        /// Override this method to implement a different way to dispose of a dropdown list GameObject.\n        /// </remarks>\n        /// <param name=\"dropdownList\">The dropdown list GameObject to destroy</param>\n        protected virtual void DestroyDropdownList(GameObject dropdownList)\n        {\n            Destroy(dropdownList);\n        }\n\n        /// <summary>\n        /// Create a dropdown item based upon the item template.\n        /// </summary>\n        /// <remarks>\n        /// Override this method to implement a different way to obtain an option item.\n        /// The option item should correspond to the provided template DropdownItem and its GameObject, equivalent to instantiating a copy of it.\n        /// </remarks>\n        /// <param name=\"itemTemplate\">e template to create the option item from.</param>\n        /// <returns>The created dropdown item component</returns>\n        protected virtual DropdownItem CreateItem(DropdownItem itemTemplate)\n        {\n            return (DropdownItem)Instantiate(itemTemplate);\n        }\n\n        /// <summary>\n        ///  Convenience method to explicitly destroy the previously generated Items.\n        /// </summary>\n        /// <remarks>\n        /// Override this method to implement a different way to dispose of an option item.\n        /// Likely no action needed since destroying the dropdown list destroys all contained items as well.\n        /// </remarks>\n        /// <param name=\"item\">The Item to destroy.</param>\n        protected virtual void DestroyItem(DropdownItem item) { }\n\n        // Add a new drop-down list item with the specified values.\n        private DropdownItem AddItem(OptionData data, bool selected, DropdownItem itemTemplate, List<DropdownItem> items)\n        {\n            // Add a new item to the dropdown.\n            DropdownItem item = CreateItem(itemTemplate);\n            item.rectTransform.SetParent(itemTemplate.rectTransform.parent, false);\n\n            item.gameObject.SetActive(true);\n            item.gameObject.name = \"Item \" + items.Count + (data.text != null ? \": \" + data.text : \"\");\n\n            if (item.toggle != null)\n            {\n                item.toggle.isOn = false;\n            }\n\n            // Set the item's data\n            if (item.text)\n                item.text.text = data.text;\n            if (item.image)\n            {\n                item.image.sprite = data.image;\n                item.image.enabled = (item.image.sprite != null);\n            }\n\n            items.Add(item);\n            return item;\n        }\n\n        private void AlphaFadeList(float duration, float alpha)\n        {\n            CanvasGroup group = m_Dropdown.GetComponent<CanvasGroup>();\n            AlphaFadeList(duration, group.alpha, alpha);\n        }\n\n        private void AlphaFadeList(float duration, float start, float end)\n        {\n            if (end.Equals(start))\n                return;\n\n            FloatTween tween = new FloatTween { duration = duration, startValue = start, targetValue = end };\n            tween.AddOnChangedCallback(SetAlpha);\n            tween.ignoreTimeScale = true;\n            m_AlphaTweenRunner.StartTween(tween);\n        }\n\n        private void SetAlpha(float alpha)\n        {\n            if (!m_Dropdown)\n                return;\n            CanvasGroup group = m_Dropdown.GetComponent<CanvasGroup>();\n            group.alpha = alpha;\n        }\n\n        /// <summary>\n        /// Hide the dropdown list. I.e. close it.\n        /// </summary>\n        public void Hide()\n        {\n            if (m_Dropdown != null)\n            {\n                AlphaFadeList(0.15f, 0f);\n\n                // User could have disabled the dropdown during the OnValueChanged call.\n                if (IsActive())\n                    StartCoroutine(DelayedDestroyDropdownList(0.15f));\n            }\n            if (m_Blocker != null)\n                DestroyBlocker(m_Blocker);\n            m_Blocker = null;\n            Select();\n        }\n\n        private IEnumerator DelayedDestroyDropdownList(float delay)\n        {\n            yield return new WaitForSecondsRealtime(delay);\n            ImmediateDestroyDropdownList();\n        }\n\n        private void ImmediateDestroyDropdownList()\n        {\n            for (int i = 0; i < m_Items.Count; i++)\n            {\n                if (m_Items[i] != null)\n                    DestroyItem(m_Items[i]);\n            }\n            m_Items.Clear();\n\n            if (m_Dropdown != null)\n                DestroyDropdownList(m_Dropdown);\n            m_Dropdown = null;\n        }\n\n        // Change the value and hide the dropdown.\n        private void OnSelectItem(Toggle toggle)\n        {\n            if (!toggle.isOn)\n                toggle.isOn = true;\n\n            int selectedIndex = -1;\n            Transform tr = toggle.transform;\n            Transform parent = tr.parent;\n            for (int i = 0; i < parent.childCount; i++)\n            {\n                if (parent.GetChild(i) == tr)\n                {\n                    // Subtract one to account for template child.\n                    selectedIndex = i - 1;\n                    break;\n                }\n            }\n\n            if (selectedIndex < 0)\n                return;\n\n            value = selectedIndex;\n            Hide();\n        }\n    }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_Dropdown.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 7b743370ac3e4ec2a1668f5455a8ef8a\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {fileID: 2800000, guid: a7ec9e7ad8b847b7ae4510af83c5d868, type: 3}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_EditorResourceManager.cs",
    "content": "﻿#if UNITY_EDITOR\n\nusing System.Collections.Generic;\nusing UnityEngine;\nusing UnityEditor;\n\n\nnamespace TMPro\n{\n    public class TMP_EditorResourceManager\n    {\n        private static TMP_EditorResourceManager s_Instance;\n\n        private readonly List<Object> m_ObjectUpdateQueue = new List<Object>();\n        private Dictionary<int, int> m_ObjectUpdateQueueLookup = new Dictionary<int, int>();\n\n        private readonly List<Object> m_ObjectReImportQueue = new List<Object>();\n        private Dictionary<int, int> m_ObjectReImportQueueLookup = new Dictionary<int, int>();\n\n        /// <summary>\n        /// Get a singleton instance of the manager.\n        /// </summary>\n        public static TMP_EditorResourceManager instance\n        {\n            get\n            {\n                if (s_Instance == null)\n                    s_Instance = new TMP_EditorResourceManager();\n\n                return s_Instance;\n            }\n        }\n\n        /// <summary>\n        /// Register to receive rendering callbacks.\n        /// </summary>\n        private TMP_EditorResourceManager()\n        {\n            Camera.onPostRender += OnCameraPostRender;\n        }\n\n\n        void OnCameraPostRender(Camera cam)\n        {\n            // Exclude the PreRenderCamera\n            if (cam.cameraType == CameraType.Preview)\n                return;\n\n            DoUpdates();\n        }\n\n        /// <summary>\n        /// Register resource for re-import.\n        /// </summary>\n        /// <param name=\"obj\"></param>\n        internal static void RegisterResourceForReimport(Object obj)\n        {\n            instance.InternalRegisterResourceForReimport(obj);\n        }\n\n        private void InternalRegisterResourceForReimport(Object obj)\n        {\n            int id = obj.GetInstanceID();\n\n            if (m_ObjectReImportQueueLookup.ContainsKey(id))\n                return;\n\n            m_ObjectReImportQueueLookup[id] = id;\n            m_ObjectReImportQueue.Add(obj);\n\n            return;\n        }\n\n        /// <summary>\n        /// Register resource to be updated.\n        /// </summary>\n        /// <param name=\"textObject\"></param>\n        internal static void RegisterResourceForUpdate(Object obj)\n        {\n            instance.InternalRegisterResourceForUpdate(obj);\n        }\n\n        private void InternalRegisterResourceForUpdate(Object obj)\n        {\n            int id = obj.GetInstanceID();\n\n            if (m_ObjectUpdateQueueLookup.ContainsKey(id))\n                return;\n\n            m_ObjectUpdateQueueLookup[id] = id;\n            m_ObjectUpdateQueue.Add(obj);\n\n            return;\n        }\n\n\n        void DoUpdates()\n        {\n            // Handle objects that need updating\n            int objUpdateCount = m_ObjectUpdateQueue.Count;\n\n            for (int i = 0; i < objUpdateCount; i++)\n            {\n                Object obj = m_ObjectUpdateQueue[i];\n                if (obj != null)\n                {\n                    EditorUtility.SetDirty(obj);\n                }\n            }\n\n            if (objUpdateCount > 0)\n            {\n                //Debug.Log(\"Saving assets\");\n                //AssetDatabase.SaveAssets();\n\n                m_ObjectUpdateQueue.Clear();\n                m_ObjectUpdateQueueLookup.Clear();\n            }\n\n            // Handle objects that need re-importing\n            int objReImportCount = m_ObjectReImportQueue.Count;\n\n            for (int i = 0; i < objReImportCount; i++)\n            {\n                Object obj = m_ObjectReImportQueue[i];\n                if (obj != null)\n                {\n                    //Debug.Log(\"Re-importing [\" + obj.name + \"]\");\n                    AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(obj));\n                }\n            }\n\n            if (objReImportCount > 0)\n            {\n                m_ObjectReImportQueue.Clear();\n                m_ObjectReImportQueueLookup.Clear();\n            }\n        }\n\n    }\n}\n#endif\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_EditorResourceManager.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 6b259c4003a802847b9ada90744e34c5\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_FontAsset.cs",
    "content": "using System;\nusing UnityEngine;\nusing UnityEngine.Serialization;\nusing UnityEngine.TextCore;\nusing UnityEngine.TextCore.LowLevel;\nusing UnityEngine.Profiling;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\n\n\nnamespace TMPro\n{\n    public enum AtlasPopulationMode\n    {\n        Static = 0x0,\n        Dynamic = 0x1,\n    }\n\n\n    [Serializable]\n    public class TMP_FontAsset : TMP_Asset\n    {\n        /// <summary>\n        /// The version of the font asset class.\n        /// Version 1.1.0 adds support for the new TextCore.FontEngine and Dynamic SDF system.\n        /// </summary>\n        public string version\n        {\n            get { return m_Version; }\n            internal set { m_Version = value; }\n        }\n        [SerializeField]\n        private string m_Version;\n\n        /// <summary>\n        /// This field is set when the font asset is first created.\n        /// </summary>\n        [SerializeField]\n        internal string m_SourceFontFileGUID;\n        \n        #if UNITY_EDITOR\n        /// <summary>\n        /// Persistent reference to the source font file maintained in the editor.\n        /// </summary>\n        [SerializeField]\n        internal Font m_SourceFontFile_EditorRef;\n        #endif\n\n        /// <summary>\n        /// Source font file when atlas population mode is set to dynamic. Null when the atlas population mode is set to static. \n        /// </summary>\n        public Font sourceFontFile\n        {\n            get { return m_SourceFontFile; }\n            internal set { m_SourceFontFile = value; }\n        }\n        [SerializeField]\n        private Font m_SourceFontFile;\n\n        public AtlasPopulationMode atlasPopulationMode\n        {\n            get { return m_AtlasPopulationMode; }\n\n            set\n            {\n                m_AtlasPopulationMode = value;\n\n                #if UNITY_EDITOR\n                if (m_AtlasPopulationMode == AtlasPopulationMode.Static)\n                    m_SourceFontFile = null;\n                else if (m_AtlasPopulationMode == AtlasPopulationMode.Dynamic)\n                    m_SourceFontFile = m_SourceFontFile_EditorRef;\n                #endif\n            }\n        }\n        [SerializeField]\n        private AtlasPopulationMode m_AtlasPopulationMode;\n\n\n        /// <summary>\n        /// Information about the font face.\n        /// </summary>\n        public FaceInfo faceInfo\n        {\n            get { return m_FaceInfo; }\n            internal set { m_FaceInfo = value; }\n        }\n        [SerializeField]\n        private FaceInfo m_FaceInfo;\n\n\n        /// <summary>\n        /// List of glyphs contained in the font asset.\n        /// </summary>\n        public List<Glyph> glyphTable\n        {\n            get { return m_GlyphTable; }\n            internal set { m_GlyphTable = value; }\n        }\n        [SerializeField]\n        private List<Glyph> m_GlyphTable = new List<Glyph>();\n\n        /// <summary>\n        /// Dictionary used to lookup glyphs contained in the font asset by their index.\n        /// </summary>\n        public Dictionary<uint, Glyph> glyphLookupTable\n        {\n            get\n            {\n                if (m_GlyphLookupDictionary == null)\n                    ReadFontAssetDefinition();\n\n                return m_GlyphLookupDictionary;\n            }\n        }\n        private Dictionary<uint, Glyph> m_GlyphLookupDictionary;\n\n\n        /// <summary>\n        /// List containing the characters of the given font asset.\n        /// </summary>\n        public List<TMP_Character> characterTable\n        {\n            get { return m_CharacterTable; }\n            internal set { m_CharacterTable = value; }\n        }\n        [SerializeField]\n        private List<TMP_Character> m_CharacterTable = new List<TMP_Character>();\n\n        /// <summary>\n        /// Dictionary used to lookup characters contained in the font asset by their unicode values.\n        /// </summary>\n        public Dictionary<uint, TMP_Character> characterLookupTable\n        {\n            get\n            {\n                if (m_CharacterLookupDictionary == null)\n                    ReadFontAssetDefinition();\n\n\n                return m_CharacterLookupDictionary;\n            }\n        }\n        private Dictionary<uint, TMP_Character> m_CharacterLookupDictionary;\n\n\n        /// <summary>\n        /// The font atlas used by this font asset.\n        /// This is always the texture at index [0] of the fontAtlasTextures.\n        /// </summary>\n        public Texture2D atlasTexture\n        {\n            get\n            {\n                if (m_AtlasTexture == null)\n                {\n                    m_AtlasTexture = atlasTextures[0];\n                }\n\n                return m_AtlasTexture;\n            }\n        }\n        private Texture2D m_AtlasTexture;\n\n        /// <summary>\n        /// Array of atlas textures that contain the glyphs used by this font asset.\n        /// </summary>\n        public Texture2D[] atlasTextures\n        {\n            get\n            {\n                if (m_AtlasTextures == null)\n                {\n                    //\n                }\n\n                return m_AtlasTextures;\n            }\n\n            set\n            {\n                m_AtlasTextures = value;\n            }\n        }\n        [SerializeField]\n        private Texture2D[] m_AtlasTextures;\n\n        /// <summary>\n        /// Index of the font atlas texture that still has available space to add new glyphs.\n        /// </summary>\n        [SerializeField]\n        internal int m_AtlasTextureIndex;\n\n        /// <summary>\n        /// List of spaces occupied by glyphs in a given texture.\n        /// </summary>\n        internal List<GlyphRect> usedGlyphRects\n        {\n            get { return m_UsedGlyphRects; }\n            set { m_UsedGlyphRects = value; }\n        }\n        [SerializeField]\n        private List<GlyphRect> m_UsedGlyphRects;\n\n        /// <summary>\n        /// List of spaces available in a given texture to add new glyphs.\n        /// </summary>\n        internal List<GlyphRect> freeGlyphRects\n        {\n            get { return m_FreeGlyphRects; }\n            set { m_FreeGlyphRects = value; }\n        }\n        [SerializeField]\n        private List<GlyphRect> m_FreeGlyphRects;\n\n        /// <summary>\n        /// The general information about the font.\n        /// This property and FaceInfo_Legacy type are not longer used in version 1.1.0 of the font asset.\n        /// </summary>\n\t\t[Obsolete(\"The fontInfo property and underlying type is now obsolete. Please use the faceInfo property and FaceInfo type instead.\")]\n        public FaceInfo_Legacy fontInfo\n        {\n            get { return m_fontInfo; }\n        }\n\n        [SerializeField]\n        private FaceInfo_Legacy m_fontInfo = null;\n\n        /// <summary>\n        /// \n        /// </summary>\n        [SerializeField]\n        public Texture2D atlas; // Should add a property to make this read-only.\n\n        /// <summary>\n        /// The width of the atlas texture(s) used by this font asset.\n        /// </summary>\n        public int atlasWidth\n        {\n            get { return m_AtlasWidth; }\n            internal set { m_AtlasWidth = value; }\n        }\n        [SerializeField]\n        private int m_AtlasWidth;\n\n        /// <summary>\n        /// The height of the atlas texture(s) used by this font asset.\n        /// </summary>\n        public int atlasHeight\n        {\n            get { return m_AtlasHeight; }\n            internal set { m_AtlasHeight = value; }\n        }\n        [SerializeField]\n        private int m_AtlasHeight;\n\n        /// <summary>\n        /// The padding used between glyphs contained in the atlas texture(s) used by this font asset.\n        /// </summary>\n        public int atlasPadding\n        {\n            get { return m_AtlasPadding; }\n            internal set { m_AtlasPadding = value; }\n        }\n        [SerializeField]\n        private int m_AtlasPadding;\n\n        public GlyphRenderMode atlasRenderMode\n        {\n            get { return m_AtlasRenderMode; }\n            internal set { m_AtlasRenderMode = value; }\n        }\n        [SerializeField]\n        private GlyphRenderMode m_AtlasRenderMode;\n\n        // Legacy field that will eventually be removed.\n        [SerializeField]\n        internal List<TMP_Glyph> m_glyphInfoList;\n\n        [SerializeField]\n        [FormerlySerializedAs(\"m_kerningInfo\")]\n        internal KerningTable m_KerningTable = new KerningTable();\n\n        /// <summary>\n        /// Table containing the various font features of this font asset. \n        /// </summary>\n        public TMP_FontFeatureTable fontFeatureTable\n        {\n            get { return m_FontFeatureTable; }\n            internal set { m_FontFeatureTable = value; }\n        }\n        [SerializeField]\n        private TMP_FontFeatureTable m_FontFeatureTable = new TMP_FontFeatureTable();\n\n        // Legacy field that will eventually be removed\n        [SerializeField]\n        #pragma warning disable 0649\n        private List<TMP_FontAsset> fallbackFontAssets;\n\n        /// <summary>\n        /// List containing the Fallback font assets for this font.\n        /// </summary>\n        public List<TMP_FontAsset> fallbackFontAssetTable\n        {\n            get { return m_FallbackFontAssetTable; }\n            set { m_FallbackFontAssetTable = value; }\n        }\n        [SerializeField]\n        public List<TMP_FontAsset> m_FallbackFontAssetTable;\n\n        /// <summary>\n        /// The settings used in the Font Asset Creator when this font asset was created or edited.\n        /// </summary>\n        public FontAssetCreationSettings creationSettings\n        {\n            get { return m_CreationSettings; }\n            set { m_CreationSettings = value; }\n        }\n        [SerializeField]\n        internal FontAssetCreationSettings m_CreationSettings;\n\n        /// <summary>\n        /// Array containing font assets to be used as alternative typefaces for the various potential font weights of this font asset.\n        /// </summary>\n        public TMP_FontWeightPair[] fontWeightTable\n        {\n            get { return m_FontWeightTable; }\n            internal set { m_FontWeightTable = value; }\n        }\n        [SerializeField]\n        private TMP_FontWeightPair[] m_FontWeightTable = new TMP_FontWeightPair[10];\n\n        // FONT WEIGHTS\n        /// <summary>\n        /// Font weights used by font asset prior to version 1.1.0.\n        /// This is legacy and will be removed at some point in the future.\n        /// </summary>\n        [SerializeField]\n        private TMP_FontWeightPair[] fontWeights = null;\n\n        //private int[] m_characterSet; // Array containing all the characters in this font asset.\n\n        /// <summary>\n        /// Defines the dilation of the text when using regular style.\n        /// </summary>\n        public float normalStyle = 0;\n\n        /// <summary>\n        /// The spacing between characters when using regular style.\n        /// </summary>\n        public float normalSpacingOffset = 0;\n\n        /// <summary>\n        /// Defines the dilation of the text when using bold style.\n        /// </summary>\n        public float boldStyle = 0.75f;\n\n        /// <summary>\n        /// The spacing between characters when using regular style.\n        /// </summary>\n        public float boldSpacing = 7f;\n\n        /// <summary>\n        /// Defines the slant of the text when using italic style.\n        /// </summary>\n        public byte italicStyle = 35;\n\n        public byte tabSize = 10;\n\n        private byte m_oldTabSize;\n        internal bool m_IsFontAssetLookupTablesDirty = false;\n\n        /// <summary>\n        /// Create new instance of a font asset using default settings.\n        /// </summary>\n        /// <param name=\"font\"></param>\n        /// <returns></returns>\n        public static TMP_FontAsset CreateFontAsset(Font font)\n        {\n            return CreateFontAsset(font, 90, 9, GlyphRenderMode.SDFAA, 1024, 1024, AtlasPopulationMode.Dynamic);\n        }\n\n        /// <summary>\n        /// Create new instance of a font asset.\n        /// </summary>\n        /// <param name=\"font\">The source font file.</param>\n        /// <param name=\"samplingPointSize\">The sampling point size.</param>\n        /// <param name=\"atlasPadding\">The padding / spread between individual glyphs in the font asset.</param>\n        /// <param name=\"renderMode\"></param>\n        /// <param name=\"atlasWidth\">The atlas texture width.</param>\n        /// <param name=\"atlasHeight\">The atlas texture height.</param>\n        /// <param name=\"atlasPopulationMode\"></param>\n        /// <returns></returns>\n        public static TMP_FontAsset CreateFontAsset(Font font, int samplingPointSize, int atlasPadding, GlyphRenderMode renderMode, int atlasWidth, int atlasHeight, AtlasPopulationMode atlasPopulationMode = AtlasPopulationMode.Dynamic)\n        {\n            TMP_FontAsset fontAsset = ScriptableObject.CreateInstance<TMP_FontAsset>();\n\n            fontAsset.m_Version = \"1.1.0\";\n\n            // Set face information\n            FontEngine.InitializeFontEngine();\n            FontEngine.LoadFontFace(font, samplingPointSize);\n\n            fontAsset.faceInfo = FontEngine.GetFaceInfo();\n\n            // Set font reference and GUID\n            if (atlasPopulationMode == AtlasPopulationMode.Dynamic)\n                fontAsset.sourceFontFile = font;\n\n            // Set persistent reference to source font file in the Editor only.\n            #if UNITY_EDITOR\n            UnityEditor.AssetDatabase.TryGetGUIDAndLocalFileIdentifier(font, out string guid, out long localID);\n            fontAsset.m_SourceFontFileGUID = guid;\n            fontAsset.m_SourceFontFile_EditorRef = font;\n            #endif\n\n            fontAsset.atlasPopulationMode = atlasPopulationMode;\n\n            fontAsset.atlasWidth = atlasWidth;\n            fontAsset.atlasHeight = atlasHeight;\n            fontAsset.atlasPadding = atlasPadding;\n            fontAsset.atlasRenderMode = renderMode;\n\n            // Initialize array for the font atlas textures.\n            fontAsset.atlasTextures = new Texture2D[1];\n\n            // Create and add font atlas texture.\n            Texture2D texture = new Texture2D(0, 0, TextureFormat.Alpha8, false);\n\n            //texture.name = assetName + \" Atlas\";\n            fontAsset.atlasTextures[0] = texture;\n\n            // Add free rectangle of the size of the texture.\n            int packingModifier;\n            if (((GlyphRasterModes)renderMode & GlyphRasterModes.RASTER_MODE_BITMAP) == GlyphRasterModes.RASTER_MODE_BITMAP)\n            {\n                packingModifier = 0;\n\n                // Optimize by adding static ref to shader.\n                Material tmp_material = new Material(ShaderUtilities.ShaderRef_MobileBitmap);\n\n                //tmp_material.name = texture.name + \" Material\";\n                tmp_material.SetTexture(ShaderUtilities.ID_MainTex, texture);\n                tmp_material.SetFloat(ShaderUtilities.ID_TextureWidth, atlasWidth);\n                tmp_material.SetFloat(ShaderUtilities.ID_TextureHeight, atlasHeight);\n\n                fontAsset.material = tmp_material;\n            }\n            else\n            {\n                packingModifier = 1;\n\n                // Optimize by adding static ref to shader.\n                Material tmp_material = new Material(ShaderUtilities.ShaderRef_MobileSDF);\n\n                //tmp_material.name = texture.name + \" Material\";\n                tmp_material.SetTexture(ShaderUtilities.ID_MainTex, texture);\n                tmp_material.SetFloat(ShaderUtilities.ID_TextureWidth, atlasWidth);\n                tmp_material.SetFloat(ShaderUtilities.ID_TextureHeight, atlasHeight);\n\n                tmp_material.SetFloat(ShaderUtilities.ID_GradientScale, atlasPadding + packingModifier);\n\n                tmp_material.SetFloat(ShaderUtilities.ID_WeightNormal, fontAsset.normalStyle);\n                tmp_material.SetFloat(ShaderUtilities.ID_WeightBold, fontAsset.boldStyle);\n\n                fontAsset.material = tmp_material;\n            }\n\n            fontAsset.freeGlyphRects = new List<GlyphRect>() { new GlyphRect(0, 0, atlasWidth - packingModifier, atlasHeight - packingModifier) };\n            fontAsset.usedGlyphRects = new List<GlyphRect>();\n\n            // TODO: Consider adding support for extracting glyph positioning data\n\n            fontAsset.ReadFontAssetDefinition();\n\n            return fontAsset;\n        }\n\n\n        void Awake()\n        {\n            //Debug.Log(\"TMP Font Asset [\" + this.name + \"] with Version #\" + m_Version + \" has been enabled!\");\n\n            // Check version number of font asset to see if it needs to be upgraded.\n            if (this.material != null && string.IsNullOrEmpty(m_Version))\n                UpgradeFontAsset();\n        }\n\n\n        #if UNITY_EDITOR\n        void OnValidate()\n        {\n            //if (m_oldTabSize != tabSize)\n            //{\n            //    m_oldTabSize = tabSize;\n            //    ReadFontAssetDefinition();\n            //}\n\n            // Handle changes to atlas population mode\n            //if (m_AtlasPopulationMode == AtlasPopulationMode.Static)\n            //    m_SourceFontFile = null;\n            //else\n            //{\n            //    string path = UnityEditor.AssetDatabase.GUIDToAssetPath(m_SourceFontFileGUID);\n\n            //    if (path != string.Empty)\n            //        m_SourceFontFile = UnityEditor.AssetDatabase.LoadAssetAtPath<Font>(path);\n            //}\n        }\n        #endif\n\n        /// <summary>\n        /// Read the various data tables of the font asset to populate its different dictionaries to allow for faster lookup of related font asset data.\n        /// </summary>\n        internal void InitializeDictionaryLookupTables()\n        {\n            // Create new instance of the glyph lookup dictionary or clear the existing one.\n            if (m_GlyphLookupDictionary == null)\n                m_GlyphLookupDictionary = new Dictionary<uint, Glyph>();\n            else\n                m_GlyphLookupDictionary.Clear();\n\n            int glyphCount = m_GlyphTable.Count;\n\n            // Initialize glyph index array or clear the existing one.\n            if (m_GlyphIndexList == null)\n                m_GlyphIndexList = new List<uint>();\n            else\n                m_GlyphIndexList.Clear();\n\n            // Add the characters contained in the character table into the dictionary for faster lookup.\n            for (int i = 0; i < glyphCount; i++)\n            {\n                Glyph glyph = m_GlyphTable[i];\n\n                uint index = glyph.index;\n\n                // TODO: Not sure it is necessary to check here.\n                if (m_GlyphLookupDictionary.ContainsKey(index) == false)\n                {\n                    m_GlyphLookupDictionary.Add(index, glyph);\n                    m_GlyphIndexList.Add(index);\n                }\n            }\n\n            // Create new instance of the character lookup dictionary or clear the existing one.\n            if (m_CharacterLookupDictionary == null)\n                m_CharacterLookupDictionary = new Dictionary<uint, TMP_Character>();\n            else\n                m_CharacterLookupDictionary.Clear();\n\n            // Add the characters contained in the character table into the dictionary for faster lookup.\n            for (int i = 0; i < m_CharacterTable.Count; i++)\n            {\n                TMP_Character character = m_CharacterTable[i];\n\n                uint unicode = character.unicode;\n                uint glyphIndex = character.glyphIndex;\n\n                if (m_CharacterLookupDictionary.ContainsKey(unicode) == false)\n                    m_CharacterLookupDictionary.Add(unicode, character);\n\n                if (m_GlyphLookupDictionary.ContainsKey(glyphIndex))\n                {\n                    character.glyph = m_GlyphLookupDictionary[glyphIndex];\n                }\n            }\n\n            // Upgrade Glyph Adjustment Table to the new Font Feature table and Glyph Pair Adjustment Records\n            if (m_KerningTable != null && m_KerningTable.kerningPairs != null && m_KerningTable.kerningPairs.Count > 0)\n                UpgradeGlyphAdjustmentTableToFontFeatureTable();\n\n            // Read Font Features which will include kerning data.\n            if (m_FontFeatureTable.m_GlyphPairAdjustmentRecordLookupDictionary == null)\n                m_FontFeatureTable.m_GlyphPairAdjustmentRecordLookupDictionary = new Dictionary<long, TMP_GlyphPairAdjustmentRecord>();\n            else\n                m_FontFeatureTable.m_GlyphPairAdjustmentRecordLookupDictionary.Clear();\n\n            List<TMP_GlyphPairAdjustmentRecord> glyphPairAdjustmentRecords = m_FontFeatureTable.m_GlyphPairAdjustmentRecords;\n            if (glyphPairAdjustmentRecords != null)\n            {\n                for (int i = 0; i < glyphPairAdjustmentRecords.Count; i++)\n                {\n                    TMP_GlyphPairAdjustmentRecord record = glyphPairAdjustmentRecords[i];\n\n                    long key = new GlyphPairKey(record).key;\n\n                    m_FontFeatureTable.m_GlyphPairAdjustmentRecordLookupDictionary.Add(key, record);\n                }\n            }\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        public void ReadFontAssetDefinition()\n        {\n            //Debug.Log(\"Reading Font Definition for \" + this.name + \".\");\n\n            // Check version number of font asset to see if it needs to be upgraded.\n            if (this.material != null && string.IsNullOrEmpty(m_Version))\n                UpgradeFontAsset();\n\n            // Initialize lookup tables for characters and glyphs.\n            InitializeDictionaryLookupTables();\n\n            // Add Tab char(9) to Dictionary.\n            if (m_CharacterLookupDictionary.ContainsKey(9) == false)\n            {\n                Glyph glyph = new Glyph(0, new GlyphMetrics(0, 0, 0, 0, m_FaceInfo.tabWidth * tabSize), GlyphRect.zero, 1.0f, 0);\n                m_CharacterLookupDictionary.Add(9, new TMP_Character(9, glyph));\n            }\n\n            // Add Linefeed LF char(10) and Carriage Return CR char(13)\n            if (m_CharacterLookupDictionary.ContainsKey(10) == false)\n            {\n                Glyph glyph = new Glyph(0, new GlyphMetrics(10, 0, 0, 0, 0), GlyphRect.zero, 1.0f, 0);\n                m_CharacterLookupDictionary.Add(10, new TMP_Character(10, glyph));\n\n                if (!m_CharacterLookupDictionary.ContainsKey(13))\n                    m_CharacterLookupDictionary.Add(13, new TMP_Character(13, glyph));\n            }\n\n            // Add Zero Width Space 8203 (0x200B)\n            if (m_CharacterLookupDictionary.ContainsKey(8203) == false)\n            {\n                Glyph glyph = new Glyph(0, new GlyphMetrics(0, 0, 0, 0, 0), GlyphRect.zero, 1.0f, 0);\n                m_CharacterLookupDictionary.Add(8203, new TMP_Character(8203, glyph));\n            }\n\n            // Add Zero Width Non-Breaking Space 8288 (0x2060)\n            if (m_CharacterLookupDictionary.ContainsKey(8288) == false)\n            {\n                Glyph glyph = new Glyph(0, new GlyphMetrics(0, 0, 0, 0, 0), GlyphRect.zero, 1.0f, 0);\n                m_CharacterLookupDictionary.Add(8288, new TMP_Character(8288, glyph));\n            }\n\n            // Add Non-Breaking Hyphen 8209 (0x2011)\n            if (m_CharacterLookupDictionary.ContainsKey(8209) == false)\n            {\n                if (m_CharacterLookupDictionary.TryGetValue(45, out TMP_Character character))\n                    m_CharacterLookupDictionary.Add(8209, new TMP_Character(8209, character.glyph));\n            }\n\n\n            // Set Cap Height\n            if (m_FaceInfo.capLine == 0 && m_CharacterLookupDictionary.ContainsKey(72))\n            {\n                uint glyphIndex = m_CharacterLookupDictionary[72].glyphIndex;\n                m_FaceInfo.capLine = m_GlyphLookupDictionary[glyphIndex].metrics.horizontalBearingY;\n            }\n\n            // Adjust Font Scale for compatibility reasons\n            if (m_FaceInfo.scale == 0)\n                m_FaceInfo.scale = 1.0f;\n\n            // Set Strikethrough Offset (if needed)\n            if (m_FaceInfo.strikethroughOffset == 0)\n                m_FaceInfo.strikethroughOffset = m_FaceInfo.capLine / 2.5f;\n\n            // Set Padding value for legacy font assets.\n            if (m_AtlasPadding == 0)\n            {\n                if (material.HasProperty(ShaderUtilities.ID_GradientScale))\n                    m_AtlasPadding = (int)material.GetFloat(ShaderUtilities.ID_GradientScale) - 1;\n            }\n\n            // Compute Hashcode for the font asset name\n            hashCode = TMP_TextUtilities.GetSimpleHashCode(this.name);\n\n            // Compute Hashcode for the material name\n            materialHashCode = TMP_TextUtilities.GetSimpleHashCode(material.name);\n\n            m_IsFontAssetLookupTablesDirty = false;\n        }\n\n\n        /// <summary>\n        /// Sort the Character table by Unicode values.\n        /// </summary>\n        internal void SortCharacterTable()\n        {\n            if (m_CharacterTable != null && m_CharacterTable.Count > 0)\n                m_CharacterTable = m_CharacterTable.OrderBy(c => c.unicode).ToList();\n        }\n\n        /// <summary>\n        /// Sort the Glyph table by index values.\n        /// </summary>\n        internal void SortGlyphTable()\n        {\n            if (m_GlyphTable != null && m_GlyphTable.Count > 0)\n                m_GlyphTable = m_GlyphTable.OrderBy(c => c.index).ToList();\n        }\n\n        /// <summary>\n        /// Sort both glyph and character tables.\n        /// </summary>\n        internal void SortGlyphAndCharacterTables()\n        {\n            SortGlyphTable();\n            SortCharacterTable();\n        }\n\n\n        /// <summary>\n        /// Function to check if a certain character exists in the font asset.\n        /// </summary>\n        /// <param name=\"character\"></param>\n        /// <returns></returns>\n        public bool HasCharacter(int character)\n        {\n            if (m_CharacterLookupDictionary == null)\n                return false;\n\n            if (m_CharacterLookupDictionary.ContainsKey((uint)character))\n                return true;\n\n            return false;\n        }\n\n\n        /// <summary>\n        /// Function to check if a certain character exists in the font asset.\n        /// </summary>\n        /// <param name=\"character\"></param>\n        /// <returns></returns>\n        public bool HasCharacter(char character)\n        {\n            if (m_CharacterLookupDictionary == null)\n                return false;\n\n            if (m_CharacterLookupDictionary.ContainsKey(character))\n                return true;\n\n            return false;\n        }\n\n\n        /// <summary>\n        /// Function to check if a character is contained in the font asset with the option to also check through fallback font assets.\n        /// </summary>\n        /// <param name=\"character\"></param>\n        /// <param name=\"searchFallbacks\"></param>\n        /// <returns></returns>\n        public bool HasCharacter(char character, bool searchFallbacks)\n        {\n            // Read font asset definition if it hasn't already been done.\n            if (m_CharacterLookupDictionary == null)\n            {\n                ReadFontAssetDefinition();\n\n                if (m_CharacterLookupDictionary == null)\n                    return false;\n            }\n\n            // Check font asset\n            if (m_CharacterLookupDictionary.ContainsKey(character))\n                return true;\n\n            // Check if font asset is dynamic and if so try to add the requested character to it.\n            if (m_AtlasPopulationMode == AtlasPopulationMode.Dynamic)\n            {\n                if (TryAddCharacterInternal(character, out TMP_Character temp))\n                    return true;\n            }\n\n            if (searchFallbacks)\n            {\n                // Check font asset fallbacks\n                if (fallbackFontAssetTable != null && fallbackFontAssetTable.Count > 0)\n                {\n                    for (int i = 0; i < fallbackFontAssetTable.Count && fallbackFontAssetTable[i] != null; i++)\n                    {\n                        if (fallbackFontAssetTable[i].HasCharacter_Internal(character, searchFallbacks))\n                            return true;\n                    }\n                }\n\n                // Check general fallback font assets.\n                if (TMP_Settings.fallbackFontAssets != null && TMP_Settings.fallbackFontAssets.Count > 0)\n                {\n                    for (int i = 0; i < TMP_Settings.fallbackFontAssets.Count && TMP_Settings.fallbackFontAssets[i] != null; i++)\n                    {\n                        if (TMP_Settings.fallbackFontAssets[i].m_CharacterLookupDictionary == null)\n                            TMP_Settings.fallbackFontAssets[i].ReadFontAssetDefinition();\n\n                        if (TMP_Settings.fallbackFontAssets[i].m_CharacterLookupDictionary != null && TMP_Settings.fallbackFontAssets[i].HasCharacter_Internal(character, searchFallbacks))\n                            return true;\n                    }\n                }\n\n                // Check TMP Settings Default Font Asset\n                if (TMP_Settings.defaultFontAsset != null)\n                {\n                    if (TMP_Settings.defaultFontAsset.m_CharacterLookupDictionary == null)\n                        TMP_Settings.defaultFontAsset.ReadFontAssetDefinition();\n\n                    if (TMP_Settings.defaultFontAsset.m_CharacterLookupDictionary != null && TMP_Settings.defaultFontAsset.HasCharacter_Internal(character, searchFallbacks))\n                        return true;\n                }\n            }\n\n            return false;\n        }\n\n\n        /// <summary>\n        /// Function to check if a character is contained in a font asset with the option to also check through fallback font assets.\n        /// This private implementation does not search the fallback font asset in the TMP Settings file.\n        /// </summary>\n        /// <param name=\"character\"></param>\n        /// <param name=\"searchFallbacks\"></param>\n        /// <returns></returns>\n        bool HasCharacter_Internal(char character, bool searchFallbacks)\n        {\n            // Read font asset definition if it hasn't already been done.\n            if (m_CharacterLookupDictionary == null)\n            {\n                ReadFontAssetDefinition();\n\n                if (m_CharacterLookupDictionary == null)\n                    return false;\n            }\n\n            // Check font asset\n            if (m_CharacterLookupDictionary.ContainsKey(character))\n                return true;\n\n            if (searchFallbacks)\n            {\n                // Check Font Asset Fallback fonts.\n                if (fallbackFontAssetTable != null && fallbackFontAssetTable.Count > 0)\n                {\n                    for (int i = 0; i < fallbackFontAssetTable.Count && fallbackFontAssetTable[i] != null; i++)\n                    {\n                        if (fallbackFontAssetTable[i].HasCharacter_Internal(character, searchFallbacks))\n                            return true;\n                    }\n                }\n            }\n\n            return false;\n        }\n\n\n        /// <summary>\n        /// Function to check if certain characters exists in the font asset. Function returns a list of missing characters.\n        /// </summary>\n        /// <param name=\"character\"></param>\n        /// <returns></returns>\n        public bool HasCharacters(string text, out List<char> missingCharacters)\n        {\n            if (m_CharacterLookupDictionary == null)\n            {\n                missingCharacters = null;\n                return false;\n            }\n\n            missingCharacters = new List<char>();\n\n            for (int i = 0; i < text.Length; i++)\n            {\n                if (!m_CharacterLookupDictionary.ContainsKey(text[i]))\n                    missingCharacters.Add(text[i]);\n            }\n\n            if (missingCharacters.Count == 0)\n                return true;\n\n            return false;\n        }\n\n\n        /// <summary>\n        /// Function to check if certain characters exists in the font asset. Function returns false if any characters are missing.\n        /// </summary>\n        /// <param name=\"text\">String containing the characters to check</param>\n        /// <returns></returns>\n        public bool HasCharacters(string text)\n        {\n            if (m_CharacterLookupDictionary == null)\n                return false;\n\n            for (int i = 0; i < text.Length; i++)\n            {\n                if (!m_CharacterLookupDictionary.ContainsKey(text[i]))\n                    return false;\n            }\n\n            return true;\n        }\n\n\n        /// <summary>\n        /// Function to extract all the characters from a font asset.\n        /// </summary>\n        /// <param name=\"fontAsset\"></param>\n        /// <returns></returns>\n        public static string GetCharacters(TMP_FontAsset fontAsset)\n        {\n            string characters = string.Empty;\n\n            for (int i = 0; i < fontAsset.characterTable.Count; i++)\n            {\n                characters += (char)fontAsset.characterTable[i].unicode;\n            }\n\n            return characters;\n        }\n\n\n        /// <summary>\n        /// Function which returns an array that contains all the characters from a font asset.\n        /// </summary>\n        /// <param name=\"fontAsset\"></param>\n        /// <returns></returns>\n        public static int[] GetCharactersArray(TMP_FontAsset fontAsset)\n        {\n            int[] characters = new int[fontAsset.characterTable.Count];\n\n            for (int i = 0; i < fontAsset.characterTable.Count; i++)\n            {\n                characters[i] = (int)fontAsset.characterTable[i].unicode;\n            }\n\n            return characters;\n        }\n\n\n        // ================================================================================\n        // Properties and functions related to character and glyph additions as well as\n        // tacking glyphs that need to be added to various font asset atlas textures.\n        // ================================================================================\n\n        /// <summary>\n        /// Determines if the font asset is already registered to be updated.\n        /// </summary>\n        //private bool m_IsAlreadyRegisteredForUpdate;\n\n        /// <summary>\n        /// List of glyphs that need to be added / packed in atlas texture.\n        /// </summary>\n        private List<Glyph> m_GlyphsToPack = new List<Glyph>();\n\n        /// <summary>\n        /// List of glyphs that have been packed in the atlas texture and ready to be rendered.\n        /// </summary>\n        private List<Glyph> m_GlyphsPacked = new List<Glyph>();\n\n        /// <summary>\n        /// \n        /// </summary>\n        private List<Glyph> m_GlyphsToRender = new List<Glyph>();\n\n        /// <summary>\n        /// List used in the process of adding new glyphs to the atlas texture.\n        /// </summary>\n        private List<uint> m_GlyphIndexList = new List<uint>();\n        private List<TMP_Character> m_CharactersToAdd = new List<TMP_Character>();\n\n        /// <summary>\n        /// Internal static array used to avoid allocations when using the GetGlyphPairAdjustmentTable().\n        /// </summary>\n        internal static uint[] s_GlyphIndexArray = new uint[16];\n\n        /// <summary>\n        /// Internal static list used to track characters that could not be added to the font asset.\n        /// </summary>\n        internal static List<uint> s_MissingCharacterList = new List<uint>(16);\n\n        /// <summary>\n        /// Try adding the characters from the provided string to the font asset.\n        /// </summary>\n        /// <param name=\"unicodes\">Array that contains the characters to add to the font asset.</param>\n        /// <returns>Returns true if all the characters were successfully added to the font asset. Return false otherwise.</returns>\n        public bool TryAddCharacters(uint[] unicodes)\n        {\n            return TryAddCharacters(unicodes, out uint[] missingUnicodes);\n        }\n\n        /// <summary>\n        /// Try adding the characters from the provided string to the font asset.\n        /// </summary>\n        /// <param name=\"unicodes\">Array that contains the characters to add to the font asset.</param>\n        /// <param name=\"missingUnicodes\">Array containing the characters that could not be added to the font asset.</param>\n        /// <returns>Returns true if all the characters were successfully added to the font asset. Return false otherwise.</returns>\n        public bool TryAddCharacters(uint[] unicodes, out uint[] missingUnicodes)\n        {\n            s_MissingCharacterList.Clear();\n\n            // Make sure font asset is set to dynamic and that we have a valid list of characters.\n            if (unicodes == null || unicodes.Length == 0 || m_AtlasPopulationMode == AtlasPopulationMode.Static)\n            {\n                if (m_AtlasPopulationMode == AtlasPopulationMode.Static)\n                    Debug.LogWarning(\"Unable to add characters to font asset [\" + this.name + \"] because its AtlasPopulationMode is set to Static.\", this);\n                else\n                {\n                    Debug.LogWarning(\"Unable to add characters to font asset [\" + this.name + \"] because the provided Unicode list is Null or Empty.\", this);\n                }\n\n                missingUnicodes = unicodes.ToArray();\n                return false;\n            }\n\n            Profiler.BeginSample(\"TMP.TryAddCharacter\");\n\n            // Load font face.\n            if (FontEngine.LoadFontFace(m_SourceFontFile, m_FaceInfo.pointSize) != FontEngineError.Success)\n            {\n                Profiler.EndSample();\n\n                missingUnicodes = unicodes.ToArray();\n                return false;\n            }\n\n            // Clear data structures used to track which glyph needs to be added to atlas texture.\n            m_GlyphIndexList.Clear();\n            m_CharactersToAdd.Clear();\n\n            bool isMissingCharacters = false;\n            int unicodeCount = unicodes.Length;\n\n            for (int i = 0; i < unicodeCount; i++)\n            {\n                uint unicode = unicodes[i];\n\n                // Check if character is already contained in the character table.\n                if (m_CharacterLookupDictionary.ContainsKey(unicode))\n                    continue;\n\n                // Get the index of the glyph for this unicode value.\n                uint glyphIndex = FontEngine.GetGlyphIndex(unicode);\n\n                if (glyphIndex == 0)\n                {\n                    isMissingCharacters = true;\n                    continue;\n                }\n\n                TMP_Character character = new TMP_Character(unicode, glyphIndex);\n\n                // Check if glyph is already contained in the font asset as the same glyph might be referenced by multiple characters.\n                if (m_GlyphLookupDictionary.ContainsKey(glyphIndex))\n                {\n                    character.glyph = m_GlyphLookupDictionary[glyphIndex];\n                    m_CharacterTable.Add(character);\n                    m_CharacterLookupDictionary.Add(unicode, character);\n\n                    continue;\n                }\n\n                m_GlyphIndexList.Add(glyphIndex);\n                m_CharactersToAdd.Add(character);\n            }\n\n            if (m_GlyphIndexList.Count == 0)\n            {\n                //Debug.LogWarning(\"No characters will be added to font asset [\" + this.name + \"] either because they are already present in the font asset or missing from the font file.\");\n                Profiler.EndSample();\n\n                missingUnicodes = unicodes.ToArray();\n                return false;\n            }\n\n            // Resize the Atlas Texture to the appropriate size\n            if (m_AtlasTextures[m_AtlasTextureIndex].width == 0 || m_AtlasTextures[m_AtlasTextureIndex].height == 0)\n            {\n                //Debug.Log(\"Setting initial size of atlas texture used by font asset [\" + this.name + \"].\");\n                m_AtlasTextures[m_AtlasTextureIndex].Resize(m_AtlasWidth, m_AtlasHeight);\n                FontEngine.ResetAtlasTexture(m_AtlasTextures[m_AtlasTextureIndex]);\n            }\n\n            bool allCharactersAdded = FontEngine.TryAddGlyphsToTexture(m_GlyphIndexList, m_AtlasPadding, GlyphPackingMode.BestShortSideFit, m_FreeGlyphRects, m_UsedGlyphRects, m_AtlasRenderMode, m_AtlasTextures[m_AtlasTextureIndex], out Glyph[] glyphs);\n\n            // Add new glyphs to relevant data structures.\n            for (int i = 0; i < glyphs.Length; i++)\n            {\n                Glyph glyph = glyphs[i];\n                uint glyphIndex = glyph.index;\n                \n                // Add new glyph to glyph table.\n                m_GlyphTable.Add(glyph);\n                m_GlyphLookupDictionary.Add(glyphIndex, glyph);\n            }\n\n            // Add new characters to relevant data structures.\n            for (int i = 0; i < m_CharactersToAdd.Count; i++)\n            {\n                TMP_Character character = m_CharactersToAdd[i];\n                if (m_GlyphLookupDictionary.TryGetValue(character.glyphIndex, out Glyph glyph) == false)\n                {\n                    s_MissingCharacterList.Add(character.unicode);\n                    continue;\n                }\n\n                character.glyph = glyph;\n                m_CharacterTable.Add(character);\n                m_CharacterLookupDictionary.Add(character.unicode, character);\n            }\n\n            #if UNITY_EDITOR\n            // Makes the changes to the font asset persistent.\n            if (UnityEditor.EditorUtility.IsPersistent(this))\n            {\n                TMP_EditorResourceManager.RegisterResourceForUpdate(this);\n            }\n            #endif\n\n            Profiler.EndSample();\n\n            missingUnicodes = null;\n\n            if (s_MissingCharacterList.Count > 0)\n                missingUnicodes = s_MissingCharacterList.ToArray();\n\n            return allCharactersAdded && !isMissingCharacters;\n        }\n\n        /// <summary>\n        /// Try adding the characters from the provided string to the font asset.\n        /// </summary>\n        /// <param name=\"characters\">String containing the characters to add to the font asset.</param>\n        /// <returns>Returns true if all the characters were successfully added to the font asset. Return false otherwise.</returns>\n        public bool TryAddCharacters(string characters)\n        {\n            return TryAddCharacters(characters, out string missingCharacters);\n        }\n\n\n        /// <summary>\n        /// Try adding the characters from the provided string to the font asset.\n        /// </summary>\n        /// <param name=\"characters\">String containing the characters to add to the font asset.</param>\n        /// <param name=\"missingCharacters\">String containing the characters that could not be added to the font asset.</param>\n        /// <returns>Returns true if all the characters were successfully added to the font asset. Return false otherwise.</returns>\n        public bool TryAddCharacters(string characters, out string missingCharacters)\n        {\n            // Make sure font asset is set to dynamic and that we have a valid list of characters.\n            if (string.IsNullOrEmpty(characters) || m_AtlasPopulationMode == AtlasPopulationMode.Static)\n            {\n                if (m_AtlasPopulationMode == AtlasPopulationMode.Static)\n                    Debug.LogWarning(\"Unable to add characters to font asset [\" + this.name + \"] because its AtlasPopulationMode is set to Static.\", this);\n                else\n                {\n                    Debug.LogWarning(\"Unable to add characters to font asset [\" + this.name + \"] because the provided character list is Null or Empty.\", this);\n                }\n\n                missingCharacters = characters;\n                return false;\n            }\n\n            // Load font face.\n            if (FontEngine.LoadFontFace(m_SourceFontFile, m_FaceInfo.pointSize) != FontEngineError.Success)\n            {\n                missingCharacters = characters;\n                return false;\n            }\n\n            // Clear data structures used to track which glyph needs to be added to atlas texture.\n            m_GlyphIndexList.Clear();\n            m_CharactersToAdd.Clear();\n\n            bool isMissingCharacters = false;\n            int characterCount = characters.Length;\n\n            // Iterate over each of the requested characters.\n            for (int i = 0; i < characterCount; i++)\n            {\n                uint unicode = characters[i];\n\n                // Check if character is already contained in the character table.\n                if (m_CharacterLookupDictionary.ContainsKey(unicode))\n                    continue;\n\n                // Get the index of the glyph for this unicode value.\n                uint glyphIndex = FontEngine.GetGlyphIndex(unicode);\n\n                // Skip missing glyphs\n                if (glyphIndex == 0)\n                {\n                    // Might want to keep track and report the missing characters.\n                    isMissingCharacters = true;\n                    continue;\n                }\n\n                TMP_Character character = new TMP_Character(unicode, glyphIndex);\n\n                // Check if glyph is already contained in the font asset as the same glyph might be referenced by multiple characters.\n                if (m_GlyphLookupDictionary.ContainsKey(glyphIndex))\n                {\n                    character.glyph = m_GlyphLookupDictionary[glyphIndex];\n                    m_CharacterTable.Add(character);\n                    m_CharacterLookupDictionary.Add(unicode, character);\n\n                    continue;\n                }\n\n                // Add glyph to list of glyphs to add and glyph lookup map.\n                m_GlyphIndexList.Add(glyphIndex);\n                m_CharactersToAdd.Add(character);\n            }\n\n            if (m_GlyphIndexList.Count == 0)\n            {\n                missingCharacters = characters;\n                return false;\n            }\n\n            // Resize the Atlas Texture to the appropriate size\n            if (m_AtlasTextures[m_AtlasTextureIndex].width == 0 || m_AtlasTextures[m_AtlasTextureIndex].height == 0)\n            {\n                //Debug.Log(\"Setting initial size of atlas texture used by font asset [\" + this.name + \"].\");\n                m_AtlasTextures[m_AtlasTextureIndex].Resize(m_AtlasWidth, m_AtlasHeight);\n                FontEngine.ResetAtlasTexture(m_AtlasTextures[m_AtlasTextureIndex]);\n            }\n\n            bool allCharactersAdded = FontEngine.TryAddGlyphsToTexture(m_GlyphIndexList, m_AtlasPadding, GlyphPackingMode.BestShortSideFit, m_FreeGlyphRects, m_UsedGlyphRects, m_AtlasRenderMode, m_AtlasTextures[m_AtlasTextureIndex], out Glyph[] glyphs);\n\n            for (int i = 0; i < glyphs.Length; i++)\n            {\n                Glyph glyph = glyphs[i];\n                uint glyphIndex = glyph.index;\n\n                // Add new glyph to glyph table.\n                m_GlyphTable.Add(glyph);\n                m_GlyphLookupDictionary.Add(glyphIndex, glyph);\n            }\n\n            missingCharacters = string.Empty;\n\n            // Add new characters to relevant data structures.\n            for (int i = 0; i < m_CharactersToAdd.Count; i++)\n            {\n                TMP_Character character = m_CharactersToAdd[i];\n\n                if (m_GlyphLookupDictionary.TryGetValue(character.glyphIndex, out Glyph glyph) == false)\n                {\n                    // TODO: Revise to avoid string concatenation.\n                    missingCharacters += (char)character.unicode;\n                    continue;\n                }\n\n                character.glyph = glyph;\n                m_CharacterTable.Add(character);\n                m_CharacterLookupDictionary.Add(character.unicode, character);\n            }\n\n            #if UNITY_EDITOR\n            // Makes the changes to the font asset persistent.\n            if (UnityEditor.EditorUtility.IsPersistent(this))\n            {\n                TMP_EditorResourceManager.RegisterResourceForUpdate(this);\n            }\n            #endif\n\n            return allCharactersAdded && !isMissingCharacters;\n        }\n\n\n        /// <summary>\n        /// NOT USED CURRENTLY - Try adding character using Unicode value to font asset.\n        /// </summary>\n        /// <param name=\"unicode\">The Unicode value of the character.</param>\n        /// <param name=\"character\">The character data if successfully added to the font asset. Null otherwise.</param>\n        /// <returns>Returns true if the character has been added. False otherwise.</returns>\n        internal bool TryAddCharacter_Internal(uint unicode)\n        {\n            TMP_Character character = null;\n            \n            // Check if character is already contained in the character table.\n            if (m_CharacterLookupDictionary.ContainsKey(unicode))\n                return true;\n\n            uint glyphIndex = FontEngine.GetGlyphIndex(unicode);\n            if (glyphIndex == 0)\n                return false;\n\n            // Check if glyph is already contained in the font asset as the same glyph might be referenced by multiple characters.\n            if (m_GlyphLookupDictionary.ContainsKey(glyphIndex))\n            {\n                character = new TMP_Character(unicode, m_GlyphLookupDictionary[glyphIndex]);\n                m_CharacterTable.Add(character);\n                m_CharacterLookupDictionary.Add(unicode, character);\n\n                //#if UNITY_EDITOR\n                // Makes the changes to the font asset persistent.\n                // OPTIMIZATION: This could be handled when exiting Play mode if we added any new characters to the asset.\n                // Could also add some update registry to handle this.\n                //SortGlyphTable();\n                //UnityEditor.EditorUtility.SetDirty(this);\n                //#endif\n\n                return true;\n            }\n\n            // Resize the Atlas Texture to the appropriate size\n            if (m_AtlasTextures[m_AtlasTextureIndex].width == 0 || m_AtlasTextures[m_AtlasTextureIndex].height == 0)\n            {\n                //Debug.Log(\"Setting initial size of atlas texture used by font asset [\" + this.name + \"].\");\n                m_AtlasTextures[m_AtlasTextureIndex].Resize(m_AtlasWidth, m_AtlasHeight);\n                FontEngine.ResetAtlasTexture(m_AtlasTextures[m_AtlasTextureIndex]);\n            }\n\n            if (FontEngine.TryAddGlyphToTexture(glyphIndex, m_AtlasPadding, GlyphPackingMode.BestShortSideFit, m_FreeGlyphRects, m_UsedGlyphRects, m_AtlasRenderMode, m_AtlasTextures[m_AtlasTextureIndex], out Glyph glyph))\n            {\n                // Add new glyph to glyph table.\n                m_GlyphTable.Add(glyph);\n                m_GlyphLookupDictionary.Add(glyphIndex, glyph);\n\n                // Add new character\n                character = new TMP_Character(unicode, glyph);\n                m_CharacterTable.Add(character);\n                m_CharacterLookupDictionary.Add(unicode, character);\n\n                //#if UNITY_EDITOR\n                // Makes the changes to the font asset persistent.\n                // OPTIMIZATION: This could be handled when exiting Play mode if we added any new characters to the asset.\n                // Could also add some update registry to handle this.\n                //SortGlyphTable();\n                //UnityEditor.EditorUtility.SetDirty(this);\n                //#endif\n\n                return true;\n            }\n\n            return false;\n        }\n\n\n        /// <summary>\n        /// To be removed.\n        /// </summary>\n        /// <param name=\"unicode\"></param>\n        /// <param name=\"glyph\"></param>\n        internal TMP_Character AddCharacter_Internal(uint unicode, Glyph glyph)\n        {\n            // Check if character is already contained in the character table.\n            if (m_CharacterLookupDictionary.ContainsKey(unicode))\n                return m_CharacterLookupDictionary[unicode];\n\n            uint glyphIndex = glyph.index;\n\n            // Resize the Atlas Texture to the appropriate size\n            if (m_AtlasTextures[m_AtlasTextureIndex].width == 0 || m_AtlasTextures[m_AtlasTextureIndex].height == 0)\n            {\n                //Debug.Log(\"Setting initial size of atlas texture used by font asset [\" + this.name + \"].\");\n                m_AtlasTextures[m_AtlasTextureIndex].Resize(m_AtlasWidth, m_AtlasHeight);\n                FontEngine.ResetAtlasTexture(m_AtlasTextures[m_AtlasTextureIndex]);\n            }\n\n            // Check if glyph is already contained in the glyph table.\n            if (m_GlyphLookupDictionary.ContainsKey(glyphIndex) == false)\n            {\n                if (glyph.glyphRect.width == 0 || glyph.glyphRect.width == 0)\n                {\n                    // Glyphs with zero width and / or height can be automatically added to font asset.\n                    m_GlyphTable.Add(glyph);\n                }\n                else\n                {\n                    // Try packing new glyph \n                    if (FontEngine.TryPackGlyphInAtlas(glyph, m_AtlasPadding, GlyphPackingMode.ContactPointRule, m_AtlasRenderMode, m_AtlasWidth, m_AtlasHeight, m_FreeGlyphRects, m_UsedGlyphRects) == false)\n                    {\n                        // TODO: Add handling to create new atlas texture to fit glyph.\n\n                        return null;\n                    }\n\n                    m_GlyphsToRender.Add(glyph);\n                }\n            }\n\n            // Add character to font asset.\n            TMP_Character character = new TMP_Character(unicode, glyph);\n            m_CharacterTable.Add(character);\n            m_CharacterLookupDictionary.Add(unicode, character);\n\n            //Debug.Log(\"Adding character [\" + (char)unicode + \"] with Unicode (\" + unicode + \") to [\" + this.name + \"] font asset.\");\n\n            // Schedule glyph to be added to the font atlas texture\n            //TM_FontAssetUpdateManager.RegisterFontAssetForUpdate(this);\n            UpdateAtlasTexture(); // Temporary until callback system is revised.\n\n            //#if UNITY_EDITOR\n            // Makes the changes to the font asset persistent.\n            // OPTIMIZATION: This could be handled when exiting Play mode if we added any new characters to the asset.\n            // Could also add some update registry to handle this.\n            //SortGlyphTable();\n            //UnityEditor.EditorUtility.SetDirty(this);\n            //#endif\n\n            return character;\n        }\n\n\n        /// <summary>\n        /// Try adding character using Unicode value to font asset.\n        /// Function assumes internal user has already checked to make sure the character is not already contained in the font asset.\n        /// </summary>\n        /// <param name=\"unicode\">The Unicode value of the character.</param>\n        /// <param name=\"character\">The character data if successfully added to the font asset. Null otherwise.</param>\n        /// <returns>Returns true if the character has been added. False otherwise.</returns>\n        internal bool TryAddCharacterInternal(uint unicode, out TMP_Character character)\n        {\n            character = null;\n\n            // Load font face.\n            if (FontEngine.LoadFontFace(sourceFontFile, m_FaceInfo.pointSize) != FontEngineError.Success)\n                return false;\n\n            uint glyphIndex = FontEngine.GetGlyphIndex(unicode);\n            if (glyphIndex == 0)\n                return false;\n\n            Profiler.BeginSample(\"TMP.TryAddCharacter\");\n\n            // Check if glyph is already contained in the font asset as the same glyph might be referenced by multiple characters.\n            if (m_GlyphLookupDictionary.ContainsKey(glyphIndex))\n            {\n                character = new TMP_Character(unicode, m_GlyphLookupDictionary[glyphIndex]);\n                m_CharacterTable.Add(character);\n                m_CharacterLookupDictionary.Add(unicode, character);\n\n                if (TMP_Settings.getFontFeaturesAtRuntime)\n                    UpdateGlyphAdjustmentRecords(unicode, glyphIndex);\n\n                #if UNITY_EDITOR\n                // Makes the changes to the font asset persistent.\n                // OPTIMIZATION: This could be handled when exiting Play mode if we added any new characters to the asset.\n                // Could also add some update registry to handle this.\n                //SortGlyphTable();\n                if (UnityEditor.EditorUtility.IsPersistent(this))\n                {\n                    TMP_EditorResourceManager.RegisterResourceForUpdate(this);\n                }\n                #endif\n\n                Profiler.EndSample();\n\n                return true;\n            }\n\n            // Resize the Atlas Texture to the appropriate size\n            if (m_AtlasTextures[m_AtlasTextureIndex].width == 0 || m_AtlasTextures[m_AtlasTextureIndex].height == 0)\n            {\n                // TODO: Need texture to be readable.\n                if (m_AtlasTextures[m_AtlasTextureIndex].isReadable == false)\n                {\n                    Debug.LogWarning(\"Unable to add the requested character to font asset [\" + this.name + \"]'s atlas texture. Please make the texture [\" + m_AtlasTextures[m_AtlasTextureIndex].name + \"] readable.\", m_AtlasTextures[m_AtlasTextureIndex]);\n\n                    Profiler.EndSample();\n                    return false;\n                }\n\n                m_AtlasTextures[m_AtlasTextureIndex].Resize(m_AtlasWidth, m_AtlasHeight);\n                FontEngine.ResetAtlasTexture(m_AtlasTextures[m_AtlasTextureIndex]);\n            }\n\n            if (FontEngine.TryAddGlyphToTexture(glyphIndex, m_AtlasPadding, GlyphPackingMode.BestShortSideFit, m_FreeGlyphRects, m_UsedGlyphRects, m_AtlasRenderMode, m_AtlasTextures[m_AtlasTextureIndex], out Glyph glyph))\n            {\n                // Add new glyph to glyph table.\n                m_GlyphTable.Add(glyph);\n                m_GlyphLookupDictionary.Add(glyphIndex, glyph);\n\n                // Add new character\n                character = new TMP_Character(unicode, glyph);\n                m_CharacterTable.Add(character);\n                m_CharacterLookupDictionary.Add(unicode, character);\n\n                m_GlyphIndexList.Add(glyphIndex);\n\n                if (TMP_Settings.getFontFeaturesAtRuntime)\n                    UpdateGlyphAdjustmentRecords(unicode, glyphIndex);\n\n                #if UNITY_EDITOR\n                // Makes the changes to the font asset persistent.\n                // OPTIMIZATION: This could be handled when exiting Play mode if we added any new characters to the asset.\n                // Could also add some update registry to handle this.\n                //SortGlyphTable();\n                if (UnityEditor.EditorUtility.IsPersistent(this))\n                {\n                    TMP_EditorResourceManager.RegisterResourceForUpdate(this);\n                }\n                #endif\n\n                Profiler.EndSample();\n\n                return true;\n            }\n\n            Profiler.EndSample();\n\n            return false;\n        }\n\n\n        /// <summary>\n        /// Internal function used to get the glyph index for the given unicode.\n        /// </summary>\n        /// <param name=\"unicode\"></param>\n        /// <returns></returns>\n        internal uint GetGlyphIndex(uint unicode)\n        {\n            // Load font face.\n            if (FontEngine.LoadFontFace(sourceFontFile, m_FaceInfo.pointSize) != FontEngineError.Success)\n                return 0;\n\n            return FontEngine.GetGlyphIndex(unicode);\n        }\n\n\n        internal void UpdateAtlasTexture()\n        {\n            // Return if we don't have any glyphs to add to atlas texture.\n            // This is possible if UpdateAtlasTexture() was called manually.\n            //if (m_GlyphsToPack.Count == 0)\n            //    return;\n\n            if (m_GlyphsToRender.Count == 0)\n                return;\n\n            //Debug.Log(\"Updating [\" + this.name + \"]'s atlas texture.\");\n\n            // Pack glyphs in the given atlas texture size. \n            // TODO: Packing and glyph render modes should be defined in the font asset.\n            //FontEngine.PackGlyphsInAtlas(m_GlyphsToPack, m_GlyphsPacked, m_AtlasPadding, GlyphPackingMode.ContactPointRule, GlyphRenderMode.SDFAA, m_AtlasWidth, m_AtlasHeight, m_FreeGlyphRects, m_UsedGlyphRects);\n            //FontEngine.RenderGlyphsToTexture(m_GlyphsPacked, m_AtlasPadding, GlyphRenderMode.SDFAA, m_AtlasTextures[m_AtlasTextureIndex]);\n\n            // Resize the Atlas Texture to the appropriate size\n            if (m_AtlasTextures[m_AtlasTextureIndex].width == 0 || m_AtlasTextures[m_AtlasTextureIndex].height == 0)\n            {\n                //Debug.Log(\"Setting initial size of atlas texture used by font asset [\" + this.name + \"].\");\n                m_AtlasTextures[m_AtlasTextureIndex].Resize(m_AtlasWidth, m_AtlasHeight);\n                FontEngine.ResetAtlasTexture(m_AtlasTextures[m_AtlasTextureIndex]);\n            }\n\n            FontEngine.RenderGlyphsToTexture(m_GlyphsToRender, m_AtlasPadding, m_AtlasRenderMode, m_AtlasTextures[m_AtlasTextureIndex]);\n\n            // Apply changes to atlas texture\n            m_AtlasTextures[m_AtlasTextureIndex].Apply(false, false);\n\n            // Add glyphs that were successfully packed to the glyph table.\n            for (int i = 0; i < m_GlyphsToRender.Count /* m_GlyphsPacked.Count */; i++)\n            {\n                Glyph glyph = m_GlyphsToRender[i]; // m_GlyphsPacked[i];\n\n                // Update atlas texture index\n                glyph.atlasIndex = m_AtlasTextureIndex;\n\n                m_GlyphTable.Add(glyph);\n                m_GlyphLookupDictionary.Add(glyph.index, glyph);\n            }\n\n            // Clear list of glyphs\n            m_GlyphsPacked.Clear();\n            m_GlyphsToRender.Clear();\n\n            // Add any remaining glyphs into new atlas texture if multi texture support if enabled.\n            if (m_GlyphsToPack.Count > 0)\n            {\n                /*\n                // Create new atlas texture \n                Texture2D tex = new Texture2D(m_AtlasWidth, m_AtlasHeight, TextureFormat.Alpha8, false, true);\n                tex.SetPixels32(new Color32[m_AtlasWidth * m_AtlasHeight]);\n                tex.Apply();\n\n                m_AtlasTextureIndex++;\n\n                if (m_AtlasTextures.Length == m_AtlasTextureIndex)\n                    Array.Resize(ref m_AtlasTextures, Mathf.NextPowerOfTwo(m_AtlasTextureIndex + 1));\n\n                m_AtlasTextures[m_AtlasTextureIndex] = tex;\n                */\n            }\n\n            #if UNITY_EDITOR\n            // Makes the changes to the font asset persistent.\n            SortGlyphAndCharacterTables();\n            TMP_EditorResourceManager.RegisterResourceForUpdate(this);\n            #endif\n        }\n\n\n        internal void UpdateGlyphAdjustmentRecords(uint unicode, uint glyphIndex)\n        {\n            Profiler.BeginSample(\"TMP.UpdateGlyphAdjustmentRecords\");\n\n            int glyphCount = m_GlyphIndexList.Count;\n\n            if (s_GlyphIndexArray.Length <= glyphCount)\n                s_GlyphIndexArray = new uint[Mathf.NextPowerOfTwo(glyphCount + 1)];\n\n            for (int i = 0; i < glyphCount; i++)\n                s_GlyphIndexArray[i] = m_GlyphIndexList[i];\n\n            // Clear unused array elements\n            Array.Clear(s_GlyphIndexArray, glyphCount, s_GlyphIndexArray.Length - glyphCount);\n\n            // Get glyph pair adjustment records from font file.\n            // TODO: Revise FontEngine bindings to use a more efficient function where only the new glyph index is passed.\n            GlyphPairAdjustmentRecord[] pairAdjustmentRecords = FontEngine.GetGlyphPairAdjustmentTable(s_GlyphIndexArray);\n\n            if (pairAdjustmentRecords == null || pairAdjustmentRecords.Length == 0)\n            {\n                Profiler.EndSample();\n                return;\n            }\n\n            if (m_FontFeatureTable == null)\n                m_FontFeatureTable = new TMP_FontFeatureTable();\n\n            for (int i = 0; i < pairAdjustmentRecords.Length && pairAdjustmentRecords[i].firstAdjustmentRecord.glyphIndex != 0; i++)\n            {\n                long pairKey = (long)pairAdjustmentRecords[i].secondAdjustmentRecord.glyphIndex << 32 | pairAdjustmentRecords[i].firstAdjustmentRecord.glyphIndex;\n\n                // Check if table already contains a pair adjustment record for this key.\n                if (m_FontFeatureTable.m_GlyphPairAdjustmentRecordLookupDictionary.ContainsKey(pairKey))\n                    continue;\n\n                TMP_GlyphPairAdjustmentRecord record = new TMP_GlyphPairAdjustmentRecord(pairAdjustmentRecords[i]);\n\n                m_FontFeatureTable.m_GlyphPairAdjustmentRecords.Add(record);\n                m_FontFeatureTable.m_GlyphPairAdjustmentRecordLookupDictionary.Add(pairKey, record);\n            }\n\n            #if UNITY_EDITOR\n            m_FontFeatureTable.SortGlyphPairAdjustmentRecords();\n            #endif\n\n            Profiler.EndSample();\n        }\n\n\n        /// <summary>\n        /// Clears font asset data including the glyph and character tables and textures.\n        /// Function might be changed to Internal and only used in tests.\n        /// </summary>\n        /// <param name=\"setAtlasSizeToZero\">Will set the atlas texture size to zero width and height if true.</param>\n        public void ClearFontAssetData(bool setAtlasSizeToZero = false)\n        {\n            #if UNITY_EDITOR\n            // Record full object undo in the Editor.\n            //UnityEditor.Undo.RecordObjects(new UnityEngine.Object[] { this, this.atlasTexture }, \"Resetting Font Asset\");\n            #endif\n\n            // Clear glyph and character tables\n            if (m_GlyphTable != null)\n                m_GlyphTable.Clear();\n\n            if (m_CharacterTable != null)\n                m_CharacterTable.Clear();\n\n            // Clear glyph rectangles\n            if (m_UsedGlyphRects != null)\n                m_UsedGlyphRects.Clear();\n\n            if (m_FreeGlyphRects != null)\n            {\n                int packingModifier = ((GlyphRasterModes)m_AtlasRenderMode & GlyphRasterModes.RASTER_MODE_BITMAP) == GlyphRasterModes.RASTER_MODE_BITMAP ? 0 : 1;\n                m_FreeGlyphRects = new List<GlyphRect>() { new GlyphRect(0, 0, m_AtlasWidth - packingModifier, m_AtlasHeight - packingModifier) };\n            }\n\n            if (m_GlyphsToPack != null)\n                m_GlyphsToPack.Clear();\n\n            if (m_GlyphsPacked != null)\n                m_GlyphsPacked.Clear();\n\n            // Clear Glyph Adjustment Table\n            if (m_FontFeatureTable != null && m_FontFeatureTable.m_GlyphPairAdjustmentRecords != null)\n                m_FontFeatureTable.glyphPairAdjustmentRecords.Clear();\n\n            m_AtlasTextureIndex = 0;\n\n            // Clear atlas textures\n            if (m_AtlasTextures != null)\n            {\n                for (int i = 0; i < m_AtlasTextures.Length; i++)\n                {\n                    Texture2D texture = m_AtlasTextures[i];\n\n                    if (i > 0)\n                        DestroyImmediate(texture, true);\n\n                    if (texture == null)\n                        continue;\n\n                    // TODO: Need texture to be readable.\n                    if (m_AtlasTextures[i].isReadable == false)\n                    {\n                        Debug.LogWarning(\"Unable to reset font asset [\" + this.name + \"]'s atlas texture. Please make the texture [\" + m_AtlasTextures[i].name + \"] readable.\", m_AtlasTextures[i]);\n                        continue;\n                    }\n\n                    if (setAtlasSizeToZero)\n                    {\n                        texture.Resize(0, 0, TextureFormat.Alpha8, false);\n                    }\n                    else if (texture.width != m_AtlasWidth || texture.height != m_AtlasHeight)\n                    {\n                        texture.Resize(m_AtlasWidth, m_AtlasHeight, TextureFormat.Alpha8, false);\n                    }\n\n                    // Clear texture atlas\n                    FontEngine.ResetAtlasTexture(texture);\n                    texture.Apply();\n\n                    if (i == 0)\n                        m_AtlasTexture = texture;\n\n                    m_AtlasTextures[i] = texture;\n                }\n            }\n\n            #if UNITY_EDITOR\n            if (UnityEditor.EditorUtility.IsPersistent(this))\n            {\n                TMP_EditorResourceManager.RegisterResourceForReimport(this);\n            }\n            #endif\n\n            ReadFontAssetDefinition();\n        }\n\n\n\n        /// <summary>\n        /// Internal method used to upgrade font asset to support Dynamic SDF.\n        /// </summary>\n        private void UpgradeFontAsset()\n        {\n            m_Version = \"1.1.0\";\n\n            Debug.Log(\"Upgrading font asset [\" + this.name + \"] to version \" + m_Version + \".\", this);\n\n            m_FaceInfo.familyName = m_fontInfo.Name;\n            m_FaceInfo.styleName = string.Empty;\n\n            m_FaceInfo.pointSize = (int)m_fontInfo.PointSize;\n            m_FaceInfo.scale = m_fontInfo.Scale;\n\n            m_FaceInfo.lineHeight = m_fontInfo.LineHeight;\n            m_FaceInfo.ascentLine = m_fontInfo.Ascender;\n            m_FaceInfo.capLine = m_fontInfo.CapHeight;\n            m_FaceInfo.meanLine = m_fontInfo.CenterLine;\n            m_FaceInfo.baseline = m_fontInfo.Baseline;\n            m_FaceInfo.descentLine = m_fontInfo.Descender;\n\n            m_FaceInfo.superscriptOffset = m_fontInfo.SuperscriptOffset;\n            m_FaceInfo.superscriptSize = m_fontInfo.SubSize;\n            m_FaceInfo.subscriptOffset = m_fontInfo.SubscriptOffset;\n            m_FaceInfo.subscriptSize = m_fontInfo.SubSize;\n\n            m_FaceInfo.underlineOffset = m_fontInfo.Underline;\n            m_FaceInfo.underlineThickness = m_fontInfo.UnderlineThickness;\n            m_FaceInfo.strikethroughOffset = m_fontInfo.strikethrough;\n            m_FaceInfo.strikethroughThickness = m_fontInfo.strikethroughThickness;\n\n            m_FaceInfo.tabWidth = m_fontInfo.TabWidth;\n\n            if (m_AtlasTextures == null || m_AtlasTextures.Length == 0)\n                m_AtlasTextures = new Texture2D[1];\n\n            m_AtlasTextures[0] = atlas;\n\n            //atlas = null;\n\n            m_AtlasWidth = (int)m_fontInfo.AtlasWidth;\n            m_AtlasHeight = (int)m_fontInfo.AtlasHeight;\n            m_AtlasPadding = (int)m_fontInfo.Padding;\n\n            switch(m_CreationSettings.renderMode)\n            {\n                case 0:\n                    m_AtlasRenderMode = GlyphRenderMode.SMOOTH_HINTED;\n                    break;\n                case 1:\n                    m_AtlasRenderMode = GlyphRenderMode.SMOOTH;\n                    break;\n                case 2:\n                    m_AtlasRenderMode = GlyphRenderMode.RASTER_HINTED;\n                    break;\n                case 3:\n                    m_AtlasRenderMode = GlyphRenderMode.RASTER;\n                    break;\n                case 6:\n                    m_AtlasRenderMode = GlyphRenderMode.SDF16;\n                    break;\n                case 7:\n                    m_AtlasRenderMode = GlyphRenderMode.SDF32;\n                    break;\n            }\n\n            //m_fontInfo = null;\n\n            // Convert font weight table\n            if (fontWeights != null)\n            {\n                m_FontWeightTable[4] = fontWeights[4];\n                m_FontWeightTable[7] = fontWeights[7];\n\n                // Clear old fontWeight\n                //fontWeights = null;\n            }\n\n            // Convert font fallbacks\n            if (fallbackFontAssets != null && fallbackFontAssets.Count > 0)\n            {\n                if (m_FallbackFontAssetTable == null)\n                    m_FallbackFontAssetTable = new List<TMP_FontAsset>(fallbackFontAssets.Count);\n\n                for (int i = 0; i < fallbackFontAssets.Count; i++)\n                    m_FallbackFontAssetTable.Add(fallbackFontAssets[i]);\n\n                // Clear old fallbackFontAssets list\n                //fallbackFontAssets = null;\n            }\n\n            // Check if font asset creation settings contains a reference to the source font file GUID\n            if (m_CreationSettings.sourceFontFileGUID != null || m_CreationSettings.sourceFontFileGUID != string.Empty)\n            {\n                m_SourceFontFileGUID = m_CreationSettings.sourceFontFileGUID;\n            }\n            else\n            {\n                Debug.LogWarning(\"Font asset [\" + this.name + \"] doesn't have a reference to its source font file. Please assign the appropriate source font file for this asset in the Font Atlas & Material section of font asset inspector.\", this);\n            }\n\n            // Convert legacy glyph and character tables to new format\n            m_GlyphTable.Clear();\n            m_CharacterTable.Clear();\n\n            //#if UNITY_EDITOR\n            // TODO: This is causing a crash in Unity and related to AssetDatabase.LoadAssetAtPath and Resources.Load()\n            // Load font to allow us to get the glyph index.\n            //string path = UnityEditor.AssetDatabase.GUIDToAssetPath(m_SourceFontFileGUID);\n\n            //if (path != string.Empty)\n            //{\n                //m_SourceFontFile_EditorRef = UnityEditor.AssetDatabase.LoadAssetAtPath<Font>(path);\n                //FontEngine.LoadFontFace(m_SourceFontFile_EditorRef);\n            //}\n            //#endif\n\n            bool isSpaceCharacterPresent = false;\n            for (int i = 0; i < m_glyphInfoList.Count; i++)\n            {\n                TMP_Glyph oldGlyph = m_glyphInfoList[i];\n\n                Glyph glyph = new Glyph();\n\n                uint glyphIndex = (uint)i + 1;\n                \n                //#if UNITY_EDITOR\n                //if (m_SourceFontFile_EditorRef != null)\n                //    glyphIndex = FontEngine.GetGlyphIndex((uint)oldGlyph.id);\n                //#endif\n\n                glyph.index = glyphIndex;\n                glyph.glyphRect = new GlyphRect((int)oldGlyph.x, m_AtlasHeight - (int)(oldGlyph.y + oldGlyph.height + 0.5f), (int)(oldGlyph.width + 0.5f), (int)(oldGlyph.height + 0.5f));\n                glyph.metrics = new GlyphMetrics(oldGlyph.width, oldGlyph.height, oldGlyph.xOffset, oldGlyph.yOffset, oldGlyph.xAdvance);\n                glyph.scale = oldGlyph.scale;\n                glyph.atlasIndex = 0;\n\n                m_GlyphTable.Add(glyph);\n\n                TMP_Character character = new TMP_Character((uint)oldGlyph.id, glyph);\n\n                if (oldGlyph.id == 32)\n                    isSpaceCharacterPresent = true;\n\n                m_CharacterTable.Add(character);\n            }\n\n            // Special handling for the synthesized space character\n            if (!isSpaceCharacterPresent)\n            {\n                Debug.Log(\"Synthesizing Space for [\" + this.name + \"]\");\n                Glyph glyph = new Glyph(0, new GlyphMetrics(0, 0, 0, 0, m_FaceInfo.ascentLine / 5), GlyphRect.zero, 1.0f, 0);\n                m_GlyphTable.Add(glyph);\n                m_CharacterTable.Add(new TMP_Character(32, glyph));\n            }\n\n            // Clear legacy glyph info list.\n            //m_glyphInfoList.Clear();\n\n            ReadFontAssetDefinition();\n\n            // Convert atlas textures data to new format\n            // TODO\n            #if UNITY_EDITOR\n            if (UnityEditor.EditorUtility.IsPersistent(this))\n            {\n                TMP_EditorResourceManager.RegisterResourceForUpdate(this);\n            }\n            #endif\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        void UpgradeGlyphAdjustmentTableToFontFeatureTable()\n        {\n            Debug.Log(\"Upgrading font asset [\" + this.name + \"] Glyph Adjustment Table.\", this);\n\n            if (m_FontFeatureTable == null)\n                m_FontFeatureTable = new TMP_FontFeatureTable();\n\n            int pairCount = m_KerningTable.kerningPairs.Count;\n\n            m_FontFeatureTable.m_GlyphPairAdjustmentRecords = new List<TMP_GlyphPairAdjustmentRecord>(pairCount);\n\n            for (int i = 0; i < pairCount; i++)\n            {\n                KerningPair pair = m_KerningTable.kerningPairs[i];\n\n                uint firstGlyphIndex = 0;\n                if (m_CharacterLookupDictionary.TryGetValue(pair.firstGlyph, out TMP_Character firstCharacter))\n                    firstGlyphIndex = firstCharacter.glyphIndex;\n\n                uint secondGlyphIndex = 0;\n                if (m_CharacterLookupDictionary.TryGetValue(pair.secondGlyph, out TMP_Character secondCharacter))\n                    secondGlyphIndex = secondCharacter.glyphIndex;\n\n                TMP_GlyphAdjustmentRecord firstAdjustmentRecord = new TMP_GlyphAdjustmentRecord(firstGlyphIndex, new TMP_GlyphValueRecord(pair.firstGlyphAdjustments.xPlacement, pair.firstGlyphAdjustments.yPlacement, pair.firstGlyphAdjustments.xAdvance, pair.firstGlyphAdjustments.yAdvance));\n                TMP_GlyphAdjustmentRecord secondAdjustmentRecord = new TMP_GlyphAdjustmentRecord(secondGlyphIndex, new TMP_GlyphValueRecord(pair.secondGlyphAdjustments.xPlacement, pair.secondGlyphAdjustments.yPlacement, pair.secondGlyphAdjustments.xAdvance, pair.secondGlyphAdjustments.yAdvance));\n                TMP_GlyphPairAdjustmentRecord record = new TMP_GlyphPairAdjustmentRecord(firstAdjustmentRecord, secondAdjustmentRecord);\n\n                m_FontFeatureTable.m_GlyphPairAdjustmentRecords.Add(record);\n            }\n\n            // TODO: Should clear legacy kerning table.\n            m_KerningTable.kerningPairs = null;\n            m_KerningTable = null;\n\n            #if UNITY_EDITOR\n            if (UnityEditor.EditorUtility.IsPersistent(this))\n            {\n                TMP_EditorResourceManager.RegisterResourceForUpdate(this);\n            }\n            #endif\n        }\n\n    }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_FontAsset.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 71c1514a6bd24e1e882cebbe1904ce04\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {fileID: 2800000, guid: ee148e281f3c41c5b4ff5f8a5afe5a6c, type: 3}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_FontAssetCommon.cs",
    "content": "﻿using UnityEngine;\nusing UnityEngine.Serialization;\nusing UnityEngine.TextCore;\nusing UnityEngine.TextCore.LowLevel;\nusing System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\n\n\nnamespace TMPro\n{\n    /// <summary>\n    /// Class that contains the basic information about the font.\n    /// </summary>\n    [Serializable]\n    public class FaceInfo_Legacy\n    {\n        public string Name;\n        public float PointSize;\n        public float Scale;\n\n        public int CharacterCount;\n\n        public float LineHeight;\n        public float Baseline;\n        public float Ascender;\n        public float CapHeight;\n        public float Descender;\n        public float CenterLine;\n\n        public float SuperscriptOffset;\n        public float SubscriptOffset;\n        public float SubSize;\n\n        public float Underline;\n        public float UnderlineThickness;\n\n        public float strikethrough;\n        public float strikethroughThickness;\n\n        public float TabWidth;\n\n        public float Padding;\n        public float AtlasWidth;\n        public float AtlasHeight;\n    }\n\n\n    // Class which contains the Glyph Info / Character definition for each character contained in the font asset.\n    [Serializable]\n    public class TMP_Glyph : TMP_TextElement_Legacy\n    {\n        /// <summary>\n        /// Function to create a deep copy of a GlyphInfo.\n        /// </summary>\n        /// <param name=\"source\"></param>\n        /// <returns></returns>\n        public static TMP_Glyph Clone(TMP_Glyph source)\n        {\n            TMP_Glyph copy = new TMP_Glyph();\n\n            copy.id = source.id;\n            copy.x = source.x;\n            copy.y = source.y;\n            copy.width = source.width;\n            copy.height = source.height;\n            copy.xOffset = source.xOffset;\n            copy.yOffset = source.yOffset;\n            copy.xAdvance = source.xAdvance;\n            copy.scale = source.scale;\n\n            return copy;\n        }\n    }\n\n\n    // Structure which holds the font creation settings\n    [Serializable]\n    public struct FontAssetCreationSettings\n    {\n        public string sourceFontFileName;\n        public string sourceFontFileGUID;\n        public int pointSizeSamplingMode;\n        public int pointSize;\n        public int padding;\n        public int packingMode;\n        public int atlasWidth;\n        public int atlasHeight;\n        public int characterSetSelectionMode;\n        public string characterSequence;\n        public string referencedFontAssetGUID;\n        public string referencedTextAssetGUID;\n        public int fontStyle;\n        public float fontStyleModifier;\n        public int renderMode;\n        public bool includeFontFeatures;\n\n        internal FontAssetCreationSettings(string sourceFontFileGUID, int pointSize, int pointSizeSamplingMode, int padding, int packingMode, int atlasWidth, int atlasHeight, int characterSelectionMode, string characterSet, int renderMode)\n        {\n            this.sourceFontFileName = string.Empty;\n            this.sourceFontFileGUID = sourceFontFileGUID;\n            this.pointSize = pointSize;\n            this.pointSizeSamplingMode = pointSizeSamplingMode;\n            this.padding = padding;\n            this.packingMode = packingMode;\n            this.atlasWidth = atlasWidth;\n            this.atlasHeight = atlasHeight;\n            this.characterSequence = characterSet;\n            this.characterSetSelectionMode = characterSelectionMode;\n            this.renderMode = renderMode;\n\n            this.referencedFontAssetGUID = string.Empty;\n            this.referencedTextAssetGUID = string.Empty;\n            this.fontStyle = 0;\n            this.fontStyleModifier = 0;\n            this.includeFontFeatures = false;\n        }\n    }\n\n    /// <summary>\n    /// Contains the font assets for the regular and italic styles associated with a given font weight.\n    /// </summary>\n    [Serializable]\n    public struct TMP_FontWeightPair\n    {\n        public TMP_FontAsset regularTypeface;\n        public TMP_FontAsset italicTypeface;\n    }\n\n\n    public struct KerningPairKey\n    {\n        public uint ascii_Left;\n        public uint ascii_Right;\n        public uint key;\n\n        public KerningPairKey(uint ascii_left, uint ascii_right)\n        {\n            ascii_Left = ascii_left;\n            ascii_Right = ascii_right;\n            key = (ascii_right << 16) + ascii_left;\n        }\n    }\n\n    /// <summary>\n    /// Positional adjustments of a glyph\n    /// </summary>\n    [Serializable]\n    public struct GlyphValueRecord_Legacy\n    {\n        public float xPlacement;\n        public float yPlacement;\n        public float xAdvance;\n        public float yAdvance;\n\n        internal GlyphValueRecord_Legacy(UnityEngine.TextCore.LowLevel.GlyphValueRecord valueRecord)\n        {\n            this.xPlacement = valueRecord.xPlacement;\n            this.yPlacement = valueRecord.yPlacement;\n            this.xAdvance = valueRecord.xAdvance;\n            this.yAdvance = valueRecord.yAdvance;\n        }\n\n        public static GlyphValueRecord_Legacy operator +(GlyphValueRecord_Legacy a, GlyphValueRecord_Legacy b)\n        {\n            GlyphValueRecord_Legacy c;\n            c.xPlacement = a.xPlacement + b.xPlacement;\n            c.yPlacement = a.yPlacement + b.yPlacement;\n            c.xAdvance = a.xAdvance + b.xAdvance;\n            c.yAdvance = a.yAdvance + b.yAdvance;\n\n            return c;\n        }\n    }\n\n    [Serializable]\n    public class KerningPair\n    {\n        /// <summary>\n        /// The first glyph part of a kerning pair.\n        /// </summary>\n        public uint firstGlyph\n        {\n            get { return m_FirstGlyph; }\n            set { m_FirstGlyph = value; }\n        }\n        [FormerlySerializedAs(\"AscII_Left\")]\n        [SerializeField]\n        private uint m_FirstGlyph;\n\n        /// <summary>\n        /// The positional adjustment of the first glyph.\n        /// </summary>\n        public GlyphValueRecord_Legacy firstGlyphAdjustments\n        {\n            get { return m_FirstGlyphAdjustments; }\n        }\n        [SerializeField]\n        private GlyphValueRecord_Legacy m_FirstGlyphAdjustments;\n\n        /// <summary>\n        /// The second glyph part of a kerning pair.\n        /// </summary>\n        public uint secondGlyph\n        {\n            get { return m_SecondGlyph; }\n            set { m_SecondGlyph = value; }\n        }\n        [FormerlySerializedAs(\"AscII_Right\")]\n        [SerializeField]\n        private uint m_SecondGlyph;\n\n        /// <summary>\n        /// The positional adjustment of the second glyph.\n        /// </summary>\n        public GlyphValueRecord_Legacy secondGlyphAdjustments\n        {\n            get { return m_SecondGlyphAdjustments; }\n        }\n        [SerializeField]\n        private GlyphValueRecord_Legacy m_SecondGlyphAdjustments;\n\n        [FormerlySerializedAs(\"XadvanceOffset\")]\n        public float xOffset;\n\n        internal static KerningPair empty = new KerningPair(0, new GlyphValueRecord_Legacy(), 0, new GlyphValueRecord_Legacy());\n\n        /// <summary>\n        /// Determines if the Character Spacing property of the text object will affect the kerning pair.\n        /// This is mostly relevant when using Diacritical marks to prevent Character Spacing from altering the \n        /// </summary>\n        public bool ignoreSpacingAdjustments\n        {\n            get { return m_IgnoreSpacingAdjustments; }\n        }\n        [SerializeField]\n        private bool m_IgnoreSpacingAdjustments = false;\n\n        public KerningPair()\n        {\n            m_FirstGlyph = 0;\n            m_FirstGlyphAdjustments = new GlyphValueRecord_Legacy();\n\n            m_SecondGlyph = 0;\n            m_SecondGlyphAdjustments = new GlyphValueRecord_Legacy();\n        }\n\n        public KerningPair(uint left, uint right, float offset)\n        {\n            firstGlyph = left;\n            m_SecondGlyph = right;\n            xOffset = offset;\n        }\n\n        public KerningPair(uint firstGlyph, GlyphValueRecord_Legacy firstGlyphAdjustments, uint secondGlyph, GlyphValueRecord_Legacy secondGlyphAdjustments)\n        {\n            m_FirstGlyph = firstGlyph;\n            m_FirstGlyphAdjustments = firstGlyphAdjustments;\n            m_SecondGlyph = secondGlyph;\n            m_SecondGlyphAdjustments = secondGlyphAdjustments;\n        }\n\n        internal void ConvertLegacyKerningData()\n        {\n            m_FirstGlyphAdjustments.xAdvance = xOffset;\n            //xOffset = 0;\n        }\n\n    }\n\n    [Serializable]\n    public class KerningTable\n    {\n        public List<KerningPair> kerningPairs;\n\n        public KerningTable()\n        {\n            kerningPairs = new List<KerningPair>();\n        }\n\n\n        public void AddKerningPair()\n        {\n            if (kerningPairs.Count == 0)\n            {\n                kerningPairs.Add(new KerningPair(0, 0, 0));\n            }\n            else\n            {\n                uint left = kerningPairs.Last().firstGlyph;\n                uint right = kerningPairs.Last().secondGlyph;\n                float xoffset = kerningPairs.Last().xOffset;\n\n                kerningPairs.Add(new KerningPair(left, right, xoffset));\n            }\n        }\n\n\n        /// <summary>\n        /// Add Kerning Pair\n        /// </summary>\n        /// <param name=\"first\">First glyph</param>\n        /// <param name=\"second\">Second glyph</param>\n        /// <param name=\"offset\">xAdvance value</param>\n        /// <returns></returns>\n        public int AddKerningPair(uint first, uint second, float offset)\n        {\n            int index = kerningPairs.FindIndex(item => item.firstGlyph == first && item.secondGlyph == second);\n\n            if (index == -1)\n            {\n                kerningPairs.Add(new KerningPair(first, second, offset));\n                return 0;\n            }\n\n            // Return -1 if Kerning Pair already exists.\n            return -1;\n        }\n\n        /// <summary>\n        /// Add Glyph pair adjustment record\n        /// </summary>\n        /// <param name=\"firstGlyph\">The first glyph</param>\n        /// <param name=\"firstGlyphAdjustments\">Adjustment record for the first glyph</param>\n        /// <param name=\"secondGlyph\">The second glyph</param>\n        /// <param name=\"secondGlyphAdjustments\">Adjustment record for the second glyph</param>\n        /// <returns></returns>\n        public int AddGlyphPairAdjustmentRecord(uint first, GlyphValueRecord_Legacy firstAdjustments, uint second, GlyphValueRecord_Legacy secondAdjustments)\n        {\n            int index = kerningPairs.FindIndex(item => item.firstGlyph == first && item.secondGlyph == second);\n\n            if (index == -1)\n            {\n                kerningPairs.Add(new KerningPair(first, firstAdjustments, second, secondAdjustments));\n                return 0;\n            }\n\n            // Return -1 if Kerning Pair already exists.\n            return -1;\n        }\n\n        public void RemoveKerningPair(int left, int right)\n        {\n            int index = kerningPairs.FindIndex(item => item.firstGlyph == left && item.secondGlyph == right);\n\n            if (index != -1)\n                kerningPairs.RemoveAt(index);\n        }\n\n\n        public void RemoveKerningPair(int index)\n        {\n            kerningPairs.RemoveAt(index);\n        }\n\n\n        public void SortKerningPairs()\n        {\n            // Sort List of Kerning Info\n            if (kerningPairs.Count > 0)\n                kerningPairs = kerningPairs.OrderBy(s => s.firstGlyph).ThenBy(s => s.secondGlyph).ToList();\n        }\n    }\n\n\n    public static class TMP_FontUtilities\n    {\n        private static List<int> k_searchedFontAssets;\n\n        /// <summary>\n        /// Search through the given font and its fallbacks for the specified character.\n        /// </summary>\n        /// <param name=\"font\">The font asset to search for the given character.</param>\n        /// <param name=\"unicode\">The character to find.</param>\n        /// <param name=\"character\">out parameter containing the glyph for the specified character (if found).</param>\n        /// <returns></returns>\n        public static TMP_FontAsset SearchForCharacter(TMP_FontAsset font, uint unicode, out TMP_Character character)\n        {\n            if (k_searchedFontAssets == null)\n                k_searchedFontAssets = new List<int>();\n\n            k_searchedFontAssets.Clear();\n\n            return SearchForCharacterInternal(font, unicode, out character);\n        }\n\n\n        /// <summary>\n        /// Search through the given list of fonts and their possible fallbacks for the specified character.\n        /// </summary>\n        /// <param name=\"fonts\"></param>\n        /// <param name=\"unicode\"></param>\n        /// <param name=\"character\"></param>\n        /// <returns></returns>\n        public static TMP_FontAsset SearchForCharacter(List<TMP_FontAsset> fonts, uint unicode, out TMP_Character character)\n        {\n            return SearchForCharacterInternal(fonts, unicode, out character);\n        }\n\n\n        private static TMP_FontAsset SearchForCharacterInternal(TMP_FontAsset font, uint unicode, out TMP_Character character)\n        {\n            character = null;\n\n            if (font == null) return null;\n\n            if (font.characterLookupTable.TryGetValue(unicode, out character))\n            {\n                return font;\n            }\n            else if (font.fallbackFontAssetTable != null && font.fallbackFontAssetTable.Count > 0)\n            {\n                for (int i = 0; i < font.fallbackFontAssetTable.Count && character == null; i++)\n                {\n                    TMP_FontAsset temp = font.fallbackFontAssetTable[i];\n                    if (temp == null) continue;\n\n                    int id = temp.GetInstanceID();\n\n                    // Skip over the fallback font asset in the event it is null or if already searched.\n                    if (k_searchedFontAssets.Contains(id)) continue;\n\n                    // Add to list of font assets already searched.\n                    k_searchedFontAssets.Add(id);\n\n                    temp = SearchForCharacterInternal(temp, unicode, out character);\n\n                    if (temp != null)\n                        return temp;\n                }\n            }\n\n            return null;\n        }\n\n\n        private static TMP_FontAsset SearchForCharacterInternal(List<TMP_FontAsset> fonts, uint unicode, out TMP_Character character)\n        {\n            character = null;\n\n            if (fonts != null && fonts.Count > 0)\n            {\n                for (int i = 0; i < fonts.Count; i++)\n                {\n                    TMP_FontAsset fontAsset = SearchForCharacterInternal(fonts[i], unicode, out character);\n\n                    if (fontAsset != null)\n                        return fontAsset;\n                }\n            }\n\n            return null;\n        }\n    }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_FontAssetCommon.cs.meta",
    "content": "fileFormatVersion: 2\nguid: f695b5f9415c40b39ae877eaff41c96e\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_FontAssetUtilities.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\nusing UnityEngine.TextCore;\nusing UnityEngine.TextCore.LowLevel;\n\n\nnamespace TMPro\n{\n    public class TMP_FontAssetUtilities\n    {\n        private static readonly TMP_FontAssetUtilities s_Instance = new TMP_FontAssetUtilities();\n\n        /// <summary>\n        /// Default constructor\n        /// </summary>\n        static TMP_FontAssetUtilities() { }\n\n\n        /// <summary>\n        /// Get a singleton instance of the Font Asset Utilities class.\n        /// </summary>\n        public static TMP_FontAssetUtilities instance\n        {\n            get { return s_Instance; }\n        }\n\n\n        /// <summary>\n        /// List containing instance ID of font assets already searched.\n        /// </summary>\n        private static List<int> k_SearchedFontAssets;\n\n\n        /// <summary>\n        /// Returns the text element (character) for the given unicode value taking into consideration the requested font style and weight.\n        /// Function searches the source font asset, its list of font assets assigned as alternative typefaces and potentially its fallbacks.\n        /// The font asset out parameter contains a reference to the font asset containing the character.\n        /// The typeface type indicates whether the returned font asset is the source font asset, an alternative typeface or fallback font asset.\n        /// </summary>\n        /// <param name=\"unicode\">The unicode value of the requested character</param>\n        /// <param name=\"sourceFontAsset\">The font asset to be searched</param>\n        /// <param name=\"includeFallbacks\">Include the fallback font assets in the search</param>\n        /// <param name=\"fontStyle\">The font style</param>\n        /// <param name=\"fontWeight\">The font weight</param>\n        /// <param name=\"type\">Indicates if the OUT font asset is an alternative typeface or fallback font asset</param>\n        /// <param name=\"fontAsset\">The font asset that contains the requested character</param>\n        /// <returns></returns>\n        public static TMP_Character GetCharacterFromFontAsset(uint unicode, TMP_FontAsset sourceFontAsset, bool includeFallbacks, FontStyles fontStyle, FontWeight fontWeight, out bool isAlternativeTypeface, out TMP_FontAsset fontAsset)\n        {\n            if (includeFallbacks)\n            {\n                if (k_SearchedFontAssets == null)\n                    k_SearchedFontAssets = new List<int>();\n                else\n                    k_SearchedFontAssets.Clear();\n            }\n\n            return GetCharacterFromFontAsset_Internal(unicode, sourceFontAsset, includeFallbacks, fontStyle, fontWeight, out isAlternativeTypeface, out fontAsset);\n        }\n\n\n        /// <summary>\n        /// Internal function returning the text element character for the given unicode value taking into consideration the font style and weight.\n        /// Function searches the source font asset, list of font assets assigned as alternative typefaces and list of fallback font assets.\n        /// </summary>\n        private static TMP_Character GetCharacterFromFontAsset_Internal(uint unicode, TMP_FontAsset sourceFontAsset, bool includeFallbacks, FontStyles fontStyle, FontWeight fontWeight, out bool isAlternativeTypeface, out TMP_FontAsset fontAsset)\n        {\n            fontAsset = null;\n            isAlternativeTypeface = false;\n            TMP_Character characterData = null;\n\n            #region FONT WEIGHT AND FONT STYLE HANDLING\n            // Determine if a font weight or style is used. If so check if an alternative typeface is assigned for the given weight and / or style.\n            bool isItalic = (fontStyle & FontStyles.Italic) == FontStyles.Italic;\n\n            if (isItalic || fontWeight != FontWeight.Regular)\n            {\n                // Get reference to the font weight pairs of the given font asset.\n                TMP_FontWeightPair[] fontWeights = sourceFontAsset.fontWeightTable;\n\n                int fontWeightIndex = 4;\n                switch (fontWeight)\n                {\n                    case FontWeight.Thin:\n                        fontWeightIndex = 1;\n                        break;\n                    case FontWeight.ExtraLight:\n                        fontWeightIndex = 2;\n                        break;\n                    case FontWeight.Light:\n                        fontWeightIndex = 3;\n                        break;\n                    case FontWeight.Regular:\n                        fontWeightIndex = 4;\n                        break;\n                    case FontWeight.Medium:\n                        fontWeightIndex = 5;\n                        break;\n                    case FontWeight.SemiBold:\n                        fontWeightIndex = 6;\n                        break;\n                    case FontWeight.Bold:\n                        fontWeightIndex = 7;\n                        break;\n                    case FontWeight.Heavy:\n                        fontWeightIndex = 8;\n                        break;\n                    case FontWeight.Black:\n                        fontWeightIndex = 9;\n                        break;\n                }\n\n                fontAsset = isItalic ? fontWeights[fontWeightIndex].italicTypeface : fontWeights[fontWeightIndex].regularTypeface;\n\n                if (fontAsset != null)\n                {\n                    if (fontAsset.characterLookupTable.TryGetValue(unicode, out characterData))\n                    {\n                        isAlternativeTypeface = true;\n\n                        return characterData;\n                    }\n                    else if (fontAsset.atlasPopulationMode == AtlasPopulationMode.Dynamic)\n                    {\n                        if (fontAsset.TryAddCharacterInternal(unicode, out characterData))\n                        {\n                            isAlternativeTypeface = true;\n\n                            return characterData;\n                        }\n\n                        // Check if the source font file contains the requested character.\n                        //if (TryGetCharacterFromFontFile(unicode, fontAsset, out characterData))\n                        //{\n                        //    isAlternativeTypeface = true;\n\n                        //    return characterData;\n                        //}\n\n                        // If we find the requested character, we add it to the font asset character table\n                        // and return its character data.\n                        // We also add this character to the list of characters we will need to add to the font atlas.\n                        // We assume the font atlas has room otherwise this font asset should not be marked as dynamic.\n                        // Alternatively, we could also add multiple pages of font atlas textures (feature consideration).\n                    }\n\n                    // At this point, we were not able to find the requested character in the alternative typeface\n                    // so we check the source font asset and its potential fallbacks.\n                }\n\n            }\n            #endregion\n\n            // Search the source font asset for the requested character.\n            if (sourceFontAsset.characterLookupTable.TryGetValue(unicode, out characterData))\n            {\n                // We were able to locate the requested character in the given font asset.\n                fontAsset = sourceFontAsset;\n\n                return characterData;\n            }\n            else if (sourceFontAsset.atlasPopulationMode == AtlasPopulationMode.Dynamic)\n            {\n                if (sourceFontAsset.TryAddCharacterInternal(unicode, out characterData))\n                {\n                    fontAsset = sourceFontAsset;\n\n                    return characterData;\n                }\n\n                //// Check if the source font file contains the requested character.\n                //if (TryGetCharacterFromFontFile(unicode, sourceFontAsset, out characterData))\n                //{\n                //    fontAsset = sourceFontAsset;\n\n                //    //fontAsset.AddCharacterToRasterList(unicode);\n\n                //    return characterData;\n                //}\n\n                // If we find the requested character, we add it to the font asset character table\n                // and return its character data.\n                // We also add this character to the list of characters we will need to add to the font atlas.\n                // We assume the font atlas has room otherwise this font asset should not be marked as dynamic.\n                // Alternatively, we could also add multiple pages of font atlas textures (feature consideration)\n            }\n\n            // Search fallback font assets if we still don't have a valid character and include fallback is set to true.\n            if (characterData == null && includeFallbacks && sourceFontAsset.fallbackFontAssetTable != null)\n            {\n                // Get reference to the list of fallback font assets.\n                List<TMP_FontAsset> fallbackFontAssets = sourceFontAsset.fallbackFontAssetTable;\n                int fallbackCount = fallbackFontAssets.Count;\n\n                if (fallbackFontAssets != null && fallbackCount > 0)\n                {\n                    for (int i = 0; i < fallbackCount && characterData == null; i++)\n                    {\n                        TMP_FontAsset temp = fallbackFontAssets[i];\n\n                        if (temp == null) continue;\n\n                        int id = temp.GetInstanceID();\n\n                        // Skip over the fallback font asset in the event it is null or if already searched.\n                        if (k_SearchedFontAssets.Contains(id))\n                            continue;\n\n                        // Add to list of font assets already searched.\n                        k_SearchedFontAssets.Add(id);\n\n                        characterData = GetCharacterFromFontAsset_Internal(unicode, temp, includeFallbacks, fontStyle, fontWeight, out isAlternativeTypeface, out fontAsset);\n\n                        if (characterData != null)\n                        {\n                            return characterData;\n                        }\n                    }\n                }\n\n            }\n\n            return null;\n        }\n\n\n        /// <summary>\n        /// Returns the text element (character) for the given unicode value taking into consideration the requested font style and weight.\n        /// Function searches the provided list of font assets, the list of font assets assigned as alternative typefaces to them as well as their fallbacks.\n        /// The font asset out parameter contains a reference to the font asset containing the character.\n        /// The typeface type indicates whether the returned font asset is the source font asset, an alternative typeface or fallback font asset.\n        /// </summary>\n        /// <param name=\"unicode\">The unicode value of the requested character</param>\n        /// <param name=\"fontAssets\">The list of font assets to search</param>\n        /// <param name=\"includeFallbacks\">Determines if the fallback of each font assets on the list will be searched</param>\n        /// <param name=\"fontStyle\">The font style</param>\n        /// <param name=\"fontWeight\">The font weight</param>\n        /// <param name=\"type\">Determines if the OUT font asset is an alternative typeface or fallback font asset</param>\n        /// <param name=\"fontAsset\">The font asset that contains the requested character</param>\n        /// <returns></returns>\n        public static TMP_Character GetCharacterFromFontAssets(uint unicode, List<TMP_FontAsset> fontAssets, bool includeFallbacks, FontStyles fontStyle, FontWeight fontWeight, out bool isAlternativeTypeface, out TMP_FontAsset fontAsset)\n        {\n            isAlternativeTypeface = false;\n\n            // Make sure font asset list is valid\n            if (fontAssets == null || fontAssets.Count == 0)\n            {\n                fontAsset = null;\n                return null;\n            }\n\n            if (includeFallbacks)\n            {\n                if (k_SearchedFontAssets == null)\n                    k_SearchedFontAssets = new List<int>();\n                else\n                    k_SearchedFontAssets.Clear();\n            }\n\n            int fontAssetCount = fontAssets.Count;\n\n            for (int i = 0; i < fontAssetCount; i++)\n            {\n                if (fontAssets[i] == null) continue;\n\n                TMP_Character characterData = GetCharacterFromFontAsset_Internal(unicode, fontAssets[i], includeFallbacks, fontStyle, fontWeight, out isAlternativeTypeface, out fontAsset);\n\n                if (characterData != null)\n                    return characterData;\n            }\n\n            fontAsset = null;\n\n            return null;\n        }\n\n\n        // =====================================================================\n        // FONT ENGINE & FONT FILE MANAGEMENT - Fields, Properties and Functions\n        // =====================================================================\n\n        private static bool k_IsFontEngineInitialized;\n\n\n        private static bool TryGetCharacterFromFontFile(uint unicode, TMP_FontAsset fontAsset, out TMP_Character character)\n        {\n            character = null;\n\n            // Initialize Font Engine library if not already initialized\n            if (k_IsFontEngineInitialized == false)\n            {\n                FontEngineError error = FontEngine.InitializeFontEngine();\n\n                if (error == 0)\n                    k_IsFontEngineInitialized = true;\n            }\n\n            // Load the font face for the given font asset.\n            // TODO: Add manager to keep track of which font faces are currently loaded.\n            FontEngine.LoadFontFace(fontAsset.sourceFontFile, fontAsset.faceInfo.pointSize);\n\n            Glyph glyph = null;\n            uint glyphIndex = FontEngine.GetGlyphIndex(unicode);\n\n            // Check if glyph is already contained in the font asset as the same glyph might be referenced by multiple character.\n            if (fontAsset.glyphLookupTable.TryGetValue(glyphIndex, out glyph))\n            {\n                character = fontAsset.AddCharacter_Internal(unicode, glyph);\n\n                return true;\n            }\n\n            GlyphLoadFlags glyphLoadFlags = ((GlyphRasterModes)fontAsset.atlasRenderMode & GlyphRasterModes.RASTER_MODE_HINTED) == GlyphRasterModes.RASTER_MODE_HINTED ? GlyphLoadFlags.LOAD_RENDER : GlyphLoadFlags.LOAD_RENDER | GlyphLoadFlags.LOAD_NO_HINTING;\n\n            if (FontEngine.TryGetGlyphWithUnicodeValue(unicode, glyphLoadFlags, out glyph))\n            {\n                // Add new character to font asset (if needed)\n                character = fontAsset.AddCharacter_Internal(unicode, glyph);\n\n                return true;\n            }\n\n            return false;\n        }\n\n\n        public static bool TryGetGlyphFromFontFile(uint glyphIndex, TMP_FontAsset fontAsset, out Glyph glyph)\n        {\n            glyph = null;\n\n            // Initialize Font Engine library if not already initialized\n            if (k_IsFontEngineInitialized == false)\n            {\n                FontEngineError error = FontEngine.InitializeFontEngine();\n\n                if (error == 0)\n                    k_IsFontEngineInitialized = true;\n            }\n\n            // Load the font face for the given font asset.\n            // TODO: Add manager to keep track of which font faces are currently loaded.\n            FontEngine.LoadFontFace(fontAsset.sourceFontFile, fontAsset.faceInfo.pointSize);\n\n            GlyphLoadFlags glyphLoadFlags = ((GlyphRasterModes)fontAsset.atlasRenderMode & GlyphRasterModes.RASTER_MODE_HINTED) == GlyphRasterModes.RASTER_MODE_HINTED ? GlyphLoadFlags.LOAD_RENDER : GlyphLoadFlags.LOAD_RENDER | GlyphLoadFlags.LOAD_NO_HINTING;\n\n            if (FontEngine.TryGetGlyphWithIndexValue(glyphIndex, glyphLoadFlags, out glyph))\n            {\n                // Add new glyph to font asset (if needed)\n                //fontAsset.AddGlyph_Internal(glyph);\n\n                return true;\n            }\n\n            return false;\n        }\n\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_FontAssetUtilities.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 0a017569bfe174e4890797b4d64cbabc\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_FontFeatureTable.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing System.Collections.Generic;\nusing UnityEngine;\n\n\nnamespace TMPro\n{\n    /// <summary>\n    /// Table that contains the various font features available for the given font asset.\n    /// </summary>\n    [Serializable]\n    public class TMP_FontFeatureTable\n    {\n        /// <summary>\n        /// List that contains the glyph pair adjustment records.\n        /// </summary>\n        internal List<TMP_GlyphPairAdjustmentRecord> glyphPairAdjustmentRecords\n        {\n            get { return m_GlyphPairAdjustmentRecords; }\n            set { m_GlyphPairAdjustmentRecords = value; }\n        }\n        [SerializeField]\n        internal List<TMP_GlyphPairAdjustmentRecord> m_GlyphPairAdjustmentRecords;\n\n        /// <summary>\n        /// \n        /// </summary>\n        internal Dictionary<long, TMP_GlyphPairAdjustmentRecord> m_GlyphPairAdjustmentRecordLookupDictionary;\n\n        // =============================================\n        // Constructor(s)\n        // =============================================\n\n        public TMP_FontFeatureTable()\n        {\n            m_GlyphPairAdjustmentRecords = new List<TMP_GlyphPairAdjustmentRecord>();\n            m_GlyphPairAdjustmentRecordLookupDictionary = new Dictionary<long, TMP_GlyphPairAdjustmentRecord>();\n        }\n\n        // =============================================\n        // Utility Functions\n        // =============================================\n\n        /// <summary>\n        /// Sort the glyph pair adjustment records by glyph index.\n        /// </summary>\n        public void SortGlyphPairAdjustmentRecords()\n        {\n            // Sort List of Kerning Info\n            if (m_GlyphPairAdjustmentRecords.Count > 0)\n                m_GlyphPairAdjustmentRecords = m_GlyphPairAdjustmentRecords.OrderBy(s => s.firstAdjustmentRecord.glyphIndex).ThenBy(s => s.secondAdjustmentRecord.glyphIndex).ToList();\n        }\n    }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_FontFeatureTable.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 5ea9f573d4b800a49b9d83a1f61c0a88\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_FontFeaturesCommon.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\nusing UnityEngine.TextCore.LowLevel;\n\n\nnamespace TMPro\n{\n    public enum FontFeatureLookupFlags\n    {\n        IgnoreLigatures             =   0x004,\n        IgnoreSpacingAdjustments    =   0x100,\n    }\n\n    /// <summary>\n    /// The values used to adjust the position of a glyph or set of glyphs.\n    /// </summary>\n    [Serializable]\n    public struct TMP_GlyphValueRecord\n    {\n        /// <summary>\n        /// The positional adjustment affecting the horizontal bearing X of the glyph.\n        /// </summary>\n        public float xPlacement { get { return m_XPlacement; } set { m_XPlacement = value; } }\n\n        /// <summary>\n        /// The positional adjustment affecting the horizontal bearing Y of the glyph.\n        /// </summary>\n        public float yPlacement { get { return m_YPlacement; } set { m_YPlacement = value; } }\n\n        /// <summary>\n        /// The positional adjustment affecting the horizontal advance of the glyph.\n        /// </summary>\n        public float xAdvance { get { return m_XAdvance; } set { m_XAdvance = value; } }\n\n        /// <summary>\n        /// The positional adjustment affecting the vertical advance of the glyph.\n        /// </summary>\n        public float yAdvance { get { return m_YAdvance; } set { m_YAdvance = value; } }\n\n        // =============================================\n        // Private backing fields for public properties.\n        // =============================================\n\n        [SerializeField]\n        private float m_XPlacement;\n\n        [SerializeField]\n        private float m_YPlacement;\n\n        [SerializeField]\n        private float m_XAdvance;\n\n        [SerializeField]\n        private float m_YAdvance;\n\n\n        /// <summary>\n        /// Constructor\n        /// </summary>\n        /// <param name=\"xPlacement\">The positional adjustment affecting the horizontal bearing X of the glyph.</param>\n        /// <param name=\"yPlacement\">The positional adjustment affecting the horizontal bearing Y of the glyph.</param>\n        /// <param name=\"xAdvance\">The positional adjustment affecting the horizontal advance of the glyph.</param>\n        /// <param name=\"yAdvance\">The positional adjustment affecting the vertical advance of the glyph.</param>\n        public TMP_GlyphValueRecord(float xPlacement, float yPlacement, float xAdvance, float yAdvance)\n        {\n            m_XPlacement = xPlacement;\n            m_YPlacement = yPlacement;\n            m_XAdvance = xAdvance;\n            m_YAdvance = yAdvance;\n        }\n\n        internal TMP_GlyphValueRecord(GlyphValueRecord_Legacy valueRecord)\n        {\n            m_XPlacement = valueRecord.xPlacement;\n            m_YPlacement = valueRecord.yPlacement;\n            m_XAdvance = valueRecord.xAdvance;\n            m_YAdvance = valueRecord.yAdvance;\n        }\n\n        internal TMP_GlyphValueRecord(GlyphValueRecord valueRecord)\n        {\n            m_XPlacement = valueRecord.xPlacement;\n            m_YPlacement = valueRecord.yPlacement;\n            m_XAdvance = valueRecord.xAdvance;\n            m_YAdvance = valueRecord.yAdvance;\n        }\n\n        public static TMP_GlyphValueRecord operator +(TMP_GlyphValueRecord a, TMP_GlyphValueRecord b)\n        {\n            TMP_GlyphValueRecord c;\n            c.m_XPlacement = a.xPlacement + b.xPlacement;\n            c.m_YPlacement = a.yPlacement + b.yPlacement;\n            c.m_XAdvance = a.xAdvance + b.xAdvance;\n            c.m_YAdvance = a.yAdvance + b.yAdvance;\n\n            return c;\n        }\n    }\n\n    /// <summary>\n    /// The positional adjustment values of a glyph.\n    /// </summary>\n    [Serializable]\n    public struct TMP_GlyphAdjustmentRecord\n    {\n        /// <summary>\n        /// The index of the glyph in the source font file.\n        /// </summary>\n        public uint glyphIndex { get { return m_GlyphIndex; } set { m_GlyphIndex = value; } }\n\n        /// <summary>\n        /// The GlyphValueRecord contains the positional adjustments of the glyph.\n        /// </summary>\n        public TMP_GlyphValueRecord glyphValueRecord { get { return m_GlyphValueRecord; } set { m_GlyphValueRecord = value; } }\n\n        // =============================================\n        // Private backing fields for public properties.\n        // =============================================\n\n        [SerializeField]\n        private uint m_GlyphIndex;\n\n        [SerializeField]\n        private TMP_GlyphValueRecord m_GlyphValueRecord;\n\n        /// <summary>\n        /// Constructor\n        /// </summary>\n        /// <param name=\"glyphIndex\">The index of the glyph in the source font file.</param>\n        /// <param name=\"glyphValueRecord\">The GlyphValueRecord contains the positional adjustments of the glyph.</param>\n        public TMP_GlyphAdjustmentRecord(uint glyphIndex, TMP_GlyphValueRecord glyphValueRecord)\n        {\n            m_GlyphIndex = glyphIndex;\n            m_GlyphValueRecord = glyphValueRecord;\n        }\n\n        internal TMP_GlyphAdjustmentRecord(GlyphAdjustmentRecord adjustmentRecord)\n        {\n            m_GlyphIndex = adjustmentRecord.glyphIndex;\n            m_GlyphValueRecord = new TMP_GlyphValueRecord(adjustmentRecord.glyphValueRecord);\n        }\n    }\n\n    /// <summary>\n    /// The positional adjustment values for a pair of glyphs.\n    /// </summary>\n    [Serializable]\n    public class TMP_GlyphPairAdjustmentRecord\n    {\n        /// <summary>\n        /// Contains the positional adjustment values for the first glyph.\n        /// </summary>\n        public TMP_GlyphAdjustmentRecord firstAdjustmentRecord { get { return m_FirstAdjustmentRecord; } set { m_FirstAdjustmentRecord = value; } }\n\n        /// <summary>\n        /// Contains the positional adjustment values for the second glyph.\n        /// </summary>\n        public TMP_GlyphAdjustmentRecord secondAdjustmentRecord { get { return m_SecondAdjustmentRecord; } set { m_SecondAdjustmentRecord = value; } }\n\n        /// <summary>\n        /// \n        /// </summary>\n        public FontFeatureLookupFlags featureLookupFlags { get { return m_FeatureLookupFlags; } set { m_FeatureLookupFlags = value; } }\n\n        // =============================================\n        // Private backing fields for public properties.\n        // =============================================\n\n        [SerializeField]\n        private TMP_GlyphAdjustmentRecord m_FirstAdjustmentRecord;\n\n        [SerializeField]\n        private TMP_GlyphAdjustmentRecord m_SecondAdjustmentRecord;\n\n        [SerializeField]\n        private FontFeatureLookupFlags m_FeatureLookupFlags;\n\n        /// <summary>\n        /// Constructor\n        /// </summary>\n        /// <param name=\"firstAdjustmentRecord\">First glyph adjustment record.</param>\n        /// <param name=\"secondAdjustmentRecord\">Second glyph adjustment record.</param>\n        public TMP_GlyphPairAdjustmentRecord(TMP_GlyphAdjustmentRecord firstAdjustmentRecord, TMP_GlyphAdjustmentRecord secondAdjustmentRecord)\n        {\n            m_FirstAdjustmentRecord = firstAdjustmentRecord;\n            m_SecondAdjustmentRecord = secondAdjustmentRecord;\n        }\n\n        /// <summary>\n        /// Internal constructor \n        /// </summary>\n        /// <param name=\"firstAdjustmentRecord\"></param>\n        /// <param name=\"secondAdjustmentRecord\"></param>\n        internal TMP_GlyphPairAdjustmentRecord(GlyphPairAdjustmentRecord glyphPairAdjustmentRecord)\n        {\n            m_FirstAdjustmentRecord = new TMP_GlyphAdjustmentRecord(glyphPairAdjustmentRecord.firstAdjustmentRecord);\n            m_SecondAdjustmentRecord = new TMP_GlyphAdjustmentRecord(glyphPairAdjustmentRecord.secondAdjustmentRecord);\n        }\n    }\n\n    public struct GlyphPairKey\n    {\n        public uint firstGlyphIndex;\n        public uint secondGlyphIndex;\n        public long key;\n\n        public GlyphPairKey(uint firstGlyphIndex, uint secondGlyphIndex)\n        {\n            this.firstGlyphIndex = firstGlyphIndex;\n            this.secondGlyphIndex = secondGlyphIndex;\n            key = (long)secondGlyphIndex << 32 | firstGlyphIndex;\n        }\n\n        internal GlyphPairKey(TMP_GlyphPairAdjustmentRecord record)\n        {\n            firstGlyphIndex = record.firstAdjustmentRecord.glyphIndex;\n            secondGlyphIndex = record.secondAdjustmentRecord.glyphIndex;\n            key = (long)secondGlyphIndex << 32 | firstGlyphIndex;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_FontFeaturesCommon.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 27df3b12f30d0b74a9b10a3968c402ff\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_InputField.cs",
    "content": "﻿//#define TMP_DEBUG_MODE\n\nusing System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing UnityEngine;\nusing UnityEngine.UI;\nusing UnityEngine.Events;\nusing UnityEngine.EventSystems;\nusing UnityEngine.Serialization;\n\n\nnamespace TMPro\n{\n    /// <summary>\n    /// Editable text input field.\n    /// </summary>\n    [AddComponentMenu(\"UI/TextMeshPro - Input Field\", 11)]\n    public class TMP_InputField : Selectable,\n        IUpdateSelectedHandler,\n        IBeginDragHandler,\n        IDragHandler,\n        IEndDragHandler,\n        IPointerClickHandler,\n        ISubmitHandler,\n        ICanvasElement,\n        ILayoutElement,\n        IScrollHandler\n    {\n\n        // Setting the content type acts as a shortcut for setting a combination of InputType, CharacterValidation, LineType, and TouchScreenKeyboardType\n        public enum ContentType\n        {\n            Standard,\n            Autocorrected,\n            IntegerNumber,\n            DecimalNumber,\n            Alphanumeric,\n            Name,\n            EmailAddress,\n            Password,\n            Pin,\n            Custom\n        }\n\n        public enum InputType\n        {\n            Standard,\n            AutoCorrect,\n            Password,\n        }\n\n        public enum CharacterValidation\n        {\n            None,\n            Digit,\n            Integer,\n            Decimal,\n            Alphanumeric,\n            Name,\n            Regex,\n            EmailAddress,\n            CustomValidator\n        }\n\n        public enum LineType\n        {\n            SingleLine,\n            MultiLineSubmit,\n            MultiLineNewline\n        }\n\n        public delegate char OnValidateInput(string text, int charIndex, char addedChar);\n\n        [Serializable]\n        public class SubmitEvent : UnityEvent<string> { }\n\n        [Serializable]\n        public class OnChangeEvent : UnityEvent<string> { }\n\n        [Serializable]\n        public class SelectionEvent : UnityEvent<string> { }\n\n        [Serializable]\n        public class TextSelectionEvent : UnityEvent<string, int, int> { }\n\n        [Serializable]\n        public class TouchScreenKeyboardEvent : UnityEvent<TouchScreenKeyboard.Status> { }\n\n        protected TouchScreenKeyboard m_SoftKeyboard;\n        static private readonly char[] kSeparators = { ' ', '.', ',', '\\t', '\\r', '\\n' };\n\n        #region Exposed properties\n        /// <summary>\n        /// Text Text used to display the input's value.\n        /// </summary>\n\n        [SerializeField]\n        protected RectTransform m_TextViewport;\n\n        //Vector3[] m_ViewportCorners = new Vector3[4];\n\n        [SerializeField]\n        protected TMP_Text m_TextComponent;\n\n        protected RectTransform m_TextComponentRectTransform;\n\n        [SerializeField]\n        protected Graphic m_Placeholder;\n\n        [SerializeField]\n        protected Scrollbar m_VerticalScrollbar;\n\n        [SerializeField]\n        protected TMP_ScrollbarEventHandler m_VerticalScrollbarEventHandler;\n        //private bool m_ForceDeactivation;\n\n        private bool m_IsDrivenByLayoutComponents = false;\n\n        /// <summary>\n        /// Used to keep track of scroll position\n        /// </summary>\n        private float m_ScrollPosition;\n\n        /// <summary>\n        /// \n        /// </summary>\n        [SerializeField]\n        protected float m_ScrollSensitivity = 1.0f;\n\n        //[SerializeField]\n        //protected TMP_Text m_PlaceholderTextComponent;\n\n        [SerializeField]\n        private ContentType m_ContentType = ContentType.Standard;\n\n        /// <summary>\n        /// Type of data expected by the input field.\n        /// </summary>\n        [SerializeField]\n        private InputType m_InputType = InputType.Standard;\n\n        /// <summary>\n        /// The character used to hide text in password field.\n        /// </summary>\n        [SerializeField]\n        private char m_AsteriskChar = '*';\n\n        /// <summary>\n        /// Keyboard type applies to mobile keyboards that get shown.\n        /// </summary>\n        [SerializeField]\n        private TouchScreenKeyboardType m_KeyboardType = TouchScreenKeyboardType.Default;\n\n        [SerializeField]\n        private LineType m_LineType = LineType.SingleLine;\n\n        /// <summary>\n        /// Should hide mobile input field part of the virtual keyboard.\n        /// </summary>\n        [SerializeField]\n        private bool m_HideMobileInput = false;\n\n        /// <summary>\n        /// Should hide soft / virtual keyboard.\n        /// </summary>\n        [SerializeField]\n        private bool m_HideSoftKeyboard = false;\n\n        /// <summary>\n        /// What kind of validation to use with the input field's data.\n        /// </summary>\n        [SerializeField]\n        private CharacterValidation m_CharacterValidation = CharacterValidation.None;\n\n        /// <summary>\n        /// The Regex expression used for validating the text input.\n        /// </summary>\n        [SerializeField]\n        private string m_RegexValue = string.Empty;\n\n        /// <summary>\n        /// The point sized used by the placeholder and input text object.\n        /// </summary>\n        [SerializeField]\n        private float m_GlobalPointSize = 14;\n\n        /// <summary>\n        /// Maximum number of characters allowed before input no longer works.\n        /// </summary>\n        [SerializeField]\n        private int m_CharacterLimit = 0;\n\n        /// <summary>\n        /// Event delegates triggered when the input field submits its data.\n        /// </summary>\n        [SerializeField]\n        private SubmitEvent m_OnEndEdit = new SubmitEvent();\n\n        /// <summary>\n        /// Event delegates triggered when the input field submits its data.\n        /// </summary>\n        [SerializeField]\n        private SubmitEvent m_OnSubmit = new SubmitEvent();\n\n        /// <summary>\n        /// Event delegates triggered when the input field is focused.\n        /// </summary>\n        [SerializeField]\n        private SelectionEvent m_OnSelect = new SelectionEvent();\n\n        /// <summary>\n        /// Event delegates triggered when the input field focus is lost.\n        /// </summary>\n        [SerializeField]\n        private SelectionEvent m_OnDeselect = new SelectionEvent();\n\n        /// <summary>\n        /// Event delegates triggered when the text is selected / highlighted.\n        /// </summary>\n        [SerializeField]\n        private TextSelectionEvent m_OnTextSelection = new TextSelectionEvent();\n\n        /// <summary>\n        /// Event delegates triggered when text is no longer select / highlighted.\n        /// </summary>\n        [SerializeField]\n        private TextSelectionEvent m_OnEndTextSelection = new TextSelectionEvent();\n\n        /// <summary>\n        /// Event delegates triggered when the input field changes its data.\n        /// </summary>\n        [SerializeField]\n        private OnChangeEvent m_OnValueChanged = new OnChangeEvent();\n\n        /// <summary>\n        /// Event delegates triggered when the status of the TouchScreenKeyboard changes.\n        /// </summary>\n        [SerializeField]\n        private TouchScreenKeyboardEvent m_OnTouchScreenKeyboardStatusChanged = new TouchScreenKeyboardEvent();\n\n        /// <summary>\n        /// Custom validation callback.\n        /// </summary>\n        [SerializeField]\n        private OnValidateInput m_OnValidateInput;\n\n        [SerializeField]\n        private Color m_CaretColor = new Color(50f / 255f, 50f / 255f, 50f / 255f, 1f);\n\n        [SerializeField]\n        private bool m_CustomCaretColor = false;\n\n        [SerializeField]\n        private Color m_SelectionColor = new Color(168f / 255f, 206f / 255f, 255f / 255f, 192f / 255f);\n\n        /// <summary>\n        /// Input field's value.\n        /// </summary>\n\n        [SerializeField]\n        [TextArea(5, 10)]\n        protected string m_Text = string.Empty;\n\n        [SerializeField]\n        [Range(0f, 4f)]\n        private float m_CaretBlinkRate = 0.85f;\n\n        [SerializeField]\n        [Range(1, 5)]\n        private int m_CaretWidth = 1;\n\n        [SerializeField]\n        private bool m_ReadOnly = false;\n\n        [SerializeField]\n        private bool m_RichText = true;\n\n        #endregion\n\n        protected int m_StringPosition = 0;\n        protected int m_StringSelectPosition = 0;\n        protected int m_CaretPosition = 0;\n        protected int m_CaretSelectPosition = 0;\n\n        private RectTransform caretRectTrans = null;\n        protected UIVertex[] m_CursorVerts = null;\n        private CanvasRenderer m_CachedInputRenderer;\n        private Vector2 m_LastPosition;\n\n        [NonSerialized]\n        protected Mesh m_Mesh;\n        private bool m_AllowInput = false;\n        //bool m_HasLostFocus = false;\n        private bool m_ShouldActivateNextUpdate = false;\n        private bool m_UpdateDrag = false;\n        private bool m_DragPositionOutOfBounds = false;\n        private const float kHScrollSpeed = 0.05f;\n        private const float kVScrollSpeed = 0.10f;\n        protected bool m_CaretVisible;\n        private Coroutine m_BlinkCoroutine = null;\n        private float m_BlinkStartTime = 0.0f;\n        private Coroutine m_DragCoroutine = null;\n        private string m_OriginalText = \"\";\n        private bool m_WasCanceled = false;\n        private bool m_HasDoneFocusTransition = false;\n        private WaitForSecondsRealtime m_WaitForSecondsRealtime;\n        private bool m_PreventCallback = false;\n\n        private bool m_TouchKeyboardAllowsInPlaceEditing = false;\n\n        private bool m_IsTextComponentUpdateRequired = false;\n        private bool m_IsScrollbarUpdateRequired = false;\n        private bool m_IsUpdatingScrollbarValues = false;\n\n        private bool m_isLastKeyBackspace = false;\n        private float m_PointerDownClickStartTime;\n        private float m_KeyDownStartTime;\n        private float m_DoubleClickDelay = 0.5f;\n\n        // Doesn't include dot and @ on purpose! See usage for details.\n        const string kEmailSpecialCharacters = \"!#$%&'*+-/=?^_`{|}~\";\n\n        private BaseInput inputSystem\n        {\n            get\n            {\n                if (EventSystem.current && EventSystem.current.currentInputModule)\n                    return EventSystem.current.currentInputModule.input;\n                return null;\n            }\n        }\n\n        private string compositionString\n        {\n            get { return inputSystem != null ? inputSystem.compositionString : Input.compositionString; }\n        }\n\n\n\n        protected TMP_InputField()\n        {\n            SetTextComponentWrapMode();\n        }\n\n        protected Mesh mesh\n        {\n            get\n            {\n                if (m_Mesh == null)\n                    m_Mesh = new Mesh();\n                return m_Mesh;\n            }\n        }\n\n        /// <summary>\n        /// Should the mobile keyboard input be hidden.\n        /// </summary>\n        public bool shouldHideMobileInput\n        {\n            get\n            {\n                switch (Application.platform)\n                {\n                    case RuntimePlatform.Android:\n                    case RuntimePlatform.IPhonePlayer:\n                    case RuntimePlatform.tvOS:\n                        return m_HideMobileInput;\n                    default:\n                        return true;\n                }\n            }\n\n            set\n            {\n                switch(Application.platform)\n                {\n                    case RuntimePlatform.Android:\n                    case RuntimePlatform.IPhonePlayer:\n                    case RuntimePlatform.tvOS:\n                        SetPropertyUtility.SetStruct(ref m_HideMobileInput, value);\n                        break;\n                    default:\n                        m_HideMobileInput = true;\n                        break;\n                }\n            }\n        }\n\n        public bool shouldHideSoftKeyboard\n        {\n            get\n            {\n                switch (Application.platform)\n                {\n                    case RuntimePlatform.Android:\n                    case RuntimePlatform.IPhonePlayer:\n                    case RuntimePlatform.tvOS:\n                    case RuntimePlatform.WSAPlayerX86:\n                    case RuntimePlatform.WSAPlayerX64:\n                    case RuntimePlatform.WSAPlayerARM:\n                        return m_HideSoftKeyboard;\n                    default:\n                        return true;\n                }\n            }\n\n            set\n            {\n                switch (Application.platform)\n                {\n                    case RuntimePlatform.Android:\n                    case RuntimePlatform.IPhonePlayer:\n                    case RuntimePlatform.tvOS:\n                    case RuntimePlatform.WSAPlayerX86:\n                    case RuntimePlatform.WSAPlayerX64:\n                    case RuntimePlatform.WSAPlayerARM:\n                        SetPropertyUtility.SetStruct(ref m_HideSoftKeyboard, value);\n                        break;\n                    default:\n                        m_HideSoftKeyboard = true;\n                        break;\n                }\n                \n                if (m_HideSoftKeyboard == true && m_SoftKeyboard != null && TouchScreenKeyboard.isSupported && m_SoftKeyboard.active)\n                {\n                    m_SoftKeyboard.active = false;\n                    m_SoftKeyboard = null;\n                }\n            }\n        }\n\n        private bool isKeyboardUsingEvents()\n        {\n            switch (Application.platform)\n            {\n                case RuntimePlatform.Android:\n                case RuntimePlatform.IPhonePlayer:\n                case RuntimePlatform.tvOS:\n                    return false;\n                default:\n                    return true;\n            }\n        }\n\n        /// <summary>\n        /// Input field's current text value. This is not necessarily the same as what is visible on screen.\n        /// </summary>\n        /// <remarks>\n        /// Note that null is invalid value  for InputField.text.\n        /// </remarks>\n        /// <example>\n        /// <code>\n        /// using UnityEngine;\n        /// using System.Collections;\n        /// using UnityEngine.UI; // Required when Using UI elements.\n        ///\n        /// public class Example : MonoBehaviour\n        /// {\n        ///     public InputField mainInputField;\n        ///\n        ///     public void Start()\n        ///     {\n        ///         mainInputField.text = \"Enter Text Here...\";\n        ///     }\n        /// }\n        /// </code>\n        /// </example>\n        public string text\n        {\n            get\n            {\n                return m_Text;\n            }\n            set\n            {\n                SetText(value);\n            }\n        }\n\n        /// <summary>\n        /// Set Input field's current text value without invoke onValueChanged. This is not necessarily the same as what is visible on screen.\n        /// </summary>\n        public void SetTextWithoutNotify(string input)\n        {\n            SetText(input, false);\n        }\n\n        void SetText(string value, bool sendCallback = true)\n        {\n            if (this.text == value)\n                return;\n\n            if (value == null)\n                value = \"\";\n\n            value = value.Replace(\"\\0\", string.Empty); // remove embedded nulls\n\n            m_Text = value;\n\n            /*\n            if (m_LineType == LineType.SingleLine)\n                value = value.Replace(\"\\n\", \"\").Replace(\"\\t\", \"\");\n\n            // If we have an input validator, validate the input and apply the character limit at the same time.\n            if (onValidateInput != null || characterValidation != CharacterValidation.None)\n            {\n                m_Text = \"\";\n                OnValidateInput validatorMethod = onValidateInput ?? Validate;\n                m_CaretPosition = m_CaretSelectPosition = value.Length;\n                int charactersToCheck = characterLimit > 0 ? Math.Min(characterLimit, value.Length) : value.Length;\n                for (int i = 0; i < charactersToCheck; ++i)\n                {\n                    char c = validatorMethod(m_Text, m_Text.Length, value[i]);\n                    if (c != 0)\n                        m_Text += c;\n                }\n            }\n            else\n            {\n                m_Text = characterLimit > 0 && value.Length > characterLimit ? value.Substring(0, characterLimit) : value;\n            }\n            */\n\n            #if UNITY_EDITOR\n            if (!Application.isPlaying)\n            {\n                SendOnValueChangedAndUpdateLabel();\n                return;\n            }\n            #endif\n\n            if (m_SoftKeyboard != null)\n                m_SoftKeyboard.text = m_Text;\n\n            if (m_StringPosition > m_Text.Length)\n                m_StringPosition = m_StringSelectPosition = m_Text.Length;\n            else if (m_StringSelectPosition > m_Text.Length)\n                m_StringSelectPosition = m_Text.Length;\n\n            // Set RectTransform relative position to top of viewport.\n            AdjustTextPositionRelativeToViewport(0);\n\n            m_forceRectTransformAdjustment = true;\n\n            m_IsTextComponentUpdateRequired = true;\n            UpdateLabel();\n\n            if (sendCallback)\n                SendOnValueChanged();\n        }\n\n\n        public bool isFocused\n        {\n            get { return m_AllowInput; }\n        }\n\n        public float caretBlinkRate\n        {\n            get { return m_CaretBlinkRate; }\n            set\n            {\n                if (SetPropertyUtility.SetStruct(ref m_CaretBlinkRate, value))\n                {\n                    if (m_AllowInput)\n                        SetCaretActive();\n                }\n            }\n        }\n\n        public int caretWidth { get { return m_CaretWidth; } set { if (SetPropertyUtility.SetStruct(ref m_CaretWidth, value)) MarkGeometryAsDirty(); } }\n\n        public RectTransform textViewport { get { return m_TextViewport; } set { SetPropertyUtility.SetClass(ref m_TextViewport, value); } }\n\n        public TMP_Text textComponent\n        {\n            get { return m_TextComponent; }\n            set\n            {\n                if (SetPropertyUtility.SetClass(ref m_TextComponent, value))\n                {\n                    SetTextComponentWrapMode();\n                }\n            }\n        }\n\n        //public TMP_Text placeholderTextComponent { get { return m_PlaceholderTextComponent; } set { SetPropertyUtility.SetClass(ref m_PlaceholderTextComponent, value); } }\n\n        public Graphic placeholder { get { return m_Placeholder; } set { SetPropertyUtility.SetClass(ref m_Placeholder, value); } }\n\n        public Scrollbar verticalScrollbar\n        {\n            get { return m_VerticalScrollbar; }\n            set\n            {\n                if (m_VerticalScrollbar != null)\n                    m_VerticalScrollbar.onValueChanged.RemoveListener(OnScrollbarValueChange);\n\n                SetPropertyUtility.SetClass(ref m_VerticalScrollbar, value);\n\n                if (m_VerticalScrollbar)\n                {\n                    m_VerticalScrollbar.onValueChanged.AddListener(OnScrollbarValueChange);\n                    \n                }\n            }\n        }\n\n        public float scrollSensitivity { get { return m_ScrollSensitivity; } set { if (SetPropertyUtility.SetStruct(ref m_ScrollSensitivity, value)) MarkGeometryAsDirty(); } }\n\n        public Color caretColor { get { return customCaretColor ? m_CaretColor : textComponent.color; } set { if (SetPropertyUtility.SetColor(ref m_CaretColor, value)) MarkGeometryAsDirty(); } }\n\n        public bool customCaretColor { get { return m_CustomCaretColor; } set { if (m_CustomCaretColor != value) { m_CustomCaretColor = value; MarkGeometryAsDirty(); } } }\n\n        public Color selectionColor { get { return m_SelectionColor; } set { if (SetPropertyUtility.SetColor(ref m_SelectionColor, value)) MarkGeometryAsDirty(); } }\n\n        public SubmitEvent onEndEdit { get { return m_OnEndEdit; } set { SetPropertyUtility.SetClass(ref m_OnEndEdit, value); } }\n\n        public SubmitEvent onSubmit { get { return m_OnSubmit; } set { SetPropertyUtility.SetClass(ref m_OnSubmit, value); } }\n\n        public SelectionEvent onSelect { get { return m_OnSelect; } set { SetPropertyUtility.SetClass(ref m_OnSelect, value); } }\n\n        public SelectionEvent onDeselect { get { return m_OnDeselect; } set { SetPropertyUtility.SetClass(ref m_OnDeselect, value); } }\n\n        public TextSelectionEvent onTextSelection { get { return m_OnTextSelection; } set { SetPropertyUtility.SetClass(ref m_OnTextSelection, value); } }\n\n        public TextSelectionEvent onEndTextSelection { get { return m_OnEndTextSelection; } set { SetPropertyUtility.SetClass(ref m_OnEndTextSelection, value); } }\n\n        public OnChangeEvent onValueChanged { get { return m_OnValueChanged; } set { SetPropertyUtility.SetClass(ref m_OnValueChanged, value); } }\n\n        public TouchScreenKeyboardEvent onTouchScreenKeyboardStatusChanged { get { return m_OnTouchScreenKeyboardStatusChanged; } set { SetPropertyUtility.SetClass(ref m_OnTouchScreenKeyboardStatusChanged, value); } }\n\n        public OnValidateInput onValidateInput { get { return m_OnValidateInput; } set { SetPropertyUtility.SetClass(ref m_OnValidateInput, value); } }\n\n        public int characterLimit\n        {\n            get { return m_CharacterLimit; }\n            set\n            {\n                if (SetPropertyUtility.SetStruct(ref m_CharacterLimit, Math.Max(0, value)))\n                {\n                    UpdateLabel();\n                    if (m_SoftKeyboard != null)\n                        m_SoftKeyboard.characterLimit = value;\n                }\n            }\n        }\n\n        //public bool isInteractableControl { set { if ( } }\n\n        /// <summary>\n        /// Set the point size on both Placeholder and Input text object.\n        /// </summary>\n        public float pointSize\n        {\n            get { return m_GlobalPointSize; }\n            set {\n                    if (SetPropertyUtility.SetStruct(ref m_GlobalPointSize, Math.Max(0, value)))\n                    {\n                        SetGlobalPointSize(m_GlobalPointSize);\n                        UpdateLabel();\n                    }\n                }\n        }\n\n        /// <summary>\n        /// Sets the Font Asset on both Placeholder and Input child objects.\n        /// </summary>\n        public TMP_FontAsset fontAsset\n        {\n            get { return m_GlobalFontAsset; }\n            set\n            {\n                if (SetPropertyUtility.SetClass(ref m_GlobalFontAsset, value))\n                {\n                    SetGlobalFontAsset(m_GlobalFontAsset);\n                    UpdateLabel();\n                }\n            }\n        }\n        [SerializeField]\n        protected TMP_FontAsset m_GlobalFontAsset;\n\n        /// <summary>\n        /// Determines if the whole text will be selected when focused.\n        /// </summary>\n        public bool onFocusSelectAll\n        {\n            get { return m_OnFocusSelectAll; }\n            set { m_OnFocusSelectAll = value; }\n        }\n        [SerializeField]\n        protected bool m_OnFocusSelectAll = true;\n        protected bool m_isSelectAll;\n\n        /// <summary>\n        /// Determines if the text and caret position as well as selection will be reset when the input field is deactivated.\n        /// </summary>\n        public bool resetOnDeActivation\n        {\n            get { return m_ResetOnDeActivation; }\n            set { m_ResetOnDeActivation = value; }\n        }\n        [SerializeField]\n        protected bool m_ResetOnDeActivation = true;\n        private bool m_SelectionStillActive = false;\n        private bool m_ReleaseSelection = false;\n\n        private GameObject m_SelectedObject;\n\n        /// <summary>\n        /// Controls whether the original text is restored when pressing \"ESC\".\n        /// </summary>\n        public bool restoreOriginalTextOnEscape\n        {\n            get { return m_RestoreOriginalTextOnEscape; }\n            set { m_RestoreOriginalTextOnEscape = value; }\n        }\n        [SerializeField]\n        private bool m_RestoreOriginalTextOnEscape = true;\n\n        /// <summary>\n        /// Is Rich Text editing allowed?\n        /// </summary>\n        public bool isRichTextEditingAllowed\n        {\n            get { return m_isRichTextEditingAllowed; }\n            set { m_isRichTextEditingAllowed = value; }\n        }\n        [SerializeField]\n        protected bool m_isRichTextEditingAllowed = false;\n\n\n        // Content Type related\n        public ContentType contentType { get { return m_ContentType; } set { if (SetPropertyUtility.SetStruct(ref m_ContentType, value)) EnforceContentType(); } }\n\n        public LineType lineType\n        {\n            get { return m_LineType; }\n            set\n            {\n                if (SetPropertyUtility.SetStruct(ref m_LineType, value))\n                {\n                    SetToCustomIfContentTypeIsNot(ContentType.Standard, ContentType.Autocorrected);\n                    SetTextComponentWrapMode();\n                }\n            }\n        }\n\n        /// <summary>\n        /// Limits the number of lines of text in the Input Field.\n        /// </summary>\n        public int lineLimit\n        {\n            get { return m_LineLimit; }\n            set\n            {\n                if (m_LineType == LineType.SingleLine)\n                    m_LineLimit = 1;\n                else\n                    SetPropertyUtility.SetStruct(ref m_LineLimit, value);\n\n            }\n        }\n        [SerializeField]\n        protected int m_LineLimit = 0;\n\n        public InputType inputType { get { return m_InputType; } set { if (SetPropertyUtility.SetStruct(ref m_InputType, value)) SetToCustom(); } }\n\n        public TouchScreenKeyboardType keyboardType\n        {\n            get { return m_KeyboardType; }\n            set\n            {\n                if (SetPropertyUtility.SetStruct(ref m_KeyboardType, value))\n                    SetToCustom();\n            }\n        }\n\n        public CharacterValidation characterValidation { get { return m_CharacterValidation; } set { if (SetPropertyUtility.SetStruct(ref m_CharacterValidation, value)) SetToCustom(); } }\n\n        /// <summary>\n        /// Sets the Input Validation to use a Custom Input Validation script.\n        /// </summary>\n        public TMP_InputValidator inputValidator\n        {\n            get { return m_InputValidator; }\n            set {  if (SetPropertyUtility.SetClass(ref m_InputValidator, value)) SetToCustom(CharacterValidation.CustomValidator); }\n        }\n        [SerializeField]\n        protected TMP_InputValidator m_InputValidator = null; \n\n        public bool readOnly { get { return m_ReadOnly; } set { m_ReadOnly = value; } }\n\n        public bool richText { get { return m_RichText; } set { m_RichText = value; SetTextComponentRichTextMode(); } }\n\n        // Derived property\n        public bool multiLine { get { return m_LineType == LineType.MultiLineNewline || lineType == LineType.MultiLineSubmit; } }\n        // Not shown in Inspector.\n        public char asteriskChar { get { return m_AsteriskChar; } set { if (SetPropertyUtility.SetStruct(ref m_AsteriskChar, value)) UpdateLabel(); } }\n        public bool wasCanceled { get { return m_WasCanceled; } }\n\n\n        protected void ClampStringPos(ref int pos)\n        {\n            if (pos < 0)\n                pos = 0;\n            else if (pos > text.Length)\n                pos = text.Length;\n        }\n\n        protected void ClampCaretPos(ref int pos)\n        {\n            if (pos < 0)\n                pos = 0;\n            else if (pos > m_TextComponent.textInfo.characterCount - 1)\n                pos = m_TextComponent.textInfo.characterCount - 1;\n        }\n\n        /// <summary>\n        /// Current position of the cursor.\n        /// Getters are public Setters are protected\n        /// </summary>\n\n        protected int caretPositionInternal { get { return m_CaretPosition + compositionString.Length; } set { m_CaretPosition = value; ClampCaretPos(ref m_CaretPosition); } }\n        protected int stringPositionInternal { get { return m_StringPosition + compositionString.Length; } set { m_StringPosition = value; ClampStringPos(ref m_StringPosition); } }\n\n        protected int caretSelectPositionInternal { get { return m_CaretSelectPosition + compositionString.Length; } set { m_CaretSelectPosition = value; ClampCaretPos(ref m_CaretSelectPosition); } }\n        protected int stringSelectPositionInternal { get { return m_StringSelectPosition + compositionString.Length; } set { m_StringSelectPosition = value; ClampStringPos(ref m_StringSelectPosition); } }\n\n        private bool hasSelection { get { return stringPositionInternal != stringSelectPositionInternal; } }\n        private bool m_isSelected;\n        private bool m_IsStringPositionDirty;\n        private bool m_IsCaretPositionDirty;\n        private bool m_forceRectTransformAdjustment;\n\n        /// <summary>\n        /// Get: Returns the focus position as thats the position that moves around even during selection.\n        /// Set: Set both the anchor and focus position such that a selection doesn't happen\n        /// </summary>\n        public int caretPosition\n        {\n            get { return caretSelectPositionInternal; }\n            set { selectionAnchorPosition = value; selectionFocusPosition = value; m_IsStringPositionDirty = true; }\n        }\n\n        /// <summary>\n        /// Get: Returns the fixed position of selection\n        /// Set: If compositionString is 0 set the fixed position\n        /// </summary>\n        public int selectionAnchorPosition\n        {\n            get\n            {\n                return caretPositionInternal;\n            }\n\n            set\n            {\n                if (compositionString.Length != 0)\n                    return;\n\n                caretPositionInternal = value;\n                m_IsStringPositionDirty = true;\n            }\n        }\n\n        /// <summary>\n        /// Get: Returns the variable position of selection\n        /// Set: If compositionString is 0 set the variable position\n        /// </summary>\n        public int selectionFocusPosition\n        {\n            get\n            {\n                return caretSelectPositionInternal;\n            }\n            set\n            {\n                if (compositionString.Length != 0)\n                    return;\n\n                caretSelectPositionInternal = value;\n                m_IsStringPositionDirty = true;\n            }\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        public int stringPosition\n        {\n            get { return stringSelectPositionInternal; }\n            set { selectionStringAnchorPosition = value; selectionStringFocusPosition = value; m_IsCaretPositionDirty = true; }\n        }\n\n\n        /// <summary>\n        /// The fixed position of the selection in the raw string which may contains rich text.\n        /// </summary>\n        public int selectionStringAnchorPosition\n        {\n            get\n            {\n                return stringPositionInternal;\n            }\n\n            set\n            {\n                if (compositionString.Length != 0)\n                    return;\n\n                stringPositionInternal = value;\n                m_IsCaretPositionDirty = true;\n            }\n        }\n\n\n        /// <summary>\n        /// The variable position of the selection in the raw string which may contains rich text.\n        /// </summary>\n        public int selectionStringFocusPosition\n        {\n            get\n            {\n                return stringSelectPositionInternal;\n            }\n            set\n            {\n                if (compositionString.Length != 0)\n                    return;\n\n                stringSelectPositionInternal = value;\n                m_IsCaretPositionDirty = true;\n            }\n        }\n\n\n        #if UNITY_EDITOR\n        // Remember: This is NOT related to text validation!\n        // This is Unity's own OnValidate method which is invoked when changing values in the Inspector.\n        protected override void OnValidate()\n        {\n            base.OnValidate();\n            EnforceContentType();\n\n            m_CharacterLimit = Math.Max(0, m_CharacterLimit);\n\n            //This can be invoked before OnEnabled is called. So we shouldn't be accessing other objects, before OnEnable is called.\n            if (!IsActive())\n                return;\n\n            SetTextComponentRichTextMode();\n\n            UpdateLabel();\n            if (m_AllowInput)\n                SetCaretActive();\n        }\n        #endif\n\n        protected override void OnEnable()\n        {\n            //Debug.Log(\"*** OnEnable() *** - \" + this.name);\n\n            base.OnEnable();\n\n            if (m_Text == null)\n                m_Text = string.Empty;\n\n            if (Application.isPlaying)\n            {\n                if (m_CachedInputRenderer == null && m_TextComponent != null)\n                {\n                    // Check if Input Field is driven by any layout components\n                    m_IsDrivenByLayoutComponents = GetComponent<ILayoutController>() != null ? true : false;\n\n                    GameObject go = new GameObject(transform.name + \" Input Caret\", typeof(RectTransform));\n\n                    // Add MaskableGraphic Component\n                    TMP_SelectionCaret caret = go.AddComponent<TMP_SelectionCaret>();\n                    caret.raycastTarget = false;\n                    caret.color = Color.clear;\n\n                    go.hideFlags = HideFlags.DontSave;\n                    go.transform.SetParent(m_TextComponent.transform.parent);\n                    go.transform.SetAsFirstSibling();\n                    go.layer = gameObject.layer;\n\n                    caretRectTrans = go.GetComponent<RectTransform>();\n                    m_CachedInputRenderer = go.GetComponent<CanvasRenderer>();\n                    m_CachedInputRenderer.SetMaterial(Graphic.defaultGraphicMaterial, Texture2D.whiteTexture);\n\n                    // Needed as if any layout is present we want the caret to always be the same as the text area.\n                    go.AddComponent<LayoutElement>().ignoreLayout = true;\n\n                    AssignPositioningIfNeeded();\n                }\n            }\n\n            // If we have a cached renderer then we had OnDisable called so just restore the material.\n            if (m_CachedInputRenderer != null)\n                m_CachedInputRenderer.SetMaterial(Graphic.defaultGraphicMaterial, Texture2D.whiteTexture);\n\n            if (m_TextComponent != null)\n            {\n                m_TextComponent.RegisterDirtyVerticesCallback(MarkGeometryAsDirty);\n                m_TextComponent.RegisterDirtyVerticesCallback(UpdateLabel);\n                //m_TextComponent.ignoreRectMaskCulling = multiLine;\n\n                //m_DefaultTransformPosition = m_TextComponent.rectTransform.localPosition;\n\n                // Cache reference to Vertical Scrollbar RectTransform and add listener.\n                if (m_VerticalScrollbar != null)\n                {\n                    m_TextComponent.ignoreRectMaskCulling = true;\n                    m_VerticalScrollbar.onValueChanged.AddListener(OnScrollbarValueChange);\n                }\n\n                UpdateLabel();\n            }\n\n            // Subscribe to event fired when text object has been regenerated.\n            TMPro_EventManager.TEXT_CHANGED_EVENT.Add(ON_TEXT_CHANGED);\n        }\n\n        protected override void OnDisable()\n        {\n            // the coroutine will be terminated, so this will ensure it restarts when we are next activated\n            m_BlinkCoroutine = null;\n\n            DeactivateInputField();\n            if (m_TextComponent != null)\n            {\n                m_TextComponent.UnregisterDirtyVerticesCallback(MarkGeometryAsDirty);\n                m_TextComponent.UnregisterDirtyVerticesCallback(UpdateLabel);\n\n                if (m_VerticalScrollbar != null)\n                    m_VerticalScrollbar.onValueChanged.RemoveListener(OnScrollbarValueChange);\n\n            }\n            CanvasUpdateRegistry.UnRegisterCanvasElementForRebuild(this);\n\n            // Clear needs to be called otherwise sync never happens as the object is disabled.\n            if (m_CachedInputRenderer != null)\n                m_CachedInputRenderer.Clear();\n\n            if (m_Mesh != null)\n                DestroyImmediate(m_Mesh);\n            m_Mesh = null;\n\n            // Unsubscribe to event triggered when text object has been regenerated\n            TMPro_EventManager.TEXT_CHANGED_EVENT.Remove(ON_TEXT_CHANGED);\n\n            base.OnDisable();\n        }\n\n\n        /// <summary>\n        /// Method used to update the tracking of the caret position when the text object has been regenerated.\n        /// </summary>\n        /// <param name=\"obj\"></param>\n        private void ON_TEXT_CHANGED(UnityEngine.Object obj)\n        {\n            if (obj == m_TextComponent && Application.isPlaying && compositionString.Length == 0)\n            {\n                caretPositionInternal = GetCaretPositionFromStringIndex(stringPositionInternal);\n                caretSelectPositionInternal = GetCaretPositionFromStringIndex(stringSelectPositionInternal);\n\n                #if TMP_DEBUG_MODE\n                    Debug.Log(\"Caret Position: \" + caretPositionInternal + \" Selection Position: \" + caretSelectPositionInternal + \"  String Position: \" + stringPositionInternal + \" String Select Position: \" + stringSelectPositionInternal);\n                #endif\n            }\n        }\n\n\n        IEnumerator CaretBlink()\n        {\n            // Always ensure caret is initially visible since it can otherwise be confusing for a moment.\n            m_CaretVisible = true;\n            yield return null;\n\n            while ((isFocused || m_SelectionStillActive) && m_CaretBlinkRate > 0)\n            {\n                // the blink rate is expressed as a frequency\n                float blinkPeriod = 1f / m_CaretBlinkRate;\n\n                // the caret should be ON if we are in the first half of the blink period\n                bool blinkState = (Time.unscaledTime - m_BlinkStartTime) % blinkPeriod < blinkPeriod / 2;\n                if (m_CaretVisible != blinkState)\n                {\n                    m_CaretVisible = blinkState;\n                    if (!hasSelection)\n                        MarkGeometryAsDirty();\n                }\n\n                // Then wait again.\n                yield return null;\n            }\n            m_BlinkCoroutine = null;\n        }\n\n        void SetCaretVisible()\n        {\n            if (!m_AllowInput)\n                return;\n\n            m_CaretVisible = true;\n            m_BlinkStartTime = Time.unscaledTime;\n            SetCaretActive();\n        }\n\n        // SetCaretActive will not set the caret immediately visible - it will wait for the next time to blink.\n        // However, it will handle things correctly if the blink speed changed from zero to non-zero or non-zero to zero.\n        void SetCaretActive()\n        {\n            if (!m_AllowInput)\n                return;\n\n            if (m_CaretBlinkRate > 0.0f)\n            {\n                if (m_BlinkCoroutine == null)\n                    m_BlinkCoroutine = StartCoroutine(CaretBlink());\n            }\n            else\n            {\n                m_CaretVisible = true;\n            }\n        }\n\n        protected void OnFocus()\n        {\n            if (m_OnFocusSelectAll)\n                SelectAll();\n        }\n\n        protected void SelectAll()\n        {\n            m_isSelectAll = true;\n            stringPositionInternal = text.Length;\n            stringSelectPositionInternal = 0;\n        }\n\n        /// <summary>\n        /// Move to the end of the text.\n        /// </summary>\n        /// <param name=\"shift\"></param>\n        public void MoveTextEnd(bool shift)\n        {\n            if (m_isRichTextEditingAllowed)\n            {\n                int position = text.Length;\n\n                if (shift)\n                {\n                    stringSelectPositionInternal = position;\n                }\n                else\n                {\n                    stringPositionInternal = position;\n                    stringSelectPositionInternal = stringPositionInternal;\n                }\n            }\n            else\n            {\n                int position = m_TextComponent.textInfo.characterCount - 1;\n\n                if (shift)\n                {\n                    caretSelectPositionInternal = position;\n                    stringSelectPositionInternal = GetStringIndexFromCaretPosition(position);\n                }\n                else\n                {\n                    caretPositionInternal = caretSelectPositionInternal = position;\n                    stringSelectPositionInternal = stringPositionInternal = GetStringIndexFromCaretPosition(position);\n                }\n            }\n\n            UpdateLabel();\n        }\n\n        /// <summary>\n        /// Move to the start of the text.\n        /// </summary>\n        /// <param name=\"shift\"></param>\n        public void MoveTextStart(bool shift)\n        {\n            if (m_isRichTextEditingAllowed)\n            {\n                int position = 0;\n\n                if (shift)\n                {\n                    stringSelectPositionInternal = position;\n                }\n                else\n                {\n                    stringPositionInternal = position;\n                    stringSelectPositionInternal = stringPositionInternal;\n                }\n            }\n            else\n            {\n                int position = 0;\n\n                if (shift)\n                {\n                    caretSelectPositionInternal = position;\n                    stringSelectPositionInternal = GetStringIndexFromCaretPosition(position);\n                }\n                else\n                {\n                    caretPositionInternal = caretSelectPositionInternal = position;\n                    stringSelectPositionInternal = stringPositionInternal = GetStringIndexFromCaretPosition(position);\n                }\n            }\n\n            UpdateLabel();\n        }\n\n\n        /// <summary>\n        /// Move to the end of the current line of text.\n        /// </summary>\n        /// <param name=\"shift\"></param>\n        public void MoveToEndOfLine(bool shift, bool ctrl)\n        {\n            // Get the line the caret is currently located on.\n            int currentLine = m_TextComponent.textInfo.characterInfo[caretPositionInternal].lineNumber;\n\n            // Get the last character of the given line.\n            int characterIndex = ctrl == true ? m_TextComponent.textInfo.characterCount - 1 : m_TextComponent.textInfo.lineInfo[currentLine].lastCharacterIndex;\n\n            int position = m_TextComponent.textInfo.characterInfo[characterIndex].index;\n\n            if (shift)\n            {\n                stringSelectPositionInternal = position;\n\n                caretSelectPositionInternal = characterIndex;\n            }\n            else\n            {\n                stringPositionInternal = position;\n                stringSelectPositionInternal = stringPositionInternal;\n\n                caretSelectPositionInternal = caretPositionInternal = characterIndex;\n            }\n\n            UpdateLabel();\n        }\n\n        /// <summary>\n        /// Move to the start of the current line of text.\n        /// </summary>\n        /// <param name=\"shift\"></param>\n        public void MoveToStartOfLine(bool shift, bool ctrl)\n        {\n            // Get the line the caret is currently located on.\n            int currentLine = m_TextComponent.textInfo.characterInfo[caretPositionInternal].lineNumber;\n\n            // Get the first character of the given line.\n            int characterIndex = ctrl == true ? 0 : m_TextComponent.textInfo.lineInfo[currentLine].firstCharacterIndex;\n\n            int position = 0;\n            if (characterIndex > 0)\n                position = m_TextComponent.textInfo.characterInfo[characterIndex - 1].index + m_TextComponent.textInfo.characterInfo[characterIndex - 1].stringLength;\n\n            if (shift)\n            {\n                stringSelectPositionInternal = position;\n\n                caretSelectPositionInternal = characterIndex;\n            }\n            else\n            {\n                stringPositionInternal = position;\n                stringSelectPositionInternal = stringPositionInternal;\n\n                caretSelectPositionInternal = caretPositionInternal = characterIndex;\n            }\n\n            UpdateLabel();\n        }\n\n\n        static string clipboard\n        {\n            get\n            {\n                return GUIUtility.systemCopyBuffer;\n            }\n            set\n            {\n                GUIUtility.systemCopyBuffer = value;\n            }\n        }\n\n        private bool InPlaceEditing()\n        {\n            if (m_TouchKeyboardAllowsInPlaceEditing || (TouchScreenKeyboard.isSupported && (Application.platform == RuntimePlatform.WSAPlayerX86 || Application.platform == RuntimePlatform.WSAPlayerX64 || Application.platform == RuntimePlatform.WSAPlayerARM)))\n                return true;\n\n            if (TouchScreenKeyboard.isSupported && shouldHideSoftKeyboard)\n                return true;\n\n            if (TouchScreenKeyboard.isSupported && shouldHideSoftKeyboard == false && shouldHideMobileInput == false)\n                return false;\n\n            return true;\n        }\n\n        void UpdateStringPositionFromKeyboard()\n        {\n            // TODO: Might want to add null check here.\n            var selectionRange = m_SoftKeyboard.selection;\n\n            if (selectionRange.start == 0 && selectionRange.length == 0)\n                return;\n\n            var selectionStart = selectionRange.start;\n            var selectionEnd = selectionRange.end;\n\n            var stringPositionChanged = false;\n\n            if (stringPositionInternal != selectionStart)\n            {\n                stringPositionChanged = true;\n                stringPositionInternal = selectionStart;\n\n                caretPositionInternal = GetCaretPositionFromStringIndex(stringPositionInternal);\n            }\n\n            if (stringSelectPositionInternal != selectionEnd)\n            {\n                stringSelectPositionInternal = selectionEnd;\n                stringPositionChanged = true;\n\n                caretSelectPositionInternal = GetCaretPositionFromStringIndex(stringSelectPositionInternal);\n            }\n\n            if (stringPositionChanged)\n            {\n                m_BlinkStartTime = Time.unscaledTime;\n\n                UpdateLabel();\n            }\n        }\n\n        /// <summary>\n        /// Update the text based on input.\n        /// </summary>\n        // TODO: Make LateUpdate a coroutine instead. Allows us to control the update to only be when the field is active.\n        protected virtual void LateUpdate()\n        {\n            // Only activate if we are not already activated.\n            if (m_ShouldActivateNextUpdate)\n            {\n                if (!isFocused)\n                {\n                    ActivateInputFieldInternal();\n                    m_ShouldActivateNextUpdate = false;\n                    return;\n                }\n\n                // Reset as we are already activated.\n                m_ShouldActivateNextUpdate = false;\n            }\n\n            // Update Scrollbar if needed\n            if (m_IsScrollbarUpdateRequired)\n            {\n                UpdateScrollbar();\n                m_IsScrollbarUpdateRequired = false;\n            }\n\n            // Handle double click to reset / deselect Input Field when ResetOnActivation is false.\n            if (!isFocused && m_SelectionStillActive)\n            {\n                GameObject selectedObject = EventSystem.current != null ? EventSystem.current.currentSelectedGameObject : null;\n\n                if (selectedObject != null && selectedObject != this.gameObject)\n                {\n                    if (selectedObject != m_SelectedObject)\n                    {\n                        m_SelectedObject = selectedObject;\n\n                        // Check if object has a TMP Input Field\n                        if (selectedObject.GetComponent<TMP_InputField>() != null)\n                        {\n                            // Release selection\n                            m_SelectionStillActive = false;\n                            MarkGeometryAsDirty();\n                            m_SelectedObject = null;\n                        }\n                    }\n\n                    return;\n                }\n\n                if (Input.GetKeyDown(KeyCode.Mouse0))\n                {\n                    // Check for Double Click\n                    bool isDoubleClick = false;\n                    float timeStamp = Time.unscaledTime;\n\n                    if (m_KeyDownStartTime + m_DoubleClickDelay > timeStamp)\n                        isDoubleClick = true;\n\n                    m_KeyDownStartTime = timeStamp;\n\n                    if (isDoubleClick)\n                    {\n                        //m_StringPosition = m_StringSelectPosition = 0;\n                        //m_CaretPosition = m_CaretSelectPosition = 0;\n                        //m_TextComponent.rectTransform.localPosition = m_DefaultTransformPosition;\n\n                        //if (caretRectTrans != null)\n                        //    caretRectTrans.localPosition = Vector3.zero;\n\n                        m_SelectionStillActive = false;\n\n                        MarkGeometryAsDirty();\n\n                        return;\n                    }\n                }\n            }\n\n            if (InPlaceEditing() && isKeyboardUsingEvents() || !isFocused)\n            {\n                return;\n            }\n\n            AssignPositioningIfNeeded();\n\n            if (m_SoftKeyboard == null || m_SoftKeyboard.status != TouchScreenKeyboard.Status.Visible)\n            {\n                if (m_SoftKeyboard != null)\n                {\n                    if (!m_ReadOnly)\n                        text = m_SoftKeyboard.text;\n\n                    if (m_SoftKeyboard.status == TouchScreenKeyboard.Status.LostFocus)\n                        SendTouchScreenKeyboardStatusChanged();\n\n                    if (m_SoftKeyboard.status == TouchScreenKeyboard.Status.Canceled)\n                    {\n                        m_ReleaseSelection = true;\n                        m_WasCanceled = true;\n                        SendTouchScreenKeyboardStatusChanged();\n                    }\n\n                    if (m_SoftKeyboard.status == TouchScreenKeyboard.Status.Done)\n                    {\n                        m_ReleaseSelection = true;\n                        OnSubmit(null);\n                        SendTouchScreenKeyboardStatusChanged();\n                    }\n                }\n\n                OnDeselect(null);\n                return;\n            }\n\n            string val = m_SoftKeyboard.text;\n\n            if (m_Text != val)\n            {\n                if (m_ReadOnly)\n                {\n                    m_SoftKeyboard.text = m_Text;\n                }\n                else\n                {\n                    m_Text = \"\";\n\n                    for (int i = 0; i < val.Length; ++i)\n                    {\n                        char c = val[i];\n\n                        if (c == '\\r' || (int)c == 3)\n                            c = '\\n';\n\n                        if (onValidateInput != null)\n                            c = onValidateInput(m_Text, m_Text.Length, c);\n                        else if (characterValidation != CharacterValidation.None)\n                            c = Validate(m_Text, m_Text.Length, c);\n\n                        if (lineType == LineType.MultiLineSubmit && c == '\\n')\n                        {\n                            m_SoftKeyboard.text = m_Text;\n\n                            OnSubmit(null);\n                            OnDeselect(null);\n                            return;\n                        }\n\n                        if (c != 0)\n                            m_Text += c;\n                    }\n\n                    if (characterLimit > 0 && m_Text.Length > characterLimit)\n                        m_Text = m_Text.Substring(0, characterLimit);\n\n                    UpdateStringPositionFromKeyboard();\n\n                    // Set keyboard text before updating label, as we might have changed it with validation\n                    // and update label will take the old value from keyboard if we don't change it here\n                    if (m_Text != val)\n                        m_SoftKeyboard.text = m_Text;\n\n                    SendOnValueChangedAndUpdateLabel();\n                }\n            }\n            else if (m_HideMobileInput && Application.platform == RuntimePlatform.Android)\n            {\n                UpdateStringPositionFromKeyboard();\n            }\n\n            //else if (m_HideMobileInput) // m_Keyboard.canSetSelection\n            //{\n            //    int length = stringPositionInternal < stringSelectPositionInternal ? stringSelectPositionInternal - stringPositionInternal : stringPositionInternal - stringSelectPositionInternal;\n            //    m_SoftKeyboard.selection = new RangeInt(stringPositionInternal < stringSelectPositionInternal ? stringPositionInternal : stringSelectPositionInternal, length);\n            //}\n            //else if (!m_HideMobileInput) // m_Keyboard.canGetSelection)\n            //{\n            //    UpdateStringPositionFromKeyboard();\n            //}\n\n            if (m_SoftKeyboard.status != TouchScreenKeyboard.Status.Visible)\n            {\n                if (m_SoftKeyboard.status == TouchScreenKeyboard.Status.Canceled)\n                    m_WasCanceled = true;\n\n                OnDeselect(null);\n            }\n        }\n\n\n        private bool MayDrag(PointerEventData eventData)\n        {\n            return IsActive() &&\n                   IsInteractable() &&\n                   eventData.button == PointerEventData.InputButton.Left &&\n                   m_TextComponent != null &&\n                   (m_SoftKeyboard == null || shouldHideSoftKeyboard || shouldHideMobileInput);\n        }\n\n        public virtual void OnBeginDrag(PointerEventData eventData)\n        {\n            if (!MayDrag(eventData))\n                return;\n\n            m_UpdateDrag = true;\n        }\n\n        public virtual void OnDrag(PointerEventData eventData)\n        {\n            if (!MayDrag(eventData))\n                return;\n\n            int insertionIndex = TMP_TextUtilities.GetCursorIndexFromPosition(m_TextComponent, eventData.position, eventData.pressEventCamera, out CaretPosition insertionSide);\n\n            if (m_isRichTextEditingAllowed)\n            {\n                if (insertionSide == CaretPosition.Left)\n                {\n                    stringSelectPositionInternal = m_TextComponent.textInfo.characterInfo[insertionIndex].index;\n                }\n                else if (insertionSide == CaretPosition.Right)\n                {\n                    stringSelectPositionInternal = m_TextComponent.textInfo.characterInfo[insertionIndex].index + m_TextComponent.textInfo.characterInfo[insertionIndex].stringLength;\n                }\n            }\n            else\n            {\n                if (insertionSide == CaretPosition.Left)\n                {\n                    stringSelectPositionInternal = insertionIndex == 0\n                        ? m_TextComponent.textInfo.characterInfo[0].index\n                        : m_TextComponent.textInfo.characterInfo[insertionIndex - 1].index + m_TextComponent.textInfo.characterInfo[insertionIndex - 1].stringLength;\n                }\n                else if (insertionSide == CaretPosition.Right)\n                {\n                    stringSelectPositionInternal = m_TextComponent.textInfo.characterInfo[insertionIndex].index + m_TextComponent.textInfo.characterInfo[insertionIndex].stringLength;\n                }\n            }\n\n            caretSelectPositionInternal = GetCaretPositionFromStringIndex(stringSelectPositionInternal);\n\n            MarkGeometryAsDirty();\n\n            m_DragPositionOutOfBounds = !RectTransformUtility.RectangleContainsScreenPoint(textViewport, eventData.position, eventData.pressEventCamera);\n            if (m_DragPositionOutOfBounds && m_DragCoroutine == null)\n                m_DragCoroutine = StartCoroutine(MouseDragOutsideRect(eventData));\n\n            eventData.Use();\n\n            #if TMP_DEBUG_MODE\n                Debug.Log(\"Caret Position: \" + caretPositionInternal + \" Selection Position: \" + caretSelectPositionInternal + \"  String Position: \" + stringPositionInternal + \" String Select Position: \" + stringSelectPositionInternal);\n            #endif\n        }\n\n        IEnumerator MouseDragOutsideRect(PointerEventData eventData)\n        {\n            while (m_UpdateDrag && m_DragPositionOutOfBounds)\n            {\n                RectTransformUtility.ScreenPointToLocalPointInRectangle(textViewport, eventData.position, eventData.pressEventCamera, out Vector2 localMousePos);\n\n                Rect rect = textViewport.rect;\n\n                if (multiLine)\n                {\n                    if (localMousePos.y > rect.yMax)\n                        MoveUp(true, true);\n                    else if (localMousePos.y < rect.yMin)\n                        MoveDown(true, true);\n                }\n                else\n                {\n                    if (localMousePos.x < rect.xMin)\n                        MoveLeft(true, false);\n                    else if (localMousePos.x > rect.xMax)\n                        MoveRight(true, false);\n                }\n\n                UpdateLabel();\n\n                float delay = multiLine ? kVScrollSpeed : kHScrollSpeed;\n\n                if (m_WaitForSecondsRealtime == null)\n                    m_WaitForSecondsRealtime = new WaitForSecondsRealtime(delay);\n                else\n                    m_WaitForSecondsRealtime.waitTime = delay;\n\n                yield return m_WaitForSecondsRealtime;\n            }\n            m_DragCoroutine = null;\n        }\n\n        public virtual void OnEndDrag(PointerEventData eventData)\n        {\n            if (!MayDrag(eventData))\n                return;\n\n            m_UpdateDrag = false;\n        }\n\n        public override void OnPointerDown(PointerEventData eventData)\n        {\n            if (!MayDrag(eventData))\n                return;\n\n            EventSystem.current.SetSelectedGameObject(gameObject, eventData);\n\n            bool hadFocusBefore = m_AllowInput;\n            base.OnPointerDown(eventData);\n\n            if (InPlaceEditing() == false)\n            {\n                if (m_SoftKeyboard == null || !m_SoftKeyboard.active)\n                {\n                    OnSelect(eventData);\n                    return;\n                }\n            }\n\n            bool shift = Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift);\n\n            // Check for Double Click\n            bool isDoubleClick = false;\n            float timeStamp = Time.unscaledTime;\n\n            if (m_PointerDownClickStartTime + m_DoubleClickDelay > timeStamp)\n                isDoubleClick = true;\n\n            m_PointerDownClickStartTime = timeStamp;\n\n            // Only set caret position if we didn't just get focus now.\n            // Otherwise it will overwrite the select all on focus.\n            if (hadFocusBefore || !m_OnFocusSelectAll)\n            {\n                int insertionIndex = TMP_TextUtilities.GetCursorIndexFromPosition(m_TextComponent, eventData.position, eventData.pressEventCamera, out CaretPosition insertionSide);\n\n                if (shift)\n                {\n                    if (m_isRichTextEditingAllowed)\n                    {\n                        if (insertionSide == CaretPosition.Left)\n                        {\n                            stringSelectPositionInternal = m_TextComponent.textInfo.characterInfo[insertionIndex].index;\n                        }\n                        else if (insertionSide == CaretPosition.Right)\n                        {\n                            stringSelectPositionInternal = m_TextComponent.textInfo.characterInfo[insertionIndex].index + m_TextComponent.textInfo.characterInfo[insertionIndex].stringLength;\n                        }\n                    }\n                    else\n                    {\n                        if (insertionSide == CaretPosition.Left)\n                        {\n                            stringSelectPositionInternal = insertionIndex == 0\n                                ? m_TextComponent.textInfo.characterInfo[0].index\n                                : m_TextComponent.textInfo.characterInfo[insertionIndex - 1].index + m_TextComponent.textInfo.characterInfo[insertionIndex - 1].stringLength;\n                        }\n                        else if (insertionSide == CaretPosition.Right)\n                        {\n                            stringSelectPositionInternal = m_TextComponent.textInfo.characterInfo[insertionIndex].index + m_TextComponent.textInfo.characterInfo[insertionIndex].stringLength;\n                        }\n                    }\n                }\n                else\n                {\n                    if (m_isRichTextEditingAllowed)\n                    {\n                        if (insertionSide == CaretPosition.Left)\n                        {\n                            stringPositionInternal = stringSelectPositionInternal = m_TextComponent.textInfo.characterInfo[insertionIndex].index;\n                        }\n                        else if (insertionSide == CaretPosition.Right)\n                        {\n                            stringPositionInternal = stringSelectPositionInternal = m_TextComponent.textInfo.characterInfo[insertionIndex].index + m_TextComponent.textInfo.characterInfo[insertionIndex].stringLength;\n                        }\n                    }\n                    else\n                    {\n                        if (insertionSide == CaretPosition.Left)\n                        {\n                            stringPositionInternal = stringSelectPositionInternal = insertionIndex == 0\n                                ? m_TextComponent.textInfo.characterInfo[0].index\n                                : m_TextComponent.textInfo.characterInfo[insertionIndex - 1].index + m_TextComponent.textInfo.characterInfo[insertionIndex - 1].stringLength;\n                        }\n                        else if (insertionSide == CaretPosition.Right)\n                        {\n                            stringPositionInternal = stringSelectPositionInternal = m_TextComponent.textInfo.characterInfo[insertionIndex].index + m_TextComponent.textInfo.characterInfo[insertionIndex].stringLength;\n                        }\n                    }\n                }\n\n\n                if (isDoubleClick)\n                {\n                    int wordIndex = TMP_TextUtilities.FindIntersectingWord(m_TextComponent, eventData.position, eventData.pressEventCamera);\n\n                    if (wordIndex != -1)\n                    {\n                        // TODO: Should behavior be different if rich text editing is enabled or not?\n\n                        // Select current word\n                        caretPositionInternal = m_TextComponent.textInfo.wordInfo[wordIndex].firstCharacterIndex;\n                        caretSelectPositionInternal = m_TextComponent.textInfo.wordInfo[wordIndex].lastCharacterIndex + 1;\n\n                        stringPositionInternal = m_TextComponent.textInfo.characterInfo[caretPositionInternal].index;\n                        stringSelectPositionInternal = m_TextComponent.textInfo.characterInfo[caretSelectPositionInternal - 1].index + m_TextComponent.textInfo.characterInfo[caretSelectPositionInternal - 1].stringLength;\n                    }\n                    else\n                    {\n                        // Select current character\n                        caretPositionInternal = insertionIndex; \n                        caretSelectPositionInternal = caretPositionInternal + 1;\n\n                        stringPositionInternal = m_TextComponent.textInfo.characterInfo[insertionIndex].index;\n                        stringSelectPositionInternal = stringPositionInternal + m_TextComponent.textInfo.characterInfo[insertionIndex].stringLength;\n                    }\n                }\n                else\n                {\n                    caretPositionInternal = caretSelectPositionInternal = GetCaretPositionFromStringIndex(stringPositionInternal);\n                }\n            }\n\n            UpdateLabel();\n            eventData.Use();\n\n            #if TMP_DEBUG_MODE\n                Debug.Log(\"Caret Position: \" + caretPositionInternal + \" Selection Position: \" + caretSelectPositionInternal + \"  String Position: \" + stringPositionInternal + \" String Select Position: \" + stringSelectPositionInternal);\n            #endif\n        }\n\n        protected enum EditState\n        {\n            Continue,\n            Finish\n        }\n\n        protected EditState KeyPressed(Event evt)\n        {\n            var currentEventModifiers = evt.modifiers;\n            bool ctrl = SystemInfo.operatingSystemFamily == OperatingSystemFamily.MacOSX ? (currentEventModifiers & EventModifiers.Command) != 0 : (currentEventModifiers & EventModifiers.Control) != 0;\n            bool shift = (currentEventModifiers & EventModifiers.Shift) != 0;\n            bool alt = (currentEventModifiers & EventModifiers.Alt) != 0;\n            bool ctrlOnly = ctrl && !alt && !shift;\n\n            switch (evt.keyCode)\n            {\n                case KeyCode.Backspace:\n                    {\n                        Backspace();\n                        return EditState.Continue;\n                    }\n\n                case KeyCode.Delete:\n                    {\n                        DeleteKey();\n                        return EditState.Continue;\n                    }\n\n                case KeyCode.Home:\n                    {\n                        MoveToStartOfLine(shift, ctrl);\n                        return EditState.Continue;\n                    }\n\n                case KeyCode.End:\n                    {\n                        MoveToEndOfLine(shift, ctrl);\n                        return EditState.Continue;\n                    }\n\n                // Select All\n                case KeyCode.A:\n                    {\n                        if (ctrlOnly)\n                        {\n                            SelectAll();\n                            return EditState.Continue;\n                        }\n                        break;\n                    }\n\n                // Copy\n                case KeyCode.C:\n                    {\n                        if (ctrlOnly)\n                        {\n                            if (inputType != InputType.Password)\n                                clipboard = GetSelectedString();\n                            else\n                                clipboard = \"\";\n                            return EditState.Continue;\n                        }\n                        break;\n                    }\n\n                // Paste\n                case KeyCode.V:\n                    {\n                        if (ctrlOnly)\n                        {\n                            Append(clipboard);\n                            return EditState.Continue;\n                        }\n                        break;\n                    }\n\n                // Cut\n                case KeyCode.X:\n                    {\n                        if (ctrlOnly)\n                        {\n                            if (inputType != InputType.Password)\n                                clipboard = GetSelectedString();\n                            else\n                                clipboard = \"\";\n                            Delete();\n                            UpdateTouchKeyboardFromEditChanges();\n                            SendOnValueChangedAndUpdateLabel();\n                            return EditState.Continue;\n                        }\n                        break;\n                    }\n\n                case KeyCode.LeftArrow:\n                    {\n                        MoveLeft(shift, ctrl);\n                        return EditState.Continue;\n                    }\n\n                case KeyCode.RightArrow:\n                    {\n                        MoveRight(shift, ctrl);\n                        return EditState.Continue;\n                    }\n\n                case KeyCode.UpArrow:\n                    {\n                        MoveUp(shift);\n                        return EditState.Continue;\n                    }\n\n                case KeyCode.DownArrow:\n                    {\n                        MoveDown(shift);\n                        return EditState.Continue;\n                    }\n\n                case KeyCode.PageUp:\n                    {\n                        MovePageUp(shift);\n                        return EditState.Continue;\n                    }\n\n                case KeyCode.PageDown:\n                    {\n                        MovePageDown(shift);\n                        return EditState.Continue;\n                    }\n\n                // Submit\n                case KeyCode.Return:\n                case KeyCode.KeypadEnter:\n                    {\n                        if (lineType != LineType.MultiLineNewline)\n                        {\n                            m_ReleaseSelection = true;\n                            return EditState.Finish;\n                        }\n                        break;\n                    }\n\n                case KeyCode.Escape:\n                    {\n                        m_ReleaseSelection = true;\n                        m_WasCanceled = true;\n                        return EditState.Finish;\n                    }\n            }\n\n            char c = evt.character;\n\n            // Don't allow return chars or tabulator key to be entered into single line fields.\n            if (!multiLine && (c == '\\t' || c == '\\r' || c == 10))\n                return EditState.Continue;\n\n            // Convert carriage return and end-of-text characters to newline.\n            if (c == '\\r' || (int)c == 3)\n                c = '\\n';\n\n            if (IsValidChar(c))\n            {\n                Append(c);\n            }\n\n            if (c == 0)\n            {\n                if (compositionString.Length > 0)\n                {\n                    UpdateLabel();\n                }\n            }\n            return EditState.Continue;\n        }\n\n        protected virtual bool IsValidChar(char c)\n        {\n            // Delete key on mac\n            if ((int)c == 127)\n                return false;\n            // Accept newline and tab\n            if (c == '\\t' || c == '\\n')\n                return true;\n\n            return true;\n\n            // With the addition of Dynamic support, I think this will best be handled by the text component.\n            //return m_TextComponent.font.HasCharacter(c, true);\n        }\n\n        /// <summary>\n        /// Handle the specified event.\n        /// </summary>\n        private Event m_ProcessingEvent = new Event();\n\n        public void ProcessEvent(Event e)\n        {\n            KeyPressed(e);\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"eventData\"></param>\n        public virtual void OnUpdateSelected(BaseEventData eventData)\n        {\n            if (!isFocused)\n                return;\n\n            bool consumedEvent = false;\n            while (Event.PopEvent(m_ProcessingEvent))\n            {\n                if (m_ProcessingEvent.rawType == EventType.KeyDown)\n                {\n                    //Debug.Log(\"Event: \" + m_ProcessingEvent.ToString());\n\n                    consumedEvent = true;\n                    var shouldContinue = KeyPressed(m_ProcessingEvent);\n                    if (shouldContinue == EditState.Finish)\n                    {\n                        SendOnSubmit();\n                        DeactivateInputField();\n                        break;\n                    }\n                }\n\n                switch (m_ProcessingEvent.type)\n                {\n                    case EventType.ValidateCommand:\n                    case EventType.ExecuteCommand:\n                        switch (m_ProcessingEvent.commandName)\n                        {\n                            case \"SelectAll\":\n                                SelectAll();\n                                consumedEvent = true;\n                                break;\n                        }\n                        break;\n                }\n            }\n\n            if (consumedEvent)\n                UpdateLabel();\n\n            eventData.Use();\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"eventData\"></param>\n        public virtual void OnScroll(PointerEventData eventData)\n        {\n            if (m_TextComponent.preferredHeight < m_TextViewport.rect.height) return;\n\n            float scrollDirection = -eventData.scrollDelta.y;\n\n            m_ScrollPosition = m_ScrollPosition + (1f / m_TextComponent.textInfo.lineCount) * scrollDirection * m_ScrollSensitivity;\n\n            m_ScrollPosition = Mathf.Clamp01(m_ScrollPosition);\n\n            AdjustTextPositionRelativeToViewport(m_ScrollPosition);\n\n            // Disable focus until user re-selected the input field.\n            m_AllowInput = false;\n\n            if (m_VerticalScrollbar)\n            {\n                m_IsUpdatingScrollbarValues = true;\n                m_VerticalScrollbar.value = m_ScrollPosition;\n            }\n\n            //Debug.Log(\"Scroll Position:\" + m_ScrollPosition);\n        }\n\n\n        private string GetSelectedString()\n        {\n            if (!hasSelection)\n                return \"\";\n\n            int startPos = stringPositionInternal;\n            int endPos = stringSelectPositionInternal;\n\n            // Ensure pos is always less then selPos to make the code simpler\n            if (startPos > endPos)\n            {\n                int temp = startPos;\n                startPos = endPos;\n                endPos = temp;\n            }\n\n            //for (int i = m_CaretPosition; i < m_CaretSelectPosition; i++)\n            //{\n            //    Debug.Log(\"Character [\" + m_TextComponent.textInfo.characterInfo[i].character + \"] using Style [\" + m_TextComponent.textInfo.characterInfo[i].style + \"] has been selected.\");\n            //}\n\n\n            return text.Substring(startPos, endPos - startPos);\n        }\n\n        private int FindNextWordBegin()\n        {\n            if (stringSelectPositionInternal + 1 >= text.Length)\n                return text.Length;\n\n            int spaceLoc = text.IndexOfAny(kSeparators, stringSelectPositionInternal + 1);\n\n            if (spaceLoc == -1)\n                spaceLoc = text.Length;\n            else\n                spaceLoc++;\n\n            return spaceLoc;\n        }\n\n        private void MoveRight(bool shift, bool ctrl)\n        {\n            if (hasSelection && !shift)\n            {\n                // By convention, if we have a selection and move right without holding shift,\n                // we just place the cursor at the end.\n                stringPositionInternal = stringSelectPositionInternal = Mathf.Max(stringPositionInternal, stringSelectPositionInternal);\n                caretPositionInternal = caretSelectPositionInternal = GetCaretPositionFromStringIndex(stringSelectPositionInternal);\n\n                #if TMP_DEBUG_MODE\n                    Debug.Log(\"Caret Position: \" + caretPositionInternal + \" Selection Position: \" + caretSelectPositionInternal + \"  String Position: \" + stringPositionInternal + \" String Select Position: \" + stringSelectPositionInternal);\n                #endif\n                return;\n            }\n\n            int position;\n            if (ctrl)\n                position = FindNextWordBegin();\n            else\n            {\n                if (m_isRichTextEditingAllowed)\n                {\n                    // Special handling for Surrogate pairs and Diacritical marks.\n                    if (stringSelectPositionInternal < text.Length && char.IsHighSurrogate(text[stringSelectPositionInternal]))\n                        position = stringSelectPositionInternal + 2;\n                    else\n                        position = stringSelectPositionInternal + 1;\n                }\n                else\n                {\n                    position = m_TextComponent.textInfo.characterInfo[caretSelectPositionInternal].index + m_TextComponent.textInfo.characterInfo[caretSelectPositionInternal].stringLength;\n                }\n\n            }\n\n            if (shift)\n            {\n                stringSelectPositionInternal = position;\n                caretSelectPositionInternal = GetCaretPositionFromStringIndex(stringSelectPositionInternal);\n            }\n            else\n            {\n                stringSelectPositionInternal = stringPositionInternal = position;\n\n                // Only increase caret position as we cross character boundary.\n                if (stringPositionInternal >= m_TextComponent.textInfo.characterInfo[caretPositionInternal].index + m_TextComponent.textInfo.characterInfo[caretPositionInternal].stringLength)\n                    caretSelectPositionInternal = caretPositionInternal = GetCaretPositionFromStringIndex(stringSelectPositionInternal);\n            }\n\n            #if TMP_DEBUG_MODE\n                Debug.Log(\"Caret Position: \" + caretPositionInternal + \"  Selection Position: \" + caretSelectPositionInternal + \"  String Position: \" + stringPositionInternal + \"  String Select Position: \" + stringSelectPositionInternal);\n            #endif\n        }\n\n        private int FindPrevWordBegin()\n        {\n            if (stringSelectPositionInternal - 2 < 0)\n                return 0;\n\n            int spaceLoc = text.LastIndexOfAny(kSeparators, stringSelectPositionInternal - 2);\n\n            if (spaceLoc == -1)\n                spaceLoc = 0;\n            else\n                spaceLoc++;\n\n            return spaceLoc;\n        }\n\n        private void MoveLeft(bool shift, bool ctrl)\n        {\n            if (hasSelection && !shift)\n            {\n                // By convention, if we have a selection and move left without holding shift,\n                // we just place the cursor at the start.\n                stringPositionInternal = stringSelectPositionInternal = Mathf.Min(stringPositionInternal, stringSelectPositionInternal);\n                caretPositionInternal = caretSelectPositionInternal = GetCaretPositionFromStringIndex(stringSelectPositionInternal);\n\n                #if TMP_DEBUG_MODE\n                    Debug.Log(\"Caret Position: \" + caretPositionInternal + \" Selection Position: \" + caretSelectPositionInternal + \"  String Position: \" + stringPositionInternal + \" String Select Position: \" + stringSelectPositionInternal);\n                #endif\n                return;\n            }\n\n            int position;\n            if (ctrl)\n                position = FindPrevWordBegin();\n            else\n            {\n                if (m_isRichTextEditingAllowed)\n                {\n                    // Special handling for Surrogate pairs and Diacritical marks.\n                    if (stringSelectPositionInternal > 0 && char.IsLowSurrogate(text[stringSelectPositionInternal - 1]))\n                        position = stringSelectPositionInternal - 2;\n                    else\n                        position =  stringSelectPositionInternal - 1;\n                }\n                else\n                {\n                    //position = GetStringIndexFromCaretPosition(caretSelectPositionInternal - 1);\n                    position = caretSelectPositionInternal < 2\n                        ? m_TextComponent.textInfo.characterInfo[0].index\n                        : m_TextComponent.textInfo.characterInfo[caretSelectPositionInternal - 2].index + m_TextComponent.textInfo.characterInfo[caretSelectPositionInternal - 2].stringLength;\n                }\n            }\n\n            if (shift)\n            {\n                stringSelectPositionInternal = position;\n                caretSelectPositionInternal = GetCaretPositionFromStringIndex(stringSelectPositionInternal);\n            }\n            else\n            {\n                stringSelectPositionInternal = stringPositionInternal = position;\n\n                // Only decrease caret position as we cross character boundary. \n                if (caretPositionInternal > 0 && stringPositionInternal <= m_TextComponent.textInfo.characterInfo[caretPositionInternal - 1].index)\n                    caretSelectPositionInternal = caretPositionInternal = GetCaretPositionFromStringIndex(stringSelectPositionInternal);\n            }\n\n            #if TMP_DEBUG_MODE\n                Debug.Log(\"Caret Position: \" + caretPositionInternal + \"  Selection Position: \" + caretSelectPositionInternal + \"  String Position: \" + stringPositionInternal + \"  String Select Position: \" + stringSelectPositionInternal);\n            #endif\n        }\n\n\n        private int LineUpCharacterPosition(int originalPos, bool goToFirstChar)\n        {\n            if (originalPos >= m_TextComponent.textInfo.characterCount)\n                originalPos -= 1;\n\n            TMP_CharacterInfo originChar = m_TextComponent.textInfo.characterInfo[originalPos];\n            int originLine = originChar.lineNumber;\n\n            // We are on the first line return first character\n            if (originLine - 1 < 0)\n                return goToFirstChar ? 0 : originalPos;\n\n            int endCharIdx = m_TextComponent.textInfo.lineInfo[originLine].firstCharacterIndex - 1;\n\n            int closest = -1;\n            float distance = TMP_Math.FLOAT_MAX;\n            float range = 0;\n\n            for (int i = m_TextComponent.textInfo.lineInfo[originLine - 1].firstCharacterIndex; i < endCharIdx; ++i)\n            {\n                TMP_CharacterInfo currentChar = m_TextComponent.textInfo.characterInfo[i];\n\n                float d = originChar.origin - currentChar.origin;\n                float r = d / (currentChar.xAdvance - currentChar.origin);\n\n                if (r >= 0 && r <= 1)\n                {\n                    if (r < 0.5f)\n                        return i;\n                    else\n                        return i + 1;\n                }\n\n                d = Mathf.Abs(d);\n\n                if (d < distance)\n                {\n                    closest = i;\n                    distance = d;\n                    range = r;\n                }\n            }\n\n            if (closest == -1) return endCharIdx;\n\n            //Debug.Log(\"Returning nearest character with Range = \" + range);\n\n            if (range < 0.5f)\n                return closest;\n            else\n                return closest + 1;\n        }\n\n\n        private int LineDownCharacterPosition(int originalPos, bool goToLastChar)\n        {\n            if (originalPos >= m_TextComponent.textInfo.characterCount)\n                return m_TextComponent.textInfo.characterCount - 1; // text.Length;\n\n            TMP_CharacterInfo originChar = m_TextComponent.textInfo.characterInfo[originalPos];\n            int originLine = originChar.lineNumber;\n\n            //// We are on the last line return last character\n            if (originLine + 1 >= m_TextComponent.textInfo.lineCount)\n                return goToLastChar ? m_TextComponent.textInfo.characterCount - 1 : originalPos;\n\n            // Need to determine end line for next line.\n            int endCharIdx = m_TextComponent.textInfo.lineInfo[originLine + 1].lastCharacterIndex;\n\n            int closest = -1;\n            float distance = TMP_Math.FLOAT_MAX;\n            float range = 0;\n\n            for (int i = m_TextComponent.textInfo.lineInfo[originLine + 1].firstCharacterIndex; i < endCharIdx; ++i)\n            {\n                TMP_CharacterInfo currentChar = m_TextComponent.textInfo.characterInfo[i];\n\n                float d = originChar.origin - currentChar.origin;\n                float r = d / (currentChar.xAdvance - currentChar.origin);\n\n                if (r >= 0 && r <= 1)\n                {\n                    if (r < 0.5f)\n                        return i;\n                    else\n                        return i + 1;\n                }\n\n                d = Mathf.Abs(d);\n\n                if (d < distance)\n                {\n                    closest = i;\n                    distance = d;\n                    range = r;\n                }\n            }\n\n            if (closest == -1) return endCharIdx;\n\n            //Debug.Log(\"Returning nearest character with Range = \" + range);\n\n            if (range < 0.5f)\n                return closest;\n            else\n                return closest + 1;\n        }\n\n\n         private int PageUpCharacterPosition(int originalPos, bool goToFirstChar)\n        {\n            if (originalPos >= m_TextComponent.textInfo.characterCount)\n                originalPos -= 1;\n\n            TMP_CharacterInfo originChar = m_TextComponent.textInfo.characterInfo[originalPos];\n            int originLine = originChar.lineNumber;\n\n            // We are on the first line return first character\n            if (originLine - 1 < 0)\n                return goToFirstChar ? 0 : originalPos;\n\n            float viewportHeight = m_TextViewport.rect.height;\n\n            int newLine = originLine - 1;\n            // Iterate through each subsequent line to find the first baseline that is not visible in the viewport.\n            for (; newLine > 0; newLine--)\n            {\n                if (m_TextComponent.textInfo.lineInfo[newLine].baseline > m_TextComponent.textInfo.lineInfo[originLine].baseline + viewportHeight)\n                    break;\n            }\n\n            int endCharIdx = m_TextComponent.textInfo.lineInfo[newLine].lastCharacterIndex;\n\n            int closest = -1;\n            float distance = TMP_Math.FLOAT_MAX;\n            float range = 0;\n\n            for (int i = m_TextComponent.textInfo.lineInfo[newLine].firstCharacterIndex; i < endCharIdx; ++i)\n            {\n                TMP_CharacterInfo currentChar = m_TextComponent.textInfo.characterInfo[i];\n\n                float d = originChar.origin - currentChar.origin;\n                float r = d / (currentChar.xAdvance - currentChar.origin);\n\n                if (r >= 0 && r <= 1)\n                {\n                    if (r < 0.5f)\n                        return i;\n                    else\n                        return i + 1;\n                }\n\n                d = Mathf.Abs(d);\n\n                if (d < distance)\n                {\n                    closest = i;\n                    distance = d;\n                    range = r;\n                }\n            }\n\n            if (closest == -1) return endCharIdx;\n\n            //Debug.Log(\"Returning nearest character with Range = \" + range);\n\n            if (range < 0.5f)\n                return closest;\n            else\n                return closest + 1;\n        }\n\n\n         private int PageDownCharacterPosition(int originalPos, bool goToLastChar)\n        {\n            if (originalPos >= m_TextComponent.textInfo.characterCount)\n                return m_TextComponent.textInfo.characterCount - 1;\n\n            TMP_CharacterInfo originChar = m_TextComponent.textInfo.characterInfo[originalPos];\n            int originLine = originChar.lineNumber;\n\n            // We are on the last line return last character\n            if (originLine + 1 >= m_TextComponent.textInfo.lineCount)\n                return goToLastChar ? m_TextComponent.textInfo.characterCount - 1 : originalPos;\n\n            float viewportHeight = m_TextViewport.rect.height;\n\n            int newLine = originLine + 1;\n            // Iterate through each subsequent line to find the first baseline that is not visible in the viewport.\n            for (; newLine < m_TextComponent.textInfo.lineCount - 1; newLine++)\n            {\n                if (m_TextComponent.textInfo.lineInfo[newLine].baseline < m_TextComponent.textInfo.lineInfo[originLine].baseline - viewportHeight)\n                    break;\n            }\n\n            // Need to determine end line for next line.\n            int endCharIdx = m_TextComponent.textInfo.lineInfo[newLine].lastCharacterIndex;\n\n            int closest = -1;\n            float distance = TMP_Math.FLOAT_MAX;\n            float range = 0;\n\n            for (int i = m_TextComponent.textInfo.lineInfo[newLine].firstCharacterIndex; i < endCharIdx; ++i)\n            {\n                TMP_CharacterInfo currentChar = m_TextComponent.textInfo.characterInfo[i];\n\n                float d = originChar.origin - currentChar.origin;\n                float r = d / (currentChar.xAdvance - currentChar.origin);\n\n                if (r >= 0 && r <= 1)\n                {\n                    if (r < 0.5f)\n                        return i;\n                    else\n                        return i + 1;\n                }\n\n                d = Mathf.Abs(d);\n\n                if (d < distance)\n                {\n                    closest = i;\n                    distance = d;\n                    range = r;\n                }\n            }\n\n            if (closest == -1) return endCharIdx;\n\n            if (range < 0.5f)\n                return closest;\n            else\n                return closest + 1;\n        }\n\n\n        private void MoveDown(bool shift)\n        {\n            MoveDown(shift, true);\n        }\n\n\n        private void MoveDown(bool shift, bool goToLastChar)\n        {\n            if (hasSelection && !shift)\n            {\n                // If we have a selection and press down without shift,\n                // set caret to end of selection before we move it down.\n                caretPositionInternal = caretSelectPositionInternal = Mathf.Max(caretPositionInternal, caretSelectPositionInternal);\n            }\n\n            int position = multiLine ? LineDownCharacterPosition(caretSelectPositionInternal, goToLastChar) : m_TextComponent.textInfo.characterCount - 1; // text.Length;\n\n            if (shift)\n            {\n                caretSelectPositionInternal = position;\n                stringSelectPositionInternal = GetStringIndexFromCaretPosition(caretSelectPositionInternal);\n            }\n            else\n            {\n                caretSelectPositionInternal = caretPositionInternal = position;\n                stringSelectPositionInternal = stringPositionInternal = GetStringIndexFromCaretPosition(caretSelectPositionInternal);\n            }\n\n            #if TMP_DEBUG_MODE\n                Debug.Log(\"Caret Position: \" + caretPositionInternal + \" Selection Position: \" + caretSelectPositionInternal + \"  String Position: \" + stringPositionInternal + \" String Select Position: \" + stringSelectPositionInternal);\n            #endif\n        }\n\n        private void MoveUp(bool shift)\n        {\n            MoveUp(shift, true);\n        }\n\n\n        private void MoveUp(bool shift, bool goToFirstChar)\n        {\n            if (hasSelection && !shift)\n            {\n                // If we have a selection and press up without shift,\n                // set caret position to start of selection before we move it up.\n                caretPositionInternal = caretSelectPositionInternal = Mathf.Min(caretPositionInternal, caretSelectPositionInternal);\n            }\n\n            int position = multiLine ? LineUpCharacterPosition(caretSelectPositionInternal, goToFirstChar) : 0;\n\n            if (shift)\n            {\n                caretSelectPositionInternal = position;\n                stringSelectPositionInternal = GetStringIndexFromCaretPosition(caretSelectPositionInternal);\n            }\n            else\n            {\n                caretSelectPositionInternal = caretPositionInternal = position;\n                stringSelectPositionInternal = stringPositionInternal = GetStringIndexFromCaretPosition(caretSelectPositionInternal);\n            }\n\n            #if TMP_DEBUG_MODE\n                Debug.Log(\"Caret Position: \" + caretPositionInternal + \" Selection Position: \" + caretSelectPositionInternal + \"  String Position: \" + stringPositionInternal + \" String Select Position: \" + stringSelectPositionInternal);\n            #endif\n        }\n\n\n        private void MovePageUp(bool shift)\n        {\n            MovePageUp(shift, true);\n        }\n\n        private void MovePageUp(bool shift, bool goToFirstChar)\n        {\n            if (hasSelection && !shift)\n            {\n                // If we have a selection and press up without shift,\n                // set caret position to start of selection before we move it up.\n                caretPositionInternal = caretSelectPositionInternal = Mathf.Min(caretPositionInternal, caretSelectPositionInternal);\n            }\n\n            int position = multiLine ? PageUpCharacterPosition(caretSelectPositionInternal, goToFirstChar) : 0;\n\n            if (shift)\n            {\n                caretSelectPositionInternal = position;\n                stringSelectPositionInternal = GetStringIndexFromCaretPosition(caretSelectPositionInternal);\n            }\n            else\n            {\n                caretSelectPositionInternal = caretPositionInternal = position;\n                stringSelectPositionInternal = stringPositionInternal = GetStringIndexFromCaretPosition(caretSelectPositionInternal);\n            }\n\n\n            // Scroll to top of viewport\n            //int currentLine = m_TextComponent.textInfo.characterInfo[position].lineNumber;\n            //float lineAscender = m_TextComponent.textInfo.lineInfo[currentLine].ascender;\n\n            // Adjust text area up or down if not in single line mode.\n            if (m_LineType != LineType.SingleLine)\n            {\n                float offset = m_TextViewport.rect.height; // m_TextViewport.rect.yMax - (m_TextComponent.rectTransform.anchoredPosition.y + lineAscender);\n\n                float topTextBounds = m_TextComponent.rectTransform.position.y + m_TextComponent.textBounds.max.y;\n                float topViewportBounds = m_TextViewport.position.y + m_TextViewport.rect.yMax;\n\n                offset = topViewportBounds > topTextBounds + offset ? offset : topViewportBounds - topTextBounds;\n\n                m_TextComponent.rectTransform.anchoredPosition += new Vector2(0, offset);\n                AssignPositioningIfNeeded();\n                m_IsScrollbarUpdateRequired = true;\n            }\n\n            #if TMP_DEBUG_MODE\n                Debug.Log(\"Caret Position: \" + caretPositionInternal + \" Selection Position: \" + caretSelectPositionInternal + \"  String Position: \" + stringPositionInternal + \" String Select Position: \" + stringSelectPositionInternal);\n            #endif\n\n        }\n\n\n        private void MovePageDown(bool shift)\n        {\n            MovePageDown(shift, true);\n        }\n\n        private void MovePageDown(bool shift, bool goToLastChar)\n        {\n             if (hasSelection && !shift)\n            {\n                // If we have a selection and press down without shift,\n                // set caret to end of selection before we move it down.\n                caretPositionInternal = caretSelectPositionInternal = Mathf.Max(caretPositionInternal, caretSelectPositionInternal);\n            }\n\n            int position = multiLine ? PageDownCharacterPosition(caretSelectPositionInternal, goToLastChar) : m_TextComponent.textInfo.characterCount - 1;\n\n            if (shift)\n            {\n                caretSelectPositionInternal = position;\n                stringSelectPositionInternal = GetStringIndexFromCaretPosition(caretSelectPositionInternal);\n            }\n            else\n            {\n                caretSelectPositionInternal = caretPositionInternal = position;\n                stringSelectPositionInternal = stringPositionInternal = GetStringIndexFromCaretPosition(caretSelectPositionInternal);\n            }\n\n            // Scroll to top of viewport\n            //int currentLine = m_TextComponent.textInfo.characterInfo[position].lineNumber;\n            //float lineAscender = m_TextComponent.textInfo.lineInfo[currentLine].ascender;\n\n            // Adjust text area up or down if not in single line mode.\n            if (m_LineType != LineType.SingleLine)\n            {\n                float offset = m_TextViewport.rect.height; // m_TextViewport.rect.yMax - (m_TextComponent.rectTransform.anchoredPosition.y + lineAscender);\n\n                float bottomTextBounds = m_TextComponent.rectTransform.position.y + m_TextComponent.textBounds.min.y;\n                float bottomViewportBounds = m_TextViewport.position.y + m_TextViewport.rect.yMin;\n\n                offset = bottomViewportBounds > bottomTextBounds + offset ? offset : bottomViewportBounds - bottomTextBounds;\n\n                m_TextComponent.rectTransform.anchoredPosition += new Vector2(0, offset);\n                AssignPositioningIfNeeded();\n                m_IsScrollbarUpdateRequired = true;\n            }\n\n            #if TMP_DEBUG_MODE\n                Debug.Log(\"Caret Position: \" + caretPositionInternal + \" Selection Position: \" + caretSelectPositionInternal + \"  String Position: \" + stringPositionInternal + \" String Select Position: \" + stringSelectPositionInternal);\n            #endif\n\n        }\n\n        private void Delete()\n        {\n            if (m_ReadOnly)\n                return;\n\n            if (stringPositionInternal == stringSelectPositionInternal)\n                return;\n\n            if (m_isRichTextEditingAllowed || m_isSelectAll)\n            {\n                // Handling of Delete when Rich Text is allowed.\n                if (stringPositionInternal < stringSelectPositionInternal)\n                {\n                    m_Text = text.Remove(stringPositionInternal, stringSelectPositionInternal - stringPositionInternal);\n                    stringSelectPositionInternal = stringPositionInternal;\n                }\n                else\n                {\n                    m_Text = text.Remove(stringSelectPositionInternal, stringPositionInternal - stringSelectPositionInternal);\n                    stringPositionInternal = stringSelectPositionInternal;\n                }\n\n                m_isSelectAll = false;\n            }\n            else\n            {\n                if (caretPositionInternal < caretSelectPositionInternal)\n                {\n                    stringPositionInternal = m_TextComponent.textInfo.characterInfo[caretPositionInternal].index;\n                    stringSelectPositionInternal = m_TextComponent.textInfo.characterInfo[caretSelectPositionInternal - 1].index + m_TextComponent.textInfo.characterInfo[caretSelectPositionInternal - 1].stringLength;\n\n                    m_Text = text.Remove(stringPositionInternal, stringSelectPositionInternal - stringPositionInternal);\n\n                    stringSelectPositionInternal = stringPositionInternal;\n                    caretSelectPositionInternal = caretPositionInternal;\n                }\n                else\n                {\n                    stringPositionInternal = m_TextComponent.textInfo.characterInfo[caretPositionInternal - 1].index + m_TextComponent.textInfo.characterInfo[caretPositionInternal - 1].stringLength;\n                    stringSelectPositionInternal = m_TextComponent.textInfo.characterInfo[caretSelectPositionInternal].index;\n\n                    m_Text = text.Remove(stringSelectPositionInternal, stringPositionInternal - stringSelectPositionInternal);\n\n                    stringPositionInternal = stringSelectPositionInternal;\n                    caretPositionInternal = caretSelectPositionInternal;\n                }\n            }\n\n            #if TMP_DEBUG_MODE\n                Debug.Log(\"Caret Position: \" + caretPositionInternal + \" Selection Position: \" + caretSelectPositionInternal + \"  String Position: \" + stringPositionInternal + \" String Select Position: \" + stringSelectPositionInternal);\n            #endif\n        }\n\n        /// <summary>\n        /// Handling of DEL key\n        /// </summary>\n        private void DeleteKey()\n        {\n            if (m_ReadOnly)\n                return;\n\n            if (hasSelection)\n            {\n                Delete();\n                UpdateTouchKeyboardFromEditChanges();\n                SendOnValueChangedAndUpdateLabel();\n            }\n            else\n            {\n                if (m_isRichTextEditingAllowed)\n                {\n                    if (stringPositionInternal < text.Length)\n                    {\n                        // Special handling for Surrogate Pairs\n                        if (char.IsHighSurrogate(text[stringPositionInternal]))\n                            m_Text = text.Remove(stringPositionInternal, 2);\n                        else\n                            m_Text = text.Remove(stringPositionInternal, 1);\n\n                        UpdateTouchKeyboardFromEditChanges();\n                        SendOnValueChangedAndUpdateLabel();\n                    }\n                }\n                else\n                {\n                    if (caretPositionInternal < m_TextComponent.textInfo.characterCount - 1)\n                    {\n                        int numberOfCharactersToRemove = m_TextComponent.textInfo.characterInfo[caretPositionInternal].stringLength;\n\n                        // Adjust string position to skip any potential rich text tags.\n                        int nextCharacterStringPosition = m_TextComponent.textInfo.characterInfo[caretPositionInternal].index;\n\n                        m_Text = text.Remove(nextCharacterStringPosition, numberOfCharactersToRemove);\n\n                        SendOnValueChangedAndUpdateLabel();\n                    }\n                }\n            }\n\n            #if TMP_DEBUG_MODE\n                Debug.Log(\"Caret Position: \" + caretPositionInternal + \" Selection Position: \" + caretSelectPositionInternal + \"  String Position: \" + stringPositionInternal + \" String Select Position: \" + stringSelectPositionInternal);\n            #endif\n        }\n\n        /// <summary>\n        /// Handling of Backspace key\n        /// </summary>\n        private void Backspace()\n        {\n            if (m_ReadOnly)\n                return;\n\n            if (hasSelection)\n            {\n                Delete();\n                UpdateTouchKeyboardFromEditChanges();\n                SendOnValueChangedAndUpdateLabel();\n            }\n            else\n            {\n                if (m_isRichTextEditingAllowed)\n                {\n                    if (stringPositionInternal > 0)\n                    {\n                        int numberOfCharactersToRemove = 1;\n\n                        // Special handling for Surrogate pairs and Diacritical marks\n                        if (char.IsLowSurrogate(text[stringPositionInternal - 1]))\n                            numberOfCharactersToRemove = 2;\n\n                        stringSelectPositionInternal = stringPositionInternal = stringPositionInternal - numberOfCharactersToRemove;\n\n                        m_Text = text.Remove(stringPositionInternal, numberOfCharactersToRemove);\n\n                        caretSelectPositionInternal = caretPositionInternal = caretPositionInternal - 1;\n\n                        m_isLastKeyBackspace = true;\n\n                        UpdateTouchKeyboardFromEditChanges();\n                        SendOnValueChangedAndUpdateLabel();\n                    }\n                }\n                else\n                {\n                    if (caretPositionInternal > 0)\n                    {\n                        int numberOfCharactersToRemove = m_TextComponent.textInfo.characterInfo[caretPositionInternal - 1].stringLength;\n\n                        // Delete the previous character\n                        m_Text = text.Remove(m_TextComponent.textInfo.characterInfo[caretPositionInternal - 1].index, numberOfCharactersToRemove);\n\n                        // Get new adjusted string position\n                        stringSelectPositionInternal = stringPositionInternal = caretPositionInternal < 2\n                            ? m_TextComponent.textInfo.characterInfo[0].index\n                            : m_TextComponent.textInfo.characterInfo[caretPositionInternal - 2].index + m_TextComponent.textInfo.characterInfo[caretPositionInternal - 2].stringLength;\n\n                        caretSelectPositionInternal = caretPositionInternal = caretPositionInternal - 1;\n                    }\n\n                    m_isLastKeyBackspace = true;\n\n                    UpdateTouchKeyboardFromEditChanges();\n                    SendOnValueChangedAndUpdateLabel();\n                }\n\n            }\n\n            #if TMP_DEBUG_MODE\n                Debug.Log(\"Caret Position: \" + caretPositionInternal + \" Selection Position: \" + caretSelectPositionInternal + \"  String Position: \" + stringPositionInternal + \" String Select Position: \" + stringSelectPositionInternal);\n            #endif\n        }\n\n\n        /// <summary>\n        /// Append the specified text to the end of the current.\n        /// </summary>\n        protected virtual void Append(string input)\n        {\n            if (m_ReadOnly)\n                return;\n\n            if (InPlaceEditing() == false)\n                return;\n\n            for (int i = 0, imax = input.Length; i < imax; ++i)\n            {\n                char c = input[i];\n\n                if (c >= ' ' || c == '\\t' || c == '\\r' || c == 10 || c == '\\n')\n                {\n                    Append(c);\n                }\n            }\n        }\n\n        protected virtual void Append(char input)\n        {\n            if (m_ReadOnly)\n                return;\n\n            if (InPlaceEditing() == false)\n                return;\n\n            // If we have an input validator, validate the input first\n            if (onValidateInput != null)\n                input = onValidateInput(text, stringPositionInternal, input);\n            else if (characterValidation == CharacterValidation.CustomValidator)\n            {\n                input = Validate(text, stringPositionInternal, input);\n\n                if (input == 0) return;\n\n                SendOnValueChanged();\n                UpdateLabel();\n\n                return;\n            }\n            else if (characterValidation != CharacterValidation.None)\n                input = Validate(text, stringPositionInternal, input);\n\n            // If the input is invalid, skip it\n            if (input == 0)\n                return;\n\n            // Append the character and update the label\n            Insert(input);\n        }\n\n\n        // Insert the character and update the label.\n        private void Insert(char c)\n        {\n            if (m_ReadOnly)\n                return;\n\n            string replaceString = c.ToString();\n            Delete();\n\n            // Can't go past the character limit\n            if (characterLimit > 0 && text.Length >= characterLimit)\n                return;\n\n            m_Text = text.Insert(m_StringPosition, replaceString);\n\n            if (!char.IsHighSurrogate(c))\n                caretSelectPositionInternal = caretPositionInternal += 1;\n\n            stringSelectPositionInternal = stringPositionInternal += 1;\n\n            UpdateTouchKeyboardFromEditChanges();\n            SendOnValueChanged();\n\n            #if TMP_DEBUG_MODE\n                Debug.Log(\"Caret Position: \" + caretPositionInternal + \" Selection Position: \" + caretSelectPositionInternal + \"  String Position: \" + stringPositionInternal + \" String Select Position: \" + stringSelectPositionInternal);\n            #endif\n        }\n\n        private void UpdateTouchKeyboardFromEditChanges()\n        {\n            // Update the TouchKeyboard's text from edit changes\n            // if in-place editing is allowed\n            if (m_SoftKeyboard != null && InPlaceEditing())\n            {\n                m_SoftKeyboard.text = m_Text;\n            }\n        }\n\n        private void SendOnValueChangedAndUpdateLabel()\n        {\n            UpdateLabel();\n            SendOnValueChanged();\n        }\n\n        private void SendOnValueChanged()\n        {\n            if (onValueChanged != null)\n                onValueChanged.Invoke(text);\n        }\n\n        /// <summary>\n        /// Submit the input field's text.\n        /// </summary>\n\n        protected void SendOnEndEdit()\n        {\n            if (onEndEdit != null)\n                onEndEdit.Invoke(m_Text);\n        }\n\n        protected void SendOnSubmit()\n        {\n            if (onSubmit != null)\n                onSubmit.Invoke(m_Text);\n        }\n\n        protected void SendOnFocus()\n        {\n            if (onSelect != null)\n                onSelect.Invoke(m_Text);\n        }\n\n        protected void SendOnFocusLost()\n        {\n            if (onDeselect != null)\n                onDeselect.Invoke(m_Text);\n        }\n\n        protected void SendOnTextSelection()\n        {\n            m_isSelected = true;\n\n            if (onTextSelection != null)\n                onTextSelection.Invoke(m_Text, stringPositionInternal, stringSelectPositionInternal);\n        }\n\n        protected void SendOnEndTextSelection()\n        {\n            if (!m_isSelected) return;\n\n            if (onEndTextSelection != null)\n                onEndTextSelection.Invoke(m_Text, stringPositionInternal, stringSelectPositionInternal);\n\n            m_isSelected = false;\n        }\n\n        protected void SendTouchScreenKeyboardStatusChanged()\n        {\n            if (onTouchScreenKeyboardStatusChanged != null)\n                onTouchScreenKeyboardStatusChanged.Invoke(m_SoftKeyboard.status);\n        }\n\n\n        /// <summary>\n        /// Update the visual text Text.\n        /// </summary>\n\n        protected void UpdateLabel()\n        {\n            if (m_TextComponent != null && m_TextComponent.font != null && m_PreventCallback == false)\n            {\n                // Prevent callback from the text component as we assign new text. This is to prevent a recursive call.\n                m_PreventCallback = true;\n\n                string fullText;\n                if (compositionString.Length > 0)\n                {\n                    fullText = text.Substring(0, m_StringPosition) + compositionString + text.Substring(m_StringPosition);\n                    \n                    // Should adjust caret position\n                    //Debug.Log(\"Handling IME Input... [\" + compositionString + \"] of length [\" + compositionString.Length + \"] at StringPosition [\" + m_StringPosition + \"]\");\n                    //for (int i = 0; i < compositionString.Length; i++)\n                    //    Debug.Log((uint)compositionString[i]);\n                }\n                else\n                {\n                    fullText = text;\n                    //Debug.Log(\"Handling Input... [\" + text + \"]\");\n                }\n\n                string processed;\n                if (inputType == InputType.Password)\n                    processed = new string(asteriskChar, fullText.Length);\n                else\n                    processed = fullText;\n\n                bool isEmpty = string.IsNullOrEmpty(fullText);\n\n                if (m_Placeholder != null)\n                    m_Placeholder.enabled = isEmpty;\n\n                if (!isEmpty)\n                {\n                    SetCaretVisible();\n                }\n\n                m_TextComponent.text = processed + \"\\u200B\"; // Extra space is added for Caret tracking.\n\n                // Special handling to limit the number of lines of text in the Input Field.\n                if (m_LineLimit > 0)\n                {\n                    m_TextComponent.ForceMeshUpdate();\n\n                    // Check if text exceeds maximum number of lines.\n                    if (m_TextComponent.textInfo.lineCount > m_LineLimit)\n                    {\n                        int lastValidCharacterIndex = m_TextComponent.textInfo.lineInfo[m_LineLimit - 1].lastCharacterIndex;\n                        int characterStringIndex = m_TextComponent.textInfo.characterInfo[lastValidCharacterIndex].index + m_TextComponent.textInfo.characterInfo[lastValidCharacterIndex].stringLength;\n                        text = processed.Remove(characterStringIndex, processed.Length - characterStringIndex);\n                        m_TextComponent.text = text + \"\\u200B\";\n                    }\n                }\n\n                if (m_IsTextComponentUpdateRequired)\n                {\n                    m_IsTextComponentUpdateRequired = false;\n                    m_TextComponent.ForceMeshUpdate();\n                }\n\n                MarkGeometryAsDirty();\n\n                // Scrollbar should be updated.\n                m_IsScrollbarUpdateRequired = true;\n\n                m_PreventCallback = false;\n            }\n        }\n\n        void UpdateScrollbar()\n        {\n            // Update Scrollbar\n            if (m_VerticalScrollbar)\n            {\n                float size = m_TextViewport.rect.height / m_TextComponent.preferredHeight;\n\n                m_IsUpdatingScrollbarValues = true;\n\n                m_VerticalScrollbar.size = size;\n\n                m_ScrollPosition = m_VerticalScrollbar.value = m_TextComponent.rectTransform.anchoredPosition.y / (m_TextComponent.preferredHeight - m_TextViewport.rect.height);\n\n                //m_VerticalScrollbar.numberOfSteps = (int)(m_TextComponent.textInfo.lineCount / 0.25f); // Replace by scroll sensitivity.\n\n                //Debug.Log(\"Updating Scrollbar... Value: \" + m_VerticalScrollbar.value);\n            }\n        }\n\n\n        /// <summary>\n        /// Function to update the vertical position of the text container when OnValueChanged event is received from the Scrollbar.\n        /// </summary>\n        /// <param name=\"value\"></param>\n        void OnScrollbarValueChange(float value)\n        {\n            if (m_IsUpdatingScrollbarValues) { m_IsUpdatingScrollbarValues = false; return; }\n\n            if (value < 0 || value > 1) return;\n\n            AdjustTextPositionRelativeToViewport(value);\n\n            m_ScrollPosition = value;\n\n            //Debug.Log(\"Scrollbar value is: \" + value + \"  Transform POS: \" + m_TextComponent.rectTransform.anchoredPosition);\n        }\n\n        /// <summary>\n        /// Adjusts the relative position of the body of the text relative to the viewport.\n        /// </summary>\n        /// <param name=\"relativePosition\"></param>\n        void AdjustTextPositionRelativeToViewport (float relativePosition)\n        {\n            //Debug.Log(\"- Adjusting vertical text position to \" + relativePosition);\n            if (m_TextViewport == null)\n                return;\n\n            TMP_TextInfo textInfo = m_TextComponent.textInfo;\n\n            // Check to make sure we have valid data and lines to query.\n            if (textInfo == null || textInfo.lineInfo == null || textInfo.lineCount == 0 || textInfo.lineCount > textInfo.lineInfo.Length) return;\n\n            //m_TextComponent.rectTransform.anchoredPosition = new Vector2(m_TextComponent.rectTransform.anchoredPosition.x, (textHeight - viewportHeight) * relativePosition);\n            m_TextComponent.rectTransform.anchoredPosition = new Vector2(m_TextComponent.rectTransform.anchoredPosition.x, (m_TextComponent.preferredHeight - m_TextViewport.rect.height) * relativePosition);\n\n            AssignPositioningIfNeeded();\n\n            //Debug.Log(\"Text height: \" + m_TextComponent.preferredHeight + \"  Viewport height: \" + m_TextViewport.rect.height + \"  Adjusted RectTransform anchordedPosition:\" + m_TextComponent.rectTransform.anchoredPosition + \"  Text Bounds: \" + m_TextComponent.bounds.ToString(\"f3\"));\n        }\n\n\n        private int GetCaretPositionFromStringIndex(int stringIndex)\n        {\n            int count = m_TextComponent.textInfo.characterCount;\n\n            for (int i = 0; i < count; i++)\n            {\n                if (m_TextComponent.textInfo.characterInfo[i].index >= stringIndex)\n                    return i;\n            }\n\n            return count;\n        }\n\n        /// <summary>\n        /// Returns / places the caret before the given character at the string index.\n        /// </summary>\n        /// <param name=\"stringIndex\"></param>\n        /// <returns></returns>\n        private int GetMinCaretPositionFromStringIndex(int stringIndex)\n        {\n            int count = m_TextComponent.textInfo.characterCount;\n\n            for (int i = 0; i < count; i++)\n            {\n                if (stringIndex < m_TextComponent.textInfo.characterInfo[i].index + m_TextComponent.textInfo.characterInfo[i].stringLength)\n                    return i;\n            }\n\n            return count;\n        }\n\n        /// <summary>\n        /// Returns / places the caret after the given character at the string index.\n        /// </summary>\n        /// <param name=\"stringIndex\"></param>\n        /// <returns></returns>\n        private int GetMaxCaretPositionFromStringIndex(int stringIndex)\n        {\n            int count = m_TextComponent.textInfo.characterCount;\n\n            for (int i = 0; i < count; i++)\n            {\n                if (m_TextComponent.textInfo.characterInfo[i].index >= stringIndex)\n                    return i;\n            }\n\n            return count;\n        }\n\n        private int GetStringIndexFromCaretPosition(int caretPosition)\n        {\n            // Clamp values between 0 and character count.\n            ClampCaretPos(ref caretPosition);\n\n            return m_TextComponent.textInfo.characterInfo[caretPosition].index;\n        }\n\n\n        public void ForceLabelUpdate()\n        {\n            UpdateLabel();\n        }\n\n        private void MarkGeometryAsDirty()\n        {\n            #if UNITY_EDITOR\n                #if UNITY_2018_3_OR_NEWER\n                if (!Application.isPlaying || UnityEditor.PrefabUtility.IsPartOfPrefabAsset(this))\n                    return;\n                #else\n                if (!Application.isPlaying || UnityEditor.PrefabUtility.GetPrefabObject(gameObject) != null)\n                    return;\n                #endif\n            #endif\n\n            CanvasUpdateRegistry.RegisterCanvasElementForGraphicRebuild(this);\n        }\n\n        public virtual void Rebuild(CanvasUpdate update)\n        {\n            switch (update)\n            {\n                case CanvasUpdate.LatePreRender:\n                    UpdateGeometry();\n                    break;\n            }\n        }\n\n        public virtual void LayoutComplete()\n        { }\n\n        public virtual void GraphicUpdateComplete()\n        { }\n\n        private void UpdateGeometry()\n        {\n            #if UNITY_EDITOR\n            if (!Application.isPlaying)\n                return;\n            #endif\n\n            // No need to draw a cursor on mobile as its handled by the devices keyboard.\n            if (InPlaceEditing() == false)\n                return;\n\n            if (m_CachedInputRenderer == null)\n                return;\n\n            OnFillVBO(mesh);\n\n            m_CachedInputRenderer.SetMesh(mesh);\n        }\n\n\n        /// <summary>\n        /// Method to keep the Caret RectTransform properties in sync with the text object's RectTransform\n        /// </summary>\n        private void AssignPositioningIfNeeded()\n        {\n            if (m_TextComponent != null && caretRectTrans != null &&\n                (caretRectTrans.localPosition != m_TextComponent.rectTransform.localPosition ||\n                 caretRectTrans.localRotation != m_TextComponent.rectTransform.localRotation ||\n                 caretRectTrans.localScale != m_TextComponent.rectTransform.localScale ||\n                 caretRectTrans.anchorMin != m_TextComponent.rectTransform.anchorMin ||\n                 caretRectTrans.anchorMax != m_TextComponent.rectTransform.anchorMax ||\n                 caretRectTrans.anchoredPosition != m_TextComponent.rectTransform.anchoredPosition ||\n                 caretRectTrans.sizeDelta != m_TextComponent.rectTransform.sizeDelta ||\n                 caretRectTrans.pivot != m_TextComponent.rectTransform.pivot))\n            {\n                caretRectTrans.localPosition = m_TextComponent.rectTransform.localPosition;\n                caretRectTrans.localRotation = m_TextComponent.rectTransform.localRotation;\n                caretRectTrans.localScale = m_TextComponent.rectTransform.localScale;\n                caretRectTrans.anchorMin = m_TextComponent.rectTransform.anchorMin;\n                caretRectTrans.anchorMax = m_TextComponent.rectTransform.anchorMax;\n                caretRectTrans.anchoredPosition = m_TextComponent.rectTransform.anchoredPosition;\n                caretRectTrans.sizeDelta = m_TextComponent.rectTransform.sizeDelta;\n                caretRectTrans.pivot = m_TextComponent.rectTransform.pivot;\n\n                // Get updated world corners of viewport.\n                //m_TextViewport.GetLocalCorners(m_ViewportCorners);\n            }\n        }\n\n\n        private void OnFillVBO(Mesh vbo)\n        {\n            using (var helper = new VertexHelper())\n            {\n                if (!isFocused && !m_SelectionStillActive)\n                {\n                    helper.FillMesh(vbo);\n                    return;\n                }\n\n                if (m_IsStringPositionDirty)\n                {\n                    stringPositionInternal = GetStringIndexFromCaretPosition(m_CaretPosition);\n                    stringSelectPositionInternal = GetStringIndexFromCaretPosition(m_CaretSelectPosition);\n                    m_IsStringPositionDirty = false;\n                }\n\n                if (m_IsCaretPositionDirty)\n                {\n                    caretPositionInternal = GetCaretPositionFromStringIndex(stringPositionInternal);\n                    caretSelectPositionInternal = GetCaretPositionFromStringIndex(stringSelectPositionInternal);\n                    m_IsCaretPositionDirty = false;\n                }\n\n                if (!hasSelection && !m_ReadOnly)\n                {\n                    GenerateCaret(helper, Vector2.zero);\n                    SendOnEndTextSelection();\n                }\n                else\n                {\n                    GenerateHightlight(helper, Vector2.zero);\n                    SendOnTextSelection();\n                }\n\n                helper.FillMesh(vbo);\n            }\n        }\n\n\n        private void GenerateCaret(VertexHelper vbo, Vector2 roundingOffset)\n        {\n            if (!m_CaretVisible)\n                return;\n\n            if (m_CursorVerts == null)\n            {\n                CreateCursorVerts();\n            }\n\n            float width = m_CaretWidth;\n\n            // TODO: Optimize to only update the caret position when needed.\n\n            Vector2 startPosition = Vector2.zero;\n            float height = 0;\n            TMP_CharacterInfo currentCharacter;\n\n            int currentLine = m_TextComponent.textInfo.characterInfo[caretPositionInternal].lineNumber;\n\n            // Caret is positioned at the origin for the first character of each lines and at the advance for subsequent characters.\n            if (caretPositionInternal == m_TextComponent.textInfo.lineInfo[currentLine].firstCharacterIndex)\n            {\n                currentCharacter = m_TextComponent.textInfo.characterInfo[caretPositionInternal];\n                startPosition = new Vector2(currentCharacter.origin, currentCharacter.descender);\n                height = currentCharacter.ascender - currentCharacter.descender;\n            }\n            else\n            {\n                currentCharacter = m_TextComponent.textInfo.characterInfo[caretPositionInternal - 1];\n                startPosition = new Vector2(currentCharacter.xAdvance, currentCharacter.descender);\n                height = currentCharacter.ascender - currentCharacter.descender;\n            }\n\n            if (m_SoftKeyboard != null)\n                m_SoftKeyboard.selection = new RangeInt(stringPositionInternal, 0);\n\n            // Adjust the position of the RectTransform based on the caret position in the viewport (only if we have focus).\n            if (isFocused && startPosition != m_LastPosition || m_forceRectTransformAdjustment)\n                AdjustRectTransformRelativeToViewport(startPosition, height, currentCharacter.isVisible);\n\n            m_LastPosition = startPosition;\n\n            // Clamp Caret height\n            float top = startPosition.y + height;\n            float bottom = top - height;\n\n            // Minor tweak to address caret potentially being too thin based on canvas scaler values.\n            float scale = m_TextComponent.canvas.scaleFactor;\n\n            m_CursorVerts[0].position = new Vector3(startPosition.x, bottom, 0.0f);\n            m_CursorVerts[1].position = new Vector3(startPosition.x, top, 0.0f);\n            m_CursorVerts[2].position = new Vector3(startPosition.x + (width + 1) / scale, top, 0.0f);\n            m_CursorVerts[3].position = new Vector3(startPosition.x + (width + 1) / scale, bottom, 0.0f);\n\n            // Set Vertex Color for the caret color.\n            m_CursorVerts[0].color = caretColor;\n            m_CursorVerts[1].color = caretColor;\n            m_CursorVerts[2].color = caretColor;\n            m_CursorVerts[3].color = caretColor;\n\n            vbo.AddUIVertexQuad(m_CursorVerts);\n\n            int screenHeight = Screen.height;\n            // Removed multiple display support until it supports none native resolutions(case 741751)\n            //int displayIndex = m_TextComponent.canvas.targetDisplay;\n            //if (Screen.fullScreen && displayIndex < Display.displays.Length)\n            //    screenHeight = Display.displays[displayIndex].renderingHeight;\n\n            startPosition.y = screenHeight - startPosition.y;\n            inputSystem.compositionCursorPos = startPosition;\n\n            //#if TMP_DEBUG_MODE\n            //Debug.Log(\"Caret position updated at frame: \" + Time.frameCount);\n            //#endif\n        }\n\n\n        private void CreateCursorVerts()\n        {\n            m_CursorVerts = new UIVertex[4];\n\n            for (int i = 0; i < m_CursorVerts.Length; i++)\n            {\n                m_CursorVerts[i] = UIVertex.simpleVert;\n                m_CursorVerts[i].uv0 = Vector2.zero;\n            }\n        }\n\n\n        private void GenerateHightlight(VertexHelper vbo, Vector2 roundingOffset)\n        {\n            TMP_TextInfo textInfo = m_TextComponent.textInfo;\n\n            caretPositionInternal = m_CaretPosition = GetCaretPositionFromStringIndex(stringPositionInternal);\n            caretSelectPositionInternal = m_CaretSelectPosition = GetCaretPositionFromStringIndex(stringSelectPositionInternal);\n\n            if (m_SoftKeyboard != null)\n            {\n                int stringPosition = caretPositionInternal < caretSelectPositionInternal ? textInfo.characterInfo[caretPositionInternal].index : textInfo.characterInfo[caretSelectPositionInternal].index;\n                int length = caretPositionInternal < caretSelectPositionInternal ? stringSelectPositionInternal - stringPosition : stringPositionInternal - stringPosition;\n                m_SoftKeyboard.selection = new RangeInt(stringPosition, length);\n            }\n\n            // Adjust text RectTranform position to make sure it is visible in viewport.\n            Vector2 caretPosition;\n            float height = 0;\n            if (caretSelectPositionInternal < textInfo.characterCount)\n            {\n                caretPosition = new Vector2(textInfo.characterInfo[caretSelectPositionInternal].origin, textInfo.characterInfo[caretSelectPositionInternal].descender);\n                height = textInfo.characterInfo[caretSelectPositionInternal].ascender - textInfo.characterInfo[caretSelectPositionInternal].descender;\n            }\n            else\n            {\n                caretPosition = new Vector2(textInfo.characterInfo[caretSelectPositionInternal - 1].xAdvance, textInfo.characterInfo[caretSelectPositionInternal - 1].descender);\n                height = textInfo.characterInfo[caretSelectPositionInternal - 1].ascender - textInfo.characterInfo[caretSelectPositionInternal - 1].descender;\n            }\n\n            // TODO: Don't adjust the position of the RectTransform if Reset On Deactivation is disabled\n            // and we just selected the Input Field again.\n            AdjustRectTransformRelativeToViewport(caretPosition, height, true);\n\n            int startChar = Mathf.Max(0, caretPositionInternal);\n            int endChar = Mathf.Max(0, caretSelectPositionInternal);\n\n            // Ensure pos is always less then selPos to make the code simpler\n            if (startChar > endChar)\n            {\n                int temp = startChar;\n                startChar = endChar;\n                endChar = temp;\n            }\n\n            endChar -= 1;\n\n            //Debug.Log(\"Updating Highlight... Caret Position: \" + startChar + \" Caret Select POS: \" + endChar);\n\n\n            int currentLineIndex = textInfo.characterInfo[startChar].lineNumber;\n            int nextLineStartIdx = textInfo.lineInfo[currentLineIndex].lastCharacterIndex;\n\n            UIVertex vert = UIVertex.simpleVert;\n            vert.uv0 = Vector2.zero;\n            vert.color = selectionColor;\n\n            int currentChar = startChar;\n            while (currentChar <= endChar && currentChar < textInfo.characterCount)\n            {\n                if (currentChar == nextLineStartIdx || currentChar == endChar)\n                {\n                    TMP_CharacterInfo startCharInfo = textInfo.characterInfo[startChar];\n                    TMP_CharacterInfo endCharInfo = textInfo.characterInfo[currentChar];\n\n                    // Extra check to handle Carriage Return\n                    if (currentChar > 0 && endCharInfo.character == 10 && textInfo.characterInfo[currentChar - 1].character == 13)\n                        endCharInfo = textInfo.characterInfo[currentChar - 1];\n\n                    Vector2 startPosition = new Vector2(startCharInfo.origin, textInfo.lineInfo[currentLineIndex].ascender);\n                    Vector2 endPosition = new Vector2(endCharInfo.xAdvance, textInfo.lineInfo[currentLineIndex].descender);\n\n                    var startIndex = vbo.currentVertCount;\n                    vert.position = new Vector3(startPosition.x, endPosition.y, 0.0f);\n                    vbo.AddVert(vert);\n\n                    vert.position = new Vector3(endPosition.x, endPosition.y, 0.0f);\n                    vbo.AddVert(vert);\n\n                    vert.position = new Vector3(endPosition.x, startPosition.y, 0.0f);\n                    vbo.AddVert(vert);\n\n                    vert.position = new Vector3(startPosition.x, startPosition.y, 0.0f);\n                    vbo.AddVert(vert);\n\n                    vbo.AddTriangle(startIndex, startIndex + 1, startIndex + 2);\n                    vbo.AddTriangle(startIndex + 2, startIndex + 3, startIndex + 0);\n\n                    startChar = currentChar + 1;\n                    currentLineIndex++;\n\n                    if (currentLineIndex < textInfo.lineCount)\n                        nextLineStartIdx = textInfo.lineInfo[currentLineIndex].lastCharacterIndex;\n                }\n                currentChar++;\n            }\n\n            // Scrollbar should be updated.\n            m_IsScrollbarUpdateRequired = true;\n\n            //#if TMP_DEBUG_MODE\n            //    Debug.Log(\"Text selection updated at frame: \" + Time.frameCount);\n            //#endif\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"startPosition\"></param>\n        /// <param name=\"height\"></param>\n        /// <param name=\"isCharVisible\"></param>\n        private void AdjustRectTransformRelativeToViewport(Vector2 startPosition, float height, bool isCharVisible)\n        {\n            //Debug.Log(\"Adjusting transform position relative to viewport.\");\n\n            if (m_TextViewport == null || m_IsDrivenByLayoutComponents)\n                return;\n\n            float viewportMin = m_TextViewport.rect.xMin;\n            float viewportMax = m_TextViewport.rect.xMax;\n\n            //Debug.Log(\"Viewport Rect: \" + viewportMax + \"  Start Position: \" + startPosition);\n            // Adjust the position of the RectTransform based on the caret position in the viewport.\n            float rightOffset = viewportMax - (m_TextComponent.rectTransform.anchoredPosition.x + startPosition.x + m_TextComponent.margin.z + m_CaretWidth);\n            if (rightOffset < 0f)\n            {\n                if (!multiLine || (multiLine && isCharVisible))\n                {\n                    //Debug.Log(\"Shifting text to the right by \" + rightOffset.ToString(\"f3\"));\n                    m_TextComponent.rectTransform.anchoredPosition += new Vector2(rightOffset, 0);\n\n                    AssignPositioningIfNeeded();\n                }\n            }\n\n            float leftOffset = (m_TextComponent.rectTransform.anchoredPosition.x + startPosition.x - m_TextComponent.margin.x) - viewportMin;\n            if (leftOffset < 0f)\n            {\n                //Debug.Log(\"Shifting text to the left by \" + leftOffset.ToString(\"f3\"));\n                m_TextComponent.rectTransform.anchoredPosition += new Vector2(-leftOffset, 0);\n                AssignPositioningIfNeeded();\n            }\n\n\n            // Adjust text area up or down if not in single line mode.\n            if (m_LineType != LineType.SingleLine)\n            {\n                float topOffset = m_TextViewport.rect.yMax - (m_TextComponent.rectTransform.anchoredPosition.y + startPosition.y + height);\n                if (topOffset < -0.0001f)\n                {\n                    m_TextComponent.rectTransform.anchoredPosition += new Vector2(0, topOffset);\n                    AssignPositioningIfNeeded();\n                    m_IsScrollbarUpdateRequired = true;\n                }\n\n                float bottomOffset = (m_TextComponent.rectTransform.anchoredPosition.y + startPosition.y) - m_TextViewport.rect.yMin;\n                if (bottomOffset < 0f)\n                {\n                    m_TextComponent.rectTransform.anchoredPosition -= new Vector2(0, bottomOffset);\n                    AssignPositioningIfNeeded();\n                    m_IsScrollbarUpdateRequired = true;\n                }\n            }\n\n            // Special handling of backspace\n            if (m_isLastKeyBackspace)\n            {\n                float firstCharPosition = m_TextComponent.rectTransform.anchoredPosition.x + m_TextComponent.textInfo.characterInfo[0].origin - m_TextComponent.margin.x;\n                float lastCharPosition = m_TextComponent.rectTransform.anchoredPosition.x + m_TextComponent.textInfo.characterInfo[m_TextComponent.textInfo.characterCount - 1].origin + m_TextComponent.margin.z;\n\n                // Check if caret is at the left most position of the viewport\n                if (m_TextComponent.rectTransform.anchoredPosition.x + startPosition.x <= viewportMin + 0.0001f)\n                {\n                    if (firstCharPosition < viewportMin)\n                    {\n                        float offset = Mathf.Min((viewportMax - viewportMin) / 2, viewportMin - firstCharPosition);\n                        m_TextComponent.rectTransform.anchoredPosition += new Vector2(offset, 0);\n                        AssignPositioningIfNeeded();\n                    }\n                }\n                else if (lastCharPosition < viewportMax && firstCharPosition < viewportMin)\n                {\n                    float offset = Mathf.Min(viewportMax - lastCharPosition, viewportMin - firstCharPosition);\n\n                    m_TextComponent.rectTransform.anchoredPosition += new Vector2(offset, 0);\n                    AssignPositioningIfNeeded();\n                }\n\n                m_isLastKeyBackspace = false;\n            }\n\n            m_forceRectTransformAdjustment = false;\n        }\n\n        /// <summary>\n        /// Validate the specified input.\n        /// </summary>\n        protected char Validate(string text, int pos, char ch)\n        {\n            // Validation is disabled\n            if (characterValidation == CharacterValidation.None || !enabled)\n                return ch;\n\n            if (characterValidation == CharacterValidation.Integer || characterValidation == CharacterValidation.Decimal)\n            {\n                // Integer and decimal\n                bool cursorBeforeDash = (pos == 0 && text.Length > 0 && text[0] == '-');\n                bool selectionAtStart = stringPositionInternal == 0 || stringSelectPositionInternal == 0;\n                if (!cursorBeforeDash)\n                {\n                    if (ch >= '0' && ch <= '9') return ch;\n                    if (ch == '-' && (pos == 0 || selectionAtStart)) return ch;\n                    if (ch == '.' && characterValidation == CharacterValidation.Decimal && !text.Contains(\".\")) return ch;\n                }\n            }\n            else if (characterValidation == CharacterValidation.Digit)\n            {\n                if (ch >= '0' && ch <= '9') return ch;\n            }\n            else if (characterValidation == CharacterValidation.Alphanumeric)\n            {\n                // All alphanumeric characters\n                if (ch >= 'A' && ch <= 'Z') return ch;\n                if (ch >= 'a' && ch <= 'z') return ch;\n                if (ch >= '0' && ch <= '9') return ch;\n            }\n            else if (characterValidation == CharacterValidation.Name)\n            {\n                char lastChar = (text.Length > 0) ? text[Mathf.Clamp(pos, 0, text.Length - 1)] : ' ';\n                char nextChar = (text.Length > 0) ? text[Mathf.Clamp(pos + 1, 0, text.Length - 1)] : '\\n';\n\n                if (char.IsLetter(ch))\n                {\n                    // Space followed by a letter -- make sure it's capitalized\n                    if (char.IsLower(ch) && lastChar == ' ')\n                        return char.ToUpper(ch);\n\n                    // Uppercase letters are only allowed after spaces (and apostrophes)\n                    if (char.IsUpper(ch) && lastChar != ' ' && lastChar != '\\'')\n                        return char.ToLower(ch);\n\n                    // If character was already in correct case, return it as-is.\n                    // Also, letters that are neither upper nor lower case are always allowed.\n                    return ch;\n                }\n                else if (ch == '\\'')\n                {\n                    // Don't allow more than one apostrophe\n                    if (lastChar != ' ' && lastChar != '\\'' && nextChar != '\\'' && !text.Contains(\"'\"))\n                        return ch;\n                }\n                else if (ch == ' ')\n                {\n                    // Don't allow more than one space in a row\n                    if (lastChar != ' ' && lastChar != '\\'' && nextChar != ' ' && nextChar != '\\'')\n                        return ch;\n                }\n            }\n            else if (characterValidation == CharacterValidation.EmailAddress)\n            {\n                // From StackOverflow about allowed characters in email addresses:\n                // Uppercase and lowercase English letters (a-z, A-Z)\n                // Digits 0 to 9\n                // Characters ! # $ % & ' * + - / = ? ^ _ ` { | } ~\n                // Character . (dot, period, full stop) provided that it is not the first or last character,\n                // and provided also that it does not appear two or more times consecutively.\n\n                if (ch >= 'A' && ch <= 'Z') return ch;\n                if (ch >= 'a' && ch <= 'z') return ch;\n                if (ch >= '0' && ch <= '9') return ch;\n                if (ch == '@' && text.IndexOf('@') == -1) return ch;\n                if (kEmailSpecialCharacters.IndexOf(ch) != -1) return ch;\n                if (ch == '.')\n                {\n                    char lastChar = (text.Length > 0) ? text[Mathf.Clamp(pos, 0, text.Length - 1)] : ' ';\n                    char nextChar = (text.Length > 0) ? text[Mathf.Clamp(pos + 1, 0, text.Length - 1)] : '\\n';\n                    if (lastChar != '.' && nextChar != '.')\n                        return ch;\n                }\n            }\n            else if (characterValidation == CharacterValidation.Regex)\n            {\n                // Regex expression\n                if (Regex.IsMatch(ch.ToString(), m_RegexValue))\n                {\n                    return ch;\n                }\n            }\n            else if (characterValidation == CharacterValidation.CustomValidator)\n            {\n                if (m_InputValidator != null)\n                {\n                    char c = m_InputValidator.Validate(ref text, ref pos, ch);\n                    m_Text = text;\n                    stringSelectPositionInternal = stringPositionInternal = pos;\n                    return c;\n                }\n            }\n            return (char)0;\n        }\n\n        public void ActivateInputField()\n        {\n            if (m_TextComponent == null || m_TextComponent.font == null || !IsActive() || !IsInteractable())\n                return;\n\n            if (isFocused)\n            {\n                if (m_SoftKeyboard != null && !m_SoftKeyboard.active)\n                {\n                    m_SoftKeyboard.active = true;\n                    m_SoftKeyboard.text = m_Text;\n                }\n            }\n\n            m_ShouldActivateNextUpdate = true;\n        }\n\n        private void ActivateInputFieldInternal()\n        {\n            if (EventSystem.current == null)\n                return;\n\n            if (EventSystem.current.currentSelectedGameObject != gameObject)\n                EventSystem.current.SetSelectedGameObject(gameObject);\n\n            if (TouchScreenKeyboard.isSupported && shouldHideSoftKeyboard == false)\n            {\n                if (inputSystem.touchSupported)\n                {\n                    TouchScreenKeyboard.hideInput = shouldHideMobileInput;\n                }\n\n                if (shouldHideSoftKeyboard == false && m_ReadOnly == false && contentType != ContentType.Custom)\n                {\n                    m_SoftKeyboard = (inputType == InputType.Password) ?\n                        TouchScreenKeyboard.Open(m_Text, keyboardType, false, multiLine, true, false, \"\", characterLimit) :\n                        TouchScreenKeyboard.Open(m_Text, keyboardType, inputType == InputType.AutoCorrect, multiLine, false, false, \"\", characterLimit);\n\n                    if (shouldHideMobileInput == false)\n                    {\n                        MoveTextEnd(false);\n                    }\n                    else\n                    {\n                        OnFocus();\n\n                        // Opening the soft keyboard sets its selection to the end of the text. \n                        // As such, we set the selection to match the Input Field's internal selection.\n                        if (m_SoftKeyboard != null)\n                        {\n                            int length = stringPositionInternal < stringSelectPositionInternal ? stringSelectPositionInternal - stringPositionInternal : stringPositionInternal - stringSelectPositionInternal;\n                            m_SoftKeyboard.selection = new RangeInt(stringPositionInternal < stringSelectPositionInternal ? stringPositionInternal : stringSelectPositionInternal, length);\n                        }\n                    }\n                }\n\n                // Cache the value of isInPlaceEditingAllowed, because on UWP this involves calling into native code\n                // The value only needs to be updated once when the TouchKeyboard is opened.\n                #if UNITY_2019_1_OR_NEWER\n                m_TouchKeyboardAllowsInPlaceEditing = TouchScreenKeyboard.isInPlaceEditingAllowed;\n                #endif\n            }\n            else\n            {\n                if (!TouchScreenKeyboard.isSupported)\n                    inputSystem.imeCompositionMode = IMECompositionMode.On;\n\n                OnFocus();\n            }\n\n            m_AllowInput = true;\n            m_OriginalText = text;\n            m_WasCanceled = false;\n            SetCaretVisible();\n            UpdateLabel();\n        }\n\n        public override void OnSelect(BaseEventData eventData)\n        {\n            //Debug.Log(\"OnSelect()\");\n\n            base.OnSelect(eventData);\n            SendOnFocus();\n\n            ActivateInputField();\n        }\n\n        public virtual void OnPointerClick(PointerEventData eventData)\n        {\n            //Debug.Log(\"Pointer Click Event...\");\n\n            if (eventData.button != PointerEventData.InputButton.Left)\n                return;\n\n            ActivateInputField();\n        }\n\n        public void OnControlClick()\n        {\n            //Debug.Log(\"Input Field control click...\");\n        }\n\n        public void ReleaseSelection()\n        {\n            m_SelectionStillActive = false;\n            MarkGeometryAsDirty();\n        }\n\n        public void DeactivateInputField(bool clearSelection = false)\n        {\n            //Debug.Log(\"Deactivate Input Field...\");\n\n            // Not activated do nothing.\n            if (!m_AllowInput)\n                return;\n\n            m_HasDoneFocusTransition = false;\n            m_AllowInput = false;\n\n            if (m_Placeholder != null)\n                m_Placeholder.enabled = string.IsNullOrEmpty(m_Text);\n\n            if (m_TextComponent != null && IsInteractable())\n            {\n                if (m_WasCanceled && m_RestoreOriginalTextOnEscape)\n                    text = m_OriginalText;\n\n                if (m_SoftKeyboard != null)\n                {\n                    m_SoftKeyboard.active = false;\n                    m_SoftKeyboard = null;\n                }\n\n                m_SelectionStillActive = true;\n\n                if (m_ResetOnDeActivation || m_ReleaseSelection)\n                {\n                    //m_StringPosition = m_StringSelectPosition = 0;\n                    //m_CaretPosition = m_CaretSelectPosition = 0;\n                    //m_TextComponent.rectTransform.localPosition = m_DefaultTransformPosition;\n\n                    //if (caretRectTrans != null)\n                    //    caretRectTrans.localPosition = Vector3.zero;\n\n                    m_SelectionStillActive = false;\n                    m_ReleaseSelection = false;\n                    m_SelectedObject = null;\n                }\n\n                SendOnEndEdit();\n                SendOnEndTextSelection();\n\n                inputSystem.imeCompositionMode = IMECompositionMode.Auto;\n            }\n\n            MarkGeometryAsDirty();\n\n            // Scrollbar should be updated.\n            m_IsScrollbarUpdateRequired = true;\n        }\n\n        public override void OnDeselect(BaseEventData eventData)\n        {\n            DeactivateInputField();\n\n            base.OnDeselect(eventData);\n            SendOnFocusLost();\n        }\n\n        public virtual void OnSubmit(BaseEventData eventData)\n        {\n            //Debug.Log(\"OnSubmit()\");\n\n            if (!IsActive() || !IsInteractable())\n                return;\n\n            if (!isFocused)\n                m_ShouldActivateNextUpdate = true;\n\n            SendOnSubmit();\n        }\n\n        //public virtual void OnLostFocus(BaseEventData eventData)\n        //{\n        //    if (!IsActive() || !IsInteractable())\n        //        return;\n        //}\n\n        private void EnforceContentType()\n        {\n            switch (contentType)\n            {\n                case ContentType.Standard:\n                    {\n                        // Don't enforce line type for this content type.\n                        m_InputType = InputType.Standard;\n                        m_KeyboardType = TouchScreenKeyboardType.Default;\n                        m_CharacterValidation = CharacterValidation.None;\n                        break;\n                    }\n                case ContentType.Autocorrected:\n                    {\n                        // Don't enforce line type for this content type.\n                        m_InputType = InputType.AutoCorrect;\n                        m_KeyboardType = TouchScreenKeyboardType.Default;\n                        m_CharacterValidation = CharacterValidation.None;\n                        break;\n                    }\n                case ContentType.IntegerNumber:\n                    {\n                        m_LineType = LineType.SingleLine;\n                        m_InputType = InputType.Standard;\n                        m_KeyboardType = TouchScreenKeyboardType.NumberPad;\n                        m_CharacterValidation = CharacterValidation.Integer;\n                        break;\n                    }\n                case ContentType.DecimalNumber:\n                    {\n                        m_LineType = LineType.SingleLine;\n                        m_InputType = InputType.Standard;\n                        m_KeyboardType = TouchScreenKeyboardType.NumbersAndPunctuation;\n                        m_CharacterValidation = CharacterValidation.Decimal;\n                        break;\n                    }\n                case ContentType.Alphanumeric:\n                    {\n                        m_LineType = LineType.SingleLine;\n                        m_InputType = InputType.Standard;\n                        m_KeyboardType = TouchScreenKeyboardType.ASCIICapable;\n                        m_CharacterValidation = CharacterValidation.Alphanumeric;\n                        break;\n                    }\n                case ContentType.Name:\n                    {\n                        m_LineType = LineType.SingleLine;\n                        m_InputType = InputType.Standard;\n                        m_KeyboardType = TouchScreenKeyboardType.Default;\n                        m_CharacterValidation = CharacterValidation.Name;\n                        break;\n                    }\n                case ContentType.EmailAddress:\n                    {\n                        m_LineType = LineType.SingleLine;\n                        m_InputType = InputType.Standard;\n                        m_KeyboardType = TouchScreenKeyboardType.EmailAddress;\n                        m_CharacterValidation = CharacterValidation.EmailAddress;\n                        break;\n                    }\n                case ContentType.Password:\n                    {\n                        m_LineType = LineType.SingleLine;\n                        m_InputType = InputType.Password;\n                        m_KeyboardType = TouchScreenKeyboardType.Default;\n                        m_CharacterValidation = CharacterValidation.None;\n                        break;\n                    }\n                case ContentType.Pin:\n                    {\n                        m_LineType = LineType.SingleLine;\n                        m_InputType = InputType.Password;\n                        m_KeyboardType = TouchScreenKeyboardType.NumberPad;\n                        m_CharacterValidation = CharacterValidation.Digit;\n                        break;\n                    }\n                default:\n                    {\n                        // Includes Custom type. Nothing should be enforced.\n                        break;\n                    }\n            }\n\n            SetTextComponentWrapMode();\n        }\n\n        void SetTextComponentWrapMode()\n        {\n            if (m_TextComponent == null)\n                return;\n\n            if (multiLine)\n                m_TextComponent.enableWordWrapping = true;\n            else\n                m_TextComponent.enableWordWrapping = false;\n        }\n\n        // Control Rich Text option on the text component.\n        void SetTextComponentRichTextMode()\n        {\n            if (m_TextComponent == null)\n                return;\n\n            m_TextComponent.richText = m_RichText;\n        }\n\n        void SetToCustomIfContentTypeIsNot(params ContentType[] allowedContentTypes)\n        {\n            if (contentType == ContentType.Custom)\n                return;\n\n            for (int i = 0; i < allowedContentTypes.Length; i++)\n                if (contentType == allowedContentTypes[i])\n                    return;\n\n            contentType = ContentType.Custom;\n        }\n\n        void SetToCustom()\n        {\n            if (contentType == ContentType.Custom)\n                return;\n\n            contentType = ContentType.Custom;\n        }\n\n        void SetToCustom(CharacterValidation characterValidation)\n        {\n            if (contentType == ContentType.Custom)\n            {\n                characterValidation = CharacterValidation.CustomValidator;\n                return;\n            }\n\n            contentType = ContentType.Custom;\n            characterValidation = CharacterValidation.CustomValidator;\n        }\n\n\n        protected override void DoStateTransition(SelectionState state, bool instant)\n        {\n            if (m_HasDoneFocusTransition)\n                state = SelectionState.Highlighted;\n            else if (state == SelectionState.Pressed)\n                m_HasDoneFocusTransition = true;\n\n            base.DoStateTransition(state, instant);\n        }\n\n\n        /// <summary>\n        /// See ILayoutElement.CalculateLayoutInputHorizontal.\n        /// </summary>\n        public virtual void CalculateLayoutInputHorizontal()\n        { }\n\n        /// <summary>\n        /// See ILayoutElement.CalculateLayoutInputVertical.\n        /// </summary>\n        public virtual void CalculateLayoutInputVertical()\n        { }\n\n        /// <summary>\n        /// See ILayoutElement.minWidth.\n        /// </summary>\n        public virtual float minWidth { get { return 0; } }\n\n        /// <summary>\n        /// Get the displayed with of all input characters.\n        /// </summary>\n        public virtual float preferredWidth\n        {\n            get\n            {\n                if (textComponent == null)\n                    return 0;\n\n                return m_TextComponent.preferredWidth + 16 + m_CaretWidth + 1;\n            }\n        }\n\n        /// <summary>\n        /// See ILayoutElement.flexibleWidth.\n        /// </summary>\n        public virtual float flexibleWidth { get { return -1; } }\n\n        /// <summary>\n        /// See ILayoutElement.minHeight.\n        /// </summary>\n        public virtual float minHeight { get { return 0; } }\n\n        /// <summary>\n        /// Get the height of all the text if constrained to the height of the RectTransform.\n        /// </summary>\n        public virtual float preferredHeight\n        {\n            get\n            {\n                if (textComponent == null)\n                    return 0;\n\n                return m_TextComponent.preferredHeight + 16;\n            }\n        }\n\n        /// <summary>\n        /// See ILayoutElement.flexibleHeight.\n        /// </summary>\n        public virtual float flexibleHeight { get { return -1; } }\n\n        /// <summary>\n        /// See ILayoutElement.layoutPriority.\n        /// </summary>\n        public virtual int layoutPriority { get { return 1; } }\n\n\n        /// <summary>\n        /// Function to conveniently set the point size of both Placeholder and Input Field text object.\n        /// </summary>\n        /// <param name=\"pointSize\"></param>\n        public void SetGlobalPointSize(float pointSize)\n        {\n            TMP_Text placeholderTextComponent = m_Placeholder as TMP_Text;\n\n            if (placeholderTextComponent != null) placeholderTextComponent.fontSize = pointSize;\n            textComponent.fontSize = pointSize;\n        }\n\n        /// <summary>\n        /// Function to conveniently set the Font Asset of both Placeholder and Input Field text object.\n        /// </summary>\n        /// <param name=\"fontAsset\"></param>\n        public void SetGlobalFontAsset(TMP_FontAsset fontAsset)\n        {\n            TMP_Text placeholderTextComponent = m_Placeholder as TMP_Text;\n\n            if (placeholderTextComponent != null) placeholderTextComponent.font = fontAsset;\n            textComponent.font = fontAsset;\n\n        }\n\n    }\n\n\n    static class SetPropertyUtility\n    {\n        public static bool SetColor(ref Color currentValue, Color newValue)\n        {\n            if (currentValue.r == newValue.r && currentValue.g == newValue.g && currentValue.b == newValue.b && currentValue.a == newValue.a)\n                return false;\n\n            currentValue = newValue;\n            return true;\n        }\n\n        public static bool SetEquatableStruct<T>(ref T currentValue, T newValue) where T : IEquatable<T>\n        {\n            if (currentValue.Equals(newValue))\n                return false;\n\n            currentValue = newValue;\n            return true;\n        }\n\n        public static bool SetStruct<T>(ref T currentValue, T newValue) where T : struct\n        {\n            if (currentValue.Equals(newValue))\n                return false;\n\n            currentValue = newValue;\n            return true;\n        }\n\n        public static bool SetClass<T>(ref T currentValue, T newValue) where T : class\n        {\n            if ((currentValue == null && newValue == null) || (currentValue != null && currentValue.Equals(newValue)))\n                return false;\n\n            currentValue = newValue;\n            return true;\n        }\n    }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_InputField.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 2da0c512f12947e489f739169773d7ca\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {fileID: 2800000, guid: 3ee40aa79cd242a5b53b0b0ca4f13f0f, type: 3}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_InputValidator.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections;\n\n\nnamespace TMPro\n{\n    /// <summary>\n    /// Custom text input validator where user can implement their own custom character validation.\n    /// </summary>\n    [System.Serializable]\n    public abstract class TMP_InputValidator : ScriptableObject\n    {\n        public abstract char Validate(ref string text, ref int pos, char ch);\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_InputValidator.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 79ff392d1bde4ad78a3836a4a480392d\ntimeCreated: 1473021069\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_LineInfo.cs",
    "content": "﻿namespace TMPro\n{\n\n    /// <summary>\n    /// Structure which contains information about the individual lines of text.\n    /// </summary>\n    public struct TMP_LineInfo\n    {\n        internal int controlCharacterCount;\n\n        public int characterCount;\n        public int visibleCharacterCount;\n        public int spaceCount;\n        public int wordCount;\n        public int firstCharacterIndex;\n        public int firstVisibleCharacterIndex;\n        public int lastCharacterIndex;\n        public int lastVisibleCharacterIndex;\n\n        public float length;\n        public float lineHeight;\n        public float ascender;\n        public float baseline;\n        public float descender;\n        public float maxAdvance;\n\n        public float width;\n        public float marginLeft;\n        public float marginRight;\n\n        public TextAlignmentOptions alignment;\n        public Extents lineExtents;\n\n\n        /// <summary>\n        /// Function returning the current line of text.\n        /// </summary>\n        /// <returns></returns>\n        //public string GetLineText()\n        //{\n        //    string word = string.Empty;\n        //    TMP_CharacterInfo[] charInfo = textComponent.textInfo.characterInfo;\n\n        //    for (int i = firstCharacterIndex; i < lastCharacterIndex + 1; i++)\n        //    {\n        //        word += charInfo[i].character;\n        //    }\n\n        //    return word;\n        //}\n    }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_LineInfo.cs.meta",
    "content": "fileFormatVersion: 2\nguid: b6e75d7f429a4e7e9e1ffb4f85cff49f\ntimeCreated: 1464310403\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_ListPool.cs",
    "content": "﻿using System.Collections.Generic;\n\n\nnamespace TMPro\n{\n    internal static class TMP_ListPool<T>\n    {      \n        // Object pool to avoid allocations.\n        private static readonly TMP_ObjectPool<List<T>> s_ListPool = new TMP_ObjectPool<List<T>>(null, l => l.Clear());\n\n        public static List<T> Get()\n        {\n            return s_ListPool.Get();\n        }\n\n        public static void Release(List<T> toRelease)\n        {\n            s_ListPool.Release(toRelease);\n        }\n    }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_ListPool.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 28375447bcea455c9b51a6650b10c9d7\ntimeCreated: 1458521386\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_MaterialManager.cs",
    "content": "﻿//#define TMP_DEBUG_MODE\n\nusing UnityEngine;\nusing System.Collections.Generic;\n\nusing UnityEngine.UI;\n\n\nnamespace TMPro\n{\n\n    public static class TMP_MaterialManager\n    {\n        private static List<MaskingMaterial> m_materialList = new List<MaskingMaterial>();\n\n        private static Dictionary<long, FallbackMaterial> m_fallbackMaterials = new Dictionary<long, FallbackMaterial>();\n        private static Dictionary<int, long> m_fallbackMaterialLookup = new Dictionary<int, long>();\n        private static List<FallbackMaterial> m_fallbackCleanupList = new List<FallbackMaterial>();\n\n        private static bool isFallbackListDirty;\n\n        static TMP_MaterialManager()\n        {\n            Camera.onPreRender += new Camera.CameraCallback(OnPreRender);\n            Canvas.willRenderCanvases += new Canvas.WillRenderCanvases(OnPreRenderCanvas);\n        }\n\n\n        static void OnPreRender(Camera cam)\n        {\n            if (isFallbackListDirty)\n            {\n                //Debug.Log(\"1 - Cleaning up Fallback Materials.\");\n                CleanupFallbackMaterials();\n                isFallbackListDirty = false;\n            }\n        }\n\n        static void OnPreRenderCanvas()\n        {\n            if (isFallbackListDirty)\n            {\n                //Debug.Log(\"2 - Cleaning up Fallback Materials.\");\n                CleanupFallbackMaterials();\n                isFallbackListDirty = false;\n            }\n        }\n\n        /// <summary>\n        /// Create a Masking Material Instance for the given ID\n        /// </summary>\n        /// <param name=\"baseMaterial\"></param>\n        /// <param name=\"stencilID\"></param>\n        /// <returns></returns>\n        public static Material GetStencilMaterial(Material baseMaterial, int stencilID)\n        {\n            // Check if Material supports masking\n            if (!baseMaterial.HasProperty(ShaderUtilities.ID_StencilID))\n            {\n                Debug.LogWarning(\"Selected Shader does not support Stencil Masking. Please select the Distance Field or Mobile Distance Field Shader.\");\n                return baseMaterial;\n            }\n\n            int baseMaterialID = baseMaterial.GetInstanceID();\n\n            // If baseMaterial already has a corresponding masking material, return it.\n            for (int i = 0; i < m_materialList.Count; i++)\n            {\n                if (m_materialList[i].baseMaterial.GetInstanceID() == baseMaterialID && m_materialList[i].stencilID == stencilID)\n                {\n                    m_materialList[i].count += 1;\n\n                    #if TMP_DEBUG_MODE\n                    ListMaterials();\n                    #endif\n\n                    return m_materialList[i].stencilMaterial;\n                }\n            }\n\n            // No matching masking material found. Create and return a new one.\n\n            Material stencilMaterial;\n\n            //Create new Masking Material Instance for this Base Material \n            stencilMaterial = new Material(baseMaterial);\n            stencilMaterial.hideFlags = HideFlags.HideAndDontSave;\n\n            #if UNITY_EDITOR\n                stencilMaterial.name += \" Masking ID:\" + stencilID;\n            #endif\n\n            stencilMaterial.shaderKeywords = baseMaterial.shaderKeywords;\n\n            // Set Stencil Properties\n            ShaderUtilities.GetShaderPropertyIDs();\n            stencilMaterial.SetFloat(ShaderUtilities.ID_StencilID, stencilID);\n            //stencilMaterial.SetFloat(ShaderUtilities.ID_StencilOp, 0);\n            stencilMaterial.SetFloat(ShaderUtilities.ID_StencilComp, 4);\n            //stencilMaterial.SetFloat(ShaderUtilities.ID_StencilReadMask, stencilID);\n            //stencilMaterial.SetFloat(ShaderUtilities.ID_StencilWriteMask, 0);\n\n            MaskingMaterial temp = new MaskingMaterial();\n            temp.baseMaterial = baseMaterial;\n            temp.stencilMaterial = stencilMaterial;\n            temp.stencilID = stencilID;\n            temp.count = 1;\n\n            m_materialList.Add(temp);\n\n            #if TMP_DEBUG_MODE\n            ListMaterials();\n            #endif\n\n            return stencilMaterial;\n        }\n\n\n        /// <summary>\n        /// Function to release the stencil material.\n        /// </summary>\n        /// <param name=\"stencilMaterial\"></param>\n        public static void ReleaseStencilMaterial(Material stencilMaterial)\n        {\n            int stencilMaterialID = stencilMaterial.GetInstanceID();\n            \n            for (int i = 0; i < m_materialList.Count; i++)\n            {\n                if (m_materialList[i].stencilMaterial.GetInstanceID() == stencilMaterialID)\n                {\n                    if (m_materialList[i].count > 1)\n                        m_materialList[i].count -= 1;\n                    else\n                    {\n                        Object.DestroyImmediate(m_materialList[i].stencilMaterial);\n                        m_materialList.RemoveAt(i);\n                        stencilMaterial = null;\n                    }\n\n                    break;\n                }\n            }\n\n\n            #if TMP_DEBUG_MODE\n            ListMaterials();\n            #endif\n        }\n\n\n        // Function which returns the base material associated with a Masking Material\n        public static Material GetBaseMaterial(Material stencilMaterial)\n        {\n            // Check if maskingMaterial already has a base material associated with it.\n            int index = m_materialList.FindIndex(item => item.stencilMaterial == stencilMaterial);\n\n            if (index == -1)\n                return null;\n            else\n                return m_materialList[index].baseMaterial;\n\n        }\n\n\n        /// <summary>\n        /// Function to set the Material Stencil ID\n        /// </summary>\n        /// <param name=\"material\"></param>\n        /// <param name=\"stencilID\"></param>\n        /// <returns></returns>\n        public static Material SetStencil(Material material, int stencilID)\n        {\n            material.SetFloat(ShaderUtilities.ID_StencilID, stencilID);\n            \n            if (stencilID == 0)\n                material.SetFloat(ShaderUtilities.ID_StencilComp, 8);\n            else\n                material.SetFloat(ShaderUtilities.ID_StencilComp, 4);\n\n            return material;\n        }\n\n\n        public static void AddMaskingMaterial(Material baseMaterial, Material stencilMaterial, int stencilID)\n        {\n            // Check if maskingMaterial already has a base material associated with it.\n            int index = m_materialList.FindIndex(item => item.stencilMaterial == stencilMaterial);\n\n            if (index == -1)\n            {\n                MaskingMaterial temp = new MaskingMaterial();\n                temp.baseMaterial = baseMaterial;\n                temp.stencilMaterial = stencilMaterial;\n                temp.stencilID = stencilID;\n                temp.count = 1;\n\n                m_materialList.Add(temp);\n            }\n            else\n            {\n                stencilMaterial = m_materialList[index].stencilMaterial;\n                m_materialList[index].count += 1;\n            }\n        }\n\n\n\n        public static void RemoveStencilMaterial(Material stencilMaterial)\n        {\n            // Check if maskingMaterial is already on the list.\n            int index = m_materialList.FindIndex(item => item.stencilMaterial == stencilMaterial);\n\n            if (index != -1)\n            {\n                m_materialList.RemoveAt(index);\n            }\n\n            #if TMP_DEBUG_MODE\n            ListMaterials();\n            #endif\n        }\n\n\n\n        public static void ReleaseBaseMaterial(Material baseMaterial)\n        {\n            // Check if baseMaterial already has a masking material associated with it.\n            int index = m_materialList.FindIndex(item => item.baseMaterial == baseMaterial);\n\n            if (index == -1)\n            {\n                Debug.Log(\"No Masking Material exists for \" + baseMaterial.name);\n            }\n            else\n            {\n                if (m_materialList[index].count > 1)\n                {\n                    m_materialList[index].count -= 1;\n                    Debug.Log(\"Removed (1) reference to \" + m_materialList[index].stencilMaterial.name + \". There are \" + m_materialList[index].count + \" references left.\");\n                }\n                else\n                {\n                    Debug.Log(\"Removed last reference to \" + m_materialList[index].stencilMaterial.name + \" with ID \" + m_materialList[index].stencilMaterial.GetInstanceID());\n                    Object.DestroyImmediate(m_materialList[index].stencilMaterial);\n                    m_materialList.RemoveAt(index);\n                }\n            }\n\n            #if TMP_DEBUG_MODE\n            ListMaterials();\n            #endif\n        }\n\n\n        public static void ClearMaterials()\n        {\n            if (m_materialList.Count == 0)\n            {\n                Debug.Log(\"Material List has already been cleared.\");\n                return;\n            }\n\n            for (int i = 0; i < m_materialList.Count; i++)\n            {\n                //Material baseMaterial = m_materialList[i].baseMaterial;\n                Material stencilMaterial = m_materialList[i].stencilMaterial;\n\n                Object.DestroyImmediate(stencilMaterial);\n                m_materialList.RemoveAt(i);\n            }\n        }\n\n\n        /// <summary>\n        /// Function to get the Stencil ID\n        /// </summary>\n        /// <param name=\"obj\"></param>\n        /// <returns></returns>\n        public static int GetStencilID(GameObject obj)\n        {\n            // Implementation is almost copied from Unity UI\n\n            var count = 0;\n\n            var transform = obj.transform;\n            var stopAfter = FindRootSortOverrideCanvas(transform);\n            if (transform == stopAfter)\n                return count;\n\n            var t = transform.parent;\n            var components = TMP_ListPool<Mask>.Get();\n            while (t != null)\n            {\n                t.GetComponents<Mask>(components);\n                for (var i = 0; i < components.Count; ++i)\n                {\n                    var mask = components[i];\n                    if (mask != null && mask.MaskEnabled() && mask.graphic.IsActive())\n            {\n                        ++count;\n                        break;\n                    }\n            }\n\n                if (t == stopAfter)\n                    break;\n\n                t = t.parent;\n            }\n            TMP_ListPool<Mask>.Release(components);\n\n            return Mathf.Min((1 << count) - 1, 255);\n        }\n\n\n        public static Material GetMaterialForRendering(MaskableGraphic graphic, Material baseMaterial)\n        {\n            if (baseMaterial == null)\n                return null;\n\n            var modifiers = TMP_ListPool<IMaterialModifier>.Get();\n            graphic.GetComponents(modifiers);\n\n            var result = baseMaterial;\n            for (int i = 0; i < modifiers.Count; i++)\n                result = modifiers[i].GetModifiedMaterial(result);\n\n            TMP_ListPool<IMaterialModifier>.Release(modifiers);\n\n            return result;\n        }\n\n        private static Transform FindRootSortOverrideCanvas(Transform start)\n        {\n            // Implementation is copied from Unity UI\n\n            var canvasList = TMP_ListPool<Canvas>.Get();\n            start.GetComponentsInParent(false, canvasList);\n            Canvas canvas = null;\n\n            for (int i = 0; i < canvasList.Count; ++i)\n            {\n                canvas = canvasList[i];\n\n                // We found the canvas we want to use break\n                if (canvas.overrideSorting)\n                    break;\n            }\n            TMP_ListPool<Canvas>.Release(canvasList);\n\n            return canvas != null ? canvas.transform : null;\n        }\n\n\n        /// <summary>\n        /// This function returns a material instance using the material properties of a previous material but using the font atlas texture of the new font asset.\n        /// </summary>\n        /// <param name=\"sourceMaterial\">The material containing the source material properties to be copied to the new material.</param>\n        /// <param name=\"targetMaterial\">The font atlas texture that should be assigned to the new material.</param>\n        /// <returns></returns>\n        public static Material GetFallbackMaterial (Material sourceMaterial, Material targetMaterial)\n        {\n            int sourceID = sourceMaterial.GetInstanceID();\n            Texture tex = targetMaterial.GetTexture(ShaderUtilities.ID_MainTex);\n            int texID = tex.GetInstanceID();\n            long key = (long)sourceID << 32 | (long)(uint)texID;\n\n            if (m_fallbackMaterials.TryGetValue(key, out FallbackMaterial fallback))\n            {\n                //Debug.Log(\"Material [\" + fallback.fallbackMaterial.name + \"] already exists.\");\n                return fallback.fallbackMaterial;\n            }\n\n            // Create new material from the source material and copy properties if using distance field shaders.\n            Material fallbackMaterial = null;\n            if (sourceMaterial.HasProperty(ShaderUtilities.ID_GradientScale) && targetMaterial.HasProperty(ShaderUtilities.ID_GradientScale))\n            {\n                fallbackMaterial = new Material(sourceMaterial);\n                fallbackMaterial.hideFlags = HideFlags.HideAndDontSave;\n\n                #if UNITY_EDITOR\n                fallbackMaterial.name += \" + \" + tex.name;\n                //Debug.Log(\"Creating new fallback material for \" + fallbackMaterial.name);\n                #endif\n\n                fallbackMaterial.SetTexture(ShaderUtilities.ID_MainTex, tex);\n                // Retain material properties unique to target material.\n                fallbackMaterial.SetFloat(ShaderUtilities.ID_GradientScale, targetMaterial.GetFloat(ShaderUtilities.ID_GradientScale));\n                fallbackMaterial.SetFloat(ShaderUtilities.ID_TextureWidth, targetMaterial.GetFloat(ShaderUtilities.ID_TextureWidth));\n                fallbackMaterial.SetFloat(ShaderUtilities.ID_TextureHeight, targetMaterial.GetFloat(ShaderUtilities.ID_TextureHeight));\n                fallbackMaterial.SetFloat(ShaderUtilities.ID_WeightNormal, targetMaterial.GetFloat(ShaderUtilities.ID_WeightNormal));\n                fallbackMaterial.SetFloat(ShaderUtilities.ID_WeightBold, targetMaterial.GetFloat(ShaderUtilities.ID_WeightBold));\n            }\n            else\n            {\n                fallbackMaterial = new Material(targetMaterial);\n            }\n\n            fallback = new FallbackMaterial();\n            fallback.baseID = sourceID;\n            fallback.baseMaterial = sourceMaterial;\n            fallback.fallbackID = key;\n            fallback.fallbackMaterial = fallbackMaterial;\n            fallback.count = 0;\n\n            m_fallbackMaterials.Add(key, fallback);\n            m_fallbackMaterialLookup.Add(fallbackMaterial.GetInstanceID(), key);\n\n            #if TMP_DEBUG_MODE\n            ListFallbackMaterials();\n            #endif\n\n            return fallbackMaterial;\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"targetMaterial\"></param>\n        public static void AddFallbackMaterialReference(Material targetMaterial)\n        {\n            if (targetMaterial == null) return;\n\n            int sourceID = targetMaterial.GetInstanceID();\n\n            // Lookup key to retrieve \n            if (m_fallbackMaterialLookup.TryGetValue(sourceID, out long key))\n            {\n                if (m_fallbackMaterials.TryGetValue(key, out FallbackMaterial fallback))\n                {\n                    //Debug.Log(\"Adding Fallback material \" + fallback.fallbackMaterial.name + \" with reference count of \" + (fallback.count + 1));\n                    fallback.count += 1;\n                }\n            }\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"targetMaterial\"></param>\n        public static void RemoveFallbackMaterialReference(Material targetMaterial)\n        {\n            if (targetMaterial == null) return;\n\n            int sourceID = targetMaterial.GetInstanceID();\n\n            // Lookup key to retrieve \n            if (m_fallbackMaterialLookup.TryGetValue(sourceID, out long key))\n            {\n                if (m_fallbackMaterials.TryGetValue(key, out FallbackMaterial fallback))\n                {\n                    fallback.count -= 1;\n\n                    if (fallback.count < 1)\n                        m_fallbackCleanupList.Add(fallback);\n                }\n            }\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        public static void CleanupFallbackMaterials()\n        {\n            // Return if the list is empty.\n            if (m_fallbackCleanupList.Count == 0) return;\n\n            for (int i = 0; i < m_fallbackCleanupList.Count; i++)\n            {\n                FallbackMaterial fallback = m_fallbackCleanupList[i];\n\n                if (fallback.count < 1)\n                {\n                    //Debug.Log(\"Cleaning up \" + fallback.fallbackMaterial.name);\n\n                    Material mat = fallback.fallbackMaterial;\n                    m_fallbackMaterials.Remove(fallback.fallbackID);\n                    m_fallbackMaterialLookup.Remove(mat.GetInstanceID());\n                    Object.DestroyImmediate(mat);\n                    mat = null;\n                }\n            }\n\n            m_fallbackCleanupList.Clear();\n        }\n\n\n        /// <summary>\n        /// Function to release the fallback material.\n        /// </summary>\n        /// <param name=\"fallackMaterial\"></param>\n        public static void ReleaseFallbackMaterial(Material fallackMaterial)\n        {\n            if (fallackMaterial == null) return;\n\n            int materialID = fallackMaterial.GetInstanceID();\n\n            if (m_fallbackMaterialLookup.TryGetValue(materialID, out long key))\n            {\n                if (m_fallbackMaterials.TryGetValue(key, out FallbackMaterial fallback))\n                {\n                    //Debug.Log(\"Releasing Fallback material \" + fallback.fallbackMaterial.name + \" with remaining reference count of \" + (fallback.count - 1));\n\n                    fallback.count -= 1;\n\n                    if (fallback.count < 1)\n                        m_fallbackCleanupList.Add(fallback);\n                }\n            }\n\n            isFallbackListDirty = true;\n\n            #if TMP_DEBUG_MODE\n            ListFallbackMaterials();\n            #endif\n        }\n\n\n        private class FallbackMaterial\n        {\n            public int baseID;\n            public Material baseMaterial;\n            public long fallbackID;\n            public Material fallbackMaterial;\n            public int count;\n        }\n\n\n        private class MaskingMaterial\n        {\n            public Material baseMaterial;\n            public Material stencilMaterial;\n            public int count;\n            public int stencilID;\n        }\n\n\n        /// <summary>\n        /// Function to copy the properties of a source material preset to another while preserving the unique font asset properties of the destination material.\n        /// </summary>\n        /// <param name=\"source\"></param>\n        /// <param name=\"destination\"></param>\n        public static void CopyMaterialPresetProperties(Material source, Material destination)\n        {\n            if (!source.HasProperty(ShaderUtilities.ID_GradientScale) || !destination.HasProperty(ShaderUtilities.ID_GradientScale))\n                return;\n\n            // Save unique material properties\n            Texture dst_texture = destination.GetTexture(ShaderUtilities.ID_MainTex);\n            float dst_gradientScale = destination.GetFloat(ShaderUtilities.ID_GradientScale);\n            float dst_texWidth = destination.GetFloat(ShaderUtilities.ID_TextureWidth);\n            float dst_texHeight = destination.GetFloat(ShaderUtilities.ID_TextureHeight);\n            float dst_weightNormal = destination.GetFloat(ShaderUtilities.ID_WeightNormal);\n            float dst_weightBold = destination.GetFloat(ShaderUtilities.ID_WeightBold);\n\n            // Copy all material properties\n            destination.CopyPropertiesFromMaterial(source);\n\n            // Copy shader keywords\n            destination.shaderKeywords = source.shaderKeywords;\n\n            // Restore unique material properties\n            destination.SetTexture(ShaderUtilities.ID_MainTex, dst_texture);\n            destination.SetFloat(ShaderUtilities.ID_GradientScale, dst_gradientScale);\n            destination.SetFloat(ShaderUtilities.ID_TextureWidth, dst_texWidth);\n            destination.SetFloat(ShaderUtilities.ID_TextureHeight, dst_texHeight);\n            destination.SetFloat(ShaderUtilities.ID_WeightNormal, dst_weightNormal);\n            destination.SetFloat(ShaderUtilities.ID_WeightBold, dst_weightBold);\n        }\n\n\n        #if TMP_DEBUG_MODE\n        /// <summary>\n        /// \n        /// </summary>\n        public static void ListMaterials()\n        {\n\n            if (m_materialList.Count() == 0)\n            {\n                Debug.Log(\"Material List is empty.\");\n                return;\n            }\n\n            //Debug.Log(\"List contains \" + m_materialList.Count() + \" items.\");\n\n            for (int i = 0; i < m_materialList.Count(); i++)\n            {\n                Material baseMaterial = m_materialList[i].baseMaterial;\n                Material stencilMaterial = m_materialList[i].stencilMaterial;\n\n                Debug.Log(\"Item #\" + (i + 1) + \" - Base Material is [\" + baseMaterial.name + \"] with ID \" + baseMaterial.GetInstanceID() + \" is associated with [\" + (stencilMaterial != null ? stencilMaterial.name : \"Null\") + \"] Stencil ID \" + m_materialList[i].stencilID + \" with ID \" + (stencilMaterial != null ? stencilMaterial.GetInstanceID() : 0) + \" and is referenced \" + m_materialList[i].count + \" time(s).\");\n            }\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        public static void ListFallbackMaterials()\n        {\n\n            if (m_fallbackMaterialList.Count() == 0)\n            {\n                Debug.Log(\"Material List is empty.\");\n                return;\n            }\n\n            Debug.Log(\"List contains \" + m_fallbackMaterialList.Count() + \" items.\");\n\n            for (int i = 0; i < m_fallbackMaterialList.Count(); i++)\n            {\n                Material baseMaterial = m_fallbackMaterialList[i].baseMaterial;\n                Material fallbackMaterial = m_fallbackMaterialList[i].fallbackMaterial;\n\n                Debug.Log(\"Item #\" + (i + 1) + \" - Base Material is [\" + baseMaterial.name + \"] with ID \" + baseMaterial.GetInstanceID() + \" is associated with [\" + (fallbackMaterial != null ? fallbackMaterial.name : \"Null\") + \"] with ID \" + (fallbackMaterial != null ? fallbackMaterial.GetInstanceID() : 0) + \" and is referenced \" + m_fallbackMaterialList[i].count + \" time(s).\");\n            }\n        }\n        #endif\n    }\n\n}\n\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_MaterialManager.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 6d9df2bc198c417db00037803568139c\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_MeshInfo.cs",
    "content": "﻿using UnityEngine;\nusing System;\nusing System.Linq;\nusing System.Collections;\nusing System.Collections.Generic;\n\n\nnamespace TMPro\n{\n    public enum VertexSortingOrder { Normal, Reverse };\n\n    /// <summary>\n    /// Structure which contains the vertex attributes (geometry) of the text object.\n    /// </summary>\n    public struct TMP_MeshInfo\n    {\n        private static readonly Color32 s_DefaultColor = new Color32(byte.MaxValue, byte.MaxValue, byte.MaxValue, byte.MaxValue);\n        private static readonly Vector3 s_DefaultNormal = new Vector3(0.0f, 0.0f, -1f);\n        private static readonly Vector4 s_DefaultTangent = new Vector4(-1f, 0.0f, 0.0f, 1f);\n        private static readonly Bounds s_DefaultBounds = new Bounds();\n\n        public Mesh mesh;\n        public int vertexCount;\n\n        public Vector3[] vertices;\n        public Vector3[] normals;\n        public Vector4[] tangents;\n\n        public Vector2[] uvs0;\n        public Vector2[] uvs2;\n        //public Vector2[] uvs4;\n        public Color32[] colors32;\n        public int[] triangles;\n\n\n        /// <summary>\n        /// Function to pre-allocate vertex attributes for a mesh of size X.\n        /// </summary>\n        /// <param name=\"mesh\"></param>\n        /// <param name=\"size\"></param>\n        public TMP_MeshInfo(Mesh mesh, int size)\n        {\n            // Reference to the TMP Text Component.\n            //this.textComponent = null;\n\n            // Clear existing mesh data\n            if (mesh == null)\n                mesh = new Mesh();\n            else\n                mesh.Clear();\n\n            this.mesh = mesh;\n\n            // Limit the mesh to less than 65535 vertices which is the limit for Unity's Mesh.\n            size = Mathf.Min(size, 16383);\n\n            int sizeX4 = size * 4;\n            int sizeX6 = size * 6;\n\n            this.vertexCount = 0;\n\n            this.vertices = new Vector3[sizeX4];\n            this.uvs0 = new Vector2[sizeX4];\n            this.uvs2 = new Vector2[sizeX4];\n            //this.uvs4 = new Vector2[sizeX4]; // SDF scale data\n            this.colors32 = new Color32[sizeX4];\n\n            this.normals = new Vector3[sizeX4];\n            this.tangents = new Vector4[sizeX4];\n\n            this.triangles = new int[sizeX6];\n\n            int index_X6 = 0;\n            int index_X4 = 0;\n            while (index_X4 / 4 < size)\n            {\n                for (int i = 0; i < 4; i++)\n                {\n                    this.vertices[index_X4 + i] = Vector3.zero;\n                    this.uvs0[index_X4 + i] = Vector2.zero;\n                    this.uvs2[index_X4 + i] = Vector2.zero;\n                    //this.uvs4[index_X4 + i] = Vector2.zero;\n                    this.colors32[index_X4 + i] = s_DefaultColor;\n                    this.normals[index_X4 + i] = s_DefaultNormal;\n                    this.tangents[index_X4 + i] = s_DefaultTangent;\n                }\n\n                this.triangles[index_X6 + 0] = index_X4 + 0;\n                this.triangles[index_X6 + 1] = index_X4 + 1;\n                this.triangles[index_X6 + 2] = index_X4 + 2;\n                this.triangles[index_X6 + 3] = index_X4 + 2;\n                this.triangles[index_X6 + 4] = index_X4 + 3;\n                this.triangles[index_X6 + 5] = index_X4 + 0;\n\n                index_X4 += 4;\n                index_X6 += 6;\n            }\n\n            // Pre-assign base vertex attributes.\n            this.mesh.vertices = this.vertices;\n            this.mesh.normals = this.normals;\n            this.mesh.tangents = this.tangents;\n            this.mesh.triangles = this.triangles;\n            this.mesh.bounds = s_DefaultBounds;\n        }\n\n\n        /// <summary>\n        /// Function to pre-allocate vertex attributes for a mesh of size X.\n        /// </summary>\n        /// <param name=\"mesh\"></param>\n        /// <param name=\"size\"></param>\n        /// <param name=\"isVolumetric\"></param>\n        public TMP_MeshInfo(Mesh mesh, int size, bool isVolumetric)\n        {\n            // Reference to the TMP Text Component.\n            //this.textComponent = null;\n\n            // Clear existing mesh data\n            if (mesh == null)\n                mesh = new Mesh();\n            else\n                mesh.Clear();\n\n            this.mesh = mesh;\n\n            int s0 = !isVolumetric ? 4 : 8;\n            int s1 = !isVolumetric ? 6 : 36;\n\n            // Limit the mesh to less than 65535 vertices which is the limit for Unity's Mesh.\n            size = Mathf.Min(size, 65532 / s0);\n\n            int size_x_s0 = size * s0;\n            int size_x_s1 = size * s1;\n\n            this.vertexCount = 0;\n\n            this.vertices = new Vector3[size_x_s0];\n            this.uvs0 = new Vector2[size_x_s0];\n            this.uvs2 = new Vector2[size_x_s0];\n            //this.uvs4 = new Vector2[sizeX8]; // SDF scale data\n            this.colors32 = new Color32[size_x_s0];\n\n            this.normals = new Vector3[size_x_s0];\n            this.tangents = new Vector4[size_x_s0];\n\n            this.triangles = new int[size_x_s1];\n\n            int index_x_s0 = 0;\n            int index_x_s1 = 0;\n            while (index_x_s0 / s0 < size)\n            {\n                for (int i = 0; i < s0; i++)\n                {\n                    this.vertices[index_x_s0 + i] = Vector3.zero;\n                    this.uvs0[index_x_s0 + i] = Vector2.zero;\n                    this.uvs2[index_x_s0 + i] = Vector2.zero;\n                    //this.uvs4[index_X4 + i] = Vector2.zero;\n                    this.colors32[index_x_s0 + i] = s_DefaultColor;\n                    this.normals[index_x_s0 + i] = s_DefaultNormal;\n                    this.tangents[index_x_s0 + i] = s_DefaultTangent;\n                }\n\n                // Front Face\n                this.triangles[index_x_s1 + 0] = index_x_s0 + 0;\n                this.triangles[index_x_s1 + 1] = index_x_s0 + 1;\n                this.triangles[index_x_s1 + 2] = index_x_s0 + 2;\n                this.triangles[index_x_s1 + 3] = index_x_s0 + 2;\n                this.triangles[index_x_s1 + 4] = index_x_s0 + 3;\n                this.triangles[index_x_s1 + 5] = index_x_s0 + 0;\n\n                if (isVolumetric)\n                {\n                    // Left Face\n                    this.triangles[index_x_s1 + 6] = index_x_s0 + 4;\n                    this.triangles[index_x_s1 + 7] = index_x_s0 + 5;\n                    this.triangles[index_x_s1 + 8] = index_x_s0 + 1;\n                    this.triangles[index_x_s1 + 9] = index_x_s0 + 1;\n                    this.triangles[index_x_s1 + 10] = index_x_s0 + 0;\n                    this.triangles[index_x_s1 + 11] = index_x_s0 + 4;\n\n                    // Right Face\n                    this.triangles[index_x_s1 + 12] = index_x_s0 + 3;\n                    this.triangles[index_x_s1 + 13] = index_x_s0 + 2;\n                    this.triangles[index_x_s1 + 14] = index_x_s0 + 6;\n                    this.triangles[index_x_s1 + 15] = index_x_s0 + 6;\n                    this.triangles[index_x_s1 + 16] = index_x_s0 + 7;\n                    this.triangles[index_x_s1 + 17] = index_x_s0 + 3;\n\n                    // Top Face\n                    this.triangles[index_x_s1 + 18] = index_x_s0 + 1;\n                    this.triangles[index_x_s1 + 19] = index_x_s0 + 5;\n                    this.triangles[index_x_s1 + 20] = index_x_s0 + 6;\n                    this.triangles[index_x_s1 + 21] = index_x_s0 + 6;\n                    this.triangles[index_x_s1 + 22] = index_x_s0 + 2;\n                    this.triangles[index_x_s1 + 23] = index_x_s0 + 1;\n\n                    // Bottom Face\n                    this.triangles[index_x_s1 + 24] = index_x_s0 + 4;\n                    this.triangles[index_x_s1 + 25] = index_x_s0 + 0;\n                    this.triangles[index_x_s1 + 26] = index_x_s0 + 3;\n                    this.triangles[index_x_s1 + 27] = index_x_s0 + 3;\n                    this.triangles[index_x_s1 + 28] = index_x_s0 + 7;\n                    this.triangles[index_x_s1 + 29] = index_x_s0 + 4;\n\n                    // Back Face\n                    this.triangles[index_x_s1 + 30] = index_x_s0 + 7;\n                    this.triangles[index_x_s1 + 31] = index_x_s0 + 6;\n                    this.triangles[index_x_s1 + 32] = index_x_s0 + 5;\n                    this.triangles[index_x_s1 + 33] = index_x_s0 + 5;\n                    this.triangles[index_x_s1 + 34] = index_x_s0 + 4;\n                    this.triangles[index_x_s1 + 35] = index_x_s0 + 7;\n                }\n\n                index_x_s0 += s0;\n                index_x_s1 += s1;\n            }\n\n            // Pre-assign base vertex attributes.\n            this.mesh.vertices = this.vertices;\n            this.mesh.normals = this.normals;\n            this.mesh.tangents = this.tangents;\n            this.mesh.triangles = this.triangles;\n            this.mesh.bounds = s_DefaultBounds;\n        }\n\n\n        /// <summary>\n        /// Function to resized the content of MeshData and re-assign normals, tangents and triangles.\n        /// </summary>\n        /// <param name=\"meshData\"></param>\n        /// <param name=\"size\"></param>\n        public void ResizeMeshInfo(int size)\n        {\n            // Limit the mesh to less than 65535 vertices which is the limit for Unity's Mesh.\n            size = Mathf.Min(size, 16383);\n\n            int size_X4 = size * 4;\n            int size_X6 = size * 6;\n\n            int previousSize = this.vertices.Length / 4;\n\n            Array.Resize(ref this.vertices, size_X4);\n            Array.Resize(ref this.normals, size_X4);\n            Array.Resize(ref this.tangents, size_X4);\n\n            Array.Resize(ref this.uvs0, size_X4);\n            Array.Resize(ref this.uvs2, size_X4);\n            //Array.Resize(ref this.uvs4, size_X4);\n\n            Array.Resize(ref this.colors32, size_X4);\n\n            Array.Resize(ref this.triangles, size_X6);\n\n\n            // Re-assign Normals, Tangents and Triangles\n            if (size <= previousSize)\n            {\n                this.mesh.triangles = this.triangles;\n                this.mesh.vertices = this.vertices;\n                this.mesh.normals = this.normals;\n                this.mesh.tangents = this.tangents;\n\n                return;\n            }\n\n            for (int i = previousSize; i < size; i++)\n            {\n                int index_X4 = i * 4;\n                int index_X6 = i * 6;\n\n                this.normals[0 + index_X4] = s_DefaultNormal;\n                this.normals[1 + index_X4] = s_DefaultNormal;\n                this.normals[2 + index_X4] = s_DefaultNormal;\n                this.normals[3 + index_X4] = s_DefaultNormal;\n\n                this.tangents[0 + index_X4] = s_DefaultTangent;\n                this.tangents[1 + index_X4] = s_DefaultTangent;\n                this.tangents[2 + index_X4] = s_DefaultTangent;\n                this.tangents[3 + index_X4] = s_DefaultTangent;\n\n                // Setup Triangles\n                this.triangles[0 + index_X6] = 0 + index_X4;\n                this.triangles[1 + index_X6] = 1 + index_X4;\n                this.triangles[2 + index_X6] = 2 + index_X4;\n                this.triangles[3 + index_X6] = 2 + index_X4;\n                this.triangles[4 + index_X6] = 3 + index_X4;\n                this.triangles[5 + index_X6] = 0 + index_X4;\n            }\n\n            this.mesh.vertices = this.vertices;\n            this.mesh.normals = this.normals;\n            this.mesh.tangents = this.tangents;\n            this.mesh.triangles = this.triangles;\n        }\n\n\n        /// <summary>\n        /// Function to resized the content of MeshData and re-assign normals, tangents and triangles.\n        /// </summary>\n        /// <param name=\"size\"></param>\n        /// <param name=\"isVolumetric\"></param>\n        public void ResizeMeshInfo(int size, bool isVolumetric)\n        {\n            int s0 = !isVolumetric ? 4 : 8;\n            int s1 = !isVolumetric ? 6 : 36;\n\n            // Limit the mesh to less than 65535 vertices which is the limit for Unity's Mesh.\n            size = Mathf.Min(size, 65532 / s0);\n\n            int size_X4 = size * s0;\n            int size_X6 = size * s1;\n\n            int previousSize = this.vertices.Length / s0;\n\n            Array.Resize(ref this.vertices, size_X4);\n            Array.Resize(ref this.normals, size_X4);\n            Array.Resize(ref this.tangents, size_X4);\n\n            Array.Resize(ref this.uvs0, size_X4);\n            Array.Resize(ref this.uvs2, size_X4);\n            //Array.Resize(ref this.uvs4, size_X4);\n\n            Array.Resize(ref this.colors32, size_X4);\n\n            Array.Resize(ref this.triangles, size_X6);\n\n\n            // Re-assign Normals, Tangents and Triangles\n            if (size <= previousSize)\n            {\n                this.mesh.triangles = this.triangles;\n                this.mesh.vertices = this.vertices;\n                this.mesh.normals = this.normals;\n                this.mesh.tangents = this.tangents;\n\n                return;\n            }\n\n            for (int i = previousSize; i < size; i++)\n            {\n                int index_X4 = i * s0;\n                int index_X6 = i * s1;\n\n                this.normals[0 + index_X4] = s_DefaultNormal;\n                this.normals[1 + index_X4] = s_DefaultNormal;\n                this.normals[2 + index_X4] = s_DefaultNormal;\n                this.normals[3 + index_X4] = s_DefaultNormal;\n\n                this.tangents[0 + index_X4] = s_DefaultTangent;\n                this.tangents[1 + index_X4] = s_DefaultTangent;\n                this.tangents[2 + index_X4] = s_DefaultTangent;\n                this.tangents[3 + index_X4] = s_DefaultTangent;\n\n                if (isVolumetric)\n                {\n                    this.normals[4 + index_X4] = s_DefaultNormal;\n                    this.normals[5 + index_X4] = s_DefaultNormal;\n                    this.normals[6 + index_X4] = s_DefaultNormal;\n                    this.normals[7 + index_X4] = s_DefaultNormal;\n\n                    this.tangents[4 + index_X4] = s_DefaultTangent;\n                    this.tangents[5 + index_X4] = s_DefaultTangent;\n                    this.tangents[6 + index_X4] = s_DefaultTangent;\n                    this.tangents[7 + index_X4] = s_DefaultTangent;\n                }\n\n                // Setup Triangles\n                this.triangles[0 + index_X6] = 0 + index_X4;\n                this.triangles[1 + index_X6] = 1 + index_X4;\n                this.triangles[2 + index_X6] = 2 + index_X4;\n                this.triangles[3 + index_X6] = 2 + index_X4;\n                this.triangles[4 + index_X6] = 3 + index_X4;\n                this.triangles[5 + index_X6] = 0 + index_X4;\n\n                if (isVolumetric)\n                {\n                    // Left Face\n                    this.triangles[index_X6 + 6] = index_X4 + 4;\n                    this.triangles[index_X6 + 7] = index_X4 + 5;\n                    this.triangles[index_X6 + 8] = index_X4 + 1;\n                    this.triangles[index_X6 + 9] = index_X4 + 1;\n                    this.triangles[index_X6 + 10] = index_X4 + 0;\n                    this.triangles[index_X6 + 11] = index_X4 + 4;\n\n                    // Right Face\n                    this.triangles[index_X6 + 12] = index_X4 + 3;\n                    this.triangles[index_X6 + 13] = index_X4 + 2;\n                    this.triangles[index_X6 + 14] = index_X4 + 6;\n                    this.triangles[index_X6 + 15] = index_X4 + 6;\n                    this.triangles[index_X6 + 16] = index_X4 + 7;\n                    this.triangles[index_X6 + 17] = index_X4 + 3;\n\n                    // Top Face\n                    this.triangles[index_X6 + 18] = index_X4 + 1;\n                    this.triangles[index_X6 + 19] = index_X4 + 5;\n                    this.triangles[index_X6 + 20] = index_X4 + 6;\n                    this.triangles[index_X6 + 21] = index_X4 + 6;\n                    this.triangles[index_X6 + 22] = index_X4 + 2;\n                    this.triangles[index_X6 + 23] = index_X4 + 1;\n\n                    // Bottom Face\n                    this.triangles[index_X6 + 24] = index_X4 + 4;\n                    this.triangles[index_X6 + 25] = index_X4 + 0;\n                    this.triangles[index_X6 + 26] = index_X4 + 3;\n                    this.triangles[index_X6 + 27] = index_X4 + 3;\n                    this.triangles[index_X6 + 28] = index_X4 + 7;\n                    this.triangles[index_X6 + 29] = index_X4 + 4;\n\n                    // Back Face\n                    this.triangles[index_X6 + 30] = index_X4 + 7;\n                    this.triangles[index_X6 + 31] = index_X4 + 6;\n                    this.triangles[index_X6 + 32] = index_X4 + 5;\n                    this.triangles[index_X6 + 33] = index_X4 + 5;\n                    this.triangles[index_X6 + 34] = index_X4 + 4;\n                    this.triangles[index_X6 + 35] = index_X4 + 7;\n                }\n            }\n\n            this.mesh.vertices = this.vertices;\n            this.mesh.normals = this.normals;\n            this.mesh.tangents = this.tangents;\n            this.mesh.triangles = this.triangles;\n        }\n\n\n        /// <summary>\n        /// Function to clear the vertices while preserving the Triangles, Normals and Tangents.\n        /// </summary>\n        public void Clear()\n        {\n            if (this.vertices == null) return;\n\n            Array.Clear(this.vertices, 0, this.vertices.Length);\n            this.vertexCount = 0;\n\n            if (this.mesh != null)\n                this.mesh.vertices = this.vertices;\n        }\n\n\n        /// <summary>\n        /// Function to clear the vertices while preserving the Triangles, Normals and Tangents.\n        /// </summary>\n        public void Clear(bool uploadChanges)\n        {\n            if (this.vertices == null) return;\n\n            Array.Clear(this.vertices, 0, this.vertices.Length);\n            this.vertexCount = 0;\n\n            if (uploadChanges && this.mesh != null)\n                this.mesh.vertices = this.vertices;\n\n            if (this.mesh != null)\n                this.mesh.bounds = s_DefaultBounds;\n        }\n\n\n        /// <summary>\n        /// Function to clear the vertices while preserving the Triangles, Normals and Tangents.\n        /// </summary>\n        public void ClearUnusedVertices()\n        {\n            int length = vertices.Length - vertexCount;\n\n            if (length > 0)\n                Array.Clear(vertices, vertexCount, length);\n        }\n\n\n        /// <summary>\n        /// Function used to mark unused vertices as degenerate.\n        /// </summary>\n        /// <param name=\"startIndex\"></param>\n        public void ClearUnusedVertices(int startIndex)\n        {\n            int length = this.vertices.Length - startIndex;\n\n            if (length > 0)\n                Array.Clear(this.vertices, startIndex, length);\n        }\n\n\n        /// <summary>\n        /// Function used to mark unused vertices as degenerate an upload resulting data to the mesh.\n        /// </summary>\n        /// <param name=\"startIndex\"></param>\n        public void ClearUnusedVertices(int startIndex, bool updateMesh)\n        {\n            int length = this.vertices.Length - startIndex;\n\n            if (length > 0)\n                Array.Clear(this.vertices, startIndex, length);\n\n            if (updateMesh && mesh != null)\n                this.mesh.vertices = this.vertices;\n        }\n\n\n        public void SortGeometry (VertexSortingOrder order)\n        {\n            switch (order)\n            {\n                case VertexSortingOrder.Normal:\n                    // Do nothing \n                    break;\n                case VertexSortingOrder.Reverse:\n                    int size = vertexCount / 4;\n                    for (int i = 0; i < size; i++)\n                    {\n                        int src = i * 4;\n                        int dst = (size - i - 1) * 4;\n\n                        if (src < dst)\n                            SwapVertexData(src, dst);\n\n                    }\n                    break;\n                //case VertexSortingOrder.Depth:\n                //    break;\n\n            }\n        }\n\n\n        /// <summary>\n        /// Function to rearrange the quads of the text object to change their rendering order.\n        /// </summary>\n        /// <param name=\"sortingOrder\"></param>\n        public void SortGeometry(IList<int> sortingOrder)\n        {\n            // Make sure the sorting order array is not larger than the vertices array.\n            int indexCount = sortingOrder.Count;\n\n            if (indexCount * 4 > vertices.Length) return;\n\n            int src_index;\n\n            for (int dst_index = 0; dst_index < indexCount; dst_index++)\n            {\n                src_index = sortingOrder[dst_index];\n\n                while (src_index < dst_index)\n                {\n                    src_index = sortingOrder[src_index];\n                }\n\n                // Swap items\n                if (src_index != dst_index)\n                    SwapVertexData(src_index * 4, dst_index * 4);\n\n                //Debug.Log(\"Swap element [\" + dst_index + \"] with [\" + src_index + \"]. Vertex[\" + dst_index + \"] is \" + vertices[dst_index * 4].z);\n            }\n        }\n\n\n        /// <summary>\n        /// Method to swap the vertex attributes between src and dst quads.\n        /// </summary>\n        /// <param name=\"src\">Index of the first vertex attribute of the source character / quad.</param>\n        /// <param name=\"dst\">Index of the first vertex attribute of the destination character / quad.</param>\n        public void SwapVertexData(int src, int dst)\n        {\n            int src_Index = src; //  * 4;\n            int dst_Index = dst; // * 4;\n\n            // Swap vertices\n            Vector3 vertex;\n            vertex = vertices[dst_Index + 0];\n            vertices[dst_Index + 0] = vertices[src_Index + 0];\n            vertices[src_Index + 0] = vertex;\n\n            vertex = vertices[dst_Index + 1];\n            vertices[dst_Index + 1] = vertices[src_Index + 1];\n            vertices[src_Index + 1] = vertex;\n\n            vertex = vertices[dst_Index + 2];\n            vertices[dst_Index + 2] = vertices[src_Index + 2];\n            vertices[src_Index + 2] = vertex;\n\n            vertex = vertices[dst_Index + 3];\n            vertices[dst_Index + 3] = vertices[src_Index + 3];\n            vertices[src_Index + 3] = vertex;\n\n\n            //Swap UVs0\n            Vector2 uvs;\n            uvs = uvs0[dst_Index + 0];\n            uvs0[dst_Index + 0] = uvs0[src_Index + 0];\n            uvs0[src_Index + 0] = uvs;\n\n            uvs = uvs0[dst_Index + 1];\n            uvs0[dst_Index + 1] = uvs0[src_Index + 1];\n            uvs0[src_Index + 1] = uvs;\n\n            uvs = uvs0[dst_Index + 2];\n            uvs0[dst_Index + 2] = uvs0[src_Index + 2];\n            uvs0[src_Index + 2] = uvs;\n\n            uvs = uvs0[dst_Index + 3];\n            uvs0[dst_Index + 3] = uvs0[src_Index + 3];\n            uvs0[src_Index + 3] = uvs;\n\n            // Swap UVs2\n            uvs = uvs2[dst_Index + 0];\n            uvs2[dst_Index + 0] = uvs2[src_Index + 0];\n            uvs2[src_Index + 0] = uvs;\n\n            uvs = uvs2[dst_Index + 1];\n            uvs2[dst_Index + 1] = uvs2[src_Index + 1];\n            uvs2[src_Index + 1] = uvs;\n\n            uvs = uvs2[dst_Index + 2];\n            uvs2[dst_Index + 2] = uvs2[src_Index + 2];\n            uvs2[src_Index + 2] = uvs;\n\n            uvs = uvs2[dst_Index + 3];\n            uvs2[dst_Index + 3] = uvs2[src_Index + 3];\n            uvs2[src_Index + 3] = uvs;\n\n            // Vertex Colors\n            Color32 color;\n            color = colors32[dst_Index + 0];\n            colors32[dst_Index + 0] = colors32[src_Index + 0];\n            colors32[src_Index + 0] = color;\n\n            color = colors32[dst_Index + 1];\n            colors32[dst_Index + 1] = colors32[src_Index + 1];\n            colors32[src_Index + 1] = color;\n\n            color = colors32[dst_Index + 2];\n            colors32[dst_Index + 2] = colors32[src_Index + 2];\n            colors32[src_Index + 2] = color;\n\n            color = colors32[dst_Index + 3];\n            colors32[dst_Index + 3] = colors32[src_Index + 3];\n            colors32[src_Index + 3] = color;\n        }\n\n\n        //int Partition (int start, int end)\n        //{\n        //    float pivot = vertices[end].z;\n\n        //    int partitionIndex = start;\n        //    for (int i = start; i < end; i++)\n        //    {\n        //        if (vertices[i].z <= pivot)\n        //        {\n        //            Swap(vertices[i], vertices[partitionIndex]);\n        //            partitionIndex += 1;\n        //        }\n        //    }\n        //    Swap(vertices[partitionIndex], vertices[end]);\n        //    return partitionIndex;\n        //}\n\n\n        //void Swap(Vector3 a, Vector3 b)\n        //{\n        //    Vector3 temp = a;\n        //    a = b;\n        //    b = a;\n        //}\n\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_MeshInfo.cs.meta",
    "content": "fileFormatVersion: 2\nguid: e21bec35f48a44298911b25ead550ce3\ntimeCreated: 1462398762\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_ObjectPool.cs",
    "content": "﻿using System.Collections.Generic;\nusing UnityEngine;\nusing UnityEngine.Events;\n\n\nnamespace TMPro\n{\n\n    internal class TMP_ObjectPool<T> where T : new()\n    {\n        private readonly Stack<T> m_Stack = new Stack<T>();\n        private readonly UnityAction<T> m_ActionOnGet;\n        private readonly UnityAction<T> m_ActionOnRelease;\n\n        public int countAll { get; private set; }\n        public int countActive { get { return countAll - countInactive; } }\n        public int countInactive { get { return m_Stack.Count; } }\n\n        public TMP_ObjectPool(UnityAction<T> actionOnGet, UnityAction<T> actionOnRelease)\n        {\n            m_ActionOnGet = actionOnGet;\n            m_ActionOnRelease = actionOnRelease;\n        }\n\n        public T Get()\n        {\n            T element;\n            if (m_Stack.Count == 0)\n            {\n                element = new T();\n                countAll++;\n            }\n            else\n            {\n                element = m_Stack.Pop();\n            }\n            if (m_ActionOnGet != null)\n                m_ActionOnGet(element);\n            return element;\n        }\n\n        public void Release(T element)\n        {\n            if (m_Stack.Count > 0 && ReferenceEquals(m_Stack.Peek(), element))\n                Debug.LogError(\"Internal error. Trying to destroy object that is already released to pool.\");\n            if (m_ActionOnRelease != null)\n                m_ActionOnRelease(element);\n            m_Stack.Push(element);\n        }\n    }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_ObjectPool.cs.meta",
    "content": "fileFormatVersion: 2\nguid: e69259f6ff914146ad610be5491eb44a\ntimeCreated: 1458521389\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_PackageResourceImporter.cs",
    "content": "﻿#if UNITY_EDITOR\n\nusing System;\nusing System.IO;\nusing UnityEngine;\nusing UnityEditor;\n \n\nnamespace TMPro\n{\n    [System.Serializable]\n    public class TMP_PackageResourceImporter\n    {\n        bool m_EssentialResourcesImported;\n        bool m_ExamplesAndExtrasResourcesImported;\n        internal bool m_IsImportingExamples;\n\n        public TMP_PackageResourceImporter() { }\n\n        public void OnDestroy()\n        {\n        }\n\n        public void OnGUI()\n        {\n            // Check if the resources state has changed.\n            m_EssentialResourcesImported = Directory.Exists(\"Assets/TextMesh Pro\");\n            m_ExamplesAndExtrasResourcesImported = Directory.Exists(\"Assets/TextMesh Pro/Examples & Extras\");\n\n            GUILayout.BeginVertical();\n            {\n                // Display options to import Essential resources\n                GUILayout.BeginVertical(EditorStyles.helpBox);\n                {\n                    GUILayout.Label(\"TMP Essentials\", EditorStyles.boldLabel);\n                    GUILayout.Label(\"This appears to be the first time you access TextMesh Pro, as such we need to add resources to your project that are essential for using TextMesh Pro. These new resources will be placed at the root of your project in the \\\"TextMesh Pro\\\" folder.\", new GUIStyle(EditorStyles.label) { wordWrap = true } );\n                    GUILayout.Space(5f);\n\n                    GUI.enabled = !m_EssentialResourcesImported;\n                    if (GUILayout.Button(\"Import TMP Essentials\"))\n                    {\n                        AssetDatabase.importPackageCompleted += ImportCallback;\n\n                        string packageFullPath = GetPackageFullPath();\n                        AssetDatabase.ImportPackage(packageFullPath + \"/Package Resources/TMP Essential Resources.unitypackage\", false);\n                    }\n                    GUILayout.Space(5f);\n                    GUI.enabled = true;\n                }\n                GUILayout.EndVertical();\n\n                // Display options to import Examples & Extras\n                GUILayout.BeginVertical(EditorStyles.helpBox);\n                {\n                    GUILayout.Label(\"TMP Examples & Extras\", EditorStyles.boldLabel);\n                    GUILayout.Label(\"The Examples & Extras package contains addition resources and examples that will make discovering and learning about TextMesh Pro's powerful features easier. These additional resources will be placed in the same folder as the TMP essential resources.\", new GUIStyle(EditorStyles.label) { wordWrap = true });\n                    GUILayout.Space(5f);\n\n                    GUI.enabled = m_EssentialResourcesImported && !m_ExamplesAndExtrasResourcesImported;\n                    if (GUILayout.Button(\"Import TMP Examples & Extras\"))\n                    {\n                        // Set flag to get around importing scripts as per of this package which results in an assembly reload which in turn prevents / clears any callbacks.\n                        m_IsImportingExamples = true;\n\n                        var packageFullPath = GetPackageFullPath();\n                        AssetDatabase.ImportPackage(packageFullPath + \"/Package Resources/TMP Examples & Extras.unitypackage\", false);\n                    }\n                    GUILayout.Space(5f);\n                    GUI.enabled = true;\n                }\n                GUILayout.EndVertical();\n            }\n            GUILayout.EndVertical();\n            GUILayout.Space(5f);\n        }\n\n        internal void RegisterResourceImportCallback()\n        {\n            AssetDatabase.importPackageCompleted += ImportCallback;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"packageName\"></param>\n        void ImportCallback(string packageName)\n        {\n            if (packageName == \"TMP Essential Resources\")\n            {\n                m_EssentialResourcesImported = true;\n                TMPro_EventManager.ON_RESOURCES_LOADED();\n\n                #if UNITY_2018_3_OR_NEWER\n                SettingsService.NotifySettingsProviderChanged();\n                #endif\n            }\n            else if (packageName == \"TMP Examples & Extras\")\n            {\n                m_ExamplesAndExtrasResourcesImported = true;\n                m_IsImportingExamples = false;\n            }\n\n            Debug.Log(\"[\" + packageName + \"] have been imported.\");\n\n            AssetDatabase.importPackageCompleted -= ImportCallback;\n        }\n\n        static string GetPackageFullPath()\n        {\n            // Check for potential UPM package\n            string packagePath = Path.GetFullPath(\"Packages/com.unity.textmeshpro\");\n            if (Directory.Exists(packagePath))\n            {\n                return packagePath;\n            }\n\n            packagePath = Path.GetFullPath(\"Assets/..\");\n            if (Directory.Exists(packagePath))\n            {\n                // Search default location for development package\n                if (Directory.Exists(packagePath + \"/Assets/Packages/com.unity.TextMeshPro/Editor Resources\"))\n                {\n                    return packagePath + \"/Assets/Packages/com.unity.TextMeshPro\";\n                }\n\n                // Search for default location of normal TextMesh Pro AssetStore package\n                if (Directory.Exists(packagePath + \"/Assets/TextMesh Pro/Editor Resources\"))\n                {\n                    return packagePath + \"/Assets/TextMesh Pro\";\n                }\n\n                // Search for potential alternative locations in the user project\n                string[] matchingPaths = Directory.GetDirectories(packagePath, \"TextMesh Pro\", SearchOption.AllDirectories);\n                string path = ValidateLocation(matchingPaths, packagePath);\n                if (path != null) return packagePath + path;\n            }\n\n            return null;\n        }\n\n        static string ValidateLocation(string[] paths, string projectPath)\n        {\n            for (int i = 0; i < paths.Length; i++)\n            {\n                // Check if the Editor Resources folder exists.\n                if (Directory.Exists(paths[i] + \"/Editor Resources\"))\n                {\n                    string folderPath = paths[i].Replace(projectPath, \"\");\n                    folderPath = folderPath.TrimStart('\\\\', '/');\n                    return folderPath;\n                }\n            }\n\n            return null;\n        }\n    }\n\n    public class TMP_PackageResourceImporterWindow : EditorWindow\n    {\n        [SerializeField]\n        TMP_PackageResourceImporter m_ResourceImporter;\n\n        public static void ShowPackageImporterWindow()\n        {\n            var window = GetWindow<TMP_PackageResourceImporterWindow>();\n            window.titleContent = new GUIContent(\"TMP Importer\");\n            window.Focus();\n        }\n\n        void OnEnable()\n        {\n            // Set Editor Window Size\n            SetEditorWindowSize();\n\n            if (m_ResourceImporter == null)\n                m_ResourceImporter = new TMP_PackageResourceImporter();\n\n            if (m_ResourceImporter.m_IsImportingExamples)\n                m_ResourceImporter.RegisterResourceImportCallback();\n        }\n\n        void OnDestroy()\n        {\n            m_ResourceImporter.OnDestroy();\n        }\n\n        void OnGUI()\n        {\n            m_ResourceImporter.OnGUI();\n        }\n\n        void OnInspectorUpdate()\n        {\n            Repaint();\n        }\n        \n        /// <summary>\n        /// Limits the minimum size of the editor window.\n        /// </summary>\n        void SetEditorWindowSize()\n        {\n            EditorWindow editorWindow = this;\n\n            Vector2 windowSize = new Vector2(640, 210);\n            editorWindow.minSize = windowSize;\n            editorWindow.maxSize = windowSize;\n        }\n    }\n\n}\n\n#endif\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_PackageResourceImporter.cs.meta",
    "content": "fileFormatVersion: 2\nguid: cf1fe50a641faac4691bf49eb32ce333\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences:\n  - m_PersistentViewDataDictionary: {instanceID: 0}\n  - LightSkin: {fileID: 11400000, guid: 0c156a7b2f4d450da1716b1625b5441d, type: 2}\n  - DarkSkin: {fileID: 11400000, guid: 9d345c3252c147c89e8b61a249a46a9d, type: 2}\n  - TMPEssentials: {fileID: 102900000, guid: ce4ff17ca867d2b48b5c8a4181611901, type: 3}\n  - TMPExamples: {fileID: 102900000, guid: bc00e25696e4132499f56528d3fed2e3, type: 3}\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_RichTextTagStack.cs",
    "content": "﻿namespace TMPro\n{\n    /// <summary>\n    /// Structure used to track basic XML tags which are binary (on / off)\n    /// </summary>\n    public struct TMP_FontStyleStack\n    {\n        public byte bold;\n        public byte italic;\n        public byte underline;\n        public byte strikethrough;\n        public byte highlight;\n        public byte superscript;\n        public byte subscript;\n        public byte uppercase;\n        public byte lowercase;\n        public byte smallcaps;\n\n        /// <summary>\n        /// Clear the basic XML tag stack.\n        /// </summary>\n        public void Clear()\n        {\n            bold = 0;\n            italic = 0;\n            underline = 0;\n            strikethrough = 0;\n            highlight = 0;\n            superscript = 0;\n            subscript = 0;\n            uppercase = 0;\n            lowercase = 0;\n            smallcaps = 0;\n        }\n\n        public byte Add(FontStyles style)\n        {\n            switch (style)\n            {\n                case FontStyles.Bold:\n                    bold++;\n                    return bold;\n                case FontStyles.Italic:\n                    italic++;\n                    return italic;\n                case FontStyles.Underline:\n                    underline++;\n                    return underline;\n                case FontStyles.Strikethrough:\n                    strikethrough++;\n                    return strikethrough;\n                case FontStyles.Superscript:\n                    superscript++;\n                    return superscript;\n                case FontStyles.Subscript:\n                    subscript++;\n                    return subscript;\n                case FontStyles.Highlight:\n                    highlight++;\n                    return highlight;\n            }\n\n            return 0;\n        }\n\n        public byte Remove(FontStyles style)\n        {\n            switch (style)\n            {\n                case FontStyles.Bold:\n                    if (bold > 1)\n                        bold--;\n                    else\n                        bold = 0;\n                    return bold;\n                case FontStyles.Italic:\n                    if (italic > 1)\n                        italic--;\n                    else\n                        italic = 0;\n                    return italic;\n                case FontStyles.Underline:\n                    if (underline > 1)\n                        underline--;\n                    else\n                        underline = 0;\n                    return underline;\n                case FontStyles.Strikethrough:\n                    if (strikethrough > 1)\n                        strikethrough--;\n                    else\n                        strikethrough = 0;\n                    return strikethrough;\n                case FontStyles.Highlight:\n                    if (highlight > 1)\n                        highlight--;\n                    else\n                        highlight = 0;\n                    return highlight;\n                case FontStyles.Superscript:\n                    if (superscript > 1)\n                        superscript--;\n                    else\n                        superscript = 0;\n                    return superscript;\n                case FontStyles.Subscript:\n                    if (subscript > 1)\n                        subscript--;\n                    else\n                        subscript = 0;\n                    return subscript;\n            }\n\n            return 0;\n        }\n    }\n\n\n    /// <summary>\n    /// Structure used to track XML tags of various types.\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    public struct TMP_RichTextTagStack<T>\n    {\n        public T[] m_ItemStack;\n        public int m_Index;\n        private int m_Capacity;\n\n        private T m_DefaultItem;\n\n        private const int k_DefaultCapacity = 4;\n        //static readonly T[] m_EmptyStack = new T[0];\n\n        /// <summary>\n        /// Constructor to create a new item stack.\n        /// </summary>\n        /// <param name=\"tagStack\"></param>\n        public TMP_RichTextTagStack(T[] tagStack)\n        {\n            m_ItemStack = tagStack;\n            m_Capacity = tagStack.Length;\n            m_Index = 0;\n\n            m_DefaultItem = default(T);\n        }\n\n        /// <summary>\n        /// Constructor for a new item stack with the given capacity.\n        /// </summary>\n        /// <param name=\"capacity\"></param>\n        public TMP_RichTextTagStack(int capacity)\n        {\n            m_ItemStack = new T[capacity];\n            m_Capacity = capacity;\n            m_Index = 0;\n\n            m_DefaultItem = default(T);\n        }\n\n\n        /// <summary>\n        /// Function to clear and reset stack to first item.\n        /// </summary>\n        public void Clear()\n        {\n            m_Index = 0;\n        }\n\n\n        /// <summary>\n        /// Function to set the first item on the stack and reset index.\n        /// </summary>\n        /// <param name=\"item\"></param>\n        public void SetDefault(T item)\n        {\n            m_ItemStack[0] = item;\n            m_Index = 1;\n        }\n\n\n        /// <summary>\n        /// Function to add a new item to the stack.\n        /// </summary>\n        /// <param name=\"item\"></param>\n        public void Add(T item)\n        {\n            if (m_Index < m_ItemStack.Length)\n            {\n                m_ItemStack[m_Index] = item;\n                m_Index += 1;\n            }\n        }\n\n\n        /// <summary>\n        /// Function to retrieve an item from the stack.\n        /// </summary>\n        /// <returns></returns>\n        public T Remove()\n        {\n            m_Index -= 1;\n\n            if (m_Index <= 0)\n            {\n                m_Index = 1;\n                return m_ItemStack[0];\n\n            }\n\n            return m_ItemStack[m_Index - 1];\n        }\n\n        public void Push(T item)\n        {\n            if (m_Index == m_Capacity)\n            {\n                m_Capacity *= 2;\n                if (m_Capacity == 0)\n                    m_Capacity = k_DefaultCapacity;\n\n                System.Array.Resize(ref m_ItemStack, m_Capacity);\n            }\n\n            m_ItemStack[m_Index] = item;\n            m_Index += 1;\n        }\n\n        public T Pop()\n        {\n            if (m_Index == 0)\n                return default(T);\n\n            m_Index -= 1;\n            T item = m_ItemStack[m_Index];\n            m_ItemStack[m_Index] = m_DefaultItem;\n\n            return item;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        public T Peek()\n        {\n            if (m_Index == 0)\n                return m_DefaultItem;\n\n            return m_ItemStack[m_Index - 1];\n        }\n\n\n        /// <summary>\n        /// Function to retrieve the current item from the stack.\n        /// </summary>\n        /// <returns>itemStack <T></returns>\n        public T CurrentItem()\n        {\n            if (m_Index > 0)\n                return m_ItemStack[m_Index - 1];\n\n            return m_ItemStack[0];\n        }\n\n\n        /// <summary>\n        /// Function to retrieve the previous item without affecting the stack.\n        /// </summary>\n        /// <returns></returns>\n        public T PreviousItem()\n        {\n            if (m_Index > 1)\n                return m_ItemStack[m_Index - 2];\n\n            return m_ItemStack[0];\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_RichTextTagStack.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 20a9b557a46149dfbfa04a3a7080f5aa\ntimeCreated: 1448242247\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_RichTextTagsCommon.cs",
    "content": "﻿using System;\nusing UnityEngine.Bindings;\n\n\nnamespace TMPro\n{\n    /// <summary>\n    /// Rich Text Tags and Attribute definitions and their respective HashCode values.\n    /// </summary>\n    enum RichTextTag : uint\n    {\n        // Rich Text Tags\n        BOLD = 66,                      // <b>\n        SLASH_BOLD = 1613,              // </b>\n        ITALIC = 73,                    // <i>\n        SLASH_ITALIC = 1606,            // </i>\n        UNDERLINE = 85,                 // <u>\n        SLASH_UNDERLINE = 1626,         // </u>\n        STRIKETHROUGH = 83,             // <s>\n        SLASH_STRIKETHROUGH = 1628,     // </s>\n        COLOR = 81999901,               // <color>\n        SLASH_COLOR = 1909026194,       // </color>\n        SIZE = 3061285,                 // <size>\n        SLASH_SIZE = 58429962,          // </size>\n        SPRITE = 3303439849,            // <sprite>\n        BR = 2256,                      // <br>\n        STYLE = 100252951,              // <style>\n        SLASH_STYLE = 1927738392,       // </style>\n        FONT = 2586451,                 // <font>\n        SLASH_FONT = 57747708,          // </font>\n        LINK = 2656128,                 // <link>\n        SLASH_LINK = 57686191,          // </link>\n        FONT_WEIGHT = 2405071134,       // <font-weight=xxx>\n        SLASH_FONT_WEIGHT = 3536990865, // </font-weight>\n\n\n        // Font Features\n        LIGA = 2655971,                 // <liga>\n        SLASH_LIGA = 57686604,          // </liga>\n        FRAC = 2598518,                 // <frac>\n        SLASH_FRAC = 57774681,          // </frac>\n\n        // Attributes\n        NAME = 2875623,                 // <sprite name=\"Name of Sprite\">\n        INDEX = 84268030,               // <sprite index=7>\n        TINT = 2960519,                 // <tint=bool>\n        ANIM = 2283339,                 // <anim=\"first frame, last frame, frame rate\">\n        MATERIAL = 825491659,           // <font=\"Name of font asset\" material=\"Name of material\">\n\n        // Named Colors\n        RED = 91635,\n        GREEN = 87065851,\n        BLUE = 2457214,\n        YELLOW = 3412522628,\n        ORANGE = 3186379376,\n\n        // Prefix and Unit suffix\n        PLUS = 43,\n        MINUS = 45,\n        PX = 2568,\n        PLUS_PX = 49507,\n        MINUS_PX = 47461,\n        EM = 2216,\n        PLUS_EM = 49091,\n        MINUS_EM = 46789,\n        PCT = 85031,\n        PLUS_PCT = 1634348,\n        MINUS_PCT = 1567082,\n        PERCENTAGE = 37,\n        PLUS_PERCENTAGE = 1454,\n        MINUS_PERCENTAGE = 1512,\n\n        TRUE = 2932022,\n        FALSE = 85422813,\n\n        DEFAULT = 3673993291,           // <font=\"Default\">\n\n    };\n\n    /// <summary>\n    /// Defines the type of value used by a rich text tag or tag attribute.\n    /// </summary>\n    public enum TagValueType\n    {\n        None            = 0x0,\n        NumericalValue  = 0x1,\n        StringValue     = 0x2,\n        ColorValue      = 0x4,\n    }\n\n    public enum TagUnitType\n    {\n        Pixels      = 0x0,\n        FontUnits   = 0x1,\n        Percentage  = 0x2,\n    }\n\n    /// <summary>\n    /// Commonly referenced Unicode characters in the text generation process.\n    /// </summary>\n    enum UnicodeCharacter : uint\n    {\n        HYPHEN_MINUS = 0x2D,\n        SOFT_HYPHEN = 0xAD,\n        HYPHEN = 0x2010,\n        NON_BREAKING_HYPHEN = 0x2011,\n        ZERO_WIDTH_SPACE = 0x200B,\n        RIGHT_SINGLE_QUOTATION = 0x2019,\n        APOSTROPHE = 0x27,\n        WORD_JOINER = 0x2060,           // Prohibits line break.\n\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_RichTextTagsCommon.cs.meta",
    "content": "fileFormatVersion: 2\nguid: b458b2c7f196bdc4581b2f9fd6a5d931\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_ScrollbarEventHandler.cs",
    "content": "﻿using UnityEngine;\nusing UnityEngine.Events;\nusing UnityEngine.EventSystems;\nusing System;\n\n\nnamespace TMPro\n{\n\n    public class TMP_ScrollbarEventHandler : MonoBehaviour, IPointerClickHandler, ISelectHandler, IDeselectHandler\n    {\n        public bool isSelected;\n\n        public void OnPointerClick(PointerEventData eventData)\n        {\n            Debug.Log(\"Scrollbar click...\");\n        }\n\n        public void OnSelect(BaseEventData eventData)\n        {\n            Debug.Log(\"Scrollbar selected\");\n            isSelected = true;\n        }\n\n        public void OnDeselect(BaseEventData eventData)\n        {\n            Debug.Log(\"Scrollbar De-Selected\");\n            isSelected = false;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_ScrollbarEventHandler.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 34e150112c1c42ac83170b52d898e322\ntimeCreated: 1484171293\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_SelectionCaret.cs",
    "content": "﻿using UnityEngine;\nusing UnityEngine.UI;\n\n\nnamespace TMPro\n{\n    /// <summary>\n    /// A simple component that can be added to a newly created object where inheriting from MaskableGraphic is needed.\n    /// </summary>\n    public class TMP_SelectionCaret : MaskableGraphic\n    {\n\n        /// <summary>\n        /// Override to Cull function of MaskableGraphic to prevent Culling.\n        /// </summary>\n        /// <param name=\"clipRect\"></param>\n        /// <param name=\"validRect\"></param>\n        public override void Cull(Rect clipRect, bool validRect)\n        {\n            //base.Cull(clipRect, validRect);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_SelectionCaret.cs.meta",
    "content": "fileFormatVersion: 2\nguid: ca819640f53b48919bf7774744f7f15e\ntimeCreated: 1477609203\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_Settings.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections;\nusing System.Collections.Generic;\n\n\n#pragma warning disable 0649 // Disabled warnings related to serialized fields not assigned in this script but used in the editor.\n\nnamespace TMPro\n{\n    [System.Serializable]\n    public class TMP_Settings : ScriptableObject\n    {\n        private static TMP_Settings s_Instance;\n\n        /// <summary>\n        /// Returns the release version of the product.\n        /// </summary>\n        public static string version\n        {\n            get { return \"1.4.0\"; }\n        }\n\n        /// <summary>\n        /// Controls if Word Wrapping will be enabled on newly created text objects by default.\n        /// </summary>\n        public static bool enableWordWrapping\n        {\n            get { return instance.m_enableWordWrapping; }\n        }\n        [SerializeField]\n        private bool m_enableWordWrapping;\n\n        /// <summary>\n        /// Controls if Kerning is enabled on newly created text objects by default.\n        /// </summary>\n        public static bool enableKerning\n        {\n            get { return instance.m_enableKerning; }\n        }\n        [SerializeField]\n        private bool m_enableKerning;\n\n        /// <summary>\n        /// Controls if Extra Padding is enabled on newly created text objects by default.\n        /// </summary>\n        public static bool enableExtraPadding\n        {\n            get { return instance.m_enableExtraPadding; }\n        }\n        [SerializeField]\n        private bool m_enableExtraPadding;\n\n        /// <summary>\n        /// Controls if TintAllSprites is enabled on newly created text objects by default.\n        /// </summary>\n        public static bool enableTintAllSprites\n        {\n            get { return instance.m_enableTintAllSprites; }\n        }\n        [SerializeField]\n        private bool m_enableTintAllSprites;\n\n        /// <summary>\n        /// Controls if Escape Characters will be parsed in the Text Input Box on newly created text objects.\n        /// </summary>\n        public static bool enableParseEscapeCharacters\n        {\n            get { return instance.m_enableParseEscapeCharacters; }\n        }\n        [SerializeField]\n        private bool m_enableParseEscapeCharacters;\n\n        /// <summary>\n        /// Controls if Raycast Target is enabled by default on newly created text objects.\n        /// </summary>\n        public static bool enableRaycastTarget\n        {\n            get { return instance.m_EnableRaycastTarget; }\n        }\n        [SerializeField]\n        private bool m_EnableRaycastTarget = true;\n\n        /// <summary>\n        /// Determines if OpenType Font Features should be retrieved at runtime from the source font file.\n        /// </summary>\n        public static bool getFontFeaturesAtRuntime\n        {\n            get { return instance.m_GetFontFeaturesAtRuntime; }\n        }\n        [SerializeField]\n        private bool m_GetFontFeaturesAtRuntime = true;\n\n        /// <summary>\n        /// The character that will be used as a replacement for missing glyphs in a font asset.\n        /// </summary>\n        public static int missingGlyphCharacter\n        {\n            get { return instance.m_missingGlyphCharacter; }\n            set { instance.m_missingGlyphCharacter = value; }\n        }\n        [SerializeField]\n        private int m_missingGlyphCharacter;\n\n        /// <summary>\n        /// Controls the display of warning message in the console.\n        /// </summary>\n        public static bool warningsDisabled\n        {\n            get { return instance.m_warningsDisabled; }\n        }\n        [SerializeField]\n        private bool m_warningsDisabled;\n\n        /// <summary>\n        /// Returns the Default Font Asset to be used by newly created text objects.\n        /// </summary>\n        public static TMP_FontAsset defaultFontAsset\n        {\n            get { return instance.m_defaultFontAsset; }\n        }\n        [SerializeField]\n        private TMP_FontAsset m_defaultFontAsset;\n\n        /// <summary>\n        /// The relative path to a Resources folder in the project.\n        /// </summary>\n        public static string defaultFontAssetPath\n        {\n            get { return instance.m_defaultFontAssetPath; }\n        }\n        [SerializeField]\n        private string m_defaultFontAssetPath;\n\n        /// <summary>\n        /// The Default Point Size of newly created text objects.\n        /// </summary>\n        public static float defaultFontSize\n        {\n            get { return instance.m_defaultFontSize; }\n        }\n        [SerializeField]\n        private float m_defaultFontSize;\n\n        /// <summary>\n        /// The multiplier used to computer the default Min point size when Text Auto Sizing is used.\n        /// </summary>\n        public static float defaultTextAutoSizingMinRatio\n        {\n            get { return instance.m_defaultAutoSizeMinRatio; }\n        }\n        [SerializeField]\n        private float m_defaultAutoSizeMinRatio;\n\n        /// <summary>\n        /// The multiplier used to computer the default Max point size when Text Auto Sizing is used.\n        /// </summary>\n        public static float defaultTextAutoSizingMaxRatio\n        {\n            get { return instance.m_defaultAutoSizeMaxRatio; }\n        }\n        [SerializeField]\n        private float m_defaultAutoSizeMaxRatio;\n\n        /// <summary>\n        /// The Default Size of the Text Container of a TextMeshPro object.\n        /// </summary>\n        public static Vector2 defaultTextMeshProTextContainerSize\n        {\n            get { return instance.m_defaultTextMeshProTextContainerSize; }\n        }\n        [SerializeField]\n        private Vector2 m_defaultTextMeshProTextContainerSize;\n\n        /// <summary>\n        /// The Default Width of the Text Container of a TextMeshProUI object.\n        /// </summary>\n        public static Vector2 defaultTextMeshProUITextContainerSize\n        {\n            get { return instance.m_defaultTextMeshProUITextContainerSize; }\n        }\n        [SerializeField]\n        private Vector2 m_defaultTextMeshProUITextContainerSize;\n\n        /// <summary>\n        /// Set the size of the text container of newly created text objects to match the size of the text.\n        /// </summary>\n        public static bool autoSizeTextContainer\n        {\n            get { return instance.m_autoSizeTextContainer; }\n        }\n        [SerializeField]\n        private bool m_autoSizeTextContainer;\n\n        /// <summary>\n        /// Returns the list of Fallback Fonts defined in the TMP Settings file.\n        /// </summary>\n        public static List<TMP_FontAsset> fallbackFontAssets\n        {\n            get { return instance.m_fallbackFontAssets; }\n        }\n        [SerializeField]\n        private List<TMP_FontAsset> m_fallbackFontAssets;\n\n        /// <summary>\n        /// Controls whether or not TMP will create a matching material preset or use the default material of the fallback font asset.\n        /// </summary>\n        public static bool matchMaterialPreset\n        {\n            get { return instance.m_matchMaterialPreset; }\n        }\n        [SerializeField]\n        private bool m_matchMaterialPreset;\n\n        /// <summary>\n        /// The Default Sprite Asset to be used by default.\n        /// </summary>\n        public static TMP_SpriteAsset defaultSpriteAsset\n        {\n            get { return instance.m_defaultSpriteAsset; }\n        }\n        [SerializeField]\n        private TMP_SpriteAsset m_defaultSpriteAsset;\n\n        /// <summary>\n        /// The relative path to a Resources folder in the project.\n        /// </summary>\n        public static string defaultSpriteAssetPath\n        {\n            get { return instance.m_defaultSpriteAssetPath; }\n        }\n        [SerializeField]\n        private string m_defaultSpriteAssetPath;\n\n        /// <summary>\n        /// The relative path to a Resources folder in the project that contains Color Gradient Presets.\n        /// </summary>\n        public static string defaultColorGradientPresetsPath\n        {\n            get { return instance.m_defaultColorGradientPresetsPath; }\n        }\n        [SerializeField]\n        private string m_defaultColorGradientPresetsPath;\n\n        /// <summary>\n        /// Determines if Emoji support is enabled in the Input Field TouchScreenKeyboard.\n        /// </summary>\n        public static bool enableEmojiSupport\n        {\n            get { return instance.m_enableEmojiSupport; }\n            set { instance.m_enableEmojiSupport = value; }\n        }\n        [SerializeField]\n        private bool m_enableEmojiSupport;\n\n        /// <summary>\n        /// The Default Style Sheet used by the text objects.\n        /// </summary>\n        public static TMP_StyleSheet defaultStyleSheet\n        {\n            get { return instance.m_defaultStyleSheet; }\n        }\n        [SerializeField]\n        private TMP_StyleSheet m_defaultStyleSheet;\n\n        /// <summary>\n        /// Text file that contains the leading characters used for line breaking for Asian languages.\n        /// </summary>\n        public static TextAsset leadingCharacters\n        {\n            get { return instance.m_leadingCharacters; }\n        }\n        [SerializeField]\n        private TextAsset m_leadingCharacters;\n\n        /// <summary>\n        /// Text file that contains the following characters used for line breaking for Asian languages.\n        /// </summary>\n        public static TextAsset followingCharacters\n        {\n            get { return instance.m_followingCharacters; }\n        }\n        [SerializeField]\n        private TextAsset m_followingCharacters;\n\n        /// <summary>\n        /// \n        /// </summary>\n        public static LineBreakingTable linebreakingRules\n        {\n            get\n            {\n                if (instance.m_linebreakingRules == null)\n                    LoadLinebreakingRules();\n\n                return instance.m_linebreakingRules;\n            }\n        }\n        [SerializeField]\n        private LineBreakingTable m_linebreakingRules;\n\n        /// <summary>\n        /// Get a singleton instance of the settings class.\n        /// </summary>\n        public static TMP_Settings instance\n        {\n            get\n            {\n                if (TMP_Settings.s_Instance == null)\n                {\n                    TMP_Settings.s_Instance = Resources.Load<TMP_Settings>(\"TMP Settings\");\n\n                    #if UNITY_EDITOR\n                    // Make sure TextMesh Pro UPM packages resources have been added to the user project\n                    if (TMP_Settings.s_Instance == null)\n                    {\n                        // Open TMP Resources Importer\n                        TMP_PackageResourceImporterWindow.ShowPackageImporterWindow();\n                    }\n                    #endif\n                }\n\n                return TMP_Settings.s_Instance;\n            }\n        }\n\n\n        /// <summary>\n        /// Static Function to load the TMP Settings file.\n        /// </summary>\n        /// <returns></returns>\n        public static TMP_Settings LoadDefaultSettings()\n        {\n            if (s_Instance == null)\n            {\n                // Load settings from TMP_Settings file\n                TMP_Settings settings = Resources.Load<TMP_Settings>(\"TMP Settings\");\n                if (settings != null)\n                    s_Instance = settings;\n            }\n\n            return s_Instance;\n        }\n\n\n        /// <summary>\n        /// Returns the Sprite Asset defined in the TMP Settings file.\n        /// </summary>\n        /// <returns></returns>\n        public static TMP_Settings GetSettings()\n        {\n            if (TMP_Settings.instance == null) return null;\n\n            return TMP_Settings.instance;\n        }\n\n\n        /// <summary>\n        /// Returns the Font Asset defined in the TMP Settings file.\n        /// </summary>\n        /// <returns></returns>\n        public static TMP_FontAsset GetFontAsset()\n        {\n            if (TMP_Settings.instance == null) return null;\n\n            return TMP_Settings.instance.m_defaultFontAsset;\n        }\n\n\n        /// <summary>\n        /// Returns the Sprite Asset defined in the TMP Settings file.\n        /// </summary>\n        /// <returns></returns>\n        public static TMP_SpriteAsset GetSpriteAsset()\n        {\n            if (TMP_Settings.instance == null) return null;\n\n            return TMP_Settings.instance.m_defaultSpriteAsset;\n        }\n\n\n        /// <summary>\n        /// Returns the Sprite Asset defined in the TMP Settings file.\n        /// </summary>\n        /// <returns></returns>\n        public static TMP_StyleSheet GetStyleSheet()\n        {\n            if (TMP_Settings.instance == null) return null;\n\n            return TMP_Settings.instance.m_defaultStyleSheet;\n        }\n\n\n        public static void LoadLinebreakingRules()\n        {\n            //Debug.Log(\"Loading Line Breaking Rules for Asian Languages.\");\n\n            if (TMP_Settings.instance == null) return;\n\n            if (s_Instance.m_linebreakingRules == null)\n                s_Instance.m_linebreakingRules = new LineBreakingTable();\n\n            s_Instance.m_linebreakingRules.leadingCharacters = GetCharacters(s_Instance.m_leadingCharacters);\n            s_Instance.m_linebreakingRules.followingCharacters = GetCharacters(s_Instance.m_followingCharacters);\n        }\n\n\n        /// <summary>\n        ///  Get the characters from the line breaking files\n        /// </summary>\n        /// <param name=\"file\"></param>\n        /// <returns></returns>\n        private static Dictionary<int, char> GetCharacters(TextAsset file)\n        {\n            Dictionary<int, char> dict = new Dictionary<int, char>();\n            string text = file.text;\n\n            for (int i = 0; i < text.Length; i++)\n            {\n                char c = text[i];\n                // Check to make sure we don't include duplicates\n                if (dict.ContainsKey((int)c) == false)\n                {\n                    dict.Add((int)c, c);\n                    //Debug.Log(\"Adding [\" + (int)c + \"] to dictionary.\");\n                }\n                //else\n                //    Debug.Log(\"Character [\" + text[i] + \"] is a duplicate.\");\n            }\n\n            return dict;\n        }\n\n\n        public class LineBreakingTable\n        {\n            public Dictionary<int, char> leadingCharacters;\n            public Dictionary<int, char> followingCharacters;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_Settings.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 2705215ac5b84b70bacc50632be6e391\ntimeCreated: 1457654851\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_ShaderUtilities.cs",
    "content": "﻿using UnityEngine;\nusing System.Linq;\nusing System.Collections;\n\n\nnamespace TMPro\n{\n    public static class ShaderUtilities\n    {\n        // Shader Property IDs\n        public static int ID_MainTex;\n\n        public static int ID_FaceTex;\n        public static int ID_FaceColor; \n        public static int ID_FaceDilate;\n        public static int ID_Shininess;\n\n        public static int ID_UnderlayColor;\n        public static int ID_UnderlayOffsetX; \n        public static int ID_UnderlayOffsetY; \n        public static int ID_UnderlayDilate;\n        public static int ID_UnderlaySoftness;\n\n        public static int ID_WeightNormal; \n        public static int ID_WeightBold;\n\n        public static int ID_OutlineTex;\n        public static int ID_OutlineWidth; \n        public static int ID_OutlineSoftness;\n        public static int ID_OutlineColor;\n\n        public static int ID_Padding;\n        public static int ID_GradientScale; \n        public static int ID_ScaleX; \n        public static int ID_ScaleY; \n        public static int ID_PerspectiveFilter;\n        public static int ID_Sharpness;\n\n        public static int ID_TextureWidth; \n        public static int ID_TextureHeight; \n\n        public static int ID_BevelAmount; \n\n        public static int ID_GlowColor; \n        public static int ID_GlowOffset;\n        public static int ID_GlowPower;  \n        public static int ID_GlowOuter; \n       \n        public static int ID_LightAngle;\n\n        public static int ID_EnvMap;\n        public static int ID_EnvMatrix;\n        public static int ID_EnvMatrixRotation;\n\n        //public static int ID_MaskID;\n        public static int ID_MaskCoord;\n        public static int ID_ClipRect; \n        public static int ID_MaskSoftnessX; \n        public static int ID_MaskSoftnessY; \n        public static int ID_VertexOffsetX; \n        public static int ID_VertexOffsetY;\n        public static int ID_UseClipRect;\n\n        public static int ID_StencilID;\n        public static int ID_StencilOp;\n        public static int ID_StencilComp;\n        public static int ID_StencilReadMask;\n        public static int ID_StencilWriteMask;\n        \n        public static int ID_ShaderFlags; \n        public static int ID_ScaleRatio_A;\n        public static int ID_ScaleRatio_B;\n        public static int ID_ScaleRatio_C;\n        \n        public static string Keyword_Bevel = \"BEVEL_ON\";\n        public static string Keyword_Glow = \"GLOW_ON\";\n        public static string Keyword_Underlay = \"UNDERLAY_ON\";\n        public static string Keyword_Ratios = \"RATIOS_OFF\";\n        //public static string Keyword_MASK_OFF = \"MASK_OFF\";\n        public static string Keyword_MASK_SOFT = \"MASK_SOFT\";\n        public static string Keyword_MASK_HARD = \"MASK_HARD\";\n        public static string Keyword_MASK_TEX = \"MASK_TEX\";\n        public static string Keyword_Outline = \"OUTLINE_ON\";\n\n        public static string ShaderTag_ZTestMode = \"unity_GUIZTestMode\";\n        public static string ShaderTag_CullMode = \"_CullMode\";\n\n        private static float m_clamp = 1.0f;\n        public static bool isInitialized = false;\n\n\n        /// <summary>\n        /// Returns a reference to the mobile distance field shader.\n        /// </summary>\n        internal static Shader ShaderRef_MobileSDF\n        {\n            get\n            {\n                if (k_ShaderRef_MobileSDF == null)\n                    k_ShaderRef_MobileSDF = Shader.Find(\"TextMeshPro/Mobile/Distance Field\");\n\n                return k_ShaderRef_MobileSDF;\n            }\n        }\n        static Shader k_ShaderRef_MobileSDF;\n\n        /// <summary>\n        /// Returns a reference to the mobile bitmap shader.\n        /// </summary>\n        internal static Shader ShaderRef_MobileBitmap\n        {\n            get\n            {\n                if (k_ShaderRef_MobileBitmap == null)\n                    k_ShaderRef_MobileBitmap = Shader.Find(\"TextMeshPro/Mobile/Bitmap\");\n\n                return k_ShaderRef_MobileBitmap;\n            }\n        }\n        static Shader k_ShaderRef_MobileBitmap;\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        static ShaderUtilities()\n        {\n            GetShaderPropertyIDs();\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        public static void GetShaderPropertyIDs()\n        {\n            if (isInitialized == false)\n            {\n                //Debug.Log(\"Getting Shader property IDs\");\n                isInitialized = true;\n\n                ID_MainTex = Shader.PropertyToID(\"_MainTex\");\n\n                ID_FaceTex = Shader.PropertyToID(\"_FaceTex\");\n                ID_FaceColor = Shader.PropertyToID(\"_FaceColor\");\n                ID_FaceDilate = Shader.PropertyToID(\"_FaceDilate\");\n                ID_Shininess = Shader.PropertyToID(\"_FaceShininess\");\n            \n                ID_UnderlayColor = Shader.PropertyToID(\"_UnderlayColor\");\n                ID_UnderlayOffsetX = Shader.PropertyToID(\"_UnderlayOffsetX\");\n                ID_UnderlayOffsetY = Shader.PropertyToID(\"_UnderlayOffsetY\");\n                ID_UnderlayDilate = Shader.PropertyToID(\"_UnderlayDilate\");\n                ID_UnderlaySoftness = Shader.PropertyToID(\"_UnderlaySoftness\");\n\n                ID_WeightNormal = Shader.PropertyToID(\"_WeightNormal\");\n                ID_WeightBold = Shader.PropertyToID(\"_WeightBold\");\n\n                ID_OutlineTex = Shader.PropertyToID(\"_OutlineTex\");\n                ID_OutlineWidth = Shader.PropertyToID(\"_OutlineWidth\");\n                ID_OutlineSoftness = Shader.PropertyToID(\"_OutlineSoftness\");\n                ID_OutlineColor = Shader.PropertyToID(\"_OutlineColor\");\n\n                ID_Padding = Shader.PropertyToID(\"_Padding\");\n                ID_GradientScale = Shader.PropertyToID(\"_GradientScale\");\n                ID_ScaleX = Shader.PropertyToID(\"_ScaleX\");\n                ID_ScaleY = Shader.PropertyToID(\"_ScaleY\");\n                ID_PerspectiveFilter = Shader.PropertyToID(\"_PerspectiveFilter\");\n                ID_Sharpness = Shader.PropertyToID(\"_Sharpness\");\n\n                ID_TextureWidth = Shader.PropertyToID(\"_TextureWidth\");\n                ID_TextureHeight = Shader.PropertyToID(\"_TextureHeight\");\n\n                ID_BevelAmount = Shader.PropertyToID(\"_Bevel\");\n\n                ID_LightAngle = Shader.PropertyToID(\"_LightAngle\");\n\n                ID_EnvMap = Shader.PropertyToID(\"_Cube\");\n                ID_EnvMatrix = Shader.PropertyToID(\"_EnvMatrix\");\n                ID_EnvMatrixRotation = Shader.PropertyToID(\"_EnvMatrixRotation\");\n\n\n                ID_GlowColor = Shader.PropertyToID(\"_GlowColor\");\n                ID_GlowOffset = Shader.PropertyToID(\"_GlowOffset\");\n                ID_GlowPower = Shader.PropertyToID(\"_GlowPower\");\n                ID_GlowOuter = Shader.PropertyToID(\"_GlowOuter\");\n\n                //ID_MaskID = Shader.PropertyToID(\"_MaskID\");\n                ID_MaskCoord = Shader.PropertyToID(\"_MaskCoord\");\n                ID_ClipRect = Shader.PropertyToID(\"_ClipRect\");\n                ID_UseClipRect = Shader.PropertyToID(\"_UseClipRect\");\n                ID_MaskSoftnessX = Shader.PropertyToID(\"_MaskSoftnessX\");\n                ID_MaskSoftnessY = Shader.PropertyToID(\"_MaskSoftnessY\");\n                ID_VertexOffsetX = Shader.PropertyToID(\"_VertexOffsetX\");\n                ID_VertexOffsetY = Shader.PropertyToID(\"_VertexOffsetY\");\n\n                ID_StencilID = Shader.PropertyToID(\"_Stencil\");\n                ID_StencilOp = Shader.PropertyToID(\"_StencilOp\");\n                ID_StencilComp = Shader.PropertyToID(\"_StencilComp\");\n                ID_StencilReadMask = Shader.PropertyToID(\"_StencilReadMask\");\n                ID_StencilWriteMask = Shader.PropertyToID(\"_StencilWriteMask\");\n\n                ID_ShaderFlags = Shader.PropertyToID(\"_ShaderFlags\");\n                ID_ScaleRatio_A = Shader.PropertyToID(\"_ScaleRatioA\");\n                ID_ScaleRatio_B = Shader.PropertyToID(\"_ScaleRatioB\");\n                ID_ScaleRatio_C = Shader.PropertyToID(\"_ScaleRatioC\");\n\n                // Set internal shader references\n                if (k_ShaderRef_MobileSDF == null)\n                    k_ShaderRef_MobileSDF = Shader.Find(\"TextMeshPro/Mobile/Distance Field\");\n\n                if (k_ShaderRef_MobileBitmap == null)\n                    k_ShaderRef_MobileBitmap = Shader.Find(\"TextMeshPro/Mobile/Bitmap\");\n            }\n        }\n\n\n\n        // Scale Ratios to ensure property ranges are optimum in Material Editor  \n        public static void UpdateShaderRatios(Material mat)\n        {\n            //Debug.Log(\"UpdateShaderRatios() called.\");\n\n            float ratio_A = 1;\n            float ratio_B = 1;\n            float ratio_C = 1;\n\n            bool isRatioEnabled = !mat.shaderKeywords.Contains(Keyword_Ratios);\n\n            // Compute Ratio A\n            float scale = mat.GetFloat(ID_GradientScale);\n            float faceDilate = mat.GetFloat(ID_FaceDilate);\n            float outlineThickness = mat.GetFloat(ID_OutlineWidth);\n            float outlineSoftness = mat.GetFloat(ID_OutlineSoftness);\n\n            float weight = Mathf.Max(mat.GetFloat(ID_WeightNormal), mat.GetFloat(ID_WeightBold)) / 4.0f;\n\n            float t = Mathf.Max(1, weight + faceDilate + outlineThickness + outlineSoftness);\n\n            ratio_A = isRatioEnabled ? (scale - m_clamp) / (scale * t) : 1;\n\n            //float ratio_A_old = mat.GetFloat(ID_ScaleRatio_A);\n\n            // Only set the ratio if it has changed.\n            //if (ratio_A != ratio_A_old)\n                mat.SetFloat(ID_ScaleRatio_A, ratio_A);\n\n            // Compute Ratio B\n            if (mat.HasProperty(ID_GlowOffset))\n            {\n                float glowOffset = mat.GetFloat(ID_GlowOffset);\n                float glowOuter = mat.GetFloat(ID_GlowOuter);\n\n                float range = (weight + faceDilate) * (scale - m_clamp);\n\n                t = Mathf.Max(1, glowOffset + glowOuter);\n\n                ratio_B = isRatioEnabled ? Mathf.Max(0, scale - m_clamp - range) / (scale * t) : 1;\n                //float ratio_B_old = mat.GetFloat(ID_ScaleRatio_B);\n\n                // Only set the ratio if it has changed.\n                //if (ratio_B != ratio_B_old)\n                    mat.SetFloat(ID_ScaleRatio_B, ratio_B);\n            }\n\n            // Compute Ratio C\n            if (mat.HasProperty(ID_UnderlayOffsetX))\n            {\n                float underlayOffsetX = mat.GetFloat(ID_UnderlayOffsetX);\n                float underlayOffsetY = mat.GetFloat(ID_UnderlayOffsetY);\n                float underlayDilate = mat.GetFloat(ID_UnderlayDilate);\n                float underlaySoftness = mat.GetFloat(ID_UnderlaySoftness);\n\n                float range = (weight + faceDilate) * (scale - m_clamp);\n\n                t = Mathf.Max(1, Mathf.Max(Mathf.Abs(underlayOffsetX), Mathf.Abs(underlayOffsetY)) + underlayDilate + underlaySoftness);\n\n                ratio_C = isRatioEnabled ? Mathf.Max(0, scale - m_clamp - range) / (scale * t) : 1;\n                //float ratio_C_old = mat.GetFloat(ID_ScaleRatio_C);\n\n                // Only set the ratio if it has changed.\n                //if (ratio_C != ratio_C_old)\n                    mat.SetFloat(ID_ScaleRatio_C, ratio_C);\n            }\n        }\n\n\n\n        // Function to calculate padding required for Outline Width & Dilation for proper text alignment\n        public static Vector4 GetFontExtent(Material material)\n        {\n            // Revised implementation where style no longer affects alignment\n            return Vector4.zero;\n\n            /*\n            if (material == null || !material.HasProperty(ShaderUtilities.ID_GradientScale))\n                return Vector4.zero;   // We are using an non SDF Shader.\n            \n            float scaleRatioA = material.GetFloat(ID_ScaleRatio_A);\n            float faceDilate = material.GetFloat(ID_FaceDilate) * scaleRatioA;\n            float outlineThickness = material.GetFloat(ID_OutlineWidth) * scaleRatioA;\n\n            float extent = Mathf.Min(1, faceDilate + outlineThickness);\n            extent *= material.GetFloat(ID_GradientScale);\n\n            return new Vector4(extent, extent, extent, extent);\n            */\n        }\n\n\n        // Function to check if Masking is enabled\n        public static bool IsMaskingEnabled(Material material)\n        {\n            if (material == null || !material.HasProperty(ShaderUtilities.ID_ClipRect))\n                return false;\n\n            if (material.shaderKeywords.Contains(ShaderUtilities.Keyword_MASK_SOFT) || material.shaderKeywords.Contains(ShaderUtilities.Keyword_MASK_HARD) || material.shaderKeywords.Contains(ShaderUtilities.Keyword_MASK_TEX))\n                return true;\n\n            return false;\n        }\n\n\n        // Function to determine how much extra padding is required as a result of material properties like dilate, outline thickness, softness, glow, etc...\n        public static float GetPadding(Material material, bool enableExtraPadding, bool isBold)\n        {\n            //Debug.Log(\"GetPadding() called.\");\n\n            if (isInitialized == false)\n                GetShaderPropertyIDs();\n\n            // Return if Material is null\n            if (material == null) return 0;\n\n            int extraPadding = enableExtraPadding ? 4 : 0;\n\n            // Check if we are using a non Distance Field Shader\n            if (material.HasProperty(ID_GradientScale) == false)\n            {\n                if (material.HasProperty(ID_Padding))\n                    extraPadding += (int)material.GetFloat(ID_Padding);\n\n                return extraPadding;\n            }\n\n            Vector4 padding = Vector4.zero;\n            Vector4 maxPadding = Vector4.zero;\n\n            //float weight = 0;\n            float faceDilate = 0;\n            float faceSoftness = 0;\n            float outlineThickness = 0;\n            float scaleRatio_A = 0;\n            float scaleRatio_B = 0;\n            float scaleRatio_C = 0;\n\n            float glowOffset = 0;\n            float glowOuter = 0;\n\n            float uniformPadding = 0;\n            // Iterate through each of the assigned materials to find the max values to set the padding.\n           \n            // Update Shader Ratios prior to computing padding\n            UpdateShaderRatios(material);\n\n            string[] shaderKeywords = material.shaderKeywords;\n\n            if (material.HasProperty(ID_ScaleRatio_A))\n                scaleRatio_A = material.GetFloat(ID_ScaleRatio_A);\n\n            //weight = 0; // Mathf.Max(material.GetFloat(ID_WeightNormal), material.GetFloat(ID_WeightBold)) / 2.0f * scaleRatio_A;\n\n            if (material.HasProperty(ID_FaceDilate))\n                faceDilate = material.GetFloat(ID_FaceDilate) * scaleRatio_A;\n\n            if (material.HasProperty(ID_OutlineSoftness))\n                faceSoftness = material.GetFloat(ID_OutlineSoftness) * scaleRatio_A;\n\n            if (material.HasProperty(ID_OutlineWidth))\n                outlineThickness = material.GetFloat(ID_OutlineWidth) * scaleRatio_A;\n\n            uniformPadding = outlineThickness + faceSoftness + faceDilate;\n\n            // Glow padding contribution\n            if (material.HasProperty(ID_GlowOffset) && shaderKeywords.Contains(Keyword_Glow)) // Generates GC\n            {\n                if (material.HasProperty(ID_ScaleRatio_B))\n                    scaleRatio_B = material.GetFloat(ID_ScaleRatio_B);\n\n                glowOffset = material.GetFloat(ID_GlowOffset) * scaleRatio_B;\n                glowOuter = material.GetFloat(ID_GlowOuter) * scaleRatio_B;\n            }\n\n            uniformPadding = Mathf.Max(uniformPadding, faceDilate + glowOffset + glowOuter);\n\n            // Underlay padding contribution\n            if (material.HasProperty(ID_UnderlaySoftness) && shaderKeywords.Contains(Keyword_Underlay)) // Generates GC\n            {\n                if (material.HasProperty(ID_ScaleRatio_C))\n                    scaleRatio_C = material.GetFloat(ID_ScaleRatio_C);\n\n                float offsetX = material.GetFloat(ID_UnderlayOffsetX) * scaleRatio_C;\n                float offsetY = material.GetFloat(ID_UnderlayOffsetY) * scaleRatio_C;\n                float dilate = material.GetFloat(ID_UnderlayDilate) * scaleRatio_C;\n                float softness = material.GetFloat(ID_UnderlaySoftness) * scaleRatio_C;\n\n                padding.x = Mathf.Max(padding.x, faceDilate + dilate + softness - offsetX);\n                padding.y = Mathf.Max(padding.y, faceDilate + dilate + softness - offsetY);\n                padding.z = Mathf.Max(padding.z, faceDilate + dilate + softness + offsetX);\n                padding.w = Mathf.Max(padding.w, faceDilate + dilate + softness + offsetY);\n            }\n\n            padding.x = Mathf.Max(padding.x, uniformPadding);\n            padding.y = Mathf.Max(padding.y, uniformPadding);\n            padding.z = Mathf.Max(padding.z, uniformPadding);\n            padding.w = Mathf.Max(padding.w, uniformPadding);\n\n            padding.x += extraPadding;\n            padding.y += extraPadding;\n            padding.z += extraPadding;\n            padding.w += extraPadding;\n\n            padding.x = Mathf.Min(padding.x, 1);\n            padding.y = Mathf.Min(padding.y, 1);\n            padding.z = Mathf.Min(padding.z, 1);\n            padding.w = Mathf.Min(padding.w, 1);\n\n            maxPadding.x = maxPadding.x < padding.x ? padding.x : maxPadding.x;\n            maxPadding.y = maxPadding.y < padding.y ? padding.y : maxPadding.y;\n            maxPadding.z = maxPadding.z < padding.z ? padding.z : maxPadding.z;\n            maxPadding.w = maxPadding.w < padding.w ? padding.w : maxPadding.w;\n\n            float gradientScale = material.GetFloat(ID_GradientScale);\n            padding *= gradientScale;\n\n            // Set UniformPadding to the maximum value of any of its components.\n            uniformPadding = Mathf.Max(padding.x, padding.y);\n            uniformPadding = Mathf.Max(padding.z, uniformPadding);\n            uniformPadding = Mathf.Max(padding.w, uniformPadding);\n\n            return uniformPadding + 1.25f;\n        }\n\n\n\n\n        // Function to determine how much extra padding is required as a result of material properties like dilate, outline thickness, softness, glow, etc...\n        public static float GetPadding(Material[] materials, bool enableExtraPadding, bool isBold)\n        {\n            //Debug.Log(\"GetPadding() called.\");\n            \n            if (isInitialized == false)\n                GetShaderPropertyIDs();\n\n            // Return if Material is null\n            if (materials == null) return 0;\n            \n            int extraPadding = enableExtraPadding ? 4 : 0;\n\n            // Check if we are using a Bitmap Shader\n            if (materials[0].HasProperty(ID_Padding))\n                return extraPadding + materials[0].GetFloat(ID_Padding);\n\n            Vector4 padding = Vector4.zero;\n            Vector4 maxPadding = Vector4.zero;\n\n            float faceDilate = 0;\n            float faceSoftness = 0;\n            float outlineThickness = 0;\n            float scaleRatio_A = 0;\n            float scaleRatio_B = 0;\n            float scaleRatio_C = 0;\n\n            float glowOffset = 0;\n            float glowOuter = 0;\n\n            float uniformPadding = 0;\n            // Iterate through each of the assigned materials to find the max values to set the padding.\n            for (int i = 0; i < materials.Length; i++)\n            {\n                // Update Shader Ratios prior to computing padding\n                ShaderUtilities.UpdateShaderRatios(materials[i]);\n\n                string[] shaderKeywords = materials[i].shaderKeywords;\n\n                if (materials[i].HasProperty(ShaderUtilities.ID_ScaleRatio_A))\n                    scaleRatio_A = materials[i].GetFloat(ShaderUtilities.ID_ScaleRatio_A);\n\n                if (materials[i].HasProperty(ShaderUtilities.ID_FaceDilate))\n                    faceDilate = materials[i].GetFloat(ShaderUtilities.ID_FaceDilate) * scaleRatio_A;\n\n                if (materials[i].HasProperty(ShaderUtilities.ID_OutlineSoftness))\n                    faceSoftness = materials[i].GetFloat(ShaderUtilities.ID_OutlineSoftness) * scaleRatio_A;\n\n                if (materials[i].HasProperty(ShaderUtilities.ID_OutlineWidth))\n                    outlineThickness = materials[i].GetFloat(ShaderUtilities.ID_OutlineWidth) * scaleRatio_A;\n\n                uniformPadding = outlineThickness + faceSoftness + faceDilate;\n\n                // Glow padding contribution\n                if (materials[i].HasProperty(ShaderUtilities.ID_GlowOffset) && shaderKeywords.Contains(ShaderUtilities.Keyword_Glow))\n                {\n                    if (materials[i].HasProperty(ShaderUtilities.ID_ScaleRatio_B))\n                        scaleRatio_B = materials[i].GetFloat(ShaderUtilities.ID_ScaleRatio_B);\n\n                    glowOffset = materials[i].GetFloat(ShaderUtilities.ID_GlowOffset) * scaleRatio_B;\n                    glowOuter = materials[i].GetFloat(ShaderUtilities.ID_GlowOuter) * scaleRatio_B;\n                }\n\n                uniformPadding = Mathf.Max(uniformPadding, faceDilate + glowOffset + glowOuter);\n\n                // Underlay padding contribution\n                if (materials[i].HasProperty(ShaderUtilities.ID_UnderlaySoftness) && shaderKeywords.Contains(ShaderUtilities.Keyword_Underlay))\n                {\n                    if (materials[i].HasProperty(ShaderUtilities.ID_ScaleRatio_C))\n                        scaleRatio_C = materials[i].GetFloat(ShaderUtilities.ID_ScaleRatio_C);\n\n                    float offsetX = materials[i].GetFloat(ShaderUtilities.ID_UnderlayOffsetX) * scaleRatio_C;\n                    float offsetY = materials[i].GetFloat(ShaderUtilities.ID_UnderlayOffsetY) * scaleRatio_C;\n                    float dilate = materials[i].GetFloat(ShaderUtilities.ID_UnderlayDilate) * scaleRatio_C;\n                    float softness = materials[i].GetFloat(ShaderUtilities.ID_UnderlaySoftness) * scaleRatio_C;\n\n                    padding.x = Mathf.Max(padding.x, faceDilate + dilate + softness - offsetX);\n                    padding.y = Mathf.Max(padding.y, faceDilate + dilate + softness - offsetY);\n                    padding.z = Mathf.Max(padding.z, faceDilate + dilate + softness + offsetX);\n                    padding.w = Mathf.Max(padding.w, faceDilate + dilate + softness + offsetY);\n                }\n\n                padding.x = Mathf.Max(padding.x, uniformPadding);\n                padding.y = Mathf.Max(padding.y, uniformPadding);\n                padding.z = Mathf.Max(padding.z, uniformPadding);\n                padding.w = Mathf.Max(padding.w, uniformPadding);\n\n                padding.x += extraPadding;\n                padding.y += extraPadding;\n                padding.z += extraPadding;\n                padding.w += extraPadding;\n\n                padding.x = Mathf.Min(padding.x, 1);\n                padding.y = Mathf.Min(padding.y, 1);\n                padding.z = Mathf.Min(padding.z, 1);\n                padding.w = Mathf.Min(padding.w, 1);\n\n                maxPadding.x = maxPadding.x < padding.x ? padding.x : maxPadding.x;\n                maxPadding.y = maxPadding.y < padding.y ? padding.y : maxPadding.y;\n                maxPadding.z = maxPadding.z < padding.z ? padding.z : maxPadding.z;\n                maxPadding.w = maxPadding.w < padding.w ? padding.w : maxPadding.w;\n\n            }\n\n            float gradientScale = materials[0].GetFloat(ShaderUtilities.ID_GradientScale);\n            padding *= gradientScale;\n\n            // Set UniformPadding to the maximum value of any of its components.\n            uniformPadding = Mathf.Max(padding.x, padding.y);\n            uniformPadding = Mathf.Max(padding.z, uniformPadding);\n            uniformPadding = Mathf.Max(padding.w, uniformPadding);\n\n            return uniformPadding + 0.25f;\n        }\n\n\n    }\n\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_ShaderUtilities.cs.meta",
    "content": "fileFormatVersion: 2\nguid: fea49a0730244a98bf1087f7ca9410a8\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_Sprite.cs",
    "content": "﻿using UnityEngine;\nusing System;\nusing System.Collections;\nusing System.Collections.Generic;\n\n\nnamespace TMPro\n{\n\n    // Class which contains the Sprite Info for each sprite contained in the sprite asset.\n    [Serializable]\n    public class TMP_Sprite : TMP_TextElement_Legacy\n    {\n        //public int fileID;\n        //public int id;\n        public string name;\n        public int hashCode;\n        public int unicode;\n        //public float x;\n        //public float y;\n        //public float width;\n        //public float height;\n        public Vector2 pivot;\n        //public float xOffset; // Pivot X\n        //public float yOffset; // Pivot Y\n        //public float xAdvance;\n        //public float scale;\n\n        public Sprite sprite;\n    }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_Sprite.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 968a09f153574430a6e15ae975145768\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_SpriteAnimator.cs",
    "content": "﻿using UnityEngine;\nusing UnityEngine.TextCore;\nusing System.Collections;\nusing System.Collections.Generic;\n\nnamespace TMPro\n{\n    [DisallowMultipleComponent]\n    public class TMP_SpriteAnimator : MonoBehaviour\n    {\n        private Dictionary<int, bool> m_animations = new Dictionary<int, bool>(16);\n        //private bool isPlaying = false;\n\n        private TMP_Text m_TextComponent;\n\n\n        void Awake()\n        {\n            m_TextComponent = GetComponent<TMP_Text>();\n        }\n\n\n\n\n        void OnEnable()\n        {\n            //m_playAnimations = true;\n        }\n\n\n        void OnDisable()\n        {\n            //m_playAnimations = false;\n        }\n\n\n        public void StopAllAnimations()\n        {\n            StopAllCoroutines();\n            m_animations.Clear();\n        }\n\n\n\n        public void DoSpriteAnimation(int currentCharacter, TMP_SpriteAsset spriteAsset, int start, int end, int framerate)\n        {\n            // Need to add tracking of coroutines that have been lunched for this text object.\n            if (!m_animations.TryGetValue(currentCharacter, out bool isPlaying))\n            {\n                StartCoroutine(DoSpriteAnimationInternal(currentCharacter, spriteAsset, start, end, framerate));\n                m_animations.Add(currentCharacter, true);\n            }\n        }\n\n\n        IEnumerator DoSpriteAnimationInternal(int currentCharacter, TMP_SpriteAsset spriteAsset, int start, int end, int framerate)\n        {\n            if (m_TextComponent == null) yield break;\n\n            // We yield otherwise this gets called before the sprite has rendered.\n            yield return null;\n\n            int currentFrame = start;\n\n            // Make sure end frame does not exceed the number of sprites in the sprite asset.\n            if (end > spriteAsset.spriteCharacterTable.Count)\n                end = spriteAsset.spriteCharacterTable.Count - 1;\n\n            // Get a reference to the geometry of the current character.\n            TMP_CharacterInfo charInfo = m_TextComponent.textInfo.characterInfo[currentCharacter];\n\n            int materialIndex = charInfo.materialReferenceIndex;\n            int vertexIndex = charInfo.vertexIndex;\n\n            TMP_MeshInfo meshInfo = m_TextComponent.textInfo.meshInfo[materialIndex];\n\n            float elapsedTime = 0;\n            float targetTime = 1f / Mathf.Abs(framerate);\n\n            while (true)\n            {\n                if (elapsedTime > targetTime)\n                {\n                    elapsedTime = 0;\n\n                    // Get a reference to the current sprite\n                    TMP_SpriteCharacter spriteCharacter = spriteAsset.spriteCharacterTable[currentFrame];\n\n                    // Update the vertices for the new sprite\n                    Vector3[] vertices = meshInfo.vertices;\n\n                    Vector2 origin = new Vector2(charInfo.origin, charInfo.baseLine);\n                    float spriteScale = charInfo.fontAsset.faceInfo.ascentLine / spriteCharacter.glyph.metrics.height * spriteCharacter.scale * charInfo.scale;\n\n                    Vector3 bl = new Vector3(origin.x + spriteCharacter.glyph.metrics.horizontalBearingX * spriteScale, origin.y + (spriteCharacter.glyph.metrics.horizontalBearingY - spriteCharacter.glyph.metrics.height) * spriteScale);\n                    Vector3 tl = new Vector3(bl.x, origin.y + spriteCharacter.glyph.metrics.horizontalBearingY * spriteScale);\n                    Vector3 tr = new Vector3(origin.x + (spriteCharacter.glyph.metrics.horizontalBearingX + spriteCharacter.glyph.metrics.width) * spriteScale, tl.y);\n                    Vector3 br = new Vector3(tr.x, bl.y);\n\n                    vertices[vertexIndex + 0] = bl;\n                    vertices[vertexIndex + 1] = tl;\n                    vertices[vertexIndex + 2] = tr;\n                    vertices[vertexIndex + 3] = br;\n\n                    // Update the UV to point to the new sprite\n                    Vector2[] uvs0 = meshInfo.uvs0;\n\n                    Vector2 uv0 = new Vector2((float)spriteCharacter.glyph.glyphRect.x / spriteAsset.spriteSheet.width, (float)spriteCharacter.glyph.glyphRect.y / spriteAsset.spriteSheet.height);\n                    Vector2 uv1 = new Vector2(uv0.x, (float)(spriteCharacter.glyph.glyphRect.y + spriteCharacter.glyph.glyphRect.height) / spriteAsset.spriteSheet.height);\n                    Vector2 uv2 = new Vector2((float)(spriteCharacter.glyph.glyphRect.x + spriteCharacter.glyph.glyphRect.width) / spriteAsset.spriteSheet.width, uv1.y);\n                    Vector2 uv3 = new Vector2(uv2.x, uv0.y);\n\n                    uvs0[vertexIndex + 0] = uv0;\n                    uvs0[vertexIndex + 1] = uv1;\n                    uvs0[vertexIndex + 2] = uv2;\n                    uvs0[vertexIndex + 3] = uv3;\n\n                    // Update the modified vertex attributes\n                    meshInfo.mesh.vertices = vertices;\n                    meshInfo.mesh.uv = uvs0;\n                    m_TextComponent.UpdateGeometry(meshInfo.mesh, materialIndex);\n\n\n                    if (framerate > 0)\n                    {\n                        if (currentFrame < end)\n                            currentFrame += 1;\n                        else\n                            currentFrame = start;\n                    }\n                    else\n                    {\n                        if (currentFrame > start)\n                            currentFrame -= 1;\n                        else\n                            currentFrame = end;\n                    }\n                }\n\n                elapsedTime += Time.deltaTime;\n\n                yield return null;\n            }\n        }\n\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_SpriteAnimator.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 6366ee97f6b541449155028b9487355a\ntimeCreated: 1471590333\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_SpriteAsset.cs",
    "content": "﻿using UnityEngine;\nusing UnityEngine.TextCore;\nusing System.Collections.Generic;\nusing System.Linq;\n\n\nnamespace TMPro\n{\n\n    public class TMP_SpriteAsset : TMP_Asset\n    {\n        internal Dictionary<uint, int> m_UnicodeLookup;\n        internal Dictionary<int, int> m_NameLookup;\n        internal Dictionary<uint, int> m_GlyphIndexLookup;\n\n        /// <summary>\n        /// The version of the sprite asset class.\n        /// Version 1.1.0 updates the asset data structure to be compatible with new font asset structure.\n        /// </summary>\n        public string version\n        {\n            get { return m_Version; }\n            internal set { m_Version = value; }\n        }\n        [SerializeField]\n        private string m_Version;\n\n        // The texture which contains the sprites.\n        public Texture spriteSheet;\n\n        public List<TMP_SpriteCharacter> spriteCharacterTable\n        {\n            get\n            {\n                if (m_GlyphIndexLookup == null)\n                    UpdateLookupTables();\n\n                return m_SpriteCharacterTable;\n            }\n            internal set { m_SpriteCharacterTable = value; }\n        }\n        [SerializeField]\n        private List<TMP_SpriteCharacter> m_SpriteCharacterTable = new List<TMP_SpriteCharacter>();\n\n\n        public List<TMP_SpriteGlyph> spriteGlyphTable\n        {\n            get { return m_SpriteGlyphTable; }\n            internal set { m_SpriteGlyphTable = value; }\n        }\n        [SerializeField]\n        private List<TMP_SpriteGlyph> m_SpriteGlyphTable = new List<TMP_SpriteGlyph>();\n\n        // List which contains the SpriteInfo for the sprites contained in the sprite sheet.\n        public List<TMP_Sprite> spriteInfoList;\n\n        /// <summary>\n        /// Dictionary used to lookup the index of a given sprite based on a Unicode value.\n        /// </summary>\n        //private Dictionary<int, int> m_SpriteUnicodeLookup;\n\n\n        /// <summary>\n        /// List which contains the Fallback font assets for this font.\n        /// </summary>\n        [SerializeField]\n        public List<TMP_SpriteAsset> fallbackSpriteAssets;\n\n        internal bool m_IsSpriteAssetLookupTablesDirty = false;\n\n        void Awake()\n        {\n            // Check version number of sprite asset to see if it needs to be upgraded.\n            if (this.material != null && string.IsNullOrEmpty(m_Version))\n                UpgradeSpriteAsset();\n        }\n\n\n        #if UNITY_EDITOR\n        /// <summary>\n        /// \n        /// </summary>\n        void OnValidate()\n        {\n            //Debug.Log(\"Sprite Asset [\" + name + \"] has changed.\");\n\n            //UpdateLookupTables();\n\n            //TMPro_EventManager.ON_SPRITE_ASSET_PROPERTY_CHANGED(true, this);\n        }\n        #endif\n\n\n        /// <summary>\n        /// Create a material for the sprite asset.\n        /// </summary>\n        /// <returns></returns>\n        Material GetDefaultSpriteMaterial()\n        {\n            //isEditingAsset = true;\n            ShaderUtilities.GetShaderPropertyIDs();\n\n            // Add a new material\n            Shader shader = Shader.Find(\"TextMeshPro/Sprite\");\n            Material tempMaterial = new Material(shader);\n            tempMaterial.SetTexture(ShaderUtilities.ID_MainTex, spriteSheet);\n            tempMaterial.hideFlags = HideFlags.HideInHierarchy;\n\n            #if UNITY_EDITOR\n            UnityEditor.AssetDatabase.AddObjectToAsset(tempMaterial, this);\n            UnityEditor.AssetDatabase.ImportAsset(UnityEditor.AssetDatabase.GetAssetPath(this));\n            #endif\n            //isEditingAsset = false;\n\n            return tempMaterial;\n        }\n\n\n        /// <summary>\n        /// Function to update the sprite name and unicode lookup tables.\n        /// This function should be called when a sprite's name or unicode value changes or when a new sprite is added.\n        /// </summary>\n        public void UpdateLookupTables()\n        {\n            //Debug.Log(\"Updating [\" + this.name + \"] Lookup tables.\");\n\n            // Check version number of sprite asset to see if it needs to be upgraded.\n            if (this.material != null && string.IsNullOrEmpty(m_Version))\n                UpgradeSpriteAsset();\n\n            // Initialize / Clear glyph index lookup dictionary.\n            if (m_GlyphIndexLookup == null)\n                m_GlyphIndexLookup = new Dictionary<uint, int>();\n            else\n                m_GlyphIndexLookup.Clear();\n\n            for (int i = 0; i < m_SpriteGlyphTable.Count; i++)\n            {\n                uint glyphIndex = m_SpriteGlyphTable[i].index;\n\n                if (m_GlyphIndexLookup.ContainsKey(glyphIndex) == false)\n                    m_GlyphIndexLookup.Add(glyphIndex, i);\n            }\n\n            if (m_NameLookup == null)\n                m_NameLookup = new Dictionary<int, int>();\n            else\n                m_NameLookup.Clear();\n\n            if (m_UnicodeLookup == null)\n                m_UnicodeLookup = new Dictionary<uint, int>();\n            else\n                m_UnicodeLookup.Clear();\n\n            for (int i = 0; i < m_SpriteCharacterTable.Count; i++)\n            {\n                int nameHashCode = m_SpriteCharacterTable[i].hashCode;\n\n                if (m_NameLookup.ContainsKey(nameHashCode) == false)\n                    m_NameLookup.Add(nameHashCode, i);\n\n                uint unicode = m_SpriteCharacterTable[i].unicode;\n\n                if (m_UnicodeLookup.ContainsKey(unicode) == false)\n                    m_UnicodeLookup.Add(unicode, i);\n\n                // Update glyph reference which is not serialized\n                uint glyphIndex = m_SpriteCharacterTable[i].glyphIndex;\n\n                if (m_GlyphIndexLookup.TryGetValue(glyphIndex, out int index))\n                    m_SpriteCharacterTable[i].glyph = m_SpriteGlyphTable[index];\n            }\n\n            m_IsSpriteAssetLookupTablesDirty = false;\n        }\n\n\n        /// <summary>\n        /// Function which returns the sprite index using the hashcode of the name\n        /// </summary>\n        /// <param name=\"hashCode\"></param>\n        /// <returns></returns>\n        public int GetSpriteIndexFromHashcode(int hashCode)\n        {\n            if (m_NameLookup == null)\n                UpdateLookupTables();\n\n            if (m_NameLookup.TryGetValue(hashCode, out int index))\n                return index;\n\n            return -1;\n        }\n\n\n        /// <summary>\n        /// Returns the index of the sprite for the given unicode value.\n        /// </summary>\n        /// <param name=\"unicode\"></param>\n        /// <returns></returns>\n        public int GetSpriteIndexFromUnicode (uint unicode)\n        {\n            if (m_UnicodeLookup == null)\n                UpdateLookupTables();\n\n            if (m_UnicodeLookup.TryGetValue(unicode, out int index))\n                return index;\n\n            return -1;\n        }\n\n\n        /// <summary>\n        /// Returns the index of the sprite for the given name.\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <returns></returns>\n        public int GetSpriteIndexFromName (string name)\n        {\n            if (m_NameLookup == null)\n                UpdateLookupTables();\n\n            int hashCode = TMP_TextUtilities.GetSimpleHashCode(name);\n\n            return GetSpriteIndexFromHashcode(hashCode);\n        }\n\n\n        /// <summary>\n        /// Used to keep track of which Sprite Assets have been searched.\n        /// </summary>\n        private static List<int> k_searchedSpriteAssets;\n\n        /// <summary>\n        /// Search through the given sprite asset and its fallbacks for the specified sprite matching the given unicode character.\n        /// </summary>\n        /// <param name=\"spriteAsset\">The font asset to search for the given character.</param>\n        /// <param name=\"unicode\">The character to find.</param>\n        /// <param name=\"glyph\">out parameter containing the glyph for the specified character (if found).</param>\n        /// <returns></returns>\n        public static TMP_SpriteAsset SearchForSpriteByUnicode(TMP_SpriteAsset spriteAsset, uint unicode, bool includeFallbacks, out int spriteIndex)\n        {\n            // Check to make sure sprite asset is not null\n            if (spriteAsset == null) { spriteIndex = -1; return null; }\n\n            // Get sprite index for the given unicode\n            spriteIndex = spriteAsset.GetSpriteIndexFromUnicode(unicode);\n            if (spriteIndex != -1)\n                return spriteAsset;\n\n            // Initialize list to track instance of Sprite Assets that have already been searched.\n            if (k_searchedSpriteAssets == null)\n                k_searchedSpriteAssets = new List<int>();\n\n            k_searchedSpriteAssets.Clear();\n\n            // Get instance ID of sprite asset and add to list.\n            int id = spriteAsset.GetInstanceID();\n            k_searchedSpriteAssets.Add(id);\n\n            // Search potential fallback sprite assets if includeFallbacks is true.\n            if (includeFallbacks && spriteAsset.fallbackSpriteAssets != null && spriteAsset.fallbackSpriteAssets.Count > 0)\n                return SearchForSpriteByUnicodeInternal(spriteAsset.fallbackSpriteAssets, unicode, includeFallbacks, out spriteIndex);\n\n            // Search default sprite asset potentially assigned in the TMP Settings.\n            if (includeFallbacks && TMP_Settings.defaultSpriteAsset != null)\n                return SearchForSpriteByUnicodeInternal(TMP_Settings.defaultSpriteAsset, unicode, includeFallbacks, out spriteIndex);\n\n            spriteIndex = -1;\n            return null;\n        }\n\n\n        /// <summary>\n        /// Search through the given list of sprite assets and fallbacks for a sprite whose unicode value matches the target unicode.\n        /// </summary>\n        /// <param name=\"spriteAssets\"></param>\n        /// <param name=\"unicode\"></param>\n        /// <param name=\"includeFallbacks\"></param>\n        /// <param name=\"spriteIndex\"></param>\n        /// <returns></returns>\n        private static TMP_SpriteAsset SearchForSpriteByUnicodeInternal(List<TMP_SpriteAsset> spriteAssets, uint unicode, bool includeFallbacks, out int spriteIndex)\n        {\n            for (int i = 0; i < spriteAssets.Count; i++)\n            {\n                TMP_SpriteAsset temp = spriteAssets[i];\n                if (temp == null) continue;\n\n                int id = temp.GetInstanceID();\n\n                // Skip over the fallback sprite asset if it has already been searched.\n                if (k_searchedSpriteAssets.Contains(id)) continue;\n\n                // Add to list of font assets already searched.\n                k_searchedSpriteAssets.Add(id);\n\n                temp = SearchForSpriteByUnicodeInternal(temp, unicode, includeFallbacks, out spriteIndex);\n\n                if (temp != null)\n                    return temp;\n            }\n\n            spriteIndex = -1;\n            return null;\n        }\n\n\n        /// <summary>\n        /// Search the given sprite asset and fallbacks for a sprite whose unicode value matches the target unicode.\n        /// </summary>\n        /// <param name=\"spriteAsset\"></param>\n        /// <param name=\"unicode\"></param>\n        /// <param name=\"includeFallbacks\"></param>\n        /// <param name=\"spriteIndex\"></param>\n        /// <returns></returns>\n        private static TMP_SpriteAsset SearchForSpriteByUnicodeInternal(TMP_SpriteAsset spriteAsset, uint unicode, bool includeFallbacks, out int spriteIndex)\n        {\n            // Get sprite index for the given unicode\n            spriteIndex = spriteAsset.GetSpriteIndexFromUnicode(unicode);\n            if (spriteIndex != -1)\n                return spriteAsset;\n\n            if (includeFallbacks && spriteAsset.fallbackSpriteAssets != null && spriteAsset.fallbackSpriteAssets.Count > 0)\n                return SearchForSpriteByUnicodeInternal(spriteAsset.fallbackSpriteAssets, unicode, includeFallbacks, out spriteIndex);\n\n            spriteIndex = -1;\n            return null;\n        }\n\n\n        /// <summary>\n        /// Search the given sprite asset and fallbacks for a sprite whose hash code value of its name matches the target hash code.\n        /// </summary>\n        /// <param name=\"spriteAsset\">The Sprite Asset to search for the given sprite whose name matches the hashcode value</param>\n        /// <param name=\"hashCode\">The hash code value matching the name of the sprite</param>\n        /// <param name=\"includeFallbacks\">Include fallback sprite assets in the search</param>\n        /// <param name=\"spriteIndex\">The index of the sprite matching the provided hash code</param>\n        /// <returns>The Sprite Asset that contains the sprite</returns>\n        public static TMP_SpriteAsset SearchForSpriteByHashCode(TMP_SpriteAsset spriteAsset, int hashCode, bool includeFallbacks, out int spriteIndex)\n        {\n            // Make sure sprite asset is not null\n            if (spriteAsset == null) { spriteIndex = -1; return null; }\n\n            spriteIndex = spriteAsset.GetSpriteIndexFromHashcode(hashCode);\n            if (spriteIndex != -1)\n                return spriteAsset;\n\n            // Initialize list to track instance of Sprite Assets that have already been searched.\n            if (k_searchedSpriteAssets == null)\n                k_searchedSpriteAssets = new List<int>();\n\n            k_searchedSpriteAssets.Clear();\n\n            int id = spriteAsset.GetInstanceID();\n            // Add to list of font assets already searched.\n            k_searchedSpriteAssets.Add(id);\n\n            if (includeFallbacks && spriteAsset.fallbackSpriteAssets != null && spriteAsset.fallbackSpriteAssets.Count > 0)\n                return SearchForSpriteByHashCodeInternal(spriteAsset.fallbackSpriteAssets, hashCode, includeFallbacks, out spriteIndex);\n\n            // Search default sprite asset potentially assigned in the TMP Settings.\n            if (includeFallbacks && TMP_Settings.defaultSpriteAsset != null)\n                return SearchForSpriteByHashCodeInternal(TMP_Settings.defaultSpriteAsset, hashCode, includeFallbacks, out spriteIndex);\n\n            spriteIndex = -1;\n            return null;\n        }\n\n\n        /// <summary>\n        ///  Search through the given list of sprite assets and fallbacks for a sprite whose hash code value of its name matches the target hash code.\n        /// </summary>\n        /// <param name=\"spriteAssets\"></param>\n        /// <param name=\"hashCode\"></param>\n        /// <param name=\"searchFallbacks\"></param>\n        /// <param name=\"spriteIndex\"></param>\n        /// <returns></returns>\n        private static TMP_SpriteAsset SearchForSpriteByHashCodeInternal(List<TMP_SpriteAsset> spriteAssets, int hashCode, bool searchFallbacks, out int spriteIndex)\n        {\n            // Search through the list of sprite assets\n            for (int i = 0; i < spriteAssets.Count; i++)\n            {\n                TMP_SpriteAsset temp = spriteAssets[i];\n                if (temp == null) continue;\n\n                int id = temp.GetInstanceID();\n\n                // Skip over the fallback sprite asset if it has already been searched.\n                if (k_searchedSpriteAssets.Contains(id)) continue;\n\n                // Add to list of font assets already searched.\n                k_searchedSpriteAssets.Add(id);\n\n                temp = SearchForSpriteByHashCodeInternal(temp, hashCode, searchFallbacks, out spriteIndex);\n\n                if (temp != null)\n                    return temp;\n            }\n\n            spriteIndex = -1;\n            return null;\n        }\n\n\n        /// <summary>\n        /// Search through the given sprite asset and fallbacks for a sprite whose hash code value of its name matches the target hash code.\n        /// </summary>\n        /// <param name=\"spriteAsset\"></param>\n        /// <param name=\"hashCode\"></param>\n        /// <param name=\"searchFallbacks\"></param>\n        /// <param name=\"spriteIndex\"></param>\n        /// <returns></returns>\n        private static TMP_SpriteAsset SearchForSpriteByHashCodeInternal(TMP_SpriteAsset spriteAsset, int hashCode, bool searchFallbacks, out int spriteIndex)\n        {\n            // Get the sprite for the given hash code.\n            spriteIndex = spriteAsset.GetSpriteIndexFromHashcode(hashCode);\n            if (spriteIndex != -1)\n                return spriteAsset;\n\n            if (searchFallbacks && spriteAsset.fallbackSpriteAssets != null && spriteAsset.fallbackSpriteAssets.Count > 0)\n                return SearchForSpriteByHashCodeInternal(spriteAsset.fallbackSpriteAssets, hashCode, searchFallbacks, out spriteIndex);\n\n            spriteIndex = -1;\n            return null;\n        }\n\n\n        /// <summary>\n        /// Sort the sprite glyph table by glyph index.\n        /// </summary>\n        public void SortGlyphTable()\n        {\n            if (m_SpriteGlyphTable == null || m_SpriteGlyphTable.Count == 0) return;\n\n            m_SpriteGlyphTable = m_SpriteGlyphTable.OrderBy(item => item.index).ToList();\n        }\n\n        /// <summary>\n        /// Sort the sprite character table by Unicode values.\n        /// </summary>\n        internal void SortCharacterTable()\n        {\n            if (m_SpriteCharacterTable != null && m_SpriteCharacterTable.Count > 0)\n                m_SpriteCharacterTable = m_SpriteCharacterTable.OrderBy(c => c.unicode).ToList();\n        }\n\n        /// <summary>\n        /// Sort both sprite glyph and character tables.\n        /// </summary>\n        internal void SortGlyphAndCharacterTables()\n        {\n            SortGlyphTable();\n            SortCharacterTable();\n        }\n\n\n        /// <summary>\n        /// Internal method used to upgrade sprite asset.\n        /// </summary>\n        private void UpgradeSpriteAsset()\n        {\n            m_Version = \"1.1.0\";\n\n            Debug.Log(\"Upgrading sprite asset [\" + this.name + \"] to version \" + m_Version + \".\", this);\n\n            // Convert legacy glyph and character tables to new format\n            m_SpriteCharacterTable.Clear();\n            m_SpriteGlyphTable.Clear();\n\n            for (int i = 0; i < spriteInfoList.Count; i++)\n            {\n                TMP_Sprite oldSprite = spriteInfoList[i];\n\n                TMP_SpriteGlyph spriteGlyph = new TMP_SpriteGlyph();\n                spriteGlyph.index = (uint)i; \n                spriteGlyph.sprite = oldSprite.sprite;\n                spriteGlyph.metrics = new GlyphMetrics(oldSprite.width, oldSprite.height, oldSprite.xOffset, oldSprite.yOffset, oldSprite.xAdvance);\n                spriteGlyph.glyphRect = new GlyphRect((int)oldSprite.x, (int)oldSprite.y, (int)oldSprite.width, (int)oldSprite.height);\n\n                spriteGlyph.scale = 1.0f;\n                spriteGlyph.atlasIndex = 0;\n\n                m_SpriteGlyphTable.Add(spriteGlyph);\n\n                TMP_SpriteCharacter spriteCharacter = new TMP_SpriteCharacter((uint)oldSprite.unicode, spriteGlyph);\n                spriteCharacter.name = oldSprite.name;\n                spriteCharacter.scale = oldSprite.scale;\n\n                m_SpriteCharacterTable.Add(spriteCharacter);\n            }\n\n            // Clear legacy glyph info list.\n            //spriteInfoList.Clear();\n\n            UpdateLookupTables();\n\n            #if UNITY_EDITOR\n            UnityEditor.EditorUtility.SetDirty(this);\n            UnityEditor.AssetDatabase.SaveAssets();\n            #endif\n        }\n\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_SpriteAsset.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 84a92b25f83d49b9bc132d206b370281\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {fileID: 2800000, guid: ec7c645d93308c04d8840982af12101e, type: 3}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_SpriteAssetImportFormats.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections;\nusing System.Collections.Generic;\n\n\nnamespace TMPro.SpriteAssetUtilities\n{\n    public enum SpriteAssetImportFormats { None = 0, TexturePacker = 0x1 };\n\n    public class TexturePacker\n    {\n        [System.Serializable]\n        public struct SpriteFrame\n        {\n            public float x;\n            public float y;\n            public float w;\n            public float h;\n\n            public override string ToString()\n            {\n                string s = \"x: \" + x.ToString(\"f2\") + \" y: \" + y.ToString(\"f2\") + \" h: \" + h.ToString(\"f2\") + \" w: \" + w.ToString(\"f2\");\n                return s;\n            }\n        }\n\n        [System.Serializable]\n        public struct SpriteSize\n        {\n            public float w;\n            public float h;\n\n            public override string ToString()\n            {\n                string s = \"w: \" + w.ToString(\"f2\") + \" h: \" + h.ToString(\"f2\");\n                return s;\n            }\n        }\n\n        [System.Serializable]\n        public struct SpriteData\n        {\n            public string filename;\n            public SpriteFrame frame;\n            public bool rotated;\n            public bool trimmed;\n            public SpriteFrame spriteSourceSize;\n            public SpriteSize sourceSize;\n            public Vector2 pivot;\n\n        }\n\n        [System.Serializable]\n        public class SpriteDataObject\n        {\n            public List<SpriteData> frames;\n        }\n\n\n    }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_SpriteAssetImportFormats.cs.meta",
    "content": "fileFormatVersion: 2\nguid: e4e0b1de1aee400d81ed4273141e7823\ntimeCreated: 1480042510\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_SpriteCharacter.cs",
    "content": "﻿using System;\nusing UnityEngine;\n\nnamespace TMPro\n{\n    /// <summary>\n    /// A basic element of text representing a pictograph, image, sprite or emoji.\n    /// </summary>\n    [Serializable]\n    public class TMP_SpriteCharacter : TMP_TextElement\n    {\n        /// <summary>\n        /// The name of the sprite element.\n        /// </summary>\n        public string name\n        {\n            get { return m_Name; }\n            set\n            {\n                if (value == m_Name)\n                    return;\n\n                m_Name = value;\n                m_HashCode = TMP_TextParsingUtilities.GetHashCodeCaseSensitive(m_Name);\n            }\n        }\n\n        /// <summary>\n        /// The hashcode value which is computed from the name of the sprite element.\n        /// This value is read-only and updated when the name of the text sprite is changed.\n        /// </summary>\n        public int hashCode { get { return m_HashCode; } }\n\n\n        // =============================================\n        // Private backing fields for public properties.\n        // =============================================\n\n        [SerializeField]\n        private string m_Name;\n\n        [SerializeField]\n        private int m_HashCode;\n\n\n        // ********************\n        // CONSTRUCTORS\n        // ********************\n\n        /// <summary>\n        /// Default constructor.\n        /// </summary>\n        public TMP_SpriteCharacter()\n        {\n            m_ElementType = TextElementType.Sprite;\n        }\n\n        /// <summary>\n        /// Constructor for new sprite character.\n        /// </summary>\n        /// <param name=\"unicode\">Unicode value of the sprite character.</param>\n        /// <param name=\"glyph\">Glyph used by the sprite character.</param>\n        public TMP_SpriteCharacter(uint unicode, TMP_SpriteGlyph glyph)\n        {\n            m_ElementType = TextElementType.Sprite;\n\n            this.unicode = unicode;\n            this.glyphIndex = glyph.index;\n            this.glyph = glyph;\n            this.scale = 1.0f;\n        }\n\n    }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_SpriteCharacter.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 202d758d102b6854a9710c8b93db742c\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_SpriteGlyph.cs",
    "content": "﻿using System;\nusing UnityEngine;\nusing UnityEngine.TextCore;\n\nnamespace TMPro\n{\n    /// <summary>\n    /// The visual representation of the sprite character using this glyph.\n    /// </summary>\n    [Serializable]\n    public class TMP_SpriteGlyph : Glyph\n    {\n        /// <summary>\n        /// An optional reference to the underlying sprite used to create this glyph. \n        /// </summary>\n        public Sprite sprite;\n\n\n        // ********************\n        // CONSTRUCTORS\n        // ********************\n\n        public TMP_SpriteGlyph() { }\n\n        /// <summary>\n        /// Constructor for new sprite glyph.\n        /// </summary>\n        /// <param name=\"index\">Index of the sprite glyph.</param>\n        /// <param name=\"metrics\">Metrics which define the position of the glyph in the context of text layout.</param>\n        /// <param name=\"glyphRect\">GlyphRect which defines the coordinates of the glyph in the atlas texture.</param>\n        /// <param name=\"scale\">Scale of the glyph.</param>\n        /// <param name=\"atlasIndex\">Index of the atlas texture that contains the glyph.</param>      \n        public TMP_SpriteGlyph(uint index, GlyphMetrics metrics, GlyphRect glyphRect, float scale, int atlasIndex)\n        {\n            this.index = index;\n            this.metrics = metrics;\n            this.glyphRect = glyphRect;\n            this.scale = scale;\n            this.atlasIndex = atlasIndex;\n        }\n\n        /// <summary>\n        /// Constructor for new sprite glyph.\n        /// </summary>\n        /// <param name=\"index\">>Index of the sprite glyph.</param>\n        /// <param name=\"metrics\">Metrics which define the position of the glyph in the context of text layout.</param>\n        /// <param name=\"glyphRect\">GlyphRect which defines the coordinates of the glyph in the atlas texture.</param>\n        /// <param name=\"scale\">Scale of the glyph.</param>\n        /// <param name=\"atlasIndex\">Index of the atlas texture that contains the glyph.</param>\n        /// <param name=\"sprite\">A reference to the Unity Sprite representing this sprite glyph.</param>\n        public TMP_SpriteGlyph(uint index, GlyphMetrics metrics, GlyphRect glyphRect, float scale, int atlasIndex, Sprite sprite)\n        {\n            this.index = index;\n            this.metrics = metrics;\n            this.glyphRect = glyphRect;\n            this.scale = scale;\n            this.atlasIndex = atlasIndex;\n            this.sprite = sprite;\n        }\n    }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_SpriteGlyph.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 5b5c6a576605b3c4aab7d27193785f27\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_Style.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections;\n\n#pragma warning disable 0649 // Disabled warnings.\n\nnamespace TMPro\n{\n    \n    [System.Serializable]\n    public class TMP_Style\n    {\n        // PUBLIC PROPERTIES\n\n        /// <summary>\n        /// The name identifying this style. ex. <style=\"name\">.\n        /// </summary>\n        public string name\n        { get { return m_Name; } set { if (value != m_Name) m_Name = value; } }\n       \n        /// <summary>\n        /// The hash code corresponding to the name of this style.\n        /// </summary>\n        public int hashCode\n        { get { return m_HashCode; } set { if (value != m_HashCode) m_HashCode = value; } }\n\n        /// <summary>\n        /// The initial definition of the style. ex. <b> <u>.\n        /// </summary>\n        public string styleOpeningDefinition\n        { get { return m_OpeningDefinition; } }\n\n        /// <summary>\n        /// The closing definition of the style. ex. </b> </u>.\n        /// </summary>\n        public string styleClosingDefinition\n        { get { return m_ClosingDefinition; } }\n\n\n        public int[] styleOpeningTagArray\n        { get { return m_OpeningTagArray; } }\n\n\n        public int[] styleClosingTagArray\n        { get { return m_ClosingTagArray; } }\n\n       \n        // PRIVATE FIELDS\n        [SerializeField]\n        private string m_Name;\n\n        [SerializeField]\n        private int m_HashCode;\n\n        [SerializeField]\n        private string m_OpeningDefinition;\n\n        [SerializeField]\n        private string m_ClosingDefinition;\n\n        [SerializeField]\n        private int[] m_OpeningTagArray;\n\n        [SerializeField]\n        private int[] m_ClosingTagArray;\n\n\n        //public TMP_Style()\n        //{\n            //Debug.Log(\"New Style with Name: \" + m_Name + \" was created. ID: \");\n        //}\n\n\n        /// <summary>\n        /// Function to update the content of the int[] resulting from changes to OpeningDefinition & ClosingDefinition.\n        /// </summary>\n        public void RefreshStyle()\n        {\n            m_HashCode = TMP_TextUtilities.GetSimpleHashCode(m_Name);\n            \n            m_OpeningTagArray = new int[m_OpeningDefinition.Length];\n            for (int i = 0; i < m_OpeningDefinition.Length; i++)       \n                m_OpeningTagArray[i] = m_OpeningDefinition[i];\n\n            m_ClosingTagArray = new int[m_ClosingDefinition.Length];\n            for (int i = 0; i < m_ClosingDefinition.Length; i++)\n                m_ClosingTagArray[i] = m_ClosingDefinition[i];\n\n#if UNITY_EDITOR\n            // Event to update objects when styles are changed in the editor.\n            TMPro_EventManager.ON_TEXT_STYLE_PROPERTY_CHANGED(true);\n#endif\n        }\n\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_Style.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 30bed781e402439ab8ce4e3357708115\ntimeCreated: 1432681409\nlicenseType: Store\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_StyleSheet.cs",
    "content": "﻿using UnityEngine;\nusing System;\nusing System.Collections.Generic;\n\n\nnamespace TMPro\n{\n\n    [Serializable]\n    public class TMP_StyleSheet : ScriptableObject\n    {\n        private static TMP_StyleSheet s_Instance;\n\n        [SerializeField]\n        private List<TMP_Style> m_StyleList = new List<TMP_Style>(1);\n        private Dictionary<int, TMP_Style> m_StyleDictionary = new Dictionary<int, TMP_Style>();\n\n\n        /// <summary>\n        /// Get a singleton instance of the TMP_StyleSheet\n        /// </summary>\n        public static TMP_StyleSheet instance\n        {\n            get\n            {\n                if (s_Instance == null)\n                {\n                    s_Instance = TMP_Settings.defaultStyleSheet;\n\n                    if (s_Instance == null)\n                        s_Instance = Resources.Load<TMP_StyleSheet>(\"Style Sheets/Default Style Sheet\");\n\n                    if (s_Instance == null) return null;\n\n                    // Load the style dictionary.\n                    s_Instance.LoadStyleDictionaryInternal();\n                }\n\n                return s_Instance;\n            }\n        }\n\n\n        /// <summary>\n        /// Static Function to load the Default Style Sheet.\n        /// </summary>\n        /// <returns></returns>\n        public static TMP_StyleSheet LoadDefaultStyleSheet()\n        {\n            return instance;\n        }\n\n\n        /// <summary>\n        /// Function to retrieve the Style matching the HashCode.\n        /// </summary>\n        /// <param name=\"hashCode\"></param>\n        /// <returns></returns>\n        public static TMP_Style GetStyle(int hashCode)\n        {\n            return instance.GetStyleInternal(hashCode);\n        }\n\n\n        /// <summary>\n        /// Internal method to retrieve the Style matching the Hashcode.\n        /// </summary>\n        /// <param name=\"hashCode\"></param>\n        /// <returns></returns>\n        private TMP_Style GetStyleInternal(int hashCode)\n        {\n            if (m_StyleDictionary.TryGetValue(hashCode, out TMP_Style style))\n            {\n                return style;\n            }\n\n            return null;\n        }\n\n\n        public void UpdateStyleDictionaryKey(int old_key, int new_key)\n        {\n            if (m_StyleDictionary.ContainsKey(old_key))\n            {\n                TMP_Style style = m_StyleDictionary[old_key];\n                m_StyleDictionary.Add(new_key, style);\n                m_StyleDictionary.Remove(old_key);\n            }\n        }\n\n\n        /// <summary>\n        /// Function to update the internal reference to a newly assigned style sheet in the TMP Settings.\n        /// </summary>\n        public static void UpdateStyleSheet()\n        {\n            // Reset instance\n            s_Instance = null;\n\n            RefreshStyles();\n        }\n\n\n        /// <summary>\n        /// Function to refresh the Style Dictionary.\n        /// </summary>\n        public static void RefreshStyles()\n        {\n            instance.LoadStyleDictionaryInternal();\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        private void LoadStyleDictionaryInternal()\n        {\n            m_StyleDictionary.Clear();\n            \n            // Read Styles from style list and store them into dictionary for faster access.\n            for (int i = 0; i < m_StyleList.Count; i++)\n            {\n                m_StyleList[i].RefreshStyle();\n              \n                if (!m_StyleDictionary.ContainsKey(m_StyleList[i].hashCode))\n                    m_StyleDictionary.Add(m_StyleList[i].hashCode, m_StyleList[i]);\n            }\n        }\n    }\n\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_StyleSheet.cs.meta",
    "content": "fileFormatVersion: 2\nguid: ab2114bdc8544297b417dfefe9f1e410\ntimeCreated: 1436650317\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences:\n  - StyleSheet: {fileID: 11400000, guid: cab1ac28c8e6be24e995befe0c36d7c1, type: 2}\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_SubMesh.cs",
    "content": "﻿using UnityEngine;\nusing System;\nusing System.Collections;\n\n#pragma warning disable 0109 // Disable warning due to conflict between Unity Editor DLL and Runtime DLL related to .renderer property being available in one but not the other. \n\nnamespace TMPro\n{\n    [RequireComponent(typeof(MeshRenderer))]\n    [RequireComponent(typeof(MeshFilter))]\n    [ExecuteAlways]\n    public class TMP_SubMesh : MonoBehaviour\n    {\n        /// <summary>\n        /// The TMP Font Asset assigned to this sub text object.\n        /// </summary>\n        public TMP_FontAsset fontAsset\n        {\n            get { return m_fontAsset; }\n            set { m_fontAsset = value; }\n        }\n        [SerializeField]\n        private TMP_FontAsset m_fontAsset;\n\n\n        /// <summary>\n        /// The TMP Sprite Asset assigned to this sub text object.\n        /// </summary>\n        public TMP_SpriteAsset spriteAsset\n        {\n            get { return m_spriteAsset; }\n            set { m_spriteAsset = value; }\n        }\n        [SerializeField]\n        private TMP_SpriteAsset m_spriteAsset;\n\n\n        /// <summary>\n        /// The material to be assigned to this object. Returns an instance of the material.\n        /// </summary>\n        public Material material\n        {\n            // Return a new Instance of the Material if none exists. Otherwise return the current Material Instance.\n            get { return GetMaterial(m_sharedMaterial); }\n\n            // Assign new font material\n            set\n            {\n                if (m_sharedMaterial.GetInstanceID() == value.GetInstanceID())\n                    return;\n\n                m_sharedMaterial = m_material = value;\n\n                m_padding = GetPaddingForMaterial();\n\n                SetVerticesDirty();\n                SetMaterialDirty();\n            }\n        }\n        [SerializeField]\n        private Material m_material;\n\n\n        /// <summary>\n        /// The material to be assigned to this text object.\n        /// </summary>\n        public Material sharedMaterial\n        {\n            get { return m_sharedMaterial; }\n            set { SetSharedMaterial(value); }\n        }\n        [SerializeField]\n        private Material m_sharedMaterial;\n\n\n        /// <summary>\n        /// The fallback material created from the properties of the fallback source material.\n        /// </summary>\n        public Material fallbackMaterial\n        {\n            get { return m_fallbackMaterial; }\n            set\n            {\n                if (m_fallbackMaterial == value) return;\n\n                if (m_fallbackMaterial != null && m_fallbackMaterial != value)\n                    TMP_MaterialManager.ReleaseFallbackMaterial(m_fallbackMaterial);\n\n                m_fallbackMaterial = value;\n                TMP_MaterialManager.AddFallbackMaterialReference(m_fallbackMaterial);\n\n                SetSharedMaterial(m_fallbackMaterial);\n            }\n        }\n        private Material m_fallbackMaterial;\n\n\n        /// <summary>\n        /// The source material used by the fallback font\n        /// </summary>\n        public Material fallbackSourceMaterial\n        {\n            get { return m_fallbackSourceMaterial; }\n            set { m_fallbackSourceMaterial = value; }\n        }\n        private Material m_fallbackSourceMaterial;\n\n\n        /// <summary>\n        /// Is the text object using the default font asset material.\n        /// </summary>\n        public bool isDefaultMaterial\n        {\n            get { return m_isDefaultMaterial; }\n            set { m_isDefaultMaterial = value; }\n        }\n        [SerializeField]\n        private bool m_isDefaultMaterial;\n\n\n        /// <summary>\n        /// Padding value resulting for the property settings on the material.\n        /// </summary>\n        public float padding\n        {\n            get { return m_padding; }\n            set { m_padding = value; }\n        }\n        [SerializeField]\n        private float m_padding;\n\n\n        /// <summary>\n        /// The Mesh Renderer of this text sub object.\n        /// </summary>\n        public new Renderer renderer\n        {\n            get { if (m_renderer == null) m_renderer = GetComponent<Renderer>();\n\n                return m_renderer;\n            }\n        }\n        [SerializeField]\n        private Renderer m_renderer;\n\n\n        /// <summary>\n        /// The MeshFilter of this text sub object.\n        /// </summary>\n        public MeshFilter meshFilter\n        {\n            get { if (m_meshFilter == null) m_meshFilter = GetComponent<MeshFilter>();\n                return m_meshFilter;\n            }\n        }\n        [SerializeField]\n        private MeshFilter m_meshFilter;\n\n\n        /// <summary>\n        /// The Mesh of this text sub object.\n        /// </summary>\n        public Mesh mesh\n        {\n            get\n            {\n                if (m_mesh == null)\n                {\n                    m_mesh = new Mesh();\n                    m_mesh.hideFlags = HideFlags.HideAndDontSave;\n                    this.meshFilter.mesh = m_mesh;\n                }\n\n                return m_mesh;\n            }\n            set { m_mesh = value; }\n        }\n        private Mesh m_mesh;\n\n        /// <summary>\n        /// \n        /// </summary>\n        //public BoxCollider boxCollider\n        //{\n        //    get\n        //    {\n        //        if (m_boxCollider == null)\n        //        {\n        //            //\n        //            m_boxCollider = GetComponent<BoxCollider>();\n        //            if (m_boxCollider == null)\n        //            {\n        //                m_boxCollider = gameObject.AddComponent<BoxCollider>();\n        //                gameObject.AddComponent<Rigidbody>();\n        //            }\n        //        }\n\n        //        return m_boxCollider;\n        //    }\n        //}\n        //[SerializeField]\n        //private BoxCollider m_boxCollider;\n\n        [SerializeField]\n        private TextMeshPro m_TextComponent;\n\n        [NonSerialized]\n        private bool m_isRegisteredForEvents;\n\n\n        void OnEnable()\n        {\n            // Register Callbacks for various events.\n            if (!m_isRegisteredForEvents)\n            {\n                #if UNITY_EDITOR\n                TMPro_EventManager.MATERIAL_PROPERTY_EVENT.Add(ON_MATERIAL_PROPERTY_CHANGED);\n                TMPro_EventManager.FONT_PROPERTY_EVENT.Add(ON_FONT_PROPERTY_CHANGED);\n                //TMPro_EventManager.TEXTMESHPRO_PROPERTY_EVENT.Add(ON_TEXTMESHPRO_PROPERTY_CHANGED);\n                TMPro_EventManager.DRAG_AND_DROP_MATERIAL_EVENT.Add(ON_DRAG_AND_DROP_MATERIAL);\n                //TMPro_EventManager.TEXT_STYLE_PROPERTY_EVENT.Add(ON_TEXT_STYLE_CHANGED);\n                TMPro_EventManager.SPRITE_ASSET_PROPERTY_EVENT.Add(ON_SPRITE_ASSET_PROPERTY_CHANGED);\n                //TMPro_EventManager.TMP_SETTINGS_PROPERTY_EVENT.Add(ON_TMP_SETTINGS_CHANGED);\n                #endif\n\n                m_isRegisteredForEvents = true;\n            }\n\n            // Make the geometry visible when the object is enabled.\n            meshFilter.sharedMesh = mesh;\n\n            // Update _ClipRect values\n            if (m_sharedMaterial != null)\n                m_sharedMaterial.SetVector(ShaderUtilities.ID_ClipRect, new Vector4(-32767, -32767, 32767, 32767));\n        }\n\n\n        void OnDisable()\n        {\n            // Hide the geometry when the object is disabled.\n            m_meshFilter.sharedMesh = null;\n\n            if (m_fallbackMaterial != null)\n            {\n                TMP_MaterialManager.ReleaseFallbackMaterial(m_fallbackMaterial);\n                m_fallbackMaterial = null;\n            }\n\n\n        }\n\n\n        void OnDestroy()\n        {\n            // Destroy Mesh\n            if (m_mesh != null) DestroyImmediate(m_mesh);\n\n            if (m_fallbackMaterial != null)\n            {\n                TMP_MaterialManager.ReleaseFallbackMaterial(m_fallbackMaterial);\n                m_fallbackMaterial = null;\n            }\n\n            #if UNITY_EDITOR\n            // Unregister the event this object was listening to\n            TMPro_EventManager.MATERIAL_PROPERTY_EVENT.Remove(ON_MATERIAL_PROPERTY_CHANGED);\n            TMPro_EventManager.FONT_PROPERTY_EVENT.Remove(ON_FONT_PROPERTY_CHANGED);\n            //TMPro_EventManager.TEXTMESHPRO_PROPERTY_EVENT.Remove(ON_TEXTMESHPRO_PROPERTY_CHANGED);\n            TMPro_EventManager.DRAG_AND_DROP_MATERIAL_EVENT.Remove(ON_DRAG_AND_DROP_MATERIAL);\n            //TMPro_EventManager.TEXT_STYLE_PROPERTY_EVENT.Remove(ON_TEXT_STYLE_CHANGED);\n            TMPro_EventManager.SPRITE_ASSET_PROPERTY_EVENT.Remove(ON_SPRITE_ASSET_PROPERTY_CHANGED);\n            //TMPro_EventManager.TMP_SETTINGS_PROPERTY_EVENT.Remove(ON_TMP_SETTINGS_CHANGED);\n            #endif\n            m_isRegisteredForEvents = false;\n        }\n\n\n\n        #if UNITY_EDITOR\n        // Event received when custom material editor properties are changed.\n        void ON_MATERIAL_PROPERTY_CHANGED(bool isChanged, Material mat)\n        {\n            //Debug.Log(\"*** ON_MATERIAL_PROPERTY_CHANGED ***\");\n            int targetMaterialID = mat.GetInstanceID();\n            int sharedMaterialID = m_sharedMaterial.GetInstanceID();\n            int fallbackSourceMaterialID = m_fallbackSourceMaterial == null ? 0 : m_fallbackSourceMaterial.GetInstanceID();\n\n            // Filter events and return if the affected material is not this object's material.\n            if (targetMaterialID != sharedMaterialID)\n            {\n                // Check if event applies to the source fallback material\n                if (m_fallbackMaterial != null && fallbackSourceMaterialID == targetMaterialID)\n                    TMP_MaterialManager.CopyMaterialPresetProperties(mat, m_fallbackMaterial);\n                else\n                    return;\n            }\n\n            if (m_TextComponent == null) m_TextComponent = GetComponentInParent<TextMeshPro>();\n\n            m_padding = GetPaddingForMaterial();\n\n            m_TextComponent.havePropertiesChanged = true;\n            m_TextComponent.SetVerticesDirty();\n        }\n\n\n        // Event to Track Material Changed resulting from Drag-n-drop.\n        void ON_DRAG_AND_DROP_MATERIAL(GameObject obj, Material currentMaterial, Material newMaterial)\n        {\n            // Check if event applies to this current object\n            #if UNITY_2018_2_OR_NEWER\n            if (obj == gameObject || UnityEditor.PrefabUtility.GetCorrespondingObjectFromSource(gameObject) == obj)\n            #else\n            if (obj == gameObject || UnityEditor.PrefabUtility.GetPrefabParent(gameObject) == obj)\n            #endif\n            {\n                if (!m_isDefaultMaterial) return;\n\n                // Make sure we have a valid reference to the renderer.\n                if (m_renderer == null) m_renderer = GetComponent<Renderer>();\n\n                UnityEditor.Undo.RecordObject(this, \"Material Assignment\");\n                UnityEditor.Undo.RecordObject(m_renderer, \"Material Assignment\");\n\n                SetSharedMaterial(newMaterial);\n                m_TextComponent.havePropertiesChanged = true;\n            }\n        }\n\n\n        // Event received when font asset properties are changed in Font Inspector\n        void ON_SPRITE_ASSET_PROPERTY_CHANGED(bool isChanged, UnityEngine.Object obj)\n        {\n            //if (spriteSheet != null && (obj as TMP_SpriteAsset == m_spriteAsset || obj as Texture2D == m_spriteAsset.spriteSheet))\n            //{\n            if (m_TextComponent != null)\n            {\n                m_TextComponent.havePropertiesChanged = true;\n                //m_TextComponent.SetVerticesDirty();\n            }\n\n            //}\n        }\n\n        // Event received when font asset properties are changed in Font Inspector\n        void ON_FONT_PROPERTY_CHANGED(bool isChanged, TMP_FontAsset font)\n        {\n            if (m_fontAsset != null && font.GetInstanceID() == m_fontAsset.GetInstanceID())\n            {\n                // Copy Normal and Bold Weight\n                if (m_fallbackMaterial != null)\n                {\n                    m_fallbackMaterial.SetFloat(ShaderUtilities.ID_WeightNormal, m_fontAsset.normalStyle);\n                    m_fallbackMaterial.SetFloat(ShaderUtilities.ID_WeightBold, m_fontAsset.boldStyle);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Event received when the TMP Settings are changed.\n        /// </summary>\n        void ON_TMP_SETTINGS_CHANGED()\n        {\n        //    //Debug.Log(\"TMP Setting have changed.\");\n        //    //SetVerticesDirty();\n        //    SetMaterialDirty();\n        }\n        #endif\n\n\n\n        public static TMP_SubMesh AddSubTextObject(TextMeshPro textComponent, MaterialReference materialReference)\n        {\n            GameObject go = new GameObject(\"TMP SubMesh [\" + materialReference.material.name + \"]\", typeof(TMP_SubMesh));\n\n            TMP_SubMesh subMesh = go.GetComponent<TMP_SubMesh>();\n\n            go.transform.SetParent(textComponent.transform, false);\n            go.transform.localPosition = Vector3.zero;\n            go.transform.localRotation = Quaternion.identity;\n            go.transform.localScale = Vector3.one;\n            go.layer = textComponent.gameObject.layer;\n\n            subMesh.m_meshFilter = go.GetComponent<MeshFilter>();\n\n            subMesh.m_TextComponent = textComponent;\n            subMesh.m_fontAsset = materialReference.fontAsset;\n            subMesh.m_spriteAsset = materialReference.spriteAsset;\n            subMesh.m_isDefaultMaterial = materialReference.isDefaultMaterial;\n            subMesh.SetSharedMaterial(materialReference.material);\n\n            subMesh.renderer.sortingLayerID = textComponent.renderer.sortingLayerID;\n            subMesh.renderer.sortingOrder = textComponent.renderer.sortingOrder;\n\n            return subMesh;\n        }\n\n\n        public void DestroySelf()\n        {\n            Destroy(this.gameObject, 1f);\n        }\n\n        // Function called internally when a new material is assigned via the fontMaterial property.\n        Material GetMaterial(Material mat)\n        {\n            // Check in case Object is disabled. If so, we don't have a valid reference to the Renderer.\n            // This can occur when the Duplicate Material Context menu is used on an inactive object.\n            if (m_renderer == null)\n                m_renderer = GetComponent<Renderer>();\n\n            // Create Instance Material only if the new material is not the same instance previously used.\n            if (m_material == null || m_material.GetInstanceID() != mat.GetInstanceID())\n                m_material = CreateMaterialInstance(mat);\n\n            m_sharedMaterial = m_material;\n\n            // Compute and Set new padding values for this new material. \n            m_padding = GetPaddingForMaterial();\n\n            SetVerticesDirty();\n            SetMaterialDirty();\n\n            return m_sharedMaterial;\n        }\n\n\n        /// <summary>\n        /// Method used to create an instance of the material\n        /// </summary>\n        /// <param name=\"source\"></param>\n        /// <returns></returns>\n        Material CreateMaterialInstance(Material source)\n        {\n            Material mat = new Material(source);\n            mat.shaderKeywords = source.shaderKeywords;\n            mat.name += \" (Instance)\";\n\n            return mat;\n        }\n\n\n        /// <summary>\n        /// Method returning the shared material assigned to the text object.\n        /// </summary>\n        /// <returns></returns>\n        Material GetSharedMaterial()\n        {\n            if (m_renderer == null)\n                m_renderer = GetComponent<Renderer>();\n\n            return m_renderer.sharedMaterial;\n        }\n\n\n        /// <summary>\n        /// Method to set the shared material.\n        /// </summary>\n        /// <param name=\"mat\"></param>\n        void SetSharedMaterial(Material mat)\n        {\n            //Debug.Log(\"*** SetSharedMaterial() *** FRAME (\" + Time.frameCount + \")\");\n\n            // Assign new material.\n            m_sharedMaterial = mat;\n\n            // Compute and Set new padding values for this new material. \n            m_padding = GetPaddingForMaterial();\n\n            SetMaterialDirty();\n\n            #if UNITY_EDITOR\n            if (m_sharedMaterial != null)\n                gameObject.name = \"TMP SubMesh [\" + m_sharedMaterial.name + \"]\";\n            #endif\n        }\n\n\n        /// <summary>\n        /// Function called when the padding value for the material needs to be re-calculated.\n        /// </summary>\n        /// <returns></returns>\n        public float GetPaddingForMaterial()\n        {\n            float padding = ShaderUtilities.GetPadding(m_sharedMaterial, m_TextComponent.extraPadding, m_TextComponent.isUsingBold);\n\n            return padding;\n        }\n\n\n        /// <summary>\n        /// Function to update the padding values of the object.\n        /// </summary>\n        /// <param name=\"isExtraPadding\"></param>\n        /// <param name=\"isBold\"></param>\n        public void UpdateMeshPadding(bool isExtraPadding, bool isUsingBold)\n        {\n            m_padding = ShaderUtilities.GetPadding(m_sharedMaterial, isExtraPadding, isUsingBold);\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        public void SetVerticesDirty()\n        {\n            if (!this.enabled)\n                return;\n\n            // This is called on the parent TextMeshPro component.\n            if (m_TextComponent != null)\n            {\n                m_TextComponent.havePropertiesChanged = true;\n                m_TextComponent.SetVerticesDirty();\n            }\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        public void SetMaterialDirty()\n        {\n            //if (!this.enabled)\n            //    return;\n\n            UpdateMaterial();\n\n            //m_materialDirty = true;\n            //TMP_UpdateRegistry.RegisterCanvasElementForGraphicRebuild((ICanvasElement)this);\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        protected void UpdateMaterial()\n        {\n            //Debug.Log(\"*** STO - UpdateMaterial() *** FRAME (\" + Time.frameCount + \")\");\n\n            //if (!this.enabled)\n            //    return;\n\n            if (m_renderer == null) m_renderer = this.renderer;\n\n            m_renderer.sharedMaterial = m_sharedMaterial;\n\n            #if UNITY_EDITOR\n            if (m_sharedMaterial != null && gameObject.name != \"TMP SubMesh [\" + m_sharedMaterial.name + \"]\")\n                gameObject.name = \"TMP SubMesh [\" + m_sharedMaterial.name + \"]\";\n            #endif\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        //public void UpdateColliders(int vertexCount)\n        //{\n        //    if (this.boxCollider == null) return;\n\n        //    Vector2 bl = TMP_Math.MAX_16BIT;\n        //    Vector2 tr = TMP_Math.MIN_16BIT;\n        //    // Compute the bounds of the sub text object mesh (excluding the transform position).\n        //    for (int i = 0; i < vertexCount; i++)\n        //    {\n        //        bl.x = Mathf.Min(bl.x, m_mesh.vertices[i].x);\n        //        bl.y = Mathf.Min(bl.y, m_mesh.vertices[i].y);\n\n        //        tr.x = Mathf.Max(tr.x, m_mesh.vertices[i].x);\n        //        tr.y = Mathf.Max(tr.y, m_mesh.vertices[i].y);\n        //    }\n\n        //    Vector3 center = (bl + tr) / 2;\n        //    Vector3 size = tr - bl;\n        //    size.z = .1f;\n        //    this.boxCollider.center = center;\n        //    this.boxCollider.size = size;\n        //}\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_SubMesh.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 07994bfe8b0e4adb97d706de5dea48d5\ntimeCreated: 1454709708\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_SubMeshUI.cs",
    "content": "﻿using UnityEngine;\nusing UnityEngine.UI;\nusing System.Collections;\nusing System.Collections.Generic;\n\n#pragma warning disable 0414 // Disabled a few warnings related to serialized variables not used in this script but used in the editor.\n\nnamespace TMPro\n{\n    [ExecuteAlways]\n    public class TMP_SubMeshUI : MaskableGraphic, IClippable, IMaskable, IMaterialModifier\n    {\n        /// <summary>\n        /// The TMP Font Asset assigned to this sub text object.\n        /// </summary>\n        public TMP_FontAsset fontAsset\n        {\n            get { return m_fontAsset; }\n            set { m_fontAsset = value; }\n        }\n        [SerializeField]\n        private TMP_FontAsset m_fontAsset;\n\n\n        /// <summary>\n        /// The TMP Sprite Asset assigned to this sub text object.\n        /// </summary>\n        public TMP_SpriteAsset spriteAsset\n        {\n            get { return m_spriteAsset; }\n            set { m_spriteAsset = value; }\n        }\n        [SerializeField]\n        private TMP_SpriteAsset m_spriteAsset;\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        public override Texture mainTexture\n        {\n            get\n            {\n                if (this.sharedMaterial != null)\n                    return this.sharedMaterial.GetTexture(ShaderUtilities.ID_MainTex);\n\n\n                return null;\n            }\n        }\n\n\n        /// <summary>\n        /// The material to be assigned to this object. Returns an instance of the material.\n        /// </summary>\n        public override Material material\n        {\n            // Return a new Instance of the Material if none exists. Otherwise return the current Material Instance.\n            get { return GetMaterial(m_sharedMaterial); }\n\n            // Assign new font material\n            set\n            {\n                if (m_sharedMaterial != null && m_sharedMaterial.GetInstanceID() == value.GetInstanceID())\n                    return;\n\n                m_sharedMaterial = m_material = value;\n\n                m_padding = GetPaddingForMaterial();\n\n                SetVerticesDirty();\n                SetMaterialDirty();\n            }\n        }\n        [SerializeField]\n        private Material m_material;\n\n\n        /// <summary>\n        /// The material to be assigned to this text object.\n        /// </summary>\n        public Material sharedMaterial\n        {\n            get { return m_sharedMaterial; }\n            set { SetSharedMaterial(value); }\n        }\n        [SerializeField]\n        private Material m_sharedMaterial;\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        public Material fallbackMaterial\n        {\n            get { return m_fallbackMaterial; }\n            set\n            {\n                if (m_fallbackMaterial == value) return;\n\n                if (m_fallbackMaterial != null && m_fallbackMaterial != value)\n                    TMP_MaterialManager.ReleaseFallbackMaterial(m_fallbackMaterial);\n\n                m_fallbackMaterial = value;\n                TMP_MaterialManager.AddFallbackMaterialReference(m_fallbackMaterial);\n\n                SetSharedMaterial(m_fallbackMaterial);\n            }\n        }\n        private Material m_fallbackMaterial;\n\n\n        /// <summary>\n        /// The source material used by the fallback font\n        /// </summary>\n        public Material fallbackSourceMaterial\n        {\n            get { return m_fallbackSourceMaterial; }\n            set { m_fallbackSourceMaterial = value; }\n        }\n        private Material m_fallbackSourceMaterial;\n\n\n        /// <summary>\n        /// Get the material that will be used for rendering.\n        /// </summary>\n        public override Material materialForRendering\n        {\n            get\n            {\n                return TMP_MaterialManager.GetMaterialForRendering(this, m_sharedMaterial);\n            }\n        }\n\n\n        /// <summary>\n        /// Is the text object using the default font asset material.\n        /// </summary>\n        public bool isDefaultMaterial\n        {\n            get { return m_isDefaultMaterial; }\n            set { m_isDefaultMaterial = value; }\n        }\n        [SerializeField]\n        private bool m_isDefaultMaterial;\n\n\n        /// <summary>\n        /// Padding value resulting for the property settings on the material.\n        /// </summary>\n        public float padding\n        {\n            get { return m_padding; }\n            set { m_padding = value; }\n        }\n        [SerializeField]\n        private float m_padding;\n\n\n        /// <summary>\n        /// The Mesh Renderer of this text sub object.\n        /// </summary>\n        public new CanvasRenderer canvasRenderer\n        {\n            get { if (m_canvasRenderer == null) m_canvasRenderer = GetComponent<CanvasRenderer>();\n\n                return m_canvasRenderer;\n            }\n        }\n        [SerializeField]\n        private CanvasRenderer m_canvasRenderer;\n\n\n        /// <summary>\n        /// The Mesh of this text sub object.\n        /// </summary>\n        public Mesh mesh\n        {\n            get\n            {\n                if (m_mesh == null)\n                {\n                    m_mesh = new Mesh();\n                    m_mesh.hideFlags = HideFlags.HideAndDontSave;\n                }\n\n                return m_mesh;\n            }\n            set { m_mesh = value; }\n        }\n        private Mesh m_mesh;\n\n\n        [SerializeField]\n        private TextMeshProUGUI m_TextComponent;\n\n\n        [System.NonSerialized]\n        private bool m_isRegisteredForEvents;\n        private bool m_materialDirty;\n        [SerializeField]\n        private int m_materialReferenceIndex;\n\n\n\n        /// <summary>\n        /// Function to add a new sub text object.\n        /// </summary>\n        /// <param name=\"textComponent\"></param>\n        /// <param name=\"materialReference\"></param>\n        /// <returns></returns>\n        public static TMP_SubMeshUI AddSubTextObject(TextMeshProUGUI textComponent, MaterialReference materialReference)\n        {\n            GameObject go = new GameObject(\"TMP UI SubObject [\" + materialReference.material.name + \"]\", typeof(RectTransform));\n\n            go.transform.SetParent(textComponent.transform, false);\n            go.layer = textComponent.gameObject.layer;\n\n            RectTransform rectTransform = go.GetComponent<RectTransform>();\n            rectTransform.anchorMin = Vector2.zero;\n            rectTransform.anchorMax = Vector2.one;\n            rectTransform.sizeDelta = Vector2.zero;\n            rectTransform.pivot = textComponent.rectTransform.pivot;\n\n            TMP_SubMeshUI subMesh = go.AddComponent<TMP_SubMeshUI>();\n\n            subMesh.m_canvasRenderer = subMesh.canvasRenderer;\n            subMesh.m_TextComponent = textComponent;\n\n            subMesh.m_materialReferenceIndex = materialReference.index;\n            subMesh.m_fontAsset = materialReference.fontAsset;\n            subMesh.m_spriteAsset = materialReference.spriteAsset;\n            subMesh.m_isDefaultMaterial = materialReference.isDefaultMaterial;\n            subMesh.SetSharedMaterial(materialReference.material);\n\n            return subMesh;\n        }\n\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        protected override void OnEnable()\n        {\n            //Debug.Log(\"*** SubObject OnEnable() ***\");\n\n            // Register Callbacks for various events.\n            if (!m_isRegisteredForEvents)\n            {\n\n            #if UNITY_EDITOR\n                TMPro_EventManager.MATERIAL_PROPERTY_EVENT.Add(ON_MATERIAL_PROPERTY_CHANGED);\n                TMPro_EventManager.FONT_PROPERTY_EVENT.Add(ON_FONT_PROPERTY_CHANGED);\n                //TMPro_EventManager.TEXTMESHPRO_PROPERTY_EVENT.Add(ON_TEXTMESHPRO_PROPERTY_CHANGED);\n                TMPro_EventManager.DRAG_AND_DROP_MATERIAL_EVENT.Add(ON_DRAG_AND_DROP_MATERIAL);\n                //TMPro_EventManager.TEXT_STYLE_PROPERTY_EVENT.Add(ON_TEXT_STYLE_CHANGED);\n                TMPro_EventManager.SPRITE_ASSET_PROPERTY_EVENT.Add(ON_SPRITE_ASSET_PROPERTY_CHANGED);\n                //TMPro_EventManager.TMP_SETTINGS_PROPERTY_EVENT.Add(ON_TMP_SETTINGS_CHANGED);\n            #endif\n\n                m_isRegisteredForEvents = true;\n            }\n\n            m_ShouldRecalculateStencil = true;\n            RecalculateClipping();\n            RecalculateMasking();\n\n            //SetAllDirty();\n        }\n\n\n        protected override void OnDisable()\n        {\n            //Debug.Log(\"*** SubObject OnDisable() ***\");\n\n            //m_canvasRenderer.Clear();\n            TMP_UpdateRegistry.UnRegisterCanvasElementForRebuild(this);\n\n            if (m_MaskMaterial != null)\n            {\n                TMP_MaterialManager.ReleaseStencilMaterial(m_MaskMaterial);\n                m_MaskMaterial = null;\n            }\n\n            if (m_fallbackMaterial != null)\n            {\n                TMP_MaterialManager.ReleaseFallbackMaterial(m_fallbackMaterial);\n                m_fallbackMaterial = null;\n            }\n\n            base.OnDisable();\n        }\n\n\n        protected override void OnDestroy()\n        {\n            //Debug.Log(\"*** OnDestroy() ***\");\n\n            // Destroy Mesh\n            if (m_mesh != null) DestroyImmediate(m_mesh);\n\n            if (m_MaskMaterial != null)\n                TMP_MaterialManager.ReleaseStencilMaterial(m_MaskMaterial);\n\n            if (m_fallbackMaterial != null)\n            {\n                TMP_MaterialManager.ReleaseFallbackMaterial(m_fallbackMaterial);\n                m_fallbackMaterial = null;\n            }\n\n#if UNITY_EDITOR\n            // Unregister the event this object was listening to\n            TMPro_EventManager.MATERIAL_PROPERTY_EVENT.Remove(ON_MATERIAL_PROPERTY_CHANGED);\n            TMPro_EventManager.FONT_PROPERTY_EVENT.Remove(ON_FONT_PROPERTY_CHANGED);\n            //TMPro_EventManager.TEXTMESHPRO_PROPERTY_EVENT.Remove(ON_TEXTMESHPRO_PROPERTY_CHANGED);\n            TMPro_EventManager.DRAG_AND_DROP_MATERIAL_EVENT.Remove(ON_DRAG_AND_DROP_MATERIAL);\n            //TMPro_EventManager.TEXT_STYLE_PROPERTY_EVENT.Remove(ON_TEXT_STYLE_CHANGED);\n            TMPro_EventManager.SPRITE_ASSET_PROPERTY_EVENT.Remove(ON_SPRITE_ASSET_PROPERTY_CHANGED);\n            //TMPro_EventManager.TMP_SETTINGS_PROPERTY_EVENT.Remove(ON_TMP_SETTINGS_CHANGED);\n        #endif\n\n            m_isRegisteredForEvents = false;\n\n            RecalculateClipping();\n        }\n\n\n\n#if UNITY_EDITOR\n        // Event received when custom material editor properties are changed.\n        void ON_MATERIAL_PROPERTY_CHANGED(bool isChanged, Material mat)\n        {\n            //Debug.Log(\"*** ON_MATERIAL_PROPERTY_CHANGED ***\");\n\n            int targetMaterialID = mat.GetInstanceID();\n            int sharedMaterialID = m_sharedMaterial.GetInstanceID();\n            int maskingMaterialID = m_MaskMaterial == null ? 0 : m_MaskMaterial.GetInstanceID();\n            int fallbackSourceMaterialID = m_fallbackSourceMaterial == null ? 0 : m_fallbackSourceMaterial.GetInstanceID();\n\n            // Filter events and return if the affected material is not this object's material.\n            //if (targetMaterialID != sharedMaterialID && targetMaterialID != maskingMaterialID) return;\n\n            // Filter events and return if the affected material is not this object's material.\n            if (m_fallbackMaterial != null && fallbackSourceMaterialID == targetMaterialID)\n                TMP_MaterialManager.CopyMaterialPresetProperties(mat, m_fallbackMaterial);\n\n            if (m_TextComponent == null) m_TextComponent = GetComponentInParent<TextMeshProUGUI>();\n\n            // Make sure material properties are synchronized between the assigned material and masking material.\n            if (m_MaskMaterial != null)\n            {\n                UnityEditor.Undo.RecordObject(m_MaskMaterial, \"Material Property Changes\");\n                UnityEditor.Undo.RecordObject(m_sharedMaterial, \"Material Property Changes\");\n\n                if (targetMaterialID == sharedMaterialID)\n                {\n                    //Debug.Log(\"Copy base material properties to masking material if not null.\");\n                    float stencilID = m_MaskMaterial.GetFloat(ShaderUtilities.ID_StencilID);\n                    float stencilComp = m_MaskMaterial.GetFloat(ShaderUtilities.ID_StencilComp);\n                    m_MaskMaterial.CopyPropertiesFromMaterial(mat);\n                    m_MaskMaterial.shaderKeywords = mat.shaderKeywords;\n\n                    m_MaskMaterial.SetFloat(ShaderUtilities.ID_StencilID, stencilID);\n                    m_MaskMaterial.SetFloat(ShaderUtilities.ID_StencilComp, stencilComp);\n                }\n                else if (targetMaterialID == maskingMaterialID)\n                {\n                    // Update the padding \n                    GetPaddingForMaterial(mat);\n\n                    m_sharedMaterial.CopyPropertiesFromMaterial(mat);\n                    m_sharedMaterial.shaderKeywords = mat.shaderKeywords;\n                    m_sharedMaterial.SetFloat(ShaderUtilities.ID_StencilID, 0);\n                    m_sharedMaterial.SetFloat(ShaderUtilities.ID_StencilComp, 8);\n                }\n                else if (fallbackSourceMaterialID == targetMaterialID)\n                {\n                    float stencilID = m_MaskMaterial.GetFloat(ShaderUtilities.ID_StencilID);\n                    float stencilComp = m_MaskMaterial.GetFloat(ShaderUtilities.ID_StencilComp);\n                    m_MaskMaterial.CopyPropertiesFromMaterial(m_fallbackMaterial);\n                    m_MaskMaterial.shaderKeywords = m_fallbackMaterial.shaderKeywords;\n\n                    m_MaskMaterial.SetFloat(ShaderUtilities.ID_StencilID, stencilID);\n                    m_MaskMaterial.SetFloat(ShaderUtilities.ID_StencilComp, stencilComp);\n                }\n            }\n\n            m_padding = GetPaddingForMaterial();\n\n            SetVerticesDirty();\n            m_ShouldRecalculateStencil = true;\n            RecalculateClipping();\n            RecalculateMasking();\n        }\n\n\n        // Event to Track Material Changed resulting from Drag-n-drop.\n        void ON_DRAG_AND_DROP_MATERIAL(GameObject obj, Material currentMaterial, Material newMaterial)\n        {\n            // Check if event applies to this current object\n            #if UNITY_2018_2_OR_NEWER\n            if (obj == gameObject || UnityEditor.PrefabUtility.GetCorrespondingObjectFromSource(gameObject) == obj)\n            #else\n            if (obj == gameObject || UnityEditor.PrefabUtility.GetPrefabParent(gameObject) == obj)\n            #endif\n            {\n                if (!m_isDefaultMaterial) return;\n\n                // Make sure we have a valid reference to the renderer.\n                if (m_canvasRenderer == null) m_canvasRenderer = GetComponent<CanvasRenderer>();\n\n                UnityEditor.Undo.RecordObject(this, \"Material Assignment\");\n                UnityEditor.Undo.RecordObject(m_canvasRenderer, \"Material Assignment\");\n\n                SetSharedMaterial(newMaterial);\n                m_TextComponent.havePropertiesChanged = true;\n            }\n        }\n\n        // Event received when font asset properties are changed in Font Inspector\n        void ON_SPRITE_ASSET_PROPERTY_CHANGED(bool isChanged, UnityEngine.Object obj)\n        {\n            //if (spriteSheet != null && (obj as TMP_SpriteAsset == m_spriteAsset || obj as Texture2D == m_spriteAsset.spriteSheet))\n            //{\n            if (m_TextComponent != null)\n            {\n                m_TextComponent.havePropertiesChanged = true;\n                //m_TextComponent.SetVerticesDirty();\n            }\n\n            //}\n        }\n\n        // Event received when font asset properties are changed in Font Inspector\n        void ON_FONT_PROPERTY_CHANGED(bool isChanged, TMP_FontAsset font)\n        {\n            if (m_fontAsset != null && font.GetInstanceID() == m_fontAsset.GetInstanceID())\n            {\n                // Copy Normal and Bold Weight\n                if (m_fallbackMaterial != null)\n                {\n                    m_fallbackMaterial.SetFloat(ShaderUtilities.ID_WeightNormal, m_fontAsset.normalStyle);\n                    m_fallbackMaterial.SetFloat(ShaderUtilities.ID_WeightBold, m_fontAsset.boldStyle);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Event received when the TMP Settings are changed.\n        /// </summary>\n        void ON_TMP_SETTINGS_CHANGED()\n        {\n            //Debug.Log(\"TMP Setting have changed.\");\n            //SetVerticesDirty();\n            //SetMaterialDirty();\n        }\n#endif\n\n        /// <summary>\n        /// \n        /// </summary>\n        protected override void OnTransformParentChanged()\n        {\n            if (!this.IsActive())\n                return;\n\n            m_ShouldRecalculateStencil = true;\n            RecalculateClipping();\n            RecalculateMasking();\n        }\n\n\n        /// <summary>\n        /// Function returning the modified material for masking if necessary.\n        /// </summary>\n        /// <param name=\"baseMaterial\"></param>\n        /// <returns></returns>\n        public override Material GetModifiedMaterial(Material baseMaterial)\n        {\n            Material mat = baseMaterial;\n\n            if (m_ShouldRecalculateStencil)\n            {\n                m_StencilValue = TMP_MaterialManager.GetStencilID(gameObject);\n                m_ShouldRecalculateStencil = false;\n            }\n\n            if (m_StencilValue > 0)\n            {\n                mat = TMP_MaterialManager.GetStencilMaterial(baseMaterial, m_StencilValue);\n                if (m_MaskMaterial != null)\n                    TMP_MaterialManager.ReleaseStencilMaterial(m_MaskMaterial);\n\n                m_MaskMaterial = mat;\n            }\n\n            return mat;\n        }\n\n\n        /// <summary>\n        /// Function called when the padding value for the material needs to be re-calculated.\n        /// </summary>\n        /// <returns></returns>\n        public float GetPaddingForMaterial()\n        {\n            float padding = ShaderUtilities.GetPadding(m_sharedMaterial, m_TextComponent.extraPadding, m_TextComponent.isUsingBold);\n\n            return padding;\n        }\n\n\n        /// <summary>\n        /// Function called when the padding value for the material needs to be re-calculated.\n        /// </summary>\n        /// <returns></returns>\n        public float GetPaddingForMaterial(Material mat)\n        {\n            float padding = ShaderUtilities.GetPadding(mat, m_TextComponent.extraPadding, m_TextComponent.isUsingBold);\n\n            return padding;\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"isExtraPadding\"></param>\n        /// <param name=\"isBold\"></param>\n        public void UpdateMeshPadding(bool isExtraPadding, bool isUsingBold)\n        {\n            m_padding = ShaderUtilities.GetPadding(m_sharedMaterial, isExtraPadding, isUsingBold);\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        public override void SetAllDirty()\n        {\n            //SetLayoutDirty();\n            //SetVerticesDirty();\n            //SetMaterialDirty();\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        public override void SetVerticesDirty()\n        {\n            if (!this.IsActive())\n                return;\n\n            // This is called on the parent TextMeshPro component.\n            if (m_TextComponent != null)\n            {\n                m_TextComponent.havePropertiesChanged = true;\n                m_TextComponent.SetVerticesDirty();\n            }\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        public override void SetLayoutDirty()\n        {\n\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        public override void SetMaterialDirty()\n        {\n            //Debug.Log(\"*** STO-UI - SetMaterialDirty() *** FRAME (\" + Time.frameCount + \")\");\n\n            //if (!this.IsActive())\n            //    return;\n\n            m_materialDirty = true;\n\n            UpdateMaterial();\n\n            if (m_OnDirtyMaterialCallback != null)\n                m_OnDirtyMaterialCallback();\n\n            //TMP_ITextElementUpdateManager.RegisterTextElementForGraphicRebuild(this);\n\n            //TMP_UpdateRegistry.RegisterCanvasElementForGraphicRebuild((ICanvasElement)this);\n            //m_TextComponent.SetMaterialDirty();\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        public void SetPivotDirty()\n        {\n            if (!this.IsActive())\n                return;\n\n            this.rectTransform.pivot = m_TextComponent.rectTransform.pivot;\n        }\n\n\n        /// <summary>\n        /// Override to Cull function of MaskableGraphic to prevent Culling.\n        /// </summary>\n        /// <param name=\"clipRect\"></param>\n        /// <param name=\"validRect\"></param>\n        public override void Cull(Rect clipRect, bool validRect)\n        {\n            if (m_TextComponent.ignoreRectMaskCulling) return;\n\n            base.Cull(clipRect, validRect);\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        protected override void UpdateGeometry()\n        {\n            // Need to override to prevent Unity from changing the geometry of the object.\n            Debug.Log(\"UpdateGeometry()\");\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"update\"></param>\n        public override void Rebuild(CanvasUpdate update)\n        {\n            if (update == CanvasUpdate.PreRender)\n            {\n                if (!m_materialDirty) return;\n\n                UpdateMaterial();\n                m_materialDirty = false;\n            }\n        }\n\n\n        /// <summary>\n        /// Function to update the material from the parent text object.\n        /// </summary>\n        public void RefreshMaterial()\n        {\n            UpdateMaterial();\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        protected override void UpdateMaterial()\n        {\n            //Debug.Log(\"*** STO-UI - UpdateMaterial() *** FRAME (\" + Time.frameCount + \")\");\n\n            //if (!this.IsActive())\n            //    return;\n\n            if (m_canvasRenderer == null) m_canvasRenderer = this.canvasRenderer;\n\n            m_canvasRenderer.materialCount = 1;\n            m_canvasRenderer.SetMaterial(materialForRendering, 0);\n            m_canvasRenderer.SetTexture(mainTexture);\n\n            #if UNITY_EDITOR\n            if (m_sharedMaterial != null && gameObject.name != \"TMP SubMeshUI [\" + m_sharedMaterial.name + \"]\")\n                gameObject.name = \"TMP SubMeshUI [\" + m_sharedMaterial.name + \"]\";\n            #endif\n        }\n\n\n        // IClippable implementation\n        /// <summary>\n        /// Method called when the state of a parent changes.\n        /// </summary>\n        public override void RecalculateClipping()\n        {\n            //Debug.Log(\"*** RecalculateClipping() ***\");\n            base.RecalculateClipping();\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        public override void RecalculateMasking()\n        {\n            //Debug.Log(\"RecalculateMasking()\");\n\n            this.m_ShouldRecalculateStencil = true;\n            SetMaterialDirty();\n        }\n\n\n\n        /// <summary>\n        /// Method which returns an instance of the shared material\n        /// </summary>\n        /// <returns></returns>\n        Material GetMaterial()\n        {\n            // Make sure we have a valid reference to the renderer.\n            //if (m_renderer == null) m_renderer = GetComponent<Renderer>();\n\n            //if (m_material == null || m_isNewSharedMaterial)\n            //{\n            //    m_renderer.material = m_sharedMaterial;\n            //    m_material = m_renderer.material;\n            //    m_sharedMaterial = m_material;\n            //    m_padding = ShaderUtilities.GetPadding(m_sharedMaterial, m_TextMeshPro.extraPadding, false);\n            //    m_isNewSharedMaterial = false;\n            //}\n\n            return m_sharedMaterial;\n        }\n\n\n        // Function called internally when a new material is assigned via the fontMaterial property.\n        Material GetMaterial(Material mat)\n        {\n            // Check in case Object is disabled. If so, we don't have a valid reference to the Renderer.\n            // This can occur when the Duplicate Material Context menu is used on an inactive object.\n            //if (m_renderer == null)\n            //    m_renderer = GetComponent<Renderer>();\n\n            // Create Instance Material only if the new material is not the same instance previously used.\n            if (m_material == null || m_material.GetInstanceID() != mat.GetInstanceID())\n                m_material = CreateMaterialInstance(mat);\n\n            m_sharedMaterial = m_material;\n\n            // Compute and Set new padding values for this new material. \n            m_padding = GetPaddingForMaterial();\n\n            SetVerticesDirty();\n            SetMaterialDirty();\n\n            return m_sharedMaterial;\n        }\n\n\n        /// <summary>\n        /// Method used to create an instance of the material\n        /// </summary>\n        /// <param name=\"source\"></param>\n        /// <returns></returns>\n        Material CreateMaterialInstance(Material source)\n        {\n            Material mat = new Material(source);\n            mat.shaderKeywords = source.shaderKeywords;\n            mat.name += \" (Instance)\";\n\n            return mat;\n        }\n\n\n        /// <summary>\n        /// Method returning the shared material assigned to the text object.\n        /// </summary>\n        /// <returns></returns>\n        Material GetSharedMaterial()\n        {\n            if (m_canvasRenderer == null)\n                m_canvasRenderer = GetComponent<CanvasRenderer>();\n\n            return m_canvasRenderer.GetMaterial();\n        }\n\n\n        /// <summary>\n        /// Method to set the shared material.\n        /// </summary>\n        /// <param name=\"mat\"></param>\n        void SetSharedMaterial(Material mat)\n        {\n            //Debug.Log(\"*** SetSharedMaterial UI() *** FRAME (\" + Time.frameCount + \")\");\n\n            // Assign new material.\n            m_sharedMaterial = mat;\n            m_Material = m_sharedMaterial;\n\n            //m_isDefaultMaterial = false;\n            //if (mat.GetInstanceID() == m_fontAsset.material.GetInstanceID())\n            //    m_isDefaultMaterial = true;\n\n            // Compute and Set new padding values for this new material.\n            m_padding = GetPaddingForMaterial();\n\n            //SetVerticesDirty();\n            SetMaterialDirty();\n\n#if UNITY_EDITOR\n            //if (m_sharedMaterial != null)\n            //    gameObject.name = \"TMP SubMesh [\" + m_sharedMaterial.name + \"]\";\n#endif\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_SubMeshUI.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 058cba836c1846c3aa1c5fd2e28aea77\ntimeCreated: 1454709708\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_Text.cs",
    "content": "﻿#define TMP_PRESENT\n\nusing UnityEngine;\nusing UnityEngine.TextCore;\nusing UnityEngine.UI;\nusing UnityEngine.Events;\nusing UnityEngine.EventSystems;\nusing System;\nusing System.Text;\nusing System.Collections;\nusing System.Collections.Generic;\n\n\nnamespace TMPro\n{\n    public interface ITextElement\n    {\n        Material sharedMaterial { get; }\n\n        void Rebuild(CanvasUpdate update);\n        int GetInstanceID();\n    }\n\n    public enum TextAlignmentOptions\n    {\n        TopLeft = _HorizontalAlignmentOptions.Left | _VerticalAlignmentOptions.Top,\n        Top = _HorizontalAlignmentOptions.Center | _VerticalAlignmentOptions.Top,\n        TopRight = _HorizontalAlignmentOptions.Right | _VerticalAlignmentOptions.Top,\n        TopJustified = _HorizontalAlignmentOptions.Justified | _VerticalAlignmentOptions.Top,\n        TopFlush = _HorizontalAlignmentOptions.Flush | _VerticalAlignmentOptions.Top,\n        TopGeoAligned = _HorizontalAlignmentOptions.Geometry | _VerticalAlignmentOptions.Top,\n\n        Left = _HorizontalAlignmentOptions.Left | _VerticalAlignmentOptions.Middle,\n        Center = _HorizontalAlignmentOptions.Center | _VerticalAlignmentOptions.Middle,\n        Right = _HorizontalAlignmentOptions.Right | _VerticalAlignmentOptions.Middle,\n        Justified = _HorizontalAlignmentOptions.Justified | _VerticalAlignmentOptions.Middle,\n        Flush = _HorizontalAlignmentOptions.Flush | _VerticalAlignmentOptions.Middle,\n        CenterGeoAligned = _HorizontalAlignmentOptions.Geometry | _VerticalAlignmentOptions.Middle,\n\n        BottomLeft = _HorizontalAlignmentOptions.Left | _VerticalAlignmentOptions.Bottom,\n        Bottom = _HorizontalAlignmentOptions.Center | _VerticalAlignmentOptions.Bottom,\n        BottomRight = _HorizontalAlignmentOptions.Right | _VerticalAlignmentOptions.Bottom,\n        BottomJustified = _HorizontalAlignmentOptions.Justified | _VerticalAlignmentOptions.Bottom,\n        BottomFlush = _HorizontalAlignmentOptions.Flush | _VerticalAlignmentOptions.Bottom,\n        BottomGeoAligned = _HorizontalAlignmentOptions.Geometry | _VerticalAlignmentOptions.Bottom,\n\n        BaselineLeft = _HorizontalAlignmentOptions.Left | _VerticalAlignmentOptions.Baseline,\n        Baseline = _HorizontalAlignmentOptions.Center | _VerticalAlignmentOptions.Baseline,\n        BaselineRight = _HorizontalAlignmentOptions.Right | _VerticalAlignmentOptions.Baseline,\n        BaselineJustified = _HorizontalAlignmentOptions.Justified | _VerticalAlignmentOptions.Baseline,\n        BaselineFlush = _HorizontalAlignmentOptions.Flush | _VerticalAlignmentOptions.Baseline,\n        BaselineGeoAligned = _HorizontalAlignmentOptions.Geometry | _VerticalAlignmentOptions.Baseline,\n\n        MidlineLeft = _HorizontalAlignmentOptions.Left | _VerticalAlignmentOptions.Geometry,\n        Midline = _HorizontalAlignmentOptions.Center | _VerticalAlignmentOptions.Geometry,\n        MidlineRight = _HorizontalAlignmentOptions.Right | _VerticalAlignmentOptions.Geometry,\n        MidlineJustified = _HorizontalAlignmentOptions.Justified | _VerticalAlignmentOptions.Geometry,\n        MidlineFlush = _HorizontalAlignmentOptions.Flush | _VerticalAlignmentOptions.Geometry,\n        MidlineGeoAligned = _HorizontalAlignmentOptions.Geometry | _VerticalAlignmentOptions.Geometry,\n\n        CaplineLeft = _HorizontalAlignmentOptions.Left | _VerticalAlignmentOptions.Capline,\n        Capline = _HorizontalAlignmentOptions.Center | _VerticalAlignmentOptions.Capline,\n        CaplineRight = _HorizontalAlignmentOptions.Right | _VerticalAlignmentOptions.Capline,\n        CaplineJustified = _HorizontalAlignmentOptions.Justified | _VerticalAlignmentOptions.Capline,\n        CaplineFlush = _HorizontalAlignmentOptions.Flush | _VerticalAlignmentOptions.Capline,\n        CaplineGeoAligned = _HorizontalAlignmentOptions.Geometry | _VerticalAlignmentOptions.Capline\n    };\n\n    /// <summary>\n    /// Internal horizontal text alignment options.\n    /// </summary>\n    public enum _HorizontalAlignmentOptions\n    {\n        Left = 0x1, Center = 0x2, Right = 0x4, Justified = 0x8, Flush = 0x10, Geometry = 0x20\n    }\n\n    /// <summary>\n    /// Internal vertical text alignment options.\n    /// </summary>\n    public enum _VerticalAlignmentOptions\n    {\n        Top = 0x100, Middle = 0x200, Bottom = 0x400, Baseline = 0x800, Geometry = 0x1000, Capline = 0x2000,\n    }\n\n\n    /// <summary>\n    /// Flags controlling what vertex data gets pushed to the mesh.\n    /// </summary>\n    public enum TextRenderFlags\n    {\n        DontRender = 0x0,\n        Render = 0xFF\n    };\n\n    public enum TMP_TextElementType { Character, Sprite };\n    public enum MaskingTypes { MaskOff = 0, MaskHard = 1, MaskSoft = 2 }; //, MaskTex = 4 };\n    public enum TextOverflowModes { Overflow = 0, Ellipsis = 1, Masking = 2, Truncate = 3, ScrollRect = 4, Page = 5, Linked = 6 };\n    public enum MaskingOffsetMode { Percentage = 0, Pixel = 1 };\n    public enum TextureMappingOptions { Character = 0, Line = 1, Paragraph = 2, MatchAspect = 3 };\n\n    public enum FontStyles { Normal = 0x0, Bold = 0x1, Italic = 0x2, Underline = 0x4, LowerCase = 0x8, UpperCase = 0x10, SmallCaps = 0x20, Strikethrough = 0x40, Superscript = 0x80, Subscript = 0x100, Highlight = 0x200 };\n    public enum FontWeight { Thin = 100, ExtraLight = 200, Light = 300, Regular = 400, Medium = 500, SemiBold = 600, Bold = 700, Heavy = 800, Black = 900 };\n\n    /// <summary>\n    /// Base class which contains common properties and functions shared between the TextMeshPro and TextMeshProUGUI component.\n    /// </summary>\n    public abstract class TMP_Text : MaskableGraphic\n    {\n        /// <summary>\n        /// A string containing the text to be displayed.\n        /// </summary>\n        public string text\n        {\n            get { return m_text; }\n            set { if (m_text == value) return; m_text = old_text = value; m_inputSource = TextInputSources.String; m_havePropertiesChanged = true; m_isCalculateSizeRequired = true; m_isInputParsingRequired = true; SetVerticesDirty(); SetLayoutDirty(); }\n        }\n        [SerializeField]\n        [TextArea(5, 10)]\n        protected string m_text;\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        public bool isRightToLeftText\n        {\n            get { return m_isRightToLeft; }\n            set { if (m_isRightToLeft == value) return; m_isRightToLeft = value; m_havePropertiesChanged = true; m_isCalculateSizeRequired = true; m_isInputParsingRequired = true; SetVerticesDirty(); SetLayoutDirty(); }\n        }\n        [SerializeField]\n        protected bool m_isRightToLeft = false;\n\n\n        /// <summary>\n        /// The Font Asset to be assigned to this text object.\n        /// </summary>\n        public TMP_FontAsset font\n        {\n            get { return m_fontAsset; }\n            set { if (m_fontAsset == value) return; m_fontAsset = value; LoadFontAsset(); m_havePropertiesChanged = true; m_isCalculateSizeRequired = true; m_isInputParsingRequired = true; SetVerticesDirty(); SetLayoutDirty(); }\n        }\n        [SerializeField]\n        protected TMP_FontAsset m_fontAsset;\n        protected TMP_FontAsset m_currentFontAsset;\n        protected bool m_isSDFShader;\n\n\n        /// <summary>\n        /// The material to be assigned to this text object.\n        /// </summary>\n        public virtual Material fontSharedMaterial\n        {\n            get { return m_sharedMaterial; }\n            set { if (m_sharedMaterial == value) return; SetSharedMaterial(value); m_havePropertiesChanged = true; m_isInputParsingRequired = true; SetVerticesDirty(); SetMaterialDirty(); }\n        }\n        [SerializeField]\n        protected Material m_sharedMaterial;\n        protected Material m_currentMaterial;\n        protected MaterialReference[] m_materialReferences = new MaterialReference[32];\n        protected Dictionary<int, int> m_materialReferenceIndexLookup = new Dictionary<int, int>();\n\n        protected TMP_RichTextTagStack<MaterialReference> m_materialReferenceStack = new TMP_RichTextTagStack<MaterialReference>(new MaterialReference[16]);\n        protected int m_currentMaterialIndex;\n        //protected int m_sharedMaterialHashCode;\n\n\n        /// <summary>\n        /// An array containing the materials used by the text object.\n        /// </summary>\n        public virtual Material[] fontSharedMaterials\n        {\n            get { return GetSharedMaterials(); }\n            set { SetSharedMaterials(value); m_havePropertiesChanged = true; m_isInputParsingRequired = true; SetVerticesDirty(); SetMaterialDirty(); }\n        }\n        [SerializeField]\n        protected Material[] m_fontSharedMaterials;\n\n\n        /// <summary>\n        /// The material to be assigned to this text object. An instance of the material will be assigned to the object's renderer.\n        /// </summary>\n        public Material fontMaterial\n        {\n            // Return an Instance of the current material.\n            get { return GetMaterial(m_sharedMaterial); }\n\n            // Assign new font material\n            set\n            {\n                if (m_sharedMaterial != null && m_sharedMaterial.GetInstanceID() == value.GetInstanceID()) return;\n\n                m_sharedMaterial = value;\n\n                m_padding = GetPaddingForMaterial();\n                m_havePropertiesChanged = true;\n                m_isInputParsingRequired = true;\n\n                SetVerticesDirty();\n                SetMaterialDirty();\n            }\n        }\n        [SerializeField]\n        protected Material m_fontMaterial;\n\n\n        /// <summary>\n        /// The materials to be assigned to this text object. An instance of the materials will be assigned.\n        /// </summary>\n        public virtual Material[] fontMaterials\n        {\n            get { return GetMaterials(m_fontSharedMaterials); }\n\n            set { SetSharedMaterials(value); m_havePropertiesChanged = true; m_isInputParsingRequired = true; SetVerticesDirty(); SetMaterialDirty(); }\n        }\n        [SerializeField]\n        protected Material[] m_fontMaterials;\n\n        protected bool m_isMaterialDirty;\n\n\n        /// <summary>\n        /// This is the default vertex color assigned to each vertices. Color tags will override vertex colors unless the overrideColorTags is set.\n        /// </summary>\n        public override Color color\n        {\n            get { return m_fontColor; }\n            set { if (m_fontColor == value) return; m_havePropertiesChanged = true; m_fontColor = value; SetVerticesDirty(); }\n        }\n        //[UnityEngine.Serialization.FormerlySerializedAs(\"m_fontColor\")] // Required for backwards compatibility with pre-Unity 4.6 releases.\n        [SerializeField]\n        protected Color32 m_fontColor32 = Color.white;\n        [SerializeField]\n        protected Color m_fontColor = Color.white;\n        protected static Color32 s_colorWhite = new Color32(255, 255, 255, 255);\n        protected Color32 m_underlineColor = s_colorWhite;\n        protected Color32 m_strikethroughColor = s_colorWhite;\n        protected Color32 m_highlightColor = s_colorWhite;\n        protected Vector4 m_highlightPadding = Vector4.zero;\n        \n\n        /// <summary>\n        /// Sets the vertex color alpha value.\n        /// </summary>\n        public float alpha\n        {\n            get { return m_fontColor.a; }\n            set { if (m_fontColor.a == value) return; m_fontColor.a = value; m_havePropertiesChanged = true; SetVerticesDirty(); }\n        }\n\n\n        /// <summary>\n        /// Determines if Vertex Color Gradient should be used\n        /// </summary>\n        /// <value><c>true</c> if enable vertex gradient; otherwise, <c>false</c>.</value>\n        public bool enableVertexGradient\n        {\n            get { return m_enableVertexGradient; }\n            set { if (m_enableVertexGradient == value) return; m_havePropertiesChanged = true; m_enableVertexGradient = value; SetVerticesDirty(); }\n        }\n        [SerializeField]\n        protected bool m_enableVertexGradient;\n\n        [SerializeField]\n        protected ColorMode m_colorMode = ColorMode.FourCornersGradient;\n        \n        /// <summary>\n        /// Sets the vertex colors for each of the 4 vertices of the character quads.\n        /// </summary>\n        /// <value>The color gradient.</value>\n        public VertexGradient colorGradient\n        {\n            get { return m_fontColorGradient; }\n            set { m_havePropertiesChanged = true; m_fontColorGradient = value; SetVerticesDirty(); }\n        }\n        [SerializeField]\n        protected VertexGradient m_fontColorGradient = new VertexGradient(Color.white);\n\n\n        /// <summary>\n        /// Set the vertex colors of the 4 vertices of each character quads.\n        /// </summary>\n        public TMP_ColorGradient colorGradientPreset\n        {\n            get { return m_fontColorGradientPreset; }\n            set { m_havePropertiesChanged = true; m_fontColorGradientPreset = value; SetVerticesDirty(); }\n        }\n        [SerializeField]\n        protected TMP_ColorGradient m_fontColorGradientPreset;\n\n\n        /// <summary>\n        /// Default Sprite Asset used by the text object.\n        /// </summary>\n        public TMP_SpriteAsset spriteAsset\n        {\n            get { return m_spriteAsset; }\n            set { m_spriteAsset = value; m_havePropertiesChanged = true; m_isInputParsingRequired = true; m_isCalculateSizeRequired = true; SetVerticesDirty(); SetLayoutDirty(); }\n        }\n        [SerializeField]\n        protected TMP_SpriteAsset m_spriteAsset;\n\n\n        /// <summary>\n        /// Determines whether or not the sprite color is multiplies by the vertex color of the text.\n        /// </summary>\n        public bool tintAllSprites\n        {\n            get { return m_tintAllSprites; }\n            set { if (m_tintAllSprites == value) return; m_tintAllSprites = value; m_havePropertiesChanged = true; SetVerticesDirty(); }\n        }\n        [SerializeField]\n        protected bool m_tintAllSprites;\n        protected bool m_tintSprite;\n        protected Color32 m_spriteColor;\n\n\n        /// <summary>\n        /// This overrides the color tags forcing the vertex colors to be the default font color.\n        /// </summary>\n        public bool overrideColorTags\n        {\n            get { return m_overrideHtmlColors; }\n            set { if (m_overrideHtmlColors == value) return; m_havePropertiesChanged = true; m_overrideHtmlColors = value; SetVerticesDirty(); }\n        }\n        [SerializeField]\n        protected bool m_overrideHtmlColors = false;\n\n\n        /// <summary>\n        /// Sets the color of the _FaceColor property of the assigned material. Changing face color will result in an instance of the material.\n        /// </summary>\n        public Color32 faceColor\n        {\n            get\n            {\n                if (m_sharedMaterial == null) return m_faceColor;\n\n                m_faceColor = m_sharedMaterial.GetColor(ShaderUtilities.ID_FaceColor);\n                return m_faceColor;\n            }\n\n            set { if (m_faceColor.Compare(value)) return; SetFaceColor(value); m_havePropertiesChanged = true; m_faceColor = value; SetVerticesDirty(); SetMaterialDirty(); }\n        }\n        [SerializeField]\n        protected Color32 m_faceColor = Color.white;\n\n\n        /// <summary>\n        /// Sets the color of the _OutlineColor property of the assigned material. Changing outline color will result in an instance of the material.\n        /// </summary>\n        public Color32 outlineColor\n        {\n            get\n            {\n                if (m_sharedMaterial == null) return m_outlineColor;\n\n                m_outlineColor = m_sharedMaterial.GetColor(ShaderUtilities.ID_OutlineColor);\n                return m_outlineColor;\n            }\n\n            set { if (m_outlineColor.Compare(value)) return; SetOutlineColor(value); m_havePropertiesChanged = true; m_outlineColor = value; SetVerticesDirty(); }\n        }\n        [SerializeField]\n        protected Color32 m_outlineColor = Color.black;\n\n\n        /// <summary>\n        /// Sets the thickness of the outline of the font. Setting this value will result in an instance of the material.\n        /// </summary>\n        public float outlineWidth\n        {\n            get\n            {\n                if (m_sharedMaterial == null) return m_outlineWidth;\n\n                m_outlineWidth = m_sharedMaterial.GetFloat(ShaderUtilities.ID_OutlineWidth);\n                return m_outlineWidth;\n            }\n            set { if (m_outlineWidth == value) return; SetOutlineThickness(value); m_havePropertiesChanged = true; m_outlineWidth = value; SetVerticesDirty(); }\n        }\n        protected float m_outlineWidth = 0.0f;\n\n\n        /// <summary>\n        /// The point size of the font.\n        /// </summary>\n        public float fontSize\n        {\n            get { return m_fontSize; }\n            set { if (m_fontSize == value) return; m_havePropertiesChanged = true; m_isCalculateSizeRequired = true; m_fontSize = value; if (!m_enableAutoSizing) m_fontSizeBase = m_fontSize; SetVerticesDirty(); SetLayoutDirty(); }\n        }\n        [SerializeField]\n        protected float m_fontSize = 36; // Font Size\n        protected float m_currentFontSize; // Temporary Font Size affected by tags\n        [SerializeField]\n        protected float m_fontSizeBase = 36;\n        protected TMP_RichTextTagStack<float> m_sizeStack = new TMP_RichTextTagStack<float>(16);\n\n\n        /// <summary>\n        /// The scale of the current text.\n        /// </summary>\n        public float fontScale\n        {\n            get { return m_fontScale; }\n        }\n\n\n        /// <summary>\n        /// Control the weight of the font if an alternative font asset is assigned for the given weight in the font asset editor.\n        /// </summary>\n        public FontWeight fontWeight\n        {\n            get { return m_fontWeight; }\n            set { if (m_fontWeight == value) return; m_fontWeight = value; m_havePropertiesChanged = true; m_isCalculateSizeRequired = true; m_isInputParsingRequired = true; SetVerticesDirty(); SetLayoutDirty(); }\n        }\n        [SerializeField]\n        protected FontWeight m_fontWeight = FontWeight.Regular;\n        protected FontWeight m_FontWeightInternal = FontWeight.Regular;\n        protected TMP_RichTextTagStack<FontWeight> m_FontWeightStack = new TMP_RichTextTagStack<FontWeight>(8);\n\n        /// <summary>\n        /// \n        /// </summary>\n        public float pixelsPerUnit\n        {\n            get\n            {\n                var localCanvas = canvas;\n                if (!localCanvas)\n                    return 1;\n                // For dynamic fonts, ensure we use one pixel per pixel on the screen.\n                if (!font)\n                    return localCanvas.scaleFactor;\n                // For non-dynamic fonts, calculate pixels per unit based on specified font size relative to font object's own font size.\n                if (m_currentFontAsset == null || m_currentFontAsset.faceInfo.pointSize <= 0 || m_fontSize <= 0)\n                    return 1;\n                return m_fontSize / m_currentFontAsset.faceInfo.pointSize;\n            }\n        }\n\n\n        /// <summary>\n        /// Enable text auto-sizing\n        /// </summary>\n        public bool enableAutoSizing\n        {\n            get { return m_enableAutoSizing; }\n            set { if (m_enableAutoSizing == value) return; m_enableAutoSizing = value; SetVerticesDirty(); SetLayoutDirty(); }\n        }\n        [SerializeField]\n        protected bool m_enableAutoSizing;\n        protected float m_maxFontSize; // Used in conjunction with auto-sizing\n        protected float m_minFontSize; // Used in conjunction with auto-sizing\n\n\n        /// <summary>\n        /// Minimum point size of the font when text auto-sizing is enabled.\n        /// </summary>\n        public float fontSizeMin\n        {\n            get { return m_fontSizeMin; }\n            set { if (m_fontSizeMin == value) return; m_fontSizeMin = value; SetVerticesDirty(); SetLayoutDirty(); }\n        }\n        [SerializeField]\n        protected float m_fontSizeMin = 0; // Text Auto Sizing Min Font Size.\n\n\n        /// <summary>\n        /// Maximum point size of the font when text auto-sizing is enabled.\n        /// </summary>\n        public float fontSizeMax\n        {\n            get { return m_fontSizeMax; }\n            set { if (m_fontSizeMax == value) return; m_fontSizeMax = value; SetVerticesDirty(); SetLayoutDirty(); }\n        }\n        [SerializeField]\n        protected float m_fontSizeMax = 0; // Text Auto Sizing Max Font Size.\n\n\n        /// <summary>\n        /// The style of the text\n        /// </summary>\n        public FontStyles fontStyle\n        {\n            get { return m_fontStyle; }\n            set { if (m_fontStyle == value) return; m_fontStyle = value; m_havePropertiesChanged = true; m_isCalculateSizeRequired = true; m_isInputParsingRequired = true; SetVerticesDirty(); SetLayoutDirty(); }\n        }\n        [SerializeField]\n        protected FontStyles m_fontStyle = FontStyles.Normal;\n        protected FontStyles m_FontStyleInternal = FontStyles.Normal;\n        protected TMP_FontStyleStack m_fontStyleStack;\n\n        /// <summary>\n        /// Property used in conjunction with padding calculation for the geometry.\n        /// </summary>\n        public bool isUsingBold { get { return m_isUsingBold; } }\n        protected bool m_isUsingBold = false; // Used to ensure GetPadding & Ratios take into consideration bold characters.\n\n\n        /// <summary>\n        /// Text alignment options\n        /// </summary>\n        public TextAlignmentOptions alignment\n        {\n            get { return m_textAlignment; }\n            set { if (m_textAlignment == value) return; m_havePropertiesChanged = true; m_textAlignment = value; SetVerticesDirty(); }\n        }\n        [SerializeField]\n        [UnityEngine.Serialization.FormerlySerializedAs(\"m_lineJustification\")]\n        protected TextAlignmentOptions m_textAlignment = TextAlignmentOptions.TopLeft;\n        protected TextAlignmentOptions m_lineJustification;\n        protected TMP_RichTextTagStack<TextAlignmentOptions> m_lineJustificationStack = new TMP_RichTextTagStack<TextAlignmentOptions>(new TextAlignmentOptions[16]);\n        protected Vector3[] m_textContainerLocalCorners = new Vector3[4];\n\n        /// <summary>\n        /// Use the extents of the text geometry for alignment instead of font metrics.\n        /// </summary>\n        //public bool alignByGeometry\n        //{\n        //    get { return m_alignByGeometry; }\n        //    set { if (m_alignByGeometry == value) return; m_havePropertiesChanged = true; m_alignByGeometry = value; SetVerticesDirty(); }\n        //}\n        //[SerializeField]\n        //protected bool m_alignByGeometry;\n\n\n        /// <summary>\n        /// The amount of additional spacing between characters.\n        /// </summary>\n        public float characterSpacing\n        {\n            get { return m_characterSpacing; }\n            set { if (m_characterSpacing == value) return; m_havePropertiesChanged = true; m_isCalculateSizeRequired = true;  m_characterSpacing = value; SetVerticesDirty(); SetLayoutDirty(); }\n        }\n        [SerializeField]\n        protected float m_characterSpacing = 0;\n        protected float m_cSpacing = 0;\n        protected float m_monoSpacing = 0;\n\n        /// <summary>\n        /// The amount of additional spacing between words.\n        /// </summary>\n        public float wordSpacing\n        {\n            get { return m_wordSpacing; }\n            set { if (m_wordSpacing == value) return; m_havePropertiesChanged = true; m_isCalculateSizeRequired = true; m_wordSpacing = value; SetVerticesDirty(); SetLayoutDirty(); }\n        }\n        [SerializeField]\n        protected float m_wordSpacing = 0;\n\n        /// <summary>\n        /// The amount of additional spacing to add between each lines of text.\n        /// </summary>\n        public float lineSpacing\n        {\n            get { return m_lineSpacing; }\n            set { if (m_lineSpacing == value) return; m_havePropertiesChanged = true; m_isCalculateSizeRequired = true; m_lineSpacing = value; SetVerticesDirty(); SetLayoutDirty(); }\n        }\n        [SerializeField]\n        protected float m_lineSpacing = 0;\n        protected float m_lineSpacingDelta = 0; // Used with Text Auto Sizing feature\n        protected float m_lineHeight = TMP_Math.FLOAT_UNSET; // Used with the <line-height=xx.x> tag.\n\n\n        /// <summary>\n        /// The amount of potential line spacing adjustment before text auto sizing kicks in.\n        /// </summary>\n        public float lineSpacingAdjustment\n        {\n            get { return m_lineSpacingMax; }\n            set { if (m_lineSpacingMax == value) return; m_havePropertiesChanged = true; m_isCalculateSizeRequired = true; m_lineSpacingMax = value; SetVerticesDirty(); SetLayoutDirty(); }\n        }\n        [SerializeField]\n        protected float m_lineSpacingMax = 0; // Text Auto Sizing Max Line spacing reduction.\n        //protected bool m_forceLineBreak;\n\n        /// <summary>\n        /// The amount of additional spacing to add between each lines of text.\n        /// </summary>\n        public float paragraphSpacing\n        {\n            get { return m_paragraphSpacing; }\n            set { if (m_paragraphSpacing == value) return; m_havePropertiesChanged = true; m_isCalculateSizeRequired = true; m_paragraphSpacing = value; SetVerticesDirty(); SetLayoutDirty(); }\n        }\n        [SerializeField]\n        protected float m_paragraphSpacing = 0;\n\n\n        /// <summary>\n        /// Percentage the width of characters can be adjusted before text auto-sizing begins to reduce the point size.\n        /// </summary>\n        public float characterWidthAdjustment\n        {\n            get { return m_charWidthMaxAdj; }\n            set { if (m_charWidthMaxAdj == value) return; m_havePropertiesChanged = true; m_isCalculateSizeRequired = true; m_charWidthMaxAdj = value; SetVerticesDirty(); SetLayoutDirty(); }\n        }\n        [SerializeField]\n        protected float m_charWidthMaxAdj = 0f; // Text Auto Sizing Max Character Width reduction.\n        protected float m_charWidthAdjDelta = 0;\n\n\n        /// <summary>\n        /// Controls whether or not word wrapping is applied. When disabled, the text will be displayed on a single line.\n        /// </summary>\n        public bool enableWordWrapping\n        {\n            get { return m_enableWordWrapping; }\n            set { if (m_enableWordWrapping == value) return; m_havePropertiesChanged = true; m_isInputParsingRequired = true; m_isCalculateSizeRequired = true; m_enableWordWrapping = value; SetVerticesDirty(); SetLayoutDirty(); }\n        }\n        [SerializeField]\n        protected bool m_enableWordWrapping = false;\n        protected bool m_isCharacterWrappingEnabled = false;\n        protected bool m_isNonBreakingSpace = false;\n        protected bool m_isIgnoringAlignment;\n\n        /// <summary>\n        /// Controls the blending between using character and word spacing to fill-in the space for justified text.\n        /// </summary>\n        public float wordWrappingRatios\n        {\n            get { return m_wordWrappingRatios; }\n            set { if (m_wordWrappingRatios == value) return; m_wordWrappingRatios = value; m_havePropertiesChanged = true; m_isCalculateSizeRequired = true; SetVerticesDirty(); SetLayoutDirty(); }\n        }\n        [SerializeField]\n        protected float m_wordWrappingRatios = 0.4f; // Controls word wrapping ratios between word or characters.\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        //public bool enableAdaptiveJustification\n        //{\n        //    get { return m_enableAdaptiveJustification; }\n        //    set { if (m_enableAdaptiveJustification == value) return;  m_enableAdaptiveJustification = value;  m_havePropertiesChanged = true;  m_isCalculateSizeRequired = true;  SetVerticesDirty(); SetLayoutDirty(); }\n        //}\n        //[SerializeField]\n        //protected bool m_enableAdaptiveJustification;\n        //protected float m_adaptiveJustificationThreshold = 10.0f;\n\n\n        /// <summary>\n        /// Controls the Text Overflow Mode\n        /// </summary>\n        public TextOverflowModes overflowMode\n        {\n            get { return m_overflowMode; }\n            set { if (m_overflowMode == value) return; m_overflowMode = value; m_havePropertiesChanged = true; m_isCalculateSizeRequired = true; SetVerticesDirty(); SetLayoutDirty(); }\n        }\n        [SerializeField]\n        protected TextOverflowModes m_overflowMode = TextOverflowModes.Overflow;\n\n\n        /// <summary>\n        /// Indicates if the text exceeds the vertical bounds of its text container.\n        /// </summary>\n        public bool isTextOverflowing\n        {\n            get { if (m_firstOverflowCharacterIndex != -1) return true; return false; }\n        }\n\n\n        /// <summary>\n        /// The first character which exceeds the vertical bounds of its text container.\n        /// </summary>\n        public int firstOverflowCharacterIndex\n        {\n            get { return m_firstOverflowCharacterIndex; }\n        }\n        [SerializeField]\n        protected int m_firstOverflowCharacterIndex = -1;\n\n\n        /// <summary>\n        /// The linked text component used for flowing the text from one text component to another.\n        /// </summary>\n        public TMP_Text linkedTextComponent\n        {\n            get { return m_linkedTextComponent; }\n\n            set\n            {\n                if (m_linkedTextComponent != value)\n                {\n                    // Release previously linked text component.\n                    if (m_linkedTextComponent != null)\n                    {\n                        m_linkedTextComponent.overflowMode = TextOverflowModes.Overflow;\n                        m_linkedTextComponent.linkedTextComponent = null;\n                        m_linkedTextComponent.isLinkedTextComponent = false;\n                    }\n\n                    m_linkedTextComponent = value;\n\n                    if (m_linkedTextComponent != null)\n                        m_linkedTextComponent.isLinkedTextComponent = true;\n                }\n\n                m_havePropertiesChanged = true;\n                m_isCalculateSizeRequired = true;\n                SetVerticesDirty();\n                SetLayoutDirty();\n            }\n        }\n        [SerializeField]\n        protected TMP_Text m_linkedTextComponent;\n\n\n        /// <summary>\n        /// Indicates whether this text component is linked to another.\n        /// </summary>\n        public bool isLinkedTextComponent\n        {\n            get { return m_isLinkedTextComponent; }\n\n            set\n            {\n                m_isLinkedTextComponent = value;\n\n                if (m_isLinkedTextComponent == false)\n                    m_firstVisibleCharacter = 0;\n\n                m_havePropertiesChanged = true;\n                m_isCalculateSizeRequired = true;\n                SetVerticesDirty();\n                SetLayoutDirty();\n            }\n        }\n        [SerializeField]\n        protected bool m_isLinkedTextComponent;\n\n\n        /// <summary>\n        /// Property indicating whether the text is Truncated or using Ellipsis.\n        /// </summary>\n        public bool isTextTruncated { get { return m_isTextTruncated; } }\n        [SerializeField]\n        protected bool m_isTextTruncated;\n\n\n        /// <summary>\n        /// Determines if kerning is enabled or disabled.\n        /// </summary>\n        public bool enableKerning\n        {\n            get { return m_enableKerning; }\n            set { if (m_enableKerning == value) return; m_havePropertiesChanged = true; m_isCalculateSizeRequired = true; m_enableKerning = value; SetVerticesDirty(); SetLayoutDirty(); }\n        }\n        [SerializeField]\n        protected bool m_enableKerning;\n\n\n        /// <summary>\n        /// Adds extra padding around each character. This may be necessary when the displayed text is very small to prevent clipping.\n        /// </summary>\n        public bool extraPadding\n        {\n            get { return m_enableExtraPadding; }\n            set { if (m_enableExtraPadding == value) return; m_havePropertiesChanged = true; m_enableExtraPadding = value; UpdateMeshPadding(); /* m_isCalculateSizeRequired = true;*/ SetVerticesDirty(); /* SetLayoutDirty();*/ }\n        }\n        [SerializeField]\n        protected bool m_enableExtraPadding = false;\n        [SerializeField]\n        protected bool checkPaddingRequired;\n\n\n        /// <summary>\n        /// Enables or Disables Rich Text Tags\n        /// </summary>\n        public bool richText\n        {\n            get { return m_isRichText; }\n            set { if (m_isRichText == value) return; m_isRichText = value; m_havePropertiesChanged = true; m_isCalculateSizeRequired = true; m_isInputParsingRequired = true; SetVerticesDirty(); SetLayoutDirty(); }\n        }\n        [SerializeField]\n        protected bool m_isRichText = true; // Used to enable or disable Rich Text.\n\n\n        /// <summary>\n        /// Enables or Disables parsing of CTRL characters in input text.\n        /// </summary>\n        public bool parseCtrlCharacters\n        {\n            get { return m_parseCtrlCharacters; }\n            set { if (m_parseCtrlCharacters == value) return; m_parseCtrlCharacters = value; m_havePropertiesChanged = true; m_isCalculateSizeRequired = true; m_isInputParsingRequired = true; SetVerticesDirty(); SetLayoutDirty(); }\n        }\n        [SerializeField]\n        protected bool m_parseCtrlCharacters = true;\n\n\n        /// <summary>\n        /// Sets the RenderQueue along with Ztest to force the text to be drawn last and on top of scene elements.\n        /// </summary>\n        public bool isOverlay\n        {\n            get { return m_isOverlay; }\n            set { if (m_isOverlay == value) return; m_isOverlay = value; SetShaderDepth(); m_havePropertiesChanged = true; SetVerticesDirty(); }\n        }\n        protected bool m_isOverlay = false;\n\n\n        /// <summary>\n        /// Sets Perspective Correction to Zero for Orthographic Camera mode & 0.875f for Perspective Camera mode.\n        /// </summary>\n        public bool isOrthographic\n        {\n            get { return m_isOrthographic; }\n            set { if (m_isOrthographic == value) return; m_havePropertiesChanged = true; m_isOrthographic = value; SetVerticesDirty(); }\n        }\n        [SerializeField]\n        protected bool m_isOrthographic = false;\n\n\n        /// <summary>\n        /// Sets the culling on the shaders. Note changing this value will result in an instance of the material.\n        /// </summary>\n        public bool enableCulling\n        {\n            get { return m_isCullingEnabled; }\n            set { if (m_isCullingEnabled == value) return; m_isCullingEnabled = value; SetCulling(); m_havePropertiesChanged = true; }\n        }\n        [SerializeField]\n        protected bool m_isCullingEnabled = false;\n\n        /// <summary>\n        /// Controls whether or not the text object will be culled when using a 2D Rect Mask.\n        /// </summary>\n        public bool ignoreRectMaskCulling\n        {\n            get { return m_ignoreRectMaskCulling; }\n            set { if (m_ignoreRectMaskCulling == value) return; m_ignoreRectMaskCulling = value; m_havePropertiesChanged = true; }\n        }\n        [SerializeField]\n        protected bool m_ignoreRectMaskCulling;\n\n\n        /// <summary>\n        /// Forces objects that are not visible to get refreshed.\n        /// </summary>\n        public bool ignoreVisibility\n        {\n            get { return m_ignoreCulling; }\n            set { if (m_ignoreCulling == value) return; m_havePropertiesChanged = true; m_ignoreCulling = value; }\n        }\n        [SerializeField]\n        protected bool m_ignoreCulling = true; // Not implemented yet.\n\n\n        /// <summary>\n        /// Controls how the face and outline textures will be applied to the text object.\n        /// </summary>\n        public TextureMappingOptions horizontalMapping\n        {\n            get { return m_horizontalMapping; }\n            set { if (m_horizontalMapping == value) return; m_havePropertiesChanged = true; m_horizontalMapping = value; SetVerticesDirty(); }\n        }\n        [SerializeField]\n        protected TextureMappingOptions m_horizontalMapping = TextureMappingOptions.Character;\n\n\n        /// <summary>\n        /// Controls how the face and outline textures will be applied to the text object.\n        /// </summary>\n        public TextureMappingOptions verticalMapping\n        {\n            get { return m_verticalMapping; }\n            set { if (m_verticalMapping == value) return; m_havePropertiesChanged = true; m_verticalMapping = value; SetVerticesDirty(); }\n        }\n        [SerializeField]\n        protected TextureMappingOptions m_verticalMapping = TextureMappingOptions.Character;\n\n\n        /// <summary>\n        /// Controls the UV Offset for the various texture mapping mode on the text object.\n        /// </summary>\n        //public Vector2 mappingUvOffset\n        //{\n        //    get { return m_uvOffset; }\n        //    set { if (m_uvOffset == value) return; m_havePropertiesChanged = true; m_uvOffset = value; SetVerticesDirty(); }\n        //}\n        //[SerializeField]\n        //protected Vector2 m_uvOffset = Vector2.zero; // Used to offset UV on Texturing\n\n\n        /// <summary>\n        /// Controls the horizontal offset of the UV of the texture mapping mode for each line of the text object.\n        /// </summary>\n        public float mappingUvLineOffset\n        {\n            get { return m_uvLineOffset; }\n            set { if (m_uvLineOffset == value) return; m_havePropertiesChanged = true; m_uvLineOffset = value; SetVerticesDirty(); }\n        }\n        [SerializeField]\n        protected float m_uvLineOffset = 0.0f; // Used for UV line offset per line\n\n\n        /// <summary>\n        /// Determines if the Mesh will be rendered.\n        /// </summary>\n        public TextRenderFlags renderMode\n        {\n            get { return m_renderMode; }\n            set { if (m_renderMode == value) return; m_renderMode = value; m_havePropertiesChanged = true; }\n        }\n        protected TextRenderFlags m_renderMode = TextRenderFlags.Render;\n\n\n        /// <summary>\n        /// Determines the sorting order of the geometry of the text object.\n        /// </summary>\n        public VertexSortingOrder geometrySortingOrder\n        {\n            get { return m_geometrySortingOrder; }\n\n            set { m_geometrySortingOrder = value; m_havePropertiesChanged = true; SetVerticesDirty(); }\n\n        }\n        [SerializeField]\n        protected VertexSortingOrder m_geometrySortingOrder;\n\n        /// <summary>\n        /// Determines if the data structures allocated to contain the geometry of the text object will be reduced in size if the number of characters required to display the text is reduced by more than 256 characters.\n        /// This reduction has the benefit of reducing the amount of vertex data being submitted to the graphic device but results in GC when it occurs. \n        /// </summary>\n        public bool vertexBufferAutoSizeReduction\n        {\n            get { return m_VertexBufferAutoSizeReduction; }\n            set { m_VertexBufferAutoSizeReduction = value; m_havePropertiesChanged = true; SetVerticesDirty(); }\n        }\n        [SerializeField]\n        protected bool m_VertexBufferAutoSizeReduction = true;\n\n        /// <summary>\n        /// The first character which should be made visible in conjunction with the Text Overflow Linked mode.\n        /// </summary>\n        public int firstVisibleCharacter\n        {\n            get { return m_firstVisibleCharacter; }\n            set { if (m_firstVisibleCharacter == value) return; m_havePropertiesChanged = true; m_firstVisibleCharacter = value; SetVerticesDirty(); }\n        }\n        [SerializeField]\n        protected int m_firstVisibleCharacter;\n\n        /// <summary>\n        /// Allows to control how many characters are visible from the input.\n        /// </summary>\n        public int maxVisibleCharacters\n        {\n            get { return m_maxVisibleCharacters; }\n            set { if (m_maxVisibleCharacters == value) return; m_havePropertiesChanged = true; m_maxVisibleCharacters = value; SetVerticesDirty(); }\n        }\n        protected int m_maxVisibleCharacters = 99999;\n\n\n        /// <summary>\n        /// Allows to control how many words are visible from the input.\n        /// </summary>\n        public int maxVisibleWords\n        {\n            get { return m_maxVisibleWords; }\n            set { if (m_maxVisibleWords == value) return; m_havePropertiesChanged = true; m_maxVisibleWords = value; SetVerticesDirty(); }\n        }\n        protected int m_maxVisibleWords = 99999;\n\n\n        /// <summary>\n        /// Allows control over how many lines of text are displayed.\n        /// </summary>\n        public int maxVisibleLines\n        {\n            get { return m_maxVisibleLines; }\n            set { if (m_maxVisibleLines == value) return; m_havePropertiesChanged = true; m_isInputParsingRequired = true; m_maxVisibleLines = value; SetVerticesDirty(); }\n        }\n        protected int m_maxVisibleLines = 99999;\n\n\n        /// <summary>\n        /// Determines if the text's vertical alignment will be adjusted based on visible descender of the text.\n        /// </summary>\n        public bool useMaxVisibleDescender\n        {\n            get { return m_useMaxVisibleDescender; }\n            set { if (m_useMaxVisibleDescender == value) return; m_havePropertiesChanged = true; m_isInputParsingRequired = true; SetVerticesDirty(); }\n        }\n        [SerializeField]\n        protected bool m_useMaxVisibleDescender = true;\n\n\n        /// <summary>\n        /// Controls which page of text is shown\n        /// </summary>\n        public int pageToDisplay\n        {\n            get { return m_pageToDisplay; }\n            set { if (m_pageToDisplay == value) return; m_havePropertiesChanged = true; m_pageToDisplay = value; SetVerticesDirty(); }\n        }\n        [SerializeField]\n        protected int m_pageToDisplay = 1;\n        protected bool m_isNewPage = false;\n\n        /// <summary>\n        /// The margins of the text object.\n        /// </summary>\n        public virtual Vector4 margin\n        {\n            get { return m_margin; }\n            set { if (m_margin == value) return; m_margin = value; ComputeMarginSize(); m_havePropertiesChanged = true; SetVerticesDirty(); }\n        }\n        [SerializeField]\n        protected Vector4 m_margin = new Vector4(0, 0, 0, 0);\n        protected float m_marginLeft;\n        protected float m_marginRight;\n        protected float m_marginWidth;  // Width of the RectTransform minus left and right margins.\n        protected float m_marginHeight; // Height of the RectTransform minus top and bottom margins.\n        protected float m_width = -1;\n\n\n        /// <summary>\n        /// Returns data about the text object which includes information about each character, word, line, link, etc.\n        /// </summary>\n        public TMP_TextInfo textInfo\n        {\n            get { return m_textInfo; }\n        }\n        [SerializeField]\n        protected TMP_TextInfo m_textInfo; // Class which holds information about the Text object such as characters, lines, mesh data as well as metrics. \n\n        /// <summary>\n        /// Property tracking if any of the text properties have changed. Flag is set before the text is regenerated.\n        /// </summary>\n        public bool havePropertiesChanged\n        {\n            get { return m_havePropertiesChanged; }\n            set { if (m_havePropertiesChanged == value) return; m_havePropertiesChanged = value; m_isInputParsingRequired = true; SetAllDirty(); }\n        }\n        //[SerializeField]\n        protected bool m_havePropertiesChanged;  // Used to track when properties of the text object have changed.\n\n\n        /// <summary>\n        /// Property to handle legacy animation component.\n        /// </summary>\n        public bool isUsingLegacyAnimationComponent\n        {\n            get { return m_isUsingLegacyAnimationComponent; }\n            set { m_isUsingLegacyAnimationComponent = value; }\n        }\n        [SerializeField]\n        protected bool m_isUsingLegacyAnimationComponent;\n\n\n        /// <summary>\n        /// Returns are reference to the Transform\n        /// </summary>\n        public new Transform transform\n        {\n            get\n            {\n                if (m_transform == null)\n                    m_transform = GetComponent<Transform>();\n                return m_transform;\n            }\n        }\n        protected Transform m_transform;\n\n\n        /// <summary>\n        /// Returns are reference to the RectTransform\n        /// </summary>\n        public new RectTransform rectTransform\n        {\n            get\n            {\n                if (m_rectTransform == null)\n                    m_rectTransform = GetComponent<RectTransform>();\n                return m_rectTransform;\n            }\n        }\n        protected RectTransform m_rectTransform;\n\n\n        /// <summary>\n        /// Enables control over setting the size of the text container to match the text object.\n        /// </summary>\n        public virtual bool autoSizeTextContainer\n        {\n            get;\n            set;\n        }\n        protected bool m_autoSizeTextContainer;\n\n\n        /// <summary>\n        /// The mesh used by the font asset and material assigned to the text object.\n        /// </summary>\n        public virtual Mesh mesh\n        {\n            get { return m_mesh; }\n        }\n        protected Mesh m_mesh;\n\n\n        /// <summary>\n        /// Determines if the geometry of the characters will be quads or volumetric (cubes).\n        /// </summary>\n        public bool isVolumetricText\n        {\n            get { return m_isVolumetricText; }\n            set { if (m_isVolumetricText == value) return; m_havePropertiesChanged = value; m_textInfo.ResetVertexLayout(value); m_isInputParsingRequired = true; SetVerticesDirty(); SetLayoutDirty(); }\n        }\n        [SerializeField]\n        protected bool m_isVolumetricText;\n\n        /// <summary>\n        /// Returns the bounds of the mesh of the text object in world space.\n        /// </summary>\n        public Bounds bounds\n        {\n            get\n            {\n                if (m_mesh == null) return new Bounds();\n\n                return GetCompoundBounds();\n            }\n        }\n\n        /// <summary>\n        /// Returns the bounds of the text of the text object.\n        /// </summary>\n        public Bounds textBounds\n        {\n            get\n            {\n                if (m_textInfo == null) return new Bounds();\n\n                return GetTextBounds();\n            }\n        }\n\n        // *** Unity Event Handling ***\n\n        //[Serializable]\n        //public class TextChangedEvent : UnityEvent { }\n\n        ///// <summary>\n        ///// Event delegate triggered when text has changed and been rendered.\n        ///// </summary>\n        //public TextChangedEvent onTextChanged\n        //{\n        //    get { return m_OnTextChanged; }\n        //    set { m_OnTextChanged = value; }\n        //}\n        //[SerializeField]\n        //private TextChangedEvent m_OnTextChanged = new TextChangedEvent();\n\n        //protected void SendOnTextChanged()\n        //{\n        //    if (onTextChanged != null)\n        //        onTextChanged.Invoke();\n        //}\n\n\n        // *** SPECIAL COMPONENTS ***\n\n        /// <summary>\n        /// Component used to control wrapping of text following some arbitrary shape.\n        /// </summary>\n        //public MarginShaper marginShaper\n        //{\n        //    get\n        //    {\n        //        if (m_marginShaper == null) m_marginShaper = GetComponent<MarginShaper>();\n\n        //        return m_marginShaper;\n        //    }\n        //}\n        //[SerializeField]\n        //protected MarginShaper m_marginShaper;\n\n\n        /// <summary>\n        /// Component used to control and animate sprites in the text object.\n        /// </summary>\n        protected TMP_SpriteAnimator spriteAnimator\n        {\n            get\n            {\n                if (m_spriteAnimator == null)\n                {\n                    m_spriteAnimator = GetComponent<TMP_SpriteAnimator>();\n                    if (m_spriteAnimator == null) m_spriteAnimator = gameObject.AddComponent<TMP_SpriteAnimator>();\n                }\n\n                return m_spriteAnimator;\n            }\n\n        }\n        [SerializeField]\n        protected TMP_SpriteAnimator m_spriteAnimator;\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        //public TMP_TextShaper textShaper\n        //{\n        //    get\n        //    {\n        //        if (m_textShaper == null)\n        //            m_textShaper = GetComponent<TMP_TextShaper>();\n\n        //        return m_textShaper;\n        //    }\n        //}\n        //[SerializeField]\n        //protected TMP_TextShaper m_textShaper;\n\n        // *** PROPERTIES RELATED TO UNITY LAYOUT SYSTEM ***\n        /// <summary>\n        /// \n        /// </summary>\n        public float flexibleHeight { get { return m_flexibleHeight; } }\n        protected float m_flexibleHeight = -1f;\n\n        /// <summary>\n        /// \n        /// </summary>\n        public float flexibleWidth { get { return m_flexibleWidth; } }\n        protected float m_flexibleWidth = -1f;\n\n        /// <summary>\n        /// \n        /// </summary>\n        public float minWidth { get { return m_minWidth; } }\n        protected float m_minWidth;\n\n        /// <summary>\n        /// \n        /// </summary>\n        public float minHeight { get { return m_minHeight; } }\n        protected float m_minHeight;\n\n        /// <summary>\n        /// \n        /// </summary>\n        public float maxWidth { get { return m_maxWidth; } }\n        protected float m_maxWidth;\n\n        /// <summary>\n        /// \n        /// </summary>\n        public float maxHeight { get { return m_maxHeight; } }\n        protected float m_maxHeight;\n\n        /// <summary>\n        /// \n        /// </summary>\n        protected LayoutElement layoutElement\n        {\n            get\n            {\n                if (m_LayoutElement == null)\n                {\n                    m_LayoutElement = GetComponent<LayoutElement>();\n                }\n\n                return m_LayoutElement;\n            }\n        }\n        protected LayoutElement m_LayoutElement;\n\n        /// <summary>\n        /// Computed preferred width of the text object.\n        /// </summary>\n        public virtual float preferredWidth { get { if (!m_isPreferredWidthDirty) return m_preferredWidth; m_preferredWidth = GetPreferredWidth(); return m_preferredWidth; } }\n        protected float m_preferredWidth;\n        protected float m_renderedWidth;\n        protected bool m_isPreferredWidthDirty;\n\n        /// <summary>\n        /// Computed preferred height of the text object.\n        /// </summary>\n        public virtual float preferredHeight { get { if (!m_isPreferredHeightDirty) return m_preferredHeight; m_preferredHeight = GetPreferredHeight(); return m_preferredHeight; } }\n        protected float m_preferredHeight;\n        protected float m_renderedHeight;\n        protected bool m_isPreferredHeightDirty;\n\n        protected bool m_isCalculatingPreferredValues;\n        private int m_recursiveCount;\n\n        /// <summary>\n        /// Compute the rendered width of the text object.\n        /// </summary>\n        public virtual float renderedWidth { get { return GetRenderedWidth(); } }\n\n\n        /// <summary>\n        /// Compute the rendered height of the text object.\n        /// </summary>\n        public virtual float renderedHeight { get { return GetRenderedHeight(); } }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        public int layoutPriority { get { return m_layoutPriority; } }\n        protected int m_layoutPriority = 0;\n\n        protected bool m_isCalculateSizeRequired = false;\n        protected bool m_isLayoutDirty;\n\n        protected bool m_verticesAlreadyDirty;\n        protected bool m_layoutAlreadyDirty;\n\n        protected bool m_isAwake;\n        internal bool m_isWaitingOnResourceLoad;\n\n        internal bool m_isInputParsingRequired = false; // Used to determine if the input text needs to be re-parsed.\n\n        // Protected Fields\n        internal enum TextInputSources { Text = 0, SetText = 1, SetCharArray = 2, String = 3 };\n        //[SerializeField]\n        internal TextInputSources m_inputSource;\n        protected string old_text; // Used by SetText to determine if the text has changed.\n        //protected float old_arg0, old_arg1, old_arg2; // Used by SetText to determine if the args have changed.\n\n\n        protected float m_fontScale; // Scaling of the font based on Atlas true Font Size and Rendered Font Size.  \n        protected float m_fontScaleMultiplier; // Used for handling of superscript and subscript.\n\n        protected char[] m_htmlTag = new char[128]; // Maximum length of rich text tag. This is preallocated to avoid GC.\n        protected RichTextTagAttribute[] m_xmlAttribute = new RichTextTagAttribute[8];\n\n        protected float[] m_attributeParameterValues = new float[16];\n\n        protected float tag_LineIndent = 0;\n        protected float tag_Indent = 0;\n        protected TMP_RichTextTagStack<float> m_indentStack = new TMP_RichTextTagStack<float>(new float[16]);\n        protected bool tag_NoParsing;\n        //protected TMP_LinkInfo tag_LinkInfo = new TMP_LinkInfo();\n\n        protected bool m_isParsingText;\n        protected Matrix4x4 m_FXMatrix;\n        protected bool m_isFXMatrixSet;\n\n\n        protected UnicodeChar[] m_TextParsingBuffer; // This array holds the characters to be processed by GenerateMesh();\n\n        protected struct UnicodeChar\n        {\n            public int unicode;\n            public int stringIndex;\n            public int length;\n        }\n        //protected UnicodeChar[] m_InternalParsingBuffer;\n\n        private TMP_CharacterInfo[] m_internalCharacterInfo; // Used by functions to calculate preferred values.\n        protected char[] m_input_CharArray = new char[256]; // This array hold the characters from the SetText();\n        private int m_charArray_Length = 0;\n        protected int m_totalCharacterCount;\n\n        // Structures used to save the state of the text layout in conjunction with line breaking / word wrapping.\n        protected WordWrapState m_SavedWordWrapState = new WordWrapState();\n        protected WordWrapState m_SavedLineState = new WordWrapState();\n\t\t//protected WordWrapState m_SavedAlignment = new WordWrapState ();\n\n\n        // Fields whose state is saved in conjunction with text parsing and word wrapping.\n        protected int m_characterCount;\n        //protected int m_visibleCharacterCount;\n        //protected int m_visibleSpriteCount;\n        protected int m_firstCharacterOfLine;\n        protected int m_firstVisibleCharacterOfLine;\n        protected int m_lastCharacterOfLine;\n        protected int m_lastVisibleCharacterOfLine;\n        protected int m_lineNumber;\n        protected int m_lineVisibleCharacterCount;\n        protected int m_pageNumber;\n        protected float m_maxAscender;\n        protected float m_maxCapHeight;\n        protected float m_maxDescender;\n        protected float m_maxLineAscender;\n        protected float m_maxLineDescender;\n        protected float m_startOfLineAscender;\n        //protected float m_maxFontScale;\n        protected float m_lineOffset;\n        protected Extents m_meshExtents;\n\n\n        // Fields used for vertex colors\n        protected Color32 m_htmlColor = new Color(255, 255, 255, 128);\n        protected TMP_RichTextTagStack<Color32> m_colorStack = new TMP_RichTextTagStack<Color32>(new Color32[16]);\n        protected TMP_RichTextTagStack<Color32> m_underlineColorStack = new TMP_RichTextTagStack<Color32>(new Color32[16]);\n        protected TMP_RichTextTagStack<Color32> m_strikethroughColorStack = new TMP_RichTextTagStack<Color32>(new Color32[16]);\n        protected TMP_RichTextTagStack<Color32> m_highlightColorStack = new TMP_RichTextTagStack<Color32>(new Color32[16]);\n\n        protected TMP_ColorGradient m_colorGradientPreset;\n        protected TMP_RichTextTagStack<TMP_ColorGradient> m_colorGradientStack = new TMP_RichTextTagStack<TMP_ColorGradient>(new TMP_ColorGradient[16]);\n\n        protected float m_tabSpacing = 0;\n        protected float m_spacing = 0;\n\n\n        //protected bool IsRectTransformDriven;\n\n\n        // STYLE TAGS\n        protected TMP_RichTextTagStack<int> m_styleStack = new TMP_RichTextTagStack<int>(new int[16]);\n        protected TMP_RichTextTagStack<int> m_actionStack = new TMP_RichTextTagStack<int>(new int[16]);\n\n        protected float m_padding = 0;\n        protected float m_baselineOffset; // Used for superscript and subscript.\n        protected TMP_RichTextTagStack<float> m_baselineOffsetStack = new TMP_RichTextTagStack<float>(new float[16]);\n        protected float m_xAdvance; // Tracks x advancement from character to character.\n\n        protected TMP_TextElementType m_textElementType;\n        protected TMP_TextElement m_cached_TextElement; // Glyph / Character information is cached into this variable which is faster than having to fetch from the Dictionary multiple times.\n        protected TMP_Character m_cached_Underline_Character; // Same as above but for the underline character which is used for Underline.\n        protected TMP_Character m_cached_Ellipsis_Character;\n\n        protected TMP_SpriteAsset m_defaultSpriteAsset;\n        protected TMP_SpriteAsset m_currentSpriteAsset;\n        protected int m_spriteCount = 0;\n        protected int m_spriteIndex;\n        protected int m_spriteAnimationID;\n        //protected TMP_XmlTagStack<int> m_spriteAnimationStack = new TMP_XmlTagStack<int>(new int[16]);\n\n\n        /// <summary>\n        /// Method which derived classes need to override to load Font Assets.\n        /// </summary>\n        protected virtual void LoadFontAsset() { }\n\n        /// <summary>\n        /// Function called internally when a new shared material is assigned via the fontSharedMaterial property.\n        /// </summary>\n        /// <param name=\"mat\"></param>\n        protected virtual void SetSharedMaterial(Material mat) { }\n\n        /// <summary>\n        /// Function called internally when a new material is assigned via the fontMaterial property.\n        /// </summary>\n        protected virtual Material GetMaterial(Material mat) { return null; }\n\n        /// <summary>\n        /// Function called internally when assigning a new base material.\n        /// </summary>\n        /// <param name=\"mat\"></param>\n        protected virtual void SetFontBaseMaterial(Material mat) { }\n\n        /// <summary>\n        /// Method which returns an array containing the materials used by the text object.\n        /// </summary>\n        /// <returns></returns>\n        protected virtual Material[] GetSharedMaterials() { return null; }\n\n        /// <summary>\n        /// \n        /// </summary>\n        protected virtual void SetSharedMaterials(Material[] materials) { }\n\n        /// <summary>\n        /// Method returning instances of the materials used by the text object.\n        /// </summary>\n        /// <returns></returns>\n        protected virtual Material[] GetMaterials(Material[] mats) { return null; }\n\n        /// <summary>\n        /// Method to set the materials of the text and sub text objects.\n        /// </summary>\n        /// <param name=\"mats\"></param>\n        //protected virtual void SetMaterials (Material[] mats) { }\n\n        /// <summary>\n        /// Function used to create an instance of the material\n        /// </summary>\n        /// <param name=\"source\"></param>\n        /// <returns></returns>\n        protected virtual Material CreateMaterialInstance(Material source)\n        {\n            Material mat = new Material(source);\n            mat.shaderKeywords = source.shaderKeywords;\n            mat.name += \" (Instance)\";\n\n            return mat;\n        }\n\n        protected void SetVertexColorGradient(TMP_ColorGradient gradient)\n        {\n            if (gradient == null) return;\n\n            m_fontColorGradient.bottomLeft = gradient.bottomLeft;\n            m_fontColorGradient.bottomRight = gradient.bottomRight;\n            m_fontColorGradient.topLeft = gradient.topLeft;\n            m_fontColorGradient.topRight = gradient.topRight;\n\n            SetVerticesDirty();\n        }\n\n        /// <summary>\n        /// Function to control the sorting of the geometry of the text object.\n        /// </summary>\n        protected void SetTextSortingOrder(VertexSortingOrder order)\n        {\n            \n        }\n\n        /// <summary>\n        /// Function to sort the geometry of the text object in accordance to the provided order.\n        /// </summary>\n        /// <param name=\"order\"></param>\n        protected void SetTextSortingOrder(int[] order)\n        {\n\n        }\n\n        /// <summary>\n        /// Function called internally to set the face color of the material. This will results in an instance of the material.\n        /// </summary>\n        /// <param name=\"color\"></param>\n        protected virtual void SetFaceColor(Color32 color) { }\n\n        /// <summary>\n        /// Function called internally to set the outline color of the material. This will results in an instance of the material.\n        /// </summary>\n        /// <param name=\"color\"></param>\n        protected virtual void SetOutlineColor(Color32 color) { }\n\n        /// <summary>\n        /// Function called internally to set the outline thickness property of the material. This will results in an instance of the material.\n        /// </summary>\n        /// <param name=\"thickness\"></param>\n        protected virtual void SetOutlineThickness(float thickness) { }\n\n        /// <summary>\n        /// Set the Render Queue and ZTest mode on the current material\n        /// </summary>\n        protected virtual void SetShaderDepth() { }\n\n        /// <summary>\n        /// Set the culling mode on the material.\n        /// </summary>\n        protected virtual void SetCulling() { }\n\n        /// <summary>\n        /// Get the padding value for the currently assigned material\n        /// </summary>\n        /// <returns></returns>\n        protected virtual float GetPaddingForMaterial() { return 0; }\n\n\n        /// <summary>\n        /// Get the padding value for the given material\n        /// </summary>\n        /// <returns></returns>\n        protected virtual float GetPaddingForMaterial(Material mat) { return 0; }\n\n\n        /// <summary>\n        /// Method to return the local corners of the Text Container or RectTransform.\n        /// </summary>\n        /// <returns></returns>\n        protected virtual Vector3[] GetTextContainerLocalCorners() { return null; }\n\n\n        // PUBLIC FUNCTIONS\n        protected bool m_ignoreActiveState;\n        /// <summary>\n        /// Function to force the regeneration of the text object.\n        /// </summary>\n        public virtual void ForceMeshUpdate() { }\n\n\n        /// <summary>\n        /// Method used for resetting vertex layout when switching to and from Volumetric Text mode.\n        /// </summary>\n        /// <param name=\"updateMesh\"></param>\n        //protected virtual void ResetVertexLayout() { }\n\n\n        /// <summary>\n        /// Function to force the regeneration of the text object.\n        /// </summary>\n        /// <param name=\"ignoreActiveState\">If set to true, the text object will be regenerated regardless of is active state.</param>\n        public virtual void ForceMeshUpdate(bool ignoreActiveState) { }\n\n\n        /// <summary>\n        /// Internal function used by the Text Input Field to populate TMP_TextInfo data. \n        /// </summary>\n        internal void SetTextInternal(string text)\n        {\n            m_text = text;\n            m_renderMode = TextRenderFlags.DontRender;\n            m_isInputParsingRequired = true;\n            ForceMeshUpdate();\n            m_renderMode = TextRenderFlags.Render;\n        }\n\n        /// <summary>\n        /// Function to force the regeneration of the text object.\n        /// </summary>\n        /// <param name=\"flags\"> Flags to control which portions of the geometry gets uploaded.</param>\n        //public virtual void ForceMeshUpdate(TMP_VertexDataUpdateFlags flags) { }\n\n\n        /// <summary>\n        /// Function to update the geometry of the main and sub text objects.\n        /// </summary>\n        /// <param name=\"mesh\"></param>\n        /// <param name=\"index\"></param>\n        public virtual void UpdateGeometry(Mesh mesh, int index) { }\n\n\n        /// <summary>\n        /// Function to push the updated vertex data into the mesh and renderer.\n        /// </summary>\n        public virtual void UpdateVertexData(TMP_VertexDataUpdateFlags flags) { }\n\n\n        /// <summary>\n        /// Function to push the updated vertex data into the mesh and renderer.\n        /// </summary>\n        public virtual void UpdateVertexData() { }\n\n\n        /// <summary>\n        /// Function to push a new set of vertices to the mesh.\n        /// </summary>\n        /// <param name=\"vertices\"></param>\n        public virtual void SetVertices(Vector3[] vertices) { }\n\n\n        /// <summary>\n        /// Function to be used to force recomputing of character padding when Shader / Material properties have been changed via script.\n        /// </summary>\n        public virtual void UpdateMeshPadding() { }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        //public virtual new void UpdateGeometry() { }\n\n\n        /// <summary>\n        /// Tweens the CanvasRenderer color associated with this Graphic.\n        /// </summary>\n        /// <param name=\"targetColor\">Target color.</param>\n        /// <param name=\"duration\">Tween duration.</param>\n        /// <param name=\"ignoreTimeScale\">Should ignore Time.scale?</param>\n        /// <param name=\"useAlpha\">Should also Tween the alpha channel?</param>\n        public override void CrossFadeColor(Color targetColor, float duration, bool ignoreTimeScale, bool useAlpha)\n        {\n            base.CrossFadeColor(targetColor, duration, ignoreTimeScale, useAlpha);\n            InternalCrossFadeColor(targetColor, duration, ignoreTimeScale, useAlpha);\n        }\n\n\n        /// <summary>\n        /// Tweens the alpha of the CanvasRenderer color associated with this Graphic.\n        /// </summary>\n        /// <param name=\"alpha\">Target alpha.</param>\n        /// <param name=\"duration\">Duration of the tween in seconds.</param>\n        /// <param name=\"ignoreTimeScale\">Should ignore Time.scale?</param>\n        public override void CrossFadeAlpha(float alpha, float duration, bool ignoreTimeScale)\n        {\n            base.CrossFadeAlpha(alpha, duration, ignoreTimeScale);\n            InternalCrossFadeAlpha(alpha, duration, ignoreTimeScale);\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"targetColor\"></param>\n        /// <param name=\"duration\"></param>\n        /// <param name=\"ignoreTimeScale\"></param>\n        /// <param name=\"useAlpha\"></param>\n        /// <param name=\"useRGB\"></param>\n        protected virtual void InternalCrossFadeColor(Color targetColor, float duration, bool ignoreTimeScale, bool useAlpha) { }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"alpha\"></param>\n        /// <param name=\"duration\"></param>\n        /// <param name=\"ignoreTimeScale\"></param>\n        protected virtual void InternalCrossFadeAlpha(float alpha, float duration, bool ignoreTimeScale) { }\n\n\n        /// <summary>\n        /// Method to parse the input text based on its source\n        /// </summary>\n        protected void ParseInputText()\n        {\n            //Debug.Log(\"Re-parsing Text.\");\n            ////Profiler.BeginSample(\"ParseInputText()\");\n\n            m_isInputParsingRequired = false;\n\n            switch (m_inputSource)\n            {\n                case TextInputSources.String:\n                case TextInputSources.Text:\n                    StringToCharArray(m_text, ref m_TextParsingBuffer);\n                    break;\n                case TextInputSources.SetText:\n                    SetTextArrayToCharArray(m_input_CharArray, ref m_TextParsingBuffer);\n                    break;\n                case TextInputSources.SetCharArray:\n                    break;\n            }\n\n            SetArraySizes(m_TextParsingBuffer);\n            ////Profiler.EndSample();\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"text\"></param>\n        public void SetText(string text)\n        {\n            SetText(text, true);\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"text\"></param>\n        public void SetText(string text, bool syncTextInputBox)\n        {\n            //if (text == old_text) return;\n\n            //old_text = text;\n\n            m_inputSource = TextInputSources.SetCharArray;\n\n            StringToCharArray(text, ref m_TextParsingBuffer);\n\n            #if UNITY_EDITOR\n            // Set the text in the Text Input Box in the Unity Editor only.\n            // TODO: Could revise to convert to string literal\n            if (syncTextInputBox)\n                m_text = text;\n            #endif\n\n            m_isInputParsingRequired = true;\n            m_havePropertiesChanged = true;\n            m_isCalculateSizeRequired = true;\n\n            SetVerticesDirty();\n            SetLayoutDirty();\n        }\n\n\n        /// <summary>\n        /// <para>Formatted string containing a pattern and a value representing the text to be rendered.</para>\n        /// <para>ex. TextMeshPro.SetText (\"Number is {0:1}.\", 5.56f);</para>\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"text\">String containing the pattern.\"</param>\n        /// <param name=\"arg0\">Value is a float.</param>\n        public void SetText(string text, float arg0)\n        {\n            SetText(text, arg0, 255, 255);\n        }\n\n        /// <summary>\n        /// <para>Formatted string containing a pattern and a value representing the text to be rendered.</para>\n        /// <para>ex. TextMeshPro.SetText (\"First number is {0} and second is {1:2}.\", 10, 5.756f);</para>\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"text\">String containing the pattern.\"</param>\n        /// <param name=\"arg0\">Value is a float.</param>\n        /// <param name=\"arg1\">Value is a float.</param>\n        public void SetText(string text, float arg0, float arg1)\n        {\n            SetText(text, arg0, arg1, 255);\n        }\n\n        /// <summary>\n        /// <para>Formatted string containing a pattern and a value representing the text to be rendered.</para>\n        /// <para>ex. TextMeshPro.SetText (\"A = {0}, B = {1} and C = {2}.\", 2, 5, 7);</para>\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"text\">String containing the pattern.\"</param>\n        /// <param name=\"arg0\">Value is a float.</param>\n        /// <param name=\"arg1\">Value is a float.</param>\n        /// <param name=\"arg2\">Value is a float.</param>\n        public void SetText(string text, float arg0, float arg1, float arg2)\n        {\n            int decimalPrecision = 0;\n            int index = 0;\n\n            for (int i = 0; i < text.Length; i++)\n            {\n                char c = text[i];\n\n                if (c == 123) // '{'\n                {\n                    // Check if user is requesting some decimal precision. Format is {0:2}\n                    if (text[i + 2] == 58) // ':'\n                    {\n                        decimalPrecision = text[i + 3] - 48;\n                    }\n\n                    switch (text[i + 1] - 48)\n                    {\n                        case 0: // 1st Arg\n                            AddFloatToCharArray(arg0, ref index, decimalPrecision);\n                            break;\n                        case 1: // 2nd Arg\n                            AddFloatToCharArray(arg1, ref index, decimalPrecision);\n                            break;\n                        case 2: // 3rd Arg\n                            AddFloatToCharArray(arg2, ref index, decimalPrecision);\n                            break;\n                    }\n\n                    if (text[i + 2] == 58)\n                        i += 4;\n                    else\n                        i += 2;\n\n                    continue;\n                }\n                m_input_CharArray[index] = c;\n                index += 1;\n            }\n\n            m_input_CharArray[index] = (char)0;\n            m_charArray_Length = index; // Set the length to where this '0' termination is.\n\n            #if UNITY_EDITOR\n            // Create new string to be displayed in the Input Text Box of the Editor Panel.\n            m_text = new string(m_input_CharArray, 0, index);\n            #endif\n\n            m_inputSource = TextInputSources.SetText;\n            m_isInputParsingRequired = true;\n            m_havePropertiesChanged = true;\n            m_isCalculateSizeRequired = true;\n\n            SetVerticesDirty();\n            SetLayoutDirty();\n        }\n\n\n        /// <summary>\n        /// Set the text using a StringBuilder.\n        /// </summary>\n        /// <description>\n        /// Using a StringBuilder instead of concatenating strings prevents memory pollution with temporary objects.\n        /// </description>\n        /// <param name=\"text\">StringBuilder with text to display.</param>\n        public void SetText(StringBuilder text)\n        {\n            m_inputSource = TextInputSources.SetCharArray;\n\n            #if UNITY_EDITOR\n            // Set the text in the Text Input Box in the Unity Editor only.\n            m_text = text.ToString();\n            #endif\n\n            StringBuilderToIntArray(text, ref m_TextParsingBuffer);\n\n            m_isInputParsingRequired = true;\n            m_havePropertiesChanged = true;\n            m_isCalculateSizeRequired = true;\n\n            SetVerticesDirty();\n            SetLayoutDirty();\n        }\n\n\n        /// <summary>\n        /// Character array containing the text to be displayed.\n        /// </summary>\n        /// <param name=\"sourceText\"></param>\n        public void SetCharArray(char[] sourceText)\n        {\n            // Initialize internal character buffer if necessary\n            if (m_TextParsingBuffer == null) m_TextParsingBuffer = new UnicodeChar[8];\n\n            #if UNITY_EDITOR\n            // Create new string to be displayed in the Input Text Box of the Editor Panel.\n            if (sourceText == null || sourceText.Length == 0)\n                m_text = string.Empty;\n            else\n                m_text = new string(sourceText);\n            #endif\n\n            // Clear the Style stack.\n            m_styleStack.Clear();\n\n            int writeIndex = 0;\n\n            for (int i = 0; sourceText != null && i < sourceText.Length; i++)\n            {\n                if (sourceText[i] == 92 && i < sourceText.Length - 1)\n                {\n                    switch ((int)sourceText[i + 1])\n                    {\n                        case 110: // \\n LineFeed\n                            if (writeIndex == m_TextParsingBuffer.Length) ResizeInternalArray(ref m_TextParsingBuffer);\n\n                            m_TextParsingBuffer[writeIndex].unicode = 10;\n                            i += 1;\n                            writeIndex += 1;\n                            continue;\n                        case 114: // \\r LineFeed\n                            if (writeIndex == m_TextParsingBuffer.Length) ResizeInternalArray(ref m_TextParsingBuffer);\n\n                            m_TextParsingBuffer[writeIndex].unicode = 13;\n                            i += 1;\n                            writeIndex += 1;\n                            continue;\n                        case 116: // \\t Tab\n                            if (writeIndex == m_TextParsingBuffer.Length) ResizeInternalArray(ref m_TextParsingBuffer);\n\n                            m_TextParsingBuffer[writeIndex].unicode = 9;\n                            i += 1;\n                            writeIndex += 1;\n                            continue;\n                    }\n                }\n\n                // Handle inline replacement of <stlye> and <br> tags.\n                if (sourceText[i] == 60)\n                {\n                    if (IsTagName(ref sourceText, \"<BR>\", i))\n                    {\n                        if (writeIndex == m_TextParsingBuffer.Length) ResizeInternalArray(ref m_TextParsingBuffer);\n\n                        m_TextParsingBuffer[writeIndex].unicode = 10; ;\n                        writeIndex += 1;\n                        i += 3;\n\n                        continue;\n                    }\n                    else if (IsTagName(ref sourceText, \"<STYLE=\", i))\n                    {\n                        if (ReplaceOpeningStyleTag(ref sourceText, i, out int srcOffset, ref m_TextParsingBuffer, ref writeIndex))\n                        {\n                            i = srcOffset;\n                            continue;\n                        }\n                    }\n                    else if (IsTagName(ref sourceText, \"</STYLE>\", i))\n                    {\n                        ReplaceClosingStyleTag(ref sourceText, i, ref m_TextParsingBuffer, ref writeIndex);\n\n                        // Strip </style> even if style is invalid.\n                        i += 7;\n                        continue;\n                    }\n                }\n\n                if (writeIndex == m_TextParsingBuffer.Length) ResizeInternalArray(ref m_TextParsingBuffer);\n\n                m_TextParsingBuffer[writeIndex].unicode = sourceText[i];\n                writeIndex += 1;\n            }\n\n            if (writeIndex == m_TextParsingBuffer.Length) ResizeInternalArray(ref m_TextParsingBuffer);\n\n            m_TextParsingBuffer[writeIndex].unicode = 0;\n\n            m_inputSource = TextInputSources.SetCharArray;\n            m_isInputParsingRequired = true;\n            m_havePropertiesChanged = true;\n            m_isCalculateSizeRequired = true;\n\n            SetVerticesDirty();\n            SetLayoutDirty();\n        }\n\n\n        /// <summary>\n        /// Character array containing the text to be displayed.\n        /// </summary>\n        /// <param name=\"sourceText\"></param>\n        public void SetCharArray(char[] sourceText, int start, int length)\n        {\n            // Initialize internal character buffer if necessary\n            if (m_TextParsingBuffer == null) m_TextParsingBuffer = new UnicodeChar[8];\n\n            #if UNITY_EDITOR\n            // Create new string to be displayed in the Input Text Box of the Editor Panel.\n            if (sourceText == null || sourceText.Length == 0 || length == 0)\n            {\n                m_text = string.Empty;\n                start = 0;\n                length = 0;\n            }\n            else\n            {\n                // TODO: Add potential range check on start + length relative to array size.\n                m_text = new string(sourceText, start, length);\n            }\n            #endif\n\n            // Clear the Style stack.\n            m_styleStack.Clear();\n\n            int writeIndex = 0;\n\n            int i = start;\n            int end = start + length;\n            for (; i < end; i++)\n            {\n                if (sourceText[i] == 92 && i < length - 1)\n                {\n                    switch ((int)sourceText[i + 1])\n                    {\n                        case 110: // \\n LineFeed\n                            if (writeIndex == m_TextParsingBuffer.Length) ResizeInternalArray(ref m_TextParsingBuffer);\n\n                            m_TextParsingBuffer[writeIndex].unicode = 10;\n                            i += 1;\n                            writeIndex += 1;\n                            continue;\n                        case 114: // \\r LineFeed\n                            if (writeIndex == m_TextParsingBuffer.Length) ResizeInternalArray(ref m_TextParsingBuffer);\n\n                            m_TextParsingBuffer[writeIndex].unicode = 13;\n                            i += 1;\n                            writeIndex += 1;\n                            continue;\n                        case 116: // \\t Tab\n                            if (writeIndex == m_TextParsingBuffer.Length) ResizeInternalArray(ref m_TextParsingBuffer);\n\n                            m_TextParsingBuffer[writeIndex].unicode = 9;\n                            i += 1;\n                            writeIndex += 1;\n                            continue;\n                    }\n                }\n\n                // Handle inline replacement of <stlye> and <br> tags.\n                if (sourceText[i] == 60)\n                {\n                    if (IsTagName(ref sourceText, \"<BR>\", i))\n                    {\n                        if (writeIndex == m_TextParsingBuffer.Length) ResizeInternalArray(ref m_TextParsingBuffer);\n\n                        m_TextParsingBuffer[writeIndex].unicode = 10;\n                        writeIndex += 1;\n                        i += 3;\n\n                        continue;\n                    }\n                    else if (IsTagName(ref sourceText, \"<STYLE=\", i))\n                    {\n                        if (ReplaceOpeningStyleTag(ref sourceText, i, out int srcOffset, ref m_TextParsingBuffer, ref writeIndex))\n                        {\n                            i = srcOffset;\n                            continue;\n                        }\n                    }\n                    else if (IsTagName(ref sourceText, \"</STYLE>\", i))\n                    {\n                        ReplaceClosingStyleTag(ref sourceText, i, ref m_TextParsingBuffer, ref writeIndex);\n\n                        // Strip </style> even if style is invalid.\n                        i += 7;\n                        continue;\n                    }\n                }\n\n                if (writeIndex == m_TextParsingBuffer.Length) ResizeInternalArray(ref m_TextParsingBuffer);\n\n                m_TextParsingBuffer[writeIndex].unicode = sourceText[i];\n                writeIndex += 1;\n            }\n\n            if (writeIndex == m_TextParsingBuffer.Length) ResizeInternalArray(ref m_TextParsingBuffer);\n\n            m_TextParsingBuffer[writeIndex].unicode = 0;\n\n            m_inputSource = TextInputSources.SetCharArray;\n            m_havePropertiesChanged = true;\n            m_isInputParsingRequired = true;\n            m_isCalculateSizeRequired = true;\n\n            SetVerticesDirty();\n            SetLayoutDirty();\n        }\n\n\n        /// <summary>\n        /// Character array containing the text to be displayed.\n        /// </summary>\n        /// <param name=\"sourceText\"></param>\n        public void SetCharArray(int[] sourceText, int start, int length)\n        {\n            // Initialize internal character buffer if necessary\n            if (m_TextParsingBuffer == null) m_TextParsingBuffer = new UnicodeChar[8];\n\n            #if UNITY_EDITOR\n            // Create new string to be displayed in the Input Text Box of the Editor Panel.\n            if (sourceText == null || sourceText.Length == 0 || length == 0)\n            {\n                m_text = string.Empty;\n                start = 0;\n                length = 0;\n            }\n            else\n            {\n                m_text = sourceText.IntToString(start, length);\n            }\n            #endif\n\n            // Clear the Style stack.\n            m_styleStack.Clear();\n\n            int writeIndex = 0;\n\n            int end = start + length;\n            for (int i = start; i < end && i < sourceText.Length; i++)\n            {\n                if (sourceText[i] == 92 && i < length - 1)\n                {\n                    switch ((int)sourceText[i + 1])\n                    {\n                        case 110: // \\n LineFeed\n                            if (writeIndex == m_TextParsingBuffer.Length) ResizeInternalArray(ref m_TextParsingBuffer);\n\n                            m_TextParsingBuffer[writeIndex].unicode = 10;\n                            i += 1;\n                            writeIndex += 1;\n                            continue;\n                        case 114: // \\r LineFeed\n                            if (writeIndex == m_TextParsingBuffer.Length) ResizeInternalArray(ref m_TextParsingBuffer);\n\n                            m_TextParsingBuffer[writeIndex].unicode = 13;\n                            i += 1;\n                            writeIndex += 1;\n                            continue;\n                        case 116: // \\t Tab\n                            if (writeIndex == m_TextParsingBuffer.Length) ResizeInternalArray(ref m_TextParsingBuffer);\n\n                            m_TextParsingBuffer[writeIndex].unicode = 9;\n                            i += 1;\n                            writeIndex += 1;\n                            continue;\n                    }\n                }\n\n                // Handle inline replacement of <stlye> and <br> tags.\n                if (sourceText[i] == 60)\n                {\n                    if (IsTagName(ref sourceText, \"<BR>\", i))\n                    {\n                        if (writeIndex == m_TextParsingBuffer.Length) ResizeInternalArray(ref m_TextParsingBuffer);\n\n                        m_TextParsingBuffer[writeIndex].unicode = 10;\n                        writeIndex += 1;\n                        i += 3;\n\n                        continue;\n                    }\n                    else if (IsTagName(ref sourceText, \"<STYLE=\", i))\n                    {\n                        if (ReplaceOpeningStyleTag(ref sourceText, i, out int srcOffset, ref m_TextParsingBuffer, ref writeIndex))\n                        {\n                            i = srcOffset;\n                            continue;\n                        }\n                    }\n                    else if (IsTagName(ref sourceText, \"</STYLE>\", i))\n                    {\n                        ReplaceClosingStyleTag(ref sourceText, i, ref m_TextParsingBuffer, ref writeIndex);\n\n                        // Strip </style> even if style is invalid.\n                        i += 7;\n                        continue;\n                    }\n                }\n\n                if (writeIndex == m_TextParsingBuffer.Length) ResizeInternalArray(ref m_TextParsingBuffer);\n\n                m_TextParsingBuffer[writeIndex].unicode = sourceText[i];\n                writeIndex += 1;\n            }\n\n            if (writeIndex == m_TextParsingBuffer.Length) ResizeInternalArray(ref m_TextParsingBuffer);\n\n            m_TextParsingBuffer[writeIndex].unicode = 0;\n\n            m_inputSource = TextInputSources.SetCharArray;\n            m_havePropertiesChanged = true;\n            m_isInputParsingRequired = true;\n            m_isCalculateSizeRequired = true;\n\n            SetVerticesDirty();\n            SetLayoutDirty();\n        }\n\n\n        /// <summary>\n        /// Copies Content of formatted SetText() to charBuffer.\n        /// </summary>\n        /// <param name=\"sourceText\"></param>\n        /// <param name=\"charBuffer\"></param>\n        protected void SetTextArrayToCharArray(char[] sourceText, ref UnicodeChar[] charBuffer)\n        {\n            //Debug.Log(\"SetText Array to Char called.\");\n            if (sourceText == null || m_charArray_Length == 0)\n                return;\n\n            if (charBuffer == null) charBuffer = new UnicodeChar[8];\n\n            // Clear the Style stack.\n            m_styleStack.Clear();\n\n            int writeIndex = 0;\n\n            for (int i = 0; i < m_charArray_Length; i++)\n            {\n                // Handle UTF-32 in the input text (string).\n                if (char.IsHighSurrogate(sourceText[i]) && char.IsLowSurrogate(sourceText[i + 1]))\n                {\n                    if (writeIndex == charBuffer.Length) ResizeInternalArray(ref charBuffer);\n\n                    charBuffer[writeIndex].unicode = char.ConvertToUtf32(sourceText[i], sourceText[i + 1]);\n                    i += 1;\n                    writeIndex += 1;\n                    continue;\n                }\n\n                // Handle inline replacement of <stlye> and <br> tags.\n                if (sourceText[i] == 60)\n                {\n                    if (IsTagName(ref sourceText, \"<BR>\", i))\n                    {\n                        if (writeIndex == charBuffer.Length) ResizeInternalArray(ref charBuffer);\n\n                        charBuffer[writeIndex].unicode = 10;\n                        writeIndex += 1;\n                        i += 3;\n\n                        continue;\n                    }\n                    else if (IsTagName(ref sourceText, \"<STYLE=\", i))\n                    {\n                        if (ReplaceOpeningStyleTag(ref sourceText, i, out int srcOffset, ref charBuffer, ref writeIndex))\n                        {\n                            i = srcOffset;\n                            continue;\n                        }\n                    }\n                    else if (IsTagName(ref sourceText, \"</STYLE>\", i))\n                    {\n                        ReplaceClosingStyleTag(ref sourceText, i, ref charBuffer, ref writeIndex);\n\n                        // Strip </style> even if style is invalid.\n                        i += 7;\n                        continue;\n                    }\n                }\n\n                if (writeIndex == charBuffer.Length) ResizeInternalArray(ref charBuffer);\n\n                charBuffer[writeIndex].unicode = sourceText[i];\n                writeIndex += 1;\n            }\n\n            if (writeIndex == charBuffer.Length) ResizeInternalArray(ref charBuffer);\n\n            charBuffer[writeIndex].unicode = 0;\n        }\n\n\n        /// <summary>\n        /// Method to store the content of a string into an integer array.\n        /// </summary>\n        /// <param name=\"sourceText\"></param>\n        /// <param name=\"charBuffer\"></param>\n        protected void StringToCharArray(string sourceText, ref UnicodeChar[] charBuffer)\n        {\n            if (sourceText == null)\n            {\n                charBuffer[0].unicode = 0;\n                return;\n            }\n\n            if (charBuffer == null) charBuffer = new UnicodeChar[8];\n\n            // Clear the Style stack.\n            m_styleStack.SetDefault(0);\n\n            int writeIndex = 0;\n\n            for (int i = 0; i < sourceText.Length; i++)\n            {\n                if (m_inputSource == TextInputSources.Text && sourceText[i] == 92 && sourceText.Length > i + 1)\n                {\n                    switch ((int)sourceText[i + 1])\n                    {\n                        case 85: // \\U00000000 for UTF-32 Unicode\n                            if (sourceText.Length > i + 9)\n                            {\n                                if (writeIndex == charBuffer.Length) ResizeInternalArray(ref charBuffer);\n\n                                charBuffer[writeIndex].unicode = GetUTF32(sourceText, i + 2);\n                                charBuffer[writeIndex].stringIndex = i;\n                                charBuffer[writeIndex].length = 10;\n\n                                i += 9;\n                                writeIndex += 1;\n                                continue;\n                            }\n                            break;\n                        case 92: // \\ escape\n                            if (!m_parseCtrlCharacters) break;\n\n                            if (sourceText.Length <= i + 2) break;\n\n                            if (writeIndex + 2 > charBuffer.Length) ResizeInternalArray(ref charBuffer);\n\n                            charBuffer[writeIndex].unicode = sourceText[i + 1];\n                            charBuffer[writeIndex + 1].unicode = sourceText[i + 2];\n                            i += 2;\n                            writeIndex += 2;\n                            continue;\n                        case 110: // \\n LineFeed\n                            if (!m_parseCtrlCharacters) break;\n\n                            if (writeIndex == charBuffer.Length) ResizeInternalArray(ref charBuffer);\n\n                            charBuffer[writeIndex].unicode = 10;\n                            charBuffer[writeIndex].stringIndex = i;\n                            charBuffer[writeIndex].length = 1;\n\n                            i += 1;\n                            writeIndex += 1;\n                            continue;\n                        case 114: // \\r\n                            if (!m_parseCtrlCharacters) break;\n\n                            if (writeIndex == charBuffer.Length) ResizeInternalArray(ref charBuffer);\n\n                            charBuffer[writeIndex].unicode = 13;\n                            charBuffer[writeIndex].stringIndex = i;\n                            charBuffer[writeIndex].length = 1;\n\n                            i += 1;\n                            writeIndex += 1;\n                            continue;\n                        case 116: // \\t Tab\n                            if (!m_parseCtrlCharacters) break;\n\n                            if (writeIndex == charBuffer.Length) ResizeInternalArray(ref charBuffer);\n\n                            charBuffer[writeIndex].unicode = 9;\n                            charBuffer[writeIndex].stringIndex = i;\n                            charBuffer[writeIndex].length = 1;\n\n                            i += 1;\n                            writeIndex += 1;\n                            continue;\n                        case 117: // \\u0000 for UTF-16 Unicode\n                            if (sourceText.Length > i + 5)\n                            {\n                                if (writeIndex == charBuffer.Length) ResizeInternalArray(ref charBuffer);\n\n                                charBuffer[writeIndex].unicode = GetUTF16(sourceText, i + 2);\n                                charBuffer[writeIndex].stringIndex = i;\n                                charBuffer[writeIndex].length = 6;\n\n                                i += 5;\n                                writeIndex += 1;\n                                continue;\n                            }\n                            break;\n                    }\n                }\n\n                // Handle UTF-32 in the input text (string). // Not sure this is needed //\n                if (char.IsHighSurrogate(sourceText[i]) && char.IsLowSurrogate(sourceText[i + 1]))\n                {\n                    if (writeIndex == charBuffer.Length) ResizeInternalArray(ref charBuffer);\n\n                    charBuffer[writeIndex].unicode = char.ConvertToUtf32(sourceText[i], sourceText[i + 1]);\n                    charBuffer[writeIndex].stringIndex = i;\n                    charBuffer[writeIndex].length = 2;\n\n                    i += 1;\n                    writeIndex += 1;\n                    continue;\n                }\n\n                //// Handle inline replacement of <stlye> and <br> tags.\n                if (sourceText[i] == 60 && m_isRichText)\n                {\n                    if (IsTagName(ref sourceText, \"<BR>\", i))\n                    {\n                        if (writeIndex == charBuffer.Length) ResizeInternalArray(ref charBuffer);\n\n                        charBuffer[writeIndex].unicode = 10;\n                        charBuffer[writeIndex].stringIndex = i;\n                        charBuffer[writeIndex].length = 1;\n\n                        writeIndex += 1;\n                        i += 3;\n\n                        continue;\n                    }\n                    else if (IsTagName(ref sourceText, \"<STYLE=\", i))\n                    {\n                        if (ReplaceOpeningStyleTag(ref sourceText, i, out int srcOffset, ref charBuffer, ref writeIndex))\n                        {\n                            i = srcOffset;\n                            continue;\n                        }\n                    }\n                    else if (IsTagName(ref sourceText, \"</STYLE>\", i))\n                    {\n                        ReplaceClosingStyleTag(ref sourceText, i, ref charBuffer, ref writeIndex);\n\n                        // Strip </style> even if style is invalid.\n                        i += 7;\n                        continue;\n                    }\n                }\n\n                if (writeIndex == charBuffer.Length) ResizeInternalArray(ref charBuffer);\n\n                charBuffer[writeIndex].unicode = sourceText[i];\n                charBuffer[writeIndex].stringIndex = i;\n                charBuffer[writeIndex].length = 1;\n\n                writeIndex += 1;\n            }\n\n            if (writeIndex == charBuffer.Length) ResizeInternalArray(ref charBuffer);\n\n            charBuffer[writeIndex].unicode = 0;\n        }\n\n\n        /// <summary>\n        /// Copy contents of StringBuilder into int array.\n        /// </summary>\n        /// <param name=\"sourceText\">Text to copy.</param>\n        /// <param name=\"charBuffer\">Array to store contents.</param>\n        protected void StringBuilderToIntArray(StringBuilder sourceText, ref UnicodeChar[] charBuffer)\n        {\n            if (sourceText == null)\n            {\n                charBuffer[0].unicode = 0;\n                return;\n            }\n\n            if (charBuffer == null) charBuffer = new UnicodeChar[8];\n\n            // Clear the Style stack.\n            m_styleStack.Clear();\n\n            #if UNITY_EDITOR\n            // Create new string to be displayed in the Input Text Box of the Editor Panel.\n            m_text = sourceText.ToString();\n            #endif\n\n            int writeIndex = 0;\n\n            for (int i = 0; i < sourceText.Length; i++)\n            {\n                if (m_parseCtrlCharacters && sourceText[i] == 92 && sourceText.Length > i + 1)\n                {\n                    switch ((int)sourceText[i + 1])\n                    {\n                        case 85: // \\U00000000 for UTF-32 Unicode\n                            if (sourceText.Length > i + 9)\n                            {\n                                if (writeIndex == charBuffer.Length) ResizeInternalArray(ref charBuffer);\n\n                                charBuffer[writeIndex].unicode = GetUTF32(sourceText, i + 2);\n                                i += 9;\n                                writeIndex += 1;\n                                continue;\n                            }\n                            break;\n                        case 92: // \\ escape\n                            if (sourceText.Length <= i + 2) break;\n\n                            if (writeIndex + 2 > charBuffer.Length) ResizeInternalArray(ref charBuffer);\n\n                            charBuffer[writeIndex].unicode = sourceText[i + 1];\n                            charBuffer[writeIndex + 1].unicode = sourceText[i + 2];\n                            i += 2;\n                            writeIndex += 2;\n                            continue;\n                        case 110: // \\n LineFeed\n                            if (writeIndex == charBuffer.Length) ResizeInternalArray(ref charBuffer);\n\n                            charBuffer[writeIndex].unicode = 10;\n                            i += 1;\n                            writeIndex += 1;\n                            continue;\n                        case 114: // \\r\n                            if (writeIndex == charBuffer.Length) ResizeInternalArray(ref charBuffer);\n\n                            charBuffer[writeIndex].unicode = 13;\n                            i += 1;\n                            writeIndex += 1;\n                            continue;\n                        case 116: // \\t Tab\n                            if (writeIndex == charBuffer.Length) ResizeInternalArray(ref charBuffer);\n\n                            charBuffer[writeIndex].unicode = 9;\n                            i += 1;\n                            writeIndex += 1;\n                            continue;\n                        case 117: // \\u0000 for UTF-16 Unicode\n                            if (sourceText.Length > i + 5)\n                            {\n                                if (writeIndex == charBuffer.Length) ResizeInternalArray(ref charBuffer);\n\n                                charBuffer[writeIndex].unicode = GetUTF16(sourceText, i + 2);\n                                i += 5;\n                                writeIndex += 1;\n                                continue;\n                            }\n                            break;\n                    }\n                }\n\n                // Handle UTF-32 in the input text (string).\n                if (char.IsHighSurrogate(sourceText[i]) && char.IsLowSurrogate(sourceText[i + 1]))\n                {\n                    if (writeIndex == charBuffer.Length) ResizeInternalArray(ref charBuffer);\n\n                    charBuffer[writeIndex].unicode = char.ConvertToUtf32(sourceText[i], sourceText[i + 1]);\n                    i += 1;\n                    writeIndex += 1;\n                    continue;\n                }\n\n                // Handle inline replacement of <stlye> and <br> tags.\n                if (sourceText[i] == 60)\n                {\n                    if (IsTagName(ref sourceText, \"<BR>\", i))\n                    {\n                        if (writeIndex == charBuffer.Length) ResizeInternalArray(ref charBuffer);\n\n                        charBuffer[writeIndex].unicode = 10;\n                        writeIndex += 1;\n                        i += 3;\n\n                        continue;\n                    }\n                    else if (IsTagName(ref sourceText, \"<STYLE=\", i))\n                    {\n                        if (ReplaceOpeningStyleTag(ref sourceText, i, out int srcOffset, ref charBuffer, ref writeIndex))\n                        {\n                            i = srcOffset;\n                            continue;\n                        }\n                    }\n                    else if (IsTagName(ref sourceText, \"</STYLE>\", i))\n                    {\n                        ReplaceClosingStyleTag(ref sourceText, i, ref charBuffer, ref writeIndex);\n\n                        // Strip </style> even if style is invalid.\n                        i += 7;\n                        continue;\n                    }\n                }\n\n                if (writeIndex == charBuffer.Length) ResizeInternalArray(ref charBuffer);\n\n                charBuffer[writeIndex].unicode = sourceText[i];\n                writeIndex += 1;\n            }\n\n            if (writeIndex == charBuffer.Length) ResizeInternalArray(ref charBuffer);\n\n            charBuffer[writeIndex].unicode = 0;\n        }\n\n\n        /// <summary>\n        /// Method to handle inline replacement of style tag by opening style definition.\n        /// </summary>\n        /// <param name=\"sourceText\"></param>\n        /// <param name=\"srcIndex\"></param>\n        /// <param name=\"srcOffset\"></param>\n        /// <param name=\"charBuffer\"></param>\n        /// <param name=\"writeIndex\"></param>\n        /// <returns></returns>\n        bool ReplaceOpeningStyleTag(ref string sourceText, int srcIndex, out int srcOffset, ref UnicodeChar[] charBuffer, ref int writeIndex)\n        {\n            // Validate <style> tag.\n            int hashCode = GetTagHashCode(ref sourceText, srcIndex + 7, out srcOffset);\n\n            TMP_Style style = TMP_StyleSheet.GetStyle(hashCode);\n\n            // Return if we don't have a valid style.\n            if (style == null || srcOffset == 0) return false;\n\n            m_styleStack.Add(style.hashCode);\n\n            int styleLength = style.styleOpeningTagArray.Length;\n\n            // Replace <style> tag with opening definition\n            int[] openingTagArray = style.styleOpeningTagArray;\n\n            for (int i = 0; i < styleLength; i++)\n            {\n                int c = openingTagArray[i];\n\n                if (c == 60)\n                {\n                    if (IsTagName(ref openingTagArray, \"<BR>\", i))\n                    {\n                        if (writeIndex == charBuffer.Length) ResizeInternalArray(ref charBuffer);\n\n                        charBuffer[writeIndex].unicode = 10;\n                        writeIndex += 1;\n                        i += 3;\n\n                        continue;\n                    }\n                    else if (IsTagName(ref openingTagArray, \"<STYLE=\", i))\n                    {\n                        if (ReplaceOpeningStyleTag(ref openingTagArray, i, out int offset, ref charBuffer, ref writeIndex))\n                        {\n                            i = offset;\n                            continue;\n                        }\n                    }\n                    else if (IsTagName(ref openingTagArray, \"</STYLE>\", i))\n                    {\n                        ReplaceClosingStyleTag(ref openingTagArray, i, ref charBuffer, ref writeIndex);\n                        \n                        // Strip </style> even if style is invalid.\n                        i += 7;\n                        continue;\n                    }\n                }\n\n                if (writeIndex == charBuffer.Length) ResizeInternalArray(ref charBuffer);\n\n                charBuffer[writeIndex].unicode = c;\n                writeIndex += 1;\n            }\n\n            return true;\n        }\n\n\n        /// <summary>\n        /// Method to handle inline replacement of style tag by opening style definition.\n        /// </summary>\n        /// <param name=\"sourceText\"></param>\n        /// <param name=\"srcIndex\"></param>\n        /// <param name=\"srcOffset\"></param>\n        /// <param name=\"charBuffer\"></param>\n        /// <param name=\"writeIndex\"></param>\n        /// <returns></returns>\n        bool ReplaceOpeningStyleTag(ref int[] sourceText, int srcIndex, out int srcOffset, ref UnicodeChar[] charBuffer, ref int writeIndex)\n        {\n            // Validate <style> tag.\n            int hashCode = GetTagHashCode(ref sourceText, srcIndex + 7, out srcOffset);\n\n            TMP_Style style = TMP_StyleSheet.GetStyle(hashCode);\n\n            // Return if we don't have a valid style.\n            if (style == null || srcOffset == 0) return false;\n\n            m_styleStack.Add(style.hashCode);\n\n            int styleLength = style.styleOpeningTagArray.Length;\n\n            // Replace <style> tag with opening definition\n            int[] openingTagArray = style.styleOpeningTagArray;\n\n            for (int i = 0; i < styleLength; i++)\n            {\n                int c = openingTagArray[i];\n\n                if (c == 60)\n                {\n                    if (IsTagName(ref openingTagArray, \"<BR>\", i))\n                    {\n                        if (writeIndex == charBuffer.Length) ResizeInternalArray(ref charBuffer);\n\n                        charBuffer[writeIndex].unicode = 10;\n                        writeIndex += 1;\n                        i += 3;\n\n                        continue;\n                    }\n                    else if (IsTagName(ref openingTagArray, \"<STYLE=\", i))\n                    {\n                        if (ReplaceOpeningStyleTag(ref openingTagArray, i, out int offset, ref charBuffer, ref writeIndex))\n                        {\n                            i = offset;\n                            continue;\n                        }\n                    }\n                    else if (IsTagName(ref openingTagArray, \"</STYLE>\", i))\n                    {\n                        ReplaceClosingStyleTag(ref openingTagArray, i, ref charBuffer, ref writeIndex);\n                        \n                        // Strip </style> even if style is invalid.\n                        i += 7;\n                        continue;\n                    }\n                }\n\n                if (writeIndex == charBuffer.Length) ResizeInternalArray(ref charBuffer);\n\n                charBuffer[writeIndex].unicode = c;\n                writeIndex += 1;\n            }\n\n            return true;\n        }\n\n\n        /// <summary>\n        /// Method to handle inline replacement of style tag by opening style definition.\n        /// </summary>\n        /// <param name=\"sourceText\"></param>\n        /// <param name=\"srcIndex\"></param>\n        /// <param name=\"srcOffset\"></param>\n        /// <param name=\"charBuffer\"></param>\n        /// <param name=\"writeIndex\"></param>\n        /// <returns></returns>\n        bool ReplaceOpeningStyleTag(ref char[] sourceText, int srcIndex, out int srcOffset, ref UnicodeChar[] charBuffer, ref int writeIndex)\n        {\n            // Validate <style> tag.\n            int hashCode = GetTagHashCode(ref sourceText, srcIndex + 7, out srcOffset);\n\n            TMP_Style style = TMP_StyleSheet.GetStyle(hashCode);\n\n            // Return if we don't have a valid style.\n            if (style == null || srcOffset == 0) return false;\n\n            m_styleStack.Add(style.hashCode);\n\n            int styleLength = style.styleOpeningTagArray.Length;\n\n            // Replace <style> tag with opening definition\n            int[] openingTagArray = style.styleOpeningTagArray;\n\n            for (int i = 0; i < styleLength; i++)\n            {\n                int c = openingTagArray[i];\n\n                if (c == 60)\n                {\n                    if (IsTagName(ref openingTagArray, \"<BR>\", i))\n                    {\n                        if (writeIndex == charBuffer.Length) ResizeInternalArray(ref charBuffer);\n\n                        charBuffer[writeIndex].unicode = 10;\n                        writeIndex += 1;\n                        i += 3;\n\n                        continue;\n                    }\n                    else if (IsTagName(ref openingTagArray, \"<STYLE=\", i))\n                    {\n                        if (ReplaceOpeningStyleTag(ref openingTagArray, i, out int offset, ref charBuffer, ref writeIndex))\n                        {\n                            i = offset;\n                            continue;\n                        }\n                    }\n                    else if (IsTagName(ref openingTagArray, \"</STYLE>\", i))\n                    {\n                        ReplaceClosingStyleTag(ref openingTagArray, i, ref charBuffer, ref writeIndex);\n\n                        // Strip </style> even if style is invalid.\n                        i += 7;\n                        continue;\n                    }\n                }\n\n                if (writeIndex == charBuffer.Length) ResizeInternalArray(ref charBuffer);\n\n                charBuffer[writeIndex].unicode = c;\n                writeIndex += 1;\n            }\n\n            return true;\n        }\n\n\n        /// <summary>\n        /// Method to handle inline replacement of style tag by opening style definition.\n        /// </summary>\n        /// <param name=\"sourceText\"></param>\n        /// <param name=\"srcIndex\"></param>\n        /// <param name=\"srcOffset\"></param>\n        /// <param name=\"charBuffer\"></param>\n        /// <param name=\"writeIndex\"></param>\n        /// <returns></returns>\n        bool ReplaceOpeningStyleTag(ref StringBuilder sourceText, int srcIndex, out int srcOffset, ref UnicodeChar[] charBuffer, ref int writeIndex)\n        {\n            // Validate <style> tag.\n            int hashCode = GetTagHashCode(ref sourceText, srcIndex + 7, out srcOffset);\n\n            TMP_Style style = TMP_StyleSheet.GetStyle(hashCode);\n\n            // Return if we don't have a valid style.\n            if (style == null || srcOffset == 0) return false;\n\n            m_styleStack.Add(style.hashCode);\n\n            int styleLength = style.styleOpeningTagArray.Length;\n\n            // Replace <style> tag with opening definition\n            int[] openingTagArray = style.styleOpeningTagArray;\n\n            for (int i = 0; i < styleLength; i++)\n            {\n                int c = openingTagArray[i];\n\n                if (c == 60)\n                {\n                    if (IsTagName(ref openingTagArray, \"<BR>\", i))\n                    {\n                        if (writeIndex == charBuffer.Length) ResizeInternalArray(ref charBuffer);\n\n                        charBuffer[writeIndex].unicode = 10;\n                        writeIndex += 1;\n                        i += 3;\n\n                        continue;\n                    }\n                    else if (IsTagName(ref openingTagArray, \"<STYLE=\", i))\n                    {\n                        if (ReplaceOpeningStyleTag(ref openingTagArray, i, out int offset, ref charBuffer, ref writeIndex))\n                        {\n                            i = offset;\n                            continue;\n                        }\n                    }\n                    else if (IsTagName(ref openingTagArray, \"</STYLE>\", i))\n                    {\n                        ReplaceClosingStyleTag(ref openingTagArray, i, ref charBuffer, ref writeIndex);\n\n                        // Strip </style> even if style is invalid.\n                        i += 7;\n                        continue;\n                    }\n                }\n\n                if (writeIndex == charBuffer.Length) ResizeInternalArray(ref charBuffer);\n\n                charBuffer[writeIndex].unicode = c;\n                writeIndex += 1;\n            }\n\n            return true;\n        }\n\n\n        /// <summary>\n        /// Method to handle inline replacement of style tag by closing style definition.\n        /// </summary>\n        /// <param name=\"sourceText\"></param>\n        /// <param name=\"srcIndex\"></param>\n        /// <param name=\"charBuffer\"></param>\n        /// <param name=\"writeIndex\"></param>\n        /// <returns></returns>\n        bool ReplaceClosingStyleTag(ref string sourceText, int srcIndex, ref UnicodeChar[] charBuffer, ref int writeIndex)\n        {\n            // Get style from the Style Stack\n            int hashCode = m_styleStack.CurrentItem();\n            TMP_Style style = TMP_StyleSheet.GetStyle(hashCode);\n\n            m_styleStack.Remove();\n\n            // Return if we don't have a valid style.\n            if (style == null) return false;\n\n            int styleLength = style.styleClosingTagArray.Length;\n\n            // Replace <style> tag with opening definition\n            int[] closingTagArray = style.styleClosingTagArray;\n\n            for (int i = 0; i < styleLength; i++)\n            {\n                int c = closingTagArray[i];\n\n                if (c == 60)\n                {\n                    if (IsTagName(ref closingTagArray, \"<BR>\", i))\n                    {\n                        if (writeIndex == charBuffer.Length) ResizeInternalArray(ref charBuffer);\n\n                        charBuffer[writeIndex].unicode = 10;\n                        writeIndex += 1;\n                        i += 3;\n\n                        continue;\n                    }\n                    else if (IsTagName(ref closingTagArray, \"<STYLE=\", i))\n                    {\n                        if (ReplaceOpeningStyleTag(ref closingTagArray, i, out int offset, ref charBuffer, ref writeIndex))\n                        {\n                            i = offset;\n                            continue;\n                        }\n                    }\n                    else if (IsTagName(ref closingTagArray, \"</STYLE>\", i))\n                    {\n                        ReplaceClosingStyleTag(ref closingTagArray, i, ref charBuffer, ref writeIndex);\n\n                        // Strip </style> even if style is invalid.\n                        i += 7;\n                        continue;\n                    }\n                }\n\n                if (writeIndex == charBuffer.Length) ResizeInternalArray(ref charBuffer);\n\n                charBuffer[writeIndex].unicode = c;\n                writeIndex += 1;\n            }\n\n            return true;\n        }\n\n\n        /// <summary>\n        /// Method to handle inline replacement of style tag by closing style definition.\n        /// </summary>\n        /// <param name=\"sourceText\"></param>\n        /// <param name=\"srcIndex\"></param>\n        /// <param name=\"charBuffer\"></param>\n        /// <param name=\"writeIndex\"></param>\n        /// <returns></returns>\n        bool ReplaceClosingStyleTag(ref int[] sourceText, int srcIndex, ref UnicodeChar[] charBuffer, ref int writeIndex)\n        {\n            // Get style from the Style Stack\n            int hashCode = m_styleStack.CurrentItem();\n            TMP_Style style = TMP_StyleSheet.GetStyle(hashCode);\n\n            m_styleStack.Remove();\n\n            // Return if we don't have a valid style.\n            if (style == null) return false;\n\n            int styleLength = style.styleClosingTagArray.Length;\n\n            // Replace <style> tag with opening definition\n            int[] closingTagArray = style.styleClosingTagArray;\n\n            for (int i = 0; i < styleLength; i++)\n            {\n                int c = closingTagArray[i];\n\n                if (c == 60)\n                {\n                    if (IsTagName(ref closingTagArray, \"<BR>\", i))\n                    {\n                        if (writeIndex == charBuffer.Length) ResizeInternalArray(ref charBuffer);\n\n                        charBuffer[writeIndex].unicode = 10;\n                        writeIndex += 1;\n                        i += 3;\n\n                        continue;\n                    }\n                    else if (IsTagName(ref closingTagArray, \"<STYLE=\", i))\n                    {\n                        if (ReplaceOpeningStyleTag(ref closingTagArray, i, out int offset, ref charBuffer, ref writeIndex))\n                        {\n                            i = offset;\n                            continue;\n                        }\n                    }\n                    else if (IsTagName(ref closingTagArray, \"</STYLE>\", i))\n                    {\n                        ReplaceClosingStyleTag(ref closingTagArray, i, ref charBuffer, ref writeIndex);\n\n                        // Strip </style> even if style is invalid.\n                        i += 7;\n                        continue;\n                    }\n                }\n\n                if (writeIndex == charBuffer.Length) ResizeInternalArray(ref charBuffer);\n\n                charBuffer[writeIndex].unicode = c;\n                writeIndex += 1;\n            }\n\n            return true;\n        }\n\n\n        /// <summary>\n        /// Method to handle inline replacement of style tag by closing style definition.\n        /// </summary>\n        /// <param name=\"sourceText\"></param>\n        /// <param name=\"srcIndex\"></param>\n        /// <param name=\"charBuffer\"></param>\n        /// <param name=\"writeIndex\"></param>\n        /// <returns></returns>\n        bool ReplaceClosingStyleTag(ref char[] sourceText, int srcIndex, ref UnicodeChar[] charBuffer, ref int writeIndex)\n        {\n            // Get style from the Style Stack\n            int hashCode = m_styleStack.CurrentItem();\n            TMP_Style style = TMP_StyleSheet.GetStyle(hashCode);\n\n            m_styleStack.Remove();\n\n            // Return if we don't have a valid style.\n            if (style == null) return false;\n\n            int styleLength = style.styleClosingTagArray.Length;\n\n            // Replace <style> tag with opening definition\n            int[] closingTagArray = style.styleClosingTagArray;\n\n            for (int i = 0; i < styleLength; i++)\n            {\n                int c = closingTagArray[i];\n\n                if (c == 60)\n                {\n                    if (IsTagName(ref closingTagArray, \"<BR>\", i))\n                    {\n                        if (writeIndex == charBuffer.Length) ResizeInternalArray(ref charBuffer);\n\n                        charBuffer[writeIndex].unicode = 10;\n                        writeIndex += 1;\n                        i += 3;\n\n                        continue;\n                    }\n                    else if (IsTagName(ref closingTagArray, \"<STYLE=\", i))\n                    {\n                        if (ReplaceOpeningStyleTag(ref closingTagArray, i, out int offset, ref charBuffer, ref writeIndex))\n                        {\n                            i = offset;\n                            continue;\n                        }\n                    }\n                    else if (IsTagName(ref closingTagArray, \"</STYLE>\", i))\n                    {\n                        ReplaceClosingStyleTag(ref closingTagArray, i, ref charBuffer, ref writeIndex);\n\n                        // Strip </style> even if style is invalid.\n                        i += 7;\n                        continue;\n                    }\n                }\n\n                if (writeIndex == charBuffer.Length) ResizeInternalArray(ref charBuffer);\n\n                charBuffer[writeIndex].unicode = c;\n                writeIndex += 1;\n            }\n\n            return true;\n        }\n\n        /// <summary>\n        /// Method to handle inline replacement of style tag by closing style definition.\n        /// </summary>\n        /// <param name=\"sourceText\"></param>\n        /// <param name=\"srcIndex\"></param>\n        /// <param name=\"charBuffer\"></param>\n        /// <param name=\"writeIndex\"></param>\n        /// <returns></returns>\n        bool ReplaceClosingStyleTag(ref StringBuilder sourceText, int srcIndex, ref UnicodeChar[] charBuffer, ref int writeIndex)\n        {\n            // Get style from the Style Stack\n            int hashCode = m_styleStack.CurrentItem();\n            TMP_Style style = TMP_StyleSheet.GetStyle(hashCode);\n\n            m_styleStack.Remove();\n\n            // Return if we don't have a valid style.\n            if (style == null) return false;\n\n            int styleLength = style.styleClosingTagArray.Length;\n\n            // Replace <style> tag with opening definition\n            int[] closingTagArray = style.styleClosingTagArray;\n\n            for (int i = 0; i < styleLength; i++)\n            {\n                int c = closingTagArray[i];\n\n                if (c == 60)\n                {\n                    if (IsTagName(ref closingTagArray, \"<BR>\", i))\n                    {\n                        if (writeIndex == charBuffer.Length) ResizeInternalArray(ref charBuffer);\n\n                        charBuffer[writeIndex].unicode = 10;\n                        writeIndex += 1;\n                        i += 3;\n\n                        continue;\n                    }\n                    else if (IsTagName(ref closingTagArray, \"<STYLE=\", i))\n                    {\n                        if (ReplaceOpeningStyleTag(ref closingTagArray, i, out int offset, ref charBuffer, ref writeIndex))\n                        {\n                            i = offset;\n                            continue;\n                        }\n                    }\n                    else if (IsTagName(ref closingTagArray, \"</STYLE>\", i))\n                    {\n                        ReplaceClosingStyleTag(ref closingTagArray, i, ref charBuffer, ref writeIndex);\n\n                        // Strip </style> even if style is invalid.\n                        i += 7;\n                        continue;\n                    }\n                }\n\n                if (writeIndex == charBuffer.Length) ResizeInternalArray(ref charBuffer);\n\n                charBuffer[writeIndex].unicode = c;\n                writeIndex += 1;\n            }\n\n            return true;\n        }\n\n\n        /// <summary>\n        /// Method to check for a matching rich text tag.\n        /// </summary>\n        /// <param name=\"text\"></param>\n        /// <param name=\"tag\"></param>\n        /// <param name=\"index\"></param>\n        /// <returns></returns>\n        bool IsTagName (ref string text, string tag, int index)\n        {\n            if (text.Length < index + tag.Length) return false;\n            \n            for (int i = 0; i < tag.Length; i++)\n            {\n                if (TMP_TextUtilities.ToUpperFast(text[index + i]) != tag[i]) return false;\n            }\n\n            return true;\n        }\n\n        /// <summary>\n        /// Method to check for a matching rich text tag.\n        /// </summary>\n        /// <param name=\"text\"></param>\n        /// <param name=\"tag\"></param>\n        /// <param name=\"index\"></param>\n        /// <returns></returns>\n        bool IsTagName(ref char[] text, string tag, int index)\n        {\n            if (text.Length < index + tag.Length) return false;\n\n            for (int i = 0; i < tag.Length; i++)\n            {\n                if (TMP_TextUtilities.ToUpperFast(text[index + i]) != tag[i]) return false;\n            }\n\n            return true;\n        }\n\n        /// <summary>\n        /// Method to check for a matching rich text tag.\n        /// </summary>\n        /// <param name=\"text\"></param>\n        /// <param name=\"tag\"></param>\n        /// <param name=\"index\"></param>\n        /// <returns></returns>\n        bool IsTagName(ref int[] text, string tag, int index)\n        {\n            if (text.Length < index + tag.Length) return false;\n\n            for (int i = 0; i < tag.Length; i++)\n            {\n                if (TMP_TextUtilities.ToUpperFast((char)text[index + i]) != tag[i]) return false;\n            }\n\n            return true;\n        }\n\n        /// <summary>\n        /// Method to check for a matching rich text tag.\n        /// </summary>\n        /// <param name=\"text\"></param>\n        /// <param name=\"tag\"></param>\n        /// <param name=\"index\"></param>\n        /// <returns></returns>\n        bool IsTagName(ref StringBuilder text, string tag, int index)\n        {\n            if (text.Length < index + tag.Length) return false;\n\n            for (int i = 0; i < tag.Length; i++)\n            {\n                if (TMP_TextUtilities.ToUpperFast(text[index + i]) != tag[i]) return false;\n            }\n\n            return true;\n        }\n\n        /// <summary>\n        /// Get Hashcode for a given tag.\n        /// </summary>\n        /// <param name=\"text\"></param>\n        /// <param name=\"index\"></param>\n        /// <param name=\"closeIndex\"></param>\n        /// <returns></returns>\n        int GetTagHashCode(ref string text, int index, out int closeIndex)\n        {\n            int hashCode = 0;\n            closeIndex = 0;\n\n            for (int i = index; i < text.Length; i++)\n            {\n                // Skip quote '\"' character\n                if (text[i] == 34) continue;\n\n                // Break at '>'\n                if (text[i] == 62) { closeIndex = i; break; }\n\n                hashCode = (hashCode << 5) + hashCode ^ text[i];\n            }\n\n            return hashCode;\n        }\n\n        /// <summary>\n        /// Get Hashcode for a given tag.\n        /// </summary>\n        /// <param name=\"text\"></param>\n        /// <param name=\"index\"></param>\n        /// <param name=\"closeIndex\"></param>\n        /// <returns></returns>\n        int GetTagHashCode(ref char[] text, int index, out int closeIndex)\n        {\n            int hashCode = 0;\n            closeIndex = 0;\n\n            for (int i = index; i < text.Length; i++)\n            {\n                // Skip quote '\"' character\n                if (text[i] == 34) continue;\n\n                // Break at '>'\n                if (text[i] == 62) { closeIndex = i; break; }\n\n                hashCode = (hashCode << 5) + hashCode ^ text[i];\n            }\n\n            return hashCode;\n        }\n\n        /// <summary>\n        /// Get Hashcode for a given tag.\n        /// </summary>\n        /// <param name=\"text\"></param>\n        /// <param name=\"index\"></param>\n        /// <param name=\"closeIndex\"></param>\n        /// <returns></returns>\n        int GetTagHashCode(ref int[] text, int index, out int closeIndex)\n        {\n            int hashCode = 0;\n            closeIndex = 0;\n\n            for (int i = index; i < text.Length; i++)\n            {\n                // Skip quote '\"' character\n                if (text[i] == 34) continue;\n\n                // Break at '>'\n                if (text[i] == 62) { closeIndex = i; break; }\n\n                hashCode = (hashCode << 5) + hashCode ^ text[i];\n            }\n\n            return hashCode;\n        }\n\n        /// <summary>\n        ///  Get Hashcode for a given tag.\n        /// </summary>\n        /// <param name=\"text\"></param>\n        /// <param name=\"index\"></param>\n        /// <param name=\"closeIndex\"></param>\n        /// <returns></returns>\n        int GetTagHashCode(ref StringBuilder text, int index, out int closeIndex)\n        {\n            int hashCode = 0;\n            closeIndex = 0;\n\n            for (int i = index; i < text.Length; i++)\n            {\n                // Skip quote '\"' character\n                if (text[i] == 34) continue;\n\n                // Break at '>'\n                if (text[i] == 62) { closeIndex = i; break; }\n\n                hashCode = (hashCode << 5) + hashCode ^ text[i];\n            }\n\n            return hashCode;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        void ResizeInternalArray <T>(ref T[] array)\n        {\n            int size = Mathf.NextPowerOfTwo(array.Length + 1);\n\n            System.Array.Resize(ref array, size);\n        }\n\n\n        private readonly float[] k_Power = { 5e-1f, 5e-2f, 5e-3f, 5e-4f, 5e-5f, 5e-6f, 5e-7f, 5e-8f, 5e-9f, 5e-10f }; // Used by FormatText to enable rounding and avoid using Mathf.Pow.\n\n        /// <summary>\n        /// Function used in conjunction with SetText()\n        /// </summary>\n        /// <param name=\"number\"></param>\n        /// <param name=\"index\"></param>\n        /// <param name=\"precision\"></param>\n        protected void AddFloatToCharArray(double number, ref int index, int precision)\n        {\n            if (number < 0)\n            {\n                m_input_CharArray[index++] = '-';\n                number = -number;\n            }\n\n            number += k_Power[Mathf.Min(9, precision)];\n\n            double integer = Math.Truncate(number);\n\n            AddIntToCharArray(integer, ref index, precision);\n\n            if (precision > 0)\n            {\n                // Add the decimal point\n                m_input_CharArray[index++] = '.';\n\n                number -= integer;\n                for (int p = 0; p < precision; p++)\n                {\n                    number *= 10;\n                    long d = (long)(number);\n\n                    m_input_CharArray[index++] = (char)(d + 48);\n                    number -= d;\n                }\n            }\n        }\n\n\n        /// <summary>\n        /// // Function used in conjunction with SetText()\n        /// </summary>\n        /// <param name=\"number\"></param>\n        /// <param name=\"index\"></param>\n        /// <param name=\"precision\"></param>\n        protected void AddIntToCharArray(double number, ref int index, int precision)\n        {\n            if (number < 0)\n            {\n                m_input_CharArray[index++] = '-';\n                number = -number;\n            }\n\n            int i = index;\n            do\n            {\n                m_input_CharArray[i++] = (char)(number % 10 + 48);\n                number /= 10;\n            } while (number > 0.999d);\n\n            int lastIndex = i;\n\n            // Reverse string\n            while (index + 1 < i)\n            {\n                i -= 1;\n                char t = m_input_CharArray[index];\n                m_input_CharArray[index] = m_input_CharArray[i];\n                m_input_CharArray[i] = t;\n                index += 1;\n            }\n            index = lastIndex;\n        }\n\n\n        /// <summary>\n        /// Method used to determine the number of visible characters and required buffer allocations.\n        /// </summary>\n        /// <param name=\"chars\"></param>\n        /// <returns></returns>\n        protected virtual int SetArraySizes(UnicodeChar[] chars) { return 0; }\n\n\n        /// <summary>\n        /// Method which parses the text input, does the layout of the text as well as generating the geometry.\n        /// </summary>\n        protected virtual void GenerateTextMesh() { }\n\n\n        /// <summary>\n        /// Function to Calculate the Preferred Width and Height of the text object.\n        /// </summary>\n        /// <returns></returns>\n        public Vector2 GetPreferredValues()\n        {\n            if (m_isInputParsingRequired || m_isTextTruncated)\n            {\n                m_isCalculatingPreferredValues = true;\n                ParseInputText();\n            }\n\n            // CALCULATE PREFERRED WIDTH\n            float preferredWidth = GetPreferredWidth();\n\n            // CALCULATE PREFERRED HEIGHT\n            float preferredHeight = GetPreferredHeight();\n\n            return new Vector2(preferredWidth, preferredHeight);\n        }\n\n\n        /// <summary>\n        /// Function to Calculate the Preferred Width and Height of the text object given the provided width and height.\n        /// </summary>\n        /// <returns></returns>\n        public Vector2 GetPreferredValues(float width, float height)\n        {\n            if (m_isInputParsingRequired || m_isTextTruncated)\n            {\n                m_isCalculatingPreferredValues = true;\n                ParseInputText();\n            }\n\n            Vector2 margin = new Vector2(width, height);\n\n            // CALCULATE PREFERRED WIDTH\n            float preferredWidth = GetPreferredWidth(margin);\n\n            // CALCULATE PREFERRED HEIGHT\n            float preferredHeight = GetPreferredHeight(margin);\n\n            return new Vector2(preferredWidth, preferredHeight);\n        }\n\n\n        /// <summary>\n        /// Function to Calculate the Preferred Width and Height of the text object given a certain string.\n        /// </summary>\n        /// <param name=\"text\"></param>\n        /// <returns></returns>\n        public Vector2 GetPreferredValues(string text)\n        {\n            m_isCalculatingPreferredValues = true;\n\n            StringToCharArray(text, ref m_TextParsingBuffer);\n            SetArraySizes(m_TextParsingBuffer);\n\n            Vector2 margin = k_LargePositiveVector2;\n\n            // CALCULATE PREFERRED WIDTH\n            float preferredWidth = GetPreferredWidth(margin);\n\n            // CALCULATE PREFERRED HEIGHT\n            float preferredHeight = GetPreferredHeight(margin);\n\n            return new Vector2(preferredWidth, preferredHeight);\n        }\n\n\n        /// <summary>\n        ///  Function to Calculate the Preferred Width and Height of the text object given a certain string and size of text container.\n        /// </summary>\n        /// <param name=\"text\"></param>\n        /// <returns></returns>\n        public Vector2 GetPreferredValues(string text, float width, float height)\n        {\n            m_isCalculatingPreferredValues = true;\n\n            StringToCharArray(text, ref m_TextParsingBuffer);\n            SetArraySizes(m_TextParsingBuffer);\n\n            Vector2 margin = new Vector2(width, height);\n\n            // CALCULATE PREFERRED WIDTH\n            float preferredWidth = GetPreferredWidth(margin);\n\n            // CALCULATE PREFERRED HEIGHT\n            float preferredHeight = GetPreferredHeight(margin);\n\n            return new Vector2(preferredWidth, preferredHeight);\n        }\n\n\n        /// <summary>\n        /// Method to calculate the preferred width of a text object.\n        /// </summary>\n        /// <returns></returns>\n        protected float GetPreferredWidth()\n        {\n            if (TMP_Settings.instance == null) return 0;\n\n            float fontSize = m_enableAutoSizing ? m_fontSizeMax : m_fontSize;\n\n            // Reset auto sizing point size bounds\n            m_minFontSize = m_fontSizeMin;\n            m_maxFontSize = m_fontSizeMax;\n            m_charWidthAdjDelta = 0;\n\n            // Set Margins to Infinity\n            Vector2 margin = k_LargePositiveVector2;\n\n            if (m_isInputParsingRequired || m_isTextTruncated)\n            {\n                m_isCalculatingPreferredValues = true;\n                ParseInputText();\n            }\n\n            m_recursiveCount = 0;\n            float preferredWidth = CalculatePreferredValues(fontSize, margin, true).x;\n\n            m_isPreferredWidthDirty = false;\n\n            //Debug.Log(\"GetPreferredWidth() Called at frame \" + Time.frameCount + \". Returning width of \" + preferredWidth);\n\n            return preferredWidth;\n        }\n\n\n        /// <summary>\n        /// Method to calculate the preferred width of a text object.\n        /// </summary>\n        /// <param name=\"margin\"></param>\n        /// <returns></returns>\n        protected float GetPreferredWidth(Vector2 margin)\n        {\n            float fontSize = m_enableAutoSizing ? m_fontSizeMax : m_fontSize;\n\n            // Reset auto sizing point size bounds\n            m_minFontSize = m_fontSizeMin;\n            m_maxFontSize = m_fontSizeMax;\n            m_charWidthAdjDelta = 0;\n\n            m_recursiveCount = 0;\n            float preferredWidth = CalculatePreferredValues(fontSize, margin, true).x;\n\n            //Debug.Log(\"GetPreferredWidth() Called. Returning width of \" + preferredWidth);\n\n            return preferredWidth;\n        }\n\n\n        /// <summary>\n        /// Method to calculate the preferred height of a text object.\n        /// </summary>\n        /// <returns></returns>\n        protected float GetPreferredHeight()\n        {\n            if (TMP_Settings.instance == null) return 0;\n\n            float fontSize = m_enableAutoSizing ? m_fontSizeMax : m_fontSize;\n\n            // Reset auto sizing point size bounds\n            m_minFontSize = m_fontSizeMin;\n            m_maxFontSize = m_fontSizeMax;\n            m_charWidthAdjDelta = 0;\n\n            Vector2 margin = new Vector2(m_marginWidth != 0 ? m_marginWidth : k_LargePositiveFloat, k_LargePositiveFloat);\n\n            if (m_isInputParsingRequired || m_isTextTruncated)\n            {\n                m_isCalculatingPreferredValues = true;\n                ParseInputText();\n            }\n\n            m_recursiveCount = 0;\n            float preferredHeight = CalculatePreferredValues(fontSize, margin, !m_enableAutoSizing).y;\n\n            m_isPreferredHeightDirty = false;\n\n            //Debug.Log(\"GetPreferredHeight() Called. Returning height of \" + preferredHeight);\n\n            return preferredHeight;\n        }\n\n\n        /// <summary>\n        /// Method to calculate the preferred height of a text object.\n        /// </summary>\n        /// <param name=\"margin\"></param>\n        /// <returns></returns>\n        protected float GetPreferredHeight(Vector2 margin)\n        {\n            float fontSize = m_enableAutoSizing ? m_fontSizeMax : m_fontSize;\n\n            // Reset auto sizing point size bounds\n            m_minFontSize = m_fontSizeMin;\n            m_maxFontSize = m_fontSizeMax;\n            m_charWidthAdjDelta = 0;\n\n            m_recursiveCount = 0;\n            float preferredHeight = CalculatePreferredValues(fontSize, margin, true).y;\n\n            //Debug.Log(\"GetPreferredHeight() Called. Returning height of \" + preferredHeight);\n\n            return preferredHeight;\n        }\n\n\n        /// <summary>\n        /// Method returning the rendered width and height of the text object.\n        /// </summary>\n        /// <returns></returns>\n        public Vector2 GetRenderedValues()\n        {\n            return GetTextBounds().size;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"onlyVisibleCharacters\">Should returned value only factor in visible characters and exclude those greater than maxVisibleCharacters for instance.</param>\n        /// <returns></returns>\n        public Vector2 GetRenderedValues(bool onlyVisibleCharacters)\n        {\n            return GetTextBounds(onlyVisibleCharacters).size;\n        }\n\n\n        /// <summary>\n        /// Method returning the rendered width of the text object.\n        /// </summary>\n        /// <returns></returns>\n        protected float GetRenderedWidth()\n        {\n            return GetRenderedValues().x;\n        }\n\n        /// <summary>\n        /// Method returning the rendered width of the text object.\n        /// </summary>\n        /// <returns></returns>\n        protected float GetRenderedWidth(bool onlyVisibleCharacters)\n        {\n            return GetRenderedValues(onlyVisibleCharacters).x;\n        }\n\n        /// <summary>\n        /// Method returning the rendered height of the text object.\n        /// </summary>\n        /// <returns></returns>\n        protected float GetRenderedHeight()\n        {\n            return GetRenderedValues().y;\n        }\n\n        /// <summary>\n        /// Method returning the rendered height of the text object.\n        /// </summary>\n        /// <returns></returns>\n        protected float GetRenderedHeight(bool onlyVisibleCharacters)\n        {\n            return GetRenderedValues(onlyVisibleCharacters).y;\n        }\n\n\n        /// <summary>\n        /// Method to calculate the preferred width and height of the text object.\n        /// </summary>\n        /// <returns></returns>\n        protected virtual Vector2 CalculatePreferredValues(float defaultFontSize, Vector2 marginSize, bool ignoreTextAutoSizing)\n        {\n            //Debug.Log(\"*** CalculatePreferredValues() ***\"); // ***** Frame: \" + Time.frameCount);\n\n            ////Profiler.BeginSample(\"TMP Generate Text - Phase I\");\n\n            // Early exit if no font asset was assigned. This should not be needed since LiberationSans SDF will be assigned by default.\n            if (m_fontAsset == null || m_fontAsset.characterLookupTable == null)\n            {\n                Debug.LogWarning(\"Can't Generate Mesh! No Font Asset has been assigned to Object ID: \" + this.GetInstanceID());\n\n                return Vector2.zero;\n            }\n\n            // Early exit if we don't have any Text to generate.\n            if (m_TextParsingBuffer == null || m_TextParsingBuffer.Length == 0 || m_TextParsingBuffer[0].unicode == (char)0)\n            {\n                return Vector2.zero;\n            }\n\n            m_currentFontAsset = m_fontAsset;\n            m_currentMaterial = m_sharedMaterial;\n            m_currentMaterialIndex = 0;\n            m_materialReferenceStack.SetDefault(new MaterialReference(0, m_currentFontAsset, null, m_currentMaterial, m_padding));\n\n            // Total character count is computed when the text is parsed.\n            int totalCharacterCount = m_totalCharacterCount; // m_VisibleCharacters.Count;\n\n            if (m_internalCharacterInfo == null || totalCharacterCount > m_internalCharacterInfo.Length)\n            {\n                m_internalCharacterInfo = new TMP_CharacterInfo[totalCharacterCount > 1024 ? totalCharacterCount + 256 : Mathf.NextPowerOfTwo(totalCharacterCount)];\n            }\n\n            // Calculate the scale of the font based on selected font size and sampling point size.\n            // baseScale is calculated using the font asset assigned to the text object.\n            float baseScale = m_fontScale = (defaultFontSize / m_fontAsset.faceInfo.pointSize * m_fontAsset.faceInfo.scale * (m_isOrthographic ? 1 : 0.1f));\n            float currentElementScale = baseScale;\n            m_fontScaleMultiplier = 1;\n\n            m_currentFontSize = defaultFontSize;\n            m_sizeStack.SetDefault(m_currentFontSize);\n            float fontSizeDelta = 0;\n\n            int charCode = 0; // Holds the character code of the currently being processed character.\n\n            m_FontStyleInternal = m_fontStyle; // Set the default style.\n\n            m_lineJustification = m_textAlignment; // Sets the line justification mode to match editor alignment.\n            m_lineJustificationStack.SetDefault(m_lineJustification);\n\n            float bold_xAdvance_multiplier = 1; // Used to increase spacing between character when style is bold.\n\n            m_baselineOffset = 0; // Used by subscript characters.\n            m_baselineOffsetStack.Clear();\n\n            m_lineOffset = 0; // Amount of space between lines (font line spacing + m_linespacing).\n            m_lineHeight = TMP_Math.FLOAT_UNSET;\n            float lineGap = m_currentFontAsset.faceInfo.lineHeight - (m_currentFontAsset.faceInfo.ascentLine - m_currentFontAsset.faceInfo.descentLine);\n\n            m_cSpacing = 0; // Amount of space added between characters as a result of the use of the <cspace> tag.\n            m_monoSpacing = 0;\n            float lineOffsetDelta = 0;\n            m_xAdvance = 0; // Used to track the position of each character.\n            float maxXAdvance = 0; // Used to determine Preferred Width.\n\n            tag_LineIndent = 0; // Used for indentation of text.\n            tag_Indent = 0;\n            m_indentStack.SetDefault(0);\n            tag_NoParsing = false;\n            //m_isIgnoringAlignment = false;\n\n            m_characterCount = 0; // Total characters in the char[]\n\n\n            // Tracking of line information\n            m_firstCharacterOfLine = 0;\n            m_maxLineAscender = k_LargeNegativeFloat;\n            m_maxLineDescender = k_LargePositiveFloat;\n            m_lineNumber = 0;\n\n            float marginWidth = marginSize.x;\n            //float marginHeight = marginSize.y;\n            m_marginLeft = 0;\n            m_marginRight = 0;\n            m_width = -1;\n\n            // Used by Unity's Auto Layout system.\n            float renderedWidth = 0;\n            float renderedHeight = 0;\n            float linebreakingWidth = 0;\n            m_isCalculatingPreferredValues = true;\n\n            // Tracking of the highest Ascender\n            m_maxAscender = 0;\n            m_maxDescender = 0;\n\n\n            // Initialize struct to track states of word wrapping\n            bool isFirstWord = true;\n            bool isLastBreakingChar = false;\n            WordWrapState savedLineState = new WordWrapState();\n            SaveWordWrappingState(ref savedLineState, 0, 0);\n            WordWrapState savedWordWrapState = new WordWrapState();\n            int wrappingIndex = 0;\n\n            // Counter to prevent recursive lockup when computing preferred values.\n            m_recursiveCount += 1;\n\n            // Parse through Character buffer to read HTML tags and begin creating mesh.\n            for (int i = 0; m_TextParsingBuffer[i].unicode != 0; i++)\n            {\n                charCode = (int)m_TextParsingBuffer[i].unicode;\n\n                // Parse Rich Text Tag\n                #region Parse Rich Text Tag\n                if (m_isRichText && charCode == 60)  // '<'\n                {\n                    m_isParsingText = true;\n                    m_textElementType = TMP_TextElementType.Character;\n\n                    // Check if Tag is valid. If valid, skip to the end of the validated tag.\n                    if (ValidateHtmlTag(m_TextParsingBuffer, i + 1, out int endTagIndex))\n                    {\n                        i = endTagIndex;\n\n                        // Continue to next character or handle the sprite element\n                        if (m_textElementType == TMP_TextElementType.Character)\n                            continue;\n                    }\n                }\n                else\n                {\n                    m_textElementType = m_textInfo.characterInfo[m_characterCount].elementType;\n                    m_currentMaterialIndex = m_textInfo.characterInfo[m_characterCount].materialReferenceIndex;\n                    m_currentFontAsset = m_textInfo.characterInfo[m_characterCount].fontAsset;\n                }\n                #endregion End Parse Rich Text Tag\n\n                int prev_MaterialIndex = m_currentMaterialIndex;\n                bool isUsingAltTypeface = m_textInfo.characterInfo[m_characterCount].isUsingAlternateTypeface;\n\n                m_isParsingText = false;\n\n                // Handle Font Styles like LowerCase, UpperCase and SmallCaps.\n                #region Handling of LowerCase, UpperCase and SmallCaps Font Styles\n\n                float smallCapsMultiplier = 1.0f;\n\n                if (m_textElementType == TMP_TextElementType.Character)\n                {\n                    if (/*(m_fontStyle & FontStyles.UpperCase) == FontStyles.UpperCase ||*/ (m_FontStyleInternal & FontStyles.UpperCase) == FontStyles.UpperCase)\n                    {\n                        // If this character is lowercase, switch to uppercase.\n                        if (char.IsLower((char)charCode))\n                            charCode = char.ToUpper((char)charCode);\n\n                    }\n                    else if (/*(m_fontStyle & FontStyles.LowerCase) == FontStyles.LowerCase ||*/ (m_FontStyleInternal & FontStyles.LowerCase) == FontStyles.LowerCase)\n                    {\n                        // If this character is uppercase, switch to lowercase.\n                        if (char.IsUpper((char)charCode))\n                            charCode = char.ToLower((char)charCode);\n                    }\n                    else if (/*(m_fontStyle & FontStyles.SmallCaps) == FontStyles.SmallCaps ||*/ (m_FontStyleInternal & FontStyles.SmallCaps) == FontStyles.SmallCaps)\n                    {\n                        if (char.IsLower((char)charCode))\n                        {\n                            smallCapsMultiplier = 0.8f;\n                            charCode = char.ToUpper((char)charCode);\n                        }\n                    }\n                }\n                #endregion\n\n\n                // Look up Character Data from Dictionary and cache it.\n                #region Look up Character Data\n                if (m_textElementType == TMP_TextElementType.Sprite)\n                {\n                    // If a sprite is used as a fallback then get a reference to it and set the color to white.\n                    m_currentSpriteAsset = m_textInfo.characterInfo[m_characterCount].spriteAsset;\n                    m_spriteIndex = m_textInfo.characterInfo[m_characterCount].spriteIndex;\n\n                    TMP_SpriteCharacter sprite = m_currentSpriteAsset.spriteCharacterTable[m_spriteIndex];\n                    if (sprite == null) continue;\n\n                    // Sprites are assigned in the E000 Private Area + sprite Index\n                    if (charCode == 60)\n                        charCode = 57344 + m_spriteIndex;\n\n                    m_currentFontAsset = m_fontAsset;\n\n                    // The sprite scale calculations are based on the font asset assigned to the text object.\n                    // Sprite scale is used to determine line height\n                    // Current element scale represents a modified scale to normalize the sprite based on the font baseline to ascender.\n                    float spriteScale = (m_currentFontSize / m_fontAsset.faceInfo.pointSize * m_fontAsset.faceInfo.scale * (m_isOrthographic ? 1 : 0.1f));\n                    currentElementScale = m_fontAsset.faceInfo.ascentLine / sprite.glyph.metrics.height * sprite.scale * spriteScale;\n\n                    m_cached_TextElement = sprite;\n\n                    m_internalCharacterInfo[m_characterCount].elementType = TMP_TextElementType.Sprite;\n                    m_internalCharacterInfo[m_characterCount].scale = spriteScale;\n                    //m_internalCharacterInfo[m_characterCount].spriteAsset = m_currentSpriteAsset;\n                    //m_internalCharacterInfo[m_characterCount].fontAsset = m_currentFontAsset;\n                    //m_internalCharacterInfo[m_characterCount].materialReferenceIndex = m_currentMaterialIndex;\n\n                    m_currentMaterialIndex = prev_MaterialIndex;\n                }\n                else if (m_textElementType == TMP_TextElementType.Character)\n                {\n                    m_cached_TextElement = m_textInfo.characterInfo[m_characterCount].textElement;\n                    if (m_cached_TextElement == null) continue;\n\n                    //m_currentFontAsset = m_textInfo.characterInfo[m_characterCount].fontAsset;\n                    //m_currentMaterial = m_textInfo.characterInfo[m_characterCount].material;\n                    m_currentMaterialIndex = m_textInfo.characterInfo[m_characterCount].materialReferenceIndex;\n\n                    // Re-calculate font scale as the font asset may have changed.\n                    m_fontScale = m_currentFontSize * smallCapsMultiplier / m_currentFontAsset.faceInfo.pointSize * m_currentFontAsset.faceInfo.scale * (m_isOrthographic ? 1 : 0.1f);\n\n                    currentElementScale = m_fontScale * m_fontScaleMultiplier * m_cached_TextElement.scale;\n\n                    m_internalCharacterInfo[m_characterCount].elementType = TMP_TextElementType.Character;\n\n                }\n                #endregion\n\n\n                // Handle Soft Hyphen\n                #region Handle Soft Hyphen\n                float old_scale = currentElementScale;\n                if (charCode == 0xAD)\n                {\n                    currentElementScale = 0;\n                }\n                #endregion\n\n\n                // Store some of the text object's information\n                m_internalCharacterInfo[m_characterCount].character = (char)charCode;\n\n\n                // Handle Kerning if Enabled.\n                #region Handle Kerning\n                TMP_GlyphValueRecord glyphAdjustments = new TMP_GlyphValueRecord();\n                float characterSpacingAdjustment = m_characterSpacing;\n                if (m_enableKerning)\n                {\n                    if (m_characterCount < totalCharacterCount - 1)\n                    {\n                        uint firstGlyphIndex = m_cached_TextElement.glyphIndex;\n                        uint secondGlyphIndex = m_textInfo.characterInfo[m_characterCount + 1].textElement.glyphIndex;\n                        long key = new GlyphPairKey(firstGlyphIndex, secondGlyphIndex).key;\n\n                        if (m_currentFontAsset.fontFeatureTable.m_GlyphPairAdjustmentRecordLookupDictionary.TryGetValue(key, out TMP_GlyphPairAdjustmentRecord adjustmentPair))\n                        {\n                            glyphAdjustments = adjustmentPair.firstAdjustmentRecord.glyphValueRecord;\n                            characterSpacingAdjustment = (adjustmentPair.featureLookupFlags & FontFeatureLookupFlags.IgnoreSpacingAdjustments) == FontFeatureLookupFlags.IgnoreSpacingAdjustments ? 0 : characterSpacingAdjustment;\n                        }\n                    }\n\n                    if (m_characterCount >= 1)\n                    {\n                        uint firstGlyphIndex = m_textInfo.characterInfo[m_characterCount - 1].textElement.glyphIndex;\n                        uint secondGlyphIndex = m_cached_TextElement.glyphIndex;\n                        long key = new GlyphPairKey(firstGlyphIndex, secondGlyphIndex).key;\n\n                        if (m_currentFontAsset.fontFeatureTable.m_GlyphPairAdjustmentRecordLookupDictionary.TryGetValue(key, out TMP_GlyphPairAdjustmentRecord adjustmentPair))\n                        {\n                            glyphAdjustments += adjustmentPair.secondAdjustmentRecord.glyphValueRecord;\n                            characterSpacingAdjustment = (adjustmentPair.featureLookupFlags & FontFeatureLookupFlags.IgnoreSpacingAdjustments) == FontFeatureLookupFlags.IgnoreSpacingAdjustments ? 0 : characterSpacingAdjustment;\n                        }\n                    }\n                }\n                #endregion\n\n\n                // Initial Implementation for RTL support.\n                #region Handle Right-to-Left\n                //if (m_isRightToLeft)\n                //{\n                //    m_xAdvance -= ((m_cached_TextElement.xAdvance * bold_xAdvance_multiplier + m_characterSpacing + m_wordSpacing + m_currentFontAsset.normalSpacingOffset) * currentElementScale + m_cSpacing) * (1 - m_charWidthAdjDelta);\n\n                //    if (char.IsWhiteSpace((char)charCode) || charCode == 0x200B)\n                //        m_xAdvance -= m_wordSpacing * currentElementScale;\n                //}\n                #endregion\n\n\n                // Handle Mono Spacing\n                #region Handle Mono Spacing\n                float monoAdvance = 0;\n                if (m_monoSpacing != 0)\n                {\n                    monoAdvance = (m_monoSpacing / 2 - (m_cached_TextElement.glyph.metrics.width / 2 + m_cached_TextElement.glyph.metrics.horizontalBearingX) * currentElementScale);\n                    m_xAdvance += monoAdvance;\n                }\n                #endregion\n\n\n                // Set Padding based on selected font style\n                #region Handle Style Padding\n                if (m_textElementType == TMP_TextElementType.Character && !isUsingAltTypeface && ((m_FontStyleInternal & FontStyles.Bold) == FontStyles.Bold)) // Checks for any combination of Bold Style.\n                {\n                    bold_xAdvance_multiplier = 1 + m_currentFontAsset.boldSpacing * 0.01f;\n                }\n                else\n                {\n                    //style_padding = m_currentFontAsset.normalStyle * 2;\n                    bold_xAdvance_multiplier = 1.0f;\n                }\n                #endregion Handle Style Padding\n\n                m_internalCharacterInfo[m_characterCount].baseLine = 0 - m_lineOffset + m_baselineOffset;\n\n\n                // Compute and save text element Ascender and maximum line Ascender.\n                float elementAscender = m_currentFontAsset.faceInfo.ascentLine * (m_textElementType == TMP_TextElementType.Character ? currentElementScale / smallCapsMultiplier : m_internalCharacterInfo[m_characterCount].scale) + m_baselineOffset;\n                m_internalCharacterInfo[m_characterCount].ascender = elementAscender - m_lineOffset;\n                m_maxLineAscender = elementAscender > m_maxLineAscender ? elementAscender : m_maxLineAscender;\n\n                // Compute and save text element Descender and maximum line Descender.\n                float elementDescender = m_currentFontAsset.faceInfo.descentLine * (m_textElementType == TMP_TextElementType.Character ? currentElementScale / smallCapsMultiplier: m_internalCharacterInfo[m_characterCount].scale) + m_baselineOffset;\n                float elementDescenderII = m_internalCharacterInfo[m_characterCount].descender = elementDescender - m_lineOffset;\n                m_maxLineDescender = elementDescender < m_maxLineDescender ? elementDescender : m_maxLineDescender;\n\n                // Adjust maxLineAscender and maxLineDescender if style is superscript or subscript\n                if ((m_FontStyleInternal & FontStyles.Subscript) == FontStyles.Subscript || (m_FontStyleInternal & FontStyles.Superscript) == FontStyles.Superscript)\n                {\n                    float baseAscender = (elementAscender - m_baselineOffset) / m_currentFontAsset.faceInfo.subscriptSize;\n                    elementAscender = m_maxLineAscender;\n                    m_maxLineAscender = baseAscender > m_maxLineAscender ? baseAscender : m_maxLineAscender;\n\n                    float baseDescender = (elementDescender - m_baselineOffset) / m_currentFontAsset.faceInfo.subscriptSize;\n                    elementDescender = m_maxLineDescender;\n                    m_maxLineDescender = baseDescender < m_maxLineDescender ? baseDescender : m_maxLineDescender;\n                }\n\n                if (m_lineNumber == 0) m_maxAscender = m_maxAscender > elementAscender ? m_maxAscender : elementAscender;\n                //if (m_lineOffset == 0) pageAscender = pageAscender > elementAscender ? pageAscender : elementAscender;\n\n                // Setup Mesh for visible text elements. ie. not a SPACE / LINEFEED / CARRIAGE RETURN.\n                #region Handle Visible Characters\n                if (charCode == 9 || charCode == 0xA0 || charCode == 0x2007 || (!char.IsWhiteSpace((char)charCode) && charCode != 0x200B) || m_textElementType == TMP_TextElementType.Sprite)\n                {\n                    // Check if Character exceeds the width of the Text Container\n                    #region Handle Line Breaking, Text Auto-Sizing and Horizontal Overflow\n                    float width = m_width != -1 ? Mathf.Min(marginWidth + 0.0001f - m_marginLeft - m_marginRight, m_width) : marginWidth + 0.0001f - m_marginLeft - m_marginRight;\n\n                    bool isJustifiedOrFlush = ((_HorizontalAlignmentOptions)m_lineJustification & _HorizontalAlignmentOptions.Flush) == _HorizontalAlignmentOptions.Flush || ((_HorizontalAlignmentOptions)m_lineJustification & _HorizontalAlignmentOptions.Justified) == _HorizontalAlignmentOptions.Justified;\n\n                    // Calculate the line breaking width of the text.\n                    linebreakingWidth = m_xAdvance + m_cached_TextElement.glyph.metrics.horizontalAdvance * (1 - m_charWidthAdjDelta) * (charCode != 0xAD ? currentElementScale : old_scale);\n\n                    // Check if Character exceeds the width of the Text Container\n                    if (linebreakingWidth > width * (isJustifiedOrFlush ? 1.05f : 1.0f))\n                    {\n                        // Word Wrapping\n                        #region Handle Word Wrapping\n                        if (enableWordWrapping && m_characterCount != m_firstCharacterOfLine)\n                        {\n                            // Check if word wrapping is still possible\n                            #region Line Breaking Check\n                            if (wrappingIndex == savedWordWrapState.previous_WordBreak || isFirstWord)\n                            {\n                                // Word wrapping is no longer possible. Shrink size of text if auto-sizing is enabled.\n                                #region Text Auto-Sizing\n                                if (ignoreTextAutoSizing == false && m_currentFontSize > m_fontSizeMin)\n                                {\n                                    // Handle Character Width Adjustments\n                                    #region Character Width Adjustments\n                                    if (m_charWidthAdjDelta < m_charWidthMaxAdj / 100)\n                                    {\n                                        m_recursiveCount = 0;\n                                        m_charWidthAdjDelta += 0.01f;\n                                        return CalculatePreferredValues(defaultFontSize, marginSize, false);\n                                    }\n                                    #endregion\n\n                                    // Adjust Point Size\n                                    m_maxFontSize = defaultFontSize;\n\n                                    defaultFontSize -= Mathf.Max((defaultFontSize - m_minFontSize) / 2, 0.05f);\n                                    defaultFontSize = (int)(Mathf.Max(defaultFontSize, m_fontSizeMin) * 20 + 0.5f) / 20f;\n\n                                    if (m_recursiveCount > 20) return new Vector2(renderedWidth, renderedHeight);\n                                    return CalculatePreferredValues(defaultFontSize, marginSize, false);\n                                }\n                                #endregion\n\n                                // Word wrapping is no longer possible, now breaking up individual words.\n                                if (m_isCharacterWrappingEnabled == false)\n                                {\n                                    m_isCharacterWrappingEnabled = true;\n                                }\n                                else\n                                    isLastBreakingChar = true;\n                            }\n                            #endregion\n\n                            // Restore to previously stored state of last valid (space character or linefeed)\n                            i = RestoreWordWrappingState(ref savedWordWrapState);\n                            wrappingIndex = i;  // Used to detect when line length can no longer be reduced.\n\n                            // Handling for Soft Hyphen\n                            if (m_TextParsingBuffer[i].unicode == 0xAD) // && !m_isCharacterWrappingEnabled) // && ellipsisIndex != i && !m_isCharacterWrappingEnabled)\n                            {\n                                m_isTextTruncated = true;\n                                m_TextParsingBuffer[i].unicode = 0x2D;\n                                return CalculatePreferredValues(defaultFontSize, marginSize, true);\n                            }\n\n                            // Check if Line Spacing of previous line needs to be adjusted.\n                            if (m_lineNumber > 0 && !TMP_Math.Approximately(m_maxLineAscender, m_startOfLineAscender) && m_lineHeight == TMP_Math.FLOAT_UNSET)\n                            {\n                                //Debug.Log(\"(1) Adjusting Line Spacing on line #\" + m_lineNumber);\n                                float offsetDelta = m_maxLineAscender - m_startOfLineAscender;\n                                //AdjustLineOffset(m_firstCharacterOfLine, m_characterCount, offsetDelta);\n                                m_lineOffset += offsetDelta;\n                                savedWordWrapState.lineOffset = m_lineOffset;\n                                savedWordWrapState.previousLineAscender = m_maxLineAscender;\n\n                                // TODO - Add check for character exceeding vertical bounds\n                            }\n                            //m_isNewPage = false;\n\n                            // Calculate lineAscender & make sure if last character is superscript or subscript that we check that as well.\n                            float lineAscender = m_maxLineAscender - m_lineOffset;\n                            float lineDescender = m_maxLineDescender - m_lineOffset;\n\n\n                            // Update maxDescender and maxVisibleDescender\n                            m_maxDescender = m_maxDescender < lineDescender ? m_maxDescender : lineDescender;\n\n\n                            m_firstCharacterOfLine = m_characterCount; // Store first character of the next line.\n\n                            // Compute Preferred Width & Height\n                            renderedWidth += m_xAdvance;\n\n                            if (m_enableWordWrapping)\n                                renderedHeight = m_maxAscender - m_maxDescender;\n                            else\n                                renderedHeight = Mathf.Max(renderedHeight, lineAscender - lineDescender);\n\n\n                            // Store the state of the line before starting on the new line.\n                            SaveWordWrappingState(ref savedLineState, i, m_characterCount - 1);\n\n                            m_lineNumber += 1;\n                            //isStartOfNewLine = true;\n\n                            // Check to make sure Array is large enough to hold a new line.\n                            //if (m_lineNumber >= m_internalTextInfo.lineInfo.Length)\n                            //    ResizeLineExtents(m_lineNumber);\n\n                            // Apply Line Spacing based on scale of the last character of the line.\n                            if (m_lineHeight == TMP_Math.FLOAT_UNSET)\n                            {\n                                float ascender = m_internalCharacterInfo[m_characterCount].ascender - m_internalCharacterInfo[m_characterCount].baseLine;\n                                lineOffsetDelta = 0 - m_maxLineDescender + ascender + (lineGap + m_lineSpacing + m_lineSpacingDelta) * baseScale;\n                                m_lineOffset += lineOffsetDelta;\n\n                                m_startOfLineAscender = ascender;\n                            }\n                            else\n                                m_lineOffset += m_lineHeight + m_lineSpacing * baseScale;\n\n                            m_maxLineAscender = k_LargeNegativeFloat;\n                            m_maxLineDescender = k_LargePositiveFloat;\n\n                            m_xAdvance = 0 + tag_Indent;\n\n                            continue;\n                        }\n                        #endregion End Word Wrapping\n\n                        // Text Auto-Sizing (text exceeding Width of container. \n                        #region Handle Text Auto-Sizing\n                        if (ignoreTextAutoSizing == false && defaultFontSize > m_fontSizeMin)\n                        {\n                            // Handle Character Width Adjustments\n                            #region Character Width Adjustments\n                            if (m_charWidthAdjDelta < m_charWidthMaxAdj / 100)\n                            {\n                                m_recursiveCount = 0;\n                                m_charWidthAdjDelta += 0.01f;\n                                return CalculatePreferredValues(defaultFontSize, marginSize, false);\n                            }\n                            #endregion\n\n                            // Adjust Point Size\n                            m_maxFontSize = defaultFontSize;\n\n                            defaultFontSize -= Mathf.Max((defaultFontSize - m_minFontSize) / 2, 0.05f);\n                            defaultFontSize = (int)(Mathf.Max(defaultFontSize, m_fontSizeMin) * 20 + 0.5f) / 20f;\n\n                            if (m_recursiveCount > 20) return new Vector2(renderedWidth, renderedHeight);\n                            return CalculatePreferredValues(defaultFontSize, marginSize, false);\n                        }\n                        #endregion End Text Auto-Sizing\n                    }\n                    #endregion End Check for Characters Exceeding Width of Text Container\n\n                }\n                #endregion Handle Visible Characters\n\n\n                // Check if Line Spacing of previous line needs to be adjusted.\n                #region Adjust Line Spacing\n                if (m_lineNumber > 0 && !TMP_Math.Approximately(m_maxLineAscender, m_startOfLineAscender) && m_lineHeight == TMP_Math.FLOAT_UNSET && !m_isNewPage)\n                {\n                    //Debug.Log(\"Inline - Adjusting Line Spacing on line #\" + m_lineNumber);\n                    //float gap = 0; // Compute gap.\n\n                    float offsetDelta = m_maxLineAscender - m_startOfLineAscender;\n                    //AdjustLineOffset(m_firstCharacterOfLine, m_characterCount, offsetDelta);\n                    elementDescenderII -= offsetDelta;\n                    m_lineOffset += offsetDelta;\n\n                    m_startOfLineAscender += offsetDelta;\n                    savedWordWrapState.lineOffset = m_lineOffset;\n                    savedWordWrapState.previousLineAscender = m_startOfLineAscender;\n                }\n                #endregion\n\n\n                // Check if text Exceeds the vertical bounds of the margin area.\n                #region Check Vertical Bounds & Auto-Sizing\n                /*\n                if (m_maxAscender - elementDescenderII > marginHeight + 0.0001f)\n                {\n                    // Handle Line spacing adjustments\n                    #region Line Spacing Adjustments\n                    if (m_enableAutoSizing && m_lineSpacingDelta > m_lineSpacingMax && m_lineNumber > 0)\n                    {\n                        //loopCountA = 0;\n\n                        //m_lineSpacingDelta -= 1;\n                        //GenerateTextMesh();\n                        //return;\n                    }\n                    #endregion\n\n\n                    // Handle Text Auto-sizing resulting from text exceeding vertical bounds.\n                    #region Text Auto-Sizing (Text greater than vertical bounds)\n                    if (m_enableAutoSizing && m_fontSize > m_fontSizeMin)\n                    {\n                        m_maxFontSize = m_fontSize;\n\n                        m_fontSize -= Mathf.Max((m_fontSize - m_minFontSize) / 2, 0.05f);\n                        m_fontSize = (int)(Mathf.Max(m_fontSize, m_fontSizeMin) * 20 + 0.5f) / 20f;\n\n                        //m_recursiveCount = 0;\n                        //if (loopCountA > 20) return; // Added to debug \n                        CalculatePreferredValues(m_fontSize, marginSize, false);\n                        return Vector2.zero;\n                    }\n                    #endregion Text Auto-Sizing\n                }\n                */\n                #endregion Check Vertical Bounds\n\n\n                // Handle xAdvance & Tabulation Stops. Tab stops at every 25% of Font Size.\n                #region XAdvance, Tabulation & Stops\n                if (charCode == 9)\n                {\n                    float tabSize = m_currentFontAsset.faceInfo.tabWidth * currentElementScale;\n                    float tabs = Mathf.Ceil(m_xAdvance / tabSize) * tabSize;\n                    m_xAdvance = tabs > m_xAdvance ? tabs : m_xAdvance + tabSize;\n                }\n                else if (m_monoSpacing != 0)\n                {\n                    m_xAdvance += (m_monoSpacing - monoAdvance + ((characterSpacingAdjustment + m_currentFontAsset.normalSpacingOffset) * currentElementScale) + m_cSpacing) * (1 - m_charWidthAdjDelta);\n\n                    if (char.IsWhiteSpace((char)charCode) || charCode == 0x200B)\n                        m_xAdvance += m_wordSpacing * currentElementScale;\n                }\n                else\n                {\n                    m_xAdvance += ((m_cached_TextElement.glyph.metrics.horizontalAdvance * bold_xAdvance_multiplier + characterSpacingAdjustment + m_currentFontAsset.normalSpacingOffset + glyphAdjustments.xAdvance) * currentElementScale + m_cSpacing) * (1 - m_charWidthAdjDelta);\n\n                    if (char.IsWhiteSpace((char)charCode) || charCode == 0x200B)\n                        m_xAdvance += m_wordSpacing * currentElementScale;\n                }\n\n\n                #endregion Tabulation & Stops\n\n\n                // Handle Carriage Return\n                #region Carriage Return\n                if (charCode == 13)\n                {\n                    maxXAdvance = Mathf.Max(maxXAdvance, renderedWidth + m_xAdvance);\n                    renderedWidth = 0;\n                    m_xAdvance = 0 + tag_Indent;\n                }\n                #endregion Carriage Return\n\n\n                // Handle Line Spacing Adjustments + Word Wrapping & special case for last line.\n                #region Check for Line Feed and Last Character\n                if (charCode == 10 || m_characterCount == totalCharacterCount - 1)\n                {\n                    // Check if Line Spacing of previous line needs to be adjusted.\n                    if (m_lineNumber > 0 && !TMP_Math.Approximately(m_maxLineAscender, m_startOfLineAscender) && m_lineHeight == TMP_Math.FLOAT_UNSET)\n                    {\n                        //Debug.Log(\"(2) Adjusting Line Spacing on line #\" + m_lineNumber);\n                        float offsetDelta = m_maxLineAscender - m_startOfLineAscender;\n                        //AdjustLineOffset(m_firstCharacterOfLine, m_characterCount, offsetDelta);\n                        elementDescenderII -= offsetDelta;\n                        m_lineOffset += offsetDelta;\n                    }\n\n                    // Calculate lineAscender & make sure if last character is superscript or subscript that we check that as well.\n                    //float lineAscender = m_maxLineAscender - m_lineOffset;\n                    float lineDescender = m_maxLineDescender - m_lineOffset;\n\n                    // Update maxDescender and maxVisibleDescender\n                    m_maxDescender = m_maxDescender < lineDescender ? m_maxDescender : lineDescender;\n\n                    m_firstCharacterOfLine = m_characterCount + 1;\n\n                    // Store PreferredWidth paying attention to linefeed and last character of text.\n                    if (charCode == 10 && m_characterCount != totalCharacterCount - 1)\n                    {\n                        maxXAdvance = Mathf.Max(maxXAdvance, renderedWidth + linebreakingWidth);\n                        renderedWidth = 0;\n                    }\n                    else\n                        renderedWidth = Mathf.Max(maxXAdvance, renderedWidth + linebreakingWidth);\n\n\n                    renderedHeight = m_maxAscender - m_maxDescender;\n\n\n                    // Add new line if not last lines or character.\n                    if (charCode == 10)\n                    {\n                        // Store the state of the line before starting on the new line.\n                        SaveWordWrappingState(ref savedLineState, i, m_characterCount);\n                        // Store the state of the last Character before the new line.\n                        SaveWordWrappingState(ref savedWordWrapState, i, m_characterCount);\n\n                        m_lineNumber += 1;\n\n                        // Apply Line Spacing\n                        if (m_lineHeight == TMP_Math.FLOAT_UNSET)\n                        {\n                            lineOffsetDelta = 0 - m_maxLineDescender + elementAscender + (lineGap + m_lineSpacing + m_paragraphSpacing + m_lineSpacingDelta) * baseScale;\n                            m_lineOffset += lineOffsetDelta;\n                        }\n                        else\n                            m_lineOffset += m_lineHeight + (m_lineSpacing + m_paragraphSpacing) * baseScale;\n\n                        m_maxLineAscender = k_LargeNegativeFloat;\n                        m_maxLineDescender = k_LargePositiveFloat;\n                        m_startOfLineAscender = elementAscender;\n\n                        m_xAdvance = 0 + tag_LineIndent + tag_Indent;\n\n                        m_characterCount += 1;\n                        continue;\n                    }\n                }\n                #endregion Check for Linefeed or Last Character\n\n\n                // Save State of Mesh Creation for handling of Word Wrapping\n                #region Save Word Wrapping State\n                if (m_enableWordWrapping || m_overflowMode == TextOverflowModes.Truncate || m_overflowMode == TextOverflowModes.Ellipsis)\n                {\n                    if ((char.IsWhiteSpace((char)charCode) || charCode == 0x200B || charCode == 0x2D || charCode == 0xAD) && !m_isNonBreakingSpace && charCode != 0xA0 && charCode != 0x2011 && charCode != 0x202F && charCode != 0x2060)\n                    {\n                        // We store the state of numerous variables for the most recent Space, LineFeed or Carriage Return to enable them to be restored \n                        // for Word Wrapping.\n                        SaveWordWrappingState(ref savedWordWrapState, i, m_characterCount);\n                        m_isCharacterWrappingEnabled = false;\n                        isFirstWord = false;\n                    }\n                    // Handling for East Asian languages\n                    else if ((charCode > 0x1100 && charCode < 0x11ff || /* Hangul Jamo */\n                                charCode > 0x2E80 && charCode < 0x9FFF || /* CJK */\n                                charCode > 0xA960 && charCode < 0xA97F || /* Hangul Jame Extended-A */\n                                charCode > 0xAC00 && charCode < 0xD7FF || /* Hangul Syllables */\n                                charCode > 0xF900 && charCode < 0xFAFF || /* CJK Compatibility Ideographs */\n                                charCode > 0xFE30 && charCode < 0xFE4F || /* CJK Compatibility Forms */\n                                charCode > 0xFF00 && charCode < 0xFFEF)   /* CJK Halfwidth */\n                                && !m_isNonBreakingSpace)\n                    {\n                        if (isFirstWord || isLastBreakingChar || TMP_Settings.linebreakingRules.leadingCharacters.ContainsKey(charCode) == false &&\n                            (m_characterCount < totalCharacterCount - 1 &&\n                            TMP_Settings.linebreakingRules.followingCharacters.ContainsKey(m_internalCharacterInfo[m_characterCount + 1].character) == false))\n                        {\n                            SaveWordWrappingState(ref savedWordWrapState, i, m_characterCount);\n                            m_isCharacterWrappingEnabled = false;\n                            isFirstWord = false;\n                        }\n                    }\n                    else if ((isFirstWord || m_isCharacterWrappingEnabled == true || isLastBreakingChar))\n                        SaveWordWrappingState(ref savedWordWrapState, i, m_characterCount);\n                }\n                #endregion Save Word Wrapping State\n\n                m_characterCount += 1;\n            }\n\n            // Check Auto Sizing and increase font size to fill text container.\n            #region Check Auto-Sizing (Upper Font Size Bounds)\n            fontSizeDelta = m_maxFontSize - m_minFontSize;\n            if (!m_isCharacterWrappingEnabled && ignoreTextAutoSizing == false && fontSizeDelta > 0.051f && defaultFontSize < m_fontSizeMax)\n            {\n                m_minFontSize = defaultFontSize;\n                defaultFontSize += Mathf.Max((m_maxFontSize - defaultFontSize) / 2, 0.05f);\n                defaultFontSize = (int)(Mathf.Min(defaultFontSize, m_fontSizeMax) * 20 + 0.5f) / 20f;\n\n                if (m_recursiveCount > 20) return new Vector2(renderedWidth, renderedHeight);\n                return CalculatePreferredValues(defaultFontSize, marginSize, false);\n            }\n            #endregion End Auto-sizing Check\n\n\n            m_isCharacterWrappingEnabled = false;\n            m_isCalculatingPreferredValues = false;\n\n            // Adjust Preferred Width and Height to account for Margins.\n            renderedWidth += m_margin.x > 0 ? m_margin.x : 0;\n            renderedWidth += m_margin.z > 0 ? m_margin.z : 0;\n\n            renderedHeight += m_margin.y > 0 ? m_margin.y : 0;\n            renderedHeight += m_margin.w > 0 ? m_margin.w : 0;\n\n            // Round Preferred Values to nearest 5/100.\n            renderedWidth = (int)(renderedWidth * 100 + 1f) / 100f;\n            renderedHeight = (int)(renderedHeight * 100 + 1f) / 100f;\n\n            //Debug.Log(\"Preferred Values: (\" + renderedWidth + \", \" + renderedHeight + \") with Recursive count of \" + m_recursiveCount);\n\n            ////Profiler.EndSample();\n            return new Vector2(renderedWidth, renderedHeight);\n        }\n\n\n        /// <summary>\n        /// Method returning the compound bounds of the text object and child sub objects.\n        /// </summary>\n        /// <returns></returns>\n        protected virtual Bounds GetCompoundBounds() { return new Bounds(); }\n\n\n        /// <summary>\n        /// Method which returns the bounds of the text object;\n        /// </summary>\n        /// <returns></returns>\n        protected Bounds GetTextBounds()\n        {\n            if (m_textInfo == null || m_textInfo.characterCount > m_textInfo.characterInfo.Length) return new Bounds();\n\n            Extents extent = new Extents(k_LargePositiveVector2, k_LargeNegativeVector2);\n\n            for (int i = 0; i < m_textInfo.characterCount && i < m_textInfo.characterInfo.Length; i++)\n            {\n                if (!m_textInfo.characterInfo[i].isVisible) continue;\n\n                extent.min.x = Mathf.Min(extent.min.x, m_textInfo.characterInfo[i].bottomLeft.x);\n                extent.min.y = Mathf.Min(extent.min.y, m_textInfo.characterInfo[i].descender);\n\n                extent.max.x = Mathf.Max(extent.max.x, m_textInfo.characterInfo[i].xAdvance);\n                extent.max.y = Mathf.Max(extent.max.y, m_textInfo.characterInfo[i].ascender);\n            }\n\n            Vector2 size;\n            size.x = extent.max.x - extent.min.x;\n            size.y = extent.max.y - extent.min.y;\n\n            Vector3 center = (extent.min + extent.max) / 2;\n\n            return new Bounds(center, size);\n        }\n\n\n        /// <summary>\n        /// Method which returns the bounds of the text object;\n        /// </summary>\n        /// <param name=\"onlyVisibleCharacters\"></param>\n        /// <returns></returns>\n        protected Bounds GetTextBounds(bool onlyVisibleCharacters)\n        {\n            if (m_textInfo == null) return new Bounds();\n\n            Extents extent = new Extents(k_LargePositiveVector2, k_LargeNegativeVector2);\n\n            for (int i = 0; i < m_textInfo.characterCount; i++)\n            {\n                if ((i > maxVisibleCharacters || m_textInfo.characterInfo[i].lineNumber > m_maxVisibleLines) && onlyVisibleCharacters) break;\n\n                if (onlyVisibleCharacters && !m_textInfo.characterInfo[i].isVisible) continue;\n\n                extent.min.x = Mathf.Min(extent.min.x, m_textInfo.characterInfo[i].origin);\n                extent.min.y = Mathf.Min(extent.min.y, m_textInfo.characterInfo[i].descender);\n\n                extent.max.x = Mathf.Max(extent.max.x, m_textInfo.characterInfo[i].xAdvance);\n                extent.max.y = Mathf.Max(extent.max.y, m_textInfo.characterInfo[i].ascender);\n            }\n\n            Vector2 size;\n            size.x = extent.max.x - extent.min.x;\n            size.y = extent.max.y - extent.min.y;\n\n            Vector2 center = (extent.min + extent.max) / 2;\n\n            return new Bounds(center, size);\n        }\n\n\n        /// <summary>\n        /// Method to adjust line spacing as a result of using different fonts or font point size.\n        /// </summary>\n        /// <param name=\"startIndex\"></param>\n        /// <param name=\"endIndex\"></param>\n        /// <param name=\"offset\"></param>\n        protected virtual void AdjustLineOffset(int startIndex, int endIndex, float offset) { }\n\n\n        /// <summary>\n        /// Function to increase the size of the Line Extents Array.\n        /// </summary>\n        /// <param name=\"size\"></param>\n        protected void ResizeLineExtents(int size)\n        {\n            size = size > 1024 ? size + 256 : Mathf.NextPowerOfTwo(size + 1);\n\n            TMP_LineInfo[] temp_lineInfo = new TMP_LineInfo[size];\n            for (int i = 0; i < size; i++)\n            {\n                if (i < m_textInfo.lineInfo.Length)\n                    temp_lineInfo[i] = m_textInfo.lineInfo[i];\n                else\n                {\n                    temp_lineInfo[i].lineExtents.min = k_LargePositiveVector2;\n                    temp_lineInfo[i].lineExtents.max = k_LargeNegativeVector2;\n\n                    temp_lineInfo[i].ascender = k_LargeNegativeFloat;\n                    temp_lineInfo[i].descender = k_LargePositiveFloat;\n                }\n            }\n\n            m_textInfo.lineInfo = temp_lineInfo;\n        }\n        protected static Vector2 k_LargePositiveVector2 = new Vector2(TMP_Math.INT_MAX, TMP_Math.INT_MAX);\n        protected static Vector2 k_LargeNegativeVector2 = new Vector2(TMP_Math.INT_MIN, TMP_Math.INT_MIN);\n        protected static float k_LargePositiveFloat = TMP_Math.FLOAT_MAX;\n        protected static float k_LargeNegativeFloat = TMP_Math.FLOAT_MIN;\n        protected static int k_LargePositiveInt = TMP_Math.INT_MAX;\n        protected static int k_LargeNegativeInt = TMP_Math.INT_MIN;\n\n        /// <summary>\n        /// Function used to evaluate the length of a text string.\n        /// </summary>\n        /// <param name=\"text\"></param>\n        /// <returns></returns>\n        public virtual TMP_TextInfo GetTextInfo(string text) { return null; }\n\n\n        /// <summary>\n        /// Function to force an update of the margin size.\n        /// </summary>\n        public virtual void ComputeMarginSize() { }\n\n\n        /// <summary>\n        /// Function used in conjunction with GetTextInfo to figure out Array allocations.\n        /// </summary>\n        /// <param name=\"chars\"></param>\n        /// <returns></returns>\n        //protected int GetArraySizes(int[] chars)\n        //{\n        //    //Debug.Log(\"Set Array Size called.\");\n\n        //    //int visibleCount = 0;\n        //    //int totalCount = 0;\n        //    int tagEnd = 0;\n\n        //    m_totalCharacterCount = 0;\n        //    m_isUsingBold = false;\n        //    m_isParsingText = false;\n\n\n        //    //m_VisibleCharacters.Clear();\n\n        //    for (int i = 0; chars[i] != 0; i++)\n        //    {\n        //        int c = chars[i];\n\n        //        if (m_isRichText && c == 60) // if Char '<'\n        //        {\n        //            // Check if Tag is Valid\n        //            if (ValidateHtmlTag(chars, i + 1, out tagEnd))\n        //            {\n        //                i = tagEnd;\n        //                //if ((m_style & FontStyles.Underline) == FontStyles.Underline) visibleCount += 3;\n\n        //                if ((m_style & FontStyles.Bold) == FontStyles.Bold) m_isUsingBold = true;\n\n        //                continue;\n        //            }\n        //        }\n\n        //        //if (!char.IsWhiteSpace((char)c) && c != 0x200B)\n        //        //{\n        //            //visibleCount += 1;\n        //        //}\n\n        //        //m_VisibleCharacters.Add((char)c);\n        //        m_totalCharacterCount += 1;\n        //    }\n\n        //    return m_totalCharacterCount;\n        //}\n\n\n        /// <summary>\n        /// Save the State of various variables used in the mesh creation loop in conjunction with Word Wrapping\n        /// </summary>\n        /// <param name=\"state\"></param>\n        /// <param name=\"index\"></param>\n        /// <param name=\"count\"></param>\n        protected void SaveWordWrappingState(ref WordWrapState state, int index, int count)\n        {\n            // Multi Font & Material support related\n            state.currentFontAsset = m_currentFontAsset;\n            state.currentSpriteAsset = m_currentSpriteAsset;\n            state.currentMaterial = m_currentMaterial;\n            state.currentMaterialIndex = m_currentMaterialIndex;\n\n            state.previous_WordBreak = index;\n            state.total_CharacterCount = count;\n            state.visible_CharacterCount = m_lineVisibleCharacterCount;\n            //state.visible_CharacterCount = m_visibleCharacterCount;\n            //state.visible_SpriteCount = m_visibleSpriteCount;\n            state.visible_LinkCount = m_textInfo.linkCount;\n\n            state.firstCharacterIndex = m_firstCharacterOfLine;\n            state.firstVisibleCharacterIndex = m_firstVisibleCharacterOfLine;\n            state.lastVisibleCharIndex = m_lastVisibleCharacterOfLine;\n\n            state.fontStyle = m_FontStyleInternal;\n            state.fontScale = m_fontScale;\n            //state.maxFontScale = m_maxFontScale;\n            state.fontScaleMultiplier = m_fontScaleMultiplier;\n            state.currentFontSize = m_currentFontSize;\n\n            state.xAdvance = m_xAdvance;\n            state.maxCapHeight = m_maxCapHeight;\n            state.maxAscender = m_maxAscender;\n            state.maxDescender = m_maxDescender;\n            state.maxLineAscender = m_maxLineAscender;\n            state.maxLineDescender = m_maxLineDescender;\n            state.previousLineAscender = m_startOfLineAscender;\n            state.preferredWidth = m_preferredWidth;\n            state.preferredHeight = m_preferredHeight;\n            state.meshExtents = m_meshExtents;\n\n            state.lineNumber = m_lineNumber;\n            state.lineOffset = m_lineOffset;\n            state.baselineOffset = m_baselineOffset;\n\n            //state.alignment = m_lineJustification;\n            state.vertexColor = m_htmlColor;\n            state.underlineColor = m_underlineColor;\n            state.strikethroughColor = m_strikethroughColor;\n            state.highlightColor = m_highlightColor;\n\n            state.isNonBreakingSpace = m_isNonBreakingSpace;\n            state.tagNoParsing = tag_NoParsing;\n\n            // XML Tag Stack\n            state.basicStyleStack = m_fontStyleStack;\n            state.colorStack = m_colorStack;\n            state.underlineColorStack = m_underlineColorStack;\n            state.strikethroughColorStack = m_strikethroughColorStack;\n            state.highlightColorStack = m_highlightColorStack;\n            state.colorGradientStack = m_colorGradientStack;\n            state.sizeStack = m_sizeStack;\n            state.indentStack = m_indentStack;\n            state.fontWeightStack = m_FontWeightStack;\n            state.styleStack = m_styleStack;\n            state.baselineStack = m_baselineOffsetStack;\n            state.actionStack = m_actionStack;\n            state.materialReferenceStack = m_materialReferenceStack;\n            state.lineJustificationStack = m_lineJustificationStack;\n            //state.spriteAnimationStack = m_spriteAnimationStack;\n\n            state.spriteAnimationID = m_spriteAnimationID;\n\n            if (m_lineNumber < m_textInfo.lineInfo.Length)\n                state.lineInfo = m_textInfo.lineInfo[m_lineNumber];\n        }\n\n\n        /// <summary>\n        /// Restore the State of various variables used in the mesh creation loop.\n        /// </summary>\n        /// <param name=\"state\"></param>\n        /// <returns></returns>\n        protected int RestoreWordWrappingState(ref WordWrapState state)\n        {\n            int index = state.previous_WordBreak;\n\n            // Multi Font & Material support related\n            m_currentFontAsset = state.currentFontAsset;\n            m_currentSpriteAsset = state.currentSpriteAsset;\n            m_currentMaterial = state.currentMaterial;\n            m_currentMaterialIndex = state.currentMaterialIndex;\n\n            m_characterCount = state.total_CharacterCount + 1;\n            m_lineVisibleCharacterCount = state.visible_CharacterCount;\n            //m_visibleCharacterCount = state.visible_CharacterCount;\n            //m_visibleSpriteCount = state.visible_SpriteCount;\n            m_textInfo.linkCount = state.visible_LinkCount;\n\n            m_firstCharacterOfLine = state.firstCharacterIndex;\n            m_firstVisibleCharacterOfLine = state.firstVisibleCharacterIndex;\n            m_lastVisibleCharacterOfLine = state.lastVisibleCharIndex;\n\n            m_FontStyleInternal = state.fontStyle;\n            m_fontScale = state.fontScale;\n            m_fontScaleMultiplier = state.fontScaleMultiplier;\n            //m_maxFontScale = state.maxFontScale;\n            m_currentFontSize = state.currentFontSize;\n\n            m_xAdvance = state.xAdvance;\n            m_maxCapHeight = state.maxCapHeight;\n            m_maxAscender = state.maxAscender;\n            m_maxDescender = state.maxDescender;\n            m_maxLineAscender = state.maxLineAscender;\n            m_maxLineDescender = state.maxLineDescender;\n            m_startOfLineAscender = state.previousLineAscender;\n            m_preferredWidth = state.preferredWidth;\n            m_preferredHeight = state.preferredHeight;\n            m_meshExtents = state.meshExtents;\n\n            m_lineNumber = state.lineNumber;\n            m_lineOffset = state.lineOffset;\n            m_baselineOffset = state.baselineOffset;\n\n            //m_lineJustification = state.alignment;\n            m_htmlColor = state.vertexColor;\n            m_underlineColor = state.underlineColor;\n            m_strikethroughColor = state.strikethroughColor;\n            m_highlightColor = state.highlightColor;\n\n            m_isNonBreakingSpace = state.isNonBreakingSpace;\n            tag_NoParsing = state.tagNoParsing;\n\n            // XML Tag Stack\n            m_fontStyleStack = state.basicStyleStack;\n            m_colorStack = state.colorStack;\n            m_underlineColorStack = state.underlineColorStack;\n            m_strikethroughColorStack = state.strikethroughColorStack;\n            m_highlightColorStack = state.highlightColorStack;\n            m_colorGradientStack = state.colorGradientStack;\n            m_sizeStack = state.sizeStack;\n            m_indentStack = state.indentStack;\n            m_FontWeightStack = state.fontWeightStack;\n            m_styleStack = state.styleStack;\n            m_baselineOffsetStack = state.baselineStack;\n            m_actionStack = state.actionStack;\n            m_materialReferenceStack = state.materialReferenceStack;\n            m_lineJustificationStack = state.lineJustificationStack;\n            //m_spriteAnimationStack = state.spriteAnimationStack;\n\n            m_spriteAnimationID = state.spriteAnimationID;\n\n            if (m_lineNumber < m_textInfo.lineInfo.Length)\n                m_textInfo.lineInfo[m_lineNumber] = state.lineInfo;\n\n            return index;\n        }\n\n\n        /// <summary>\n        /// Store vertex information for each character.\n        /// </summary>\n        /// <param name=\"style_padding\">Style_padding.</param>\n        /// <param name=\"vertexColor\">Vertex color.</param>\n        protected virtual void SaveGlyphVertexInfo(float padding, float style_padding, Color32 vertexColor)\n        {\n            // Save the Vertex Position for the Character\n            #region Setup Mesh Vertices\n            m_textInfo.characterInfo[m_characterCount].vertex_BL.position = m_textInfo.characterInfo[m_characterCount].bottomLeft;\n            m_textInfo.characterInfo[m_characterCount].vertex_TL.position = m_textInfo.characterInfo[m_characterCount].topLeft;\n            m_textInfo.characterInfo[m_characterCount].vertex_TR.position = m_textInfo.characterInfo[m_characterCount].topRight;\n            m_textInfo.characterInfo[m_characterCount].vertex_BR.position = m_textInfo.characterInfo[m_characterCount].bottomRight;\n            #endregion\n\n\n            #region Setup Vertex Colors\n            // Alpha is the lower of the vertex color or tag color alpha used.\n            vertexColor.a = m_fontColor32.a < vertexColor.a ? (byte)(m_fontColor32.a) : (byte)(vertexColor.a);\n\n            // Handle Vertex Colors & Vertex Color Gradient\n            if (!m_enableVertexGradient)\n            {\n                m_textInfo.characterInfo[m_characterCount].vertex_BL.color = vertexColor;\n                m_textInfo.characterInfo[m_characterCount].vertex_TL.color = vertexColor;\n                m_textInfo.characterInfo[m_characterCount].vertex_TR.color = vertexColor;\n                m_textInfo.characterInfo[m_characterCount].vertex_BR.color = vertexColor;\n            }\n            else\n            {\n                if (!m_overrideHtmlColors && m_colorStack.m_Index > 1)\n                {\n                    m_textInfo.characterInfo[m_characterCount].vertex_BL.color = vertexColor;\n                    m_textInfo.characterInfo[m_characterCount].vertex_TL.color = vertexColor;\n                    m_textInfo.characterInfo[m_characterCount].vertex_TR.color = vertexColor;\n                    m_textInfo.characterInfo[m_characterCount].vertex_BR.color = vertexColor;\n                }\n                else // Handle Vertex Color Gradient\n                {\n                    // Use Vertex Color Gradient Preset (if one is assigned)\n                    if (m_fontColorGradientPreset != null)\n                    {\n                        m_textInfo.characterInfo[m_characterCount].vertex_BL.color = m_fontColorGradientPreset.bottomLeft * vertexColor;\n                        m_textInfo.characterInfo[m_characterCount].vertex_TL.color = m_fontColorGradientPreset.topLeft * vertexColor;\n                        m_textInfo.characterInfo[m_characterCount].vertex_TR.color = m_fontColorGradientPreset.topRight * vertexColor;\n                        m_textInfo.characterInfo[m_characterCount].vertex_BR.color = m_fontColorGradientPreset.bottomRight * vertexColor;\n                    }\n                    else\n                    {\n                        m_textInfo.characterInfo[m_characterCount].vertex_BL.color = m_fontColorGradient.bottomLeft * vertexColor;\n                        m_textInfo.characterInfo[m_characterCount].vertex_TL.color = m_fontColorGradient.topLeft * vertexColor;\n                        m_textInfo.characterInfo[m_characterCount].vertex_TR.color = m_fontColorGradient.topRight * vertexColor;\n                        m_textInfo.characterInfo[m_characterCount].vertex_BR.color = m_fontColorGradient.bottomRight * vertexColor;\n                    }\n                }\n            }\n\n            if (m_colorGradientPreset != null)\n            {\n                m_textInfo.characterInfo[m_characterCount].vertex_BL.color *= m_colorGradientPreset.bottomLeft;\n                m_textInfo.characterInfo[m_characterCount].vertex_TL.color *= m_colorGradientPreset.topLeft;\n                m_textInfo.characterInfo[m_characterCount].vertex_TR.color *= m_colorGradientPreset.topRight;\n                m_textInfo.characterInfo[m_characterCount].vertex_BR.color *= m_colorGradientPreset.bottomRight;\n            }\n            #endregion\n\n            // Apply style_padding only if this is a SDF Shader.\n            if (!m_isSDFShader)\n                style_padding = 0f;\n\n\n            // Setup UVs for the Character\n            #region Setup UVs\n\n            Vector2 uv0;\n            uv0.x = (m_cached_TextElement.glyph.glyphRect.x - padding - style_padding) / m_currentFontAsset.atlasWidth;\n            uv0.y = (m_cached_TextElement.glyph.glyphRect.y - padding - style_padding) / m_currentFontAsset.atlasHeight;\n\n            Vector2 uv1;\n            uv1.x = uv0.x;\n            uv1.y = (m_cached_TextElement.glyph.glyphRect.y + padding + style_padding + m_cached_TextElement.glyph.glyphRect.height) / m_currentFontAsset.atlasHeight;\n\n            Vector2 uv2;\n            uv2.x = (m_cached_TextElement.glyph.glyphRect.x + padding + style_padding + m_cached_TextElement.glyph.glyphRect.width) / m_currentFontAsset.atlasWidth;\n            uv2.y = uv1.y;\n\n            Vector2 uv3;\n            uv3.x = uv2.x;\n            uv3.y = uv0.y;\n\n            // Store UV Information\n            m_textInfo.characterInfo[m_characterCount].vertex_BL.uv = uv0;\n            m_textInfo.characterInfo[m_characterCount].vertex_TL.uv = uv1;\n            m_textInfo.characterInfo[m_characterCount].vertex_TR.uv = uv2;\n            m_textInfo.characterInfo[m_characterCount].vertex_BR.uv = uv3;\n            #endregion Setup UVs\n\n\n            // Normal\n            #region Setup Normals & Tangents\n            //Vector3 normal = new Vector3(0, 0, -1);\n            //m_textInfo.characterInfo[m_characterCount].vertex_BL.normal = normal;\n            //m_textInfo.characterInfo[m_characterCount].vertex_TL.normal = normal;\n            //m_textInfo.characterInfo[m_characterCount].vertex_TR.normal = normal;\n            //m_textInfo.characterInfo[m_characterCount].vertex_BR.normal = normal;\n\n            // Tangents\n            //Vector4 tangent = new Vector4(-1, 0, 0, 1);\n            //m_textInfo.characterInfo[m_characterCount].vertex_BL.tangent = tangent;\n            //m_textInfo.characterInfo[m_characterCount].vertex_TL.tangent = tangent;\n            //m_textInfo.characterInfo[m_characterCount].vertex_TR.tangent = tangent;\n            //m_textInfo.characterInfo[m_characterCount].vertex_BR.tangent = tangent;\n            #endregion end Normals & Tangents\n        }\n\n\n        /// <summary>\n        /// Store vertex information for each sprite.\n        /// </summary>\n        /// <param name=\"padding\"></param>\n        /// <param name=\"style_padding\"></param>\n        /// <param name=\"vertexColor\"></param>\n        protected virtual void SaveSpriteVertexInfo(Color32 vertexColor)\n        {\n            // Save the Vertex Position for the Character\n            #region Setup Mesh Vertices\n            m_textInfo.characterInfo[m_characterCount].vertex_BL.position = m_textInfo.characterInfo[m_characterCount].bottomLeft;\n            m_textInfo.characterInfo[m_characterCount].vertex_TL.position = m_textInfo.characterInfo[m_characterCount].topLeft;\n            m_textInfo.characterInfo[m_characterCount].vertex_TR.position = m_textInfo.characterInfo[m_characterCount].topRight;\n            m_textInfo.characterInfo[m_characterCount].vertex_BR.position = m_textInfo.characterInfo[m_characterCount].bottomRight;\n            #endregion\n\n            // Vertex Color Alpha\n            if (m_tintAllSprites) m_tintSprite = true;\n            Color32 spriteColor = m_tintSprite ? m_spriteColor.Multiply(vertexColor) : m_spriteColor;\n            spriteColor.a = spriteColor.a < m_fontColor32.a ? spriteColor.a = spriteColor.a < vertexColor.a ? spriteColor.a : vertexColor.a : m_fontColor32.a;\n\n            Color32 c0 = spriteColor;\n            Color32 c1 = spriteColor;\n            Color32 c2 = spriteColor;\n            Color32 c3 = spriteColor;\n\n            if (m_enableVertexGradient)\n            {\n                if (m_fontColorGradientPreset != null)\n                {\n                    c0 = m_tintSprite ? c0.Multiply(m_fontColorGradientPreset.bottomLeft) : c0;\n                    c1 = m_tintSprite ? c1.Multiply(m_fontColorGradientPreset.topLeft) : c1;\n                    c2 = m_tintSprite ? c2.Multiply(m_fontColorGradientPreset.topRight) : c2;\n                    c3 = m_tintSprite ? c3.Multiply(m_fontColorGradientPreset.bottomRight) : c3;\n                }\n                else\n                {\n                    c0 = m_tintSprite ? c0.Multiply(m_fontColorGradient.bottomLeft) : c0;\n                    c1 = m_tintSprite ? c1.Multiply(m_fontColorGradient.topLeft) : c1;\n                    c2 = m_tintSprite ? c2.Multiply(m_fontColorGradient.topRight) : c2;\n                    c3 = m_tintSprite ? c3.Multiply(m_fontColorGradient.bottomRight) : c3;\n                }\n            }\n\n            if (m_colorGradientPreset != null)\n            {\n                c0 = m_tintSprite ? c0.Multiply(m_colorGradientPreset.bottomLeft) : c0;\n                c1 = m_tintSprite ? c1.Multiply(m_colorGradientPreset.topLeft) : c1;\n                c2 = m_tintSprite ? c2.Multiply(m_colorGradientPreset.topRight) : c2;\n                c3 = m_tintSprite ? c3.Multiply(m_colorGradientPreset.bottomRight) : c3;\n            }\n\n            m_textInfo.characterInfo[m_characterCount].vertex_BL.color = c0;\n            m_textInfo.characterInfo[m_characterCount].vertex_TL.color = c1;\n            m_textInfo.characterInfo[m_characterCount].vertex_TR.color = c2;\n            m_textInfo.characterInfo[m_characterCount].vertex_BR.color = c3;\n\n\n            // Setup UVs for the Character\n            #region Setup UVs\n            Vector2 uv0 = new Vector2((float)m_cached_TextElement.glyph.glyphRect.x / m_currentSpriteAsset.spriteSheet.width, (float)m_cached_TextElement.glyph.glyphRect.y / m_currentSpriteAsset.spriteSheet.height);  // bottom left\n            Vector2 uv1 = new Vector2(uv0.x, (float)(m_cached_TextElement.glyph.glyphRect.y + m_cached_TextElement.glyph.glyphRect.height) / m_currentSpriteAsset.spriteSheet.height);  // top left\n            Vector2 uv2 = new Vector2((float)(m_cached_TextElement.glyph.glyphRect.x + m_cached_TextElement.glyph.glyphRect.width) / m_currentSpriteAsset.spriteSheet.width, uv1.y); // top right\n            Vector2 uv3 = new Vector2(uv2.x, uv0.y); // bottom right\n\n            // Store UV Information\n            m_textInfo.characterInfo[m_characterCount].vertex_BL.uv = uv0;\n            m_textInfo.characterInfo[m_characterCount].vertex_TL.uv = uv1;\n            m_textInfo.characterInfo[m_characterCount].vertex_TR.uv = uv2;\n            m_textInfo.characterInfo[m_characterCount].vertex_BR.uv = uv3;\n            #endregion Setup UVs\n\n\n            // Normal\n            #region Setup Normals & Tangents\n            //Vector3 normal = new Vector3(0, 0, -1);\n            //m_textInfo.characterInfo[m_characterCount].vertex_BL.normal = normal;\n            //m_textInfo.characterInfo[m_characterCount].vertex_TL.normal = normal;\n            //m_textInfo.characterInfo[m_characterCount].vertex_TR.normal = normal;\n            //m_textInfo.characterInfo[m_characterCount].vertex_BR.normal = normal;\n\n            // Tangents\n            //Vector4 tangent = new Vector4(-1, 0, 0, 1);\n            //m_textInfo.characterInfo[m_characterCount].vertex_BL.tangent = tangent;\n            //m_textInfo.characterInfo[m_characterCount].vertex_TL.tangent = tangent;\n            //m_textInfo.characterInfo[m_characterCount].vertex_TR.tangent = tangent;\n            //m_textInfo.characterInfo[m_characterCount].vertex_BR.tangent = tangent;\n            #endregion end Normals & Tangents\n\n        }\n\n\n        /// <summary>\n        /// Store vertex attributes into the appropriate TMP_MeshInfo.\n        /// </summary>\n        /// <param name=\"i\"></param>\n        /// <param name=\"index_X4\"></param>\n        protected virtual void FillCharacterVertexBuffers(int i, int index_X4)\n        {\n            int materialIndex = m_textInfo.characterInfo[i].materialReferenceIndex;\n            index_X4 = m_textInfo.meshInfo[materialIndex].vertexCount;\n\n            // Make sure buffers allocation are sufficient to hold the vertex data\n            //if (m_textInfo.meshInfo[materialIndex].vertices.Length < index_X4 + 4)\n            //    m_textInfo.meshInfo[materialIndex].ResizeMeshInfo(Mathf.NextPowerOfTwo(index_X4 + 4));\n\n\n            TMP_CharacterInfo[] characterInfoArray = m_textInfo.characterInfo;\n            m_textInfo.characterInfo[i].vertexIndex = index_X4;\n\n            // Setup Vertices for Characters\n            m_textInfo.meshInfo[materialIndex].vertices[0 + index_X4] = characterInfoArray[i].vertex_BL.position;\n            m_textInfo.meshInfo[materialIndex].vertices[1 + index_X4] = characterInfoArray[i].vertex_TL.position;\n            m_textInfo.meshInfo[materialIndex].vertices[2 + index_X4] = characterInfoArray[i].vertex_TR.position;\n            m_textInfo.meshInfo[materialIndex].vertices[3 + index_X4] = characterInfoArray[i].vertex_BR.position;\n\n\n            // Setup UVS0\n            m_textInfo.meshInfo[materialIndex].uvs0[0 + index_X4] = characterInfoArray[i].vertex_BL.uv;\n            m_textInfo.meshInfo[materialIndex].uvs0[1 + index_X4] = characterInfoArray[i].vertex_TL.uv;\n            m_textInfo.meshInfo[materialIndex].uvs0[2 + index_X4] = characterInfoArray[i].vertex_TR.uv;\n            m_textInfo.meshInfo[materialIndex].uvs0[3 + index_X4] = characterInfoArray[i].vertex_BR.uv;\n\n\n            // Setup UVS2\n            m_textInfo.meshInfo[materialIndex].uvs2[0 + index_X4] = characterInfoArray[i].vertex_BL.uv2;\n            m_textInfo.meshInfo[materialIndex].uvs2[1 + index_X4] = characterInfoArray[i].vertex_TL.uv2;\n            m_textInfo.meshInfo[materialIndex].uvs2[2 + index_X4] = characterInfoArray[i].vertex_TR.uv2;\n            m_textInfo.meshInfo[materialIndex].uvs2[3 + index_X4] = characterInfoArray[i].vertex_BR.uv2;\n\n\n            // Setup UVS4\n            //m_textInfo.meshInfo[0].uvs4[0 + index_X4] = characterInfoArray[i].vertex_BL.uv4;\n            //m_textInfo.meshInfo[0].uvs4[1 + index_X4] = characterInfoArray[i].vertex_TL.uv4;\n            //m_textInfo.meshInfo[0].uvs4[2 + index_X4] = characterInfoArray[i].vertex_TR.uv4;\n            //m_textInfo.meshInfo[0].uvs4[3 + index_X4] = characterInfoArray[i].vertex_BR.uv4;\n\n\n            // setup Vertex Colors\n            m_textInfo.meshInfo[materialIndex].colors32[0 + index_X4] = characterInfoArray[i].vertex_BL.color;\n            m_textInfo.meshInfo[materialIndex].colors32[1 + index_X4] = characterInfoArray[i].vertex_TL.color;\n            m_textInfo.meshInfo[materialIndex].colors32[2 + index_X4] = characterInfoArray[i].vertex_TR.color;\n            m_textInfo.meshInfo[materialIndex].colors32[3 + index_X4] = characterInfoArray[i].vertex_BR.color;\n\n            m_textInfo.meshInfo[materialIndex].vertexCount = index_X4 + 4;\n        }\n\n\n        protected virtual void FillCharacterVertexBuffers(int i, int index_X4, bool isVolumetric)\n        {\n            int materialIndex = m_textInfo.characterInfo[i].materialReferenceIndex;\n            index_X4 = m_textInfo.meshInfo[materialIndex].vertexCount;\n\n            TMP_CharacterInfo[] characterInfoArray = m_textInfo.characterInfo;\n            m_textInfo.characterInfo[i].vertexIndex = index_X4;\n\n            // Setup Vertices for Characters\n            m_textInfo.meshInfo[materialIndex].vertices[0 + index_X4] = characterInfoArray[i].vertex_BL.position;\n            m_textInfo.meshInfo[materialIndex].vertices[1 + index_X4] = characterInfoArray[i].vertex_TL.position;\n            m_textInfo.meshInfo[materialIndex].vertices[2 + index_X4] = characterInfoArray[i].vertex_TR.position;\n            m_textInfo.meshInfo[materialIndex].vertices[3 + index_X4] = characterInfoArray[i].vertex_BR.position;\n\n            if (isVolumetric)\n            {\n                Vector3 depth = new Vector3(0, 0, m_fontSize * m_fontScale);\n                m_textInfo.meshInfo[materialIndex].vertices[4 + index_X4] = characterInfoArray[i].vertex_BL.position + depth;\n                m_textInfo.meshInfo[materialIndex].vertices[5 + index_X4] = characterInfoArray[i].vertex_TL.position + depth;\n                m_textInfo.meshInfo[materialIndex].vertices[6 + index_X4] = characterInfoArray[i].vertex_TR.position + depth;\n                m_textInfo.meshInfo[materialIndex].vertices[7 + index_X4] = characterInfoArray[i].vertex_BR.position + depth;\n            }\n\n            // Setup UVS0\n            m_textInfo.meshInfo[materialIndex].uvs0[0 + index_X4] = characterInfoArray[i].vertex_BL.uv;\n            m_textInfo.meshInfo[materialIndex].uvs0[1 + index_X4] = characterInfoArray[i].vertex_TL.uv;\n            m_textInfo.meshInfo[materialIndex].uvs0[2 + index_X4] = characterInfoArray[i].vertex_TR.uv;\n            m_textInfo.meshInfo[materialIndex].uvs0[3 + index_X4] = characterInfoArray[i].vertex_BR.uv;\n\n            if (isVolumetric)\n            {\n                m_textInfo.meshInfo[materialIndex].uvs0[4 + index_X4] = characterInfoArray[i].vertex_BL.uv;\n                m_textInfo.meshInfo[materialIndex].uvs0[5 + index_X4] = characterInfoArray[i].vertex_TL.uv;\n                m_textInfo.meshInfo[materialIndex].uvs0[6 + index_X4] = characterInfoArray[i].vertex_TR.uv;\n                m_textInfo.meshInfo[materialIndex].uvs0[7 + index_X4] = characterInfoArray[i].vertex_BR.uv;\n            }\n\n\n            // Setup UVS2\n            m_textInfo.meshInfo[materialIndex].uvs2[0 + index_X4] = characterInfoArray[i].vertex_BL.uv2;\n            m_textInfo.meshInfo[materialIndex].uvs2[1 + index_X4] = characterInfoArray[i].vertex_TL.uv2;\n            m_textInfo.meshInfo[materialIndex].uvs2[2 + index_X4] = characterInfoArray[i].vertex_TR.uv2;\n            m_textInfo.meshInfo[materialIndex].uvs2[3 + index_X4] = characterInfoArray[i].vertex_BR.uv2;\n\n            if (isVolumetric)\n            {\n                m_textInfo.meshInfo[materialIndex].uvs2[4 + index_X4] = characterInfoArray[i].vertex_BL.uv2;\n                m_textInfo.meshInfo[materialIndex].uvs2[5 + index_X4] = characterInfoArray[i].vertex_TL.uv2;\n                m_textInfo.meshInfo[materialIndex].uvs2[6 + index_X4] = characterInfoArray[i].vertex_TR.uv2;\n                m_textInfo.meshInfo[materialIndex].uvs2[7 + index_X4] = characterInfoArray[i].vertex_BR.uv2;\n            }\n\n\n            // Setup UVS4\n            //m_textInfo.meshInfo[0].uvs4[0 + index_X4] = characterInfoArray[i].vertex_BL.uv4;\n            //m_textInfo.meshInfo[0].uvs4[1 + index_X4] = characterInfoArray[i].vertex_TL.uv4;\n            //m_textInfo.meshInfo[0].uvs4[2 + index_X4] = characterInfoArray[i].vertex_TR.uv4;\n            //m_textInfo.meshInfo[0].uvs4[3 + index_X4] = characterInfoArray[i].vertex_BR.uv4;\n\n\n            // setup Vertex Colors\n            m_textInfo.meshInfo[materialIndex].colors32[0 + index_X4] = characterInfoArray[i].vertex_BL.color;\n            m_textInfo.meshInfo[materialIndex].colors32[1 + index_X4] = characterInfoArray[i].vertex_TL.color;\n            m_textInfo.meshInfo[materialIndex].colors32[2 + index_X4] = characterInfoArray[i].vertex_TR.color;\n            m_textInfo.meshInfo[materialIndex].colors32[3 + index_X4] = characterInfoArray[i].vertex_BR.color;\n\n            if (isVolumetric)\n            {\n                Color32 backColor = new Color32(255, 255, 128, 255);\n                m_textInfo.meshInfo[materialIndex].colors32[4 + index_X4] = backColor; //characterInfoArray[i].vertex_BL.color;\n                m_textInfo.meshInfo[materialIndex].colors32[5 + index_X4] = backColor; //characterInfoArray[i].vertex_TL.color;\n                m_textInfo.meshInfo[materialIndex].colors32[6 + index_X4] = backColor; //characterInfoArray[i].vertex_TR.color;\n                m_textInfo.meshInfo[materialIndex].colors32[7 + index_X4] = backColor; //characterInfoArray[i].vertex_BR.color;\n            }\n\n            m_textInfo.meshInfo[materialIndex].vertexCount = index_X4 + (!isVolumetric ? 4 : 8);\n        }\n\n\n        /// <summary>\n        /// Fill Vertex Buffers for Sprites\n        /// </summary>\n        /// <param name=\"i\"></param>\n        /// <param name=\"spriteIndex_X4\"></param>\n        protected virtual void FillSpriteVertexBuffers(int i, int index_X4)\n        {\n            int materialIndex = m_textInfo.characterInfo[i].materialReferenceIndex;\n            index_X4 = m_textInfo.meshInfo[materialIndex].vertexCount;\n\n            TMP_CharacterInfo[] characterInfoArray = m_textInfo.characterInfo;\n            m_textInfo.characterInfo[i].vertexIndex = index_X4;\n\n            // Setup Vertices for Characters\n            m_textInfo.meshInfo[materialIndex].vertices[0 + index_X4] = characterInfoArray[i].vertex_BL.position;\n            m_textInfo.meshInfo[materialIndex].vertices[1 + index_X4] = characterInfoArray[i].vertex_TL.position;\n            m_textInfo.meshInfo[materialIndex].vertices[2 + index_X4] = characterInfoArray[i].vertex_TR.position;\n            m_textInfo.meshInfo[materialIndex].vertices[3 + index_X4] = characterInfoArray[i].vertex_BR.position;\n\n\n            // Setup UVS0\n            m_textInfo.meshInfo[materialIndex].uvs0[0 + index_X4] = characterInfoArray[i].vertex_BL.uv;\n            m_textInfo.meshInfo[materialIndex].uvs0[1 + index_X4] = characterInfoArray[i].vertex_TL.uv;\n            m_textInfo.meshInfo[materialIndex].uvs0[2 + index_X4] = characterInfoArray[i].vertex_TR.uv;\n            m_textInfo.meshInfo[materialIndex].uvs0[3 + index_X4] = characterInfoArray[i].vertex_BR.uv;\n\n\n            // Setup UVS2\n            m_textInfo.meshInfo[materialIndex].uvs2[0 + index_X4] = characterInfoArray[i].vertex_BL.uv2;\n            m_textInfo.meshInfo[materialIndex].uvs2[1 + index_X4] = characterInfoArray[i].vertex_TL.uv2;\n            m_textInfo.meshInfo[materialIndex].uvs2[2 + index_X4] = characterInfoArray[i].vertex_TR.uv2;\n            m_textInfo.meshInfo[materialIndex].uvs2[3 + index_X4] = characterInfoArray[i].vertex_BR.uv2;\n\n\n            // Setup UVS4\n            //m_textInfo.meshInfo[0].uvs4[0 + index_X4] = characterInfoArray[i].vertex_BL.uv4;\n            //m_textInfo.meshInfo[0].uvs4[1 + index_X4] = characterInfoArray[i].vertex_TL.uv4;\n            //m_textInfo.meshInfo[0].uvs4[2 + index_X4] = characterInfoArray[i].vertex_TR.uv4;\n            //m_textInfo.meshInfo[0].uvs4[3 + index_X4] = characterInfoArray[i].vertex_BR.uv4;\n\n\n            // setup Vertex Colors\n            m_textInfo.meshInfo[materialIndex].colors32[0 + index_X4] = characterInfoArray[i].vertex_BL.color;\n            m_textInfo.meshInfo[materialIndex].colors32[1 + index_X4] = characterInfoArray[i].vertex_TL.color;\n            m_textInfo.meshInfo[materialIndex].colors32[2 + index_X4] = characterInfoArray[i].vertex_TR.color;\n            m_textInfo.meshInfo[materialIndex].colors32[3 + index_X4] = characterInfoArray[i].vertex_BR.color;\n\n            m_textInfo.meshInfo[materialIndex].vertexCount = index_X4 + 4;\n        }\n\n\n        /// <summary>\n        /// Method to add the underline geometry.\n        /// </summary>\n        /// <param name=\"start\"></param>\n        /// <param name=\"end\"></param>\n        /// <param name=\"startScale\"></param>\n        /// <param name=\"endScale\"></param>\n        /// <param name=\"maxScale\"></param>\n        /// <param name=\"underlineColor\"></param>\n        protected virtual void DrawUnderlineMesh(Vector3 start, Vector3 end, ref int index, float startScale, float endScale, float maxScale, float sdfScale, Color32 underlineColor)\n        {\n            if (m_cached_Underline_Character == null)\n            {\n                if (!TMP_Settings.warningsDisabled)\n                    Debug.LogWarning(\"Unable to add underline since the Font Asset doesn't contain the underline character.\", this);\n\n                return;\n            }\n\n            int verticesCount = index + 12;\n            // Check to make sure our current mesh buffer allocations can hold these new Quads.\n            if (verticesCount > m_textInfo.meshInfo[0].vertices.Length)\n            {\n                // Resize Mesh Buffers\n                m_textInfo.meshInfo[0].ResizeMeshInfo(verticesCount / 4);\n            }\n\n            // Adjust the position of the underline based on the lowest character. This matters for subscript character.\n            start.y = Mathf.Min(start.y, end.y);\n            end.y = Mathf.Min(start.y, end.y);\n\n            float segmentWidth = m_cached_Underline_Character.glyph.metrics.width / 2 * maxScale;\n\n            if (end.x - start.x < m_cached_Underline_Character.glyph.metrics.width * maxScale)\n            {\n                segmentWidth = (end.x - start.x) / 2f;\n            }\n\n            float startPadding = m_padding * startScale / maxScale;\n            float endPadding = m_padding * endScale / maxScale;\n\n            float underlineThickness = m_fontAsset.faceInfo.underlineThickness;\n\n            // UNDERLINE VERTICES FOR (3) LINE SEGMENTS\n            #region UNDERLINE VERTICES\n            Vector3[] vertices = m_textInfo.meshInfo[0].vertices;\n\n            // Front Part of the Underline\n            vertices[index + 0] = start + new Vector3(0, 0 - (underlineThickness + m_padding) * maxScale, 0); // BL\n            vertices[index + 1] = start + new Vector3(0, m_padding * maxScale, 0); // TL\n            vertices[index + 2] = vertices[index + 1] + new Vector3(segmentWidth, 0, 0); // TR\n            vertices[index + 3] = vertices[index + 0] + new Vector3(segmentWidth, 0, 0); // BR\n\n            // Middle Part of the Underline\n            vertices[index + 4] = vertices[index + 3]; // BL\n            vertices[index + 5] = vertices[index + 2]; // TL\n            vertices[index + 6] = end + new Vector3(-segmentWidth, m_padding * maxScale, 0);  // TR\n            vertices[index + 7] = end + new Vector3(-segmentWidth, -(underlineThickness + m_padding) * maxScale, 0); // BR\n\n            // End Part of the Underline\n            vertices[index + 8] = vertices[index + 7]; // BL\n            vertices[index + 9] = vertices[index + 6]; // TL\n            vertices[index + 10] = end + new Vector3(0, m_padding * maxScale, 0); // TR\n            vertices[index + 11] = end + new Vector3(0, -(underlineThickness + m_padding) * maxScale, 0); // BR\n            #endregion\n\n            // UNDERLINE UV0\n            #region HANDLE UV0\n            Vector2[] uvs0 = m_textInfo.meshInfo[0].uvs0;\n\n            // Calculate UV required to setup the 3 Quads for the Underline.\n            Vector2 uv0 = new Vector2((m_cached_Underline_Character.glyph.glyphRect.x - startPadding) / m_fontAsset.atlasWidth, (m_cached_Underline_Character.glyph.glyphRect.y - m_padding) / m_fontAsset.atlasHeight);  // bottom left\n            Vector2 uv1 = new Vector2(uv0.x, (m_cached_Underline_Character.glyph.glyphRect.y + m_cached_Underline_Character.glyph.glyphRect.height + m_padding) / m_fontAsset.atlasHeight);  // top left\n            Vector2 uv2 = new Vector2((m_cached_Underline_Character.glyph.glyphRect.x - startPadding + (float)m_cached_Underline_Character.glyph.glyphRect.width / 2) / m_fontAsset.atlasWidth, uv1.y); // Mid Top Left\n            Vector2 uv3 = new Vector2(uv2.x, uv0.y); // Mid Bottom Left\n            Vector2 uv4 = new Vector2((m_cached_Underline_Character.glyph.glyphRect.x + endPadding + (float)m_cached_Underline_Character.glyph.glyphRect.width / 2) / m_fontAsset.atlasWidth, uv1.y); // Mid Top Right\n            Vector2 uv5 = new Vector2(uv4.x, uv0.y); // Mid Bottom right\n            Vector2 uv6 = new Vector2((m_cached_Underline_Character.glyph.glyphRect.x + endPadding + m_cached_Underline_Character.glyph.glyphRect.width) / m_fontAsset.atlasWidth, uv1.y); // End Part - Bottom Right\n            Vector2 uv7 = new Vector2(uv6.x, uv0.y); // End Part - Top Right\n\n            // Left Part of the Underline\n            uvs0[0 + index] = uv0; // BL\n            uvs0[1 + index] = uv1; // TL\n            uvs0[2 + index] = uv2; // TR\n            uvs0[3 + index] = uv3; // BR\n\n            // Middle Part of the Underline\n            uvs0[4 + index] = new Vector2(uv2.x - uv2.x * 0.001f, uv0.y);\n            uvs0[5 + index] = new Vector2(uv2.x - uv2.x * 0.001f, uv1.y);\n            uvs0[6 + index] = new Vector2(uv2.x + uv2.x * 0.001f, uv1.y);\n            uvs0[7 + index] = new Vector2(uv2.x + uv2.x * 0.001f, uv0.y);\n\n            // Right Part of the Underline\n            uvs0[8 + index] = uv5;\n            uvs0[9 + index] = uv4;\n            uvs0[10 + index] = uv6;\n            uvs0[11 + index] = uv7;\n            #endregion\n\n            // UNDERLINE UV2\n            #region HANDLE UV2 - SDF SCALE\n            // UV1 contains Face / Border UV layout.\n            float min_UvX = 0;\n            float max_UvX = (vertices[index + 2].x - start.x) / (end.x - start.x);\n\n            //Calculate the xScale or how much the UV's are getting stretched on the X axis for the middle section of the underline.\n            float xScale = Mathf.Abs(sdfScale);\n\n            Vector2[] uvs2 = m_textInfo.meshInfo[0].uvs2;\n\n            uvs2[0 + index] = PackUV(0, 0, xScale);\n            uvs2[1 + index] = PackUV(0, 1, xScale);\n            uvs2[2 + index] = PackUV(max_UvX, 1, xScale);\n            uvs2[3 + index] = PackUV(max_UvX, 0, xScale);\n\n            min_UvX = (vertices[index + 4].x - start.x) / (end.x - start.x);\n            max_UvX = (vertices[index + 6].x - start.x) / (end.x - start.x);\n\n            uvs2[4 + index] = PackUV(min_UvX, 0, xScale);\n            uvs2[5 + index] = PackUV(min_UvX, 1, xScale);\n            uvs2[6 + index] = PackUV(max_UvX, 1, xScale);\n            uvs2[7 + index] = PackUV(max_UvX, 0, xScale);\n\n            min_UvX = (vertices[index + 8].x - start.x) / (end.x - start.x);\n            max_UvX = (vertices[index + 6].x - start.x) / (end.x - start.x);\n\n            uvs2[8 + index] = PackUV(min_UvX, 0, xScale);\n            uvs2[9 + index] = PackUV(min_UvX, 1, xScale);\n            uvs2[10 + index] = PackUV(1, 1, xScale);\n            uvs2[11 + index] = PackUV(1, 0, xScale);\n            #endregion\n\n            // UNDERLINE VERTEX COLORS\n            #region\n            // Alpha is the lower of the vertex color or tag color alpha used.\n            underlineColor.a = m_fontColor32.a < underlineColor.a ? (byte)(m_fontColor32.a) : (byte)(underlineColor.a);\n\n            Color32[] colors32 = m_textInfo.meshInfo[0].colors32;\n            colors32[0 + index] = underlineColor;\n            colors32[1 + index] = underlineColor;\n            colors32[2 + index] = underlineColor;\n            colors32[3 + index] = underlineColor;\n\n            colors32[4 + index] = underlineColor;\n            colors32[5 + index] = underlineColor;\n            colors32[6 + index] = underlineColor;\n            colors32[7 + index] = underlineColor;\n\n            colors32[8 + index] = underlineColor;\n            colors32[9 + index] = underlineColor;\n            colors32[10 + index] = underlineColor;\n            colors32[11 + index] = underlineColor;\n            #endregion\n\n            index += 12;\n        }\n\n\n        protected virtual void DrawTextHighlight(Vector3 start, Vector3 end, ref int index, Color32 highlightColor)\n        {\n            if (m_cached_Underline_Character == null)\n            {\n                if (!TMP_Settings.warningsDisabled) Debug.LogWarning(\"Unable to add underline since the Font Asset doesn't contain the underline character.\", this);\n                return;\n            }\n\n            int verticesCount = index + 4;\n            // Check to make sure our current mesh buffer allocations can hold these new Quads.\n            if (verticesCount > m_textInfo.meshInfo[0].vertices.Length)\n            {\n                // Resize Mesh Buffers\n                m_textInfo.meshInfo[0].ResizeMeshInfo(verticesCount / 4);\n            }\n\n            // UNDERLINE VERTICES FOR (3) LINE SEGMENTS\n            #region HIGHLIGHT VERTICES\n            Vector3[] vertices = m_textInfo.meshInfo[0].vertices;\n\n            // Front Part of the Underline\n            vertices[index + 0] = start; // BL\n            vertices[index + 1] = new Vector3(start.x, end.y, 0); // TL\n            vertices[index + 2] = end; // TR\n            vertices[index + 3] = new Vector3(end.x, start.y, 0); // BR\n            #endregion\n\n            // UNDERLINE UV0\n            #region HANDLE UV0\n            Vector2[] uvs0 = m_textInfo.meshInfo[0].uvs0;\n\n            // Calculate UV required to setup the 3 Quads for the Underline.\n            Vector2 uv0 = new Vector2(((float)m_cached_Underline_Character.glyph.glyphRect.x + m_cached_Underline_Character.glyph.glyphRect.width / 2) / m_fontAsset.atlasWidth, (m_cached_Underline_Character.glyph.glyphRect.y + (float)m_cached_Underline_Character.glyph.glyphRect.height / 2) / m_fontAsset.atlasHeight);  // bottom left\n            //Vector2 uv1 = new Vector2(uv0.x, uv0.y);  // top left\n            //Vector2 uv2 = new Vector2(uv0.x, uv0.y); // Top Right\n            //Vector2 uv3 = new Vector2(uv2.x, uv0.y); // Bottom Right\n\n            // Left Part of the Underline\n            uvs0[0 + index] = uv0; // BL\n            uvs0[1 + index] = uv0; // TL\n            uvs0[2 + index] = uv0; // TR\n            uvs0[3 + index] = uv0; // BR\n            #endregion\n\n            // UNDERLINE UV2\n            #region HANDLE UV2 - SDF SCALE\n            // UV1 contains Face / Border UV layout.\n            //float min_UvX = 0;\n            //float max_UvX = (vertices[index + 2].x - start.x) / (end.x - start.x);\n\n            ////Calculate the xScale or how much the UV's are getting stretched on the X axis for the middle section of the underline.\n            //float xScale = 0; // Mathf.Abs(sdfScale);\n\n            Vector2[] uvs2 = m_textInfo.meshInfo[0].uvs2;\n            Vector2 customUV = new Vector2(0, 1);\n            uvs2[0 + index] = customUV; // PackUV(-0.2f, -0.2f, xScale);\n            uvs2[1 + index] = customUV; // PackUV(-0.2f, -0.1f, xScale);\n            uvs2[2 + index] = customUV; // PackUV(-0.1f, -0.1f, xScale);\n            uvs2[3 + index] = customUV; // PackUV(-0.1f, -0.2f, xScale);\n            #endregion\n\n            // HIGHLIGHT VERTEX COLORS\n            #region\n            // Alpha is the lower of the vertex color or tag color alpha used.\n            highlightColor.a = m_fontColor32.a < highlightColor.a ? m_fontColor32.a : highlightColor.a;\n\n            Color32[] colors32 = m_textInfo.meshInfo[0].colors32;\n            colors32[0 + index] = highlightColor;\n            colors32[1 + index] = highlightColor;\n            colors32[2 + index] = highlightColor;\n            colors32[3 + index] = highlightColor;\n            #endregion\n\n            index += 4;\n        }\n\n\n        /// <summary>\n        /// Internal function used to load the default settings of text objects.\n        /// </summary>\n        protected void LoadDefaultSettings()\n        {\n            if (m_text == null || m_isWaitingOnResourceLoad)\n            {\n                if (TMP_Settings.autoSizeTextContainer)\n                    autoSizeTextContainer = true;\n                else\n                {\n                    m_rectTransform = this.rectTransform;\n\n                    if (GetType() == typeof(TextMeshPro))\n                        m_rectTransform.sizeDelta = TMP_Settings.defaultTextMeshProTextContainerSize;\n                    else\n                        m_rectTransform.sizeDelta = TMP_Settings.defaultTextMeshProUITextContainerSize;\n                }\n\n                m_enableWordWrapping = TMP_Settings.enableWordWrapping;\n                m_enableKerning = TMP_Settings.enableKerning;\n                m_enableExtraPadding = TMP_Settings.enableExtraPadding;\n                m_tintAllSprites = TMP_Settings.enableTintAllSprites;\n                m_parseCtrlCharacters = TMP_Settings.enableParseEscapeCharacters;\n                m_fontSize = m_fontSizeBase = TMP_Settings.defaultFontSize;\n                m_fontSizeMin = m_fontSize * TMP_Settings.defaultTextAutoSizingMinRatio;\n                m_fontSizeMax = m_fontSize * TMP_Settings.defaultTextAutoSizingMaxRatio;\n                m_isWaitingOnResourceLoad = false;\n                raycastTarget = TMP_Settings.enableRaycastTarget;\n            }\n        }\n\n\n        /// <summary>\n        /// Method used to find and cache references to the Underline and Ellipsis characters.\n        /// </summary>\n        /// <param name=\"\"></param>\n        protected void GetSpecialCharacters(TMP_FontAsset fontAsset)\n        {\n            // Check & Assign Underline Character for use with the Underline tag.\n            if (!fontAsset.characterLookupTable.TryGetValue(95, out m_cached_Underline_Character))\n            {\n                m_cached_Underline_Character = TMP_FontAssetUtilities.GetCharacterFromFontAsset(95,fontAsset, false, m_FontStyleInternal, (FontWeight)m_FontWeightInternal, out bool isUsingAlternativeTypeface, out TMP_FontAsset tempFontAsset);\n\n                if (m_cached_Underline_Character == null)\n            {\n                    if (!TMP_Settings.warningsDisabled)\n                        Debug.LogWarning(\"The character used for Underline and Strikethrough is not available in font asset [\" + fontAsset.name + \"].\", this);\n                }\n            }\n\n            // Check & Assign Underline Character for use with the Underline tag.\n            if (!fontAsset.characterLookupTable.TryGetValue(8230, out m_cached_Ellipsis_Character)) //95\n            {\n                m_cached_Ellipsis_Character = TMP_FontAssetUtilities.GetCharacterFromFontAsset(8230, fontAsset, false, m_FontStyleInternal, (FontWeight)m_FontWeightInternal, out bool isUsingAlternativeTypeface, out TMP_FontAsset tempFontAsset);\n\n                if (m_cached_Ellipsis_Character == null)\n            {\n                    if (!TMP_Settings.warningsDisabled)\n                        Debug.LogWarning(\"The character used for Ellipsis is not available in font asset [\" + fontAsset.name + \"].\", this);\n                }\n            }\n        }\n\n\n        /// <summary>\n        /// Replace a given number of characters (tag) in the array with a new character and shift subsequent characters in the array.\n        /// </summary>\n        /// <param name=\"chars\">Array which contains the text.</param>\n        /// <param name=\"insertionIndex\">The index of where the new character will be inserted</param>\n        /// <param name=\"tagLength\">Length of the tag being replaced.</param>\n        /// <param name=\"c\">The replacement character.</param>\n        protected void ReplaceTagWithCharacter(int[] chars, int insertionIndex, int tagLength, char c)\n        {\n            chars[insertionIndex] = c;\n\n            for (int i = insertionIndex + tagLength; i < chars.Length; i++)\n            {\n                chars[i - 3] = chars[i];\n            }\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        //protected int GetMaterialReferenceForFontWeight()\n        //{\n        //    //bool isItalic = (m_style & FontStyles.Italic) == FontStyles.Italic || (m_fontStyle & FontStyles.Italic) == FontStyles.Italic;\n\n        //    m_currentMaterialIndex = MaterialReference.AddMaterialReference(m_currentFontAsset.fontWeights[0].italicTypeface.material, m_currentFontAsset.fontWeights[0].italicTypeface, m_materialReferences, m_materialReferenceIndexLookup);\n\n        //    return 0;\n        //}\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        protected TMP_FontAsset GetFontAssetForWeight(int fontWeight)\n        {\n            bool isItalic = (m_FontStyleInternal & FontStyles.Italic) == FontStyles.Italic || (m_fontStyle & FontStyles.Italic) == FontStyles.Italic;\n\n            TMP_FontAsset fontAsset = null;\n\n            int weightIndex = fontWeight / 100;\n\n            if (isItalic)\n                fontAsset = m_currentFontAsset.fontWeightTable[weightIndex].italicTypeface;\n            else\n                fontAsset = m_currentFontAsset.fontWeightTable[weightIndex].regularTypeface;\n\n            return fontAsset;\n        }\n\n\n        /// <summary>\n        /// Method to Enable or Disable child SubMesh objects.\n        /// </summary>\n        /// <param name=\"state\"></param>\n        protected virtual void SetActiveSubMeshes(bool state) { }\n\n\n        /// <summary>\n        /// Destroy Sub Mesh Objects.\n        /// </summary>\n        protected virtual void ClearSubMeshObjects() { }\n\n\n        /// <summary>\n        /// Function to clear the geometry of the Primary and Sub Text objects.\n        /// </summary>\n        public virtual void ClearMesh() { }\n\n\n        /// <summary>\n        /// Function to clear the geometry of the Primary and Sub Text objects.\n        /// </summary>\n        public virtual void ClearMesh(bool uploadGeometry) { }\n\n\n        /// <summary>\n        /// Function which returns the text after it has been parsed and rich text tags removed.\n        /// </summary>\n        /// <returns></returns>\n        public virtual string GetParsedText()\n        {\n            if (m_textInfo == null)\n                return string.Empty;\n\n            int characterCount = m_textInfo.characterCount;\n\n            // TODO - Could implement some static buffer pool shared by all instances of TMP objects.\n            char[] buffer = new char[characterCount];\n\n            for (int i = 0; i < characterCount && i < m_textInfo.characterInfo.Length; i++)\n            {\n                buffer[i] = m_textInfo.characterInfo[i].character;\n            }\n\n            return new string(buffer);\n        }\n\n\n        /// <summary>\n        /// Function to pack scale information in the UV2 Channel.\n        /// </summary>\n        /// <param name=\"x\"></param>\n        /// <param name=\"y\"></param>\n        /// <param name=\"scale\"></param>\n        /// <returns></returns>\n        //protected Vector2 PackUV(float x, float y, float scale)\n        //{\n        //    Vector2 output;\n\n        //    output.x = Mathf.Floor(x * 4095);\n        //    output.y = Mathf.Floor(y * 4095);\n\n        //    output.x = (output.x * 4096) + output.y;\n        //    output.y = scale;\n\n        //    return output;\n        //}\n\n        /// <summary>\n        /// Function to pack scale information in the UV2 Channel.\n        /// </summary>\n        /// <param name=\"x\"></param>\n        /// <param name=\"y\"></param>\n        /// <param name=\"scale\"></param>\n        /// <returns></returns>\n        protected Vector2 PackUV(float x, float y, float scale)\n        {\n            Vector2 output;\n\n            output.x = (int)(x * 511);\n            output.y = (int)(y * 511);\n\n            output.x = (output.x * 4096) + output.y;\n            output.y = scale;\n\n            return output;\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"x\"></param>\n        /// <param name=\"y\"></param>\n        /// <returns></returns>\n        protected float PackUV(float x, float y)\n        {\n            double x0 = (int)(x * 511);\n            double y0 = (int)(y * 511);\n\n            return (float)((x0 * 4096) + y0);\n        }\n\n\n        /// <summary>\n        /// Function used as a replacement for LateUpdate()\n        /// </summary>\n        internal virtual void InternalUpdate() { }\n\n\n        /// <summary>\n        /// Function to pack scale information in the UV2 Channel.\n        /// </summary>\n        /// <param name=\"x\"></param>\n        /// <param name=\"y\"></param>\n        /// <param name=\"scale\"></param>\n        /// <returns></returns>\n        //protected Vector2 PackUV(float x, float y, float scale)\n        //{\n        //    Vector2 output;\n\n        //    output.x = Mathf.Floor(x * 4095);\n        //    output.y = Mathf.Floor(y * 4095);\n\n        //    return new Vector2((output.x * 4096) + output.y, scale);\n        //}\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"x\"></param>\n        /// <param name=\"y\"></param>\n        /// <returns></returns>\n        //protected float PackUV(float x, float y)\n        //{\n        //    x = (x % 5) / 5;\n        //    y = (y % 5) / 5;\n\n        //    return Mathf.Round(x * 4096) + y;\n        //}\n\n\n        /// <summary>\n        /// Method to convert Hex to Int\n        /// </summary>\n        /// <param name=\"hex\"></param>\n        /// <returns></returns>\n        protected int HexToInt(char hex)\n        {\n            switch (hex)\n            {\n                case '0': return 0;\n                case '1': return 1;\n                case '2': return 2;\n                case '3': return 3;\n                case '4': return 4;\n                case '5': return 5;\n                case '6': return 6;\n                case '7': return 7;\n                case '8': return 8;\n                case '9': return 9;\n                case 'A': return 10;\n                case 'B': return 11;\n                case 'C': return 12;\n                case 'D': return 13;\n                case 'E': return 14;\n                case 'F': return 15;\n                case 'a': return 10;\n                case 'b': return 11;\n                case 'c': return 12;\n                case 'd': return 13;\n                case 'e': return 14;\n                case 'f': return 15;\n            }\n            return 15;\n        }\n\n\n        /// <summary>\n        /// Convert UTF-16 Hex to Char\n        /// </summary>\n        /// <returns>The Unicode hex.</returns>\n        /// <param name=\"i\">The index.</param>\n        protected int GetUTF16(string text, int i)\n        {\n            int unicode = 0;\n            unicode += HexToInt(text[i]) << 12;\n            unicode += HexToInt(text[i + 1]) << 8;\n            unicode += HexToInt(text[i + 2]) << 4;\n            unicode += HexToInt(text[i + 3]);\n            return unicode;\n        }\n\n        /// <summary>\n        /// Convert UTF-16 Hex to Char\n        /// </summary>\n        /// <returns>The Unicode hex.</returns>\n        /// <param name=\"i\">The index.</param>\n        protected int GetUTF16(StringBuilder text, int i)\n        {\n            int unicode = 0;\n            unicode += HexToInt(text[i]) << 12;\n            unicode += HexToInt(text[i + 1]) << 8;\n            unicode += HexToInt(text[i + 2]) << 4;\n            unicode += HexToInt(text[i + 3]);\n            return unicode;\n        }\n\n\n        /// <summary>\n        /// Convert UTF-32 Hex to Char\n        /// </summary>\n        /// <returns>The Unicode hex.</returns>\n        /// <param name=\"i\">The index.</param>\n        protected int GetUTF32(string text, int i)\n        {\n            int unicode = 0;\n            unicode += HexToInt(text[i]) << 30;\n            unicode += HexToInt(text[i + 1]) << 24;\n            unicode += HexToInt(text[i + 2]) << 20;\n            unicode += HexToInt(text[i + 3]) << 16;\n            unicode += HexToInt(text[i + 4]) << 12;\n            unicode += HexToInt(text[i + 5]) << 8;\n            unicode += HexToInt(text[i + 6]) << 4;\n            unicode += HexToInt(text[i + 7]);\n            return unicode;\n        }\n\n        /// <summary>\n        /// Convert UTF-32 Hex to Char\n        /// </summary>\n        /// <returns>The Unicode hex.</returns>\n        /// <param name=\"i\">The index.</param>\n        protected int GetUTF32(StringBuilder text, int i)\n        {\n            int unicode = 0;\n            unicode += HexToInt(text[i]) << 30;\n            unicode += HexToInt(text[i + 1]) << 24;\n            unicode += HexToInt(text[i + 2]) << 20;\n            unicode += HexToInt(text[i + 3]) << 16;\n            unicode += HexToInt(text[i + 4]) << 12;\n            unicode += HexToInt(text[i + 5]) << 8;\n            unicode += HexToInt(text[i + 6]) << 4;\n            unicode += HexToInt(text[i + 7]);\n            return unicode;\n        }\n\n\n        /// <summary>\n        /// Method to convert Hex color values to Color32\n        /// </summary>\n        /// <param name=\"hexChars\"></param>\n        /// <param name=\"tagCount\"></param>\n        /// <returns></returns>\n        protected Color32 HexCharsToColor(char[] hexChars, int tagCount)\n        {\n            if (tagCount == 4)\n            {\n                byte r = (byte)(HexToInt(hexChars[1]) * 16 + HexToInt(hexChars[1]));\n                byte g = (byte)(HexToInt(hexChars[2]) * 16 + HexToInt(hexChars[2]));\n                byte b = (byte)(HexToInt(hexChars[3]) * 16 + HexToInt(hexChars[3]));\n\n                return new Color32(r, g, b, 255);\n            }\n            else if (tagCount == 5)\n            {\n                byte r = (byte)(HexToInt(hexChars[1]) * 16 + HexToInt(hexChars[1]));\n                byte g = (byte)(HexToInt(hexChars[2]) * 16 + HexToInt(hexChars[2]));\n                byte b = (byte)(HexToInt(hexChars[3]) * 16 + HexToInt(hexChars[3]));\n                byte a = (byte)(HexToInt(hexChars[4]) * 16 + HexToInt(hexChars[4]));\n\n                return new Color32(r, g, b, a);\n            }\n            else if (tagCount == 7)\n            {\n                byte r = (byte)(HexToInt(hexChars[1]) * 16 + HexToInt(hexChars[2]));\n                byte g = (byte)(HexToInt(hexChars[3]) * 16 + HexToInt(hexChars[4]));\n                byte b = (byte)(HexToInt(hexChars[5]) * 16 + HexToInt(hexChars[6]));\n\n                return new Color32(r, g, b, 255);\n            }\n            else if (tagCount == 9)\n            {\n                byte r = (byte)(HexToInt(hexChars[1]) * 16 + HexToInt(hexChars[2]));\n                byte g = (byte)(HexToInt(hexChars[3]) * 16 + HexToInt(hexChars[4]));\n                byte b = (byte)(HexToInt(hexChars[5]) * 16 + HexToInt(hexChars[6]));\n                byte a = (byte)(HexToInt(hexChars[7]) * 16 + HexToInt(hexChars[8]));\n\n                return new Color32(r, g, b, a);\n            }\n            else if (tagCount == 10)\n            {\n                byte r = (byte)(HexToInt(hexChars[7]) * 16 + HexToInt(hexChars[7]));\n                byte g = (byte)(HexToInt(hexChars[8]) * 16 + HexToInt(hexChars[8]));\n                byte b = (byte)(HexToInt(hexChars[9]) * 16 + HexToInt(hexChars[9]));\n\n                return new Color32(r, g, b, 255);\n            }\n            else if (tagCount == 11)\n            {\n                byte r = (byte)(HexToInt(hexChars[7]) * 16 + HexToInt(hexChars[7]));\n                byte g = (byte)(HexToInt(hexChars[8]) * 16 + HexToInt(hexChars[8]));\n                byte b = (byte)(HexToInt(hexChars[9]) * 16 + HexToInt(hexChars[9]));\n                byte a = (byte)(HexToInt(hexChars[10]) * 16 + HexToInt(hexChars[10]));\n\n                return new Color32(r, g, b, a);\n            }\n            else if (tagCount == 13)\n            {\n                byte r = (byte)(HexToInt(hexChars[7]) * 16 + HexToInt(hexChars[8]));\n                byte g = (byte)(HexToInt(hexChars[9]) * 16 + HexToInt(hexChars[10]));\n                byte b = (byte)(HexToInt(hexChars[11]) * 16 + HexToInt(hexChars[12]));\n\n                return new Color32(r, g, b, 255);\n            }\n            else if (tagCount == 15)\n            {\n                byte r = (byte)(HexToInt(hexChars[7]) * 16 + HexToInt(hexChars[8]));\n                byte g = (byte)(HexToInt(hexChars[9]) * 16 + HexToInt(hexChars[10]));\n                byte b = (byte)(HexToInt(hexChars[11]) * 16 + HexToInt(hexChars[12]));\n                byte a = (byte)(HexToInt(hexChars[13]) * 16 + HexToInt(hexChars[14]));\n\n                return new Color32(r, g, b, a);\n            }\n\n            return new Color32(255, 255, 255, 255);\n        }\n\n\n        /// <summary>\n        /// Method to convert Hex Color values to Color32\n        /// </summary>\n        /// <param name=\"hexChars\"></param>\n        /// <param name=\"startIndex\"></param>\n        /// <param name=\"length\"></param>\n        /// <returns></returns>\n        protected Color32 HexCharsToColor(char[] hexChars, int startIndex, int length)\n        {\n            if (length == 7)\n            {\n                byte r = (byte)(HexToInt(hexChars[startIndex + 1]) * 16 + HexToInt(hexChars[startIndex + 2]));\n                byte g = (byte)(HexToInt(hexChars[startIndex + 3]) * 16 + HexToInt(hexChars[startIndex + 4]));\n                byte b = (byte)(HexToInt(hexChars[startIndex + 5]) * 16 + HexToInt(hexChars[startIndex + 6]));\n\n                return new Color32(r, g, b, 255);\n            }\n            else if (length == 9)\n            {\n                byte r = (byte)(HexToInt(hexChars[startIndex + 1]) * 16 + HexToInt(hexChars[startIndex + 2]));\n                byte g = (byte)(HexToInt(hexChars[startIndex + 3]) * 16 + HexToInt(hexChars[startIndex + 4]));\n                byte b = (byte)(HexToInt(hexChars[startIndex + 5]) * 16 + HexToInt(hexChars[startIndex + 6]));\n                byte a = (byte)(HexToInt(hexChars[startIndex + 7]) * 16 + HexToInt(hexChars[startIndex + 8]));\n\n                return new Color32(r, g, b, a);\n            }\n\n            return s_colorWhite;\n        }\n\n\n        /// <summary>\n        /// Method which returns the number of parameters used in a tag attribute and populates an array with such values.\n        /// </summary>\n        /// <param name=\"chars\">Char[] containing the tag attribute and data</param>\n        /// <param name=\"startIndex\">The index of the first char of the data</param>\n        /// <param name=\"length\">The length of the data</param>\n        /// <param name=\"parameters\">The number of parameters contained in the Char[]</param>\n        /// <returns></returns>\n        int GetAttributeParameters(char[] chars, int startIndex, int length, ref float[] parameters)\n        {\n            int endIndex = startIndex;\n            int attributeCount = 0;\n\n            while (endIndex < startIndex + length)\n            {\n                parameters[attributeCount] = ConvertToFloat(chars, startIndex, length, out endIndex);\n\n                length -= (endIndex - startIndex) + 1;\n                startIndex = endIndex + 1;\n\n                attributeCount += 1;\n            }\n\n            return attributeCount;\n        }\n\n\n        /// <summary>\n        /// Extracts a float value from char[] assuming we know the position of the start, end and decimal point.\n        /// </summary>\n        /// <param name=\"chars\"></param>\n        /// <param name=\"startIndex\"></param>\n        /// <param name=\"length\"></param>\n        /// <returns></returns>\n        protected float ConvertToFloat(char[] chars, int startIndex, int length)\n        {\n            return ConvertToFloat(chars, startIndex, length, out int lastIndex);\n        }\n\n\n        /// <summary>\n        /// Extracts a float value from char[] given a start index and length. \n        /// </summary>\n        /// <param name=\"chars\"></param> The Char[] containing the numerical sequence.\n        /// <param name=\"startIndex\"></param> The index of the start of the numerical sequence.\n        /// <param name=\"length\"></param> The length of the numerical sequence.\n        /// <param name=\"lastIndex\"></param> Index of the last character in the validated sequence.\n        /// <returns></returns>\n        protected float ConvertToFloat(char[] chars, int startIndex, int length, out int lastIndex)\n        {\n            if (startIndex == 0) { lastIndex = 0; return -9999; }\n            int endIndex = startIndex + length;\n\n            bool isIntegerValue = true;\n            float decimalPointMultiplier = 0;\n\n            // Set value multiplier checking the first character to determine if we are using '+' or '-'\n            int valueSignMultiplier = 1;\n            if (chars[startIndex] == '+')\n            {\n                valueSignMultiplier = 1;\n                startIndex += 1;\n            }\n            else if (chars[startIndex] == '-')\n            {\n                valueSignMultiplier = -1;\n                startIndex += 1;\n            }\n\n            float value = 0;\n\n            for (int i = startIndex; i < endIndex; i++)\n            {\n                uint c = chars[i];\n\n                if (c >= '0' && c <= '9' || c == '.')\n                {\n                    if (c == '.')\n                    {\n                        isIntegerValue = false;\n                        decimalPointMultiplier = 0.1f;\n                        continue;\n                    }\n\n                    //Calculate integer and floating point value\n                    if (isIntegerValue)\n                        value = value * 10 + (c - 48) * valueSignMultiplier;\n                    else\n                {\n                        value = value + (c - 48) * decimalPointMultiplier * valueSignMultiplier;\n                        decimalPointMultiplier *= 0.1f;\n                }\n\n                    continue;\n                }\n                else if (c == ',')\n                {\n                    if (i + 1 < endIndex && chars[i + 1] == ' ')\n                        lastIndex = i + 1;\n                else\n                        lastIndex = i;\n\n                    return value;\n                }\n            }\n\n            lastIndex = endIndex;\n            return value;\n        }\n\n\n        /// <summary>\n        /// Function to identify and validate the rich tag. Returns the position of the > if the tag was valid.\n        /// </summary>\n        /// <param name=\"chars\"></param>\n        /// <param name=\"startIndex\"></param>\n        /// <param name=\"endIndex\"></param>\n        /// <returns></returns>\n        protected bool ValidateHtmlTag(UnicodeChar[] chars, int startIndex, out int endIndex)\n        {\n            int tagCharCount = 0;\n            byte attributeFlag = 0;\n\n            int attributeIndex = 0;\n            m_xmlAttribute[attributeIndex].nameHashCode = 0;\n            m_xmlAttribute[attributeIndex].valueHashCode = 0;\n            m_xmlAttribute[attributeIndex].valueStartIndex = 0;\n            m_xmlAttribute[attributeIndex].valueLength = 0;\n            TagValueType tagValueType = m_xmlAttribute[attributeIndex].valueType = TagValueType.None;\n            TagUnitType tagUnitType = m_xmlAttribute[attributeIndex].unitType = TagUnitType.Pixels;\n\n            // Clear attribute name hash codes\n            m_xmlAttribute[1].nameHashCode = 0;\n            m_xmlAttribute[2].nameHashCode = 0;\n            m_xmlAttribute[3].nameHashCode = 0;\n            m_xmlAttribute[4].nameHashCode = 0;\n\n            endIndex = startIndex;\n            bool isTagSet = false;\n            bool isValidHtmlTag = false;\n\n            for (int i = startIndex; i < chars.Length && chars[i].unicode != 0 && tagCharCount < m_htmlTag.Length && chars[i].unicode != '<'; i++)\n            {\n                int unicode = chars[i].unicode;\n\n                if (unicode == '>') // ASCII Code of End HTML tag '>'\n                {\n                    isValidHtmlTag = true;\n                    endIndex = i;\n                    m_htmlTag[tagCharCount] = (char)0;\n                    break;\n                }\n\n                m_htmlTag[tagCharCount] = (char)unicode;\n                tagCharCount += 1;\n\n                if (attributeFlag == 1)\n                {\n                    if (tagValueType == TagValueType.None)\n                    {\n                        // Check for attribute type\n                        if (unicode == '+' || unicode == '-' || unicode == '.' || (unicode >= '0' && unicode <= '9'))\n                        {\n                            tagUnitType = TagUnitType.Pixels;\n                            tagValueType = m_xmlAttribute[attributeIndex].valueType = TagValueType.NumericalValue;\n                            m_xmlAttribute[attributeIndex].valueStartIndex = tagCharCount - 1;\n                            m_xmlAttribute[attributeIndex].valueLength += 1;\n                        }\n                        else if (unicode == '#')\n                        {\n                            tagUnitType = TagUnitType.Pixels;\n                            tagValueType = m_xmlAttribute[attributeIndex].valueType = TagValueType.ColorValue;\n                            m_xmlAttribute[attributeIndex].valueStartIndex = tagCharCount - 1;\n                            m_xmlAttribute[attributeIndex].valueLength += 1;\n                        }\n                        else if (unicode == '\"')\n                        {\n                            tagUnitType = TagUnitType.Pixels;\n                            tagValueType = m_xmlAttribute[attributeIndex].valueType = TagValueType.StringValue;\n                            m_xmlAttribute[attributeIndex].valueStartIndex = tagCharCount;\n                        }\n                        else\n                        {\n                            tagUnitType = TagUnitType.Pixels;\n                            tagValueType = m_xmlAttribute[attributeIndex].valueType = TagValueType.StringValue;\n                            m_xmlAttribute[attributeIndex].valueStartIndex = tagCharCount - 1;\n                            m_xmlAttribute[attributeIndex].valueHashCode = (m_xmlAttribute[attributeIndex].valueHashCode << 5) + m_xmlAttribute[attributeIndex].valueHashCode ^ unicode;\n                            m_xmlAttribute[attributeIndex].valueLength += 1;\n                        }\n                    }\n                    else\n                    {\n                        if (tagValueType == TagValueType.NumericalValue)\n                        {\n                            // Check for termination of numerical value.\n                            if (unicode == 'p' || unicode == 'e' || unicode == '%' || unicode == ' ')\n                            {\n                                attributeFlag = 2;\n                                tagValueType = TagValueType.None;\n\n                                switch (unicode)\n                                {\n                                    case 'e':\n                                        m_xmlAttribute[attributeIndex].unitType = tagUnitType = TagUnitType.FontUnits;\n                                        break;\n                                    case '%':\n                                        m_xmlAttribute[attributeIndex].unitType = tagUnitType = TagUnitType.Percentage;\n                                        break;\n                                    default:\n                                        m_xmlAttribute[attributeIndex].unitType = tagUnitType = TagUnitType.Pixels;\n                                        break;\n                                }\n\n                                attributeIndex += 1;\n                                m_xmlAttribute[attributeIndex].nameHashCode = 0;\n                                m_xmlAttribute[attributeIndex].valueHashCode = 0;\n                                m_xmlAttribute[attributeIndex].valueType = TagValueType.None;\n                                m_xmlAttribute[attributeIndex].unitType = TagUnitType.Pixels;\n                                m_xmlAttribute[attributeIndex].valueStartIndex = 0;\n                                m_xmlAttribute[attributeIndex].valueLength = 0;\n\n                            }\n                            else if (attributeFlag != 2)\n                            {\n                                m_xmlAttribute[attributeIndex].valueLength += 1;\n                            }\n                        }\n                        else if (tagValueType == TagValueType.ColorValue)\n                        {\n                            if (unicode != ' ')\n                            {\n                                m_xmlAttribute[attributeIndex].valueLength += 1;\n                            }\n                            else\n                            {\n                                attributeFlag = 2;\n                                tagValueType = TagValueType.None;\n                                tagUnitType = TagUnitType.Pixels;\n                                attributeIndex += 1;\n                                m_xmlAttribute[attributeIndex].nameHashCode = 0;\n                                m_xmlAttribute[attributeIndex].valueType = TagValueType.None;\n                                m_xmlAttribute[attributeIndex].unitType = TagUnitType.Pixels;\n                                m_xmlAttribute[attributeIndex].valueHashCode = 0;\n                                m_xmlAttribute[attributeIndex].valueStartIndex = 0;\n                                m_xmlAttribute[attributeIndex].valueLength = 0;\n                            }\n                        }\n                        else if (tagValueType == TagValueType.StringValue)\n                        {\n                            // Compute HashCode value for the named tag.\n                            if (unicode != '\"')\n                            {\n                                m_xmlAttribute[attributeIndex].valueHashCode = (m_xmlAttribute[attributeIndex].valueHashCode << 5) + m_xmlAttribute[attributeIndex].valueHashCode ^ unicode;\n                                m_xmlAttribute[attributeIndex].valueLength += 1;\n                            }\n                            else\n                            {\n                                attributeFlag = 2;\n                                tagValueType = TagValueType.None;\n                                tagUnitType = TagUnitType.Pixels;\n                                attributeIndex += 1;\n                                m_xmlAttribute[attributeIndex].nameHashCode = 0;\n                                m_xmlAttribute[attributeIndex].valueType = TagValueType.None;\n                                m_xmlAttribute[attributeIndex].unitType = TagUnitType.Pixels;\n                                m_xmlAttribute[attributeIndex].valueHashCode = 0;\n                                m_xmlAttribute[attributeIndex].valueStartIndex = 0;\n                                m_xmlAttribute[attributeIndex].valueLength = 0;\n                            }\n                        }\n                    }\n                }\n\n\n                if (unicode == '=') // '=' \n                    attributeFlag = 1;\n\n                // Compute HashCode for the name of the attribute\n                if (attributeFlag == 0 && unicode == ' ')\n                {\n                    if (isTagSet) return false;\n\n                    isTagSet = true;\n                    attributeFlag = 2;\n\n                    tagValueType = TagValueType.None;\n                    tagUnitType = TagUnitType.Pixels;\n                    attributeIndex += 1;\n                    m_xmlAttribute[attributeIndex].nameHashCode = 0;\n                    m_xmlAttribute[attributeIndex].valueType = TagValueType.None;\n                    m_xmlAttribute[attributeIndex].unitType = TagUnitType.Pixels;\n                    m_xmlAttribute[attributeIndex].valueHashCode = 0;\n                    m_xmlAttribute[attributeIndex].valueStartIndex = 0;\n                    m_xmlAttribute[attributeIndex].valueLength = 0;\n                }\n\n                if (attributeFlag == 0)\n                    m_xmlAttribute[attributeIndex].nameHashCode = (m_xmlAttribute[attributeIndex].nameHashCode << 3) - m_xmlAttribute[attributeIndex].nameHashCode + unicode;\n\n                if (attributeFlag == 2 && unicode == ' ')\n                    attributeFlag = 0;\n\n            }\n\n            if (!isValidHtmlTag)\n            {\n                return false;\n            }\n\n            //Debug.Log(\"Tag is [\" + m_htmlTag.ArrayToString() + \"].  Tag HashCode: \" + m_xmlAttribute[0].nameHashCode + \"  Tag Value HashCode: \" + m_xmlAttribute[0].valueHashCode + \"  Attribute 1 HashCode: \" + m_xmlAttribute[1].nameHashCode + \" Value HashCode: \" + m_xmlAttribute[1].valueHashCode);\n            //for (int i = 0; i < attributeIndex; i++)\n            //    Debug.Log(\"Tag [\" + i + \"] with HashCode: \" + m_xmlAttribute[i].nameHashCode + \" has value of [\" + new string(m_htmlTag, m_xmlAttribute[i].valueStartIndex, m_xmlAttribute[i].valueLength) + \"] Numerical Value: \" + ConvertToFloat(m_htmlTag, m_xmlAttribute[i].valueStartIndex, m_xmlAttribute[i].valueLength));\n\n            #region Rich Text Tag Processing\n            #if !RICH_TEXT_ENABLED\n            // Special handling of the no parsing tag </noparse> </NOPARSE> tag\n            if (tag_NoParsing && (m_xmlAttribute[0].nameHashCode != 53822163 && m_xmlAttribute[0].nameHashCode != 49429939))\n                return false;\n            else if (m_xmlAttribute[0].nameHashCode == 53822163 || m_xmlAttribute[0].nameHashCode == 49429939)\n            {\n                tag_NoParsing = false;\n                return true;\n            }\n\n            // Color <#FFF> 3 Hex values (short form)\n            if (m_htmlTag[0] == 35 && tagCharCount == 4)\n            {\n                m_htmlColor = HexCharsToColor(m_htmlTag, tagCharCount);\n                m_colorStack.Add(m_htmlColor);\n                return true;\n            }\n            // Color <#FFF7> 4 Hex values with alpha (short form)\n            else if (m_htmlTag[0] == 35 && tagCharCount == 5)\n            {\n                m_htmlColor = HexCharsToColor(m_htmlTag, tagCharCount);\n                m_colorStack.Add(m_htmlColor);\n                return true;\n            }\n            // Color <#FF00FF>\n            else if (m_htmlTag[0] == 35 && tagCharCount == 7) // if Tag begins with # and contains 7 characters. \n            {\n                m_htmlColor = HexCharsToColor(m_htmlTag, tagCharCount);\n                m_colorStack.Add(m_htmlColor);\n                return true;\n            }\n            // Color <#FF00FF00> with alpha\n            else if (m_htmlTag[0] == 35 && tagCharCount == 9) // if Tag begins with # and contains 9 characters. \n            {\n                m_htmlColor = HexCharsToColor(m_htmlTag, tagCharCount);\n                m_colorStack.Add(m_htmlColor);\n                return true;\n            }\n            else\n            {\n                float value = 0;\n\n                switch (m_xmlAttribute[0].nameHashCode)\n                {\n                    case 98: // <b>\n                    case 66: // <B>\n                        m_FontStyleInternal |= FontStyles.Bold;\n                        m_fontStyleStack.Add(FontStyles.Bold);\n\n                        m_FontWeightInternal = FontWeight.Bold;\n                        return true;\n                    case 427: // </b>\n                    case 395: // </B>\n                        if ((m_fontStyle & FontStyles.Bold) != FontStyles.Bold)\n                        {\n                            if (m_fontStyleStack.Remove(FontStyles.Bold) == 0)\n                            {\n                                m_FontStyleInternal &= ~FontStyles.Bold;\n                                m_FontWeightInternal = m_FontWeightStack.Peek();\n                            }\n                        }\n                        return true;\n                    case 105: // <i>\n                    case 73: // <I>\n                        m_FontStyleInternal |= FontStyles.Italic;\n                        m_fontStyleStack.Add(FontStyles.Italic);\n                        return true;\n                    case 434: // </i>\n                    case 402: // </I>\n                        if ((m_fontStyle & FontStyles.Italic) != FontStyles.Italic)\n                        {\n                            if (m_fontStyleStack.Remove(FontStyles.Italic) == 0)\n                                m_FontStyleInternal &= ~FontStyles.Italic;\n                        }\n                        return true;\n                    case 115: // <s>\n                    case 83: // <S>\n                        m_FontStyleInternal |= FontStyles.Strikethrough;\n                        m_fontStyleStack.Add(FontStyles.Strikethrough);\n\n                        if (m_xmlAttribute[1].nameHashCode == 281955 || m_xmlAttribute[1].nameHashCode == 192323)\n                        {\n                            m_strikethroughColor = HexCharsToColor(m_htmlTag, m_xmlAttribute[1].valueStartIndex, m_xmlAttribute[1].valueLength);\n                            m_strikethroughColor.a = m_htmlColor.a < m_strikethroughColor.a ? (byte)(m_htmlColor.a) : (byte)(m_strikethroughColor .a);\n                        }\n                        else\n                            m_strikethroughColor = m_htmlColor;\n\n                        m_strikethroughColorStack.Add(m_strikethroughColor);\n\n                        return true;\n                    case 444: // </s>\n                    case 412: // </S>\n                        if ((m_fontStyle & FontStyles.Strikethrough) != FontStyles.Strikethrough)\n                        {\n                            if (m_fontStyleStack.Remove(FontStyles.Strikethrough) == 0)\n                                m_FontStyleInternal &= ~FontStyles.Strikethrough;\n                        }\n                        return true;\n                    case 117: // <u>\n                    case 85: // <U>\n                        m_FontStyleInternal |= FontStyles.Underline;\n                        m_fontStyleStack.Add(FontStyles.Underline);\n\n                        if (m_xmlAttribute[1].nameHashCode == 281955 || m_xmlAttribute[1].nameHashCode == 192323)\n                        {\n                            m_underlineColor = HexCharsToColor(m_htmlTag, m_xmlAttribute[1].valueStartIndex, m_xmlAttribute[1].valueLength);\n                            m_underlineColor.a = m_htmlColor.a < m_underlineColor.a ? (byte)(m_htmlColor.a) : (byte)(m_underlineColor.a);\n                        }\n                        else\n                            m_underlineColor = m_htmlColor;\n\n                        m_underlineColorStack.Add(m_underlineColor);\n\n                        return true;\n                    case 446: // </u>\n                    case 414: // </U>\n                        if ((m_fontStyle & FontStyles.Underline) != FontStyles.Underline)\n                        {\n                            m_underlineColor = m_underlineColorStack.Remove();\n\n                            if (m_fontStyleStack.Remove(FontStyles.Underline) == 0)\n                                m_FontStyleInternal &= ~FontStyles.Underline;\n                        }\n                        return true;\n                    case 43045: // <mark=#FF00FF80>\n                    case 30245: // <MARK>\n                        m_FontStyleInternal |= FontStyles.Highlight;\n                        m_fontStyleStack.Add(FontStyles.Highlight);\n\n                        m_highlightColor = HexCharsToColor(m_htmlTag, m_xmlAttribute[0].valueStartIndex, m_xmlAttribute[0].valueLength);\n                        m_highlightColor.a = m_htmlColor.a < m_highlightColor.a ? (byte)(m_htmlColor.a) : (byte)(m_highlightColor.a);\n                        m_highlightColorStack.Add(m_highlightColor);\n\n                        // Handle Mark Tag Attributes\n                        for (int i = 0; i < m_xmlAttribute.Length && m_xmlAttribute[i].nameHashCode != 0; i++)\n                        {\n                            int nameHashCode = m_xmlAttribute[i].nameHashCode;\n\n                            switch (nameHashCode)\n                            {\n                                case 281955: // color\n                                    break;\n\n                                case 15087385: // padding\n                                    int paramCount = GetAttributeParameters(m_htmlTag, m_xmlAttribute[i].valueStartIndex, m_xmlAttribute[i].valueLength, ref m_attributeParameterValues);\n                                    if (paramCount != 4) return false;\n\n                                    m_highlightPadding = new Vector4(m_attributeParameterValues[0], m_attributeParameterValues[1], m_attributeParameterValues[2], m_attributeParameterValues[3]); \n                                    break;\n                            }\n                        }\n\n                        return true;\n                    case 155892: // </mark>\n                    case 143092: // </MARK>\n                        if ((m_fontStyle & FontStyles.Highlight) != FontStyles.Highlight)\n                        {\n                            m_highlightColor = m_highlightColorStack.Remove();\n\n                            if (m_fontStyleStack.Remove(FontStyles.Highlight) == 0)\n                                m_FontStyleInternal &= ~FontStyles.Highlight;\n                        }\n                        return true;\n                    case 6552: // <sub>\n                    case 4728: // <SUB>\n                        m_fontScaleMultiplier *= m_currentFontAsset.faceInfo.subscriptSize > 0 ? m_currentFontAsset.faceInfo.subscriptSize : 1;\n                        m_baselineOffsetStack.Push(m_baselineOffset);\n                        m_baselineOffset += m_currentFontAsset.faceInfo.subscriptOffset * m_fontScale * m_fontScaleMultiplier;\n\n                        m_fontStyleStack.Add(FontStyles.Subscript);\n                        m_FontStyleInternal |= FontStyles.Subscript;\n                        return true;\n                    case 22673: // </sub>\n                    case 20849: // </SUB>\n                        if ((m_FontStyleInternal & FontStyles.Subscript) == FontStyles.Subscript)\n                        {\n                            if (m_fontScaleMultiplier < 1)\n                            {\n                                //m_baselineOffset -= m_currentFontAsset.fontInfo.SubscriptOffset * m_fontScale * m_fontScaleMultiplier;\n                                m_baselineOffset = m_baselineOffsetStack.Pop();\n                                m_fontScaleMultiplier /= m_currentFontAsset.faceInfo.subscriptSize > 0 ? m_currentFontAsset.faceInfo.subscriptSize : 1;\n                            }\n\n                            if (m_fontStyleStack.Remove(FontStyles.Subscript) == 0)\n                                m_FontStyleInternal &= ~FontStyles.Subscript;\n                        }\n                        return true;\n                    case 6566: // <sup>\n                    case 4742: // <SUP>\n                        m_fontScaleMultiplier *= m_currentFontAsset.faceInfo.superscriptSize > 0 ? m_currentFontAsset.faceInfo.superscriptSize : 1;\n                        m_baselineOffsetStack.Push(m_baselineOffset);\n                        m_baselineOffset += m_currentFontAsset.faceInfo.superscriptOffset * m_fontScale * m_fontScaleMultiplier;\n\n                        m_fontStyleStack.Add(FontStyles.Superscript);\n                        m_FontStyleInternal |= FontStyles.Superscript;\n                        return true;\n                    case 22687: // </sup>\n                    case 20863: // </SUP>\n                        if ((m_FontStyleInternal & FontStyles.Superscript) == FontStyles.Superscript)\n                        {\n                            if (m_fontScaleMultiplier < 1)\n                            {\n                                //m_baselineOffset -= m_currentFontAsset.fontInfo.SuperscriptOffset * m_fontScale * m_fontScaleMultiplier;\n                                m_baselineOffset = m_baselineOffsetStack.Pop();\n                                m_fontScaleMultiplier /= m_currentFontAsset.faceInfo.superscriptSize > 0 ? m_currentFontAsset.faceInfo.superscriptSize : 1;\n                            }\n\n                            if (m_fontStyleStack.Remove(FontStyles.Superscript) == 0)\n                                m_FontStyleInternal &= ~FontStyles.Superscript;\n                        }\n                        return true;\n                    case -330774850: // <font-weight>\n                    case 2012149182: // <FONT-WEIGHT>\n                        value = ConvertToFloat(m_htmlTag, m_xmlAttribute[0].valueStartIndex, m_xmlAttribute[0].valueLength);\n\n                        //if (value == -9999) return false;\n\n                        //if ((m_fontStyle & FontStyles.Bold) == FontStyles.Bold)\n                        //{\n                        //    // Nothing happens since Bold is forced on the text.\n                        //    //m_fontWeight = 700;\n                        //    return true;\n                        //}\n\n\n                        //// Remove bold style\n                        //m_style &= ~FontStyles.Bold;\n\n                        switch ((int)value)\n                        {\n                            case 100:\n                                m_FontWeightInternal = FontWeight.Thin;\n                                break;\n                            case 200:\n                                m_FontWeightInternal = FontWeight.ExtraLight;\n                                break;\n                            case 300:\n                                m_FontWeightInternal = FontWeight.Light;\n                                break;\n                            case 400:\n                                m_FontWeightInternal = FontWeight.Regular;\n                                break;\n                            case 500:\n                                m_FontWeightInternal = FontWeight.Medium;\n                                break;\n                            case 600:\n                                m_FontWeightInternal = FontWeight.SemiBold;\n                                break;\n                            case 700:\n                                m_FontWeightInternal = FontWeight.Bold;\n                                break;\n                            case 800:\n                                m_FontWeightInternal = FontWeight.Heavy;\n                                break;\n                            case 900:\n                                m_FontWeightInternal = FontWeight.Black;\n                                break;\n                        }\n\n                        m_FontWeightStack.Add(m_FontWeightInternal);\n\n                        return true;\n                    case -1885698441: // </font-weight>\n                    case 457225591: // </FONT-WEIGHT>\n                        m_FontWeightStack.Remove();\n\n                        if (m_FontStyleInternal == FontStyles.Bold)\n                            m_FontWeightInternal = FontWeight.Bold;\n                        else\n                            m_FontWeightInternal = m_FontWeightStack.Peek();\n\n                        return true;\n                    case 6380: // <pos=000.00px> <pos=0em> <pos=50%>\n                    case 4556: // <POS>\n                        value = ConvertToFloat(m_htmlTag, m_xmlAttribute[0].valueStartIndex, m_xmlAttribute[0].valueLength);\n                        if (value == -9999) return false;\n\n                        switch (tagUnitType)\n                        {\n                            case TagUnitType.Pixels:\n                                m_xAdvance = value * (m_isOrthographic ? 1.0f : 0.1f);\n                                //m_isIgnoringAlignment = true;\n                                return true;\n                            case TagUnitType.FontUnits:\n                                m_xAdvance = value * m_currentFontSize * (m_isOrthographic ? 1.0f : 0.1f);\n                                //m_isIgnoringAlignment = true;\n                                return true;\n                            case TagUnitType.Percentage:\n                                m_xAdvance = m_marginWidth * value / 100;\n                                //m_isIgnoringAlignment = true;\n                                return true;\n                        }\n                        return false;\n                    case 22501: // </pos>\n                    case 20677: // </POS>\n                        m_isIgnoringAlignment = false;\n                        return true;\n                    case 16034505: // <voffset>\n                    case 11642281: // <VOFFSET>\n                        value = ConvertToFloat(m_htmlTag, m_xmlAttribute[0].valueStartIndex, m_xmlAttribute[0].valueLength);\n                        if (value == -9999) return false;\n\n                        switch (tagUnitType)\n                        {\n                            case TagUnitType.Pixels:\n                                m_baselineOffset = value * (m_isOrthographic ? 1 : 0.1f);\n                                return true;\n                            case TagUnitType.FontUnits:\n                                m_baselineOffset = value * (m_isOrthographic ? 1 : 0.1f) * m_currentFontSize;\n                                return true;\n                            case TagUnitType.Percentage:\n                                //m_baselineOffset = m_marginHeight * val / 100;\n                                return false;\n                        }\n                        return false;\n                    case 54741026: // </voffset>\n                    case 50348802: // </VOFFSET>\n                        m_baselineOffset = 0;\n                        return true;\n                    case 43991: // <page>\n                    case 31191: // <PAGE>\n                        // This tag only works when Overflow - Page mode is used.\n                        if (m_overflowMode == TextOverflowModes.Page)\n                        {\n                            m_xAdvance = 0 + tag_LineIndent + tag_Indent;\n                            m_lineOffset = 0;\n                            m_pageNumber += 1;\n                            m_isNewPage = true;\n                        }\n                        return true;\n                    // <BR> tag is now handled inline where it is replaced by a linefeed or \\n.\n                    //case 544: // <BR>\n                    //case 800: // <br>\n                    //    m_forceLineBreak = true;\n                    //    return true;\n                    case 43969: // <nobr>\n                    case 31169: // <NOBR>\n                        m_isNonBreakingSpace = true;\n                        return true;\n                    case 156816: // </nobr>\n                    case 144016: // </NOBR>\n                        m_isNonBreakingSpace = false;\n                        return true;\n                    case 45545: // <size=>\n                    case 32745: // <SIZE>\n                        value = ConvertToFloat(m_htmlTag, m_xmlAttribute[0].valueStartIndex, m_xmlAttribute[0].valueLength);\n                        if (value == -9999) return false;\n\n                        switch (tagUnitType)\n                        {\n                            case TagUnitType.Pixels:\n                                if (m_htmlTag[5] == 43) // <size=+00>\n                                {\n                                    m_currentFontSize = m_fontSize + value;\n                                    m_sizeStack.Add(m_currentFontSize);\n                                    m_fontScale = (m_currentFontSize / m_currentFontAsset.faceInfo.pointSize * m_currentFontAsset.faceInfo.scale * (m_isOrthographic ? 1 : 0.1f));\n                                    return true;\n                                }\n                                else if (m_htmlTag[5] == 45) // <size=-00>\n                                {\n                                    m_currentFontSize = m_fontSize + value;\n                                    m_sizeStack.Add(m_currentFontSize);\n                                    m_fontScale = (m_currentFontSize / m_currentFontAsset.faceInfo.pointSize * m_currentFontAsset.faceInfo.scale * (m_isOrthographic ? 1 : 0.1f));\n                                    return true;\n                                }\n                                else // <size=00.0>\n                                {\n                                    m_currentFontSize = value;\n                                    m_sizeStack.Add(m_currentFontSize);\n                                    m_fontScale = (m_currentFontSize / m_currentFontAsset.faceInfo.pointSize * m_currentFontAsset.faceInfo.scale * (m_isOrthographic ? 1 : 0.1f));\n                                    return true;\n                                }\n                            case TagUnitType.FontUnits:\n                                m_currentFontSize = m_fontSize * value;\n                                m_sizeStack.Add(m_currentFontSize);\n                                m_fontScale = (m_currentFontSize / m_currentFontAsset.faceInfo.pointSize * m_currentFontAsset.faceInfo.scale * (m_isOrthographic ? 1 : 0.1f));\n                                return true;\n                            case TagUnitType.Percentage:\n                                m_currentFontSize = m_fontSize * value / 100;\n                                m_sizeStack.Add(m_currentFontSize);\n                                m_fontScale = (m_currentFontSize / m_currentFontAsset.faceInfo.pointSize * m_currentFontAsset.faceInfo.scale * (m_isOrthographic ? 1 : 0.1f));\n                                return true;\n                        }\n                        return false;\n                    case 158392: // </size>\n                    case 145592: // </SIZE>\n                        m_currentFontSize = m_sizeStack.Remove();\n                        m_fontScale = (m_currentFontSize / m_currentFontAsset.faceInfo.pointSize * m_currentFontAsset.faceInfo.scale * (m_isOrthographic ? 1 : 0.1f));\n                        return true;\n                    case 41311: // <font=xx>\n                    case 28511: // <FONT>\n                        int fontHashCode = m_xmlAttribute[0].valueHashCode;\n                        int materialAttributeHashCode = m_xmlAttribute[1].nameHashCode;\n                        int materialHashCode = m_xmlAttribute[1].valueHashCode;\n\n                        // Special handling for <font=default> or <font=Default>\n                        if (fontHashCode == 764638571 || fontHashCode == 523367755)\n                        {\n                            m_currentFontAsset = m_materialReferences[0].fontAsset;\n                            m_currentMaterial = m_materialReferences[0].material;\n                            m_currentMaterialIndex = 0;\n                            //Debug.Log(\"<font=Default> assigning Font Asset [\" + m_currentFontAsset.name + \"] with Material [\" + m_currentMaterial.name + \"].\");\n\n                            m_fontScale = (m_currentFontSize / m_currentFontAsset.faceInfo.pointSize * m_currentFontAsset.faceInfo.scale * (m_isOrthographic ? 1 : 0.1f));\n\n                            m_materialReferenceStack.Add(m_materialReferences[0]);\n\n                            return true;\n                        }\n\n                        TMP_FontAsset tempFont;\n                        Material tempMaterial;\n\n                        // HANDLE NEW FONT ASSET\n                        if (MaterialReferenceManager.TryGetFontAsset(fontHashCode, out tempFont))\n                        {\n                            //if (tempFont != m_currentFontAsset)\n                            //{\n                            //    //Debug.Log(\"Assigning Font Asset: \" + tempFont.name);\n                            //    m_currentFontAsset = tempFont;\n                            //    m_fontScale = (m_currentFontSize / m_currentFontAsset.fontInfo.PointSize * m_currentFontAsset.fontInfo.Scale * (m_isOrthographic ? 1 : 0.1f));\n                            //}\n                        }\n                        else\n                        {\n                            // Load Font Asset\n                            tempFont = Resources.Load<TMP_FontAsset>(TMP_Settings.defaultFontAssetPath + new string(m_htmlTag, m_xmlAttribute[0].valueStartIndex, m_xmlAttribute[0].valueLength));\n\n                            if (tempFont == null)\n                                return false;\n\n                            // Add new reference to the font asset as well as default material to the MaterialReferenceManager\n                            MaterialReferenceManager.AddFontAsset(tempFont);\n                        }\n\n\n                        // HANDLE NEW MATERIAL\n                        if (materialAttributeHashCode == 0 && materialHashCode == 0)\n                        {\n                            // No material specified then use default font asset material.\n                            m_currentMaterial = tempFont.material;\n\n                            m_currentMaterialIndex = MaterialReference.AddMaterialReference(m_currentMaterial, tempFont, m_materialReferences, m_materialReferenceIndexLookup);\n\n                            m_materialReferenceStack.Add(m_materialReferences[m_currentMaterialIndex]);\n                        }\n                        else if (materialAttributeHashCode == 103415287 || materialAttributeHashCode == 72669687) // using material attribute\n                        {\n                            if (MaterialReferenceManager.TryGetMaterial(materialHashCode, out tempMaterial))\n                            {\n                                m_currentMaterial = tempMaterial;\n\n                                m_currentMaterialIndex = MaterialReference.AddMaterialReference(m_currentMaterial, tempFont, m_materialReferences, m_materialReferenceIndexLookup);\n\n                                m_materialReferenceStack.Add(m_materialReferences[m_currentMaterialIndex]);\n                            }\n                            else\n                            {\n                                // Load new material\n                                tempMaterial = Resources.Load<Material>(TMP_Settings.defaultFontAssetPath + new string(m_htmlTag, m_xmlAttribute[1].valueStartIndex, m_xmlAttribute[1].valueLength));\n\n                                if (tempMaterial == null)\n                                    return false;\n\n                                // Add new reference to this material in the MaterialReferenceManager\n                                MaterialReferenceManager.AddFontMaterial(materialHashCode, tempMaterial);\n\n                                m_currentMaterial = tempMaterial;\n\n                                m_currentMaterialIndex = MaterialReference.AddMaterialReference(m_currentMaterial, tempFont, m_materialReferences, m_materialReferenceIndexLookup);\n\n                                m_materialReferenceStack.Add(m_materialReferences[m_currentMaterialIndex]);\n                            }\n                        }\n                        else\n                            return false;\n\n                        m_currentFontAsset = tempFont;\n                        m_fontScale = (m_currentFontSize / m_currentFontAsset.faceInfo.pointSize * m_currentFontAsset.faceInfo.scale * (m_isOrthographic ? 1 : 0.1f));\n\n                        return true;\n                    case 154158: // </font>\n                    case 141358: // </FONT>\n                        {\n                            MaterialReference materialReference = m_materialReferenceStack.Remove();\n\n                            m_currentFontAsset = materialReference.fontAsset;\n                            m_currentMaterial = materialReference.material;\n                            m_currentMaterialIndex = materialReference.index;\n\n                            m_fontScale = (m_currentFontSize / m_currentFontAsset.faceInfo.pointSize * m_currentFontAsset.faceInfo.scale * (m_isOrthographic ? 1 : 0.1f));\n\n                            return true;\n                        }\n                    case 103415287: // <material=\"material name\">\n                    case 72669687: // <MATERIAL>\n                        materialHashCode = m_xmlAttribute[0].valueHashCode;\n\n                        // Special handling for <material=default> or <material=Default>\n                        if (materialHashCode == 764638571 || materialHashCode == 523367755)\n                        {\n                            // Check if material font atlas texture matches that of the current font asset.\n                            //if (m_currentFontAsset.atlas.GetInstanceID() != m_currentMaterial.GetTexture(ShaderUtilities.ID_MainTex).GetInstanceID()) return false;\n\n                            m_currentMaterial = m_materialReferences[0].material;\n                            m_currentMaterialIndex = 0;\n\n                            m_materialReferenceStack.Add(m_materialReferences[0]);\n\n                            return true;\n                        }\n\n\n                        // Check if material \n                        if (MaterialReferenceManager.TryGetMaterial(materialHashCode, out tempMaterial))\n                        {\n                            // Check if material font atlas texture matches that of the current font asset.\n                            //if (m_currentFontAsset.atlas.GetInstanceID() != tempMaterial.GetTexture(ShaderUtilities.ID_MainTex).GetInstanceID()) return false;\n\n                            m_currentMaterial = tempMaterial;\n\n                            m_currentMaterialIndex = MaterialReference.AddMaterialReference(m_currentMaterial, m_currentFontAsset, m_materialReferences, m_materialReferenceIndexLookup);\n\n                            m_materialReferenceStack.Add(m_materialReferences[m_currentMaterialIndex]);\n                        }\n                        else\n                        {\n                            // Load new material\n                            tempMaterial = Resources.Load<Material>(TMP_Settings.defaultFontAssetPath + new string(m_htmlTag, m_xmlAttribute[0].valueStartIndex, m_xmlAttribute[0].valueLength));\n\n                            if (tempMaterial == null)\n                                return false;\n\n                            // Check if material font atlas texture matches that of the current font asset.\n                            //if (m_currentFontAsset.atlas.GetInstanceID() != tempMaterial.GetTexture(ShaderUtilities.ID_MainTex).GetInstanceID()) return false;\n\n                            // Add new reference to this material in the MaterialReferenceManager\n                            MaterialReferenceManager.AddFontMaterial(materialHashCode, tempMaterial);\n\n                            m_currentMaterial = tempMaterial;\n\n                            m_currentMaterialIndex = MaterialReference.AddMaterialReference(m_currentMaterial, m_currentFontAsset , m_materialReferences, m_materialReferenceIndexLookup);\n\n                            m_materialReferenceStack.Add(m_materialReferences[m_currentMaterialIndex]);\n                        }\n                        return true;\n                    case 374360934: // </material>\n                    case 343615334: // </MATERIAL>\n                        {\n                            //if (m_currentMaterial.GetTexture(ShaderUtilities.ID_MainTex).GetInstanceID() != m_materialReferenceStack.PreviousItem().material.GetTexture(ShaderUtilities.ID_MainTex).GetInstanceID())\n                            //    return false;\n\n                            MaterialReference materialReference = m_materialReferenceStack.Remove();\n\n                            m_currentMaterial = materialReference.material;\n                            m_currentMaterialIndex = materialReference.index;\n\n                            return true;\n                        }\n                    case 320078: // <space=000.00>\n                    case 230446: // <SPACE>\n                        value = ConvertToFloat(m_htmlTag, m_xmlAttribute[0].valueStartIndex, m_xmlAttribute[0].valueLength);\n                        if (value == -9999) return false;\n\n                        switch (tagUnitType)\n                        {\n                            case TagUnitType.Pixels:\n                                m_xAdvance += value * (m_isOrthographic ? 1 : 0.1f);\n                                return true;\n                            case TagUnitType.FontUnits:\n                                m_xAdvance += value * (m_isOrthographic ? 1 : 0.1f) * m_currentFontSize;\n                                return true;\n                            case TagUnitType.Percentage:\n                                // Not applicable\n                                return false;\n                        }\n                        return false;\n                    case 276254: // <alpha=#FF>\n                    case 186622: // <ALPHA>\n                        if (m_xmlAttribute[0].valueLength != 3) return false;\n\n                        m_htmlColor.a = (byte)(HexToInt(m_htmlTag[7]) * 16 + HexToInt(m_htmlTag[8]));\n                        return true;\n\n                    case 1750458: // <a name=\" \">\n                        return false;\n                    case 426: // </a>\n                        return true;\n                    case 43066: // <link=\"name\">\n                    case 30266: // <LINK>\n                        if (m_isParsingText && !m_isCalculatingPreferredValues)\n                        {\n                            int index = m_textInfo.linkCount;\n\n                            if (index + 1 > m_textInfo.linkInfo.Length)\n                                TMP_TextInfo.Resize(ref m_textInfo.linkInfo, index + 1);\n\n                            m_textInfo.linkInfo[index].textComponent = this;\n                            m_textInfo.linkInfo[index].hashCode = m_xmlAttribute[0].valueHashCode;\n                            m_textInfo.linkInfo[index].linkTextfirstCharacterIndex = m_characterCount;\n\n                            m_textInfo.linkInfo[index].linkIdFirstCharacterIndex = startIndex + m_xmlAttribute[0].valueStartIndex;\n                            m_textInfo.linkInfo[index].linkIdLength = m_xmlAttribute[0].valueLength;\n                            m_textInfo.linkInfo[index].SetLinkID(m_htmlTag, m_xmlAttribute[0].valueStartIndex, m_xmlAttribute[0].valueLength);\n                        }\n                        return true;\n                    case 155913: // </link>\n                    case 143113: // </LINK>\n                        if (m_isParsingText && !m_isCalculatingPreferredValues)\n                        {\n                            if (m_textInfo.linkCount < m_textInfo.linkInfo.Length)\n                            {\n                                m_textInfo.linkInfo[m_textInfo.linkCount].linkTextLength = m_characterCount - m_textInfo.linkInfo[m_textInfo.linkCount].linkTextfirstCharacterIndex;\n\n                                m_textInfo.linkCount += 1;\n                            }\n                        }\n                        return true;\n                    case 275917: // <align=>\n                    case 186285: // <ALIGN>\n                        switch (m_xmlAttribute[0].valueHashCode)\n                        {\n                            case 3774683: // <align=left>\n                                m_lineJustification = TextAlignmentOptions.Left;\n                                m_lineJustificationStack.Add(m_lineJustification);\n                                return true;\n                            case 136703040: // <align=right>\n                                m_lineJustification = TextAlignmentOptions.Right;\n                                m_lineJustificationStack.Add(m_lineJustification);\n                                return true;\n                            case -458210101: // <align=center>\n                                m_lineJustification = TextAlignmentOptions.Center;\n                                m_lineJustificationStack.Add(m_lineJustification);\n                                return true;\n                            case -523808257: // <align=justified>\n                                m_lineJustification = TextAlignmentOptions.Justified;\n                                m_lineJustificationStack.Add(m_lineJustification);\n                                return true;\n                            case 122383428: // <align=flush>\n                                m_lineJustification = TextAlignmentOptions.Flush;\n                                m_lineJustificationStack.Add(m_lineJustification);\n                                return true;\n                        }\n                        return false;\n                    case 1065846: // </align>\n                    case 976214: // </ALIGN>\n                        m_lineJustification = m_lineJustificationStack.Remove();\n                        return true;\n                    case 327550: // <width=xx>\n                    case 237918: // <WIDTH>\n                        value = ConvertToFloat(m_htmlTag, m_xmlAttribute[0].valueStartIndex, m_xmlAttribute[0].valueLength);\n                        if (value == -9999) return false;\n\n                        switch (tagUnitType)\n                        {\n                            case TagUnitType.Pixels:\n                                m_width = value * (m_isOrthographic ? 1 : 0.1f);\n                                break;\n                            case TagUnitType.FontUnits:\n                                return false;\n                            //break;\n                            case TagUnitType.Percentage:\n                                m_width = m_marginWidth * value / 100;\n                                break;\n                        }\n                        return true;\n                    case 1117479: // </width>\n                    case 1027847: // </WIDTH>\n                        m_width = -1;\n                        return true;\n                    // STYLE tag is now handled inline and replaced by its definition.\n                    //case 322689: // <style=\"name\">\n                    //case 233057: // <STYLE>\n                    //    TMP_Style style = TMP_StyleSheet.GetStyle(m_xmlAttribute[0].valueHashCode);\n\n                    //    if (style == null) return false;\n\n                    //    m_styleStack.Add(style.hashCode);\n\n                    //    // Parse Style Macro\n                    //    for (int i = 0; i < style.styleOpeningTagArray.Length; i++)\n                    //    {\n                    //        if (style.styleOpeningTagArray[i] == 60)\n                    //        {\n                    //            if (ValidateHtmlTag(style.styleOpeningTagArray, i + 1, out i) == false) return false;\n                    //        }\n                    //    }\n                    //    return true;\n                    //case 1112618: // </style>\n                    //case 1022986: // </STYLE>\n                    //    style = TMP_StyleSheet.GetStyle(m_xmlAttribute[0].valueHashCode);\n\n                    //    if (style == null)\n                    //    {\n                    //        // Get style from the Style Stack\n                    //        int styleHashCode = m_styleStack.CurrentItem();\n                    //        style = TMP_StyleSheet.GetStyle(styleHashCode);\n\n                    //        m_styleStack.Remove();\n                    //    }\n\n                    //    if (style == null) return false;\n                    //    //// Parse Style Macro\n                    //    for (int i = 0; i < style.styleClosingTagArray.Length; i++)\n                    //    {\n                    //        if (style.styleClosingTagArray[i] == 60)\n                    //            ValidateHtmlTag(style.styleClosingTagArray, i + 1, out i);\n                    //    }\n                    //    return true;\n                    case 281955: // <color> <color=#FF00FF> or <color=#FF00FF00>\n                    case 192323: // <COLOR=#FF00FF>\n                        // <color=#FFF> 3 Hex (short hand)\n                        if (m_htmlTag[6] == 35 && tagCharCount == 10)\n                        {\n                            m_htmlColor = HexCharsToColor(m_htmlTag, tagCharCount);\n                            m_colorStack.Add(m_htmlColor);\n                            return true;\n                        }\n                        // <color=#FFF7> 4 Hex (short hand)\n                        else if (m_htmlTag[6] == 35 && tagCharCount == 11)\n                        {\n                            m_htmlColor = HexCharsToColor(m_htmlTag, tagCharCount);\n                            m_colorStack.Add(m_htmlColor);\n                            return true;\n                        }\n                        // <color=#FF00FF> 3 Hex pairs\n                        if (m_htmlTag[6] == 35 && tagCharCount == 13)\n                        {\n                            m_htmlColor = HexCharsToColor(m_htmlTag, tagCharCount);\n                            m_colorStack.Add(m_htmlColor);\n                            return true;\n                        }\n                        // <color=#FF00FF00> 4 Hex pairs\n                        else if (m_htmlTag[6] == 35 && tagCharCount == 15)\n                        {\n                            m_htmlColor = HexCharsToColor(m_htmlTag, tagCharCount);\n                            m_colorStack.Add(m_htmlColor);\n                            return true;\n                        }\n\n                        // <color=name>\n                        switch (m_xmlAttribute[0].valueHashCode)\n                        {\n                            case 125395: // <color=red>\n                                m_htmlColor = Color.red;\n                                m_colorStack.Add(m_htmlColor);\n                                return true;\n                            case 3573310: // <color=blue>\n                                m_htmlColor = Color.blue;\n                                m_colorStack.Add(m_htmlColor);\n                                return true;\n                            case 117905991: // <color=black>\n                                m_htmlColor = Color.black;\n                                m_colorStack.Add(m_htmlColor);\n                                return true;\n                            case 121463835: // <color=green>\n                                m_htmlColor = Color.green;\n                                m_colorStack.Add(m_htmlColor);\n                                return true;\n                            case 140357351: // <color=white>\n                                m_htmlColor = Color.white;\n                                m_colorStack.Add(m_htmlColor);\n                                return true;\n                            case 26556144: // <color=orange>\n                                m_htmlColor = new Color32(255, 128, 0, 255);\n                                m_colorStack.Add(m_htmlColor);\n                                return true;\n                            case -36881330: // <color=purple>\n                                m_htmlColor = new Color32(160, 32, 240, 255);\n                                m_colorStack.Add(m_htmlColor);\n                                return true;\n                            case 554054276: // <color=yellow>\n                                m_htmlColor = Color.yellow;\n                                m_colorStack.Add(m_htmlColor);\n                                return true;\n                        }\n                        return false;\n\n                    case 100149144: //<gradient>\n                    case 69403544:  // <GRADIENT>\n                        int gradientPresetHashCode = m_xmlAttribute[0].valueHashCode;\n                        TMP_ColorGradient tempColorGradientPreset;\n\n                        // Check if Color Gradient Preset has already been loaded.\n                        if (MaterialReferenceManager.TryGetColorGradientPreset(gradientPresetHashCode, out tempColorGradientPreset))\n                        {\n                            m_colorGradientPreset = tempColorGradientPreset;\n                        }\n                        else\n                        {\n                            // Load Color Gradient Preset\n                            if (tempColorGradientPreset == null)\n                            {\n                                tempColorGradientPreset = Resources.Load<TMP_ColorGradient>(TMP_Settings.defaultColorGradientPresetsPath + new string(m_htmlTag, m_xmlAttribute[0].valueStartIndex, m_xmlAttribute[0].valueLength));\n                            }\n\n                            if (tempColorGradientPreset == null)\n                                return false;\n\n                            MaterialReferenceManager.AddColorGradientPreset(gradientPresetHashCode, tempColorGradientPreset);\n                            m_colorGradientPreset = tempColorGradientPreset;\n                        }\n\n                        m_colorGradientStack.Add(m_colorGradientPreset);\n\n                        // TODO : Add support for defining preset in the tag itself\n\n                        return true;\n\n                    case 371094791: // </gradient>\n                    case 340349191: // </GRADIENT>\n                        m_colorGradientPreset = m_colorGradientStack.Remove();\n                        return true;\n\n                    case 1983971: // <cspace=xx.x>\n                    case 1356515: // <CSPACE>\n                        value = ConvertToFloat(m_htmlTag, m_xmlAttribute[0].valueStartIndex, m_xmlAttribute[0].valueLength);\n                        if (value == -9999) return false;\n\n                        switch (tagUnitType)\n                        {\n                            case TagUnitType.Pixels:\n                                m_cSpacing = value * (m_isOrthographic ? 1 : 0.1f);\n                                break;\n                            case TagUnitType.FontUnits:\n                                m_cSpacing = value * (m_isOrthographic ? 1 : 0.1f) * m_currentFontSize;\n                                break;\n                            case TagUnitType.Percentage:\n                                return false;\n                        }\n                        return true;\n                    case 7513474: // </cspace>\n                    case 6886018: // </CSPACE>\n                        if (!m_isParsingText) return true;\n\n                        // Adjust xAdvance to remove extra space from last character.\n                        if (m_characterCount > 0)\n                        {\n                            m_xAdvance -= m_cSpacing;\n                            m_textInfo.characterInfo[m_characterCount - 1].xAdvance = m_xAdvance;\n                        }\n                        m_cSpacing = 0;\n                        return true;\n                    case 2152041: // <mspace=xx.x>\n                    case 1524585: // <MSPACE>\n                        value = ConvertToFloat(m_htmlTag, m_xmlAttribute[0].valueStartIndex, m_xmlAttribute[0].valueLength);\n                        if (value == -9999) return false;\n\n                        switch (tagUnitType)\n                        {\n                            case TagUnitType.Pixels:\n                                m_monoSpacing = value * (m_isOrthographic ? 1 : 0.1f);\n                                break;\n                            case TagUnitType.FontUnits:\n                                m_monoSpacing = value * (m_isOrthographic ? 1 : 0.1f) * m_currentFontSize;\n                                break;\n                            case TagUnitType.Percentage:\n                                return false;\n                        }\n                        return true;\n                    case 7681544: // </mspace>\n                    case 7054088: // </MSPACE>\n                        m_monoSpacing = 0;\n                        return true;\n                    case 280416: // <class=\"name\">\n                        return false;\n                    case 1071884: // </color>\n                    case 982252: // </COLOR>\n                        m_htmlColor = m_colorStack.Remove();\n                        return true;\n                    case 2068980: // <indent=10px> <indent=10em> <indent=50%>\n                    case 1441524: // <INDENT>\n                        value = ConvertToFloat(m_htmlTag, m_xmlAttribute[0].valueStartIndex, m_xmlAttribute[0].valueLength);\n                        if (value == -9999) return false;\n\n                        switch (tagUnitType)\n                        {\n                            case TagUnitType.Pixels:\n                                tag_Indent = value * (m_isOrthographic ? 1 : 0.1f);\n                                break;\n                            case TagUnitType.FontUnits:\n                                tag_Indent = value * (m_isOrthographic ? 1 : 0.1f) * m_currentFontSize;\n                                break;\n                            case TagUnitType.Percentage:\n                                tag_Indent = m_marginWidth * value / 100;\n                                break;\n                        }\n                        m_indentStack.Add(tag_Indent);\n\n                        m_xAdvance = tag_Indent;\n                        return true;\n                    case 7598483: // </indent>\n                    case 6971027: // </INDENT>\n                        tag_Indent = m_indentStack.Remove();\n                        //m_xAdvance = tag_Indent;\n                        return true;\n                    case 1109386397: // <line-indent>\n                    case -842656867: // <LINE-INDENT>\n                        value = ConvertToFloat(m_htmlTag, m_xmlAttribute[0].valueStartIndex, m_xmlAttribute[0].valueLength);\n                        if (value == -9999) return false;\n\n                        switch (tagUnitType)\n                        {\n                            case TagUnitType.Pixels:\n                                tag_LineIndent = value * (m_isOrthographic ? 1 : 0.1f);\n                                break;\n                            case TagUnitType.FontUnits:\n                                tag_LineIndent = value * (m_isOrthographic ? 1 : 0.1f) * m_currentFontSize;\n                                break;\n                            case TagUnitType.Percentage:\n                                tag_LineIndent = m_marginWidth * value / 100;\n                                break;\n                        }\n\n                        m_xAdvance += tag_LineIndent;\n                        return true;\n                    case -445537194: // </line-indent>\n                    case 1897386838: // </LINE-INDENT>\n                        tag_LineIndent = 0;\n                        return true;\n                    case 2246877: // <sprite=x>\n                    case 1619421: // <SPRITE>\n                        int spriteAssetHashCode = m_xmlAttribute[0].valueHashCode;\n                        TMP_SpriteAsset tempSpriteAsset;\n                        m_spriteIndex = -1;\n\n                        // CHECK TAG FORMAT\n                        if (m_xmlAttribute[0].valueType == TagValueType.None || m_xmlAttribute[0].valueType == TagValueType.NumericalValue)\n                        {\n                            // No Sprite Asset is assigned to the text object\n                            if (m_spriteAsset != null)\n                            {\n                                m_currentSpriteAsset = m_spriteAsset;\n                            }\n                            else if (m_defaultSpriteAsset != null)\n                            {\n                                m_currentSpriteAsset = m_defaultSpriteAsset;\n                            }\n                            else if (m_defaultSpriteAsset == null)\n                            {\n                                if (TMP_Settings.defaultSpriteAsset != null)\n                                    m_defaultSpriteAsset = TMP_Settings.defaultSpriteAsset;\n                                else\n                                    m_defaultSpriteAsset = Resources.Load<TMP_SpriteAsset>(\"Sprite Assets/Default Sprite Asset\");\n\n                                m_currentSpriteAsset = m_defaultSpriteAsset;\n                            }\n\n                            // No valid sprite asset available\n                            if (m_currentSpriteAsset == null)\n                                return false;\n                        }\n                        else\n                        {\n                            // A Sprite Asset has been specified\n                            if (MaterialReferenceManager.TryGetSpriteAsset(spriteAssetHashCode, out tempSpriteAsset))\n                            {\n                                m_currentSpriteAsset = tempSpriteAsset;\n                            }\n                            else\n                            {\n                                // Load Sprite Asset\n                                if (tempSpriteAsset == null)\n                                {\n                                    tempSpriteAsset = Resources.Load<TMP_SpriteAsset>(TMP_Settings.defaultSpriteAssetPath + new string(m_htmlTag, m_xmlAttribute[0].valueStartIndex, m_xmlAttribute[0].valueLength));\n                                }\n\n                                if (tempSpriteAsset == null)\n                                    return false;\n\n                                //Debug.Log(\"Loading & assigning new Sprite Asset: \" + tempSpriteAsset.name);\n                                MaterialReferenceManager.AddSpriteAsset(spriteAssetHashCode, tempSpriteAsset);\n                                m_currentSpriteAsset = tempSpriteAsset;\n                            }\n                        }\n\n                        // Handling of <sprite=index> legacy tag format.\n                        if (m_xmlAttribute[0].valueType == TagValueType.NumericalValue) // <sprite=index>\n                        {\n                            int index = (int)ConvertToFloat(m_htmlTag, m_xmlAttribute[0].valueStartIndex, m_xmlAttribute[0].valueLength);\n                            if (index == -9999) return false;\n\n                            // Check to make sure sprite index is valid\n                            if (index > m_currentSpriteAsset.spriteCharacterTable.Count - 1) return false;\n\n                            m_spriteIndex = index;\n                        }\n\n                        m_spriteColor = s_colorWhite;\n                        m_tintSprite = false;\n\n                        // Handle Sprite Tag Attributes\n                        for (int i = 0; i < m_xmlAttribute.Length && m_xmlAttribute[i].nameHashCode != 0; i++)\n                        {\n                            //Debug.Log(\"Attribute[\" + i + \"].nameHashCode=\" + m_xmlAttribute[i].nameHashCode + \"   Value:\" + ConvertToFloat(m_htmlTag, m_xmlAttribute[i].valueStartIndex, m_xmlAttribute[i].valueLength));\n                            int nameHashCode = m_xmlAttribute[i].nameHashCode;\n                            int index = 0;\n\n                            switch (nameHashCode)\n                            {\n                                case 43347: // <sprite name=\"\">\n                                case 30547: // <SPRITE NAME=\"\">\n                                    m_currentSpriteAsset = TMP_SpriteAsset.SearchForSpriteByHashCode(m_currentSpriteAsset, m_xmlAttribute[i].valueHashCode, true, out index);\n                                    if (index == -1) return false;\n\n                                    m_spriteIndex = index;\n                                    break;\n                                case 295562: // <sprite index=>\n                                case 205930: // <SPRITE INDEX=>\n                                    index = (int)ConvertToFloat(m_htmlTag, m_xmlAttribute[1].valueStartIndex, m_xmlAttribute[1].valueLength);\n                                    if (index == -9999) return false;\n\n                                    // Check to make sure sprite index is valid\n                                    if (index > m_currentSpriteAsset.spriteCharacterTable.Count - 1) return false;\n\n                                    m_spriteIndex = index;\n                                    break;\n                                case 45819: // tint\n                                case 33019: // TINT\n                                    m_tintSprite = ConvertToFloat(m_htmlTag, m_xmlAttribute[i].valueStartIndex, m_xmlAttribute[i].valueLength) != 0;\n                                    break;\n                                case 281955: // color=#FF00FF80\n                                case 192323: // COLOR\n                                    m_spriteColor = HexCharsToColor(m_htmlTag, m_xmlAttribute[i].valueStartIndex, m_xmlAttribute[i].valueLength);\n                                    break;\n                                case 39505: // anim=\"0,16,12\"  start, end, fps\n                                case 26705: // ANIM\n                                    //Debug.Log(\"Start: \" + m_xmlAttribute[i].valueStartIndex + \"  Length: \" + m_xmlAttribute[i].valueLength);\n                                    int paramCount = GetAttributeParameters(m_htmlTag, m_xmlAttribute[i].valueStartIndex, m_xmlAttribute[i].valueLength, ref m_attributeParameterValues);\n                                    if (paramCount != 3) return false;\n\n                                    m_spriteIndex = (int)m_attributeParameterValues[0];\n\n                                    if (m_isParsingText)\n                                    {\n                                        // TODO : fix this!\n                                        //if (m_attributeParameterValues[0] > m_currentSpriteAsset.spriteInfoList.Count - 1 || m_attributeParameterValues[1] > m_currentSpriteAsset.spriteInfoList.Count - 1)\n                                        //    return false;\n\n                                        spriteAnimator.DoSpriteAnimation(m_characterCount, m_currentSpriteAsset, m_spriteIndex, (int)m_attributeParameterValues[1], (int)m_attributeParameterValues[2]);\n                                    }\n\n                                    break;\n                                //case 45545: // size\n                                //case 32745: // SIZE\n\n                                //    break;\n                                default:\n                                    if (nameHashCode != 2246877 && nameHashCode != 1619421)\n                                        return false;\n                                    break;\n                            }\n                        }\n\n                        if (m_spriteIndex == -1) return false;\n\n                        // Material HashCode for the Sprite Asset is the Sprite Asset Hash Code\n                        m_currentMaterialIndex = MaterialReference.AddMaterialReference(m_currentSpriteAsset.material, m_currentSpriteAsset, m_materialReferences, m_materialReferenceIndexLookup);\n\n                        m_textElementType = TMP_TextElementType.Sprite;\n                        return true;\n                    case 730022849: // <lowercase>\n                    case 514803617: // <LOWERCASE>\n                        m_FontStyleInternal |= FontStyles.LowerCase;\n                        m_fontStyleStack.Add(FontStyles.LowerCase);\n                        return true;\n                    case -1668324918: // </lowercase>\n                    case -1883544150: // </LOWERCASE>\n                        if ((m_fontStyle & FontStyles.LowerCase) != FontStyles.LowerCase)\n                        {\n                            if (m_fontStyleStack.Remove(FontStyles.LowerCase) == 0)\n                                m_FontStyleInternal &= ~FontStyles.LowerCase;\n                        }\n                        return true;\n                    case 13526026: // <allcaps>\n                    case 9133802: // <ALLCAPS>\n                    case 781906058: // <uppercase>\n                    case 566686826: // <UPPERCASE>\n                        m_FontStyleInternal |= FontStyles.UpperCase;\n                        m_fontStyleStack.Add(FontStyles.UpperCase);\n                        return true;\n                    case 52232547: // </allcaps>\n                    case 47840323: // </ALLCAPS>\n                    case -1616441709: // </uppercase>\n                    case -1831660941: // </UPPERCASE>\n                        if ((m_fontStyle & FontStyles.UpperCase) != FontStyles.UpperCase)\n                        {\n                            if (m_fontStyleStack.Remove(FontStyles.UpperCase) == 0)\n                                m_FontStyleInternal &= ~FontStyles.UpperCase;\n                        }\n                        return true;\n                    case 766244328: // <smallcaps>\n                    case 551025096: // <SMALLCAPS>\n                        m_FontStyleInternal |= FontStyles.SmallCaps;\n                        m_fontStyleStack.Add(FontStyles.SmallCaps);\n                        return true;\n                    case -1632103439: // </smallcaps>\n                    case -1847322671: // </SMALLCAPS>\n                        if ((m_fontStyle & FontStyles.SmallCaps) != FontStyles.SmallCaps)\n                        {\n                            if (m_fontStyleStack.Remove(FontStyles.SmallCaps) == 0)\n                                m_FontStyleInternal &= ~FontStyles.SmallCaps;\n                        }\n                        return true;\n                    case 2109854: // <margin=00.0> <margin=00em> <margin=50%>\n                    case 1482398: // <MARGIN>\n                        // Check value type\n                        switch (m_xmlAttribute[0].valueType)\n                        {\n                            case TagValueType.NumericalValue:\n                                value = ConvertToFloat(m_htmlTag, m_xmlAttribute[0].valueStartIndex, m_xmlAttribute[0].valueLength); // px\n                                if (value == -9999) return false;\n\n                                // Determine tag unit type\n                                switch (tagUnitType)\n                                {\n                                    case TagUnitType.Pixels:\n                                        m_marginLeft = value * (m_isOrthographic ? 1 : 0.1f);\n                                        break;\n                                    case TagUnitType.FontUnits:\n                                        m_marginLeft = value * (m_isOrthographic ? 1 : 0.1f) * m_currentFontSize;\n                                        break;\n                                    case TagUnitType.Percentage:\n                                        m_marginLeft = (m_marginWidth - (m_width != -1 ? m_width : 0)) * value / 100;\n                                        break;\n                                }\n                                m_marginLeft = m_marginLeft >= 0 ? m_marginLeft : 0;\n                                m_marginRight = m_marginLeft;\n                                return true;\n\n                            case TagValueType.None:\n                                for (int i = 1; i < m_xmlAttribute.Length && m_xmlAttribute[i].nameHashCode != 0; i++)\n                                {\n                                    // Get attribute name\n                                    int nameHashCode = m_xmlAttribute[i].nameHashCode;\n\n                                    switch (nameHashCode)\n                                    {\n                                        case 42823:  // <margin left=value>\n                                            value = ConvertToFloat(m_htmlTag, m_xmlAttribute[i].valueStartIndex, m_xmlAttribute[i].valueLength); // px\n                                            if (value == -9999) return false;\n\n                                            switch (m_xmlAttribute[i].unitType)\n                                            {\n                                                case TagUnitType.Pixels:\n                                                    m_marginLeft = value * (m_isOrthographic ? 1 : 0.1f);\n                                                    break;\n                                                case TagUnitType.FontUnits:\n                                                    m_marginLeft = value * (m_isOrthographic ? 1 : 0.1f) * m_currentFontSize;\n                                                    break;\n                                                case TagUnitType.Percentage:\n                                                    m_marginLeft = (m_marginWidth - (m_width != -1 ? m_width : 0)) * value / 100;\n                                                    break;\n                                            }\n                                            m_marginLeft = m_marginLeft >= 0 ? m_marginLeft : 0;\n                                            break;\n\n                                        case 315620: // <margin right=value>\n                                            value = ConvertToFloat(m_htmlTag, m_xmlAttribute[i].valueStartIndex, m_xmlAttribute[i].valueLength); // px\n                                            if (value == -9999) return false;\n\n                                            switch (m_xmlAttribute[i].unitType)\n                                            {\n                                                case TagUnitType.Pixels:\n                                                    m_marginRight = value * (m_isOrthographic ? 1 : 0.1f);\n                                                    break;\n                                                case TagUnitType.FontUnits:\n                                                    m_marginRight = value * (m_isOrthographic ? 1 : 0.1f) * m_currentFontSize;\n                                                    break;\n                                                case TagUnitType.Percentage:\n                                                    m_marginRight = (m_marginWidth - (m_width != -1 ? m_width : 0)) * value / 100;\n                                                    break;\n                                            }\n                                            m_marginRight = m_marginRight >= 0 ? m_marginRight : 0;\n                                            break;\n                                    }\n                                }\n                                return true;\n                        }\n\n                        return false;\n                    case 7639357: // </margin>\n                    case 7011901: // </MARGIN>\n                        m_marginLeft = 0;\n                        m_marginRight = 0;\n                        return true;\n                    case 1100728678: // <margin-left=xx.x>\n                    case -855002522: // <MARGIN-LEFT>\n                        value = ConvertToFloat(m_htmlTag, m_xmlAttribute[0].valueStartIndex, m_xmlAttribute[0].valueLength); // px\n                        if (value == -9999) return false;\n\n                        switch (tagUnitType)\n                        {\n                            case TagUnitType.Pixels:\n                                m_marginLeft = value * (m_isOrthographic ? 1 : 0.1f);\n                                break;\n                            case TagUnitType.FontUnits:\n                                m_marginLeft = value * (m_isOrthographic ? 1 : 0.1f) * m_currentFontSize;\n                                break;\n                            case TagUnitType.Percentage:\n                                m_marginLeft = (m_marginWidth - (m_width != -1 ? m_width : 0)) * value / 100;\n                                break;\n                        }\n                        m_marginLeft = m_marginLeft >= 0 ? m_marginLeft : 0;\n                        return true;\n                    case -884817987: // <margin-right=xx.x>\n                    case -1690034531: // <MARGIN-RIGHT>\n                        value = ConvertToFloat(m_htmlTag, m_xmlAttribute[0].valueStartIndex, m_xmlAttribute[0].valueLength); // px\n                        if (value == -9999) return false;\n\n                        switch (tagUnitType)\n                        {\n                            case TagUnitType.Pixels:\n                                m_marginRight = value * (m_isOrthographic ? 1 : 0.1f);\n                                break;\n                            case TagUnitType.FontUnits:\n                                m_marginRight = value * (m_isOrthographic ? 1 : 0.1f) * m_currentFontSize;\n                                break;\n                            case TagUnitType.Percentage:\n                                m_marginRight = (m_marginWidth - (m_width != -1 ? m_width : 0)) * value / 100;\n                                break;\n                        }\n                        m_marginRight = m_marginRight >= 0 ? m_marginRight : 0;\n                        return true;\n                    case 1109349752: // <line-height=xx.x>\n                    case -842693512: // <LINE-HEIGHT>\n                        value = ConvertToFloat(m_htmlTag, m_xmlAttribute[0].valueStartIndex, m_xmlAttribute[0].valueLength);\n                        if (value == -9999 || value == 0) return false;\n\n                        switch (tagUnitType)\n                        {\n                            case TagUnitType.Pixels:\n                                m_lineHeight = value * (m_isOrthographic ? 1 : 0.1f); \n                                break;\n                            case TagUnitType.FontUnits:\n                                m_lineHeight = value * (m_isOrthographic ? 1 : 0.1f) * m_currentFontSize;\n                                break;\n                            case TagUnitType.Percentage:\n                                m_lineHeight = m_fontAsset.faceInfo.lineHeight * value / 100 * m_fontScale;\n                                break;\n                        }\n                        return true;\n                    case -445573839: // </line-height>\n                    case 1897350193: // </LINE-HEIGHT>\n                        m_lineHeight = TMP_Math.FLOAT_UNSET;\n                        return true;\n                    case 15115642: // <noparse>\n                    case 10723418: // <NOPARSE>\n                        tag_NoParsing = true;\n                        return true;\n                    case 1913798: // <action>\n                    case 1286342: // <ACTION>\n                        int actionID = m_xmlAttribute[0].valueHashCode;\n\n                        if (m_isParsingText)\n                        {\n                            m_actionStack.Add(actionID);\n\n                            Debug.Log(\"Action ID: [\" + actionID + \"] First character index: \" + m_characterCount);\n\n\n                        }\n                        //if (m_isParsingText)\n                        //{\n                        // TMP_Action action = TMP_Action.GetAction(m_xmlAttribute[0].valueHashCode);\n                        //}\n                        return true;\n                    case 7443301: // </action>\n                    case 6815845: // </ACTION>\n                        if (m_isParsingText)\n                        {\n                            Debug.Log(\"Action ID: [\" + m_actionStack.CurrentItem() + \"] Last character index: \" + (m_characterCount - 1));\n                        }\n\n                        m_actionStack.Remove();\n                        return true;\n                    case 315682: // <scale=xx.x>\n                    case 226050: // <SCALE=xx.x>\n                        value = ConvertToFloat(m_htmlTag, m_xmlAttribute[0].valueStartIndex, m_xmlAttribute[0].valueLength);\n                        if (value == -9999) return false;\n\n                        m_FXMatrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, new Vector3(value, 1, 1));\n                        m_isFXMatrixSet = true;\n\n                        return true;\n                    case 1105611: // </scale>\n                    case 1015979: // </SCALE>\n                        m_isFXMatrixSet = false;\n                        return true;\n                    case 2227963: // <rotate=xx.x>\n                    case 1600507: // <ROTATE=xx.x>\n                        // TODO: Add ability to use Random Rotation\n\n                        value = ConvertToFloat(m_htmlTag, m_xmlAttribute[0].valueStartIndex, m_xmlAttribute[0].valueLength);\n                        if (value == -9999) return false;\n\n                        m_FXMatrix = Matrix4x4.TRS(Vector3.zero, Quaternion.Euler(0, 0, value), Vector3.one);\n                        m_isFXMatrixSet = true;\n\n                        return true;\n                    case 7757466: // </rotate>\n                    case 7130010: // </ROTATE>\n                        m_isFXMatrixSet = false;\n                        return true;\n                    case 317446: // <table>\n                    case 227814: // <TABLE>\n                        switch (m_xmlAttribute[1].nameHashCode)\n                        {\n                            case 327550: // width\n                                float tableWidth = ConvertToFloat(m_htmlTag, m_xmlAttribute[1].valueStartIndex, m_xmlAttribute[1].valueLength);\n\n                                switch (tagUnitType)\n                                {\n                                    case TagUnitType.Pixels:\n                                        Debug.Log(\"Table width = \" + tableWidth + \"px.\");\n                                        break;\n                                    case TagUnitType.FontUnits:\n                                        Debug.Log(\"Table width = \" + tableWidth + \"em.\");\n                                        break;\n                                    case TagUnitType.Percentage:\n                                        Debug.Log(\"Table width = \" + tableWidth + \"%.\");\n                                        break;\n                                }\n                                break;\n                        }\n                        return true;\n                    case 1107375: // </table>\n                    case 1017743: // </TABLE>\n                        return true;\n                    case 926: // <tr>\n                    case 670: // <TR>\n                        return true;\n                    case 3229: // </tr>\n                    case 2973: // </TR>\n                        return true;\n                    case 916: // <th>\n                    case 660: // <TH>\n                        // Set style to bold and center alignment\n                        return true;\n                    case 3219: // </th>\n                    case 2963: // </TH>\n                        return true;\n                    case 912: // <td>\n                    case 656: // <TD>\n                              // Style options\n                        for (int i = 1; i < m_xmlAttribute.Length && m_xmlAttribute[i].nameHashCode != 0; i++)\n                        {\n                            switch (m_xmlAttribute[i].nameHashCode)\n                            {\n                                case 327550: // width\n                                    float tableWidth = ConvertToFloat(m_htmlTag, m_xmlAttribute[i].valueStartIndex, m_xmlAttribute[i].valueLength);\n\n                                    switch (tagUnitType)\n                                    {\n                                        case TagUnitType.Pixels:\n                                            Debug.Log(\"Table width = \" + tableWidth + \"px.\");\n                                            break;\n                                        case TagUnitType.FontUnits:\n                                            Debug.Log(\"Table width = \" + tableWidth + \"em.\");\n                                            break;\n                                        case TagUnitType.Percentage:\n                                            Debug.Log(\"Table width = \" + tableWidth + \"%.\");\n                                            break;\n                                    }\n                                    break;\n                                case 275917: // align\n                                    switch (m_xmlAttribute[i].valueHashCode)\n                                    {\n                                        case 3774683: // left\n                                            Debug.Log(\"TD align=\\\"left\\\".\");\n                                            break;\n                                        case 136703040: // right\n                                            Debug.Log(\"TD align=\\\"right\\\".\");\n                                            break;\n                                        case -458210101: // center\n                                            Debug.Log(\"TD align=\\\"center\\\".\");\n                                            break;\n                                        case -523808257: // justified\n                                            Debug.Log(\"TD align=\\\"justified\\\".\");\n                                            break;\n                                    }\n                                    break;\n                            }\n                        }\n\n                        return true;\n                    case 3215: // </td>\n                    case 2959: // </TD>\n                        return true;\n                }\n            }\n            #endif\n            #endregion\n\n            return false;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_Text.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 5143f58107604835ab1a5efa2d8818fd\ntimeCreated: 1445841744\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_TextElement.cs",
    "content": "﻿using System;\nusing UnityEngine;\nusing UnityEngine.TextCore;\n\nnamespace TMPro\n{\n    public enum TextElementType : byte\n    {\n        Character   = 0x1,\n        Sprite      = 0x2,\n    }\n\n    /// <summary>\n    /// Base class for all text elements like Character and SpriteCharacter.\n    /// </summary>\n    [Serializable]\n    public class TMP_TextElement\n    {\n        /// <summary>\n        /// The type of text element which can be a character or sprite.\n        /// </summary>\n        public TextElementType elementType { get { return m_ElementType; } }\n\n        /// <summary>\n        /// The unicode value (code point) of the character.\n        /// </summary>\n        public uint unicode { get { return m_Unicode; } set { m_Unicode = value; } }\n\n        /// <summary>\n        /// The glyph used by this text element.\n        /// </summary>\n        public Glyph glyph { get { return m_Glyph; } set { m_Glyph = value; } }\n\n        /// <summary>\n        /// The index of the glyph used by this text element.\n        /// </summary>\n        public uint glyphIndex { get { return m_GlyphIndex; } set { m_GlyphIndex = value; } }\n\n        /// <summary>\n        /// The relative scale of the character.\n        /// </summary>\n        public float scale { get { return m_Scale; } set { m_Scale = value; } }\n\n        // =============================================\n        // Private backing fields for public properties.\n        // =============================================\n\n        [SerializeField]\n        protected TextElementType m_ElementType;\n\n        [SerializeField]\n        private uint m_Unicode;\n\n        private Glyph m_Glyph;\n\n        [SerializeField]\n        private uint m_GlyphIndex;\n\n        [SerializeField]\n        private float m_Scale;\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_TextElement.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 543674eec776b1442a192c932e6cd9b3\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_TextElement_Legacy.cs",
    "content": "﻿using UnityEngine;\nusing System;\nusing System.Collections;\n\n\nnamespace TMPro\n{\n\n    /// <summary>\n    /// Base class for all text elements like characters (glyphs) and sprites.\n    /// </summary>\n    [Serializable]\n    public class TMP_TextElement_Legacy\n    {\n        public int id;\n        public float x;\n        public float y;\n        public float width;\n        public float height;\n        public float xOffset;\n        public float yOffset;\n        public float xAdvance;\n        public float scale;\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_TextElement_Legacy.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 87ab1bebe13f41f89d5427e7d2c34d58\ntimeCreated: 1448407070\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_TextInfo.cs",
    "content": "﻿using UnityEngine;\nusing System;\nusing System.Collections;\nusing System.Collections.Generic;\n\n\nnamespace TMPro\n{\n    /// <summary>\n    /// Class which contains information about every element contained within the text object.\n    /// </summary>\n    [Serializable]\n    public class TMP_TextInfo\n    {\n        private static Vector2 k_InfinityVectorPositive = new Vector2(32767, 32767);\n        private static Vector2 k_InfinityVectorNegative = new Vector2(-32767, -32767);\n\n        public TMP_Text textComponent;\n\n        public int characterCount;\n        public int spriteCount;\n        public int spaceCount;\n        public int wordCount;\n        public int linkCount;\n        public int lineCount;\n        public int pageCount;\n\n        public int materialCount;\n\n        public TMP_CharacterInfo[] characterInfo;\n        public TMP_WordInfo[] wordInfo;\n        public TMP_LinkInfo[] linkInfo;\n        public TMP_LineInfo[] lineInfo;\n        public TMP_PageInfo[] pageInfo;\n        public TMP_MeshInfo[] meshInfo;\n\n        private TMP_MeshInfo[] m_CachedMeshInfo;\n\n        // Default Constructor\n        public TMP_TextInfo()\n        {\n            characterInfo = new TMP_CharacterInfo[8];\n            wordInfo = new TMP_WordInfo[16];\n            linkInfo = new TMP_LinkInfo[0];\n            lineInfo = new TMP_LineInfo[2];\n            pageInfo = new TMP_PageInfo[4];\n\n            meshInfo = new TMP_MeshInfo[1];\n        }\n\n\n        public TMP_TextInfo(TMP_Text textComponent)\n        {\n            this.textComponent = textComponent;\n\n            characterInfo = new TMP_CharacterInfo[8];\n\n            wordInfo = new TMP_WordInfo[4];\n            linkInfo = new TMP_LinkInfo[0];\n\n            lineInfo = new TMP_LineInfo[2];\n            pageInfo = new TMP_PageInfo[4];\n\n            meshInfo = new TMP_MeshInfo[1];\n            meshInfo[0].mesh = textComponent.mesh;\n            materialCount = 1;\n        }\n\n\n        /// <summary>\n        /// Function to clear the counters of the text object.\n        /// </summary>\n        public void Clear()\n        {\n            characterCount = 0;\n            spaceCount = 0;\n            wordCount = 0;\n            linkCount = 0;\n            lineCount = 0;\n            pageCount = 0;\n            spriteCount = 0;\n\n            for (int i = 0; i < this.meshInfo.Length; i++)\n            {\n                this.meshInfo[i].vertexCount = 0;\n            }\n        }\n\n\n        /// <summary>\n        /// Function to clear the content of the MeshInfo array while preserving the Triangles, Normals and Tangents.\n        /// </summary>\n        public void ClearMeshInfo(bool updateMesh)\n        {\n            for (int i = 0; i < this.meshInfo.Length; i++)\n                this.meshInfo[i].Clear(updateMesh);\n        }\n\n\n        /// <summary>\n        /// Function to clear the content of all the MeshInfo arrays while preserving their Triangles, Normals and Tangents.\n        /// </summary>\n        public void ClearAllMeshInfo()\n        {\n            for (int i = 0; i < this.meshInfo.Length; i++)\n                this.meshInfo[i].Clear(true);\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        public void ResetVertexLayout(bool isVolumetric)\n        {\n            for (int i = 0; i < this.meshInfo.Length; i++)\n                this.meshInfo[i].ResizeMeshInfo(0, isVolumetric);\n        }\n\n\n        /// <summary>\n        /// Function used to mark unused vertices as degenerate.\n        /// </summary>\n        /// <param name=\"materials\"></param>\n        public void ClearUnusedVertices(MaterialReference[] materials)\n        {\n            for (int i = 0; i < meshInfo.Length; i++)\n            {\n                int start = 0; // materials[i].referenceCount * 4;\n                meshInfo[i].ClearUnusedVertices(start);\n            }\n        }\n\n\n        /// <summary>\n        /// Function to clear and initialize the lineInfo array. \n        /// </summary>\n        public void ClearLineInfo()\n        {\n            if (this.lineInfo == null)\n                this.lineInfo = new TMP_LineInfo[2];\n\n            for (int i = 0; i < this.lineInfo.Length; i++)\n            {\n                this.lineInfo[i].characterCount = 0;\n                this.lineInfo[i].spaceCount = 0;\n                this.lineInfo[i].wordCount = 0;\n                this.lineInfo[i].controlCharacterCount = 0;\n                this.lineInfo[i].width = 0;\n\n                this.lineInfo[i].ascender = k_InfinityVectorNegative.x;\n                this.lineInfo[i].descender = k_InfinityVectorPositive.x;\n\n                this.lineInfo[i].lineExtents.min = k_InfinityVectorPositive;\n                this.lineInfo[i].lineExtents.max = k_InfinityVectorNegative;\n\n                this.lineInfo[i].maxAdvance = 0;\n                //this.lineInfo[i].maxScale = 0;\n\n            }\n        }\n\n\n        /// <summary>\n        /// Function to copy the MeshInfo Arrays and their primary vertex data content.\n        /// </summary>\n        /// <returns>A copy of the MeshInfo[]</returns>\n        public TMP_MeshInfo[] CopyMeshInfoVertexData()\n        {\n            if (m_CachedMeshInfo == null || m_CachedMeshInfo.Length != meshInfo.Length)\n            {\n                m_CachedMeshInfo = new TMP_MeshInfo[meshInfo.Length];\n\n                // Initialize all the vertex data arrays\n                for (int i = 0; i < m_CachedMeshInfo.Length; i++)\n                {\n                    int length = meshInfo[i].vertices.Length;\n\n                    m_CachedMeshInfo[i].vertices = new Vector3[length];\n                    m_CachedMeshInfo[i].uvs0 = new Vector2[length];\n                    m_CachedMeshInfo[i].uvs2 = new Vector2[length];\n                    m_CachedMeshInfo[i].colors32 = new Color32[length];\n\n                    //m_CachedMeshInfo[i].normals = new Vector3[length];\n                    //m_CachedMeshInfo[i].tangents = new Vector4[length];\n                    //m_CachedMeshInfo[i].triangles = new int[meshInfo[i].triangles.Length];\n                }\n            }\n\n            for (int i = 0; i < m_CachedMeshInfo.Length; i++)\n            {\n                int length = meshInfo[i].vertices.Length;\n\n                if (m_CachedMeshInfo[i].vertices.Length != length)\n                {\n                    m_CachedMeshInfo[i].vertices = new Vector3[length];\n                    m_CachedMeshInfo[i].uvs0 = new Vector2[length];\n                    m_CachedMeshInfo[i].uvs2 = new Vector2[length];\n                    m_CachedMeshInfo[i].colors32 = new Color32[length];\n\n                    //m_CachedMeshInfo[i].normals = new Vector3[length];\n                    //m_CachedMeshInfo[i].tangents = new Vector4[length];\n                    //m_CachedMeshInfo[i].triangles = new int[meshInfo[i].triangles.Length];\n                }\n\n\n                // Only copy the primary vertex data\n                Array.Copy(meshInfo[i].vertices, m_CachedMeshInfo[i].vertices, length);\n                Array.Copy(meshInfo[i].uvs0, m_CachedMeshInfo[i].uvs0, length);\n                Array.Copy(meshInfo[i].uvs2, m_CachedMeshInfo[i].uvs2, length);\n                Array.Copy(meshInfo[i].colors32, m_CachedMeshInfo[i].colors32, length);\n\n                //Array.Copy(meshInfo[i].normals, m_CachedMeshInfo[i].normals, length);\n                //Array.Copy(meshInfo[i].tangents, m_CachedMeshInfo[i].tangents, length);\n                //Array.Copy(meshInfo[i].triangles, m_CachedMeshInfo[i].triangles, meshInfo[i].triangles.Length);\n            }\n\n            return m_CachedMeshInfo;\n        }\n\n\n\n        /// <summary>\n        /// Function to resize any of the structure contained in the TMP_TextInfo class.\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"array\"></param>\n        /// <param name=\"size\"></param>\n        public static void Resize<T> (ref T[] array, int size)\n        {\n            // Allocated to the next power of two\n            int newSize = size > 1024 ? size + 256 : Mathf.NextPowerOfTwo(size);\n\n            Array.Resize(ref array, newSize);\n        }\n\n\n        /// <summary>\n        /// Function to resize any of the structure contained in the TMP_TextInfo class.\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"array\"></param>\n        /// <param name=\"size\"></param>\n        /// <param name=\"isFixedSize\"></param>\n        public static void Resize<T>(ref T[] array, int size, bool isBlockAllocated)\n        {\n            //if (size <= array.Length) return;\n\n            if (isBlockAllocated) size = size > 1024 ? size + 256 : Mathf.NextPowerOfTwo(size);\n\n            if (size == array.Length) return;\n\n            Array.Resize(ref array, size);\n        }\n\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_TextInfo.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 4ae64f3f72004807a9f919f9c27af0db\ntimeCreated: 1446589998\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_TextParsingUtilities.cs",
    "content": "﻿using System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\n\nnamespace TMPro\n{\n    public class TMP_TextParsingUtilities \n    {\n        private static readonly TMP_TextParsingUtilities s_Instance = new TMP_TextParsingUtilities();\n\n        /// <summary>\n        /// Default constructor\n        /// </summary>\n        static TMP_TextParsingUtilities() { }\n\n\n        /// <summary>\n        /// Get a singleton instance of the TextModuleUtilities.\n        /// </summary>\n        public static TMP_TextParsingUtilities instance\n        {\n            get { return s_Instance; }\n        }\n\n\n        /// <summary>\n        /// Function returning the hashcode value of a given string.\n        /// </summary>\n        public static uint GetHashCode(string s)\n        {\n            uint hashCode = 0;\n\n            for (int i = 0; i < s.Length; i++)\n                hashCode = ((hashCode << 5) + hashCode) ^ ToUpperASCIIFast(s[i]);\n\n            return hashCode;\n        }\n\n        public static int GetHashCodeCaseSensitive(string s)\n        {\n            int hashCode = 0;\n\n            for (int i = 0; i < s.Length; i++)\n                hashCode = ((hashCode << 5) + hashCode) ^ s[i];\n\n            return hashCode;\n        }\n\n\n        /// <summary>\n        /// Table used to convert character to lowercase.\n        /// </summary>\n        const string k_LookupStringL = \"-------------------------------- !-#$%&-()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[-]^_`abcdefghijklmnopqrstuvwxyz{|}~-\";\n\n        /// <summary>\n        /// Table used to convert character to uppercase.\n        /// </summary>\n        const string k_LookupStringU = \"-------------------------------- !-#$%&-()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[-]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~-\";\n\n\n        /// <summary>\n        /// Get lowercase version of this ASCII character.\n        /// </summary>\n        //[MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static char ToLowerASCIIFast(char c)\n        {\n            if (c > k_LookupStringL.Length - 1)\n                return c;\n\n            return k_LookupStringL[c];\n        }\n\n\n        /// <summary>\n        /// Get uppercase version of this ASCII character.\n        /// </summary>\n        //[MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static char ToUpperASCIIFast(char c)\n        {\n            if (c > k_LookupStringU.Length - 1)\n                return c;\n\n            return k_LookupStringU[c];\n        }\n\n\n        /// <summary>\n        /// Get uppercase version of this ASCII character.\n        /// </summary>\n        //[MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static uint ToUpperASCIIFast(uint c)\n        {\n            if (c > k_LookupStringU.Length - 1)\n                return c;\n\n            return k_LookupStringU[(int)c];\n        }\n\n\n        /// <summary>\n        /// Get lowercase version of this ASCII character.\n        /// </summary>\n        //[MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static uint ToLowerASCIIFast(uint c)\n        {\n            if (c > k_LookupStringL.Length - 1)\n                return c;\n\n            return k_LookupStringL[(int)c];\n        }\n\n\n        /// <summary>\n        /// Check if Unicode is High Surrogate\n        /// </summary>\n        /// <param name=\"c\"></param>\n        /// <returns></returns>\n        //[MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static bool IsHighSurrogate(uint c)\n        {\n            return c > 0xD800 && c < 0xDBFF;\n        }\n\n        /// <summary>\n        /// Check if Unicode is Low Surrogate\n        /// </summary>\n        /// <param name=\"c\"></param>\n        /// <returns></returns>\n        //[MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static bool IsLowSurrogate(uint c)\n        {\n            return c > 0xDC00 && c < 0xDFFF;\n        }\n\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_TextParsingUtilities.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 6ad632cbcc87f634d9b86006cdffdaf5\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_TextUtilities.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections;\n\n\nnamespace TMPro\n{\n    public enum CaretPosition { None, Left, Right }\n\n    /// <summary>\n    /// Structure which contains the character index and position of caret relative to the character.\n    /// </summary>\n    public struct CaretInfo\n    {\n        public int index;\n        public CaretPosition position;\n\n        public CaretInfo(int index, CaretPosition position)\n        {\n            this.index = index;\n            this.position = position;\n        }\n    }\n\n    public static class TMP_TextUtilities\n    {\n        private static Vector3[] m_rectWorldCorners = new Vector3[4];\n        \n        \n        // TEXT INPUT COMPONENT RELATED FUNCTIONS\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"textComponent\">A reference to the text object.</param>\n        /// <param name=\"position\">Position to check for intersection.</param>\n        /// <param name=\"camera\">The scene camera which may be assigned to a Canvas using ScreenSpace Camera or WorldSpace render mode. Set to null is using ScreenSpace Overlay.</param>\n        /// <returns></returns>\n        //public static CaretInfo GetCursorInsertionIndex(TMP_Text textComponent, Vector3 position, Camera camera)\n        //{\n        //    int index = TMP_TextUtilities.FindNearestCharacter(textComponent, position, camera, false);\n\n        //    RectTransform rectTransform = textComponent.rectTransform;\n\n        //    // Convert position into Worldspace coordinates\n        //    ScreenPointToWorldPointInRectangle(rectTransform, position, camera, out position);\n\n        //    TMP_CharacterInfo cInfo = textComponent.textInfo.characterInfo[index];\n\n        //    // Get Bottom Left and Top Right position of the current character\n        //    Vector3 bl = rectTransform.TransformPoint(cInfo.bottomLeft);\n        //    //Vector3 tl = rectTransform.TransformPoint(new Vector3(cInfo.bottomLeft.x, cInfo.topRight.y, 0));\n        //    Vector3 tr = rectTransform.TransformPoint(cInfo.topRight);\n        //    //Vector3 br = rectTransform.TransformPoint(new Vector3(cInfo.topRight.x, cInfo.bottomLeft.y, 0));\n\n        //    float insertPosition = (position.x - bl.x) / (tr.x - bl.x);\n\n        //    if (insertPosition < 0.5f)\n        //        return new CaretInfo(index, CaretPosition.Left);\n        //    else\n        //        return new CaretInfo(index, CaretPosition.Right);\n        //}\n\n\n        /// <summary>\n        /// Function returning the index of the character whose origin is closest to the cursor.\n        /// </summary>\n        /// <param name=\"textComponent\">A reference to the text object.</param>\n        /// <param name=\"position\">Position to check for intersection.</param>\n        /// <param name=\"camera\">The scene camera which may be assigned to a Canvas using ScreenSpace Camera or WorldSpace render mode. Set to null is using ScreenSpace Overlay.</param>\n        /// <returns></returns>\n        public static int GetCursorIndexFromPosition(TMP_Text textComponent, Vector3 position, Camera camera)\n        {\n            int index = TMP_TextUtilities.FindNearestCharacter(textComponent, position, camera, false);\n\n            RectTransform rectTransform = textComponent.rectTransform;\n\n            // Convert position into Worldspace coordinates\n            ScreenPointToWorldPointInRectangle(rectTransform, position, camera, out position);\n\n            TMP_CharacterInfo cInfo = textComponent.textInfo.characterInfo[index];\n\n            // Get Bottom Left and Top Right position of the current character\n            Vector3 bl = rectTransform.TransformPoint(cInfo.bottomLeft);\n            Vector3 tr = rectTransform.TransformPoint(cInfo.topRight);\n\n            float insertPosition = (position.x - bl.x) / (tr.x - bl.x);\n\n            if (insertPosition < 0.5f)\n                return index;\n            else\n                return index + 1;\n\n        }\n\n\n        /// <summary>\n        /// Function returning the index of the character whose origin is closest to the cursor.\n        /// </summary>\n        /// <param name=\"textComponent\">A reference to the text object.</param>\n        /// <param name=\"position\">Position to check for intersection.</param>\n        /// <param name=\"camera\">The scene camera which may be assigned to a Canvas using ScreenSpace Camera or WorldSpace render mode. Set to null is using ScreenSpace Overlay.</param>\n        /// <param name=\"cursor\">The position of the cursor insertion position relative to the position.</param>\n        /// <returns></returns>\n        //public static int GetCursorIndexFromPosition(TMP_Text textComponent, Vector3 position, Camera camera, out CaretPosition cursor)\n        //{\n        //    int index = TMP_TextUtilities.FindNearestCharacter(textComponent, position, camera, false);\n\n        //    RectTransform rectTransform = textComponent.rectTransform;\n\n        //    // Convert position into Worldspace coordinates\n        //    ScreenPointToWorldPointInRectangle(rectTransform, position, camera, out position);\n\n        //    TMP_CharacterInfo cInfo = textComponent.textInfo.characterInfo[index];\n\n        //    // Get Bottom Left and Top Right position of the current character\n        //    Vector3 bl = rectTransform.TransformPoint(cInfo.bottomLeft);\n        //    Vector3 tr = rectTransform.TransformPoint(cInfo.topRight);\n\n        //    float insertPosition = (position.x - bl.x) / (tr.x - bl.x);\n\n        //    if (insertPosition < 0.5f)\n        //    {\n        //        cursor = CaretPosition.Left;\n        //        return index;\n        //    }\n        //    else\n        //    {\n        //        cursor = CaretPosition.Right;\n        //        return index;\n        //    }\n        //}\n\n\n        /// <summary>\n        /// Function returning the index of the character whose origin is closest to the cursor.\n        /// </summary>\n        /// <param name=\"textComponent\">A reference to the text object.</param>\n        /// <param name=\"position\">Position to check for intersection.</param>\n        /// <param name=\"camera\">The scene camera which may be assigned to a Canvas using ScreenSpace Camera or WorldSpace render mode. Set to null is using ScreenSpace Overlay.</param>\n        /// <param name=\"cursor\">The position of the cursor insertion position relative to the position.</param>\n        /// <returns></returns>\n        public static int GetCursorIndexFromPosition(TMP_Text textComponent, Vector3 position, Camera camera, out CaretPosition cursor)\n        {\n            int line = TMP_TextUtilities.FindNearestLine(textComponent, position, camera);\n\n            int index = FindNearestCharacterOnLine(textComponent, position, line, camera, false);\n\n            // Special handling if line contains only one character.\n            if (textComponent.textInfo.lineInfo[line].characterCount == 1)\n            {\n                cursor = CaretPosition.Left;\n                return index;\n            }\n\n            RectTransform rectTransform = textComponent.rectTransform;\n\n            // Convert position into Worldspace coordinates\n            ScreenPointToWorldPointInRectangle(rectTransform, position, camera, out position);\n\n            TMP_CharacterInfo cInfo = textComponent.textInfo.characterInfo[index];\n\n            // Get Bottom Left and Top Right position of the current character\n            Vector3 bl = rectTransform.TransformPoint(cInfo.bottomLeft);\n            Vector3 tr = rectTransform.TransformPoint(cInfo.topRight);\n\n            float insertPosition = (position.x - bl.x) / (tr.x - bl.x);\n\n            if (insertPosition < 0.5f)\n            {\n                cursor = CaretPosition.Left;\n                return index;\n            }\n            else\n            {\n                cursor = CaretPosition.Right;\n                return index;\n            }\n        }\n\n\n        /// <summary>\n        /// Function returning the line nearest to the position.\n        /// </summary>\n        /// <param name=\"textComponent\"></param>\n        /// <param name=\"position\"></param>\n        /// <param name=\"camera\"></param>\n        /// <returns></returns>\n        public static int FindNearestLine(TMP_Text text, Vector3 position, Camera camera)\n        {\n            RectTransform rectTransform = text.rectTransform;\n\n            float distance = Mathf.Infinity;\n            int closest = -1;\n\n            // Convert position into Worldspace coordinates\n            ScreenPointToWorldPointInRectangle(rectTransform, position, camera, out position);\n\n            for (int i = 0; i < text.textInfo.lineCount; i++)\n            {\n                TMP_LineInfo lineInfo = text.textInfo.lineInfo[i];\n\n                float ascender = rectTransform.TransformPoint(new Vector3(0, lineInfo.ascender, 0)).y;\n                float descender = rectTransform.TransformPoint(new Vector3(0, lineInfo.descender, 0)).y;\n\n                if (ascender > position.y && descender < position.y)\n                { \n                    //Debug.Log(\"Position is on line \" + i);\n                    return i;\n                }\n\n                float d0 = Mathf.Abs(ascender - position.y);\n                float d1 = Mathf.Abs(descender - position.y);\n\n                float d = Mathf.Min(d0, d1);\n                if (d < distance)\n                {\n                    distance = d;\n                    closest = i;\n                }\n            }\n\n            //Debug.Log(\"Closest line to position is \" + closest);\n            return closest;\n        }\n\n\n        /// <summary>\n        /// Function returning the nearest character to position on a given line.\n        /// </summary>\n        /// <param name=\"text\"></param>\n        /// <param name=\"position\"></param>\n        /// <param name=\"line\"></param>\n        /// <param name=\"camera\"></param>\n        /// <returns></returns>\n        public static int FindNearestCharacterOnLine(TMP_Text text, Vector3 position, int line, Camera camera, bool visibleOnly)\n        {\n            RectTransform rectTransform = text.rectTransform;\n\n            // Convert position into Worldspace coordinates\n            ScreenPointToWorldPointInRectangle(rectTransform, position, camera, out position);\n\n            int firstCharacter = text.textInfo.lineInfo[line].firstCharacterIndex;\n            int lastCharacter = text.textInfo.lineInfo[line].lastCharacterIndex;\n\n            float distanceSqr = Mathf.Infinity;\n            int closest = lastCharacter;\n\n            for (int i = firstCharacter; i < lastCharacter; i++)\n            {\n                // Get current character info.\n                TMP_CharacterInfo cInfo = text.textInfo.characterInfo[i];\n                if (visibleOnly && !cInfo.isVisible) continue;\n\n                // Get Bottom Left and Top Right position of the current character\n                Vector3 bl = rectTransform.TransformPoint(cInfo.bottomLeft);\n                Vector3 tl = rectTransform.TransformPoint(new Vector3(cInfo.bottomLeft.x, cInfo.topRight.y, 0));\n                Vector3 tr = rectTransform.TransformPoint(cInfo.topRight);\n                Vector3 br = rectTransform.TransformPoint(new Vector3(cInfo.topRight.x, cInfo.bottomLeft.y, 0));\n\n                if (PointIntersectRectangle(position, bl, tl, tr, br))\n                {\n                    closest = i;\n                    break;\n                }\n\n                // Find the closest corner to position.\n                float dbl = DistanceToLine(bl, tl, position);\n                float dtl = DistanceToLine(tl, tr, position);\n                float dtr = DistanceToLine(tr, br, position);\n                float dbr = DistanceToLine(br, bl, position);\n\n                float d = dbl < dtl ? dbl : dtl;\n                d = d < dtr ? d : dtr;\n                d = d < dbr ? d : dbr;\n\n                if (distanceSqr > d)\n                {\n                    distanceSqr = d;\n                    closest = i;\n                }\n            }\n            return closest;\n        }\n\n\n        /// <summary>\n        /// Function used to determine if the position intersects with the RectTransform.\n        /// </summary>\n        /// <param name=\"rectTransform\">A reference to the RectTranform of the text object.</param>\n        /// <param name=\"position\">Position to check for intersection.</param>\n        /// <param name=\"camera\">The scene camera which may be assigned to a Canvas using ScreenSpace Camera or WorldSpace render mode. Set to null is using ScreenSpace Overlay.</param>\n        /// <returns></returns>\n        public static bool IsIntersectingRectTransform(RectTransform rectTransform, Vector3 position, Camera camera)\n        {\n            // Convert position into Worldspace coordinates\n            ScreenPointToWorldPointInRectangle(rectTransform, position, camera, out position);\n\n            rectTransform.GetWorldCorners(m_rectWorldCorners);\n\n            if (PointIntersectRectangle(position, m_rectWorldCorners[0], m_rectWorldCorners[1], m_rectWorldCorners[2], m_rectWorldCorners[3]))\n            {\n                return true;\n            }\n\n            return false;\n        }\n\n\n        // CHARACTER HANDLING\n\n        /// <summary>\n        /// Function returning the index of the character at the given position (if any).\n        /// </summary>\n        /// <param name=\"text\">A reference to the TextMeshPro component.</param>\n        /// <param name=\"position\">Position to check for intersection.</param>\n        /// <param name=\"camera\">The scene camera which is rendering the text or whichever one might be assigned to a Canvas using ScreenSpace Camera or WorldSpace render mode. Set to null is using ScreenSpace Overlay.</param>\n        /// <param name=\"visibleOnly\">Only check for visible characters.</param>\n        /// <returns></returns>\n        public static int FindIntersectingCharacter(TMP_Text text, Vector3 position, Camera camera, bool visibleOnly)\n        {\n            RectTransform rectTransform = text.rectTransform;\n\n            // Convert position into Worldspace coordinates\n            ScreenPointToWorldPointInRectangle(rectTransform, position, camera, out position);\n\n            for (int i = 0; i < text.textInfo.characterCount; i++)\n            {\n                // Get current character info.\n                TMP_CharacterInfo cInfo = text.textInfo.characterInfo[i];\n                if (visibleOnly && !cInfo.isVisible) continue;\n\n                // Get Bottom Left and Top Right position of the current character\n                Vector3 bl = rectTransform.TransformPoint(cInfo.bottomLeft);\n                Vector3 tl = rectTransform.TransformPoint(new Vector3(cInfo.bottomLeft.x, cInfo.topRight.y, 0));\n                Vector3 tr = rectTransform.TransformPoint(cInfo.topRight);\n                Vector3 br = rectTransform.TransformPoint(new Vector3(cInfo.topRight.x, cInfo.bottomLeft.y, 0));\n\n                if (PointIntersectRectangle(position, bl, tl, tr, br))\n                    return i;\n\n            }\n            return -1;\n        }\n\n\n        /// <summary>\n        /// Function returning the index of the character at the given position (if any).\n        /// </summary>\n        /// <param name=\"text\">A reference to the TextMeshPro UGUI component.</param>\n        /// <param name=\"position\">Position to check for intersection.</param>\n        /// <param name=\"camera\">The camera which is rendering the text object.</param>\n        /// <param name=\"visibleOnly\">Only check for visible characters.</param>\n        /// <returns></returns>\n        //public static int FindIntersectingCharacter(TextMeshPro text, Vector3 position, Camera camera, bool visibleOnly)\n        //{\n        //    Transform textTransform = text.transform;\n\n        //    // Convert position into Worldspace coordinates\n        //    ScreenPointToWorldPointInRectangle(textTransform, position, camera, out position);\n\n        //    for (int i = 0; i < text.textInfo.characterCount; i++)\n        //    {\n        //        // Get current character info.\n        //        TMP_CharacterInfo cInfo = text.textInfo.characterInfo[i];\n        //        if ((visibleOnly && !cInfo.isVisible) || (text.OverflowMode == TextOverflowModes.Page && cInfo.pageNumber + 1 != text.pageToDisplay))\n        //            continue;\n\n        //        // Get Bottom Left and Top Right position of the current character\n        //        Vector3 bl = textTransform.TransformPoint(cInfo.bottomLeft);\n        //        Vector3 tl = textTransform.TransformPoint(new Vector3(cInfo.bottomLeft.x, cInfo.topRight.y, 0));\n        //        Vector3 tr = textTransform.TransformPoint(cInfo.topRight);\n        //        Vector3 br = textTransform.TransformPoint(new Vector3(cInfo.topRight.x, cInfo.bottomLeft.y, 0));\n\n        //        if (PointIntersectRectangle(position, bl, tl, tr, br))\n        //            return i;\n\n        //    }\n\n        //    return -1;\n        //}\n\n\n        /// <summary>\n        /// Function to find the nearest character to position.\n        /// </summary>\n        /// <param name=\"text\">A reference to the TMP Text component.</param>\n        /// <param name=\"position\">Position to check for intersection.</param>\n        /// <param name=\"camera\">The scene camera which may be assigned to a Canvas using ScreenSpace Camera or WorldSpace render mode. Set to null is using ScreenSpace Overlay.</param>\n        /// <param name=\"visibleOnly\">Only check for visible characters.</param>\n        /// <returns></returns>\n        public static int FindNearestCharacter(TMP_Text text, Vector3 position, Camera camera, bool visibleOnly)\n        {\n            RectTransform rectTransform = text.rectTransform;\n\n            float distanceSqr = Mathf.Infinity;\n            int closest = 0;\n\n            // Convert position into Worldspace coordinates\n            ScreenPointToWorldPointInRectangle(rectTransform, position, camera, out position);\n\n            for (int i = 0; i < text.textInfo.characterCount; i++)\n            {\n                // Get current character info.\n                TMP_CharacterInfo cInfo = text.textInfo.characterInfo[i];\n                if (visibleOnly && !cInfo.isVisible) continue;\n\n                // Get Bottom Left and Top Right position of the current character\n                Vector3 bl = rectTransform.TransformPoint(cInfo.bottomLeft);\n                Vector3 tl = rectTransform.TransformPoint(new Vector3(cInfo.bottomLeft.x, cInfo.topRight.y, 0));\n                Vector3 tr = rectTransform.TransformPoint(cInfo.topRight);\n                Vector3 br = rectTransform.TransformPoint(new Vector3(cInfo.topRight.x, cInfo.bottomLeft.y, 0));\n\n                if (PointIntersectRectangle(position, bl, tl, tr, br))\n                    return i;\n\n                // Find the closest corner to position.\n                float dbl = DistanceToLine(bl, tl, position);\n                float dtl = DistanceToLine(tl, tr, position);\n                float dtr = DistanceToLine(tr, br, position);\n                float dbr = DistanceToLine(br, bl, position);\n\n                float d = dbl < dtl ? dbl : dtl;\n                d = d < dtr ? d : dtr;\n                d = d < dbr ? d : dbr;\n\n                if (distanceSqr > d)\n                {\n                    distanceSqr = d;\n                    closest = i;\n                }\n            }\n\n            return closest;\n        }\n\n\n        /// <summary>\n        /// Function to find the nearest character to position.\n        /// </summary>\n        /// <param name=\"text\">A reference to the TextMeshPro UGUI component.</param>\n        /// <param name=\"position\">Position to check for intersection.</param>\n        /// <param name=\"camera\">The scene camera which may be assigned to a Canvas using ScreenSpace Camera or WorldSpace render mode. Set to null is using ScreenSpace Overlay.</param>\n        /// <param name=\"visibleOnly\">Only check for visible characters.</param>\n        /// <returns></returns>\n        //public static int FindNearestCharacter(TextMeshProUGUI text, Vector3 position, Camera camera, bool visibleOnly)\n        //{\n        //    RectTransform rectTransform = text.rectTransform;\n\n        //    float distanceSqr = Mathf.Infinity;\n        //    int closest = 0;\n\n        //    // Convert position into Worldspace coordinates\n        //    ScreenPointToWorldPointInRectangle(rectTransform, position, camera, out position);\n\n        //    for (int i = 0; i < text.textInfo.characterCount; i++)\n        //    {\n        //        // Get current character info.\n        //        TMP_CharacterInfo cInfo = text.textInfo.characterInfo[i];\n        //        if ((visibleOnly && !cInfo.isVisible) || (text.OverflowMode == TextOverflowModes.Page && cInfo.pageNumber + 1 != text.pageToDisplay))\n        //            continue;\n\n        //        // Get Bottom Left and Top Right position of the current character\n        //        Vector3 bl = rectTransform.TransformPoint(cInfo.bottomLeft);\n        //        Vector3 tl = rectTransform.TransformPoint(new Vector3(cInfo.bottomLeft.x, cInfo.topRight.y, 0));\n        //        Vector3 tr = rectTransform.TransformPoint(cInfo.topRight);\n        //        Vector3 br = rectTransform.TransformPoint(new Vector3(cInfo.topRight.x, cInfo.bottomLeft.y, 0));\n\n        //        if (PointIntersectRectangle(position, bl, tl, tr, br))\n        //            return i;\n\n        //        // Find the closest corner to position.\n        //        float dbl = DistanceToLine(bl, tl, position);\n        //        float dtl = DistanceToLine(tl, tr, position);\n        //        float dtr = DistanceToLine(tr, br, position);\n        //        float dbr = DistanceToLine(br, bl, position);\n\n        //        float d = dbl < dtl ? dbl : dtl;\n        //        d = d < dtr ? d : dtr;\n        //        d = d < dbr ? d : dbr;\n\n        //        if (distanceSqr > d)\n        //        {\n        //            distanceSqr = d;\n        //            closest = i;\n        //        }\n        //    }\n\n        //    //Debug.Log(\"Returning nearest character at index: \" + closest);\n\n        //    return closest;\n        //}\n\n\n        /// <summary>\n        /// Function to find the nearest character to position.\n        /// </summary>\n        /// <param name=\"text\">A reference to the TextMeshPro component.</param>\n        /// <param name=\"position\">Position to check for intersection.</param>\n        /// <param name=\"camera\">The camera which is rendering the text object.</param>\n        /// <param name=\"visibleOnly\">Only check for visible characters.</param>\n        /// <returns></returns>\n        //public static int FindNearestCharacter(TextMeshPro text, Vector3 position, Camera camera, bool visibleOnly)\n        //{\n        //    Transform textTransform = text.transform;\n\n        //    float distanceSqr = Mathf.Infinity;\n        //    int closest = 0;\n\n        //    // Convert position into Worldspace coordinates\n        //    ScreenPointToWorldPointInRectangle(textTransform, position, camera, out position);\n\n        //    for (int i = 0; i < text.textInfo.characterCount; i++)\n        //    {\n        //        // Get current character info.\n        //        TMP_CharacterInfo cInfo = text.textInfo.characterInfo[i];\n        //        if ((visibleOnly && !cInfo.isVisible) || (text.OverflowMode == TextOverflowModes.Page && cInfo.pageNumber + 1 != text.pageToDisplay))\n        //            continue;\n\n        //        // Get Bottom Left and Top Right position of the current character\n        //        Vector3 bl = textTransform.TransformPoint(cInfo.bottomLeft);\n        //        Vector3 tl = textTransform.TransformPoint(new Vector3(cInfo.bottomLeft.x, cInfo.topRight.y, 0));\n        //        Vector3 tr = textTransform.TransformPoint(cInfo.topRight);\n        //        Vector3 br = textTransform.TransformPoint(new Vector3(cInfo.topRight.x, cInfo.bottomLeft.y, 0));\n\n        //        if (PointIntersectRectangle(position, bl, tl, tr, br))\n        //            return i;\n\n        //        // Find the closest corner to position.\n        //        float dbl = DistanceToLine(bl, tl, position); // (position - bl).sqrMagnitude;\n        //        float dtl = DistanceToLine(tl, tr, position); // (position - tl).sqrMagnitude;\n        //        float dtr = DistanceToLine(tr, br, position); // (position - tr).sqrMagnitude;\n        //        float dbr = DistanceToLine(br, bl, position); // (position - br).sqrMagnitude;\n\n        //        float d = dbl < dtl ? dbl : dtl;\n        //        d = d < dtr ? d : dtr;\n        //        d = d < dbr ? d : dbr;\n\n        //        if (distanceSqr > d)\n        //        {\n        //            distanceSqr = d;\n        //            closest = i;\n        //        }\n        //    }\n\n        //    //Debug.Log(\"Returning nearest character at index: \" + closest);\n\n        //    return closest;\n        //}\n\n\n        // WORD HANDLING\n        /// <summary>\n        /// Function returning the index of the word at the given position (if any).\n        /// </summary>\n        /// <param name=\"text\">A reference to the TMP_Text component.</param>\n        /// <param name=\"position\">Position to check for intersection.</param>\n        /// <param name=\"camera\">The scene camera which may be assigned to a Canvas using ScreenSpace Camera or WorldSpace render mode. Set to null is using ScreenSpace Overlay.</param>\n        /// <returns></returns>\n        public static int FindIntersectingWord(TMP_Text text, Vector3 position, Camera camera)\n        {\n            RectTransform rectTransform = text.rectTransform;\n\n            // Convert position into Worldspace coordinates\n            ScreenPointToWorldPointInRectangle(rectTransform, position, camera, out position);\n\n            for (int i = 0; i < text.textInfo.wordCount; i++)\n            {\n                TMP_WordInfo wInfo = text.textInfo.wordInfo[i];\n\n                bool isBeginRegion = false;\n\n                Vector3 bl = Vector3.zero;\n                Vector3 tl = Vector3.zero;\n                Vector3 br = Vector3.zero;\n                Vector3 tr = Vector3.zero;\n\n                float maxAscender = -Mathf.Infinity;\n                float minDescender = Mathf.Infinity;\n\n                // Iterate through each character of the word\n                for (int j = 0; j < wInfo.characterCount; j++)\n                {\n                    int characterIndex = wInfo.firstCharacterIndex + j;\n                    TMP_CharacterInfo currentCharInfo = text.textInfo.characterInfo[characterIndex];\n                    int currentLine = currentCharInfo.lineNumber;\n\n                    bool isCharacterVisible = currentCharInfo.isVisible;\n\n                    // Track maximum Ascender and minimum Descender for each word.\n                    maxAscender = Mathf.Max(maxAscender, currentCharInfo.ascender);\n                    minDescender = Mathf.Min(minDescender, currentCharInfo.descender);\n\n                    if (isBeginRegion == false && isCharacterVisible)\n                    {\n                        isBeginRegion = true;\n\n                        bl = new Vector3(currentCharInfo.bottomLeft.x, currentCharInfo.descender, 0);\n                        tl = new Vector3(currentCharInfo.bottomLeft.x, currentCharInfo.ascender, 0);\n\n                        //Debug.Log(\"Start Word Region at [\" + currentCharInfo.character + \"]\");\n\n                        // If Word is one character\n                        if (wInfo.characterCount == 1)\n                        {\n                            isBeginRegion = false;\n\n                            br = new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0);\n                            tr = new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0);\n\n                            // Transform coordinates to be relative to transform and account min descender and max ascender.\n                            bl = rectTransform.TransformPoint(new Vector3(bl.x, minDescender, 0));\n                            tl = rectTransform.TransformPoint(new Vector3(tl.x, maxAscender, 0));\n                            tr = rectTransform.TransformPoint(new Vector3(tr.x, maxAscender, 0));\n                            br = rectTransform.TransformPoint(new Vector3(br.x, minDescender, 0));\n\n                            // Check for Intersection\n                            if (PointIntersectRectangle(position, bl, tl, tr, br))\n                                return i;\n\n                            //Debug.Log(\"End Word Region at [\" + currentCharInfo.character + \"]\");\n                        }\n                    }\n\n                    // Last Character of Word\n                    if (isBeginRegion && j == wInfo.characterCount - 1)\n                    {\n                        isBeginRegion = false;\n\n                        br = new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0);\n                        tr = new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0);\n\n                        // Transform coordinates to be relative to transform and account min descender and max ascender.\n                        bl = rectTransform.TransformPoint(new Vector3(bl.x, minDescender, 0));\n                        tl = rectTransform.TransformPoint(new Vector3(tl.x, maxAscender, 0));\n                        tr = rectTransform.TransformPoint(new Vector3(tr.x, maxAscender, 0));\n                        br = rectTransform.TransformPoint(new Vector3(br.x, minDescender, 0));\n\n                        // Check for Intersection\n                        if (PointIntersectRectangle(position, bl, tl, tr, br))\n                            return i;\n\n                        //Debug.Log(\"End Word Region at [\" + currentCharInfo.character + \"]\");\n                    }\n                    // If Word is split on more than one line.\n                    else if (isBeginRegion && currentLine != text.textInfo.characterInfo[characterIndex + 1].lineNumber)\n                    {\n                        isBeginRegion = false;\n\n                        br = new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0);\n                        tr = new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0);\n\n                        // Transform coordinates to be relative to transform and account min descender and max ascender.\n                        bl = rectTransform.TransformPoint(new Vector3(bl.x, minDescender, 0));\n                        tl = rectTransform.TransformPoint(new Vector3(tl.x, maxAscender, 0));\n                        tr = rectTransform.TransformPoint(new Vector3(tr.x, maxAscender, 0));\n                        br = rectTransform.TransformPoint(new Vector3(br.x, minDescender, 0));\n\n                        maxAscender = -Mathf.Infinity;\n                        minDescender = Mathf.Infinity;\n\n                        // Check for Intersection\n                        if (PointIntersectRectangle(position, bl, tl, tr, br))\n                            return i;\n\n                        //Debug.Log(\"End Word Region at [\" + currentCharInfo.character + \"]\");\n                    }\n                }\n\n                //Debug.Log(\"Word at Index: \" + i + \" is located at (\" + bl + \", \" + tl + \", \" + tr + \", \" + br + \").\");\n\n            }\n\n            return -1;\n        }\n\n\n        /// <summary>\n        /// Function returning the index of the word at the given position (if any).\n        /// </summary>\n        /// <param name=\"text\">A reference to the TextMeshPro UGUI component.</param>\n        /// <param name=\"position\">Position to check for intersection.</param>\n        /// <param name=\"camera\">The scene camera which may be assigned to a Canvas using ScreenSpace Camera or WorldSpace render mode. Set to null is using ScreenSpace Overlay.</param>\n        /// <returns></returns>\n        //public static int FindIntersectingWord(TextMeshProUGUI text, Vector3 position, Camera camera)\n        //{\n        //    RectTransform rectTransform = text.rectTransform;\n\n        //    // Convert position into Worldspace coordinates\n        //    ScreenPointToWorldPointInRectangle(rectTransform, position, camera, out position);\n\n        //    for (int i = 0; i < text.textInfo.wordCount; i++)\n        //    {\n        //        TMP_WordInfo wInfo = text.textInfo.wordInfo[i];\n\n        //        bool isBeginRegion = false;\n\n        //        Vector3 bl = Vector3.zero;\n        //        Vector3 tl = Vector3.zero;\n        //        Vector3 br = Vector3.zero;\n        //        Vector3 tr = Vector3.zero;\n\n        //        float maxAscender = -Mathf.Infinity;\n        //        float minDescender = Mathf.Infinity;\n\n        //        // Iterate through each character of the word\n        //        for (int j = 0; j < wInfo.characterCount; j++)\n        //        {\n        //            int characterIndex = wInfo.firstCharacterIndex + j;\n        //            TMP_CharacterInfo currentCharInfo = text.textInfo.characterInfo[characterIndex];\n        //            int currentLine = currentCharInfo.lineNumber;\n\n        //            bool isCharacterVisible = characterIndex > text.maxVisibleCharacters ||\n        //                                      currentCharInfo.lineNumber > text.maxVisibleLines ||\n        //                                     (text.OverflowMode == TextOverflowModes.Page && currentCharInfo.pageNumber + 1 != text.pageToDisplay) ? false : true;\n\n        //            // Track maximum Ascender and minimum Descender for each word.\n        //            maxAscender = Mathf.Max(maxAscender, currentCharInfo.ascender);\n        //            minDescender = Mathf.Min(minDescender, currentCharInfo.descender);\n\n        //            if (isBeginRegion == false && isCharacterVisible)\n        //            {\n        //                isBeginRegion = true;\n\n        //                bl = new Vector3(currentCharInfo.bottomLeft.x, currentCharInfo.descender, 0);\n        //                tl = new Vector3(currentCharInfo.bottomLeft.x, currentCharInfo.ascender, 0);\n\n        //                //Debug.Log(\"Start Word Region at [\" + currentCharInfo.character + \"]\");\n\n        //                // If Word is one character\n        //                if (wInfo.characterCount == 1)\n        //                {\n        //                    isBeginRegion = false;\n\n        //                    br = new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0);\n        //                    tr = new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0);\n\n        //                    // Transform coordinates to be relative to transform and account min descender and max ascender.\n        //                    bl = rectTransform.TransformPoint(new Vector3(bl.x, minDescender, 0));\n        //                    tl = rectTransform.TransformPoint(new Vector3(tl.x, maxAscender, 0));\n        //                    tr = rectTransform.TransformPoint(new Vector3(tr.x, maxAscender, 0));\n        //                    br = rectTransform.TransformPoint(new Vector3(br.x, minDescender, 0));\n\n        //                    // Check for Intersection\n        //                    if (PointIntersectRectangle(position, bl, tl, tr, br))\n        //                        return i;\n\n        //                    //Debug.Log(\"End Word Region at [\" + currentCharInfo.character + \"]\");\n        //                }\n        //            }\n\n        //            // Last Character of Word\n        //            if (isBeginRegion && j == wInfo.characterCount - 1)\n        //            {\n        //                isBeginRegion = false;\n\n        //                br = new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0);\n        //                tr = new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0);\n\n        //                // Transform coordinates to be relative to transform and account min descender and max ascender.\n        //                bl = rectTransform.TransformPoint(new Vector3(bl.x, minDescender, 0));\n        //                tl = rectTransform.TransformPoint(new Vector3(tl.x, maxAscender, 0));\n        //                tr = rectTransform.TransformPoint(new Vector3(tr.x, maxAscender, 0));\n        //                br = rectTransform.TransformPoint(new Vector3(br.x, minDescender, 0));\n\n        //                // Check for Intersection\n        //                if (PointIntersectRectangle(position, bl, tl, tr, br))\n        //                    return i;\n\n        //                //Debug.Log(\"End Word Region at [\" + currentCharInfo.character + \"]\");\n        //            }\n        //            // If Word is split on more than one line.\n        //            else if (isBeginRegion && currentLine != text.textInfo.characterInfo[characterIndex + 1].lineNumber)\n        //            {\n        //                isBeginRegion = false;\n\n        //                br = new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0);\n        //                tr = new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0);\n\n        //                // Transform coordinates to be relative to transform and account min descender and max ascender.\n        //                bl = rectTransform.TransformPoint(new Vector3(bl.x, minDescender, 0));\n        //                tl = rectTransform.TransformPoint(new Vector3(tl.x, maxAscender, 0));\n        //                tr = rectTransform.TransformPoint(new Vector3(tr.x, maxAscender, 0));\n        //                br = rectTransform.TransformPoint(new Vector3(br.x, minDescender, 0));\n\n        //                maxAscender = -Mathf.Infinity;\n        //                minDescender = Mathf.Infinity;\n\n        //                // Check for Intersection\n        //                if (PointIntersectRectangle(position, bl, tl, tr, br))\n        //                    return i;\n\n        //                //Debug.Log(\"End Word Region at [\" + currentCharInfo.character + \"]\");\n        //            }\n        //        }\n\n        //        //Debug.Log(\"Word at Index: \" + i + \" is located at (\" + bl + \", \" + tl + \", \" + tr + \", \" + br + \").\");\n\n        //    }\n\n        //    return -1;\n        //}\n\n\n        /// <summary>\n        /// Function returning the index of the word at the given position (if any).\n        /// </summary>\n        /// <param name=\"text\">A reference to the TextMeshPro component.</param>\n        /// <param name=\"position\">Position to check for intersection.</param>\n        /// <param name=\"camera\">The camera which is rendering the text object.</param>\n        /// <returns></returns>\n        //public static int FindIntersectingWord(TextMeshPro text, Vector3 position, Camera camera)\n        //{\n        //    Transform textTransform = text.transform;\n\n        //    // Convert position into Worldspace coordinates\n        //    ScreenPointToWorldPointInRectangle(textTransform, position, camera, out position);\n\n        //    for (int i = 0; i < text.textInfo.wordCount; i++)\n        //    {\n        //        TMP_WordInfo wInfo = text.textInfo.wordInfo[i];\n\n        //        bool isBeginRegion = false;\n\n        //        Vector3 bl = Vector3.zero;\n        //        Vector3 tl = Vector3.zero;\n        //        Vector3 br = Vector3.zero;\n        //        Vector3 tr = Vector3.zero;\n\n        //        float maxAscender = -Mathf.Infinity;\n        //        float minDescender = Mathf.Infinity;\n\n        //        // Iterate through each character of the word\n        //        for (int j = 0; j < wInfo.characterCount; j++)\n        //        {\n        //            int characterIndex = wInfo.firstCharacterIndex + j;\n        //            TMP_CharacterInfo currentCharInfo = text.textInfo.characterInfo[characterIndex];\n        //            int currentLine = currentCharInfo.lineNumber;\n\n        //            bool isCharacterVisible = characterIndex > text.maxVisibleCharacters ||\n        //                                      currentCharInfo.lineNumber > text.maxVisibleLines ||\n        //                                     (text.OverflowMode == TextOverflowModes.Page && currentCharInfo.pageNumber + 1 != text.pageToDisplay) ? false : true;\n\n        //            // Track maximum Ascender and minimum Descender for each word.\n        //            maxAscender = Mathf.Max(maxAscender, currentCharInfo.ascender);\n        //            minDescender = Mathf.Min(minDescender, currentCharInfo.descender);\n\n        //            if (isBeginRegion == false && isCharacterVisible)\n        //            {\n        //                isBeginRegion = true;\n\n        //                bl = new Vector3(currentCharInfo.bottomLeft.x, currentCharInfo.descender, 0);\n        //                tl = new Vector3(currentCharInfo.bottomLeft.x, currentCharInfo.ascender, 0);\n\n        //                //Debug.Log(\"Start Word Region at [\" + currentCharInfo.character + \"]\");\n\n        //                // If Word is one character\n        //                if (wInfo.characterCount == 1)\n        //                {\n        //                    isBeginRegion = false;\n\n        //                    br = new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0);\n        //                    tr = new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0);\n\n        //                    // Transform coordinates to be relative to transform and account min descender and max ascender.\n        //                    bl = textTransform.TransformPoint(new Vector3(bl.x, minDescender, 0));\n        //                    tl = textTransform.TransformPoint(new Vector3(tl.x, maxAscender, 0));\n        //                    tr = textTransform.TransformPoint(new Vector3(tr.x, maxAscender, 0));\n        //                    br = textTransform.TransformPoint(new Vector3(br.x, minDescender, 0));\n\n        //                    // Check for Intersection\n        //                    if (PointIntersectRectangle(position, bl, tl, tr, br))\n        //                        return i;\n\n        //                    //Debug.Log(\"End Word Region at [\" + currentCharInfo.character + \"]\");\n        //                }\n        //            }\n\n        //            // Last Character of Word\n        //            if (isBeginRegion && j == wInfo.characterCount - 1)\n        //            {\n        //                isBeginRegion = false;\n\n        //                br = new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0);\n        //                tr = new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0);\n\n        //                // Transform coordinates to be relative to transform and account min descender and max ascender.\n        //                bl = textTransform.TransformPoint(new Vector3(bl.x, minDescender, 0));\n        //                tl = textTransform.TransformPoint(new Vector3(tl.x, maxAscender, 0));\n        //                tr = textTransform.TransformPoint(new Vector3(tr.x, maxAscender, 0));\n        //                br = textTransform.TransformPoint(new Vector3(br.x, minDescender, 0));\n\n        //                // Check for Intersection\n        //                if (PointIntersectRectangle(position, bl, tl, tr, br))\n        //                    return i;\n\n        //                //Debug.Log(\"End Word Region at [\" + currentCharInfo.character + \"]\");\n        //            }\n        //            // If Word is split on more than one line.\n        //            else if (isBeginRegion && currentLine != text.textInfo.characterInfo[characterIndex + 1].lineNumber)\n        //            {\n        //                isBeginRegion = false;\n\n        //                br = new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0);\n        //                tr = new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0);\n\n        //                // Transform coordinates to be relative to transform and account min descender and max ascender.\n        //                bl = textTransform.TransformPoint(new Vector3(bl.x, minDescender, 0));\n        //                tl = textTransform.TransformPoint(new Vector3(tl.x, maxAscender, 0));\n        //                tr = textTransform.TransformPoint(new Vector3(tr.x, maxAscender, 0));\n        //                br = textTransform.TransformPoint(new Vector3(br.x, minDescender, 0));\n\n        //                // Reset maxAscender and minDescender for next word segment.\n        //                maxAscender = -Mathf.Infinity;\n        //                minDescender = Mathf.Infinity;\n\n        //                // Check for Intersection\n        //                if (PointIntersectRectangle(position, bl, tl, tr, br))\n        //                    return i;\n\n        //                //Debug.Log(\"End Word Region at [\" + currentCharInfo.character + \"]\");\n        //            }\n        //        }\n        //    }\n\n        //    return -1;\n        //}\n\n\n        /// <summary>\n        /// Function returning the index of the word at the given position (if any).\n        /// </summary>\n        /// <param name=\"text\">A reference to the TMP_Text component.</param>\n        /// <param name=\"position\"></param>\n        /// <param name=\"camera\">The scene camera which may be assigned to a Canvas using ScreenSpace Camera or WorldSpace render mode. Set to null is using ScreenSpace Overlay.</param>\n        /// <returns></returns>\n        public static int FindNearestWord(TMP_Text text, Vector3 position, Camera camera)\n        {\n            RectTransform rectTransform = text.rectTransform;\n\n            float distanceSqr = Mathf.Infinity;\n            int closest = 0;\n\n            // Convert position into Worldspace coordinates\n            ScreenPointToWorldPointInRectangle(rectTransform, position, camera, out position);\n\n            for (int i = 0; i < text.textInfo.wordCount; i++)\n            {\n                TMP_WordInfo wInfo = text.textInfo.wordInfo[i];\n\n                bool isBeginRegion = false;\n\n                Vector3 bl = Vector3.zero;\n                Vector3 tl = Vector3.zero;\n                Vector3 br = Vector3.zero;\n                Vector3 tr = Vector3.zero;\n\n                // Iterate through each character of the word\n                for (int j = 0; j < wInfo.characterCount; j++)\n                {\n                    int characterIndex = wInfo.firstCharacterIndex + j;\n                    TMP_CharacterInfo currentCharInfo = text.textInfo.characterInfo[characterIndex];\n                    int currentLine = currentCharInfo.lineNumber;\n\n                    bool isCharacterVisible = currentCharInfo.isVisible;\n\n                    if (isBeginRegion == false && isCharacterVisible)\n                    {\n                        isBeginRegion = true;\n\n                        bl = rectTransform.TransformPoint(new Vector3(currentCharInfo.bottomLeft.x, currentCharInfo.descender, 0));\n                        tl = rectTransform.TransformPoint(new Vector3(currentCharInfo.bottomLeft.x, currentCharInfo.ascender, 0));\n\n                        //Debug.Log(\"Start Word Region at [\" + currentCharInfo.character + \"]\");\n\n                        // If Word is one character\n                        if (wInfo.characterCount == 1)\n                        {\n                            isBeginRegion = false;\n\n                            br = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0));\n                            tr = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0));\n\n                            // Check for Intersection\n                            if (PointIntersectRectangle(position, bl, tl, tr, br))\n                                return i;\n\n                            // Find the closest line segment to position.\n                            float dbl = DistanceToLine(bl, tl, position);\n                            float dtl = DistanceToLine(tl, tr, position);\n                            float dtr = DistanceToLine(tr, br, position);\n                            float dbr = DistanceToLine(br, bl, position);\n\n                            float d = dbl < dtl ? dbl : dtl;\n                            d = d < dtr ? d : dtr;\n                            d = d < dbr ? d : dbr;\n\n                            if (distanceSqr > d)\n                            {\n                                distanceSqr = d;\n                                closest = i;\n                            }\n                        }\n                    }\n\n                    // Last Character of Word\n                    if (isBeginRegion && j == wInfo.characterCount - 1)\n                    {\n                        isBeginRegion = false;\n\n                        br = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0));\n                        tr = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0));\n\n                        // Check for Intersection\n                        if (PointIntersectRectangle(position, bl, tl, tr, br))\n                            return i;\n\n                        // Find the closest line segment to position.\n                        float dbl = DistanceToLine(bl, tl, position);\n                        float dtl = DistanceToLine(tl, tr, position);\n                        float dtr = DistanceToLine(tr, br, position);\n                        float dbr = DistanceToLine(br, bl, position);\n\n                        float d = dbl < dtl ? dbl : dtl;\n                        d = d < dtr ? d : dtr;\n                        d = d < dbr ? d : dbr;\n\n                        if (distanceSqr > d)\n                        {\n                            distanceSqr = d;\n                            closest = i;\n                        }\n                    }\n                    // If Word is split on more than one line.\n                    else if (isBeginRegion && currentLine != text.textInfo.characterInfo[characterIndex + 1].lineNumber)\n                    {\n                        isBeginRegion = false;\n\n                        br = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0));\n                        tr = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0));\n\n                        // Check for Intersection\n                        if (PointIntersectRectangle(position, bl, tl, tr, br))\n                            return i;\n\n                        // Find the closest line segment to position.\n                        float dbl = DistanceToLine(bl, tl, position);\n                        float dtl = DistanceToLine(tl, tr, position);\n                        float dtr = DistanceToLine(tr, br, position);\n                        float dbr = DistanceToLine(br, bl, position);\n\n                        float d = dbl < dtl ? dbl : dtl;\n                        d = d < dtr ? d : dtr;\n                        d = d < dbr ? d : dbr;\n\n                        if (distanceSqr > d)\n                        {\n                            distanceSqr = d;\n                            closest = i;\n                        }\n                    }\n                }\n\n                //Debug.Log(\"Word at Index: \" + i + \" is located at (\" + bl + \", \" + tl + \", \" + tr + \", \" + br + \").\");\n            }\n\n            return closest;\n        }\n\n        /// <summary>\n        /// Function returning the index of the word at the given position (if any).\n        /// </summary>\n        /// <param name=\"text\">A reference to the TextMeshPro UGUI component.</param>\n        /// <param name=\"position\"></param>\n        /// <param name=\"camera\">The scene camera which may be assigned to a Canvas using ScreenSpace Camera or WorldSpace render mode. Set to null is using ScreenSpace Overlay.</param>\n        /// <returns></returns>\n        //public static int FindNearestWord(TextMeshProUGUI text, Vector3 position, Camera camera)\n        //{\n        //    RectTransform rectTransform = text.rectTransform;\n\n        //    float distanceSqr = Mathf.Infinity;\n        //    int closest = 0;\n\n        //    // Convert position into Worldspace coordinates\n        //    ScreenPointToWorldPointInRectangle(rectTransform, position, camera, out position);\n\n        //    for (int i = 0; i < text.textInfo.wordCount; i++)\n        //    {\n        //        TMP_WordInfo wInfo = text.textInfo.wordInfo[i];\n\n        //        bool isBeginRegion = false;\n\n        //        Vector3 bl = Vector3.zero;\n        //        Vector3 tl = Vector3.zero;\n        //        Vector3 br = Vector3.zero;\n        //        Vector3 tr = Vector3.zero;\n\n        //        // Iterate through each character of the word\n        //        for (int j = 0; j < wInfo.characterCount; j++)\n        //        {\n        //            int characterIndex = wInfo.firstCharacterIndex + j;\n        //            TMP_CharacterInfo currentCharInfo = text.textInfo.characterInfo[characterIndex];\n        //            int currentLine = currentCharInfo.lineNumber;\n\n        //            bool isCharacterVisible = characterIndex > text.maxVisibleCharacters ||\n        //                                      currentCharInfo.lineNumber > text.maxVisibleLines ||\n        //                                     (text.OverflowMode == TextOverflowModes.Page && currentCharInfo.pageNumber + 1 != text.pageToDisplay) ? false : true;\n\n        //            if (isBeginRegion == false && isCharacterVisible)\n        //            {\n        //                isBeginRegion = true;\n\n        //                bl = rectTransform.TransformPoint(new Vector3(currentCharInfo.bottomLeft.x, currentCharInfo.descender, 0));\n        //                tl = rectTransform.TransformPoint(new Vector3(currentCharInfo.bottomLeft.x, currentCharInfo.ascender, 0));\n\n        //                //Debug.Log(\"Start Word Region at [\" + currentCharInfo.character + \"]\");\n\n        //                // If Word is one character\n        //                if (wInfo.characterCount == 1)\n        //                {\n        //                    isBeginRegion = false;\n\n        //                    br = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0));\n        //                    tr = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0));\n\n        //                    // Check for Intersection\n        //                    if (PointIntersectRectangle(position, bl, tl, tr, br))\n        //                        return i;\n\n        //                    //Debug.Log(\"End Word Region at [\" + currentCharInfo.character + \"]\");\n        //                }\n        //            }\n\n        //            // Last Character of Word\n        //            if (isBeginRegion && j == wInfo.characterCount - 1)\n        //            {\n        //                isBeginRegion = false;\n\n        //                br = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0));\n        //                tr = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0));\n\n        //                // Check for Intersection\n        //                if (PointIntersectRectangle(position, bl, tl, tr, br))\n        //                    return i;\n\n        //                //Debug.Log(\"End Word Region at [\" + currentCharInfo.character + \"]\");\n        //            }\n        //            // If Word is split on more than one line.\n        //            else if (isBeginRegion && currentLine != text.textInfo.characterInfo[characterIndex + 1].lineNumber)\n        //            {\n        //                isBeginRegion = false;\n\n        //                br = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0));\n        //                tr = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0));\n\n        //                // Check for Intersection\n        //                if (PointIntersectRectangle(position, bl, tl, tr, br))\n        //                    return i;\n\n        //                //Debug.Log(\"End Word Region at [\" + currentCharInfo.character + \"]\");\n        //            }\n        //        }\n\n        //        // Find the closest line segment to position.\n        //        float dbl = DistanceToLine(bl, tl, position); // (position - bl).sqrMagnitude;\n        //        float dtl = DistanceToLine(tl, tr, position); // (position - tl).sqrMagnitude;\n        //        float dtr = DistanceToLine(tr, br, position); // (position - tr).sqrMagnitude;\n        //        float dbr = DistanceToLine(br, bl, position); // (position - br).sqrMagnitude;\n\n        //        float d = dbl < dtl ? dbl : dtl;\n        //        d = d < dtr ? d : dtr;\n        //        d = d < dbr ? d : dbr;\n\n        //        if (distanceSqr > d)\n        //        {\n        //            distanceSqr = d;\n        //            closest = i;\n        //        }\n        //        //Debug.Log(\"Word at Index: \" + i + \" is located at (\" + bl + \", \" + tl + \", \" + tr + \", \" + br + \").\");\n\n        //    }\n\n        //    return closest;\n        //}\n\n\n        /// <summary>\n        /// Function returning the index of the word at the given position (if any).\n        /// </summary>\n        /// <param name=\"text\">A reference to the TextMeshPro UGUI component.</param>\n        /// <param name=\"position\">Position to check for intersection.</param>\n        /// <param name=\"camera\">The camera which is rendering the text object.</param>\n        /// <returns></returns>\n        //public static int FindNearestWord(TextMeshPro text, Vector3 position, Camera camera)\n        //{\n        //    Transform textTransform = text.transform;\n\n        //    float distanceSqr = Mathf.Infinity;\n        //    int closest = 0;\n\n        //    // Convert position into Worldspace coordinates\n        //    ScreenPointToWorldPointInRectangle(textTransform, position, camera, out position);\n\n        //    for (int i = 0; i < text.textInfo.wordCount; i++)\n        //    {\n        //        TMP_WordInfo wInfo = text.textInfo.wordInfo[i];\n\n        //        bool isBeginRegion = false;\n\n        //        Vector3 bl = Vector3.zero;\n        //        Vector3 tl = Vector3.zero;\n        //        Vector3 br = Vector3.zero;\n        //        Vector3 tr = Vector3.zero;\n\n        //        // Iterate through each character of the word\n        //        for (int j = 0; j < wInfo.characterCount; j++)\n        //        {\n        //            int characterIndex = wInfo.firstCharacterIndex + j;\n        //            TMP_CharacterInfo currentCharInfo = text.textInfo.characterInfo[characterIndex];\n        //            int currentLine = currentCharInfo.lineNumber;\n\n        //            bool isCharacterVisible = characterIndex > text.maxVisibleCharacters ||\n        //                                      currentCharInfo.lineNumber > text.maxVisibleLines ||\n        //                                     (text.OverflowMode == TextOverflowModes.Page && currentCharInfo.pageNumber + 1 != text.pageToDisplay) ? false : true;\n\n        //            if (isBeginRegion == false && isCharacterVisible)\n        //            {\n        //                isBeginRegion = true;\n\n        //                bl = textTransform.TransformPoint(new Vector3(currentCharInfo.bottomLeft.x, currentCharInfo.descender, 0));\n        //                tl = textTransform.TransformPoint(new Vector3(currentCharInfo.bottomLeft.x, currentCharInfo.ascender, 0));\n\n        //                //Debug.Log(\"Start Word Region at [\" + currentCharInfo.character + \"]\");\n\n        //                // If Word is one character\n        //                if (wInfo.characterCount == 1)\n        //                {\n        //                    isBeginRegion = false;\n\n        //                    br = textTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0));\n        //                    tr = textTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0));\n\n        //                    // Check for Intersection\n        //                    if (PointIntersectRectangle(position, bl, tl, tr, br))\n        //                        return i;\n\n        //                    //Debug.Log(\"End Word Region at [\" + currentCharInfo.character + \"]\");\n        //                }\n        //            }\n\n        //            // Last Character of Word\n        //            if (isBeginRegion && j == wInfo.characterCount - 1)\n        //            {\n        //                isBeginRegion = false;\n\n        //                br = textTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0));\n        //                tr = textTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0));\n\n        //                // Check for Intersection\n        //                if (PointIntersectRectangle(position, bl, tl, tr, br))\n        //                    return i;\n\n        //                //Debug.Log(\"End Word Region at [\" + currentCharInfo.character + \"]\");\n        //            }\n        //            // If Word is split on more than one line.\n        //            else if (isBeginRegion && currentLine != text.textInfo.characterInfo[characterIndex + 1].lineNumber)\n        //            {\n        //                isBeginRegion = false;\n\n        //                br = textTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0));\n        //                tr = textTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0));\n\n        //                // Check for Intersection\n        //                if (PointIntersectRectangle(position, bl, tl, tr, br))\n        //                    return i;\n\n        //                //Debug.Log(\"End Word Region at [\" + currentCharInfo.character + \"]\");\n        //            }\n        //        }\n\n        //         // Find the closest line segment to position.\n        //        float dbl = DistanceToLine(bl, tl, position);\n        //        float dtl = DistanceToLine(tl, tr, position);\n        //        float dtr = DistanceToLine(tr, br, position);\n        //        float dbr = DistanceToLine(br, bl, position);\n\n        //        float d = dbl < dtl ? dbl : dtl;\n        //        d = d < dtr ? d : dtr;\n        //        d = d < dbr ? d : dbr;\n\n        //        if (distanceSqr > d)\n        //        {\n        //            distanceSqr = d;\n        //            closest = i;\n        //        }\n        //        //Debug.Log(\"Word at Index: \" + i + \" is located at (\" + bl + \", \" + tl + \", \" + tr + \", \" + br + \").\");\n\n        //    }\n\n        //    return closest;\n\n        //}\n\n\n        /// <summary>\n        /// Function returning the line intersecting the position.\n        /// </summary>\n        /// <param name=\"textComponent\"></param>\n        /// <param name=\"position\"></param>\n        /// <param name=\"camera\"></param>\n        /// <returns></returns>\n        public static int FindIntersectingLine(TMP_Text text, Vector3 position, Camera camera)\n        {\n            RectTransform rectTransform = text.rectTransform;\n\n            int closest = -1;\n\n            // Convert position into Worldspace coordinates\n            ScreenPointToWorldPointInRectangle(rectTransform, position, camera, out position);\n\n            for (int i = 0; i < text.textInfo.lineCount; i++)\n            {\n                TMP_LineInfo lineInfo = text.textInfo.lineInfo[i];\n\n                float ascender = rectTransform.TransformPoint(new Vector3(0, lineInfo.ascender, 0)).y;\n                float descender = rectTransform.TransformPoint(new Vector3(0, lineInfo.descender, 0)).y;\n\n                if (ascender > position.y && descender < position.y)\n                {\n                    //Debug.Log(\"Position is on line \" + i);\n                    return i;\n                }\n            }\n\n            //Debug.Log(\"Closest line to position is \" + closest);\n            return closest;\n        }\n\n\n        /// <summary>\n        /// Function returning the index of the Link at the given position (if any).\n        /// </summary>\n        /// <param name=\"text\">A reference to the TMP_Text component.</param>\n        /// <param name=\"position\">Position to check for intersection.</param>\n        /// <param name=\"camera\">The scene camera which may be assigned to a Canvas using ScreenSpace Camera or WorldSpace render mode. Set to null is using ScreenSpace Overlay.</param>\n        /// <returns></returns>\n        public static int FindIntersectingLink(TMP_Text text, Vector3 position, Camera camera)\n        {\n            Transform rectTransform = text.transform;\n\n            // Convert position into Worldspace coordinates\n            ScreenPointToWorldPointInRectangle(rectTransform, position, camera, out position);\n\n            for (int i = 0; i < text.textInfo.linkCount; i++)\n            {\n                TMP_LinkInfo linkInfo = text.textInfo.linkInfo[i];\n\n                bool isBeginRegion = false;\n\n                Vector3 bl = Vector3.zero;\n                Vector3 tl = Vector3.zero;\n                Vector3 br = Vector3.zero;\n                Vector3 tr = Vector3.zero;\n\n                // Iterate through each character of the word\n                for (int j = 0; j < linkInfo.linkTextLength; j++)\n                {\n                    int characterIndex = linkInfo.linkTextfirstCharacterIndex + j;\n                    TMP_CharacterInfo currentCharInfo = text.textInfo.characterInfo[characterIndex];\n                    int currentLine = currentCharInfo.lineNumber;\n\n                    // Check if Link characters are on the current page\n                    if (text.overflowMode == TextOverflowModes.Page && currentCharInfo.pageNumber + 1 != text.pageToDisplay) continue;\n\n                    if (isBeginRegion == false)\n                    {\n                        isBeginRegion = true;\n\n                        bl = rectTransform.TransformPoint(new Vector3(currentCharInfo.bottomLeft.x, currentCharInfo.descender, 0));\n                        tl = rectTransform.TransformPoint(new Vector3(currentCharInfo.bottomLeft.x, currentCharInfo.ascender, 0));\n\n                        //Debug.Log(\"Start Word Region at [\" + currentCharInfo.character + \"]\");\n\n                        // If Word is one character\n                        if (linkInfo.linkTextLength == 1)\n                        {\n                            isBeginRegion = false;\n\n                            br = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0));\n                            tr = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0));\n\n                            // Check for Intersection\n                            if (PointIntersectRectangle(position, bl, tl, tr, br))\n                                return i;\n\n                            //Debug.Log(\"End Word Region at [\" + currentCharInfo.character + \"]\");\n                        }\n                    }\n\n                    // Last Character of Word\n                    if (isBeginRegion && j == linkInfo.linkTextLength - 1)\n                    {\n                        isBeginRegion = false;\n\n                        br = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0));\n                        tr = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0));\n\n                        // Check for Intersection\n                        if (PointIntersectRectangle(position, bl, tl, tr, br))\n                            return i;\n\n                        //Debug.Log(\"End Word Region at [\" + currentCharInfo.character + \"]\");\n                    }\n                    // If Word is split on more than one line.\n                    else if (isBeginRegion && currentLine != text.textInfo.characterInfo[characterIndex + 1].lineNumber)\n                    {\n                        isBeginRegion = false;\n\n                        br = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0));\n                        tr = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0));\n\n                        // Check for Intersection\n                        if (PointIntersectRectangle(position, bl, tl, tr, br))\n                            return i;\n\n                        //Debug.Log(\"End Word Region at [\" + currentCharInfo.character + \"]\");\n                    }\n                }\n\n                //Debug.Log(\"Word at Index: \" + i + \" is located at (\" + bl + \", \" + tl + \", \" + tr + \", \" + br + \").\");\n\n            }\n\n            return -1;\n        }\n\n        /// <summary>\n        /// Function returning the index of the Link at the given position (if any).\n        /// </summary>\n        /// <param name=\"text\">A reference to the TextMeshPro UGUI component.</param>\n        /// <param name=\"position\">Position to check for intersection.</param>\n        /// <param name=\"camera\">The scene camera which may be assigned to a Canvas using ScreenSpace Camera or WorldSpace render mode. Set to null is using ScreenSpace Overlay.</param>\n        /// <returns></returns>\n        //public static int FindIntersectingLink(TextMeshProUGUI text, Vector3 position, Camera camera)\n        //{\n        //    Transform rectTransform = text.transform;\n\n        //    // Convert position into Worldspace coordinates\n        //    ScreenPointToWorldPointInRectangle(rectTransform, position, camera, out position);\n\n        //    for (int i = 0; i < text.textInfo.linkCount; i++)\n        //    {\n        //        TMP_LinkInfo linkInfo = text.textInfo.linkInfo[i];\n\n        //        bool isBeginRegion = false;\n\n        //        Vector3 bl = Vector3.zero;\n        //        Vector3 tl = Vector3.zero;\n        //        Vector3 br = Vector3.zero;\n        //        Vector3 tr = Vector3.zero;\n\n        //        // Iterate through each character of the word\n        //        for (int j = 0; j < linkInfo.linkTextLength; j++)\n        //        {\n        //            int characterIndex = linkInfo.linkTextfirstCharacterIndex + j;\n        //            TMP_CharacterInfo currentCharInfo = text.textInfo.characterInfo[characterIndex];\n        //            int currentLine = currentCharInfo.lineNumber;\n\n        //            // Check if Link characters are on the current page\n        //            if (text.OverflowMode == TextOverflowModes.Page && currentCharInfo.pageNumber + 1 != text.pageToDisplay) continue;\n\n        //            if (isBeginRegion == false)\n        //            {\n        //                isBeginRegion = true;\n\n        //                bl = rectTransform.TransformPoint(new Vector3(currentCharInfo.bottomLeft.x, currentCharInfo.descender, 0));\n        //                tl = rectTransform.TransformPoint(new Vector3(currentCharInfo.bottomLeft.x, currentCharInfo.ascender, 0));\n\n        //                //Debug.Log(\"Start Word Region at [\" + currentCharInfo.character + \"]\");\n\n        //                // If Word is one character\n        //                if (linkInfo.linkTextLength == 1)\n        //                {\n        //                    isBeginRegion = false;\n\n        //                    br = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0));\n        //                    tr = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0));\n\n        //                    // Check for Intersection\n        //                    if (PointIntersectRectangle(position, bl, tl, tr, br))\n        //                        return i;\n\n        //                    //Debug.Log(\"End Word Region at [\" + currentCharInfo.character + \"]\");\n        //                }\n        //            }\n\n        //            // Last Character of Word\n        //            if (isBeginRegion && j == linkInfo.linkTextLength - 1)\n        //            {\n        //                isBeginRegion = false;\n\n        //                br = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0));\n        //                tr = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0));\n\n        //                // Check for Intersection\n        //                if (PointIntersectRectangle(position, bl, tl, tr, br))\n        //                    return i;\n\n        //                //Debug.Log(\"End Word Region at [\" + currentCharInfo.character + \"]\");\n        //            }\n        //            // If Word is split on more than one line.\n        //            else if (isBeginRegion && currentLine != text.textInfo.characterInfo[characterIndex + 1].lineNumber)\n        //            {\n        //                isBeginRegion = false;\n\n        //                br = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0));\n        //                tr = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0));\n\n        //                // Check for Intersection\n        //                if (PointIntersectRectangle(position, bl, tl, tr, br))\n        //                    return i;\n\n        //                //Debug.Log(\"End Word Region at [\" + currentCharInfo.character + \"]\");\n        //            }\n        //        }\n\n        //        //Debug.Log(\"Word at Index: \" + i + \" is located at (\" + bl + \", \" + tl + \", \" + tr + \", \" + br + \").\");\n\n        //    }\n\n        //    return -1;\n        //}\n\n\n        /// <summary>\n        /// Function returning the index of the Link at the given position (if any).\n        /// </summary>\n        /// <param name=\"text\">A reference to the TextMeshPro component.</param>\n        /// <param name=\"position\">Position to check for intersection.</param>\n        /// <param name=\"camera\">The camera which is rendering the text object.</param>\n        /// <returns></returns>\n        //public static int FindIntersectingLink(TextMeshPro text, Vector3 position, Camera camera)\n        //{\n        //    Transform textTransform = text.transform;\n\n        //    // Convert position into Worldspace coordinates\n        //    ScreenPointToWorldPointInRectangle(textTransform, position, camera, out position);\n\n        //    for (int i = 0; i < text.textInfo.linkCount; i++)\n        //    {\n        //        TMP_LinkInfo linkInfo = text.textInfo.linkInfo[i];\n\n        //        bool isBeginRegion = false;\n\n        //        Vector3 bl = Vector3.zero;\n        //        Vector3 tl = Vector3.zero;\n        //        Vector3 br = Vector3.zero;\n        //        Vector3 tr = Vector3.zero;\n\n        //        // Iterate through each character of the word\n        //        for (int j = 0; j < linkInfo.linkTextLength; j++)\n        //        {\n        //            int characterIndex = linkInfo.linkTextfirstCharacterIndex + j;\n        //            TMP_CharacterInfo currentCharInfo = text.textInfo.characterInfo[characterIndex];\n        //            int currentLine = currentCharInfo.lineNumber;\n\n        //            // Check if Link characters are on the current page\n        //            if (text.OverflowMode == TextOverflowModes.Page && currentCharInfo.pageNumber + 1 != text.pageToDisplay) continue;\n\n        //            if (isBeginRegion == false)\n        //            {\n        //                isBeginRegion = true;\n\n        //                bl = textTransform.TransformPoint(new Vector3(currentCharInfo.bottomLeft.x, currentCharInfo.descender, 0));\n        //                tl = textTransform.TransformPoint(new Vector3(currentCharInfo.bottomLeft.x, currentCharInfo.ascender, 0));\n\n        //                //Debug.Log(\"Start Word Region at [\" + currentCharInfo.character + \"]\");\n\n        //                // If Word is one character\n        //                if (linkInfo.linkTextLength == 1)\n        //                {\n        //                    isBeginRegion = false;\n\n        //                    br = textTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0));\n        //                    tr = textTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0));\n\n        //                    // Check for Intersection\n        //                    if (PointIntersectRectangle(position, bl, tl, tr, br))\n        //                        return i;\n\n        //                    //Debug.Log(\"End Word Region at [\" + currentCharInfo.character + \"]\");\n        //                }\n        //            }\n\n        //            // Last Character of Word\n        //            if (isBeginRegion && j == linkInfo.linkTextLength - 1)\n        //            {\n        //                isBeginRegion = false;\n\n        //                br = textTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0));\n        //                tr = textTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0));\n\n        //                // Check for Intersection\n        //                if (PointIntersectRectangle(position, bl, tl, tr, br))\n        //                    return i;\n\n        //                //Debug.Log(\"End Word Region at [\" + currentCharInfo.character + \"]\");\n        //            }\n        //            // If Word is split on more than one line.\n        //            else if (isBeginRegion && currentLine != text.textInfo.characterInfo[characterIndex + 1].lineNumber)\n        //            {\n        //                isBeginRegion = false;\n\n        //                br = textTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0));\n        //                tr = textTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0));\n\n        //                // Check for Intersection\n        //                if (PointIntersectRectangle(position, bl, tl, tr, br))\n        //                    return i;\n\n        //                //Debug.Log(\"End Word Region at [\" + currentCharInfo.character + \"]\");\n        //            }\n        //        }\n\n        //        //Debug.Log(\"Word at Index: \" + i + \" is located at (\" + bl + \", \" + tl + \", \" + tr + \", \" + br + \").\");\n\n        //    }\n\n        //    return -1;\n        //}\n\n\n        /// <summary>\n        /// Function returning the index of the word at the given position (if any).\n        /// </summary>\n        /// <param name=\"text\">A reference to the TMP_Text component.</param>\n        /// <param name=\"position\">Position to check for intersection.</param>\n        /// <param name=\"camera\">The scene camera which may be assigned to a Canvas using ScreenSpace Camera or WorldSpace render mode. Set to null is using ScreenSpace Overlay.</param>\n        /// <returns></returns>\n        public static int FindNearestLink(TMP_Text text, Vector3 position, Camera camera)\n        {\n            RectTransform rectTransform = text.rectTransform;\n\n            // Convert position into Worldspace coordinates\n            ScreenPointToWorldPointInRectangle(rectTransform, position, camera, out position);\n\n            float distanceSqr = Mathf.Infinity;\n            int closest = 0;\n\n            for (int i = 0; i < text.textInfo.linkCount; i++)\n            {\n                TMP_LinkInfo linkInfo = text.textInfo.linkInfo[i];\n\n                bool isBeginRegion = false;\n\n                Vector3 bl = Vector3.zero;\n                Vector3 tl = Vector3.zero;\n                Vector3 br = Vector3.zero;\n                Vector3 tr = Vector3.zero;\n\n                // Iterate through each character of the link\n                for (int j = 0; j < linkInfo.linkTextLength; j++)\n                {\n                    int characterIndex = linkInfo.linkTextfirstCharacterIndex + j;\n                    TMP_CharacterInfo currentCharInfo = text.textInfo.characterInfo[characterIndex];\n                    int currentLine = currentCharInfo.lineNumber;\n\n                    // Check if Link characters are on the current page\n                    if (text.overflowMode == TextOverflowModes.Page && currentCharInfo.pageNumber + 1 != text.pageToDisplay) continue;\n\n                    if (isBeginRegion == false)\n                    {\n                        isBeginRegion = true;\n\n                        //Debug.Log(\"Start Word Region at [\" + currentCharInfo.character + \"]\");\n\n                        bl = rectTransform.TransformPoint(new Vector3(currentCharInfo.bottomLeft.x, currentCharInfo.descender, 0));\n                        tl = rectTransform.TransformPoint(new Vector3(currentCharInfo.bottomLeft.x, currentCharInfo.ascender, 0));\n\n                        // If Link is one character\n                        if (linkInfo.linkTextLength == 1)\n                        {\n                            isBeginRegion = false;\n\n                            br = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0));\n                            tr = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0));\n\n                            // Check for Intersection\n                            if (PointIntersectRectangle(position, bl, tl, tr, br))\n                                return i;\n\n                            // Find the closest line segment to position.\n                            float dbl = DistanceToLine(bl, tl, position); \n                            float dtl = DistanceToLine(tl, tr, position); \n                            float dtr = DistanceToLine(tr, br, position); \n                            float dbr = DistanceToLine(br, bl, position);\n\n                            float d = dbl < dtl ? dbl : dtl;\n                            d = d < dtr ? d : dtr;\n                            d = d < dbr ? d : dbr;\n\n                            if (distanceSqr > d)\n                            {\n                                distanceSqr = d;\n                                closest = i;\n                            }\n\n                        }\n                    }\n\n                    // Last Character of Word\n                    if (isBeginRegion && j == linkInfo.linkTextLength - 1)\n                    {\n                        isBeginRegion = false;\n\n                        br = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0));\n                        tr = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0));\n\n                        // Check for Intersection\n                        if (PointIntersectRectangle(position, bl, tl, tr, br))\n                            return i;\n\n                        // Find the closest line segment to position.\n                        float dbl = DistanceToLine(bl, tl, position);\n                        float dtl = DistanceToLine(tl, tr, position);\n                        float dtr = DistanceToLine(tr, br, position);\n                        float dbr = DistanceToLine(br, bl, position);\n\n                        float d = dbl < dtl ? dbl : dtl;\n                        d = d < dtr ? d : dtr;\n                        d = d < dbr ? d : dbr;\n\n                        if (distanceSqr > d)\n                        {\n                            distanceSqr = d;\n                            closest = i;\n                        }\n\n                    }\n                    // If Link is split on more than one line.\n                    else if (isBeginRegion && currentLine != text.textInfo.characterInfo[characterIndex + 1].lineNumber)\n                    {\n                        isBeginRegion = false;\n\n                        br = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0));\n                        tr = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0));\n\n                        // Check for Intersection\n                        if (PointIntersectRectangle(position, bl, tl, tr, br))\n                            return i;\n\n                        // Find the closest line segment to position.\n                        float dbl = DistanceToLine(bl, tl, position);\n                        float dtl = DistanceToLine(tl, tr, position);\n                        float dtr = DistanceToLine(tr, br, position);\n                        float dbr = DistanceToLine(br, bl, position);\n\n                        float d = dbl < dtl ? dbl : dtl;\n                        d = d < dtr ? d : dtr;\n                        d = d < dbr ? d : dbr;\n\n                        if (distanceSqr > d)\n                        {\n                            distanceSqr = d;\n                            closest = i;\n                        }\n                    }\n                }\n\n                //Debug.Log(\"Word at Index: \" + i + \" is located at (\" + bl + \", \" + tl + \", \" + tr + \", \" + br + \").\");\n\n            }\n\n            return closest;\n        }\n\n\n        /// <summary>\n        /// Function returning the index of the word at the given position (if any).\n        /// </summary>\n        /// <param name=\"text\">A reference to the TextMeshPro UGUI component.</param>\n        /// <param name=\"position\">Position to check for intersection.</param>\n        /// <param name=\"camera\">The scene camera which may be assigned to a Canvas using ScreenSpace Camera or WorldSpace render mode. Set to null is using ScreenSpace Overlay.</param>\n        /// <returns></returns>\n        //public static int FindNearestLink(TextMeshProUGUI text, Vector3 position, Camera camera)\n        //{\n        //    RectTransform rectTransform = text.rectTransform;\n\n        //    // Convert position into Worldspace coordinates\n        //    ScreenPointToWorldPointInRectangle(rectTransform, position, camera, out position);\n\n        //    float distanceSqr = Mathf.Infinity;\n        //    int closest = 0;\n\n        //    for (int i = 0; i < text.textInfo.linkCount; i++)\n        //    {\n        //        TMP_LinkInfo linkInfo = text.textInfo.linkInfo[i];\n\n        //        bool isBeginRegion = false;\n\n        //        Vector3 bl = Vector3.zero;\n        //        Vector3 tl = Vector3.zero;\n        //        Vector3 br = Vector3.zero;\n        //        Vector3 tr = Vector3.zero;\n\n        //        // Iterate through each character of the word\n        //        for (int j = 0; j < linkInfo.linkTextLength; j++)\n        //        {\n        //            int characterIndex = linkInfo.linkTextfirstCharacterIndex + j;\n        //            TMP_CharacterInfo currentCharInfo = text.textInfo.characterInfo[characterIndex];\n        //            int currentLine = currentCharInfo.lineNumber;\n\n        //            if (isBeginRegion == false)\n        //            {\n        //                isBeginRegion = true;\n\n        //                bl = rectTransform.TransformPoint(new Vector3(currentCharInfo.bottomLeft.x, currentCharInfo.descender, 0));\n        //                tl = rectTransform.TransformPoint(new Vector3(currentCharInfo.bottomLeft.x, currentCharInfo.ascender, 0));\n\n        //                //Debug.Log(\"Start Word Region at [\" + currentCharInfo.character + \"]\");\n\n        //                // If Word is one character\n        //                if (linkInfo.linkTextLength == 1)\n        //                {\n        //                    isBeginRegion = false;\n\n        //                    br = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0));\n        //                    tr = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0));\n\n        //                    // Check for Intersection\n        //                    if (PointIntersectRectangle(position, bl, tl, tr, br))\n        //                        return i;\n\n        //                    //Debug.Log(\"End Word Region at [\" + currentCharInfo.character + \"]\");\n        //                }\n        //            }\n\n        //            // Last Character of Word\n        //            if (isBeginRegion && j == linkInfo.linkTextLength - 1)\n        //            {\n        //                isBeginRegion = false;\n\n        //                br = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0));\n        //                tr = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0));\n\n        //                // Check for Intersection\n        //                if (PointIntersectRectangle(position, bl, tl, tr, br))\n        //                    return i;\n\n        //                //Debug.Log(\"End Word Region at [\" + currentCharInfo.character + \"]\");\n        //            }\n        //            // If Word is split on more than one line.\n        //            else if (isBeginRegion && currentLine != text.textInfo.characterInfo[characterIndex + 1].lineNumber)\n        //            {\n        //                isBeginRegion = false;\n\n        //                br = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0));\n        //                tr = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0));\n\n        //                // Check for Intersection\n        //                if (PointIntersectRectangle(position, bl, tl, tr, br))\n        //                    return i;\n\n        //                //Debug.Log(\"End Word Region at [\" + currentCharInfo.character + \"]\");\n        //            }\n        //        }\n\n        //        // Find the closest line segment to position.\n        //        float dbl = DistanceToLine(bl, tl, position); // (position - bl).sqrMagnitude;\n        //        float dtl = DistanceToLine(tl, tr, position); // (position - tl).sqrMagnitude;\n        //        float dtr = DistanceToLine(tr, br, position); // (position - tr).sqrMagnitude;\n        //        float dbr = DistanceToLine(br, bl, position); // (position - br).sqrMagnitude;\n\n        //        float d = dbl < dtl ? dbl : dtl;\n        //        d = d < dtr ? d : dtr;\n        //        d = d < dbr ? d : dbr;\n\n        //        if (distanceSqr > d)\n        //        {\n        //            distanceSqr = d;\n        //            closest = i;\n        //        }\n        //        //Debug.Log(\"Word at Index: \" + i + \" is located at (\" + bl + \", \" + tl + \", \" + tr + \", \" + br + \").\");\n\n        //    }\n\n        //    return closest;\n        //}\n\n\n        /// <summary>\n        /// Function returning the index of the word at the given position (if any).\n        /// </summary>\n        /// <param name=\"text\">A reference to the TextMeshPro component.</param>\n        /// <param name=\"position\">Position to check for intersection.</param>\n        /// <param name=\"camera\">The camera which is rendering the text object.</param>\n        /// <returns></returns>\n        //public static int FindNearestLink(TextMeshPro text, Vector3 position, Camera camera)\n        //{\n        //    Transform textTransform = text.transform;\n\n        //    // Convert position into Worldspace coordinates\n        //    ScreenPointToWorldPointInRectangle(textTransform, position, camera, out position);\n\n        //    float distanceSqr = Mathf.Infinity;\n        //    int closest = 0;\n\n        //    for (int i = 0; i < text.textInfo.linkCount; i++)\n        //    {\n        //        TMP_LinkInfo linkInfo = text.textInfo.linkInfo[i];\n\n        //        bool isBeginRegion = false;\n\n        //        Vector3 bl = Vector3.zero;\n        //        Vector3 tl = Vector3.zero;\n        //        Vector3 br = Vector3.zero;\n        //        Vector3 tr = Vector3.zero;\n\n        //        // Iterate through each character of the word\n        //        for (int j = 0; j < linkInfo.linkTextLength; j++)\n        //        {\n        //            int characterIndex = linkInfo.linkTextfirstCharacterIndex + j;\n        //            TMP_CharacterInfo currentCharInfo = text.textInfo.characterInfo[characterIndex];\n        //            int currentLine = currentCharInfo.lineNumber;\n\n        //            if (isBeginRegion == false)\n        //            {\n        //                isBeginRegion = true;\n\n        //                bl = textTransform.TransformPoint(new Vector3(currentCharInfo.bottomLeft.x, currentCharInfo.descender, 0));\n        //                tl = textTransform.TransformPoint(new Vector3(currentCharInfo.bottomLeft.x, currentCharInfo.ascender, 0));\n\n        //                //Debug.Log(\"Start Word Region at [\" + currentCharInfo.character + \"]\");\n\n        //                // If Word is one character\n        //                if (linkInfo.linkTextLength == 1)\n        //                {\n        //                    isBeginRegion = false;\n\n        //                    br = textTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0));\n        //                    tr = textTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0));\n\n        //                    // Check for Intersection\n        //                    if (PointIntersectRectangle(position, bl, tl, tr, br))\n        //                        return i;\n\n        //                    //Debug.Log(\"End Word Region at [\" + currentCharInfo.character + \"]\");\n        //                }\n        //            }\n\n        //            // Last Character of Word\n        //            if (isBeginRegion && j == linkInfo.linkTextLength - 1)\n        //            {\n        //                isBeginRegion = false;\n\n        //                br = textTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0));\n        //                tr = textTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0));\n\n        //                // Check for Intersection\n        //                if (PointIntersectRectangle(position, bl, tl, tr, br))\n        //                    return i;\n\n        //                //Debug.Log(\"End Word Region at [\" + currentCharInfo.character + \"]\");\n        //            }\n        //            // If Word is split on more than one line.\n        //            else if (isBeginRegion && currentLine != text.textInfo.characterInfo[characterIndex + 1].lineNumber)\n        //            {\n        //                isBeginRegion = false;\n\n        //                br = textTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0));\n        //                tr = textTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0));\n\n        //                // Check for Intersection\n        //                if (PointIntersectRectangle(position, bl, tl, tr, br))\n        //                    return i;\n\n        //                //Debug.Log(\"End Word Region at [\" + currentCharInfo.character + \"]\");\n        //            }\n        //        }\n\n        //        // Find the closest line segment to position.\n        //        float dbl = DistanceToLine(bl, tl, position);\n        //        float dtl = DistanceToLine(tl, tr, position);\n        //        float dtr = DistanceToLine(tr, br, position);\n        //        float dbr = DistanceToLine(br, bl, position);\n\n        //        float d = dbl < dtl ? dbl : dtl;\n        //        d = d < dtr ? d : dtr;\n        //        d = d < dbr ? d : dbr;\n\n        //        if (distanceSqr > d)\n        //        {\n        //            distanceSqr = d;\n        //            closest = i;\n        //        }\n        //        //Debug.Log(\"Word at Index: \" + i + \" is located at (\" + bl + \", \" + tl + \", \" + tr + \", \" + br + \").\");\n\n        //    }\n        //    return closest;\n        //}\n\n\n    \n        /// <summary>\n        /// Function to check if a Point is contained within a Rectangle.\n        /// </summary>\n        /// <param name=\"m\"></param>\n        /// <param name=\"a\"></param>\n        /// <param name=\"b\"></param>\n        /// <param name=\"c\"></param>\n        /// <param name=\"d\"></param>\n        /// <returns></returns>\n        private static bool PointIntersectRectangle(Vector3 m, Vector3 a, Vector3 b, Vector3 c, Vector3 d)\n        {\n            Vector3 ab = b - a;\n            Vector3 am = m - a;\n            Vector3 bc = c - b;\n            Vector3 bm = m - b;\n\n            float abamDot = Vector3.Dot(ab, am);\n            float bcbmDot = Vector3.Dot(bc, bm);\n\n            return 0 <= abamDot && abamDot <= Vector3.Dot(ab, ab) && 0 <= bcbmDot && bcbmDot <= Vector3.Dot(bc, bc);\n        }\n\n\n        /// <summary>\n        /// Method to convert ScreenPoint to WorldPoint aligned with Rectangle\n        /// </summary>\n        /// <param name=\"transform\"></param>\n        /// <param name=\"screenPoint\"></param>\n        /// <param name=\"cam\"></param>\n        /// <param name=\"worldPoint\"></param>\n        /// <returns></returns>\n        public static bool ScreenPointToWorldPointInRectangle(Transform transform, Vector2 screenPoint, Camera cam, out Vector3 worldPoint)\n        {\n            worldPoint = (Vector3)Vector2.zero;\n            Ray ray = RectTransformUtility.ScreenPointToRay(cam, screenPoint);\n\n            if (!new Plane(transform.rotation * Vector3.back, transform.position).Raycast(ray, out float enter))\n                return false;\n\n            worldPoint = ray.GetPoint(enter);\n\n            return true;\n        }\n\n\n        private struct LineSegment\n        {\n            public Vector3 Point1;\n            public Vector3 Point2;\n\n            public LineSegment(Vector3 p1, Vector3 p2)\n            {\n                Point1 = p1;\n                Point2 = p2;\n            }\n        }\n\n\n        /// <summary>\n        /// Function returning the point of intersection between a line and a plane.\n        /// </summary>\n        /// <param name=\"line\"></param>\n        /// <param name=\"point\"></param>\n        /// <param name=\"normal\"></param>\n        /// <param name=\"intersectingPoint\"></param>\n        /// <returns></returns>\n        private static bool IntersectLinePlane(LineSegment line, Vector3 point, Vector3 normal, out Vector3 intersectingPoint)\n        {\n            intersectingPoint = Vector3.zero;\n            Vector3 u = line.Point2 - line.Point1;\n            Vector3 w = line.Point1 - point;\n\n            float D = Vector3.Dot(normal, u);\n            float N = -Vector3.Dot(normal, w);\n\n            if (Mathf.Abs(D) < Mathf.Epsilon)   // if line is parallel & co-planar to plane\n            {\n                if (N == 0)\n                    return true;\n                else\n                    return false;\n            }\n\n            float sI = N / D;\n\n            if (sI < 0 || sI > 1) // Line parallel to plane\n                return false;\n\n            intersectingPoint = line.Point1 + sI * u;\n\n            return true;\n        }\n\n\n        /// <summary>\n        /// Function returning the Square Distance from a Point to a Line.\n        /// </summary>\n        /// <param name=\"a\"></param>\n        /// <param name=\"b\"></param>\n        /// <param name=\"point\"></param>\n        /// <returns></returns>\n        public static float DistanceToLine(Vector3 a, Vector3 b, Vector3 point)\n        {            \n            Vector3 n = b - a;\n            Vector3 pa = a - point;\n \n            float c = Vector3.Dot( n, pa );\n \n            // Closest point is a\n            if ( c > 0.0f )\n                return Vector3.Dot( pa, pa );\n \n            Vector3 bp = point - b;\n \n            // Closest point is b\n            if (Vector3.Dot( n, bp ) > 0.0f )\n                return Vector3.Dot( bp, bp );\n \n            // Closest point is between a and b\n            Vector3 e = pa - n * (c / Vector3.Dot( n, n ));\n \n            return Vector3.Dot( e, e );\n        }\n\n\n        /// <summary>\n        /// Function returning the Square Distance from a Point to a Line and Direction.\n        /// </summary>\n        /// <param name=\"a\"></param>\n        /// <param name=\"b\"></param>\n        /// <param name=\"point\"></param>\n        /// <param name=\"direction\">-1 left, 0 in between, 1 right</param>\n        /// <returns></returns>\n        //public static float DistanceToLineDirectional(Vector3 a, Vector3 b, Vector3 point, ref int direction)\n        //{\n        //    Vector3 n = b - a;\n        //    Vector3 pa = a - point;\n\n        //    float c = Vector3.Dot(n, pa);\n        //    direction = -1;\n\n        //    // Closest point is a\n        //    if (c > 0.0f)\n        //        return Vector3.Dot(pa, pa);\n\n        //    Vector3 bp = point - b;\n        //    direction = 1;\n\n        //    // Closest point is b\n        //    if (Vector3.Dot(n, bp) > 0.0f)\n        //        return Vector3.Dot(bp, bp);\n\n        //    // Closest point is between a and b\n        //    Vector3 e = pa - n * (c / Vector3.Dot(n, n));\n\n        //    direction = 0;\n        //    return Vector3.Dot(e, e);\n        //}\n\n\n        /// <summary>\n        /// Table used to convert character to lowercase.\n        /// </summary>\n        const string k_lookupStringL = \"-------------------------------- !-#$%&-()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[-]^_`abcdefghijklmnopqrstuvwxyz{|}~-\";\n\n        /// <summary>\n        /// Table used to convert character to uppercase.\n        /// </summary>\n        const string k_lookupStringU = \"-------------------------------- !-#$%&-()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[-]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~-\";\n\n\n        /// <summary>\n        /// Get lowercase version of this ASCII character.\n        /// </summary>\n        public static char ToLowerFast(char c)\n        {\n            if (c > k_lookupStringL.Length - 1)\n                return c;\n\n            return k_lookupStringL[c];\n        }\n\n        /// <summary>\n        /// Get uppercase version of this ASCII character.\n        /// </summary>\n        public static char ToUpperFast(char c)\n        {\n            if (c > k_lookupStringU.Length - 1)\n                return c;\n\n            return k_lookupStringU[c];\n        }\n\n        /// <summary>\n        /// Function which returns a simple hashcode from a string.\n        /// </summary>\n        /// <returns></returns>\n        public static int GetSimpleHashCode(string s)\n        {\n            int hashCode = 0; // 5381;\n\n            for (int i = 0; i < s.Length; i++)\n                hashCode = (hashCode << 5) + hashCode ^ s[i];\n\n            return hashCode;\n        }\n\n        /// <summary>\n        /// Function which returns a simple hashcode from a string converted to lowercase.\n        /// </summary>\n        /// <returns></returns>\n        public static uint GetSimpleHashCodeLowercase(string s)\n        {\n            uint hashCode = 5381;\n\n            for (int i = 0; i < s.Length; i++)\n                hashCode = (hashCode << 5) + hashCode ^ ToLowerFast(s[i]);\n\n            return hashCode;\n        }\n\n\n        /// <summary>\n        /// Function to convert Hex to Int\n        /// </summary>\n        /// <param name=\"hex\"></param>\n        /// <returns></returns>\n        public static int HexToInt(char hex)\n        {\n            switch (hex)\n            {\n                case '0': return 0;\n                case '1': return 1;\n                case '2': return 2;\n                case '3': return 3;\n                case '4': return 4;\n                case '5': return 5;\n                case '6': return 6;\n                case '7': return 7;\n                case '8': return 8;\n                case '9': return 9;\n                case 'A': return 10;\n                case 'B': return 11;\n                case 'C': return 12;\n                case 'D': return 13;\n                case 'E': return 14;\n                case 'F': return 15;\n                case 'a': return 10;\n                case 'b': return 11;\n                case 'c': return 12;\n                case 'd': return 13;\n                case 'e': return 14;\n                case 'f': return 15;\n            }\n            return 15;\n        }\n\n\n        /// <summary>\n        /// Function to convert a properly formatted string which contains an hex value to its decimal value. \n        /// </summary>\n        /// <param name=\"s\"></param>\n        /// <returns></returns>\n        public static int StringHexToInt(string s)\n        {\n            int value = 0;\n\n            for (int i = 0; i < s.Length; i++)\n            {\n                value += HexToInt(s[i]) * (int)Mathf.Pow(16, (s.Length - 1) - i);\n            }\n\n            return value;\n        }\n\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_TextUtilities.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 4f0ca6874aa74540bb3d4fe5a0f86bcc\ntimeCreated: 1432117579\nlicenseType: Store\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_UpdateManager.cs",
    "content": "﻿using UnityEngine;\nusing UnityEngine.UI;\nusing System.Collections.Generic;\n\n#if UNITY_2019_1_OR_NEWER\nusing UnityEngine.Rendering;\n#elif UNITY_2018_1_OR_NEWER\nusing UnityEngine.Experimental.Rendering;\n#endif\n\n\nnamespace TMPro\n{\n\n    public class TMP_UpdateManager\n    {\n        private static TMP_UpdateManager s_Instance;\n\n        private readonly List<TMP_Text> m_LayoutRebuildQueue = new List<TMP_Text>();\n        private Dictionary<int, int> m_LayoutQueueLookup = new Dictionary<int, int>();\n\n        private readonly List<TMP_Text> m_GraphicRebuildQueue = new List<TMP_Text>();\n        private Dictionary<int, int> m_GraphicQueueLookup = new Dictionary<int, int>();\n\n        private readonly List<TMP_Text> m_InternalUpdateQueue = new List<TMP_Text>();\n        private Dictionary<int, int> m_InternalUpdateLookup = new Dictionary<int, int>();\n\n        //private bool m_PerformingGraphicRebuild;\n        //private bool m_PerformingLayoutRebuild;\n\n        /// <summary>\n        /// Get a singleton instance of the registry\n        /// </summary>\n        public static TMP_UpdateManager instance\n        {\n            get\n            {\n                if (TMP_UpdateManager.s_Instance == null)\n                    TMP_UpdateManager.s_Instance = new TMP_UpdateManager();\n                return TMP_UpdateManager.s_Instance;\n            }\n        }\n\n\n        /// <summary>\n        /// Register to receive rendering callbacks.\n        /// </summary>\n        protected TMP_UpdateManager()\n        {\n            Camera.onPreCull += OnCameraPreCull;\n\n            #if UNITY_2019_1_OR_NEWER\n                RenderPipelineManager.beginFrameRendering += OnBeginFrameRendering;\n            #elif UNITY_2018_1_OR_NEWER\n                RenderPipeline.beginFrameRendering += OnBeginFrameRendering;\n            #endif\n        }\n\n        \n        /// <summary>\n        /// Function used as a replacement for LateUpdate() to handle SDF Scale updates and Legacy Animation updates.\n        /// </summary>\n        /// <param name=\"textObject\"></param>\n        internal static void RegisterTextObjectForUpdate(TMP_Text textObject)\n        {\n            TMP_UpdateManager.instance.InternalRegisterTextObjectForUpdate(textObject);\n        }\n\n        private void InternalRegisterTextObjectForUpdate(TMP_Text textObject)\n        {\n            int id = textObject.GetInstanceID();\n\n            if (this.m_InternalUpdateLookup.ContainsKey(id))\n                return;\n\n            m_InternalUpdateLookup[id] = id;\n            this.m_InternalUpdateQueue.Add(textObject);\n\n            return;\n        }\n\n\n        /// <summary>\n        /// Function to register elements which require a layout rebuild.\n        /// </summary>\n        /// <param name=\"element\"></param>\n        public static void RegisterTextElementForLayoutRebuild(TMP_Text element)\n        {\n            TMP_UpdateManager.instance.InternalRegisterTextElementForLayoutRebuild(element);\n        }\n\n        private bool InternalRegisterTextElementForLayoutRebuild(TMP_Text element)\n        {\n            int id = element.GetInstanceID();\n\n            if (this.m_LayoutQueueLookup.ContainsKey(id))\n                return false;\n\n            m_LayoutQueueLookup[id] = id;\n            this.m_LayoutRebuildQueue.Add(element);\n\n            return true;\n        }\n\n\n        /// <summary>\n        /// Function to register elements which require a layout rebuild.\n        /// </summary>\n        /// <param name=\"element\"></param>\n        public static void RegisterTextElementForGraphicRebuild(TMP_Text element)\n        {\n            TMP_UpdateManager.instance.InternalRegisterTextElementForGraphicRebuild(element);\n        }\n\n        private bool InternalRegisterTextElementForGraphicRebuild(TMP_Text element)\n        {\n            int id = element.GetInstanceID();\n\n            if (this.m_GraphicQueueLookup.ContainsKey(id))\n                return false;\n\n            m_GraphicQueueLookup[id] = id;\n            this.m_GraphicRebuildQueue.Add(element);\n\n            return true;\n        }\n\n\n        /// <summary>\n        /// Callback which occurs just before the Scriptable Render Pipeline (SRP) begins rendering.\n        /// </summary>\n        /// <param name=\"cameras\"></param>\n        #if UNITY_2019_1_OR_NEWER\n        void OnBeginFrameRendering(ScriptableRenderContext renderContext, Camera[] cameras)\n        #elif UNITY_2018_1_OR_NEWER\n        void OnBeginFrameRendering(Camera[] cameras)\n        #endif\n        {\n            // Exclude the PreRenderCamera\n            #if UNITY_EDITOR\n            if (cameras.Length == 1 && cameras[0].cameraType == CameraType.Preview) \n                return;\n            #endif\n            DoRebuilds();\n        }\n\n        /// <summary>\n        /// Callback which occurs just before the cam is rendered.\n        /// </summary>\n        /// <param name=\"cam\"></param>\n        void OnCameraPreCull(Camera cam)\n        {\n            // Exclude the PreRenderCamera\n            #if UNITY_EDITOR\n            if (cam.cameraType == CameraType.Preview) \n                return;\n            #endif\n            DoRebuilds();\n        }\n        \n        /// <summary>\n        /// Process the rebuild requests in the rebuild queues.\n        /// </summary>\n        void DoRebuilds()\n        {\n            // Handle text objects the require an update either as a result of scale changes or legacy animation.\n            for (int i = 0; i < m_InternalUpdateQueue.Count; i++)\n            {\n                m_InternalUpdateQueue[i].InternalUpdate();\n            }\n\n            // Handle Layout Rebuild Phase\n            for (int i = 0; i < m_LayoutRebuildQueue.Count; i++)\n            {\n                m_LayoutRebuildQueue[i].Rebuild(CanvasUpdate.Prelayout);\n            }\n\n            if (m_LayoutRebuildQueue.Count > 0)\n            {\n                m_LayoutRebuildQueue.Clear();\n                m_LayoutQueueLookup.Clear();\n            }\n\n            // Handle Graphic Rebuild Phase\n            for (int i = 0; i < m_GraphicRebuildQueue.Count; i++)\n            {\n                m_GraphicRebuildQueue[i].Rebuild(CanvasUpdate.PreRender);\n            }\n\n            // If there are no objects in the queue, we don't need to clear the lists again.\n            if (m_GraphicRebuildQueue.Count > 0)\n            {\n                m_GraphicRebuildQueue.Clear();\n                m_GraphicQueueLookup.Clear();\n            }\n        }\n\n        internal static void UnRegisterTextObjectForUpdate(TMP_Text textObject)\n        {\n            TMP_UpdateManager.instance.InternalUnRegisterTextObjectForUpdate(textObject);\n        }\n\n        /// <summary>\n        /// Function to unregister elements which no longer require a rebuild.\n        /// </summary>\n        /// <param name=\"element\"></param>\n        public static void UnRegisterTextElementForRebuild(TMP_Text element)\n        {\n            TMP_UpdateManager.instance.InternalUnRegisterTextElementForGraphicRebuild(element);\n            TMP_UpdateManager.instance.InternalUnRegisterTextElementForLayoutRebuild(element);\n            TMP_UpdateManager.instance.InternalUnRegisterTextObjectForUpdate(element);\n        }\n\n        private void InternalUnRegisterTextElementForGraphicRebuild(TMP_Text element)\n        {\n            int id = element.GetInstanceID();\n\n            TMP_UpdateManager.instance.m_GraphicRebuildQueue.Remove(element);\n            m_GraphicQueueLookup.Remove(id);\n        }\n\n        private void InternalUnRegisterTextElementForLayoutRebuild(TMP_Text element)\n        {\n            int id = element.GetInstanceID();\n\n            TMP_UpdateManager.instance.m_LayoutRebuildQueue.Remove(element);\n            m_LayoutQueueLookup.Remove(id);\n        }\n\n        private void InternalUnRegisterTextObjectForUpdate(TMP_Text textObject)\n        {\n            int id = textObject.GetInstanceID();\n\n            TMP_UpdateManager.instance.m_InternalUpdateQueue.Remove(textObject);\n            m_InternalUpdateLookup.Remove(id);\n        }\n    }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_UpdateManager.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 691db8cb70c4426a8ae718465c21345f\ntimeCreated: 1447406424\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_UpdateRegistery.cs",
    "content": "﻿using UnityEngine;\nusing UnityEngine.UI;\nusing UnityEngine.UI.Collections;\nusing System.Collections;\nusing System.Collections.Generic;\n\n\nnamespace TMPro\n{\n    /// <summary>\n    /// Class for handling and scheduling text object updates.\n    /// </summary>\n    public class TMP_UpdateRegistry\n    {\n        private static TMP_UpdateRegistry s_Instance;\n\n        private readonly List<ICanvasElement> m_LayoutRebuildQueue = new List<ICanvasElement>();\n        private Dictionary<int, int> m_LayoutQueueLookup = new Dictionary<int, int>();\n\n        private readonly List<ICanvasElement> m_GraphicRebuildQueue = new List<ICanvasElement>();\n        private Dictionary<int, int> m_GraphicQueueLookup = new Dictionary<int, int>();\n\n        //private bool m_PerformingLayoutUpdate;\n        //private bool m_PerformingGraphicUpdate;\n\n        /// <summary>\n        /// Get a singleton instance of the registry\n        /// </summary>\n        public static TMP_UpdateRegistry instance\n        {\n            get\n            {\n                if (TMP_UpdateRegistry.s_Instance == null)\n                    TMP_UpdateRegistry.s_Instance = new TMP_UpdateRegistry();\n                return TMP_UpdateRegistry.s_Instance;\n            }\n        }\n\n\n        /// <summary>\n        /// Register to receive callback from the Canvas System.\n        /// </summary>\n        protected TMP_UpdateRegistry()\n        {\n            //Debug.Log(\"Adding WillRenderCanvases\");\n            Canvas.willRenderCanvases += PerformUpdateForCanvasRendererObjects;\n        }\n\n\n        /// <summary>\n        /// Function to register elements which require a layout rebuild.\n        /// </summary>\n        /// <param name=\"element\"></param>\n        public static void RegisterCanvasElementForLayoutRebuild(ICanvasElement element)\n        {\n            TMP_UpdateRegistry.instance.InternalRegisterCanvasElementForLayoutRebuild(element);\n        }\n\n        private bool InternalRegisterCanvasElementForLayoutRebuild(ICanvasElement element)\n        {\n            int id = (element as Object).GetInstanceID();\n\n            if (this.m_LayoutQueueLookup.ContainsKey(id))\n                return false;\n\n            m_LayoutQueueLookup[id] = id;\n            this.m_LayoutRebuildQueue.Add(element);\n\n            return true;\n        }\n\n\n        /// <summary>\n        /// Function to register elements which require a graphic rebuild.\n        /// </summary>\n        /// <param name=\"element\"></param>\n        public static void RegisterCanvasElementForGraphicRebuild(ICanvasElement element)\n        {\n            TMP_UpdateRegistry.instance.InternalRegisterCanvasElementForGraphicRebuild(element);\n        }\n\n        private bool InternalRegisterCanvasElementForGraphicRebuild(ICanvasElement element)\n        {\n            int id = (element as Object).GetInstanceID();\n\n            if (this.m_GraphicQueueLookup.ContainsKey(id))\n                return false;\n\n            m_GraphicQueueLookup[id] = id;\n            this.m_GraphicRebuildQueue.Add(element);\n\n            return true;\n        }\n\n\n        /// <summary>\n        /// Method to handle objects that need updating.\n        /// </summary>\n        private void PerformUpdateForCanvasRendererObjects()\n        {\n            //Debug.Log(\"Performing update of CanvasRenderer objects at Frame: \" + Time.frameCount);\n\n            // Processing elements that require a layout rebuild.\n            //this.m_PerformingLayoutUpdate = true;\n            for (int index = 0; index < m_LayoutRebuildQueue.Count; index++)\n            {\n                ICanvasElement element = TMP_UpdateRegistry.instance.m_LayoutRebuildQueue[index];\n\n                element.Rebuild(CanvasUpdate.Prelayout);\n            }\n\n            if (m_LayoutRebuildQueue.Count > 0)\n            {\n                m_LayoutRebuildQueue.Clear();\n                m_LayoutQueueLookup.Clear();\n            }\n\n            // Update font assets before graphic rebuild\n\n\n            // Processing elements that require a graphic rebuild.\n            for (int index = 0; index < m_GraphicRebuildQueue.Count; index++)\n            {\n                ICanvasElement element = TMP_UpdateRegistry.instance.m_GraphicRebuildQueue[index];\n\n                element.Rebuild(CanvasUpdate.PreRender);\n            }\n\n            // If there are no objects in the queue, we don't need to clear the lists again.\n            if (m_GraphicRebuildQueue.Count > 0)\n            {\n                m_GraphicRebuildQueue.Clear();\n                m_GraphicQueueLookup.Clear();\n            }\n        }\n\n\n        /// <summary>\n        /// Method to handle objects that need updating.\n        /// </summary>\n        private void PerformUpdateForMeshRendererObjects()\n        {\n            Debug.Log(\"Perform update of MeshRenderer objects.\");\n            \n        }\n\n\n        /// <summary>\n        /// Function to unregister elements which no longer require a rebuild.\n        /// </summary>\n        /// <param name=\"element\"></param>\n        public static void UnRegisterCanvasElementForRebuild(ICanvasElement element)\n        {\n            TMP_UpdateRegistry.instance.InternalUnRegisterCanvasElementForLayoutRebuild(element);\n            TMP_UpdateRegistry.instance.InternalUnRegisterCanvasElementForGraphicRebuild(element);\n        }\n\n\n        private void InternalUnRegisterCanvasElementForLayoutRebuild(ICanvasElement element)\n        {\n            int id = (element as Object).GetInstanceID();\n\n            //element.LayoutComplete();\n            TMP_UpdateRegistry.instance.m_LayoutRebuildQueue.Remove(element);\n            m_GraphicQueueLookup.Remove(id);\n        }\n\n\n        private void InternalUnRegisterCanvasElementForGraphicRebuild(ICanvasElement element)\n        {\n            int id = (element as Object).GetInstanceID();\n\n            //element.GraphicUpdateComplete();\n            TMP_UpdateRegistry.instance.m_GraphicRebuildQueue.Remove(element);\n            m_LayoutQueueLookup.Remove(id);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMP_UpdateRegistery.cs.meta",
    "content": "fileFormatVersion: 2\nguid: a55fb7b4961a425381d1282fc424f966\ntimeCreated: 1446775434\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMPro_EventManager.cs",
    "content": "using UnityEngine;\nusing System.Collections.Generic;\n\n\nnamespace TMPro\n{\n    public enum Compute_DistanceTransform_EventTypes { Processing, Completed };\n\n\n    public static class TMPro_EventManager\n    {\n        public static readonly FastAction<object, Compute_DT_EventArgs> COMPUTE_DT_EVENT = new FastAction<object, Compute_DT_EventArgs>();\n\n        // Event & Delegate used to notify TextMesh Pro objects that Material properties have been changed.\n        public static readonly FastAction<bool, Material> MATERIAL_PROPERTY_EVENT = new FastAction<bool, Material>();\n\n        public static readonly FastAction<bool, TMP_FontAsset> FONT_PROPERTY_EVENT = new FastAction<bool, TMP_FontAsset>();\n\n        public static readonly FastAction<bool, Object> SPRITE_ASSET_PROPERTY_EVENT = new FastAction<bool, Object>();\n\n        public static readonly FastAction<bool, TextMeshPro> TEXTMESHPRO_PROPERTY_EVENT = new FastAction<bool, TextMeshPro>();\n\n        public static readonly FastAction<GameObject, Material, Material> DRAG_AND_DROP_MATERIAL_EVENT = new FastAction<GameObject, Material, Material>();\n\n        public static readonly FastAction<bool> TEXT_STYLE_PROPERTY_EVENT = new FastAction<bool>();\n\n        public static readonly FastAction<TMP_ColorGradient> COLOR_GRADIENT_PROPERTY_EVENT = new FastAction<TMP_ColorGradient>();\n\n        public static readonly FastAction TMP_SETTINGS_PROPERTY_EVENT = new FastAction();\n\n        public static readonly FastAction RESOURCE_LOAD_EVENT = new FastAction();\n\n        public static readonly FastAction<bool, TextMeshProUGUI> TEXTMESHPRO_UGUI_PROPERTY_EVENT = new FastAction<bool, TextMeshProUGUI>();\n\n        public static readonly FastAction OnPreRenderObject_Event = new FastAction();\n\n        public static readonly FastAction<Object> TEXT_CHANGED_EVENT = new FastAction<Object>();\n\n        //public static readonly FastAction WILL_RENDER_CANVASES = new FastAction();\n\n\n\n        //static TMPro_EventManager()\n        //{\n        //    // Register to the willRenderCanvases callback once\n        //    // then the WILL_RENDER_CANVASES FastAction will handle the rest\n        //    Canvas.willRenderCanvases += WILL_RENDER_CANVASES.Call;\n        //}\n\n        public static void ON_PRE_RENDER_OBJECT_CHANGED()\n        {\n            OnPreRenderObject_Event.Call();\n        }\n\n        public static void ON_MATERIAL_PROPERTY_CHANGED(bool isChanged, Material mat)\n        {\n            MATERIAL_PROPERTY_EVENT.Call(isChanged, mat);\n        }\n\n        public static void ON_FONT_PROPERTY_CHANGED(bool isChanged, TMP_FontAsset font)\n        {\n            FONT_PROPERTY_EVENT.Call(isChanged, font);\n        }\n\n        public static void ON_SPRITE_ASSET_PROPERTY_CHANGED(bool isChanged, Object obj)\n        {\n            SPRITE_ASSET_PROPERTY_EVENT.Call(isChanged, obj);\n        }\n\n        public static void ON_TEXTMESHPRO_PROPERTY_CHANGED(bool isChanged, TextMeshPro obj)\n        {\n            TEXTMESHPRO_PROPERTY_EVENT.Call(isChanged, obj);\n        }\n\n        public static void ON_DRAG_AND_DROP_MATERIAL_CHANGED(GameObject sender, Material currentMaterial, Material newMaterial)\n        {\n            DRAG_AND_DROP_MATERIAL_EVENT.Call(sender, currentMaterial, newMaterial);\n        }\n\n        public static void ON_TEXT_STYLE_PROPERTY_CHANGED(bool isChanged)\n        {\n            TEXT_STYLE_PROPERTY_EVENT.Call(isChanged);\n        }\n\n        public static void ON_COLOR_GRAIDENT_PROPERTY_CHANGED(TMP_ColorGradient gradient)\n        {\n            COLOR_GRADIENT_PROPERTY_EVENT.Call(gradient);\n        }\n\n\n        public static void ON_TEXT_CHANGED(Object obj)\n        {\n            TEXT_CHANGED_EVENT.Call(obj);\n        }\n\n        public static void ON_TMP_SETTINGS_CHANGED()\n        {\n            TMP_SETTINGS_PROPERTY_EVENT.Call();\n        }\n\n        public static void ON_RESOURCES_LOADED()\n        {\n            RESOURCE_LOAD_EVENT.Call();\n        }\n\n        public static void ON_TEXTMESHPRO_UGUI_PROPERTY_CHANGED(bool isChanged, TextMeshProUGUI obj)\n        {\n            TEXTMESHPRO_UGUI_PROPERTY_EVENT.Call(isChanged, obj);\n        }\n\n        //public static void ON_BASE_MATERIAL_CHANGED(Material mat)\n        //{\n        //    BASE_MATERIAL_EVENT.Call(mat);\n        //}\n\n        //public static void ON_PROGRESSBAR_UPDATE(Progress_Bar_EventTypes event_type, Progress_Bar_EventArgs eventArgs)\n        //{\n        //    if (PROGRESS_BAR_EVENT != null)\n        //        PROGRESS_BAR_EVENT(event_type, eventArgs);\n        //}\n\n        public static void ON_COMPUTE_DT_EVENT(object Sender, Compute_DT_EventArgs e)\n        {\n            COMPUTE_DT_EVENT.Call(Sender, e);\n        }\n    }\n\n\n    public class Compute_DT_EventArgs\n    {\n        public Compute_DistanceTransform_EventTypes EventType;\n        public float ProgressPercentage;\n        public Color[] Colors;\n\n\n        public Compute_DT_EventArgs(Compute_DistanceTransform_EventTypes type, float progress)\n        {\n            EventType = type;\n            ProgressPercentage = progress;\n        }\n\n        public Compute_DT_EventArgs(Compute_DistanceTransform_EventTypes type, Color[] colors)\n        {\n            EventType = type;\n            Colors = colors;\n        }\n\n    }\n\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMPro_EventManager.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 96e9072453a441618754c478755b3028\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMPro_ExtensionMethods.cs",
    "content": "﻿using UnityEngine;\nusing System.Text;\nusing System.Collections;\nusing System.Collections.Generic;\n\nnamespace TMPro\n{\n    public static class TMPro_ExtensionMethods\n    {\n\n        public static string ArrayToString(this char[] chars)\n        {\n            string s = string.Empty;\n\n            for (int i = 0; i < chars.Length && chars[i] != 0; i++)\n            {\n                s += chars[i];\n            }\n\n            return s;\n        }\n\n        public static string IntToString(this int[] unicodes)\n        {\n            char[] chars = new char[unicodes.Length];\n\n            for (int i = 0; i < unicodes.Length; i++)\n            {\n                chars[i] = (char)unicodes[i];\n            }\n\n            return new string(chars);\n        }\n\n        public static string IntToString(this int[] unicodes, int start, int length)\n        {\n            if (start > unicodes.Length)\n                return string.Empty;\n\n            int end = Mathf.Min(start + length, unicodes.Length);\n\n            char[] chars = new char[end - start];\n\n            int writeIndex = 0;\n\n            for (int i = start; i < end; i++)\n            {\n                chars[writeIndex++] = (char)unicodes[i];\n            }\n\n            return new string(chars);\n        }\n\n\n        public static int FindInstanceID <T> (this List<T> list, T target) where T : Object\n        {\n            int targetID = target.GetInstanceID();\n            \n            for (int i = 0; i < list.Count; i++)\n            {\n                if (list[i].GetInstanceID() == targetID)\n                    return i;\n            }\n            return -1;\n        }\n\n\n        public static bool Compare(this Color32 a, Color32 b)\n        {\n            return a.r == b.r && a.g == b.g && a.b == b.b && a.a == b.a;\n        }\n\n\t\tpublic static bool CompareRGB(this Color32 a, Color32 b)\n\t\t{\n\t\t\treturn a.r == b.r && a.g == b.g && a.b == b.b;\n\t\t}\n\n\t\tpublic static bool Compare(this Color a, Color b)\n        {\n            return a.r == b.r && a.g == b.g && a.b == b.b && a.a == b.a;\n        }\n\n\n\t\tpublic static bool CompareRGB(this Color a, Color b)\n\t\t{\n\t\t\treturn a.r == b.r && a.g == b.g && a.b == b.b;\n\t\t}\n\n\n        public static Color32 Multiply (this Color32 c1, Color32 c2)\n        {\n            byte r = (byte)((c1.r / 255f) * (c2.r / 255f) * 255);\n            byte g = (byte)((c1.g / 255f) * (c2.g / 255f) * 255);\n            byte b = (byte)((c1.b / 255f) * (c2.b / 255f) * 255);\n            byte a = (byte)((c1.a / 255f) * (c2.a / 255f) * 255);\n\n            return new Color32(r, g, b, a);\n        }\n\n\n        public static Color32 Tint (this Color32 c1, Color32 c2)\n        {\n            byte r = (byte)((c1.r / 255f) * (c2.r / 255f) * 255);\n            byte g = (byte)((c1.g / 255f) * (c2.g / 255f) * 255);\n            byte b = (byte)((c1.b / 255f) * (c2.b / 255f) * 255);\n            byte a = (byte)((c1.a / 255f) * (c2.a / 255f) * 255);\n\n            return new Color32(r, g, b, a);\n        }\n\n        public static Color32 Tint(this Color32 c1, float tint)\n        {\n            byte r = (byte)(Mathf.Clamp(c1.r / 255f * tint * 255, 0, 255));\n            byte g = (byte)(Mathf.Clamp(c1.g / 255f * tint * 255, 0, 255));\n            byte b = (byte)(Mathf.Clamp(c1.b / 255f * tint * 255, 0, 255));\n            byte a = (byte)(Mathf.Clamp(c1.a / 255f * tint * 255, 0, 255));\n\n            return new Color32(r, g, b, a);\n        }\n\n\n        public static bool Compare(this Vector3 v1, Vector3 v2, int accuracy)\n        {\n            bool x = (int)(v1.x * accuracy) == (int)(v2.x * accuracy);\n            bool y = (int)(v1.y * accuracy) == (int)(v2.y * accuracy);\n            bool z = (int)(v1.z * accuracy) == (int)(v2.z * accuracy);\n\n            return x && y && z;\n        }\n\n        public static bool Compare(this Quaternion q1, Quaternion q2, int accuracy)\n        {\n            bool x = (int)(q1.x * accuracy) == (int)(q2.x * accuracy);\n            bool y = (int)(q1.y * accuracy) == (int)(q2.y * accuracy);\n            bool z = (int)(q1.z * accuracy) == (int)(q2.z * accuracy);\n            bool w = (int)(q1.w * accuracy) == (int)(q2.w * accuracy);\n\n            return x && y && z && w;\n        }\n\n        //public static void AddElementAtIndex<T>(this T[] array, int writeIndex, T item)\n        //{\n        //    if (writeIndex >= array.Length)\n        //        System.Array.Resize(ref array, Mathf.NextPowerOfTwo(writeIndex + 1));\n\n        //    array[writeIndex] = item;\n        //}\n\n        /// <summary>\n        /// Insert item into array at index.\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"array\"></param>\n        /// <param name=\"index\"></param>\n        /// <param name=\"item\"></param>\n        //public static void Insert<T>(this T[] array, int index, T item)\n        //{\n        //    if (index > array.Length - 1) return;\n\n        //    T savedItem = item;\n\n        //    for (int i = index; i < array.Length; i++)\n        //    {\n        //        savedItem = array[i];\n\n        //        array[i] = item;\n\n        //        item = savedItem;\n        //    }\n        //}\n\n        /// <summary>\n        /// Insert item into array at index.\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"array\"></param>\n        /// <param name=\"index\"></param>\n        /// <param name=\"item\"></param>\n        //public static void Insert<T>(this T[] array, int index, T[] items)\n        //{\n        //    if (index > array.Length - 1) return;\n\n        //    System.Array.Resize(ref array, array.Length + items.Length);\n\n        //    int sourceIndex = 0;\n\n        //    T savedItem = items[sourceIndex];\n\n        //    for (int i = index; i < array.Length; i++)\n        //    {\n        //        savedItem = array[i];\n\n        //        array[i] = items[sourceIndex];\n\n        //        items[sourceIndex] = savedItem;\n\n        //        if (sourceIndex < items.Length - 1)\n        //            sourceIndex += 1;\n        //        else\n        //            sourceIndex = 0;\n        //    }\n        //}\n\n    }\n\n    public static class TMP_Math\n    {\n        public const float FLOAT_MAX = 32767;\n        public const float FLOAT_MIN = -32767;\n        public const int INT_MAX = 2147483647;\n        public const int INT_MIN = -2147483647;\n\n        public const float FLOAT_UNSET = -32767;\n        public const int INT_UNSET = -32767;\n\n        public static Vector2 MAX_16BIT = new Vector2(FLOAT_MAX, FLOAT_MAX);\n        public static Vector2 MIN_16BIT = new Vector2(FLOAT_MIN, FLOAT_MIN);\n\n        public static bool Approximately(float a, float b)\n        {\n            return (b - 0.0001f) < a && a < (b + 0.0001f);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMPro_ExtensionMethods.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 77476292f9fa4905a787e6417853846b\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMPro_MeshUtilities.cs",
    "content": "﻿using UnityEngine;\nusing UnityEngine.TextCore;\nusing System;\n\n\nnamespace TMPro\n{\n    /// <summary>\n    /// Flags to control what vertex data is pushed to the mesh and renderer.\n    /// </summary>\n    public enum TMP_VertexDataUpdateFlags\n    {\n        None = 0x0,\n        Vertices = 0x1,\n        Uv0 = 0x2,\n        Uv2 = 0x4,\n        Uv4 = 0x8,\n        Colors32 = 0x10,\n        All = 0xFF\n    };\n\n\n    /// <summary>\n    /// TMP custom data type to represent 32 bit characters.\n    /// </summary>\n    //public struct TMP_Char\n    //{\n    //    private int m_value;\n\n    //    private TMP_Char(int value)\n    //    {\n    //        this.m_value = value;\n    //    }\n\n    //    private TMP_Char(TMP_Char value)\n    //    {\n    //        this.m_value = (int)value;\n    //    }\n\n    //    public static implicit operator TMP_Char(int value)\n    //    {\n    //        return new TMP_Char(value);\n    //    }\n\n    //    public static implicit operator TMP_Char(char c)\n    //    {\n    //        return new TMP_Char(c);\n    //    }\n\n    //    public static explicit operator int(TMP_Char value)\n    //    {\n    //        return value.m_value;\n    //    }\n\n    //    public override string ToString()\n    //    {\n    //        return m_value.ToString();\n    //    }\n    //}\n\n\n    //public struct TMP_VertexInfo\n    //{      \n    //    public TMP_Vertex topLeft;\n    //    public TMP_Vertex bottomLeft;\n    //    public TMP_Vertex topRight;\n    //    public TMP_Vertex bottomRight;\n    //}\n\n\n    [Serializable]\n    public struct VertexGradient\n    {\n        public Color topLeft;\n        public Color topRight;\n        public Color bottomLeft;\n        public Color bottomRight;\n\n        public VertexGradient (Color color)\n        {\n            this.topLeft = color;\n            this.topRight = color;\n            this.bottomLeft = color;\n            this.bottomRight = color;\n        }\n\n        /// <summary>\n        /// The vertex colors at the corners of the characters.\n        /// </summary>\n        /// <param name=\"color0\">Top left color.</param>\n        /// <param name=\"color1\">Top right color.</param>\n        /// <param name=\"color2\">Bottom left color.</param>\n        /// <param name=\"color3\">Bottom right color.</param>\n        public VertexGradient(Color color0, Color color1, Color color2, Color color3)\n        {\n            this.topLeft = color0;\n            this.topRight = color1;\n            this.bottomLeft = color2;\n            this.bottomRight = color3;\n        }\n    }\n\n\n    public struct TMP_PageInfo\n    {\n        public int firstCharacterIndex;\n        public int lastCharacterIndex;\n        public float ascender;\n        public float baseLine;\n        public float descender;\n        // public float extents;\n    }\n\n\n    /// <summary>\n    /// Structure containing information about individual links contained in the text object.\n    /// </summary>\n    public struct TMP_LinkInfo\n    {\n        public TMP_Text textComponent;\n\n        public int hashCode;\n\n        public int linkIdFirstCharacterIndex;\n        public int linkIdLength;\n        public int linkTextfirstCharacterIndex;\n        public int linkTextLength;\n\n        internal char[] linkID;\n\n\n        internal void SetLinkID(char[] text, int startIndex, int length)\n        {\n            if (linkID == null || linkID.Length < length) linkID = new char[length];\n\n            for (int i = 0; i < length; i++)\n                linkID[i] = text[startIndex + i];\n        }\n\n        /// <summary>\n        /// Function which returns the text contained in a link.\n        /// </summary>\n        /// <param name=\"textInfo\"></param>\n        /// <returns></returns>\n        public string GetLinkText()\n        {\n            string text = string.Empty;\n            TMP_TextInfo textInfo = textComponent.textInfo;\n\n            for (int i = linkTextfirstCharacterIndex; i < linkTextfirstCharacterIndex + linkTextLength; i++)\n                text += textInfo.characterInfo[i].character;\n\n            return text;\n        }\n\n\n        /// <summary>\n        /// Function which returns the link ID as a string.\n        /// </summary>\n        /// <param name=\"text\">The source input text.</param>\n        /// <returns></returns>\n        public string GetLinkID()\n        {\n            if (textComponent == null)\n                return string.Empty;\n\n            return new string(linkID, 0, linkIdLength);\n            //return textComponent.text.Substring(linkIdFirstCharacterIndex, linkIdLength);\n\n        }\n    }\n\n\n    /// <summary>\n    /// Structure containing information about the individual words contained in the text object.\n    /// </summary>\n    public struct TMP_WordInfo\n    {\n        // NOTE: Structure could be simplified by only including the firstCharacterIndex and length.\n\n        public TMP_Text textComponent;\n\n        public int firstCharacterIndex;\n        public int lastCharacterIndex;\n        public int characterCount;\n        //public float length;\n\n        /// <summary>\n        /// Returns the word as a string.\n        /// </summary>\n        /// <returns></returns>\n        public string GetWord()\n        {\n            string word = string.Empty;\n            TMP_CharacterInfo[] charInfo = textComponent.textInfo.characterInfo;\n            \n            for (int i = firstCharacterIndex; i < lastCharacterIndex + 1; i++)\n            {\n                word += charInfo[i].character;\n            }\n\n            return word;\n        }\n    }\n\n\n    public struct TMP_SpriteInfo\n    {\n        public int spriteIndex; // Index of the sprite in the sprite atlas.\n        public int characterIndex; // The characterInfo index which holds the key information about this sprite.\n        public int vertexIndex;\n    }\n\n\n    //public struct SpriteInfo\n    //{\n    //    \n    //}\n\n\n    public struct Extents\n    {\n        public Vector2 min;\n        public Vector2 max;\n\n        public Extents(Vector2 min, Vector2 max)\n        {\n            this.min = min;\n            this.max = max;\n        }\n\n        public override string ToString()\n        {\n            string s = \"Min (\" + min.x.ToString(\"f2\") + \", \" + min.y.ToString(\"f2\") + \")   Max (\" + max.x.ToString(\"f2\") + \", \" + max.y.ToString(\"f2\") + \")\";           \n            return s;\n        }\n    }\n\n\n    [Serializable]\n    public struct Mesh_Extents\n    {\n        public Vector2 min;\n        public Vector2 max;\n      \n     \n        public Mesh_Extents(Vector2 min, Vector2 max)\n        {\n            this.min = min;\n            this.max = max;\n        }\n\n        public override string ToString()\n        {\n            string s = \"Min (\" + min.x.ToString(\"f2\") + \", \" + min.y.ToString(\"f2\") + \")   Max (\" + max.x.ToString(\"f2\") + \", \" + max.y.ToString(\"f2\") + \")\";\n            //string s = \"Center: (\" + \")\" + \"  Extents: (\" + ((max.x - min.x) / 2).ToString(\"f2\") + \",\" + ((max.y - min.y) / 2).ToString(\"f2\") + \").\";\n            return s;\n        }\n    }\n\n\n    // Structure used for Word Wrapping which tracks the state of execution when the last space or carriage return character was encountered. \n    public struct WordWrapState\n    {\n        public int previous_WordBreak;\n        public int total_CharacterCount;\n        public int visible_CharacterCount;\n        public int visible_SpriteCount;\n        public int visible_LinkCount;\n        public int firstCharacterIndex;\n        public int firstVisibleCharacterIndex;\n        public int lastCharacterIndex;\n        public int lastVisibleCharIndex;\n        public int lineNumber;\n\n        public float maxCapHeight;\n        public float maxAscender;\n        public float maxDescender;\n        public float maxLineAscender;\n        public float maxLineDescender;\n        public float previousLineAscender;\n\n        public float xAdvance;\n        public float preferredWidth;\n        public float preferredHeight;\n        //public float maxFontScale;\n        public float previousLineScale;\n      \n        public int wordCount;\n        public FontStyles fontStyle;\n        public float fontScale;\n        public float fontScaleMultiplier;\n      \n        public float currentFontSize;\n        public float baselineOffset;\n        public float lineOffset;\n\n        public TMP_TextInfo textInfo;\n        //public TMPro_CharacterInfo[] characterInfo;\n        public TMP_LineInfo lineInfo;\n        \n        public Color32 vertexColor;\n        public Color32 underlineColor;\n        public Color32 strikethroughColor;\n        public Color32 highlightColor;\n        public TMP_FontStyleStack basicStyleStack;\n        public TMP_RichTextTagStack<Color32> colorStack;\n        public TMP_RichTextTagStack<Color32> underlineColorStack;\n        public TMP_RichTextTagStack<Color32> strikethroughColorStack;\n        public TMP_RichTextTagStack<Color32> highlightColorStack;\n        public TMP_RichTextTagStack<TMP_ColorGradient> colorGradientStack;\n        public TMP_RichTextTagStack<float> sizeStack;\n        public TMP_RichTextTagStack<float> indentStack;\n        public TMP_RichTextTagStack<FontWeight> fontWeightStack;\n        public TMP_RichTextTagStack<int> styleStack;\n        public TMP_RichTextTagStack<float> baselineStack;\n        public TMP_RichTextTagStack<int> actionStack;\n        public TMP_RichTextTagStack<MaterialReference> materialReferenceStack;\n        public TMP_RichTextTagStack<TextAlignmentOptions> lineJustificationStack;\n        //public TMP_XmlTagStack<int> spriteAnimationStack;\n        public int spriteAnimationID;\n\n        public TMP_FontAsset currentFontAsset;\n        public TMP_SpriteAsset currentSpriteAsset;\n        public Material currentMaterial;\n        public int currentMaterialIndex;\n\n        public Extents meshExtents;\n\n        public bool tagNoParsing;\n        public bool isNonBreakingSpace;\n        //public Mesh_Extents lineExtents;\n    }\n\n\n    /// <summary>\n    /// Structure used to store retrieve the name and hashcode of the font and material\n    /// </summary>\n    public struct TagAttribute\n    {\n        public int startIndex;\n        public int length;\n        public int hashCode;\n    }\n\n\n    public struct RichTextTagAttribute\n    {\n        public int nameHashCode;\n        public int valueHashCode;\n        public TagValueType valueType;\n        public int valueStartIndex;\n        public int valueLength;\n        public TagUnitType unitType;\n    }\n\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMPro_MeshUtilities.cs.meta",
    "content": "fileFormatVersion: 2\nguid: effb76e1937b45ff8adf45e51a4c08cf\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMPro_Private.cs",
    "content": "//#define TMP_PROFILE_ON\n//#define TMP_PROFILE_PHASES_ON\n\nusing UnityEngine;\nusing UnityEngine.TextCore;\nusing System;\nusing System.Collections;\nusing System.Collections.Generic;\n\n#pragma warning disable 0414 // Disabled a few warnings related to serialized variables not used in this script but used in the editor.\n\nnamespace TMPro\n{\n\n    public partial class TextMeshPro\n    {\n        [SerializeField]\n        private bool m_hasFontAssetChanged = false; // Used to track when font properties have changed.\n\n        float m_previousLossyScaleY = -1; // Used for Tracking lossy scale changes in the transform;\n\n        [SerializeField]\n        private Renderer m_renderer;\n        private MeshFilter m_meshFilter;\n\n        private bool m_isFirstAllocation; // Flag to determine if this is the first allocation of the buffers.\n        private int m_max_characters = 8; // Determines the initial allocation and size of the character array / buffer.\n        private int m_max_numberOfLines = 4; // Determines the initial allocation and maximum number of lines of text. \n\n        [SerializeField]\n        protected TMP_SubMesh[] m_subTextObjects = new TMP_SubMesh[8];\n\n\n        // MASKING RELATED PROPERTIES\n\n        //MaterialPropertyBlock m_maskingPropertyBlock;\n        //[SerializeField]\n        private bool m_isMaskingEnabled;\n        private bool isMaskUpdateRequired;\n        //private bool m_isMaterialBlockSet;\n\n        [SerializeField]\n        private MaskingTypes m_maskType;\n\n        // Matrix used to animated Env Map\n        private Matrix4x4 m_EnvMapMatrix = new Matrix4x4();\n\n\n        // Text Container / RectTransform Component\n        private Vector3[] m_RectTransformCorners = new Vector3[4];\n\n        [NonSerialized]\n        private bool m_isRegisteredForEvents;\n\n\n        // DEBUG Variables\n        //private System.Diagnostics.Stopwatch m_StopWatch;\n        //private bool isDebugOutputDone;\n        //private int m_recursiveCount = 0;\n        private int loopCountA;\n        //private int loopCountB;\n        //private int loopCountC;\n        //private int loopCountD;\n        //private int loopCountE;\n\n\n        protected override void Awake()\n        {\n            //Debug.Log(\"***** Awake() called on object ID \" + GetInstanceID() + \". *****\");\n\n            #if UNITY_EDITOR\n            // Special handling for TMP Settings and importing Essential Resources\n            if (TMP_Settings.instance == null)\n            {\n                if (m_isWaitingOnResourceLoad == false)\n                    TMPro_EventManager.RESOURCE_LOAD_EVENT.Add(ON_RESOURCES_LOADED);\n\n                m_isWaitingOnResourceLoad = true;\n                return;\n            }\n            #endif\n\n            // Cache Reference to the Mesh Renderer.\n            m_renderer = GetComponent<Renderer>();\n            if (m_renderer == null)\n                m_renderer = gameObject.AddComponent<Renderer>();\n\n            // Make sure we have a CanvasRenderer for compatibility reasons and hide it\n            if (this.canvasRenderer != null)\n                this.canvasRenderer.hideFlags = HideFlags.HideInInspector;\n            else\n            {\n                CanvasRenderer canvasRenderer = gameObject.AddComponent<CanvasRenderer>();\n                canvasRenderer.hideFlags = HideFlags.HideInInspector;\n            }\n\n            // Cache Reference to RectTransform\n            m_rectTransform = this.rectTransform;\n\n            // Cache Reference to the transform;\n            m_transform = this.transform;\n\n            // Cache a reference to the Mesh Filter.\n            m_meshFilter = GetComponent<MeshFilter>();\n            if (m_meshFilter == null)\n                m_meshFilter = gameObject.AddComponent<MeshFilter>();\n\n            // Create new Mesh if necessary and cache reference to it.\n            if (m_mesh == null)\n            {\n                m_mesh = new Mesh();\n                m_mesh.hideFlags = HideFlags.HideAndDontSave;\n\n                m_meshFilter.mesh = m_mesh;\n\n                // Create new TextInfo for the text object.\n                m_textInfo = new TMP_TextInfo(this);\n            }\n            m_meshFilter.hideFlags = HideFlags.HideInInspector;\n\n            // Load TMP Settings for new text object instances.\n            LoadDefaultSettings();\n\n            // Load the font asset and assign material to renderer.\n            LoadFontAsset();\n\n            // Load Default TMP StyleSheet\n            TMP_StyleSheet.LoadDefaultStyleSheet();\n\n            // Allocate our initial buffers.\n            if (m_TextParsingBuffer == null)\n                m_TextParsingBuffer = new UnicodeChar[m_max_characters];\n\n            m_cached_TextElement = new TMP_Character();\n            m_isFirstAllocation = true;\n\n            // Check if we have a font asset assigned. Return if we don't because no one likes to see purple squares on screen.\n            if (m_fontAsset == null)\n            {\n                Debug.LogWarning(\"Please assign a Font Asset to this \" + transform.name + \" gameobject.\", this);\n                return;\n            }\n\n            // Check to make sure Sub Text Objects are tracked correctly in the event a Prefab is used.\n            TMP_SubMesh[] subTextObjects = GetComponentsInChildren<TMP_SubMesh>();\n            if (subTextObjects.Length > 0)\n            {\n                for (int i = 0; i < subTextObjects.Length; i++)\n                    m_subTextObjects[i + 1] = subTextObjects[i];\n            }\n\n            // Set flags to ensure our text is parsed and redrawn.\n            m_isInputParsingRequired = true;\n            m_havePropertiesChanged = true;\n            m_isCalculateSizeRequired = true;\n\n            m_isAwake = true;\n        }\n\n\n        protected override void OnEnable()\n        {\n            //Debug.Log(\"***** OnEnable() called on object ID \" + GetInstanceID() + \". *****\");\n\n            // Return if Awake() has not been called on the text object.\n            if (m_isAwake == false)\n                return;\n\n            // Register Callbacks for various events.\n            if (!m_isRegisteredForEvents)\n            {\n                #if UNITY_EDITOR\n                TMPro_EventManager.MATERIAL_PROPERTY_EVENT.Add(ON_MATERIAL_PROPERTY_CHANGED);\n                TMPro_EventManager.FONT_PROPERTY_EVENT.Add(ON_FONT_PROPERTY_CHANGED);\n                TMPro_EventManager.TEXTMESHPRO_PROPERTY_EVENT.Add(ON_TEXTMESHPRO_PROPERTY_CHANGED);\n                TMPro_EventManager.DRAG_AND_DROP_MATERIAL_EVENT.Add(ON_DRAG_AND_DROP_MATERIAL);\n                TMPro_EventManager.TEXT_STYLE_PROPERTY_EVENT.Add(ON_TEXT_STYLE_CHANGED);\n                TMPro_EventManager.COLOR_GRADIENT_PROPERTY_EVENT.Add(ON_COLOR_GRADIENT_CHANGED);\n                TMPro_EventManager.TMP_SETTINGS_PROPERTY_EVENT.Add(ON_TMP_SETTINGS_CHANGED);\n                #endif\n                m_isRegisteredForEvents = true;\n            }\n\n            TMP_UpdateManager.RegisterTextObjectForUpdate(this);\n\n            meshFilter.sharedMesh = mesh;\n            SetActiveSubMeshes(true);\n\n            // Schedule potential text object update (if any of the properties have changed.\n            ComputeMarginSize();\n\n            m_isInputParsingRequired = true;\n            m_havePropertiesChanged = true;\n            m_verticesAlreadyDirty = false;\n            SetVerticesDirty();\n        }\n\n\n        protected override void OnDisable()\n        {\n            //Debug.Log(\"***** OnDisable() called on object ID \" + GetInstanceID() + \". *****\");\n\n            // Return if Awake() has not been called on the text object.\n            if (m_isAwake == false)\n                return;\n\n            TMP_UpdateManager.UnRegisterTextElementForRebuild(this);\n            TMP_UpdateManager.UnRegisterTextObjectForUpdate(this);\n\n            m_meshFilter.sharedMesh = null;\n            SetActiveSubMeshes(false);\n        }\n\n\n        protected override void OnDestroy()\n        {\n            //Debug.Log(\"***** OnDestroy() called on object ID \" + GetInstanceID() + \". *****\");\n\n            // Destroy the mesh if we have one.\n            if (m_mesh != null)\n            {\n                DestroyImmediate(m_mesh);\n            }\n\n            // Unregister the event this object was listening to\n            #if UNITY_EDITOR\n            TMPro_EventManager.MATERIAL_PROPERTY_EVENT.Remove(ON_MATERIAL_PROPERTY_CHANGED);\n            TMPro_EventManager.FONT_PROPERTY_EVENT.Remove(ON_FONT_PROPERTY_CHANGED);\n            TMPro_EventManager.TEXTMESHPRO_PROPERTY_EVENT.Remove(ON_TEXTMESHPRO_PROPERTY_CHANGED);\n            TMPro_EventManager.DRAG_AND_DROP_MATERIAL_EVENT.Remove(ON_DRAG_AND_DROP_MATERIAL);\n            TMPro_EventManager.TEXT_STYLE_PROPERTY_EVENT.Remove(ON_TEXT_STYLE_CHANGED);\n            TMPro_EventManager.COLOR_GRADIENT_PROPERTY_EVENT.Remove(ON_COLOR_GRADIENT_CHANGED);\n            TMPro_EventManager.TMP_SETTINGS_PROPERTY_EVENT.Remove(ON_TMP_SETTINGS_CHANGED);\n            TMPro_EventManager.RESOURCE_LOAD_EVENT.Remove(ON_RESOURCES_LOADED);\n            #endif\n\n            m_isRegisteredForEvents = false;\n            TMP_UpdateManager.UnRegisterTextElementForRebuild(this);\n            TMP_UpdateManager.UnRegisterTextObjectForUpdate(this);\n        }\n\n\n        #if UNITY_EDITOR\n        protected override void Reset()\n        {\n            //Debug.Log(\"Reset() has been called.\" + m_subTextObjects);\n            \n            // Return if Awake() has not been called on the text object.\n            if (m_isAwake == false)\n                return;\n\n            if (m_mesh != null)\n                DestroyImmediate(m_mesh);\n\n            Awake();\n        }\n\n\n        protected override void OnValidate()\n        {\n            //Debug.Log(\"*** TextMeshPro OnValidate() has been called on Object ID:\" + gameObject.GetInstanceID());\n            \n            // Return if Awake() has not been called on the text object.\n            if (m_isAwake == false)\n                return;\n\n            // Additional Properties could be added to sync up Serialized Properties & Properties.\n\n            // Handle Font Asset changes in the inspector\n            if (m_fontAsset == null || m_hasFontAssetChanged)\n            {\n                LoadFontAsset();\n                m_isCalculateSizeRequired = true;\n                m_hasFontAssetChanged = false;\n            }\n\n            m_padding = GetPaddingForMaterial();\n            ComputeMarginSize();\n\n            m_isInputParsingRequired = true;\n            m_inputSource = TextInputSources.Text;\n            m_havePropertiesChanged = true;\n            m_isCalculateSizeRequired = true;\n            m_isPreferredWidthDirty = true;\n            m_isPreferredHeightDirty = true;\n\n            SetAllDirty();\n        }\n\n\n        // Event received when TMP resources have been loaded.\n        void ON_RESOURCES_LOADED()\n        {\n            TMPro_EventManager.RESOURCE_LOAD_EVENT.Remove(ON_RESOURCES_LOADED);\n\n            if (this == null)\n                return;\n\n            Awake();\n            OnEnable();\n        }\n\n\n        // Event received when custom material editor properties are changed.\n        void ON_MATERIAL_PROPERTY_CHANGED(bool isChanged, Material mat)\n        {\n            //Debug.Log(\"ON_MATERIAL_PROPERTY_CHANGED event received. Targeted Material is: \" + mat.name + \"  m_sharedMaterial: \" + m_sharedMaterial.name + \"  m_renderer.sharedMaterial: \" + m_renderer.sharedMaterial);         \n\n            if (m_renderer.sharedMaterial == null)\n            {\n                if (m_fontAsset != null)\n                {\n                    m_renderer.sharedMaterial = m_fontAsset.material;\n                    Debug.LogWarning(\"No Material was assigned to \" + name + \". \" + m_fontAsset.material.name + \" was assigned.\", this);\n                }\n                else\n                    Debug.LogWarning(\"No Font Asset assigned to \" + name + \". Please assign a Font Asset.\", this);\n            }\n\n            if (m_fontAsset.atlasTexture != null && m_fontAsset.atlasTexture.GetInstanceID() != m_renderer.sharedMaterial.GetTexture(ShaderUtilities.ID_MainTex).GetInstanceID())\n            {\n                m_renderer.sharedMaterial = m_sharedMaterial;\n                //m_renderer.sharedMaterial = m_fontAsset.material;\n                Debug.LogWarning(\"Font Asset Atlas doesn't match the Atlas in the newly assigned material. Select a matching material or a different font asset.\", this);\n            }\n\n            if (m_renderer.sharedMaterial != m_sharedMaterial) //    || m_renderer.sharedMaterials.Contains(mat))\n            {\n                //Debug.Log(\"ON_MATERIAL_PROPERTY_CHANGED Called on Target ID: \" + GetInstanceID() + \". Previous Material:\" + m_sharedMaterial + \"  New Material:\" + m_renderer.sharedMaterial); // on Object ID:\" + GetInstanceID() + \". m_sharedMaterial: \" + m_sharedMaterial.name + \"  m_renderer.sharedMaterial: \" + m_renderer.sharedMaterial.name);         \n                m_sharedMaterial = m_renderer.sharedMaterial;\n            }\n\n            m_padding = GetPaddingForMaterial();\n            //m_sharedMaterialHashCode = TMP_TextUtilities.GetSimpleHashCode(m_sharedMaterial.name);\n\n            UpdateMask();\n            UpdateEnvMapMatrix();\n            m_havePropertiesChanged = true;\n            SetVerticesDirty();\n        }\n\n\n        // Event received when font asset properties are changed in Font Inspector\n        void ON_FONT_PROPERTY_CHANGED(bool isChanged, TMP_FontAsset font)\n        {\n            if (MaterialReference.Contains(m_materialReferences, font))\n            {\n                //Debug.Log(\"ON_FONT_PROPERTY_CHANGED event received.\");\n                m_isInputParsingRequired = true;\n                m_havePropertiesChanged = true;\n\n                UpdateMeshPadding();\n\n                SetMaterialDirty();\n                SetVerticesDirty();\n            }\n        }\n\n     \n        // Event received when UNDO / REDO Event alters the properties of the object.\n        void ON_TEXTMESHPRO_PROPERTY_CHANGED(bool isChanged, TextMeshPro obj)\n        {\n            if (obj == this)\n            {\n                //Debug.Log(\"Undo / Redo Event Received by Object ID:\" + GetInstanceID());\n                m_havePropertiesChanged = true;\n                m_isInputParsingRequired = true;\n\n                m_padding = GetPaddingForMaterial();\n                ComputeMarginSize(); // Verify this change\n                SetVerticesDirty();\n            }\n        }\n\n\n        // Event to Track Material Changed resulting from Drag-n-drop.\n        void ON_DRAG_AND_DROP_MATERIAL(GameObject obj, Material currentMaterial, Material newMaterial)\n        {\n            //Debug.Log(\"Drag-n-Drop Event - Receiving Object ID \" + GetInstanceID()); // + \". Target Object ID \" + obj.GetInstanceID() + \".  New Material is \" + mat.name + \" with ID \" + mat.GetInstanceID() + \". Base Material is \" + m_baseMaterial.name + \" with ID \" + m_baseMaterial.GetInstanceID());\n\n            // Check if event applies to this current object\n            #if UNITY_2018_2_OR_NEWER\n            if (obj == gameObject || UnityEditor.PrefabUtility.GetCorrespondingObjectFromSource(gameObject) == obj)\n            #else\n            if (obj == gameObject || UnityEditor.PrefabUtility.GetPrefabParent(gameObject) == obj)\n            #endif\n            {\n                UnityEditor.Undo.RecordObject(this, \"Material Assignment\");\n                UnityEditor.Undo.RecordObject(m_renderer, \"Material Assignment\");\n\n                m_sharedMaterial = newMaterial;\n\n                m_padding = GetPaddingForMaterial();\n                m_havePropertiesChanged = true;\n                SetVerticesDirty();\n                SetMaterialDirty();\n            }\n        }\n\n\n        // Event received when Text Styles are changed.\n        void ON_TEXT_STYLE_CHANGED(bool isChanged)\n        {\n            m_havePropertiesChanged = true;\n            m_isInputParsingRequired = true;\n            SetVerticesDirty();\n        }\n\n\n        /// <summary>\n        /// Event received when a Color Gradient Preset is modified.\n        /// </summary>\n        /// <param name=\"textObject\"></param>\n        void ON_COLOR_GRADIENT_CHANGED(TMP_ColorGradient gradient)\n        {\n            if (m_fontColorGradientPreset != null && gradient.GetInstanceID() == m_fontColorGradientPreset.GetInstanceID())\n            {\n                m_havePropertiesChanged = true;\n                SetVerticesDirty();\n            }\n        }\n\n\n        /// <summary>\n        /// Event received when the TMP Settings are changed.\n        /// </summary>\n        void ON_TMP_SETTINGS_CHANGED()\n        {\n            m_defaultSpriteAsset = null;\n            m_havePropertiesChanged = true;\n            m_isInputParsingRequired = true;\n            SetAllDirty();\n        }\n#endif\n\n\n            // Function which loads either the default font or a newly assigned font asset. This function also assigned the appropriate material to the renderer.\n        protected override void LoadFontAsset()\n        {\n            //Debug.Log(\"TextMeshPro LoadFontAsset() has been called.\"); // Current Font Asset is \" + (font != null ? font.name: \"Null\") );\n\n            ShaderUtilities.GetShaderPropertyIDs(); // Initialize & Get shader property IDs.\n\n            if (m_fontAsset == null)\n            {\n                if (TMP_Settings.defaultFontAsset != null)\n                    m_fontAsset =TMP_Settings.defaultFontAsset;\n                else\n                    m_fontAsset = Resources.Load<TMP_FontAsset>(\"Fonts & Materials/LiberationSans SDF\");\n\n                if (m_fontAsset == null)\n                {\n                    Debug.LogWarning(\"The LiberationSans SDF Font Asset was not found. There is no Font Asset assigned to \" + gameObject.name + \".\", this);\n                    return;\n                }\n\n                if (m_fontAsset.characterLookupTable == null)\n                {\n                    Debug.Log(\"Dictionary is Null!\");\n                }\n\n                m_renderer.sharedMaterial = m_fontAsset.material;\n                m_sharedMaterial = m_fontAsset.material;\n                m_sharedMaterial.SetFloat(\"_CullMode\", 0);\n                m_sharedMaterial.SetFloat(ShaderUtilities.ShaderTag_ZTestMode, 4);\n                m_renderer.receiveShadows = false;\n                m_renderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off; // true;\n                // Get a Reference to the Shader\n            }\n            else\n            {\n                if (m_fontAsset.characterLookupTable == null)\n                {\n                    //Debug.Log(\"Reading Font Definition and Creating Character Dictionary.\");\n                    m_fontAsset.ReadFontAssetDefinition();\n                }\n\n                //Debug.Log(\"Font Asset name:\" + font.material.name);\n\n                // If font atlas texture doesn't match the assigned material font atlas, switch back to default material specified in the Font Asset.\n                if (m_renderer.sharedMaterial == null || m_renderer.sharedMaterial.GetTexture(ShaderUtilities.ID_MainTex) == null || m_fontAsset.atlasTexture.GetInstanceID() != m_renderer.sharedMaterial.GetTexture(ShaderUtilities.ID_MainTex).GetInstanceID())\n                {\n                    m_renderer.sharedMaterial = m_fontAsset.material;\n                    m_sharedMaterial = m_fontAsset.material; \n                }\n                else\n                {\n                    m_sharedMaterial = m_renderer.sharedMaterial;\n                }\n\n                //m_sharedMaterial.SetFloat(\"_CullMode\", 0);\n                m_sharedMaterial.SetFloat(ShaderUtilities.ShaderTag_ZTestMode, 4);\n\n                // Check if we are using the SDF Surface Shader\n                if (m_sharedMaterial.passCount == 1)\n                {\n                    m_renderer.receiveShadows = false;\n                    m_renderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;\n                }\n\n            }\n\n            m_padding = GetPaddingForMaterial();\n            //m_alignmentPadding = ShaderUtilities.GetFontExtent(m_sharedMaterial);\n            m_isMaskingEnabled = ShaderUtilities.IsMaskingEnabled(m_sharedMaterial);\n\n\n            // Find and cache Underline & Ellipsis characters.\n            GetSpecialCharacters(m_fontAsset);\n\n\n            //m_sharedMaterials.Add(m_sharedMaterial);\n            //m_sharedMaterialHashCode = TMP_TextUtilities.GetSimpleHashCode(m_sharedMaterial.name);\n            // Hide Material Editor Component\n            //m_renderer.sharedMaterial.hideFlags = HideFlags.None;\n        }\n\n\n        void UpdateEnvMapMatrix()\n        {\n            if (!m_sharedMaterial.HasProperty(ShaderUtilities.ID_EnvMap) || m_sharedMaterial.GetTexture(ShaderUtilities.ID_EnvMap) == null)\n                return;\n\n            //Debug.Log(\"Updating Env Matrix...\");\n            Vector3 rotation = m_sharedMaterial.GetVector(ShaderUtilities.ID_EnvMatrixRotation);\n            m_EnvMapMatrix = Matrix4x4.TRS(Vector3.zero, Quaternion.Euler(rotation), Vector3.one);\n\n            m_sharedMaterial.SetMatrix(ShaderUtilities.ID_EnvMatrix, m_EnvMapMatrix);\n        }\n\n\n        //\n        void SetMask(MaskingTypes maskType)\n        {\n            switch(maskType)\n            {\n                case MaskingTypes.MaskOff:\n                    m_sharedMaterial.DisableKeyword(ShaderUtilities.Keyword_MASK_SOFT);\n                    m_sharedMaterial.DisableKeyword(ShaderUtilities.Keyword_MASK_HARD);\n                    m_sharedMaterial.DisableKeyword(ShaderUtilities.Keyword_MASK_TEX);\n                    break;\n                case MaskingTypes.MaskSoft:\n                    m_sharedMaterial.EnableKeyword(ShaderUtilities.Keyword_MASK_SOFT);\n                    m_sharedMaterial.DisableKeyword(ShaderUtilities.Keyword_MASK_HARD);\n                    m_sharedMaterial.DisableKeyword(ShaderUtilities.Keyword_MASK_TEX);\n                    break;\n                case MaskingTypes.MaskHard:\n                    m_sharedMaterial.EnableKeyword(ShaderUtilities.Keyword_MASK_HARD);\n                    m_sharedMaterial.DisableKeyword(ShaderUtilities.Keyword_MASK_SOFT);\n                    m_sharedMaterial.DisableKeyword(ShaderUtilities.Keyword_MASK_TEX);\n                    break;\n                //case MaskingTypes.MaskTex:\n                //    m_sharedMaterial.EnableKeyword(ShaderUtilities.Keyword_MASK_TEX);\n                //    m_sharedMaterial.DisableKeyword(ShaderUtilities.Keyword_MASK_HARD);\n                //    m_sharedMaterial.DisableKeyword(ShaderUtilities.Keyword_MASK_SOFT);\n                //    break;\n            }\n        }\n\n\n        // Method used to set the masking coordinates\n        void SetMaskCoordinates(Vector4 coords)\n        {\n            m_sharedMaterial.SetVector(ShaderUtilities.ID_ClipRect, coords);\n        }\n\n        // Method used to set the masking coordinates\n        void SetMaskCoordinates(Vector4 coords, float softX, float softY)\n        {\n            m_sharedMaterial.SetVector(ShaderUtilities.ID_ClipRect, coords);\n            m_sharedMaterial.SetFloat(ShaderUtilities.ID_MaskSoftnessX, softX);\n            m_sharedMaterial.SetFloat(ShaderUtilities.ID_MaskSoftnessY, softY);\n        }\n\n\n\n        // Enable Masking in the Shader\n        void EnableMasking()\n        {\n            if (m_sharedMaterial.HasProperty(ShaderUtilities.ID_ClipRect))\n            {\n                m_sharedMaterial.EnableKeyword(ShaderUtilities.Keyword_MASK_SOFT);\n                m_sharedMaterial.DisableKeyword(ShaderUtilities.Keyword_MASK_HARD);\n                m_sharedMaterial.DisableKeyword(ShaderUtilities.Keyword_MASK_TEX);\n\n                m_isMaskingEnabled = true;\n                UpdateMask();\n            }\n        }\n\n\n        // Enable Masking in the Shader\n        void DisableMasking()\n        {\n            if (m_sharedMaterial.HasProperty(ShaderUtilities.ID_ClipRect))\n            {\n                m_sharedMaterial.DisableKeyword(ShaderUtilities.Keyword_MASK_SOFT);\n                m_sharedMaterial.DisableKeyword(ShaderUtilities.Keyword_MASK_HARD);\n                m_sharedMaterial.DisableKeyword(ShaderUtilities.Keyword_MASK_TEX);\n\n                m_isMaskingEnabled = false;\n                UpdateMask();\n            }\n        }\n\n\n        void UpdateMask()\n        {\n            //Debug.Log(\"UpdateMask() called.\");\n            \n            if (!m_isMaskingEnabled)\n            {\n                // Release Masking Material\n\n                // Re-assign Base Material\n\n                return;\n            }\n            \n            if (m_isMaskingEnabled && m_fontMaterial == null)\n            {\n                CreateMaterialInstance();\n            }\n\n            \n            /*\n            if (!m_isMaskingEnabled)\n            {\n                //Debug.Log(\"Masking is not enabled.\");\n                if (m_maskingPropertyBlock != null)\n                {\n                    m_renderer.SetPropertyBlock(null);\n                    //havePropertiesChanged = true;\n                }\n                return;\n            }\n            //else\n            //    Debug.Log(\"Updating Masking...\");\n            */\n             \n            // Compute Masking Coordinates & Softness\n            //float softnessX = Mathf.Min(Mathf.Min(m_textContainer.margins.x, m_textContainer.margins.z), m_sharedMaterial.GetFloat(ShaderUtilities.ID_MaskSoftnessX));\n            //float softnessY = Mathf.Min(Mathf.Min(m_textContainer.margins.y, m_textContainer.margins.w), m_sharedMaterial.GetFloat(ShaderUtilities.ID_MaskSoftnessY));\n\n            //softnessX = softnessX > 0 ? softnessX : 0;\n            //softnessY = softnessY > 0 ? softnessY : 0;\n           \n            //float width = (m_textContainer.width - Mathf.Max(m_textContainer.margins.x, 0) - Mathf.Max(m_textContainer.margins.z, 0)) / 2 + softnessX;\n            //float height =  (m_textContainer.height - Mathf.Max(m_textContainer.margins.y, 0) - Mathf.Max(m_textContainer.margins.w, 0)) / 2 + softnessY;\n          \n            //Vector2 center = new Vector2((0.5f - m_textContainer.pivot.x) * m_textContainer.width + (Mathf.Max(m_textContainer.margins.x, 0) - Mathf.Max(m_textContainer.margins.z, 0)) / 2, (0.5f - m_textContainer.pivot.y) * m_textContainer.height + (- Mathf.Max(m_textContainer.margins.y, 0) + Mathf.Max(m_textContainer.margins.w, 0)) / 2);                           \n            //Vector4 mask = new Vector4(center.x, center.y, width, height);\n\n\n            //m_fontMaterial.SetVector(ShaderUtilities.ID_ClipRect, mask);\n            //m_fontMaterial.SetFloat(ShaderUtilities.ID_MaskSoftnessX, softnessX);\n            //m_fontMaterial.SetFloat(ShaderUtilities.ID_MaskSoftnessY, softnessY);\n\n            /*                     \n            if(m_maskingPropertyBlock == null)\n            {                \n                m_maskingPropertyBlock = new MaterialPropertyBlock();\n         \n                //m_maskingPropertyBlock.AddFloat(ShaderUtilities.ID_VertexOffsetX,  m_sharedMaterial.GetFloat(ShaderUtilities.ID_VertexOffsetX));\n                //m_maskingPropertyBlock.AddFloat(ShaderUtilities.ID_VertexOffsetY,  m_sharedMaterial.GetFloat(ShaderUtilities.ID_VertexOffsetY));\n                //Debug.Log(\"Creating new MaterialPropertyBlock.\");\n            }\n\n            //Debug.Log(\"Updating Material Property Block.\");\n            //m_maskingPropertyBlock.Clear();\n            m_maskingPropertyBlock.AddFloat(ShaderUtilities.ID_MaskID, m_renderer.GetInstanceID());\n            m_maskingPropertyBlock.AddVector(ShaderUtilities.ID_MaskCoord, mask);\n            m_maskingPropertyBlock.AddFloat(ShaderUtilities.ID_MaskSoftnessX, softnessX);\n            m_maskingPropertyBlock.AddFloat(ShaderUtilities.ID_MaskSoftnessY, softnessY);\n           \n            m_renderer.SetPropertyBlock(m_maskingPropertyBlock);\n            */\n        }\n\n\n        // Function called internally when a new material is assigned via the fontMaterial property.\n        protected override Material GetMaterial(Material mat)\n        {\n            // Check in case Object is disabled. If so, we don't have a valid reference to the Renderer.\n            // This can occur when the Duplicate Material Context menu is used on an inactive object.\n            //if (m_renderer == null)\n            //    m_renderer = GetComponent<Renderer>();\n\n            // Create Instance Material only if the new material is not the same instance previously used.\n            if (m_fontMaterial == null || m_fontMaterial.GetInstanceID() != mat.GetInstanceID())\n                m_fontMaterial = CreateMaterialInstance(mat);\n\n            m_sharedMaterial = m_fontMaterial;\n\n            m_padding = GetPaddingForMaterial();\n\n            SetVerticesDirty();\n            SetMaterialDirty();\n\n            return m_sharedMaterial;\n        }\n\n\n        /// <summary>\n        /// Method returning instances of the materials used by the text object.\n        /// </summary>\n        /// <returns></returns>\n        protected override Material[] GetMaterials(Material[] mats)\n        {\n            int materialCount = m_textInfo.materialCount;\n\n            if (m_fontMaterials == null)\n                m_fontMaterials = new Material[materialCount];\n            else if (m_fontMaterials.Length != materialCount)\n                TMP_TextInfo.Resize(ref m_fontMaterials, materialCount, false);\n\n            // Get instances of the materials\n            for (int i = 0; i < materialCount; i++)\n            {\n                if (i == 0)\n                    m_fontMaterials[i] = fontMaterial;\n                else\n                    m_fontMaterials[i] = m_subTextObjects[i].material;\n            }\n\n            m_fontSharedMaterials = m_fontMaterials;\n\n            return m_fontMaterials;\n        }\n\n\n        // Function called internally when a new shared material is assigned via the fontSharedMaterial property.\n        protected override void SetSharedMaterial(Material mat)\n        {\n            // Check in case Object is disabled. If so, we don't have a valid reference to the Renderer.\n            // This can occur when the Duplicate Material Context menu is used on an inactive object.\n            //if (m_renderer == null)\n            //    m_renderer = GetComponent<Renderer>();\n\n            m_sharedMaterial = mat;\n\n            m_padding = GetPaddingForMaterial();\n\n            SetMaterialDirty();\n        }\n\n\n        /// <summary>\n        /// Method returning an array containing the materials used by the text object.\n        /// </summary>\n        /// <returns></returns>\n        protected override Material[] GetSharedMaterials()\n        {\n            int materialCount = m_textInfo.materialCount;\n\n            if (m_fontSharedMaterials == null)\n                m_fontSharedMaterials = new Material[materialCount];\n            else if (m_fontSharedMaterials.Length != materialCount)\n                TMP_TextInfo.Resize(ref m_fontSharedMaterials, materialCount, false);\n\n            for (int i = 0; i < materialCount; i++)\n            {\n                if (i == 0)\n                    m_fontSharedMaterials[i] = m_sharedMaterial;\n                else\n                    m_fontSharedMaterials[i] = m_subTextObjects[i].sharedMaterial;\n            }\n\n            return m_fontSharedMaterials;\n        }\n\n\n        /// <summary>\n        /// Method used to assign new materials to the text and sub text objects.\n        /// </summary>\n        protected override void SetSharedMaterials(Material[] materials)\n        {\n            int materialCount = m_textInfo.materialCount;\n\n            // Check allocation of the fontSharedMaterials array.\n            if (m_fontSharedMaterials == null)\n                m_fontSharedMaterials = new Material[materialCount];\n            else if (m_fontSharedMaterials.Length != materialCount)\n                TMP_TextInfo.Resize(ref m_fontSharedMaterials, materialCount, false);\n\n            // Only assign as many materials as the text object contains.\n            for (int i = 0; i < materialCount; i++)\n            {\n                Texture mat_MainTex = materials[i].GetTexture(ShaderUtilities.ID_MainTex);\n\n                if (i == 0)\n                {\n                    // Only assign new material if the font atlas textures match.\n                    if ( mat_MainTex == null || mat_MainTex.GetInstanceID() != m_sharedMaterial.GetTexture(ShaderUtilities.ID_MainTex).GetInstanceID())\n                        continue;\n\n                    m_sharedMaterial = m_fontSharedMaterials[i] = materials[i];\n                    m_padding = GetPaddingForMaterial(m_sharedMaterial);\n                }\n                else\n                {\n                    // Only assign new material if the font atlas textures match.\n                    if (mat_MainTex == null || mat_MainTex.GetInstanceID() != m_subTextObjects[i].sharedMaterial.GetTexture(ShaderUtilities.ID_MainTex).GetInstanceID())\n                        continue;\n\n                    // Only assign a new material if none were specified in the text input.\n                    if (m_subTextObjects[i].isDefaultMaterial)\n                        m_subTextObjects[i].sharedMaterial = m_fontSharedMaterials[i] = materials[i];\n                }\n            }\n        }\n\n\n        // This function will create an instance of the Font Material.\n        protected override void SetOutlineThickness(float thickness)\n        {\n            thickness = Mathf.Clamp01(thickness);\n            m_renderer.material.SetFloat(ShaderUtilities.ID_OutlineWidth, thickness);\n\n            if (m_fontMaterial == null)\n                m_fontMaterial = m_renderer.material;\n\n            m_fontMaterial = m_renderer.material;\n            m_sharedMaterial = m_fontMaterial;\n            m_padding = GetPaddingForMaterial();\n        }\n\n\n        // This function will create an instance of the Font Material.\n        protected override void SetFaceColor(Color32 color)\n        {\n            m_renderer.material.SetColor(ShaderUtilities.ID_FaceColor, color);\n\n            if (m_fontMaterial == null)\n                m_fontMaterial = m_renderer.material;\n\n            m_sharedMaterial = m_fontMaterial;\n        }\n\n\n        // This function will create an instance of the Font Material.\n        protected override void SetOutlineColor(Color32 color)\n        {\n            m_renderer.material.SetColor(ShaderUtilities.ID_OutlineColor, color);\n\n            if (m_fontMaterial == null)\n                m_fontMaterial = m_renderer.material;\n\n            //Debug.Log(\"Material ID:\" + m_fontMaterial.GetInstanceID());\n            m_sharedMaterial = m_fontMaterial;\n        }\n\n\n        // Function used to create an instance of the material\n        void CreateMaterialInstance()\n        {\n            Material mat = new Material(m_sharedMaterial);\n            mat.shaderKeywords = m_sharedMaterial.shaderKeywords;\n\n            //mat.hideFlags = HideFlags.DontSave;\n            mat.name += \" Instance\";\n\n            m_fontMaterial = mat;\n        }\n\n\n        // Sets the Render Queue and Ztest mode \n        protected override void SetShaderDepth()\n        {\n            if (m_isOverlay)\n            {\n                // Changing these properties results in an instance of the material\n                m_sharedMaterial.SetFloat(ShaderUtilities.ShaderTag_ZTestMode, 0);\n                //m_renderer.material.SetFloat(\"_ZTestMode\", 8);\n                m_renderer.material.renderQueue = 4000;\n\n                m_sharedMaterial = m_renderer.material;\n                //Debug.Log(\"Text set to Overlay mode.\");\n            }\n            else\n            {\n                // Should this use an instanced material?\n                m_sharedMaterial.SetFloat(ShaderUtilities.ShaderTag_ZTestMode, 4);\n                m_renderer.material.renderQueue = -1;\n                \n                m_sharedMaterial = m_renderer.material;\n                //Debug.Log(\"Text set to Normal mode.\");\n            }\n        }\n\n\n        // Sets the Culling mode of the material\n        protected override void SetCulling()\n        {\n            if (m_isCullingEnabled)\n            {\n                m_renderer.material.SetFloat(\"_CullMode\", 2);\n\n                for (int i = 1; i < m_subTextObjects.Length && m_subTextObjects[i] != null; i++)\n                {\n                    Renderer renderer = m_subTextObjects[i].renderer;\n\n                    if (renderer != null)\n                    {\n                        renderer.material.SetFloat(ShaderUtilities.ShaderTag_CullMode, 2);\n                    }\n                }\n            }\n            else\n            {\n                m_renderer.material.SetFloat(\"_CullMode\", 0);\n\n                for (int i = 1; i < m_subTextObjects.Length && m_subTextObjects[i] != null; i++)\n                {\n                    Renderer renderer = m_subTextObjects[i].renderer;\n\n                    if (renderer != null)\n                    {\n                        renderer.material.SetFloat(ShaderUtilities.ShaderTag_CullMode, 0);\n                    }\n                }\n            }\n        }\n\n\n        // Set Perspective Correction Mode based on whether Camera is Orthographic or Perspective\n        void SetPerspectiveCorrection()\n        {\n            if (m_isOrthographic)\n                m_sharedMaterial.SetFloat(ShaderUtilities.ID_PerspectiveFilter, 0.0f);\n            else\n                m_sharedMaterial.SetFloat(ShaderUtilities.ID_PerspectiveFilter, 0.875f);\n        }\n\n\n        /// <summary>\n        /// Get the padding value for the currently assigned material.\n        /// </summary>\n        /// <returns></returns>\n        protected override float GetPaddingForMaterial(Material mat)\n        {\n            m_padding = ShaderUtilities.GetPadding(mat, m_enableExtraPadding, m_isUsingBold);\n            m_isMaskingEnabled = ShaderUtilities.IsMaskingEnabled(m_sharedMaterial);\n            m_isSDFShader = mat.HasProperty(ShaderUtilities.ID_WeightNormal);\n\n            return m_padding;\n        }\n\n\n        /// <summary>\n        /// Get the padding value for the currently assigned material.\n        /// </summary>\n        /// <returns></returns>\n        protected override float GetPaddingForMaterial()\n        {\n            ShaderUtilities.GetShaderPropertyIDs();\n\n            if (m_sharedMaterial == null) return 0;\n\n            m_padding = ShaderUtilities.GetPadding(m_sharedMaterial, m_enableExtraPadding, m_isUsingBold);\n            m_isMaskingEnabled = ShaderUtilities.IsMaskingEnabled(m_sharedMaterial);\n            m_isSDFShader = m_sharedMaterial.HasProperty(ShaderUtilities.ID_WeightNormal);\n\n            return m_padding;\n        }\n\n\n        // This function parses through the Char[] to determine how many characters will be visible. It then makes sure the arrays are large enough for all those characters.\n        protected override int SetArraySizes(UnicodeChar[] chars)\n        {\n            //Debug.Log(\"*** SetArraySizes() ***\");\n\n            int spriteCount = 0;\n\n            m_totalCharacterCount = 0;\n            m_isUsingBold = false;\n            m_isParsingText = false;\n            tag_NoParsing = false;\n            m_FontStyleInternal = m_fontStyle;\n\n            m_FontWeightInternal = (m_FontStyleInternal & FontStyles.Bold) == FontStyles.Bold ? FontWeight.Bold : m_fontWeight;\n            m_FontWeightStack.SetDefault(m_FontWeightInternal);\n\n            m_currentFontAsset = m_fontAsset;\n            m_currentMaterial = m_sharedMaterial;\n            m_currentMaterialIndex = 0;\n\n            m_materialReferenceStack.SetDefault(new MaterialReference(m_currentMaterialIndex, m_currentFontAsset, null, m_currentMaterial, m_padding));\n\n            m_materialReferenceIndexLookup.Clear();\n            MaterialReference.AddMaterialReference(m_currentMaterial, m_currentFontAsset, m_materialReferences, m_materialReferenceIndexLookup);\n\n            if (m_textInfo == null) m_textInfo = new TMP_TextInfo();\n            m_textElementType = TMP_TextElementType.Character;\n\n            // Clear Linked Text object if we have one.\n            if (m_linkedTextComponent != null)\n            {\n                m_linkedTextComponent.text = string.Empty;\n                m_linkedTextComponent.ForceMeshUpdate();\n            }\n\n            // Parsing XML tags in the text\n            for (int i = 0; i < chars.Length && chars[i].unicode != 0; i++)\n            {\n                //Make sure the characterInfo array can hold the next text element.\n                if (m_textInfo.characterInfo == null || m_totalCharacterCount >= m_textInfo.characterInfo.Length)\n                    TMP_TextInfo.Resize(ref m_textInfo.characterInfo, m_totalCharacterCount + 1, true);\n\n                int unicode = (int)chars[i].unicode;\n\n                // PARSE XML TAGS\n                #region PARSE XML TAGS\n                if (m_isRichText && unicode == 60) // if Char '<'\n                {\n                    int prev_MaterialIndex = m_currentMaterialIndex;\n\n                    // Check if Tag is Valid\n                    if (ValidateHtmlTag(chars, i + 1, out int tagEnd))\n                    {\n                        int tagStartIndex = chars[i].stringIndex;\n                        i = tagEnd;\n\n                        if ((m_FontStyleInternal & FontStyles.Bold) == FontStyles.Bold) m_isUsingBold = true;\n\n                        if (m_textElementType == TMP_TextElementType.Sprite)\n                        {\n                            m_materialReferences[m_currentMaterialIndex].referenceCount += 1;\n\n                            m_textInfo.characterInfo[m_totalCharacterCount].character = (char)(57344 + m_spriteIndex);\n                            m_textInfo.characterInfo[m_totalCharacterCount].spriteIndex = m_spriteIndex;\n                            m_textInfo.characterInfo[m_totalCharacterCount].fontAsset = m_currentFontAsset;\n                            m_textInfo.characterInfo[m_totalCharacterCount].spriteAsset = m_currentSpriteAsset;\n                            m_textInfo.characterInfo[m_totalCharacterCount].materialReferenceIndex = m_currentMaterialIndex;\n                            m_textInfo.characterInfo[m_totalCharacterCount].textElement = m_currentSpriteAsset.spriteCharacterTable[m_spriteIndex];\n                            m_textInfo.characterInfo[m_totalCharacterCount].elementType = m_textElementType;\n                            m_textInfo.characterInfo[m_totalCharacterCount].index = tagStartIndex;\n                            m_textInfo.characterInfo[m_totalCharacterCount].stringLength = chars[i].stringIndex - tagStartIndex + 1;\n\n                            // Restore element type and material index to previous values.\n                            m_textElementType = TMP_TextElementType.Character;\n                            m_currentMaterialIndex = prev_MaterialIndex;\n\n                            spriteCount += 1;\n                            m_totalCharacterCount += 1;\n                        }\n\n                        continue;\n                    }\n                }\n                #endregion\n\n                bool isUsingAlternativeTypeface = false;\n                bool isUsingFallbackOrAlternativeTypeface = false;\n\n                TMP_Character character;\n                TMP_FontAsset tempFontAsset;\n                TMP_FontAsset prev_fontAsset = m_currentFontAsset;\n                Material prev_material = m_currentMaterial;\n                int prev_materialIndex = m_currentMaterialIndex;\n\n\n                // Handle Font Styles like LowerCase, UpperCase and SmallCaps.\n                #region Handling of LowerCase, UpperCase and SmallCaps Font Styles\n                if (m_textElementType == TMP_TextElementType.Character)\n                {\n                    if ((m_FontStyleInternal & FontStyles.UpperCase) == FontStyles.UpperCase)\n                    {\n                        // If this character is lowercase, switch to uppercase.\n                        if (char.IsLower((char)unicode))\n                            unicode = char.ToUpper((char)unicode);\n\n                    }\n                    else if ((m_FontStyleInternal & FontStyles.LowerCase) == FontStyles.LowerCase)\n                    {\n                        // If this character is uppercase, switch to lowercase.\n                        if (char.IsUpper((char)unicode))\n                            unicode = char.ToLower((char)unicode);\n                    }\n                    else if ((m_FontStyleInternal & FontStyles.SmallCaps) == FontStyles.SmallCaps)\n                    {\n                        // Only convert lowercase characters to uppercase.\n                        if (char.IsLower((char)unicode))\n                            unicode = char.ToUpper((char)unicode);\n                    }\n                }\n                #endregion\n\n\n                // Lookup the Glyph data for each character and cache it.\n                #region LOOKUP GLYPH\n                character = TMP_FontAssetUtilities.GetCharacterFromFontAsset((uint)unicode, m_currentFontAsset, false, m_FontStyleInternal, m_FontWeightInternal, out isUsingAlternativeTypeface, out tempFontAsset);\n\n                // Search for the glyph in the list of fallback assigned to the primary font asset.\n                if (character == null)\n                {\n                    if (m_currentFontAsset.fallbackFontAssetTable != null && m_currentFontAsset.fallbackFontAssetTable.Count > 0)\n                        character = TMP_FontAssetUtilities.GetCharacterFromFontAssets((uint)unicode, m_currentFontAsset.fallbackFontAssetTable, true, m_FontStyleInternal, m_FontWeightInternal, out isUsingAlternativeTypeface, out tempFontAsset);\n                }\n\n                // Search for the glyph in the Sprite Asset assigned to the text object.\n                if (character == null)\n                {\n                    TMP_SpriteAsset spriteAsset = this.spriteAsset;\n\n                    if (spriteAsset != null)\n                    {\n                        int spriteIndex = -1;\n\n                        // Check Default Sprite Asset and its Fallbacks\n                        spriteAsset = TMP_SpriteAsset.SearchForSpriteByUnicode(spriteAsset, (uint)unicode, true, out spriteIndex);\n\n                        if (spriteIndex != -1)\n                        {\n                            m_textElementType = TMP_TextElementType.Sprite;\n                            m_textInfo.characterInfo[m_totalCharacterCount].elementType = m_textElementType;\n\n                            m_currentMaterialIndex = MaterialReference.AddMaterialReference(spriteAsset.material, spriteAsset, m_materialReferences, m_materialReferenceIndexLookup);\n                            m_materialReferences[m_currentMaterialIndex].referenceCount += 1;\n\n                            m_textInfo.characterInfo[m_totalCharacterCount].character = (char)unicode;\n                            m_textInfo.characterInfo[m_totalCharacterCount].spriteIndex = spriteIndex;\n                            m_textInfo.characterInfo[m_totalCharacterCount].fontAsset = m_currentFontAsset;\n                            m_textInfo.characterInfo[m_totalCharacterCount].spriteAsset = spriteAsset;\n                            m_textInfo.characterInfo[m_totalCharacterCount].textElement = spriteAsset.spriteCharacterTable[m_spriteIndex];\n                            m_textInfo.characterInfo[m_totalCharacterCount].materialReferenceIndex = m_currentMaterialIndex;\n                            m_textInfo.characterInfo[m_totalCharacterCount].index = chars[i].stringIndex;\n                            m_textInfo.characterInfo[m_totalCharacterCount].stringLength = chars[i].length;\n\n                            // Restore element type and material index to previous values.\n                            m_textElementType = TMP_TextElementType.Character;\n                            m_currentMaterialIndex = prev_materialIndex;\n\n                            spriteCount += 1;\n                            m_totalCharacterCount += 1;\n\n                            continue;\n                        }\n                    }\n                }\n\n                // Search for the glyph in the list of fallback assigned in the TMP Settings (General Fallbacks).\n                if (character == null)\n                {\n                    if (TMP_Settings.fallbackFontAssets != null && TMP_Settings.fallbackFontAssets.Count > 0)\n                        character = TMP_FontAssetUtilities.GetCharacterFromFontAssets((uint)unicode, TMP_Settings.fallbackFontAssets, true, m_FontStyleInternal, m_FontWeightInternal, out isUsingAlternativeTypeface, out tempFontAsset);\n                }\n\n                // Search for the glyph in the Default Font Asset assigned in the TMP Settings file.\n                if (character == null)\n                {\n                    if (TMP_Settings.defaultFontAsset != null)\n                        character = TMP_FontAssetUtilities.GetCharacterFromFontAsset((uint)unicode, TMP_Settings.defaultFontAsset, true, m_FontStyleInternal, m_FontWeightInternal, out isUsingAlternativeTypeface, out tempFontAsset);\n                }\n\n                // TODO: Add support for using Sprite Assets like a special Emoji only Sprite Asset when UTF16 or UTF32 glyphs are requested.\n                // This would kind of mirror native Emoji support.\n                if (character == null)\n                {\n                    TMP_SpriteAsset spriteAsset = TMP_Settings.defaultSpriteAsset;\n\n                    if (spriteAsset != null)\n                    {\n                        int spriteIndex = -1;\n\n                        // Check Default Sprite Asset and its Fallbacks\n                        spriteAsset = TMP_SpriteAsset.SearchForSpriteByUnicode(spriteAsset, (uint)unicode, true, out spriteIndex);\n\n                        if (spriteIndex != -1)\n                        {\n                            m_textElementType = TMP_TextElementType.Sprite;\n                            m_textInfo.characterInfo[m_totalCharacterCount].elementType = m_textElementType;\n\n                            m_currentMaterialIndex = MaterialReference.AddMaterialReference(spriteAsset.material, spriteAsset, m_materialReferences, m_materialReferenceIndexLookup);\n                            m_materialReferences[m_currentMaterialIndex].referenceCount += 1;\n\n                            m_textInfo.characterInfo[m_totalCharacterCount].character = (char)unicode;\n                            m_textInfo.characterInfo[m_totalCharacterCount].spriteIndex = spriteIndex;\n                            m_textInfo.characterInfo[m_totalCharacterCount].fontAsset = m_currentFontAsset;\n                            m_textInfo.characterInfo[m_totalCharacterCount].spriteAsset = spriteAsset;\n                            m_textInfo.characterInfo[m_totalCharacterCount].textElement = spriteAsset.spriteCharacterTable[m_spriteIndex];\n                            m_textInfo.characterInfo[m_totalCharacterCount].materialReferenceIndex = m_currentMaterialIndex;\n                            m_textInfo.characterInfo[m_totalCharacterCount].index = chars[i].stringIndex;\n                            m_textInfo.characterInfo[m_totalCharacterCount].stringLength = chars[i].length;\n\n                            // Restore element type and material index to previous values.\n                            m_textElementType = TMP_TextElementType.Character;\n                            m_currentMaterialIndex = prev_materialIndex;\n\n                            spriteCount += 1;\n                            m_totalCharacterCount += 1;\n\n                            continue;\n                        }\n\n                    }\n                }\n\n                //Check if Lowercase or Uppercase variant of the character is available.\n                // Not sure this is necessary anyone as it is very unlikely with recursive search through fallback fonts.\n                //if (glyph == null)\n                //{\n                //    if (char.IsLower((char)c))\n                //    {\n                //        if (m_currentFontAsset.characterDictionary.TryGetValue(char.ToUpper((char)c), out glyph))\n                //            c = chars[i] = char.ToUpper((char)c);\n                //    }\n                //    else if (char.IsUpper((char)c))\n                //    {\n                //        if (m_currentFontAsset.characterDictionary.TryGetValue(char.ToLower((char)c), out glyph))\n                //            c = chars[i] = char.ToLower((char)c);\n                //    }\n                //}\n\n                // Replace missing glyph by the Square (9633) glyph or possibly the Space (32) glyph.\n                if (character == null)\n                {\n                    // Save the original unicode character\n                    int srcGlyph = unicode;\n\n                    // Try replacing the missing glyph character by TMP Settings Missing Glyph or Square (9633) character.\n                    unicode = chars[i].unicode = TMP_Settings.missingGlyphCharacter == 0 ? 9633 : TMP_Settings.missingGlyphCharacter;\n\n                    // Check for the missing glyph character in the currently assigned font asset and its fallbacks\n                    character = TMP_FontAssetUtilities.GetCharacterFromFontAsset((uint)unicode, m_currentFontAsset, true, m_FontStyleInternal, m_FontWeightInternal, out isUsingAlternativeTypeface, out tempFontAsset);\n\n                    if (character == null)\n                    {\n                        // Search for the missing glyph character in the TMP Settings Fallback list.\n                        if (TMP_Settings.fallbackFontAssets != null && TMP_Settings.fallbackFontAssets.Count > 0)\n                            character = TMP_FontAssetUtilities.GetCharacterFromFontAssets((uint)unicode, TMP_Settings.fallbackFontAssets, true, m_FontStyleInternal, m_FontWeightInternal, out isUsingAlternativeTypeface, out tempFontAsset);\n                    }\n\n                    if (character == null)\n                    {\n                        // Search for the missing glyph in the TMP Settings Default Font Asset.\n                        if (TMP_Settings.defaultFontAsset != null)\n                            character = TMP_FontAssetUtilities.GetCharacterFromFontAsset((uint)unicode, TMP_Settings.defaultFontAsset, true, m_FontStyleInternal, m_FontWeightInternal, out isUsingAlternativeTypeface, out tempFontAsset);\n                    }\n\n                    if (character == null)\n                    {\n                        // Use Space (32) Glyph from the currently assigned font asset.\n                        unicode = chars[i].unicode = 32;\n                        character = TMP_FontAssetUtilities.GetCharacterFromFontAsset((uint)unicode, m_currentFontAsset, true, m_FontStyleInternal, m_FontWeightInternal, out isUsingAlternativeTypeface, out tempFontAsset);\n                        if (!TMP_Settings.warningsDisabled)\n                            Debug.LogWarning(\"Character with ASCII value of \" + srcGlyph + \" was not found in the Font Asset Glyph Table. It was replaced by a space.\", this);\n                    }\n                }\n\n                // Determine if the font asset is still the current font asset or a fallback.\n                if (tempFontAsset != null)\n                {\n                    if (tempFontAsset.GetInstanceID() != m_currentFontAsset.GetInstanceID())\n                    {\n                        isUsingFallbackOrAlternativeTypeface = true;\n                        m_currentFontAsset = tempFontAsset;\n                    }\n                }\n                #endregion\n\n                m_textInfo.characterInfo[m_totalCharacterCount].elementType = TMP_TextElementType.Character;\n                m_textInfo.characterInfo[m_totalCharacterCount].textElement = character;\n                m_textInfo.characterInfo[m_totalCharacterCount].isUsingAlternateTypeface = isUsingAlternativeTypeface;\n                m_textInfo.characterInfo[m_totalCharacterCount].character = (char)unicode;\n                m_textInfo.characterInfo[m_totalCharacterCount].fontAsset = m_currentFontAsset;\n                m_textInfo.characterInfo[m_totalCharacterCount].index = chars[i].stringIndex;\n                m_textInfo.characterInfo[m_totalCharacterCount].stringLength = chars[i].length;\n\n                if (isUsingFallbackOrAlternativeTypeface)\n                {\n                    // Create Fallback material instance matching current material preset if necessary\n                    if (TMP_Settings.matchMaterialPreset)\n                        m_currentMaterial = TMP_MaterialManager.GetFallbackMaterial(m_currentMaterial, m_currentFontAsset.material);\n                    else\n                        m_currentMaterial = m_currentFontAsset.material;\n\n                    m_currentMaterialIndex = MaterialReference.AddMaterialReference(m_currentMaterial, m_currentFontAsset, m_materialReferences, m_materialReferenceIndexLookup);\n                }\n\n                if (!char.IsWhiteSpace((char)unicode) && unicode != 0x200B)\n                {\n                    // Limit the mesh of the main text object to 65535 vertices and use sub objects for the overflow.\n                    if (m_materialReferences[m_currentMaterialIndex].referenceCount < 16383)\n                        m_materialReferences[m_currentMaterialIndex].referenceCount += 1;\n                    else\n                    {\n                        m_currentMaterialIndex = MaterialReference.AddMaterialReference(new Material(m_currentMaterial), m_currentFontAsset, m_materialReferences, m_materialReferenceIndexLookup);\n                        m_materialReferences[m_currentMaterialIndex].referenceCount += 1;\n                    }\n                }\n\n                m_textInfo.characterInfo[m_totalCharacterCount].material = m_currentMaterial;\n                m_textInfo.characterInfo[m_totalCharacterCount].materialReferenceIndex = m_currentMaterialIndex;\n                m_materialReferences[m_currentMaterialIndex].isFallbackMaterial = isUsingFallbackOrAlternativeTypeface;\n\n                // Restore previous font asset and material if fallback font was used.\n                if (isUsingFallbackOrAlternativeTypeface)\n                {\n                    m_materialReferences[m_currentMaterialIndex].fallbackMaterial = prev_material;\n                    m_currentFontAsset = prev_fontAsset;\n                    m_currentMaterial = prev_material;\n                    m_currentMaterialIndex = prev_materialIndex;\n                }\n\n                m_totalCharacterCount += 1;\n            }\n\n            // Early return if we are calculating the preferred values.\n            if (m_isCalculatingPreferredValues)\n            {\n                m_isCalculatingPreferredValues = false;\n                m_isInputParsingRequired = true;\n                return m_totalCharacterCount;\n            }\n\n            // Save material and sprite count.\n            m_textInfo.spriteCount = spriteCount;\n            int materialCount = m_textInfo.materialCount = m_materialReferenceIndexLookup.Count;\n\n            // Check if we need to resize the MeshInfo array for handling different materials.\n            if (materialCount > m_textInfo.meshInfo.Length)\n                TMP_TextInfo.Resize(ref m_textInfo.meshInfo, materialCount, false);\n\n            // Resize SubTextObject array if necessary\n            if (materialCount > m_subTextObjects.Length)\n                TMP_TextInfo.Resize(ref m_subTextObjects, Mathf.NextPowerOfTwo(materialCount + 1));\n\n            // Resize CharacterInfo[] if allocations are excessive\n            if (m_textInfo.characterInfo.Length - m_totalCharacterCount > 256)\n                TMP_TextInfo.Resize(ref m_textInfo.characterInfo, Mathf.Max(m_totalCharacterCount + 1, 256), true);\n\n\n            // Iterate through the material references to set the mesh buffer allocations\n            for (int i = 0; i < materialCount; i++)\n            {\n                // Add new sub text object for each material reference\n                if (i > 0)\n                {\n                    if (m_subTextObjects[i] == null)\n                    {\n                        m_subTextObjects[i] = TMP_SubMesh.AddSubTextObject(this, m_materialReferences[i]);\n\n                        // Not sure this is necessary\n                        m_textInfo.meshInfo[i].vertices = null;\n                    }\n                    //else if (m_subTextObjects[i].gameObject.activeInHierarchy == false)\n                    //    m_subTextObjects[i].gameObject.SetActive(true);\n\n                    // Check if the material has changed.\n                    if (m_subTextObjects[i].sharedMaterial == null || m_subTextObjects[i].sharedMaterial.GetInstanceID() != m_materialReferences[i].material.GetInstanceID())\n                    {\n                        bool isDefaultMaterial = m_materialReferences[i].isDefaultMaterial;\n\n                        m_subTextObjects[i].isDefaultMaterial = isDefaultMaterial;\n\n                        // Assign new material if we are not using the default material or if the font asset has changed.\n                        if (!isDefaultMaterial || m_subTextObjects[i].sharedMaterial == null || m_subTextObjects[i].sharedMaterial.GetTexture(ShaderUtilities.ID_MainTex).GetInstanceID() != m_materialReferences[i].material.GetTexture(ShaderUtilities.ID_MainTex).GetInstanceID())\n                        {\n                            m_subTextObjects[i].sharedMaterial = m_materialReferences[i].material;\n                            m_subTextObjects[i].fontAsset = m_materialReferences[i].fontAsset;\n                            m_subTextObjects[i].spriteAsset = m_materialReferences[i].spriteAsset;\n                        }\n                    }\n\n                    // Check if we need to use a Fallback Material\n                    if (m_materialReferences[i].isFallbackMaterial)\n                    {\n                        m_subTextObjects[i].fallbackMaterial = m_materialReferences[i].material;\n                        m_subTextObjects[i].fallbackSourceMaterial = m_materialReferences[i].fallbackMaterial;\n                    }\n\n                }\n\n                int referenceCount = m_materialReferences[i].referenceCount;\n\n                // Check to make sure our buffers allocations can accommodate the required text elements.\n                if (m_textInfo.meshInfo[i].vertices == null || m_textInfo.meshInfo[i].vertices.Length < referenceCount * (!m_isVolumetricText ? 4 : 8))\n                {\n                    if (m_textInfo.meshInfo[i].vertices == null)\n                    {\n                        if (i == 0)\n                            m_textInfo.meshInfo[i] = new TMP_MeshInfo(m_mesh, referenceCount + 1, m_isVolumetricText);\n                        else\n                            m_textInfo.meshInfo[i] = new TMP_MeshInfo(m_subTextObjects[i].mesh, referenceCount + 1, m_isVolumetricText);\n                    }\n                    else\n                        m_textInfo.meshInfo[i].ResizeMeshInfo(referenceCount > 1024 ? referenceCount + 256 : Mathf.NextPowerOfTwo(referenceCount + 1), m_isVolumetricText);\n                }\n                else if (m_VertexBufferAutoSizeReduction && referenceCount > 0 && m_textInfo.meshInfo[i].vertices.Length - referenceCount * (!m_isVolumetricText ? 4 : 8) > 1024)\n                {\n                    // Resize vertex buffers if allocations are excessive.\n                    //Debug.Log(\"Reducing the size of the vertex buffers.\");\n                    m_textInfo.meshInfo[i].ResizeMeshInfo(referenceCount > 1024 ? referenceCount + 256 : Mathf.NextPowerOfTwo(referenceCount + 1), m_isVolumetricText);\n                }\n            }\n\n            //TMP_MaterialManager.CleanupFallbackMaterials();\n\n            // Clean up unused SubMeshes\n            for (int i = materialCount; i < m_subTextObjects.Length && m_subTextObjects[i] != null; i++)\n            {\n                if (i < m_textInfo.meshInfo.Length)\n                    m_textInfo.meshInfo[i].ClearUnusedVertices(0, true);\n\n                //m_subTextObjects[i].gameObject.SetActive(false);\n            }\n\n            return m_totalCharacterCount;\n        }\n\n\n        // Added to sort handle the potential issue with OnWillRenderObject() not getting called when objects are not visible by camera.\n        //void OnBecameInvisible()\n        //{\n        //    if (m_mesh != null)\n        //        m_mesh.bounds = new Bounds(transform.position, new Vector3(1000, 1000, 0));\n        //}\n\n\n        /// <summary>\n        /// Update the margin width and height\n        /// </summary>\n        public override void ComputeMarginSize()\n        {\n            if (this.rectTransform != null)\n            {\n                //Debug.Log(\"*** ComputeMarginSize() *** Current RectTransform's Width is \" + m_rectTransform.rect.width + \" and Height is \" + m_rectTransform.rect.height); // + \" and size delta is \"  + m_rectTransform.sizeDelta);\n\n                m_marginWidth = m_rectTransform.rect.width - m_margin.x - m_margin.z;\n                m_marginHeight = m_rectTransform.rect.height - m_margin.y - m_margin.w;\n\n                // Update the corners of the RectTransform\n                m_RectTransformCorners = GetTextContainerLocalCorners();\n            }\n        }\n\n\n        protected override void OnDidApplyAnimationProperties()\n        {\n            //Debug.Log(\"*** OnDidApplyAnimationProperties() ***\");\n            m_havePropertiesChanged = true;\n            isMaskUpdateRequired = true;\n\n            SetVerticesDirty();\n        }\n\n\n        protected override void OnTransformParentChanged()\n        {\n            //Debug.Log(\"*** OnTransformParentChanged() ***\");\n            //ComputeMarginSize();\n\n            SetVerticesDirty();\n            SetLayoutDirty();\n        }\n\n\n        protected override void OnRectTransformDimensionsChange()\n        {\n            //Debug.Log(\"*** OnRectTransformDimensionsChange() ***\");\n            ComputeMarginSize();\n\n            SetVerticesDirty();\n            SetLayoutDirty();\n        }\n\n\n        /// <summary>\n        /// Function used as a replacement for LateUpdate to check if the transform or scale of the text object has changed.\n        /// </summary>\n        internal override void InternalUpdate()\n        {\n            // We need to update the SDF scale or possibly regenerate the text object if lossy scale has changed.\n            if (m_havePropertiesChanged == false)\n            {\n                float lossyScaleY = m_rectTransform.lossyScale.y;\n                if (lossyScaleY != m_previousLossyScaleY && m_text != string.Empty && m_text != null)\n                {\n                    float scaleDelta = lossyScaleY / m_previousLossyScaleY;\n\n                    UpdateSDFScale(scaleDelta);\n\n                    m_previousLossyScaleY = lossyScaleY;\n                }\n            }\n\n            // Added to handle legacy animation mode.\n            if (m_isUsingLegacyAnimationComponent)\n            {\n                //if (m_havePropertiesChanged)\n                m_havePropertiesChanged = true;\n                OnPreRenderObject();\n            }\n        }\n\n\n        /// <summary>\n        /// Function called when the text needs to be updated.\n        /// </summary>\n        void OnPreRenderObject()\n        {\n            //Debug.Log(\"*** OnPreRenderObject() ***\");\n\n            if (!m_isAwake || (this.IsActive() == false && m_ignoreActiveState == false)) return;\n\n            // Debug Variables\n            loopCountA = 0;\n            //loopCountB = 0;\n            //loopCountC = 0;\n            //loopCountD = 0;\n            //loopCountE = 0;\n\n            if (m_havePropertiesChanged || m_isLayoutDirty)\n            {\n                //Debug.Log(\"Properties have changed!\"); // Assigned Material is:\" + m_sharedMaterial); // New Text is: \" + m_text + \".\");\n\n                if (isMaskUpdateRequired)\n                {\n                    UpdateMask();\n                    isMaskUpdateRequired = false;\n                }\n\n                // Update mesh padding if necessary.\n                if (checkPaddingRequired)\n                    UpdateMeshPadding();\n\n                // Reparse the text if the input has changed or text was truncated.\n                if (m_isInputParsingRequired || m_isTextTruncated)\n                    ParseInputText();\n\n                // Reset Font min / max used with Auto-sizing\n                if (m_enableAutoSizing)\n                    m_fontSize = Mathf.Clamp(m_fontSizeBase, m_fontSizeMin, m_fontSizeMax);\n\n                m_maxFontSize = m_fontSizeMax;\n                m_minFontSize = m_fontSizeMin;\n                m_lineSpacingDelta = 0;\n                m_charWidthAdjDelta = 0;\n                //m_recursiveCount = 0;\n\n                m_isCharacterWrappingEnabled = false;\n                m_isTextTruncated = false;\n\n                m_havePropertiesChanged = false;\n                m_isLayoutDirty = false;\n                m_ignoreActiveState = false;\n\n                GenerateTextMesh();\n            }\n        }\n\n\n        /// <summary>\n        /// This is the main function that is responsible for creating / displaying the text.\n        /// </summary>\n        protected override void GenerateTextMesh()\n        {\n            //Debug.Log(\"***** GenerateTextMesh() *****\"); // ***** Frame: \" + Time.frameCount); // + \". Point Size: \" + m_fontSize + \". Margins are (W) \" + m_marginWidth + \"  (H) \" + m_marginHeight); // \". Iteration Count: \" + loopCountA + \".  Min: \" + m_minFontSize + \"  Max: \" + m_maxFontSize + \"  Delta: \" + (m_maxFontSize - m_minFontSize) + \"  Font size is \" + m_fontSize); //called for Object with ID \" + GetInstanceID()); // Assigned Material is \" + m_uiRenderer.GetMaterial().name); // IncludeForMasking \" + this.m_IncludeForMasking); // and text is \" + m_text);\n\n            // Early exit if no font asset was assigned. This should not be needed since LiberationSans SDF will be assigned by default.\n            if (m_fontAsset == null || m_fontAsset.characterLookupTable == null)\n            {\n                Debug.LogWarning(\"Can't Generate Mesh! No Font Asset has been assigned to Object ID: \" + this.GetInstanceID());\n                return;\n            }\n\n            // Clear TextInfo\n            if (m_textInfo != null)\n                m_textInfo.Clear();\n\n            // Early exit if we don't have any Text to generate.\n            if (m_TextParsingBuffer == null || m_TextParsingBuffer.Length == 0 || m_TextParsingBuffer[0].unicode == (char)0)\n            {\n                // Clear mesh and upload changes to the mesh.\n                ClearMesh(true);\n\n                m_preferredWidth = 0;\n                m_preferredHeight = 0;\n\n                // Event indicating the text has been regenerated.\n                TMPro_EventManager.ON_TEXT_CHANGED(this);\n\n                return;\n            }\n\n            m_currentFontAsset = m_fontAsset;\n            m_currentMaterial = m_sharedMaterial;\n            m_currentMaterialIndex = 0;\n            m_materialReferenceStack.SetDefault(new MaterialReference(m_currentMaterialIndex, m_currentFontAsset, null, m_currentMaterial, m_padding));\n\n            m_currentSpriteAsset = m_spriteAsset;\n\n            // Stop  all Sprite Animations\n            if (m_spriteAnimator != null)\n                m_spriteAnimator.StopAllAnimations();\n\n            // Total character count is computed when the text is parsed.\n            int totalCharacterCount = m_totalCharacterCount;\n\n            // Calculate the scale of the font based on selected font size and sampling point size.\n            // baseScale is calculated using the font asset assigned to the text object.\n            float baseScale = m_fontScale = (m_fontSize / m_fontAsset.faceInfo.pointSize * m_fontAsset.faceInfo.scale * (m_isOrthographic ? 1 : 0.1f));\n            float currentElementScale = baseScale;\n            m_fontScaleMultiplier = 1;\n\n            m_currentFontSize = m_fontSize;\n            m_sizeStack.SetDefault(m_currentFontSize);\n            float fontSizeDelta = 0;\n\n            int charCode = 0; // Holds the character code of the currently being processed character.\n\n            m_FontStyleInternal = m_fontStyle; // Set the default style.\n            m_FontWeightInternal = (m_FontStyleInternal & FontStyles.Bold) == FontStyles.Bold ? FontWeight.Bold : m_fontWeight;\n            m_FontWeightStack.SetDefault(m_FontWeightInternal);\n            m_fontStyleStack.Clear();\n\n            m_lineJustification = m_textAlignment; // Sets the line justification mode to match editor alignment.\n            m_lineJustificationStack.SetDefault(m_lineJustification);\n\n            float padding = 0;\n            float style_padding = 0; // Extra padding required to accommodate Bold style.\n            float bold_xAdvance_multiplier = 1; // Used to increase spacing between character when style is bold.\n\n            m_baselineOffset = 0; // Used by subscript characters.\n            m_baselineOffsetStack.Clear();\n\n            // Underline\n            bool beginUnderline = false;\n            Vector3 underline_start = Vector3.zero; // Used to track where underline starts & ends.\n            Vector3 underline_end = Vector3.zero;\n\n            // Strike-through\n            bool beginStrikethrough = false;\n            Vector3 strikethrough_start = Vector3.zero;\n            Vector3 strikethrough_end = Vector3.zero;\n\n            // Text Highlight\n            bool beginHighlight = false;\n            Vector3 highlight_start = Vector3.zero;\n            Vector3 highlight_end = Vector3.zero;\n\n            m_fontColor32 = m_fontColor;\n            Color32 vertexColor;\n            m_htmlColor = m_fontColor32;\n            m_underlineColor = m_htmlColor;\n            m_strikethroughColor = m_htmlColor;\n\n            m_colorStack.SetDefault(m_htmlColor);\n            m_underlineColorStack.SetDefault(m_htmlColor);\n            m_strikethroughColorStack.SetDefault(m_htmlColor);\n            m_highlightColorStack.SetDefault(m_htmlColor);\n\n            m_colorGradientPreset = null;\n            m_colorGradientStack.SetDefault(null);\n\n            // Clear the Style stack.\n            //m_styleStack.Clear();\n\n            // Clear the Action stack.\n            m_actionStack.Clear();\n\n            m_isFXMatrixSet = false;\n\n            m_lineOffset = 0; // Amount of space between lines (font line spacing + m_linespacing).\n            m_lineHeight = TMP_Math.FLOAT_UNSET;\n            float lineGap = m_currentFontAsset.faceInfo.lineHeight - (m_currentFontAsset.faceInfo.ascentLine - m_currentFontAsset.faceInfo.descentLine);\n\n            m_cSpacing = 0; // Amount of space added between characters as a result of the use of the <cspace> tag.\n            m_monoSpacing = 0;\n            float lineOffsetDelta = 0;\n            m_xAdvance = 0; // Used to track the position of each character.\n\n            tag_LineIndent = 0; // Used for indentation of text.\n            tag_Indent = 0;\n            m_indentStack.SetDefault(0);\n            tag_NoParsing = false;\n            //m_isIgnoringAlignment = false;\n\n            m_characterCount = 0; // Total characters in the char[]\n\n            // Tracking of line information\n            m_firstCharacterOfLine = 0;\n            m_lastCharacterOfLine = 0;\n            m_firstVisibleCharacterOfLine = 0;\n            m_lastVisibleCharacterOfLine = 0;\n            m_maxLineAscender = k_LargeNegativeFloat;\n            m_maxLineDescender = k_LargePositiveFloat;\n            m_lineNumber = 0;\n            m_lineVisibleCharacterCount = 0;\n            bool isStartOfNewLine = true;\n            m_firstOverflowCharacterIndex = -1;\n\n            m_pageNumber = 0;\n            int pageToDisplay = Mathf.Clamp(m_pageToDisplay - 1, 0, m_textInfo.pageInfo.Length - 1);\n            int previousPageOverflowChar = 0;\n\n            int ellipsisIndex = 0;\n\n            Vector4 margins = m_margin;\n            float marginWidth = m_marginWidth;\n            float marginHeight = m_marginHeight;\n            m_marginLeft = 0;\n            m_marginRight = 0;\n            m_width = -1;\n            float width = marginWidth + 0.0001f - m_marginLeft - m_marginRight;\n\n            // Need to initialize these Extents structures\n            m_meshExtents.min = k_LargePositiveVector2;\n            m_meshExtents.max = k_LargeNegativeVector2;\n\n            // Initialize lineInfo\n            m_textInfo.ClearLineInfo();\n\n            // Tracking of the highest Ascender\n            m_maxCapHeight = 0;\n            m_maxAscender = 0;\n            m_maxDescender = 0;\n            float pageAscender = 0;\n            float maxVisibleDescender = 0;\n            bool isMaxVisibleDescenderSet = false;\n            m_isNewPage = false;\n\n            // Initialize struct to track states of word wrapping\n            bool isFirstWord = true;\n            m_isNonBreakingSpace = false;\n            bool ignoreNonBreakingSpace = false;\n            bool isLastBreakingChar = false;\n            float linebreakingWidth = 0;\n            int wrappingIndex = 0;\n\n            // Save character and line state before we begin layout.\n            SaveWordWrappingState(ref m_SavedWordWrapState, -1, -1);\n            SaveWordWrappingState(ref m_SavedLineState, -1, -1);\n\n            loopCountA += 1;\n\n            // Parse through Character buffer to read HTML tags and begin creating mesh.\n            for (int i = 0; i < m_TextParsingBuffer.Length && m_TextParsingBuffer[i].unicode != 0; i++)\n            {\n                charCode = m_TextParsingBuffer[i].unicode;\n\n                // Parse Rich Text Tag\n                #region Parse Rich Text Tag\n                if (m_isRichText && charCode == 60)  // '<'\n                {\n                    m_isParsingText = true;\n                    m_textElementType = TMP_TextElementType.Character;\n\n                    // Check if Tag is valid. If valid, skip to the end of the validated tag.\n                    if (ValidateHtmlTag(m_TextParsingBuffer, i + 1, out int endTagIndex))\n                    {\n                        i = endTagIndex;\n\n                        // Continue to next character or handle the sprite element\n                        if (m_textElementType == TMP_TextElementType.Character)\n                            continue;\n                    }\n                }\n                else\n                {\n                    m_textElementType = m_textInfo.characterInfo[m_characterCount].elementType;\n                    m_currentMaterialIndex = m_textInfo.characterInfo[m_characterCount].materialReferenceIndex;\n                    m_currentFontAsset = m_textInfo.characterInfo[m_characterCount].fontAsset;\n                }\n                #endregion End Parse Rich Text Tag\n\n                int prev_MaterialIndex = m_currentMaterialIndex;\n                bool isUsingAltTypeface = m_textInfo.characterInfo[m_characterCount].isUsingAlternateTypeface;\n\n                m_isParsingText = false;\n\n                // When using Linked text, mark character as ignored and skip to next character.\n                if (m_characterCount < m_firstVisibleCharacter)\n                {\n                    m_textInfo.characterInfo[m_characterCount].isVisible = false;\n                    m_textInfo.characterInfo[m_characterCount].character = (char)0x200B;\n                    m_characterCount += 1;\n                    continue;\n                }\n\n                // Handle Font Styles like LowerCase, UpperCase and SmallCaps.\n                #region Handling of LowerCase, UpperCase and SmallCaps Font Styles\n\n                float smallCapsMultiplier = 1.0f;\n\n                if (m_textElementType == TMP_TextElementType.Character)\n                {\n                    if ((m_FontStyleInternal & FontStyles.UpperCase) == FontStyles.UpperCase)\n                    {\n                        // If this character is lowercase, switch to uppercase.\n                        if (char.IsLower((char)charCode))\n                            charCode = char.ToUpper((char)charCode);\n\n                    }\n                    else if ((m_FontStyleInternal & FontStyles.LowerCase) == FontStyles.LowerCase)\n                    {\n                        // If this character is uppercase, switch to lowercase.\n                        if (char.IsUpper((char)charCode))\n                            charCode = char.ToLower((char)charCode);\n                    }\n                    else if ((m_FontStyleInternal & FontStyles.SmallCaps) == FontStyles.SmallCaps)\n                    {\n                        if (char.IsLower((char)charCode))\n                        {\n                            smallCapsMultiplier = 0.8f;\n                            charCode = char.ToUpper((char)charCode);\n                        }\n                    }\n                }\n                #endregion\n\n\n                // Look up Character Data from Dictionary and cache it.\n                #region Look up Character Data\n                if (m_textElementType == TMP_TextElementType.Sprite)\n                {\n                    // If a sprite is used as a fallback then get a reference to it and set the color to white.\n                    m_currentSpriteAsset = m_textInfo.characterInfo[m_characterCount].spriteAsset;\n                    m_spriteIndex = m_textInfo.characterInfo[m_characterCount].spriteIndex;\n\n                    TMP_SpriteCharacter sprite = m_currentSpriteAsset.spriteCharacterTable[m_spriteIndex];\n                    if (sprite == null) continue;\n\n                    // Sprites are assigned in the E000 Private Area + sprite Index\n                    if (charCode == 60)\n                        charCode = 57344 + m_spriteIndex;\n                    else\n                        m_spriteColor = s_colorWhite;\n\n                    // The sprite scale calculations are based on the font asset assigned to the text object.\n                    float spriteScale = (m_currentFontSize / m_currentFontAsset.faceInfo.pointSize * m_currentFontAsset.faceInfo.scale * (m_isOrthographic ? 1 : 0.1f));\n                    currentElementScale = m_currentFontAsset.faceInfo.ascentLine / sprite.glyph.metrics.height * sprite.scale * sprite.glyph.scale * spriteScale;\n\n                    m_cached_TextElement = sprite;\n\n                    m_textInfo.characterInfo[m_characterCount].elementType = TMP_TextElementType.Sprite;\n                    m_textInfo.characterInfo[m_characterCount].scale = spriteScale;\n                    m_textInfo.characterInfo[m_characterCount].spriteAsset = m_currentSpriteAsset;\n                    m_textInfo.characterInfo[m_characterCount].fontAsset = m_currentFontAsset;\n                    m_textInfo.characterInfo[m_characterCount].materialReferenceIndex = m_currentMaterialIndex;\n\n                    m_currentMaterialIndex = prev_MaterialIndex;\n\n                    padding = 0;\n                }\n                else if (m_textElementType == TMP_TextElementType.Character)\n                {\n                    m_cached_TextElement = m_textInfo.characterInfo[m_characterCount].textElement;\n                    if (m_cached_TextElement == null) continue;\n\n                    m_currentFontAsset = m_textInfo.characterInfo[m_characterCount].fontAsset;\n                    m_currentMaterial = m_textInfo.characterInfo[m_characterCount].material;\n                    m_currentMaterialIndex = m_textInfo.characterInfo[m_characterCount].materialReferenceIndex;\n\n                    // Re-calculate font scale as the font asset may have changed.\n                    m_fontScale = m_currentFontSize * smallCapsMultiplier / m_currentFontAsset.faceInfo.pointSize * m_currentFontAsset.faceInfo.scale * (m_isOrthographic ? 1 : 0.1f);\n\n                    currentElementScale = m_fontScale * m_fontScaleMultiplier * m_cached_TextElement.scale * m_cached_TextElement.glyph.scale;\n\n                    m_textInfo.characterInfo[m_characterCount].elementType = TMP_TextElementType.Character;\n                    m_textInfo.characterInfo[m_characterCount].scale = currentElementScale;\n\n                    padding = m_currentMaterialIndex == 0 ? m_padding : m_subTextObjects[m_currentMaterialIndex].padding;\n                }\n                #endregion\n\n\n                // Handle Soft Hyphen\n                #region Handle Soft Hyphen\n                float old_scale = currentElementScale;\n                if (charCode == 0xAD)\n                {\n                    currentElementScale = 0;\n                }\n                #endregion\n\n\n                // Store some of the text object's information\n                m_textInfo.characterInfo[m_characterCount].character = (char)charCode;\n                m_textInfo.characterInfo[m_characterCount].pointSize = m_currentFontSize;\n                m_textInfo.characterInfo[m_characterCount].color = m_htmlColor;\n                m_textInfo.characterInfo[m_characterCount].underlineColor = m_underlineColor;\n                m_textInfo.characterInfo[m_characterCount].strikethroughColor = m_strikethroughColor;\n                m_textInfo.characterInfo[m_characterCount].highlightColor = m_highlightColor;\n                m_textInfo.characterInfo[m_characterCount].style = m_FontStyleInternal;\n                //m_textInfo.characterInfo[m_characterCount].index = m_TextParsingBuffer[i].stringIndex;\n                //m_textInfo.characterInfo[m_characterCount].isIgnoringAlignment = m_isIgnoringAlignment;\n\n\n                // Handle Kerning if Enabled.\n                #region Handle Kerning\n                TMP_GlyphValueRecord glyphAdjustments = new TMP_GlyphValueRecord();\n                float characterSpacingAdjustment = m_characterSpacing;\n                if (m_enableKerning)\n                {\n                    if (m_characterCount < totalCharacterCount - 1)\n                    {\n                        uint firstGlyphIndex = m_cached_TextElement.glyphIndex;\n                        uint secondGlyphIndex = m_textInfo.characterInfo[m_characterCount + 1].textElement.glyphIndex;\n                        long key = new GlyphPairKey(firstGlyphIndex, secondGlyphIndex).key;\n\n                        if (m_currentFontAsset.fontFeatureTable.m_GlyphPairAdjustmentRecordLookupDictionary.TryGetValue(key, out TMP_GlyphPairAdjustmentRecord adjustmentPair))\n                        {\n                            glyphAdjustments = adjustmentPair.firstAdjustmentRecord.glyphValueRecord;\n                            characterSpacingAdjustment = (adjustmentPair.featureLookupFlags & FontFeatureLookupFlags.IgnoreSpacingAdjustments) == FontFeatureLookupFlags.IgnoreSpacingAdjustments ? 0 : characterSpacingAdjustment;\n                        }\n                    }\n\n                    if (m_characterCount >= 1)\n                    {\n                        uint firstGlyphIndex = m_textInfo.characterInfo[m_characterCount - 1].textElement.glyphIndex;\n                        uint secondGlyphIndex = m_cached_TextElement.glyphIndex;\n                        long key = new GlyphPairKey(firstGlyphIndex, secondGlyphIndex).key;\n\n                        if (m_currentFontAsset.fontFeatureTable.m_GlyphPairAdjustmentRecordLookupDictionary.TryGetValue(key, out TMP_GlyphPairAdjustmentRecord adjustmentPair))\n                        {\n                            glyphAdjustments += adjustmentPair.secondAdjustmentRecord.glyphValueRecord;\n                            characterSpacingAdjustment = (adjustmentPair.featureLookupFlags & FontFeatureLookupFlags.IgnoreSpacingAdjustments) == FontFeatureLookupFlags.IgnoreSpacingAdjustments ? 0 : characterSpacingAdjustment;\n                        }\n                    }\n                }\n                #endregion\n\n\n                // Initial Implementation for RTL support.\n                #region Handle Right-to-Left\n                if (m_isRightToLeft)\n                {\n                    m_xAdvance -= ((m_cached_TextElement.glyph.metrics.horizontalAdvance * bold_xAdvance_multiplier + characterSpacingAdjustment + m_wordSpacing + m_currentFontAsset.normalSpacingOffset) * currentElementScale + m_cSpacing) * (1 - m_charWidthAdjDelta);\n\n                    if (char.IsWhiteSpace((char)charCode) || charCode == 0x200B)\n                        m_xAdvance -= m_wordSpacing * currentElementScale;\n                }\n                #endregion\n\n\n                // Handle Mono Spacing\n                #region Handle Mono Spacing\n                float monoAdvance = 0;\n                if (m_monoSpacing != 0)\n                {\n                    monoAdvance = (m_monoSpacing / 2 - (m_cached_TextElement.glyph.metrics.width / 2 + m_cached_TextElement.glyph.metrics.horizontalBearingX) * currentElementScale) * (1 - m_charWidthAdjDelta);\n                    m_xAdvance += monoAdvance;\n                }\n                #endregion\n\n\n                // Set Padding based on selected font style\n                #region Handle Style Padding\n                if (m_textElementType == TMP_TextElementType.Character && !isUsingAltTypeface && (/*(m_fontStyle & FontStyles.Bold) == FontStyles.Bold ||*/ (m_FontStyleInternal & FontStyles.Bold) == FontStyles.Bold)) // Checks for any combination of Bold Style.\n                {\n                    if (m_currentMaterial.HasProperty(ShaderUtilities.ID_GradientScale))\n                    {\n                        float gradientScale = m_currentMaterial.GetFloat(ShaderUtilities.ID_GradientScale);\n                        style_padding = m_currentFontAsset.boldStyle / 4.0f * gradientScale * m_currentMaterial.GetFloat(ShaderUtilities.ID_ScaleRatio_A);\n\n                        // Clamp overall padding to Gradient Scale size.\n                        if (style_padding + padding > gradientScale)\n                            padding = gradientScale - style_padding;\n                    }\n                    else\n                        style_padding = 0;\n\n                    bold_xAdvance_multiplier = 1 + m_currentFontAsset.boldSpacing * 0.01f;\n                }\n                else\n                {\n                    if (m_currentMaterial.HasProperty(ShaderUtilities.ID_GradientScale))\n                    {\n                        float gradientScale = m_currentMaterial.GetFloat(ShaderUtilities.ID_GradientScale);\n                        style_padding = m_currentFontAsset.normalStyle / 4.0f * gradientScale * m_currentMaterial.GetFloat(ShaderUtilities.ID_ScaleRatio_A);\n\n                        // Clamp overall padding to Gradient Scale size.\n                        if (style_padding + padding > gradientScale)\n                            padding = gradientScale - style_padding;\n                    }\n                    else\n                        style_padding = 0;\n\n                    bold_xAdvance_multiplier = 1.0f;\n                }\n                #endregion Handle Style Padding\n\n\n                // Determine the position of the vertices of the Character or Sprite.\n                #region Calculate Vertices Position\n                float fontBaseLineOffset = m_currentFontAsset.faceInfo.baseline * m_fontScale * m_fontScaleMultiplier * m_currentFontAsset.faceInfo.scale;\n                Vector3 top_left;\n                top_left.x = m_xAdvance + ((m_cached_TextElement.glyph.metrics.horizontalBearingX - padding - style_padding + glyphAdjustments.xPlacement) * currentElementScale * (1 - m_charWidthAdjDelta));\n                top_left.y = fontBaseLineOffset + (m_cached_TextElement.glyph.metrics.horizontalBearingY + padding + glyphAdjustments.yPlacement) * currentElementScale - m_lineOffset + m_baselineOffset;\n                top_left.z = 0;\n\n                Vector3 bottom_left;\n                bottom_left.x = top_left.x;\n                bottom_left.y = top_left.y - ((m_cached_TextElement.glyph.metrics.height + padding * 2) * currentElementScale);\n                bottom_left.z = 0;\n\n                Vector3 top_right;\n                top_right.x = bottom_left.x + ((m_cached_TextElement.glyph.metrics.width + padding * 2 + style_padding * 2) * currentElementScale * (1 - m_charWidthAdjDelta));\n                top_right.y = top_left.y;\n                top_right.z = 0;\n\n                Vector3 bottom_right;\n                bottom_right.x = top_right.x;\n                bottom_right.y = bottom_left.y;\n                bottom_right.z = 0;\n                #endregion\n\n\n                // Check if we need to Shear the rectangles for Italic styles\n                #region Handle Italic & Shearing\n                if (m_textElementType == TMP_TextElementType.Character && !isUsingAltTypeface && (/*(m_fontStyle & FontStyles.Italic) == FontStyles.Italic ||*/ (m_FontStyleInternal & FontStyles.Italic) == FontStyles.Italic))\n                {\n                    // Shift Top vertices forward by half (Shear Value * height of character) and Bottom vertices back by same amount. \n                    float shear_value = m_currentFontAsset.italicStyle * 0.01f;\n                    Vector3 topShear = new Vector3(shear_value * ((m_cached_TextElement.glyph.metrics.horizontalBearingY + padding + style_padding) * currentElementScale), 0, 0);\n                    Vector3 bottomShear = new Vector3(shear_value * (((m_cached_TextElement.glyph.metrics.horizontalBearingY - m_cached_TextElement.glyph.metrics.height - padding - style_padding)) * currentElementScale), 0, 0);\n\n                    top_left = top_left + topShear;\n                    bottom_left = bottom_left + bottomShear;\n                    top_right = top_right + topShear;\n                    bottom_right = bottom_right + bottomShear;\n                }\n                #endregion Handle Italics & Shearing\n\n\n                // Handle Character Rotation\n                #region Handle Character Rotation\n                if (m_isFXMatrixSet)\n                {\n                    // Apply scale matrix when simulating Condensed text.\n                    if (m_FXMatrix.lossyScale.x != 1)\n                    {\n                        //top_left = m_FXMatrix.MultiplyPoint3x4(top_left);\n                        //bottom_left = m_FXMatrix.MultiplyPoint3x4(bottom_left);\n                        //top_right = m_FXMatrix.MultiplyPoint3x4(top_right);\n                        //bottom_right = m_FXMatrix.MultiplyPoint3x4(bottom_right);\n                    }\n\n                    Vector3 positionOffset = (top_right + bottom_left) / 2;\n\n                    top_left = m_FXMatrix.MultiplyPoint3x4(top_left - positionOffset) + positionOffset;\n                    bottom_left = m_FXMatrix.MultiplyPoint3x4(bottom_left - positionOffset) + positionOffset;\n                    top_right = m_FXMatrix.MultiplyPoint3x4(top_right - positionOffset) + positionOffset;\n                    bottom_right = m_FXMatrix.MultiplyPoint3x4(bottom_right - positionOffset) + positionOffset;\n                }\n                #endregion\n\n\n                // Store vertex information for the character or sprite.\n                m_textInfo.characterInfo[m_characterCount].bottomLeft = bottom_left;\n                m_textInfo.characterInfo[m_characterCount].topLeft = top_left;\n                m_textInfo.characterInfo[m_characterCount].topRight = top_right;\n                m_textInfo.characterInfo[m_characterCount].bottomRight = bottom_right;\n\n                m_textInfo.characterInfo[m_characterCount].origin = m_xAdvance;\n                m_textInfo.characterInfo[m_characterCount].baseLine = fontBaseLineOffset - m_lineOffset + m_baselineOffset;\n                m_textInfo.characterInfo[m_characterCount].aspectRatio = (top_right.x - bottom_left.x) / (top_left.y - bottom_left.y);\n\n\n                // Compute and save text element Ascender and maximum line Ascender.\n                float elementAscender = m_currentFontAsset.faceInfo.ascentLine * (m_textElementType == TMP_TextElementType.Character ? currentElementScale / smallCapsMultiplier : m_textInfo.characterInfo[m_characterCount].scale) + m_baselineOffset;\n                m_textInfo.characterInfo[m_characterCount].ascender = elementAscender - m_lineOffset;\n                m_maxLineAscender = elementAscender > m_maxLineAscender ? elementAscender : m_maxLineAscender;\n\n                // Compute and save text element Descender and maximum line Descender.\n                float elementDescender = m_currentFontAsset.faceInfo.descentLine * (m_textElementType == TMP_TextElementType.Character ? currentElementScale / smallCapsMultiplier : m_textInfo.characterInfo[m_characterCount].scale) + m_baselineOffset;\n                float elementDescenderII = m_textInfo.characterInfo[m_characterCount].descender = elementDescender - m_lineOffset;\n                m_maxLineDescender = elementDescender < m_maxLineDescender ? elementDescender : m_maxLineDescender;\n\n                // Adjust maxLineAscender and maxLineDescender if style is superscript or subscript\n                if ((m_FontStyleInternal & FontStyles.Subscript) == FontStyles.Subscript || (m_FontStyleInternal & FontStyles.Superscript) == FontStyles.Superscript)\n                {\n                    float baseAscender = (elementAscender - m_baselineOffset) / m_currentFontAsset.faceInfo.subscriptSize;\n                    elementAscender = m_maxLineAscender;\n                    m_maxLineAscender = baseAscender > m_maxLineAscender ? baseAscender : m_maxLineAscender;\n\n                    float baseDescender = (elementDescender - m_baselineOffset) / m_currentFontAsset.faceInfo.subscriptSize;\n                    elementDescender = m_maxLineDescender;\n                    m_maxLineDescender = baseDescender < m_maxLineDescender ? baseDescender : m_maxLineDescender;\n                }\n\n                if (m_lineNumber == 0 || m_isNewPage)\n                {\n                    m_maxAscender = m_maxAscender > elementAscender ? m_maxAscender : elementAscender;\n                    m_maxCapHeight = Mathf.Max(m_maxCapHeight, m_currentFontAsset.faceInfo.capLine * currentElementScale / smallCapsMultiplier);\n                }\n                if (m_lineOffset == 0) pageAscender = pageAscender > elementAscender ? pageAscender : elementAscender;\n\n\n                // Set Characters to not visible by default.\n                m_textInfo.characterInfo[m_characterCount].isVisible = false;\n\n                // Setup Mesh for visible text elements. ie. not a SPACE / LINEFEED / CARRIAGE RETURN.\n                #region Handle Visible Characters\n                if (charCode == 9 || charCode == 0xA0 || charCode == 0x2007 || (!char.IsWhiteSpace((char)charCode) && charCode != 0x200B) || m_textElementType == TMP_TextElementType.Sprite)\n                {\n                    m_textInfo.characterInfo[m_characterCount].isVisible = true;\n\n                    #region Experimental Margin Shaper\n                    //Vector2 shapedMargins;\n                    //if (marginShaper)\n                    //{\n                    //    shapedMargins = m_marginShaper.GetShapedMargins(m_textInfo.characterInfo[m_characterCount].baseLine);\n                    //    if (shapedMargins.x < margins.x)\n                    //    {\n                    //        shapedMargins.x = m_marginLeft;\n                    //    }\n                    //    else\n                    //    {\n                    //        shapedMargins.x += m_marginLeft - margins.x;\n                    //    }\n                    //    if (shapedMargins.y < margins.z)\n                    //    {\n                    //        shapedMargins.y = m_marginRight;\n                    //    }\n                    //    else\n                    //    {\n                    //        shapedMargins.y += m_marginRight - margins.z;\n                    //    }\n                    //}\n                    //else\n                    //{\n                    //    shapedMargins.x = m_marginLeft;\n                    //    shapedMargins.y = m_marginRight;\n                    //}\n                    //width = marginWidth + 0.0001f - shapedMargins.x - shapedMargins.y;\n                    //if (m_width != -1 && m_width < width)\n                    //{\n                    //    width = m_width;\n                    //}\n                    //m_textInfo.lineInfo[m_lineNumber].marginLeft = shapedMargins.x;\n                    #endregion\n\n                    width = m_width != -1 ? Mathf.Min(marginWidth + 0.0001f - m_marginLeft - m_marginRight, m_width) : marginWidth + 0.0001f - m_marginLeft - m_marginRight;\n                    m_textInfo.lineInfo[m_lineNumber].marginLeft = m_marginLeft;\n\n                    bool isJustifiedOrFlush = ((_HorizontalAlignmentOptions)m_lineJustification & _HorizontalAlignmentOptions.Flush) == _HorizontalAlignmentOptions.Flush || ((_HorizontalAlignmentOptions)m_lineJustification & _HorizontalAlignmentOptions.Justified) == _HorizontalAlignmentOptions.Justified;\n\n                    // Calculate the line breaking width of the text.\n                    linebreakingWidth = Mathf.Abs(m_xAdvance) + (!m_isRightToLeft ? m_cached_TextElement.glyph.metrics.horizontalAdvance : 0) * (1 - m_charWidthAdjDelta) * (charCode != 0xAD ? currentElementScale : old_scale);\n\n                    // Check if Character exceeds the width of the Text Container\n                    #region Handle Line Breaking, Text Auto-Sizing and Horizontal Overflow\n                    if (linebreakingWidth > width * (isJustifiedOrFlush ? 1.05f : 1.0f))\n                    {\n                        ellipsisIndex = m_characterCount - 1; // Last safely rendered character\n\n                        // Word Wrapping\n                        #region Handle Word Wrapping\n                        if (enableWordWrapping && m_characterCount != m_firstCharacterOfLine)\n                        {\n                            // Check if word wrapping is still possible\n                            #region Line Breaking Check\n                            if (wrappingIndex == m_SavedWordWrapState.previous_WordBreak || isFirstWord)\n                            {\n                                // Word wrapping is no longer possible. Shrink size of text if auto-sizing is enabled.\n                                if (m_enableAutoSizing && m_fontSize > m_fontSizeMin)\n                                {\n                                    // Handle Character Width Adjustments\n                                    #region Character Width Adjustments\n                                    if (m_charWidthAdjDelta < m_charWidthMaxAdj / 100)\n                                    {\n                                        loopCountA = 0;\n                                        m_charWidthAdjDelta += 0.01f;\n                                        GenerateTextMesh();\n                                        return;\n                                    }\n                                    #endregion\n\n                                    // Adjust Point Size\n                                    m_maxFontSize = m_fontSize;\n\n                                    m_fontSize -= Mathf.Max((m_fontSize - m_minFontSize) / 2, 0.05f);\n                                    m_fontSize = (int)(Mathf.Max(m_fontSize, m_fontSizeMin) * 20 + 0.5f) / 20f;\n\n                                    if (loopCountA > 20) return; // Added to debug\n                                    GenerateTextMesh();\n                                    return;\n                                }\n\n                                // Word wrapping is no longer possible, now breaking up individual words.\n                                if (m_isCharacterWrappingEnabled == false)\n                                {\n                                    if (ignoreNonBreakingSpace == false)\n                                        ignoreNonBreakingSpace = true;\n                                    else\n                                        m_isCharacterWrappingEnabled = true;\n                                }\n                                else\n                                    isLastBreakingChar = true;\n\n                                //m_recursiveCount += 1;\n                                //if (m_recursiveCount > 20)\n                                //{\n                                //    Debug.Log(\"Recursive count exceeded!\");\n                                //    continue;\n                                //}\n                            }\n                            #endregion\n\n                            // Restore to previously stored state of last valid (space character or linefeed)\n                            i = RestoreWordWrappingState(ref m_SavedWordWrapState);\n                            wrappingIndex = i;  // Used to detect when line length can no longer be reduced.\n\n                            // Handling for Soft Hyphen\n                            if (m_TextParsingBuffer[i].unicode == 0xAD) // && !m_isCharacterWrappingEnabled) // && ellipsisIndex != i && !m_isCharacterWrappingEnabled)\n                            {\n                                m_isTextTruncated = true;\n                                m_TextParsingBuffer[i].unicode = 0x2D;\n                                GenerateTextMesh();\n                                return;\n                            }\n\n                            //Debug.Log(\"Last Visible Character of line # \" + m_lineNumber + \" is [\" + m_textInfo.characterInfo[m_lastVisibleCharacterOfLine].character + \" Character Count: \" + m_characterCount + \" Last visible: \" + m_lastVisibleCharacterOfLine);\n\n                            // Check if Line Spacing of previous line needs to be adjusted.\n                            if (m_lineNumber > 0 && !TMP_Math.Approximately(m_maxLineAscender, m_startOfLineAscender) && m_lineHeight == TMP_Math.FLOAT_UNSET && !m_isNewPage)\n                            {\n                                //Debug.Log(\"(Line Break - Adjusting Line Spacing on line #\" + m_lineNumber);\n                                float offsetDelta = m_maxLineAscender - m_startOfLineAscender;\n                                AdjustLineOffset(m_firstCharacterOfLine, m_characterCount, offsetDelta);\n                                m_lineOffset += offsetDelta;\n                                m_SavedWordWrapState.lineOffset = m_lineOffset;\n                                m_SavedWordWrapState.previousLineAscender = m_maxLineAscender;\n\n                                // TODO - Add check for character exceeding vertical bounds\n                            }\n                            m_isNewPage = false;\n\n                            // Calculate lineAscender & make sure if last character is superscript or subscript that we check that as well.\n                            float lineAscender = m_maxLineAscender - m_lineOffset;\n                            float lineDescender = m_maxLineDescender - m_lineOffset;\n\n\n                            // Update maxDescender and maxVisibleDescender\n                            m_maxDescender = m_maxDescender < lineDescender ? m_maxDescender : lineDescender;\n                            if (!isMaxVisibleDescenderSet)\n                                maxVisibleDescender = m_maxDescender;\n\n                            if (m_useMaxVisibleDescender && (m_characterCount >= m_maxVisibleCharacters || m_lineNumber >= m_maxVisibleLines))\n                                isMaxVisibleDescenderSet = true;\n\n                            // Track & Store lineInfo for the new line\n                            m_textInfo.lineInfo[m_lineNumber].firstCharacterIndex = m_firstCharacterOfLine;\n                            m_textInfo.lineInfo[m_lineNumber].firstVisibleCharacterIndex = m_firstVisibleCharacterOfLine = m_firstCharacterOfLine > m_firstVisibleCharacterOfLine ? m_firstCharacterOfLine : m_firstVisibleCharacterOfLine;\n                            m_textInfo.lineInfo[m_lineNumber].lastCharacterIndex = m_lastCharacterOfLine = m_characterCount - 1 > 0 ? m_characterCount - 1 : 0;\n                            m_textInfo.lineInfo[m_lineNumber].lastVisibleCharacterIndex = m_lastVisibleCharacterOfLine = m_lastVisibleCharacterOfLine < m_firstVisibleCharacterOfLine ? m_firstVisibleCharacterOfLine : m_lastVisibleCharacterOfLine;\n\n                            m_textInfo.lineInfo[m_lineNumber].characterCount = m_textInfo.lineInfo[m_lineNumber].lastCharacterIndex - m_textInfo.lineInfo[m_lineNumber].firstCharacterIndex + 1;\n                            m_textInfo.lineInfo[m_lineNumber].visibleCharacterCount = m_lineVisibleCharacterCount;\n                            m_textInfo.lineInfo[m_lineNumber].lineExtents.min = new Vector2(m_textInfo.characterInfo[m_firstVisibleCharacterOfLine].bottomLeft.x, lineDescender);\n                            m_textInfo.lineInfo[m_lineNumber].lineExtents.max = new Vector2(m_textInfo.characterInfo[m_lastVisibleCharacterOfLine].topRight.x, lineAscender);\n                            m_textInfo.lineInfo[m_lineNumber].length = m_textInfo.lineInfo[m_lineNumber].lineExtents.max.x;\n                            m_textInfo.lineInfo[m_lineNumber].width = width;\n\n                            //m_textInfo.lineInfo[m_lineNumber].alignment = m_lineJustification;\n\n                            m_textInfo.lineInfo[m_lineNumber].maxAdvance = m_textInfo.characterInfo[m_lastVisibleCharacterOfLine].xAdvance - (characterSpacingAdjustment + m_currentFontAsset.normalSpacingOffset) * currentElementScale - m_cSpacing;\n\n                            m_textInfo.lineInfo[m_lineNumber].baseline = 0 - m_lineOffset;\n                            m_textInfo.lineInfo[m_lineNumber].ascender = lineAscender;\n                            m_textInfo.lineInfo[m_lineNumber].descender = lineDescender;\n                            m_textInfo.lineInfo[m_lineNumber].lineHeight = lineAscender - lineDescender + lineGap * baseScale;\n\n                            m_firstCharacterOfLine = m_characterCount; // Store first character of the next line.\n                            m_lineVisibleCharacterCount = 0;\n\n                            // Store the state of the line before starting on the new line.\n                            SaveWordWrappingState(ref m_SavedLineState, i, m_characterCount - 1);\n\n                            m_lineNumber += 1;\n                            isStartOfNewLine = true;\n                            isFirstWord = true;\n\n                            // Check to make sure Array is large enough to hold a new line.\n                            if (m_lineNumber >= m_textInfo.lineInfo.Length)\n                                ResizeLineExtents(m_lineNumber);\n\n                            // Apply Line Spacing based on scale of the last character of the line.\n                            if (m_lineHeight == TMP_Math.FLOAT_UNSET)\n                            {\n                                float ascender = m_textInfo.characterInfo[m_characterCount].ascender - m_textInfo.characterInfo[m_characterCount].baseLine;\n                                lineOffsetDelta = 0 - m_maxLineDescender + ascender + (lineGap + m_lineSpacing + m_lineSpacingDelta) * baseScale;\n                                m_lineOffset += lineOffsetDelta;\n\n                                m_startOfLineAscender = ascender;\n                            }\n                            else\n                                m_lineOffset += m_lineHeight + m_lineSpacing * baseScale;\n\n                            m_maxLineAscender = k_LargeNegativeFloat;\n                            m_maxLineDescender = k_LargePositiveFloat;\n\n                            m_xAdvance = 0 + tag_Indent;\n\n                            continue;\n                        }\n                        #endregion End Word Wrapping\n\n\n                        // Text Auto-Sizing (text exceeding Width of container. \n                        #region Handle Text Auto-Sizing\n                        if (m_enableAutoSizing && m_fontSize > m_fontSizeMin)\n                        {\n                            // Handle Character Width Adjustments\n                            #region Character Width Adjustments\n                            if (m_charWidthAdjDelta < m_charWidthMaxAdj / 100)\n                            {\n                                loopCountA = 0;\n                                m_charWidthAdjDelta += 0.01f;\n                                GenerateTextMesh();\n                                return;\n                            }\n                            #endregion\n\n                            // Adjust Point Size\n                            m_maxFontSize = m_fontSize;\n\n                            m_fontSize -= Mathf.Max((m_fontSize - m_minFontSize) / 2, 0.05f);\n                            m_fontSize = (int)(Mathf.Max(m_fontSize, m_fontSizeMin) * 20 + 0.5f) / 20f;\n\n                            //m_recursiveCount = 0;\n                            if (loopCountA > 20) return; // Added to debug \n                            GenerateTextMesh();\n                            return;\n                        }\n                        #endregion End Text Auto-Sizing\n\n\n                        // Handle Text Overflow\n                        #region Handle Text Overflow\n                        switch (m_overflowMode)\n                        {\n                            case TextOverflowModes.Overflow:\n                                if (m_isMaskingEnabled)\n                                    DisableMasking();\n\n                                break;\n                            case TextOverflowModes.Ellipsis:\n                                if (m_isMaskingEnabled)\n                                    DisableMasking();\n\n                                m_isTextTruncated = true;\n\n                                if (m_characterCount < 1)\n                                {\n                                    m_textInfo.characterInfo[m_characterCount].isVisible = false;\n                                    //m_visibleCharacterCount = 0;\n                                    break;\n                                }\n\n                                m_TextParsingBuffer[i - 1].unicode = 8230;\n                                m_TextParsingBuffer[i].unicode = (char)0;\n\n                                if (m_cached_Ellipsis_Character != null)\n                                {\n                                    m_textInfo.characterInfo[ellipsisIndex].character = (char)8230;\n                                    m_textInfo.characterInfo[ellipsisIndex].textElement = m_cached_Ellipsis_Character;\n                                    m_textInfo.characterInfo[ellipsisIndex].fontAsset = m_materialReferences[0].fontAsset;\n                                    m_textInfo.characterInfo[ellipsisIndex].material = m_materialReferences[0].material;\n                                    m_textInfo.characterInfo[ellipsisIndex].materialReferenceIndex = 0;\n                                }\n                                else\n                                {\n                                    Debug.LogWarning(\"Unable to use Ellipsis character since it wasn't found in the current Font Asset [\" + m_fontAsset.name + \"]. Consider regenerating this font asset to include the Ellipsis character (u+2026).\\nNote: Warnings can be disabled in the TMP Settings file.\", this);\n                                }\n\n                                m_totalCharacterCount = ellipsisIndex + 1;\n\n                                GenerateTextMesh();\n                                return;\n                            //case TextOverflowModes.Masking:\n                            //    if (!m_isMaskingEnabled)\n                            //        EnableMasking();\n                            //    break;\n                            //case TextOverflowModes.ScrollRect:\n                            //    if (!m_isMaskingEnabled)\n                            //        EnableMasking();\n                            //    break;\n                            case TextOverflowModes.Truncate:\n                                if (m_isMaskingEnabled)\n                                    DisableMasking();\n\n                                m_textInfo.characterInfo[m_characterCount].isVisible = false;\n                                break;\n                            case TextOverflowModes.Linked:\n                                //m_textInfo.characterInfo[m_characterCount].isVisible = false;\n\n                                //if (m_linkedTextComponent != null)\n                                //{\n                                //    m_linkedTextComponent.text = text;\n                                //    m_linkedTextComponent.firstVisibleCharacter = m_characterCount;\n                                //    m_linkedTextComponent.ForceMeshUpdate();\n                                //}\n                                break;\n                        }\n                        #endregion End Text Overflow\n\n                    }\n                    #endregion End Check for Characters Exceeding Width of Text Container\n\n\n                    // Special handling of characters that are not ignored at the end of a line.\n                    if (charCode == 9 || charCode == 0xA0 || charCode == 0x2007)\n                    {\n                        m_textInfo.characterInfo[m_characterCount].isVisible = false;\n                        m_lastVisibleCharacterOfLine = m_characterCount;\n                        m_textInfo.lineInfo[m_lineNumber].spaceCount += 1;\n                        m_textInfo.spaceCount += 1;\n\n                        if (charCode == 0xA0)\n                            m_textInfo.lineInfo[m_lineNumber].controlCharacterCount += 1;\n                    }\n                    else\n                    {\n                        // Determine Vertex Color\n                        if (m_overrideHtmlColors)\n                            vertexColor = m_fontColor32;\n                        else\n                            vertexColor = m_htmlColor;\n\n                        // Store Character & Sprite Vertex Information\n                        if (m_textElementType == TMP_TextElementType.Character)\n                        {\n                            // Save Character Vertex Data\n                            SaveGlyphVertexInfo(padding, style_padding, vertexColor);\n                        }\n                        else if (m_textElementType == TMP_TextElementType.Sprite)\n                        {\n                            SaveSpriteVertexInfo(vertexColor);\n                        }\n                    }\n\n\n                    // Increase visible count for Characters.\n                    if (m_textInfo.characterInfo[m_characterCount].isVisible && charCode != 0xAD)\n                    {\n                        if (isStartOfNewLine) { isStartOfNewLine = false; m_firstVisibleCharacterOfLine = m_characterCount; }\n\n                        m_lineVisibleCharacterCount += 1;\n                        m_lastVisibleCharacterOfLine = m_characterCount;\n                    }\n                }\n                else\n                {   // This is a Space, Tab, LineFeed or Carriage Return\n\n                    // Track # of spaces per line which is used for line justification.\n                    if ((charCode == 10 || char.IsSeparator((char)charCode)) && charCode != 0xAD && charCode != 0x200B && charCode != 0x2060)\n                    {\n                        m_textInfo.lineInfo[m_lineNumber].spaceCount += 1;\n                        m_textInfo.spaceCount += 1;\n                    }\n                }\n                #endregion Handle Visible Characters\n\n\n                // Check if Line Spacing of previous line needs to be adjusted.\n                #region Adjust Line Spacing\n                if (m_lineNumber > 0 && !TMP_Math.Approximately(m_maxLineAscender, m_startOfLineAscender) && m_lineHeight == TMP_Math.FLOAT_UNSET && !m_isNewPage)\n                {\n                    //Debug.Log(\"Inline - Adjusting Line Spacing on line #\" + m_lineNumber);\n                    //float gap = 0; // Compute gap.\n\n                    float offsetDelta = m_maxLineAscender - m_startOfLineAscender;\n                    AdjustLineOffset(m_firstCharacterOfLine, m_characterCount, offsetDelta);\n                    elementDescenderII -= offsetDelta;\n                    m_lineOffset += offsetDelta;\n\n                    m_startOfLineAscender += offsetDelta;\n                    m_SavedWordWrapState.lineOffset = m_lineOffset;\n                    m_SavedWordWrapState.previousLineAscender = m_startOfLineAscender;\n                }\n                #endregion\n\n\n                // Store Rectangle positions for each Character.\n                #region Store Character Data\n                m_textInfo.characterInfo[m_characterCount].lineNumber = m_lineNumber;\n                m_textInfo.characterInfo[m_characterCount].pageNumber = m_pageNumber;\n\n                if (charCode != 10 && charCode != 13 && charCode != 8230 || m_textInfo.lineInfo[m_lineNumber].characterCount == 1)\n                    m_textInfo.lineInfo[m_lineNumber].alignment = m_lineJustification;\n                #endregion Store Character Data\n\n\n                // Check if text Exceeds the vertical bounds of the margin area.\n                #region Check Vertical Bounds & Auto-Sizing\n                if (m_maxAscender - elementDescenderII > marginHeight + 0.0001f)\n                {\n                    // Handle Line spacing adjustments\n                    #region Line Spacing Adjustments\n                    if (m_enableAutoSizing && m_lineSpacingDelta > m_lineSpacingMax && m_lineNumber > 0)\n                    {\n                        loopCountA = 0;\n\n                        m_lineSpacingDelta -= 1;\n                        GenerateTextMesh();\n                        return;\n                    }\n                    #endregion\n\n\n                    // Handle Text Auto-sizing resulting from text exceeding vertical bounds.\n                    #region Text Auto-Sizing (Text greater than vertical bounds)\n                    if (m_enableAutoSizing && m_fontSize > m_fontSizeMin)\n                    {\n                        m_maxFontSize = m_fontSize;\n\n                        m_fontSize -= Mathf.Max((m_fontSize - m_minFontSize) / 2, 0.05f);\n                        m_fontSize = (int)(Mathf.Max(m_fontSize, m_fontSizeMin) * 20 + 0.5f) / 20f;\n\n                        //m_recursiveCount = 0;\n                        if (loopCountA > 20) return; // Added to debug \n                        GenerateTextMesh();\n                        return;\n                    }\n                    #endregion Text Auto-Sizing\n\n                    // Set isTextOverflowing and firstOverflowCharacterIndex\n                    if (m_firstOverflowCharacterIndex == -1)\n                        m_firstOverflowCharacterIndex = m_characterCount;\n\n                    // Handle Text Overflow\n                    #region Text Overflow\n                    switch (m_overflowMode)\n                    {\n                        case TextOverflowModes.Overflow:\n                            if (m_isMaskingEnabled)\n                                DisableMasking();\n\n                            break;\n                        case TextOverflowModes.Ellipsis:\n                            if (m_isMaskingEnabled)\n                                DisableMasking();\n\n                            if (m_lineNumber > 0)\n                            {\n                                m_TextParsingBuffer[m_textInfo.characterInfo[ellipsisIndex].index].unicode = 8230;\n                                m_TextParsingBuffer[m_textInfo.characterInfo[ellipsisIndex].index + 1].unicode = (char)0;\n\n                                if (m_cached_Ellipsis_Character != null)\n                                {\n                                    m_textInfo.characterInfo[ellipsisIndex].character = (char)8230;\n                                    m_textInfo.characterInfo[ellipsisIndex].textElement = m_cached_Ellipsis_Character;\n                                    m_textInfo.characterInfo[ellipsisIndex].fontAsset = m_materialReferences[0].fontAsset;\n                                    m_textInfo.characterInfo[ellipsisIndex].material = m_materialReferences[0].material;\n                                    m_textInfo.characterInfo[ellipsisIndex].materialReferenceIndex = 0;\n                                }\n                                else\n                                {\n                                    Debug.LogWarning(\"Unable to use Ellipsis character since it wasn't found in the current Font Asset [\" + m_fontAsset.name + \"]. Consider regenerating this font asset to include the Ellipsis character (u+2026).\\nNote: Warnings can be disabled in the TMP Settings file.\", this);\n                                }\n\n                                m_totalCharacterCount = ellipsisIndex + 1;\n\n                                GenerateTextMesh();\n                                m_isTextTruncated = true;\n                                return;\n                            }\n                            else\n                            {\n                                ClearMesh(false);\n                                return;\n                            }\n                        //case TextOverflowModes.Masking:\n                        //    if (!m_isMaskingEnabled)\n                        //        EnableMasking();\n                        //    break;\n                        //case TextOverflowModes.ScrollRect:\n                        //    if (!m_isMaskingEnabled)\n                        //        EnableMasking();\n                        //    break;\n                        case TextOverflowModes.Truncate:\n                            if (m_isMaskingEnabled)\n                                DisableMasking();\n\n                            // TODO : Optimize \n                            if (m_lineNumber > 0)\n                            {\n                                m_TextParsingBuffer[m_textInfo.characterInfo[ellipsisIndex].index + 1].unicode = (char)0;\n\n                                m_totalCharacterCount = ellipsisIndex + 1;\n\n                                GenerateTextMesh();\n                                m_isTextTruncated = true;\n                                return;\n                            }\n                            else\n                            {\n                                ClearMesh(false);\n                                return;\n                            }\n                        case TextOverflowModes.Page:\n                            if (m_isMaskingEnabled)\n                                DisableMasking();\n\n                            // Ignore Page Break, Linefeed or carriage return\n                            if (charCode == 13 || charCode == 10)\n                                break;\n\n                            // Return if the first character doesn't fit.\n                            if (i == 0)\n                            {\n                                ClearMesh();\n                                return;\n                            }\n                            else if (previousPageOverflowChar == i)\n                            {\n                                m_TextParsingBuffer[i].unicode = 0;\n                                m_isTextTruncated = true;\n                            }\n\n                            previousPageOverflowChar = i;\n\n                            // Go back to previous line and re-layout \n                            i = RestoreWordWrappingState(ref m_SavedLineState);\n\n                            m_isNewPage = true;\n                            m_xAdvance = 0 + tag_Indent;\n                            m_lineOffset = 0;\n                            m_maxAscender = 0;\n                            pageAscender = 0;\n                            m_lineNumber += 1;\n                            m_pageNumber += 1;\n                            continue;\n                        case TextOverflowModes.Linked:\n                            if (m_linkedTextComponent != null)\n                            {\n                                m_linkedTextComponent.text = text;\n                                m_linkedTextComponent.firstVisibleCharacter = m_characterCount;\n                                m_linkedTextComponent.ForceMeshUpdate();\n                            }\n\n                            // Truncate remaining text\n                            if (m_lineNumber > 0)\n                            {\n                                m_TextParsingBuffer[i].unicode = (char)0;\n\n                                m_totalCharacterCount = m_characterCount;\n\n                                // TODO : Optimize as we should be able to end the layout phase here without having to do another pass.\n                                GenerateTextMesh();\n                                m_isTextTruncated = true;\n                                return;\n                            }\n                            else\n                            {\n                                ClearMesh(true);\n                                return;\n                            }\n                    }\n                    #endregion End Text Overflow\n\n                }\n                #endregion Check Vertical Bounds\n\n\n                // Handle xAdvance & Tabulation Stops. Tab stops at every 25% of Font Size.\n                #region XAdvance, Tabulation & Stops\n                if (charCode == 9)\n                {\n                    float tabSize = m_currentFontAsset.faceInfo.tabWidth * m_currentFontAsset.tabSize * currentElementScale;\n                    float tabs = Mathf.Ceil(m_xAdvance / tabSize) * tabSize;\n                    m_xAdvance = tabs > m_xAdvance ? tabs : m_xAdvance + tabSize;\n                }\n                else if (m_monoSpacing != 0)\n                {\n                    m_xAdvance += (m_monoSpacing - monoAdvance + ((characterSpacingAdjustment + m_currentFontAsset.normalSpacingOffset) * currentElementScale) + m_cSpacing) * (1 - m_charWidthAdjDelta);\n\n                    if (char.IsWhiteSpace((char)charCode) || charCode == 0x200B)\n                        m_xAdvance += m_wordSpacing * currentElementScale;\n                }\n                else if (!m_isRightToLeft)\n                {\n                    float scaleFXMultiplier = 1;\n                    if (m_isFXMatrixSet) scaleFXMultiplier = m_FXMatrix.lossyScale.x;\n\n                    m_xAdvance += ((m_cached_TextElement.glyph.metrics.horizontalAdvance * scaleFXMultiplier * bold_xAdvance_multiplier + characterSpacingAdjustment + m_currentFontAsset.normalSpacingOffset + glyphAdjustments.xAdvance) * currentElementScale + m_cSpacing) * (1 - m_charWidthAdjDelta);\n\n                    if (char.IsWhiteSpace((char)charCode) || charCode == 0x200B)\n                        m_xAdvance += m_wordSpacing * currentElementScale;\n                }\n                else\n                {\n                    m_xAdvance -= glyphAdjustments.xAdvance * currentElementScale;\n                }\n\n\n                // Store xAdvance information\n                m_textInfo.characterInfo[m_characterCount].xAdvance = m_xAdvance;\n\n                #endregion Tabulation & Stops\n\n\n                // Handle Carriage Return\n                #region Carriage Return\n                if (charCode == 13)\n                {\n                    m_xAdvance = 0 + tag_Indent;\n                }\n                #endregion Carriage Return\n\n\n                // Handle Line Spacing Adjustments + Word Wrapping & special case for last line.\n                #region Check for Line Feed and Last Character\n                if (charCode == 10 || m_characterCount == totalCharacterCount - 1)\n                {\n                    // Check if Line Spacing of previous line needs to be adjusted.\n                    if (m_lineNumber > 0 && !TMP_Math.Approximately(m_maxLineAscender, m_startOfLineAscender) && m_lineHeight == TMP_Math.FLOAT_UNSET && !m_isNewPage)\n                    {\n                        //Debug.Log(\"Line Feed - Adjusting Line Spacing on line #\" + m_lineNumber);\n                        float offsetDelta = m_maxLineAscender - m_startOfLineAscender;\n                        AdjustLineOffset(m_firstCharacterOfLine, m_characterCount, offsetDelta);\n                        elementDescenderII -= offsetDelta;\n                        m_lineOffset += offsetDelta;\n                    }\n                    m_isNewPage = false;\n\n                    // Calculate lineAscender & make sure if last character is superscript or subscript that we check that as well.\n                    float lineAscender = m_maxLineAscender - m_lineOffset;\n                    float lineDescender = m_maxLineDescender - m_lineOffset;\n\n                    // Update maxDescender and maxVisibleDescender\n                    m_maxDescender = m_maxDescender < lineDescender ? m_maxDescender : lineDescender;\n                    if (!isMaxVisibleDescenderSet)\n                        maxVisibleDescender = m_maxDescender;\n\n                    if (m_useMaxVisibleDescender && (m_characterCount >= m_maxVisibleCharacters || m_lineNumber >= m_maxVisibleLines))\n                        isMaxVisibleDescenderSet = true;\n\n                    // Save Line Information\n                    m_textInfo.lineInfo[m_lineNumber].firstCharacterIndex = m_firstCharacterOfLine;\n                    m_textInfo.lineInfo[m_lineNumber].firstVisibleCharacterIndex = m_firstVisibleCharacterOfLine = m_firstCharacterOfLine > m_firstVisibleCharacterOfLine ? m_firstCharacterOfLine : m_firstVisibleCharacterOfLine;\n                    m_textInfo.lineInfo[m_lineNumber].lastCharacterIndex = m_lastCharacterOfLine = m_characterCount;\n                    m_textInfo.lineInfo[m_lineNumber].lastVisibleCharacterIndex = m_lastVisibleCharacterOfLine = m_lastVisibleCharacterOfLine < m_firstVisibleCharacterOfLine ? m_firstVisibleCharacterOfLine : m_lastVisibleCharacterOfLine;\n\n                    m_textInfo.lineInfo[m_lineNumber].characterCount = m_textInfo.lineInfo[m_lineNumber].lastCharacterIndex - m_textInfo.lineInfo[m_lineNumber].firstCharacterIndex + 1;\n                    m_textInfo.lineInfo[m_lineNumber].visibleCharacterCount = m_lineVisibleCharacterCount;\n                    m_textInfo.lineInfo[m_lineNumber].lineExtents.min = new Vector2(m_textInfo.characterInfo[m_firstVisibleCharacterOfLine].bottomLeft.x, lineDescender);\n                    m_textInfo.lineInfo[m_lineNumber].lineExtents.max = new Vector2(m_textInfo.characterInfo[m_lastVisibleCharacterOfLine].topRight.x, lineAscender);\n                    m_textInfo.lineInfo[m_lineNumber].length = m_textInfo.lineInfo[m_lineNumber].lineExtents.max.x - (padding * currentElementScale);\n                    m_textInfo.lineInfo[m_lineNumber].width = width;\n\n                    if (m_textInfo.lineInfo[m_lineNumber].characterCount == 1)\n                        m_textInfo.lineInfo[m_lineNumber].alignment = m_lineJustification;\n\n                    if (m_textInfo.characterInfo[m_lastVisibleCharacterOfLine].isVisible)\n                        m_textInfo.lineInfo[m_lineNumber].maxAdvance = m_textInfo.characterInfo[m_lastVisibleCharacterOfLine].xAdvance - (characterSpacingAdjustment + m_currentFontAsset.normalSpacingOffset) * currentElementScale - m_cSpacing;\n                    else\n                        m_textInfo.lineInfo[m_lineNumber].maxAdvance = m_textInfo.characterInfo[m_lastCharacterOfLine].xAdvance - (characterSpacingAdjustment + m_currentFontAsset.normalSpacingOffset) * currentElementScale - m_cSpacing;\n\n                    m_textInfo.lineInfo[m_lineNumber].baseline = 0 - m_lineOffset;\n                    m_textInfo.lineInfo[m_lineNumber].ascender = lineAscender;\n                    m_textInfo.lineInfo[m_lineNumber].descender = lineDescender;\n                    m_textInfo.lineInfo[m_lineNumber].lineHeight = lineAscender - lineDescender + lineGap * baseScale;\n\n                    m_firstCharacterOfLine = m_characterCount + 1;\n                    m_lineVisibleCharacterCount = 0;\n\n                    // Add new line if not last line or character.\n                    if (charCode == 10)\n                    {\n                        // Store the state of the line before starting on the new line.\n                        SaveWordWrappingState(ref m_SavedLineState, i, m_characterCount);\n                        // Store the state of the last Character before the new line.\n                        SaveWordWrappingState(ref m_SavedWordWrapState, i, m_characterCount);\n\n                        m_lineNumber += 1;\n                        isStartOfNewLine = true;\n                        ignoreNonBreakingSpace = false;\n                        isFirstWord = true;\n\n                        // Check to make sure Array is large enough to hold a new line.\n                        if (m_lineNumber >= m_textInfo.lineInfo.Length)\n                            ResizeLineExtents(m_lineNumber);\n\n                        // Apply Line Spacing\n                        if (m_lineHeight == TMP_Math.FLOAT_UNSET)\n                        {\n                            lineOffsetDelta = 0 - m_maxLineDescender + elementAscender + (lineGap + m_lineSpacing + m_paragraphSpacing + m_lineSpacingDelta) * baseScale;\n                            m_lineOffset += lineOffsetDelta;\n                        }\n                        else\n                            m_lineOffset += m_lineHeight + (m_lineSpacing + m_paragraphSpacing) * baseScale;\n\n                        m_maxLineAscender = k_LargeNegativeFloat;\n                        m_maxLineDescender = k_LargePositiveFloat;\n                        m_startOfLineAscender = elementAscender;\n\n                        m_xAdvance = 0 + tag_LineIndent + tag_Indent;\n\n                        ellipsisIndex = m_characterCount - 1;\n\n                        m_characterCount += 1;\n                        continue;\n                    }\n                }\n                #endregion Check for Linefeed or Last Character\n\n\n                // Store Rectangle positions for each Character.\n                #region Save CharacterInfo for the current character.\n                // Determine the bounds of the Mesh.\n                if (m_textInfo.characterInfo[m_characterCount].isVisible)\n                {\n                    m_meshExtents.min.x = Mathf.Min(m_meshExtents.min.x, m_textInfo.characterInfo[m_characterCount].bottomLeft.x);\n                    m_meshExtents.min.y = Mathf.Min(m_meshExtents.min.y, m_textInfo.characterInfo[m_characterCount].bottomLeft.y);\n\n                    m_meshExtents.max.x = Mathf.Max(m_meshExtents.max.x, m_textInfo.characterInfo[m_characterCount].topRight.x);\n                    m_meshExtents.max.y = Mathf.Max(m_meshExtents.max.y, m_textInfo.characterInfo[m_characterCount].topRight.y);\n\n                    //m_meshExtents.min = new Vector2(Mathf.Min(m_meshExtents.min.x, m_textInfo.characterInfo[m_characterCount].bottomLeft.x), Mathf.Min(m_meshExtents.min.y, m_textInfo.characterInfo[m_characterCount].bottomLeft.y));\n                    //m_meshExtents.max = new Vector2(Mathf.Max(m_meshExtents.max.x, m_textInfo.characterInfo[m_characterCount].topRight.x), Mathf.Max(m_meshExtents.max.y, m_textInfo.characterInfo[m_characterCount].topRight.y));\n                }\n\n\n                // Save pageInfo Data\n                if (m_overflowMode == TextOverflowModes.Page && charCode != 13 && charCode != 10) // && m_pageNumber < 16)\n                {\n                    // Check if we need to increase allocations for the pageInfo array.\n                    if (m_pageNumber + 1 > m_textInfo.pageInfo.Length)\n                        TMP_TextInfo.Resize(ref m_textInfo.pageInfo, m_pageNumber + 1, true);\n\n                    m_textInfo.pageInfo[m_pageNumber].ascender = pageAscender;\n                    m_textInfo.pageInfo[m_pageNumber].descender = elementDescender < m_textInfo.pageInfo[m_pageNumber].descender ? elementDescender : m_textInfo.pageInfo[m_pageNumber].descender;\n\n                    if (m_pageNumber == 0 && m_characterCount == 0)\n                        m_textInfo.pageInfo[m_pageNumber].firstCharacterIndex = m_characterCount;\n                    else if (m_characterCount > 0 && m_pageNumber != m_textInfo.characterInfo[m_characterCount - 1].pageNumber)\n                    {\n                        m_textInfo.pageInfo[m_pageNumber - 1].lastCharacterIndex = m_characterCount - 1;\n                        m_textInfo.pageInfo[m_pageNumber].firstCharacterIndex = m_characterCount;\n                    }\n                    else if (m_characterCount == totalCharacterCount - 1)\n                        m_textInfo.pageInfo[m_pageNumber].lastCharacterIndex = m_characterCount;\n                }\n                #endregion Saving CharacterInfo\n\n\n                // Save State of Mesh Creation for handling of Word Wrapping\n                #region Save Word Wrapping State\n                if (m_enableWordWrapping || m_overflowMode == TextOverflowModes.Truncate || m_overflowMode == TextOverflowModes.Ellipsis)\n                {\n                    if ((char.IsWhiteSpace((char)charCode) || charCode == 0x200B || charCode == 0x2D || charCode == 0xAD) && (!m_isNonBreakingSpace || ignoreNonBreakingSpace) && charCode != 0xA0 && charCode != 0x2007 && charCode != 0x2011 && charCode != 0x202F && charCode != 0x2060)\n                    {\n                        // We store the state of numerous variables for the most recent Space, LineFeed or Carriage Return to enable them to be restored \n                        // for Word Wrapping.\n                        SaveWordWrappingState(ref m_SavedWordWrapState, i, m_characterCount);\n                        m_isCharacterWrappingEnabled = false;\n                        isFirstWord = false;\n                    }\n                    // Handling for East Asian languages\n                    else if ((  charCode > 0x1100 && charCode < 0x11ff || /* Hangul Jamo */\n                                charCode > 0x2E80 && charCode < 0x9FFF || /* CJK */\n                                charCode > 0xA960 && charCode < 0xA97F || /* Hangul Jame Extended-A */\n                                charCode > 0xAC00 && charCode < 0xD7FF || /* Hangul Syllables */\n                                charCode > 0xF900 && charCode < 0xFAFF || /* CJK Compatibility Ideographs */\n                                charCode > 0xFE30 && charCode < 0xFE4F || /* CJK Compatibility Forms */\n                                charCode > 0xFF00 && charCode < 0xFFEF)   /* CJK Halfwidth */\n                                && !m_isNonBreakingSpace)\n                    {\n                        if (isFirstWord || isLastBreakingChar || TMP_Settings.linebreakingRules.leadingCharacters.ContainsKey(charCode) == false &&\n                            (m_characterCount < totalCharacterCount - 1 &&\n                            TMP_Settings.linebreakingRules.followingCharacters.ContainsKey(m_textInfo.characterInfo[m_characterCount + 1].character) == false))\n                        {\n                            SaveWordWrappingState(ref m_SavedWordWrapState, i, m_characterCount);\n                            m_isCharacterWrappingEnabled = false;\n                            isFirstWord = false;\n                        }\n                    }\n                    else if ((isFirstWord || m_isCharacterWrappingEnabled == true || isLastBreakingChar))\n                        SaveWordWrappingState(ref m_SavedWordWrapState, i, m_characterCount);\n                }\n                #endregion Save Word Wrapping State\n\n                m_characterCount += 1;\n            }\n\n            // Check Auto Sizing and increase font size to fill text container.\n            #region Check Auto-Sizing (Upper Font Size Bounds)\n            fontSizeDelta = m_maxFontSize - m_minFontSize;\n            if (!m_isCharacterWrappingEnabled && m_enableAutoSizing && fontSizeDelta > 0.051f && m_fontSize < m_fontSizeMax)\n            {\n                m_minFontSize = m_fontSize;\n                m_fontSize += Mathf.Max((m_maxFontSize - m_fontSize) / 2, 0.05f);\n                m_fontSize = (int)(Mathf.Min(m_fontSize, m_fontSizeMax) * 20 + 0.5f) / 20f;\n\n                //Debug.Log(m_fontSize);\n\n                if (loopCountA > 20) return; // Added to debug\n                GenerateTextMesh();\n                return;\n            }\n            #endregion End Auto-sizing Check\n\n\n            m_isCharacterWrappingEnabled = false;\n\n\n            //Debug.Log(\"Iteration Count: \" + loopCountA + \". Final Point Size: \" + m_fontSize); // + \"  B: \" + loopCountB + \"  C: \" + loopCountC + \"  D: \" + loopCountD);\n\n\n\n            // If there are no visible characters... no need to continue\n            if (m_characterCount == 0) // && m_visibleSpriteCount == 0)\n            {\n                ClearMesh(true);\n\n                // Event indicating the text has been regenerated.\n                TMPro_EventManager.ON_TEXT_CHANGED(this);\n                return;\n            }\n\n\n            // *** PHASE II of Text Generation ***\n            int last_vert_index = m_materialReferences[0].referenceCount * (!m_isVolumetricText ? 4 : 8);\n\n            // Partial clear of the vertices array to mark unused vertices as degenerate.\n            m_textInfo.meshInfo[0].Clear(false);\n\n            // Handle Text Alignment\n            #region Text Vertical Alignment\n            Vector3 anchorOffset = Vector3.zero;\n            Vector3[] corners = m_RectTransformCorners; // GetTextContainerLocalCorners();\n\n            // Handle Vertical Text Alignment\n            switch (m_textAlignment)\n            {\n                // Top Vertically\n                case TextAlignmentOptions.Top:\n                case TextAlignmentOptions.TopLeft:\n                case TextAlignmentOptions.TopRight:\n                case TextAlignmentOptions.TopJustified:\n                case TextAlignmentOptions.TopFlush:\n                case TextAlignmentOptions.TopGeoAligned:\n                    if (m_overflowMode != TextOverflowModes.Page)\n                        anchorOffset = corners[1] + new Vector3(0 + margins.x, 0 - m_maxAscender - margins.y, 0);\n                    else\n                        anchorOffset = corners[1] + new Vector3(0 + margins.x, 0 - m_textInfo.pageInfo[pageToDisplay].ascender - margins.y, 0);\n                    break;\n\n                // Middle Vertically\n                case TextAlignmentOptions.Left:\n                case TextAlignmentOptions.Right:\n                case TextAlignmentOptions.Center:\n                case TextAlignmentOptions.Justified:\n                case TextAlignmentOptions.Flush:\n                case TextAlignmentOptions.CenterGeoAligned:\n                    if (m_overflowMode != TextOverflowModes.Page)\n                        anchorOffset = (corners[0] + corners[1]) / 2 + new Vector3(0 + margins.x, 0 - (m_maxAscender + margins.y + maxVisibleDescender - margins.w) / 2, 0);\n                    else\n                        anchorOffset = (corners[0] + corners[1]) / 2 + new Vector3(0 + margins.x, 0 - (m_textInfo.pageInfo[pageToDisplay].ascender + margins.y + m_textInfo.pageInfo[pageToDisplay].descender - margins.w) / 2, 0);\n                    break;\n\n                // Bottom Vertically\n                case TextAlignmentOptions.Bottom:\n                case TextAlignmentOptions.BottomLeft:\n                case TextAlignmentOptions.BottomRight:\n                case TextAlignmentOptions.BottomJustified:\n                case TextAlignmentOptions.BottomFlush:\n                case TextAlignmentOptions.BottomGeoAligned:\n                    if (m_overflowMode != TextOverflowModes.Page)\n                        anchorOffset = corners[0] + new Vector3(0 + margins.x, 0 - maxVisibleDescender + margins.w, 0);\n                    else\n                        anchorOffset = corners[0] + new Vector3(0 + margins.x, 0 - m_textInfo.pageInfo[pageToDisplay].descender + margins.w, 0);\n                    break;\n\n                // Baseline Vertically\n                case TextAlignmentOptions.Baseline:\n                case TextAlignmentOptions.BaselineLeft:\n                case TextAlignmentOptions.BaselineRight:\n                case TextAlignmentOptions.BaselineJustified:\n                case TextAlignmentOptions.BaselineFlush:\n                case TextAlignmentOptions.BaselineGeoAligned:\n                    anchorOffset = (corners[0] + corners[1]) / 2 + new Vector3(0 + margins.x, 0, 0);\n                    break;\n\n                // Midline Vertically \n                case TextAlignmentOptions.MidlineLeft:\n                case TextAlignmentOptions.Midline:\n                case TextAlignmentOptions.MidlineRight:\n                case TextAlignmentOptions.MidlineJustified:\n                case TextAlignmentOptions.MidlineFlush:\n                case TextAlignmentOptions.MidlineGeoAligned:\n                    anchorOffset = (corners[0] + corners[1]) / 2 + new Vector3(0 + margins.x, 0 - (m_meshExtents.max.y + margins.y + m_meshExtents.min.y - margins.w) / 2, 0);\n                    break;\n\n                // Capline Vertically \n                case TextAlignmentOptions.CaplineLeft:\n                case TextAlignmentOptions.Capline:\n                case TextAlignmentOptions.CaplineRight:\n                case TextAlignmentOptions.CaplineJustified:\n                case TextAlignmentOptions.CaplineFlush:\n                case TextAlignmentOptions.CaplineGeoAligned:\n                    anchorOffset = (corners[0] + corners[1]) / 2 + new Vector3(0 + margins.x, 0 - (m_maxCapHeight - margins.y - margins.w) / 2, 0);\n                    break;\n            }\n            #endregion\n\n\n            // Initialization for Second Pass\n            Vector3 justificationOffset = Vector3.zero;\n            Vector3 offset = Vector3.zero;\n            int vert_index_X4 = 0;\n            int sprite_index_X4 = 0;\n\n            int wordCount = 0;\n            int lineCount = 0;\n            int lastLine = 0;\n            bool isFirstSeperator = false;\n\n            bool isStartOfWord = false;\n            int wordFirstChar = 0;\n            int wordLastChar = 0;\n\n            // Second Pass : Line Justification, UV Mapping, Character & Line Visibility & more.\n            float lossyScale = m_previousLossyScaleY = this.transform.lossyScale.y;\n\n            Color32 underlineColor = Color.white;\n            Color32 strikethroughColor = Color.white;\n            Color32 highlightColor = new Color32(255, 255, 0, 64);\n            float xScale = 0;\n            float xScaleMax = 0;\n            float underlineStartScale = 0;\n            float underlineEndScale = 0;\n            float underlineMaxScale = 0;\n            float underlineBaseLine = k_LargePositiveFloat;\n            int lastPage = 0;\n\n            float strikethroughPointSize = 0;\n            float strikethroughScale = 0;\n            float strikethroughBaseline = 0;\n\n            TMP_CharacterInfo[] characterInfos = m_textInfo.characterInfo;\n            #region Handle Line Justification & UV Mapping & Character Visibility & More\n            for (int i = 0; i < m_characterCount; i++)\n            {\n                TMP_FontAsset currentFontAsset = characterInfos[i].fontAsset;\n\n                char currentCharacter = characterInfos[i].character;\n\n                int currentLine = characterInfos[i].lineNumber;\n                TMP_LineInfo lineInfo = m_textInfo.lineInfo[currentLine];\n                lineCount = currentLine + 1;\n\n                TextAlignmentOptions lineAlignment = lineInfo.alignment;\n\n                // Process Line Justification\n                #region Handle Line Justification\n                switch (lineAlignment)\n                {\n                    case TextAlignmentOptions.TopLeft:\n                    case TextAlignmentOptions.Left:\n                    case TextAlignmentOptions.BottomLeft:\n                    case TextAlignmentOptions.BaselineLeft:\n                    case TextAlignmentOptions.MidlineLeft:\n                    case TextAlignmentOptions.CaplineLeft:\n                            if (!m_isRightToLeft)\n                                justificationOffset = new Vector3(0 + lineInfo.marginLeft, 0, 0);\n                            else\n                                justificationOffset = new Vector3(0 - lineInfo.maxAdvance, 0, 0);\n                            break;\n\n                    case TextAlignmentOptions.Top:\n                    case TextAlignmentOptions.Center:\n                    case TextAlignmentOptions.Bottom:\n                    case TextAlignmentOptions.Baseline:\n                    case TextAlignmentOptions.Midline:\n                    case TextAlignmentOptions.Capline:\n                        justificationOffset = new Vector3(lineInfo.marginLeft + lineInfo.width / 2 - lineInfo.maxAdvance / 2, 0, 0);\n                        break;\n\n                    case TextAlignmentOptions.TopGeoAligned:\n                    case TextAlignmentOptions.CenterGeoAligned:\n                    case TextAlignmentOptions.BottomGeoAligned:\n                    case TextAlignmentOptions.BaselineGeoAligned:\n                    case TextAlignmentOptions.MidlineGeoAligned:\n                    case TextAlignmentOptions.CaplineGeoAligned:\n                        justificationOffset = new Vector3(lineInfo.marginLeft + lineInfo.width / 2 - (lineInfo.lineExtents.min.x + lineInfo.lineExtents.max.x) / 2, 0, 0);\n                        break;\n\n                    case TextAlignmentOptions.TopRight:\n                    case TextAlignmentOptions.Right:\n                    case TextAlignmentOptions.BottomRight:\n                    case TextAlignmentOptions.BaselineRight:\n                    case TextAlignmentOptions.MidlineRight:\n                    case TextAlignmentOptions.CaplineRight:\n                        if (!m_isRightToLeft)\n                            justificationOffset = new Vector3(lineInfo.marginLeft + lineInfo.width - lineInfo.maxAdvance, 0, 0);\n                        else\n                            justificationOffset = new Vector3(lineInfo.marginLeft + lineInfo.width, 0, 0);\n                        break;\n\n                    case TextAlignmentOptions.TopJustified:\n                    case TextAlignmentOptions.Justified:\n                    case TextAlignmentOptions.BottomJustified:\n                    case TextAlignmentOptions.BaselineJustified:\n                    case TextAlignmentOptions.MidlineJustified:\n                    case TextAlignmentOptions.CaplineJustified:\n                    case TextAlignmentOptions.TopFlush:\n                    case TextAlignmentOptions.Flush:\n                    case TextAlignmentOptions.BottomFlush:\n                    case TextAlignmentOptions.BaselineFlush:\n                    case TextAlignmentOptions.MidlineFlush:\n                    case TextAlignmentOptions.CaplineFlush:\n                        // Skip Zero Width Characters\n                        if (currentCharacter == 0xAD || currentCharacter == 0x200B || currentCharacter == 0x2060) break;\n\n                        char lastCharOfCurrentLine = characterInfos[lineInfo.lastCharacterIndex].character;\n                        bool isFlush = ((_HorizontalAlignmentOptions)lineAlignment & _HorizontalAlignmentOptions.Flush) == _HorizontalAlignmentOptions.Flush;\n\n                        // In Justified mode, all lines are justified except the last one.\n                        // In Flush mode, all lines are justified.\n                        if (char.IsControl(lastCharOfCurrentLine) == false && currentLine < m_lineNumber || isFlush || lineInfo.maxAdvance > lineInfo.width)\n                        {\n                            // First character of each line.\n                            if (currentLine != lastLine || i == 0 || i == m_firstVisibleCharacter)\n                            {\n                                if (!m_isRightToLeft)\n                                    justificationOffset = new Vector3(lineInfo.marginLeft, 0, 0);\n                                else\n                                    justificationOffset = new Vector3(lineInfo.marginLeft + lineInfo.width, 0, 0);\n\n                                if (char.IsSeparator(currentCharacter))\n                                    isFirstSeperator = true;\n                                else\n                                    isFirstSeperator = false;\n                            }\n                            else\n                            {\n                                float gap = !m_isRightToLeft ? lineInfo.width - lineInfo.maxAdvance : lineInfo.width + lineInfo.maxAdvance;\n\n                                int visibleCount = lineInfo.visibleCharacterCount - 1 + lineInfo.controlCharacterCount;\n\n                                // Get the number of spaces for each line ignoring the last character if it is not visible (ie. a space or linefeed).\n                                int spaces = (characterInfos[lineInfo.lastCharacterIndex].isVisible ? lineInfo.spaceCount : lineInfo.spaceCount - 1) - lineInfo.controlCharacterCount;\n\n                                if (isFirstSeperator) { spaces -= 1; visibleCount += 1; }\n\n                                float ratio = spaces > 0 ? m_wordWrappingRatios : 1;\n\n                                if (spaces < 1) spaces = 1;\n\n                                if (currentCharacter != 0xA0 && (currentCharacter == 9 || char.IsSeparator((char)currentCharacter)))\n                                {\n                                    if (!m_isRightToLeft)\n                                        justificationOffset += new Vector3(gap * (1 - ratio) / spaces, 0, 0);\n                                    else\n                                        justificationOffset -= new Vector3(gap * (1 - ratio) / spaces, 0, 0);\n                                }\n                                else\n                                {\n                                    if (!m_isRightToLeft)\n                                        justificationOffset += new Vector3(gap * ratio / visibleCount, 0, 0);\n                                    else\n                                        justificationOffset -= new Vector3(gap * ratio / visibleCount, 0, 0);\n                                }\n                            }\n                        }\n                        else\n                        {\n                            if (!m_isRightToLeft)\n                                justificationOffset = new Vector3(lineInfo.marginLeft, 0, 0); // Keep last line left justified.\n                            else\n                                justificationOffset = new Vector3(lineInfo.marginLeft + lineInfo.width, 0, 0); // Keep last line right justified.\n                        }\n                        //Debug.Log(\"Char [\" + (char)charCode + \"] Code:\" + charCode + \"  Line # \" + currentLine + \"  Offset:\" + justificationOffset + \"  # Spaces:\" + lineInfo.spaceCount + \"  # Characters:\" + lineInfo.characterCount);\n                        break;\n                }\n                #endregion End Text Justification\n\n                offset = anchorOffset + justificationOffset;\n\n                // Handle UV2 mapping options and packing of scale information into UV2.\n                #region Handling of UV2 mapping & Scale packing\n                bool isCharacterVisible = characterInfos[i].isVisible;\n                if (isCharacterVisible)\n                {\n                    TMP_TextElementType elementType = characterInfos[i].elementType;\n                    switch (elementType)\n                    {\n                        // CHARACTERS\n                        case TMP_TextElementType.Character:\n                            Extents lineExtents = lineInfo.lineExtents;\n                            float uvOffset = (m_uvLineOffset * currentLine) % 1; // + m_uvOffset.x;\n\n                            // Setup UV2 based on Character Mapping Options Selected\n                            #region Handle UV Mapping Options\n                            switch (m_horizontalMapping)\n                            {\n                                case TextureMappingOptions.Character:\n                                    characterInfos[i].vertex_BL.uv2.x = 0; //+ m_uvOffset.x;\n                                    characterInfos[i].vertex_TL.uv2.x = 0; //+ m_uvOffset.x;\n                                    characterInfos[i].vertex_TR.uv2.x = 1; //+ m_uvOffset.x;\n                                    characterInfos[i].vertex_BR.uv2.x = 1; //+ m_uvOffset.x;\n                                    break;\n\n                                case TextureMappingOptions.Line:\n                                    if (m_textAlignment != TextAlignmentOptions.Justified)\n                                    {\n                                        characterInfos[i].vertex_BL.uv2.x = (characterInfos[i].vertex_BL.position.x - lineExtents.min.x) / (lineExtents.max.x - lineExtents.min.x) + uvOffset;\n                                        characterInfos[i].vertex_TL.uv2.x = (characterInfos[i].vertex_TL.position.x - lineExtents.min.x) / (lineExtents.max.x - lineExtents.min.x) + uvOffset;\n                                        characterInfos[i].vertex_TR.uv2.x = (characterInfos[i].vertex_TR.position.x - lineExtents.min.x) / (lineExtents.max.x - lineExtents.min.x) + uvOffset;\n                                        characterInfos[i].vertex_BR.uv2.x = (characterInfos[i].vertex_BR.position.x - lineExtents.min.x) / (lineExtents.max.x - lineExtents.min.x) + uvOffset;\n                                        break;\n                                    }\n                                    else // Special Case if Justified is used in Line Mode.\n                                    {\n                                        characterInfos[i].vertex_BL.uv2.x = (characterInfos[i].vertex_BL.position.x + justificationOffset.x - m_meshExtents.min.x) / (m_meshExtents.max.x - m_meshExtents.min.x) + uvOffset;\n                                        characterInfos[i].vertex_TL.uv2.x = (characterInfos[i].vertex_TL.position.x + justificationOffset.x - m_meshExtents.min.x) / (m_meshExtents.max.x - m_meshExtents.min.x) + uvOffset;\n                                        characterInfos[i].vertex_TR.uv2.x = (characterInfos[i].vertex_TR.position.x + justificationOffset.x - m_meshExtents.min.x) / (m_meshExtents.max.x - m_meshExtents.min.x) + uvOffset;\n                                        characterInfos[i].vertex_BR.uv2.x = (characterInfos[i].vertex_BR.position.x + justificationOffset.x - m_meshExtents.min.x) / (m_meshExtents.max.x - m_meshExtents.min.x) + uvOffset;\n                                        break;\n                                    }\n\n                                case TextureMappingOptions.Paragraph:\n                                    characterInfos[i].vertex_BL.uv2.x = (characterInfos[i].vertex_BL.position.x + justificationOffset.x - m_meshExtents.min.x) / (m_meshExtents.max.x - m_meshExtents.min.x) + uvOffset;\n                                    characterInfos[i].vertex_TL.uv2.x = (characterInfos[i].vertex_TL.position.x + justificationOffset.x - m_meshExtents.min.x) / (m_meshExtents.max.x - m_meshExtents.min.x) + uvOffset;\n                                    characterInfos[i].vertex_TR.uv2.x = (characterInfos[i].vertex_TR.position.x + justificationOffset.x - m_meshExtents.min.x) / (m_meshExtents.max.x - m_meshExtents.min.x) + uvOffset;\n                                    characterInfos[i].vertex_BR.uv2.x = (characterInfos[i].vertex_BR.position.x + justificationOffset.x - m_meshExtents.min.x) / (m_meshExtents.max.x - m_meshExtents.min.x) + uvOffset;\n                                    break;\n\n                                case TextureMappingOptions.MatchAspect:\n\n                                    switch (m_verticalMapping)\n                                    {\n                                        case TextureMappingOptions.Character:\n                                            characterInfos[i].vertex_BL.uv2.y = 0; //+ m_uvOffset.y;\n                                            characterInfos[i].vertex_TL.uv2.y = 1; //+ m_uvOffset.y;\n                                            characterInfos[i].vertex_TR.uv2.y = 0; //+ m_uvOffset.y;\n                                            characterInfos[i].vertex_BR.uv2.y = 1; //+ m_uvOffset.y;\n                                            break;\n\n                                        case TextureMappingOptions.Line:\n                                            characterInfos[i].vertex_BL.uv2.y = (characterInfos[i].vertex_BL.position.y - lineExtents.min.y) / (lineExtents.max.y - lineExtents.min.y) + uvOffset;\n                                            characterInfos[i].vertex_TL.uv2.y = (characterInfos[i].vertex_TL.position.y - lineExtents.min.y) / (lineExtents.max.y - lineExtents.min.y) + uvOffset;\n                                            characterInfos[i].vertex_TR.uv2.y = characterInfos[i].vertex_BL.uv2.y;\n                                            characterInfos[i].vertex_BR.uv2.y = characterInfos[i].vertex_TL.uv2.y;\n                                            break;\n\n                                        case TextureMappingOptions.Paragraph:\n                                            characterInfos[i].vertex_BL.uv2.y = (characterInfos[i].vertex_BL.position.y - m_meshExtents.min.y) / (m_meshExtents.max.y - m_meshExtents.min.y) + uvOffset;\n                                            characterInfos[i].vertex_TL.uv2.y = (characterInfos[i].vertex_TL.position.y - m_meshExtents.min.y) / (m_meshExtents.max.y - m_meshExtents.min.y) + uvOffset;\n                                            characterInfos[i].vertex_TR.uv2.y = characterInfos[i].vertex_BL.uv2.y;\n                                            characterInfos[i].vertex_BR.uv2.y = characterInfos[i].vertex_TL.uv2.y;\n                                            break;\n\n                                        case TextureMappingOptions.MatchAspect:\n                                            Debug.Log(\"ERROR: Cannot Match both Vertical & Horizontal.\");\n                                            break;\n                                    }\n\n                                    //float xDelta = 1 - (_uv2s[vert_index + 0].y * textMeshCharacterInfo[i].AspectRatio); // Left aligned\n                                    float xDelta = (1 - ((characterInfos[i].vertex_BL.uv2.y + characterInfos[i].vertex_TL.uv2.y) * characterInfos[i].aspectRatio)) / 2; // Center of Rectangle\n\n                                    characterInfos[i].vertex_BL.uv2.x = (characterInfos[i].vertex_BL.uv2.y * characterInfos[i].aspectRatio) + xDelta + uvOffset;\n                                    characterInfos[i].vertex_TL.uv2.x = characterInfos[i].vertex_BL.uv2.x;\n                                    characterInfos[i].vertex_TR.uv2.x = (characterInfos[i].vertex_TL.uv2.y * characterInfos[i].aspectRatio) + xDelta + uvOffset;\n                                    characterInfos[i].vertex_BR.uv2.x = characterInfos[i].vertex_TR.uv2.x;\n                                    break;\n                            }\n\n                            switch (m_verticalMapping)\n                            {\n                                case TextureMappingOptions.Character:\n                                    characterInfos[i].vertex_BL.uv2.y = 0; //+ m_uvOffset.y;\n                                    characterInfos[i].vertex_TL.uv2.y = 1; //+ m_uvOffset.y;\n                                    characterInfos[i].vertex_TR.uv2.y = 1; //+ m_uvOffset.y;\n                                    characterInfos[i].vertex_BR.uv2.y = 0; //+ m_uvOffset.y;\n                                    break;\n\n                                case TextureMappingOptions.Line:\n                                    characterInfos[i].vertex_BL.uv2.y = (characterInfos[i].vertex_BL.position.y - lineInfo.descender) / (lineInfo.ascender - lineInfo.descender); // + m_uvOffset.y;\n                                    characterInfos[i].vertex_TL.uv2.y = (characterInfos[i].vertex_TL.position.y - lineInfo.descender) / (lineInfo.ascender - lineInfo.descender); // + m_uvOffset.y;\n                                    characterInfos[i].vertex_TR.uv2.y = characterInfos[i].vertex_TL.uv2.y;\n                                    characterInfos[i].vertex_BR.uv2.y = characterInfos[i].vertex_BL.uv2.y;\n                                    break;\n\n                                case TextureMappingOptions.Paragraph:\n                                    characterInfos[i].vertex_BL.uv2.y = (characterInfos[i].vertex_BL.position.y - m_meshExtents.min.y) / (m_meshExtents.max.y - m_meshExtents.min.y); // + m_uvOffset.y;\n                                    characterInfos[i].vertex_TL.uv2.y = (characterInfos[i].vertex_TL.position.y - m_meshExtents.min.y) / (m_meshExtents.max.y - m_meshExtents.min.y); // + m_uvOffset.y;\n                                    characterInfos[i].vertex_TR.uv2.y = characterInfos[i].vertex_TL.uv2.y;\n                                    characterInfos[i].vertex_BR.uv2.y = characterInfos[i].vertex_BL.uv2.y;\n                                    break;\n\n                                case TextureMappingOptions.MatchAspect:\n                                    float yDelta = (1 - ((characterInfos[i].vertex_BL.uv2.x + characterInfos[i].vertex_TR.uv2.x) / characterInfos[i].aspectRatio)) / 2; // Center of Rectangle\n\n                                    characterInfos[i].vertex_BL.uv2.y = yDelta + (characterInfos[i].vertex_BL.uv2.x / characterInfos[i].aspectRatio); // + m_uvOffset.y;\n                                    characterInfos[i].vertex_TL.uv2.y = yDelta + (characterInfos[i].vertex_TR.uv2.x / characterInfos[i].aspectRatio); // + m_uvOffset.y;\n                                    characterInfos[i].vertex_BR.uv2.y = characterInfos[i].vertex_BL.uv2.y;\n                                    characterInfos[i].vertex_TR.uv2.y = characterInfos[i].vertex_TL.uv2.y;\n                                    break;\n                            }\n                            #endregion\n\n                            // Pack UV's so that we can pass Xscale needed for Shader to maintain 1:1 ratio.\n                            #region Pack Scale into UV2\n                            xScale = characterInfos[i].scale * Mathf.Abs(lossyScale) * (1 - m_charWidthAdjDelta);\n                            if (!characterInfos[i].isUsingAlternateTypeface && (characterInfos[i].style & FontStyles.Bold) == FontStyles.Bold) xScale *= -1;\n\n                            //int isBold = (m_textInfo.characterInfo[i].style & FontStyles.Bold) == FontStyles.Bold ? 1 : 0;\n                            //Vector2 vertexData = new Vector2(isBold, xScale);\n                            //characterInfos[i].vertex_BL.uv4 = vertexData;\n                            //characterInfos[i].vertex_TL.uv4 = vertexData;\n                            //characterInfos[i].vertex_TR.uv4 = vertexData;\n                            //characterInfos[i].vertex_BR.uv4 = vertexData;\n\n                            float x0 = characterInfos[i].vertex_BL.uv2.x;\n                            float y0 = characterInfos[i].vertex_BL.uv2.y;\n                            float x1 = characterInfos[i].vertex_TR.uv2.x;\n                            float y1 = characterInfos[i].vertex_TR.uv2.y;\n\n                            float dx = (int)x0;\n                            float dy = (int)y0;\n\n                            x0 = x0 - dx;\n                            x1 = x1 - dx;\n                            y0 = y0 - dy;\n                            y1 = y1 - dy;\n\n                            // Optimization to avoid having a vector2 returned from the Pack UV function.\n                            characterInfos[i].vertex_BL.uv2.x = PackUV(x0, y0); characterInfos[i].vertex_BL.uv2.y = xScale;\n                            characterInfos[i].vertex_TL.uv2.x = PackUV(x0, y1); characterInfos[i].vertex_TL.uv2.y = xScale;\n                            characterInfos[i].vertex_TR.uv2.x = PackUV(x1, y1); characterInfos[i].vertex_TR.uv2.y = xScale;\n                            characterInfos[i].vertex_BR.uv2.x = PackUV(x1, y0); characterInfos[i].vertex_BR.uv2.y = xScale;\n                            #endregion\n                            break;\n                        \n                        // SPRITES\n                        case TMP_TextElementType.Sprite:\n                            // Nothing right now\n                            break;\n                    }\n\n                    // Handle maxVisibleCharacters, maxVisibleLines and Overflow Page Mode.\n                    #region Handle maxVisibleCharacters / maxVisibleLines / Page Mode\n                    if (i < m_maxVisibleCharacters && wordCount < m_maxVisibleWords && currentLine < m_maxVisibleLines && m_overflowMode != TextOverflowModes.Page)\n                    {\n                        characterInfos[i].vertex_BL.position += offset;\n                        characterInfos[i].vertex_TL.position += offset;\n                        characterInfos[i].vertex_TR.position += offset;\n                        characterInfos[i].vertex_BR.position += offset;\n                    }\n                    else if (i < m_maxVisibleCharacters && wordCount < m_maxVisibleWords && currentLine < m_maxVisibleLines && m_overflowMode == TextOverflowModes.Page && characterInfos[i].pageNumber == pageToDisplay)\n                    {\n                        characterInfos[i].vertex_BL.position += offset;\n                        characterInfos[i].vertex_TL.position += offset;\n                        characterInfos[i].vertex_TR.position += offset;\n                        characterInfos[i].vertex_BR.position += offset;\n                    }\n                    else\n                    {\n                        characterInfos[i].vertex_BL.position = Vector3.zero;\n                        characterInfos[i].vertex_TL.position = Vector3.zero;\n                        characterInfos[i].vertex_TR.position = Vector3.zero;\n                        characterInfos[i].vertex_BR.position = Vector3.zero;\n                        characterInfos[i].isVisible = false;\n                    }\n                    #endregion\n\n\n                    // Fill Vertex Buffers for the various types of element\n                    if (elementType == TMP_TextElementType.Character)\n                    {\n                        FillCharacterVertexBuffers(i, vert_index_X4, m_isVolumetricText);\n                    }\n                    else if (elementType == TMP_TextElementType.Sprite)\n                    {\n                        FillSpriteVertexBuffers(i, sprite_index_X4);\n                    }\n                }\n                #endregion\n\n                // Apply Alignment and Justification Offset\n                m_textInfo.characterInfo[i].bottomLeft += offset;\n                m_textInfo.characterInfo[i].topLeft += offset;\n                m_textInfo.characterInfo[i].topRight += offset;\n                m_textInfo.characterInfo[i].bottomRight += offset;\n\n                m_textInfo.characterInfo[i].origin += offset.x;\n                m_textInfo.characterInfo[i].xAdvance += offset.x;\n\n                m_textInfo.characterInfo[i].ascender += offset.y;\n                m_textInfo.characterInfo[i].descender += offset.y;\n                m_textInfo.characterInfo[i].baseLine += offset.y;\n\n                // Update MeshExtents\n                if (isCharacterVisible)\n                {\n                    //m_meshExtents.min = new Vector2(Mathf.Min(m_meshExtents.min.x, m_textInfo.characterInfo[i].bottomLeft.x), Mathf.Min(m_meshExtents.min.y, m_textInfo.characterInfo[i].bottomLeft.y));\n                    //m_meshExtents.max = new Vector2(Mathf.Max(m_meshExtents.max.x, m_textInfo.characterInfo[i].topRight.x), Mathf.Max(m_meshExtents.max.y, m_textInfo.characterInfo[i].topLeft.y));\n                }\n\n                // Need to recompute lineExtent to account for the offset from justification.\n                #region Adjust lineExtents resulting from alignment offset\n                if (currentLine != lastLine || i == m_characterCount - 1)\n                {\n                    // Update the previous line's extents\n                    if (currentLine != lastLine)\n                    {\n                        m_textInfo.lineInfo[lastLine].baseline += offset.y;\n                        m_textInfo.lineInfo[lastLine].ascender += offset.y;\n                        m_textInfo.lineInfo[lastLine].descender += offset.y;\n\n                        m_textInfo.lineInfo[lastLine].lineExtents.min = new Vector2(m_textInfo.characterInfo[m_textInfo.lineInfo[lastLine].firstCharacterIndex].bottomLeft.x, m_textInfo.lineInfo[lastLine].descender);\n                        m_textInfo.lineInfo[lastLine].lineExtents.max = new Vector2(m_textInfo.characterInfo[m_textInfo.lineInfo[lastLine].lastVisibleCharacterIndex].topRight.x, m_textInfo.lineInfo[lastLine].ascender);\n                    }\n\n                    // Update the current line's extents\n                    if (i == m_characterCount - 1)\n                    {\n                        m_textInfo.lineInfo[currentLine].baseline += offset.y;\n                        m_textInfo.lineInfo[currentLine].ascender += offset.y;\n                        m_textInfo.lineInfo[currentLine].descender += offset.y;\n\n                        m_textInfo.lineInfo[currentLine].lineExtents.min = new Vector2(m_textInfo.characterInfo[m_textInfo.lineInfo[currentLine].firstCharacterIndex].bottomLeft.x, m_textInfo.lineInfo[currentLine].descender);\n                        m_textInfo.lineInfo[currentLine].lineExtents.max = new Vector2(m_textInfo.characterInfo[m_textInfo.lineInfo[currentLine].lastVisibleCharacterIndex].topRight.x, m_textInfo.lineInfo[currentLine].ascender);\n                    }\n                }\n                #endregion\n\n\n                // Track Word Count per line and for the object\n                #region Track Word Count\n                if (char.IsLetterOrDigit(currentCharacter) || currentCharacter == 0x2D || currentCharacter == 0xAD || currentCharacter == 0x2010 || currentCharacter == 0x2011)\n                {\n                    if (isStartOfWord == false)\n                    {\n                        isStartOfWord = true;\n                        wordFirstChar = i;\n                    }\n\n                    // If last character is a word\n                    if (isStartOfWord && i == m_characterCount - 1)\n                    {\n                        int size = m_textInfo.wordInfo.Length;\n                        int index = m_textInfo.wordCount;\n\n                        if (m_textInfo.wordCount + 1 > size)\n                            TMP_TextInfo.Resize(ref m_textInfo.wordInfo, size + 1);\n\n                        wordLastChar = i;\n\n                        m_textInfo.wordInfo[index].firstCharacterIndex = wordFirstChar;\n                        m_textInfo.wordInfo[index].lastCharacterIndex = wordLastChar;\n                        m_textInfo.wordInfo[index].characterCount = wordLastChar - wordFirstChar + 1;\n                        m_textInfo.wordInfo[index].textComponent = this;\n\n                        wordCount += 1;\n                        m_textInfo.wordCount += 1;\n                        m_textInfo.lineInfo[currentLine].wordCount += 1;\n                    }\n                }\n                else if (isStartOfWord || i == 0 && (!char.IsPunctuation(currentCharacter) || char.IsWhiteSpace(currentCharacter) || currentCharacter == 0x200B || i == m_characterCount - 1))\n                {\n                    if (i > 0 && i < characterInfos.Length - 1 && i < m_characterCount && (currentCharacter == 39 || currentCharacter == 8217) && char.IsLetterOrDigit(characterInfos[i - 1].character) && char.IsLetterOrDigit(characterInfos[i + 1].character))\n                    {\n\n                    }\n                    else\n                    {\n                        wordLastChar = i == m_characterCount - 1 && char.IsLetterOrDigit(currentCharacter) ? i : i - 1;\n                        isStartOfWord = false;\n\n                        int size = m_textInfo.wordInfo.Length;\n                        int index = m_textInfo.wordCount;\n\n                        if (m_textInfo.wordCount + 1 > size)\n                            TMP_TextInfo.Resize(ref m_textInfo.wordInfo, size + 1);\n\n                        m_textInfo.wordInfo[index].firstCharacterIndex = wordFirstChar;\n                        m_textInfo.wordInfo[index].lastCharacterIndex = wordLastChar;\n                        m_textInfo.wordInfo[index].characterCount = wordLastChar - wordFirstChar + 1;\n                        m_textInfo.wordInfo[index].textComponent = this;\n\n                        wordCount += 1;\n                        m_textInfo.wordCount += 1;\n                        m_textInfo.lineInfo[currentLine].wordCount += 1;\n                    }\n                }\n                #endregion\n\n\n                // Setup & Handle Underline\n                #region Underline\n                // NOTE: Need to figure out how underline will be handled with multiple fonts and which font will be used for the underline.\n                bool isUnderline = (m_textInfo.characterInfo[i].style & FontStyles.Underline) == FontStyles.Underline;\n                if (isUnderline)\n                {\n                    bool isUnderlineVisible = true;\n                    int currentPage = m_textInfo.characterInfo[i].pageNumber;\n\n                    if (i > m_maxVisibleCharacters || currentLine > m_maxVisibleLines || (m_overflowMode == TextOverflowModes.Page && currentPage + 1 != m_pageToDisplay))\n                        isUnderlineVisible = false;\n\n                    // We only use the scale of visible characters.\n                    if (!char.IsWhiteSpace(currentCharacter) && currentCharacter != 0x200B)\n                    {\n                        underlineMaxScale = Mathf.Max(underlineMaxScale, m_textInfo.characterInfo[i].scale);\n                        xScaleMax = Mathf.Max(xScaleMax, Mathf.Abs(xScale));\n                        underlineBaseLine = Mathf.Min(currentPage == lastPage ? underlineBaseLine : k_LargePositiveFloat, m_textInfo.characterInfo[i].baseLine + font.faceInfo.underlineOffset * underlineMaxScale);\n                        lastPage = currentPage; // Need to track pages to ensure we reset baseline for the new pages.\n                    }\n\n                    if (beginUnderline == false && isUnderlineVisible == true && i <= lineInfo.lastVisibleCharacterIndex && currentCharacter != 10 && currentCharacter != 13)\n                    {\n                        if (i == lineInfo.lastVisibleCharacterIndex && char.IsSeparator(currentCharacter))\n                        { }\n                        else\n                        {\n                            beginUnderline = true;\n                            underlineStartScale = m_textInfo.characterInfo[i].scale;\n                            if (underlineMaxScale == 0)\n                            {\n                                underlineMaxScale = underlineStartScale;\n                                xScaleMax = xScale;\n                            }\n                            underline_start = new Vector3(m_textInfo.characterInfo[i].bottomLeft.x, underlineBaseLine, 0);\n                            underlineColor = m_textInfo.characterInfo[i].underlineColor;\n                        }\n                    }\n\n                    // End Underline if text only contains one character.\n                    if (beginUnderline && m_characterCount == 1)\n                    {\n                        beginUnderline = false;\n                        underline_end = new Vector3(m_textInfo.characterInfo[i].topRight.x, underlineBaseLine, 0);\n                        underlineEndScale = m_textInfo.characterInfo[i].scale;\n\n                        DrawUnderlineMesh(underline_start, underline_end, ref last_vert_index, underlineStartScale, underlineEndScale, underlineMaxScale, xScaleMax, underlineColor);\n                        underlineMaxScale = 0;\n                        xScaleMax = 0;\n                        underlineBaseLine = k_LargePositiveFloat;\n                    }\n                    else if (beginUnderline && (i == lineInfo.lastCharacterIndex || i >= lineInfo.lastVisibleCharacterIndex))\n                    {\n                        // Terminate underline at previous visible character if space or carriage return.\n                        if (char.IsWhiteSpace(currentCharacter) || currentCharacter == 0x200B)\n                        {\n                            int lastVisibleCharacterIndex = lineInfo.lastVisibleCharacterIndex;\n                            underline_end = new Vector3(m_textInfo.characterInfo[lastVisibleCharacterIndex].topRight.x, underlineBaseLine, 0);\n                            underlineEndScale = m_textInfo.characterInfo[lastVisibleCharacterIndex].scale;\n                        }\n                        else\n                        {   // End underline if last character of the line.\n                            underline_end = new Vector3(m_textInfo.characterInfo[i].topRight.x, underlineBaseLine, 0);\n                            underlineEndScale = m_textInfo.characterInfo[i].scale;\n                        }\n\n                        beginUnderline = false;\n                        DrawUnderlineMesh(underline_start, underline_end, ref last_vert_index, underlineStartScale, underlineEndScale, underlineMaxScale, xScaleMax, underlineColor);\n                        underlineMaxScale = 0;\n                        xScaleMax = 0;\n                        underlineBaseLine = k_LargePositiveFloat;\n                    }\n                    else if (beginUnderline && !isUnderlineVisible)\n                    {\n                        beginUnderline = false;\n                        underline_end = new Vector3(m_textInfo.characterInfo[i - 1].topRight.x, underlineBaseLine, 0);\n                        underlineEndScale = m_textInfo.characterInfo[i - 1].scale;\n\n                        DrawUnderlineMesh(underline_start, underline_end, ref last_vert_index, underlineStartScale, underlineEndScale, underlineMaxScale, xScaleMax, underlineColor);\n                        underlineMaxScale = 0;\n                        xScaleMax = 0;\n                        underlineBaseLine = k_LargePositiveFloat;\n                    }\n                    else if (beginUnderline && i < m_characterCount - 1 && !underlineColor.Compare(m_textInfo.characterInfo[i + 1].underlineColor))\n                    {\n                        // End underline if underline color has changed.\n                        beginUnderline = false;\n                        underline_end = new Vector3(m_textInfo.characterInfo[i].topRight.x, underlineBaseLine, 0);\n                        underlineEndScale = m_textInfo.characterInfo[i].scale;\n\n                        DrawUnderlineMesh(underline_start, underline_end, ref last_vert_index, underlineStartScale, underlineEndScale, underlineMaxScale, xScaleMax, underlineColor);\n                        underlineMaxScale = 0;\n                        xScaleMax = 0;\n                        underlineBaseLine = k_LargePositiveFloat;\n                    }\n                }\n                else\n                {\n                    // End Underline\n                    if (beginUnderline == true)\n                    {\n                        beginUnderline = false;\n                        underline_end = new Vector3(m_textInfo.characterInfo[i - 1].topRight.x, underlineBaseLine, 0);\n                        underlineEndScale = m_textInfo.characterInfo[i - 1].scale;\n\n                        DrawUnderlineMesh(underline_start, underline_end, ref last_vert_index, underlineStartScale, underlineEndScale, underlineMaxScale, xScaleMax, underlineColor);\n                        underlineMaxScale = 0;\n                        xScaleMax = 0;\n                        underlineBaseLine = k_LargePositiveFloat;\n                    }\n                }\n                #endregion\n\n\n                // Setup & Handle Strikethrough\n                #region Strikethrough\n                // NOTE: Need to figure out how underline will be handled with multiple fonts and which font will be used for the underline.\n                bool isStrikethrough = (m_textInfo.characterInfo[i].style & FontStyles.Strikethrough) == FontStyles.Strikethrough;\n                float strikethroughOffset = currentFontAsset.faceInfo.strikethroughOffset;\n\n                if (isStrikethrough)\n                {\n                    bool isStrikeThroughVisible = true;\n\n                    if (i > m_maxVisibleCharacters || currentLine > m_maxVisibleLines || (m_overflowMode == TextOverflowModes.Page && m_textInfo.characterInfo[i].pageNumber + 1 != m_pageToDisplay))\n                        isStrikeThroughVisible = false;\n\n                    if (beginStrikethrough == false && isStrikeThroughVisible && i <= lineInfo.lastVisibleCharacterIndex && currentCharacter != 10 && currentCharacter != 13)\n                    {\n                        if (i == lineInfo.lastVisibleCharacterIndex && char.IsSeparator(currentCharacter))\n                        { }\n                        else\n                        {\n                            beginStrikethrough = true;\n                            strikethroughPointSize = m_textInfo.characterInfo[i].pointSize;\n                            strikethroughScale = m_textInfo.characterInfo[i].scale;\n                            strikethrough_start = new Vector3(m_textInfo.characterInfo[i].bottomLeft.x, m_textInfo.characterInfo[i].baseLine + strikethroughOffset * strikethroughScale, 0);\n                            strikethroughColor = m_textInfo.characterInfo[i].strikethroughColor;\n                            strikethroughBaseline = m_textInfo.characterInfo[i].baseLine;\n                            //Debug.Log(\"Char [\" + currentCharacter + \"] Start Strikethrough POS: \" + strikethrough_start);\n                        }\n                    }\n\n                    // End Strikethrough if text only contains one character.\n                    if (beginStrikethrough && m_characterCount == 1)\n                    {\n                        beginStrikethrough = false;\n                        strikethrough_end = new Vector3(m_textInfo.characterInfo[i].topRight.x, m_textInfo.characterInfo[i].baseLine + strikethroughOffset * strikethroughScale, 0);\n\n                        DrawUnderlineMesh(strikethrough_start, strikethrough_end, ref last_vert_index, strikethroughScale, strikethroughScale, strikethroughScale, xScale, strikethroughColor);\n                    }\n                    else if (beginStrikethrough && i == lineInfo.lastCharacterIndex)\n                    {\n                        // Terminate Strikethrough at previous visible character if space or carriage return.\n                        if (char.IsWhiteSpace(currentCharacter) || currentCharacter == 0x200B)\n                        {\n                            int lastVisibleCharacterIndex = lineInfo.lastVisibleCharacterIndex;\n                            strikethrough_end = new Vector3(m_textInfo.characterInfo[lastVisibleCharacterIndex].topRight.x, m_textInfo.characterInfo[lastVisibleCharacterIndex].baseLine + strikethroughOffset * strikethroughScale, 0);\n                        }\n                        else\n                        {\n                            // Terminate Strikethrough at last character of line.\n                            strikethrough_end = new Vector3(m_textInfo.characterInfo[i].topRight.x, m_textInfo.characterInfo[i].baseLine + strikethroughOffset * strikethroughScale, 0);\n                        }\n\n                        beginStrikethrough = false;\n                        DrawUnderlineMesh(strikethrough_start, strikethrough_end, ref last_vert_index, strikethroughScale, strikethroughScale, strikethroughScale, xScale, strikethroughColor);\n                    }\n                    else if (beginStrikethrough && i < m_characterCount && (m_textInfo.characterInfo[i + 1].pointSize != strikethroughPointSize || !TMP_Math.Approximately(m_textInfo.characterInfo[i + 1].baseLine + offset.y, strikethroughBaseline)))\n                    {\n                        // Terminate Strikethrough if scale changes.\n                        beginStrikethrough = false;\n\n                        int lastVisibleCharacterIndex = lineInfo.lastVisibleCharacterIndex;\n                        if (i > lastVisibleCharacterIndex)\n                            strikethrough_end = new Vector3(m_textInfo.characterInfo[lastVisibleCharacterIndex].topRight.x, m_textInfo.characterInfo[lastVisibleCharacterIndex].baseLine + strikethroughOffset * strikethroughScale, 0);\n                        else\n                            strikethrough_end = new Vector3(m_textInfo.characterInfo[i].topRight.x, m_textInfo.characterInfo[i].baseLine + strikethroughOffset * strikethroughScale, 0);\n\n                        DrawUnderlineMesh(strikethrough_start, strikethrough_end, ref last_vert_index, strikethroughScale, strikethroughScale, strikethroughScale, xScale, strikethroughColor);\n                        //Debug.Log(\"Char [\" + currentCharacter + \"] at Index: \" + i + \"  End Strikethrough POS: \" + strikethrough_end + \"  Baseline: \" + m_textInfo.characterInfo[i].baseLine.ToString(\"f3\"));\n                    }\n                    else if (beginStrikethrough && i < m_characterCount && currentFontAsset.GetInstanceID() != characterInfos[i + 1].fontAsset.GetInstanceID())\n                    {\n                        // Terminate Strikethrough if font asset changes.\n                        beginStrikethrough = false;\n                        strikethrough_end = new Vector3(m_textInfo.characterInfo[i].topRight.x, m_textInfo.characterInfo[i].baseLine + strikethroughOffset * strikethroughScale, 0);\n\n                        DrawUnderlineMesh(strikethrough_start, strikethrough_end, ref last_vert_index, strikethroughScale, strikethroughScale, strikethroughScale, xScale, strikethroughColor);\n                    }\n                    else if (beginStrikethrough && !isStrikeThroughVisible)\n                    {\n                        // Terminate Strikethrough if character is not visible.\n                        beginStrikethrough = false;\n                        strikethrough_end = new Vector3(m_textInfo.characterInfo[i - 1].topRight.x, m_textInfo.characterInfo[i - 1].baseLine + strikethroughOffset * strikethroughScale, 0);\n\n                        DrawUnderlineMesh(strikethrough_start, strikethrough_end, ref last_vert_index, strikethroughScale, strikethroughScale, strikethroughScale, xScale, strikethroughColor);\n                    }\n                }\n                else\n                {\n                    // End Strikethrough\n                    if (beginStrikethrough == true)\n                    {\n                        beginStrikethrough = false;\n                        strikethrough_end = new Vector3(m_textInfo.characterInfo[i - 1].topRight.x, m_textInfo.characterInfo[i - 1].baseLine + strikethroughOffset * strikethroughScale, 0);\n\n                        DrawUnderlineMesh(strikethrough_start, strikethrough_end, ref last_vert_index, strikethroughScale, strikethroughScale, strikethroughScale, xScale, strikethroughColor);\n                    }\n                }\n                #endregion\n\n\n                // HANDLE TEXT HIGHLIGHTING\n                #region Text Highlighting\n                bool isHighlight = (m_textInfo.characterInfo[i].style & FontStyles.Highlight) == FontStyles.Highlight;\n                if (isHighlight)\n                {\n                    bool isHighlightVisible = true;\n                    int currentPage = m_textInfo.characterInfo[i].pageNumber;\n\n                    if (i > m_maxVisibleCharacters || currentLine > m_maxVisibleLines || (m_overflowMode == TextOverflowModes.Page && currentPage + 1 != m_pageToDisplay))\n                        isHighlightVisible = false;\n\n                    if (beginHighlight == false && isHighlightVisible == true && i <= lineInfo.lastVisibleCharacterIndex && currentCharacter != 10 && currentCharacter != 13)\n                    {\n                        if (i == lineInfo.lastVisibleCharacterIndex && char.IsSeparator(currentCharacter))\n                        { }\n                        else\n                        {\n                            beginHighlight = true;\n                            highlight_start = k_LargePositiveVector2;\n                            highlight_end = k_LargeNegativeVector2;\n                            highlightColor = m_textInfo.characterInfo[i].highlightColor;\n                        }\n                    }\n\n                    if (beginHighlight)\n                    {\n                        Color32 currentHighlightColor = m_textInfo.characterInfo[i].highlightColor;\n                        bool isColorTransition = false;\n\n                        // Handle Highlight color changes\n                        if (!highlightColor.Compare(currentHighlightColor))\n                        {\n                            // End drawing at the start of new highlight color to prevent a gap between highlight sections.\n                            highlight_end.x = (highlight_end.x + m_textInfo.characterInfo[i].bottomLeft.x) / 2;\n\n                            highlight_start.y = Mathf.Min(highlight_start.y, m_textInfo.characterInfo[i].descender);\n                            highlight_end.y = Mathf.Max(highlight_end.y, m_textInfo.characterInfo[i].ascender);\n\n                            DrawTextHighlight(highlight_start, highlight_end, ref last_vert_index, highlightColor);\n\n                            beginHighlight = true;\n                            highlight_start = highlight_end;\n\n                            highlight_end = new Vector3(m_textInfo.characterInfo[i].topRight.x, m_textInfo.characterInfo[i].descender, 0);\n                            highlightColor = m_textInfo.characterInfo[i].highlightColor;\n\n                            isColorTransition = true;\n                        }\n\n                        if (!isColorTransition)\n                        {\n                            // Use the Min / Max Extents of the Highlight area to handle different character sizes and fonts.\n                            highlight_start.x = Mathf.Min(highlight_start.x, m_textInfo.characterInfo[i].bottomLeft.x);\n                            highlight_start.y = Mathf.Min(highlight_start.y, m_textInfo.characterInfo[i].descender);\n\n                            highlight_end.x = Mathf.Max(highlight_end.x, m_textInfo.characterInfo[i].topRight.x);\n                            highlight_end.y = Mathf.Max(highlight_end.y, m_textInfo.characterInfo[i].ascender); \n                        }\n                    }\n\n                    // End Highlight if text only contains one character.\n                    if (beginHighlight && m_characterCount == 1)\n                    {\n                        beginHighlight = false;\n\n                        DrawTextHighlight(highlight_start, highlight_end, ref last_vert_index, highlightColor);\n                    }\n                    else if (beginHighlight && (i == lineInfo.lastCharacterIndex || i >= lineInfo.lastVisibleCharacterIndex))\n                    {\n                        beginHighlight = false;\n                        DrawTextHighlight(highlight_start, highlight_end, ref last_vert_index, highlightColor);\n                    }\n                    else if (beginHighlight && !isHighlightVisible)\n                    {\n                        beginHighlight = false;\n                        DrawTextHighlight(highlight_start, highlight_end, ref last_vert_index, highlightColor);\n                    }\n                }\n                else\n                {\n                    // End Highlight\n                    if (beginHighlight == true)\n                    {\n                        beginHighlight = false;\n                        DrawTextHighlight(highlight_start, highlight_end, ref last_vert_index, highlightColor);\n                    }\n                }\n                #endregion\n\n\n                lastLine = currentLine;\n            }\n            #endregion\n\n\n            // METRICS ABOUT THE TEXT OBJECT\n            m_textInfo.characterCount = m_characterCount;\n            m_textInfo.spriteCount = m_spriteCount;\n            m_textInfo.lineCount = lineCount;\n            m_textInfo.wordCount = wordCount != 0 && m_characterCount > 0 ? wordCount : 1;\n            m_textInfo.pageCount = m_pageNumber + 1;\n\n\n            ////Profiler.BeginSample(\"TMP Generate Text - Phase III\");\n            // Update Mesh Vertex Data\n            if (m_renderMode == TextRenderFlags.Render && IsActive())\n            {\n                // Clear unused vertices\n                //m_textInfo.meshInfo[0].ClearUnusedVertices();\n\n                // Sort the geometry of the text object if needed.\n                if (m_geometrySortingOrder != VertexSortingOrder.Normal)\n                    m_textInfo.meshInfo[0].SortGeometry(VertexSortingOrder.Reverse);\n\n                // Upload Mesh Data\n                m_mesh.MarkDynamic();\n                m_mesh.vertices = m_textInfo.meshInfo[0].vertices;\n                m_mesh.uv = m_textInfo.meshInfo[0].uvs0;\n                m_mesh.uv2 = m_textInfo.meshInfo[0].uvs2;\n                //m_mesh.uv4 = m_textInfo.meshInfo[0].uvs4;\n                m_mesh.colors32 = m_textInfo.meshInfo[0].colors32;\n\n                // Compute Bounds for the mesh. Manual computation is more efficient then using Mesh.recalcualteBounds.\n                m_mesh.RecalculateBounds();\n                //m_mesh.bounds = new Bounds(new Vector3((m_meshExtents.max.x + m_meshExtents.min.x) / 2, (m_meshExtents.max.y + m_meshExtents.min.y) / 2, 0) + offset, new Vector3(m_meshExtents.max.x - m_meshExtents.min.x, m_meshExtents.max.y - m_meshExtents.min.y, 0));\n\n                for (int i = 1; i < m_textInfo.materialCount; i++)\n                {\n                    // Clear unused vertices\n                    m_textInfo.meshInfo[i].ClearUnusedVertices();\n\n                    if (m_subTextObjects[i] == null) continue;\n\n                    // Sort the geometry of the sub-text objects if needed.\n                    if (m_geometrySortingOrder != VertexSortingOrder.Normal)\n                        m_textInfo.meshInfo[i].SortGeometry(VertexSortingOrder.Reverse);\n\n                    m_subTextObjects[i].mesh.vertices = m_textInfo.meshInfo[i].vertices;\n                    m_subTextObjects[i].mesh.uv = m_textInfo.meshInfo[i].uvs0;\n                    m_subTextObjects[i].mesh.uv2 = m_textInfo.meshInfo[i].uvs2;\n                    //m_subTextObjects[i].mesh.uv4 = m_textInfo.meshInfo[i].uvs4;\n                    m_subTextObjects[i].mesh.colors32 = m_textInfo.meshInfo[i].colors32;\n\n                    m_subTextObjects[i].mesh.RecalculateBounds();\n\n                    // Update the collider on the sub text object\n                    //m_subTextObjects[i].UpdateColliders(m_textInfo.meshInfo[i].vertexCount);\n                }\n            }\n\n            // Event indicating the text has been regenerated.\n            TMPro_EventManager.ON_TEXT_CHANGED(this);\n\n            ////Profiler.EndSample();\n            //Debug.Log(\"Done Rendering Text.\");\n        }\n\n\n        /// <summary>\n        /// Method to return the local corners of the Text Container or RectTransform.\n        /// </summary>\n        /// <returns></returns>\n        protected override Vector3[] GetTextContainerLocalCorners()\n        {\n            if (m_rectTransform == null) m_rectTransform = this.rectTransform;\n\n            m_rectTransform.GetLocalCorners(m_RectTransformCorners);\n\n            return m_RectTransformCorners;\n        }\n\n\n        /// <summary>\n        /// Method to disable the renderers.\n        /// </summary>\n        void SetMeshFilters(bool state)\n        {\n            // Parent text object\n            if (m_meshFilter != null)\n            {\n                if (state)\n                    m_meshFilter.sharedMesh = m_mesh;\n                else\n                    m_meshFilter.sharedMesh = null;\n            }\n\n            for (int i = 1; i < m_subTextObjects.Length && m_subTextObjects[i] != null; i++)\n            {\n                if (m_subTextObjects[i].meshFilter != null)\n                {\n                    if (state)\n                        m_subTextObjects[i].meshFilter.sharedMesh = m_subTextObjects[i].mesh;\n                    else\n                        m_subTextObjects[i].meshFilter.sharedMesh = null;\n                }\n            }\n        }\n\n\n        /// <summary>\n        /// Method to Enable or Disable child SubMesh objects.\n        /// </summary>\n        /// <param name=\"state\"></param>\n        protected override void SetActiveSubMeshes(bool state)\n        {\n            for (int i = 1; i < m_subTextObjects.Length && m_subTextObjects[i] != null; i++)\n            {\n                if (m_subTextObjects[i].enabled != state)\n                    m_subTextObjects[i].enabled = state;\n            }\n        }\n\n\n        /// <summary>\n        /// Destroy Sub Mesh Objects\n        /// </summary>\n        protected override void ClearSubMeshObjects()\n        {\n            for (int i = 1; i < m_subTextObjects.Length && m_subTextObjects[i] != null; i++)\n            {\n                Debug.Log(\"Destroying Sub Text object[\" + i + \"].\");\n                DestroyImmediate(m_subTextObjects[i]);\n            }\n        }\n\n\n        /// <summary>\n        ///  Method returning the compound bounds of the text object and child sub objects.\n        /// </summary>\n        /// <returns></returns>\n        protected override Bounds GetCompoundBounds()\n        {\n            Bounds mainBounds = m_mesh.bounds;\n            Vector3 min = mainBounds.min;\n            Vector3 max = mainBounds.max;\n\n            for (int i = 1; i < m_subTextObjects.Length && m_subTextObjects[i] != null; i++)\n            {\n                Bounds subBounds = m_subTextObjects[i].mesh.bounds;\n                min.x = min.x < subBounds.min.x ? min.x : subBounds.min.x;\n                min.y = min.y < subBounds.min.y ? min.y : subBounds.min.y;\n\n                max.x = max.x > subBounds.max.x ? max.x : subBounds.max.x;\n                max.y = max.y > subBounds.max.y ? max.y : subBounds.max.y;\n            }\n\n            Vector3 center = (min + max) / 2;\n            Vector2 size = max - min;\n            return new Bounds(center, size);\n        }\n\n\n        /// <summary>\n        /// Method to Update Scale in UV2\n        /// </summary>\n        //void UpdateSDFScale(float lossyScale)\n        //{\n        //    // TODO: Resolve - Underline / Strikethrough segments not getting their SDF Scale adjusted.\n\n        //    //Debug.Log(\"*** UpdateSDFScale() ***\");\n\n        //    // Iterate through each of the characters.\n        //    for (int i = 0; i < m_textInfo.characterCount; i++)\n        //    {\n        //        // Only update scale for visible characters.\n        //        if (m_textInfo.characterInfo[i].isVisible && m_textInfo.characterInfo[i].elementType == TMP_TextElementType.Character)\n        //        {\n        //            float scale = lossyScale * m_textInfo.characterInfo[i].scale * (1 - m_charWidthAdjDelta);\n        //            if (!m_textInfo.characterInfo[i].isUsingAlternateTypeface && (m_textInfo.characterInfo[i].style & FontStyles.Bold) == FontStyles.Bold) scale *= -1;\n\n        //            int index = m_textInfo.characterInfo[i].materialReferenceIndex;\n        //            int vertexIndex = m_textInfo.characterInfo[i].vertexIndex;\n\n        //            m_textInfo.meshInfo[index].uvs2[vertexIndex + 0].y = scale;\n        //            m_textInfo.meshInfo[index].uvs2[vertexIndex + 1].y = scale;\n        //            m_textInfo.meshInfo[index].uvs2[vertexIndex + 2].y = scale;\n        //            m_textInfo.meshInfo[index].uvs2[vertexIndex + 3].y = scale;\n        //        }\n        //    }\n\n        //    // Push the updated uv2 scale information to the meshes.\n        //    for (int i = 0; i < m_textInfo.meshInfo.Length; i++)\n        //    {\n        //        if (i == 0)\n        //            m_mesh.uv2 = m_textInfo.meshInfo[0].uvs2;\n        //        else\n        //            m_subTextObjects[i].mesh.uv2 = m_textInfo.meshInfo[i].uvs2;\n        //    }\n        //}\n\n        /// <summary>\n        /// Method to update the SDF Scale in UV2.\n        /// </summary>\n        /// <param name=\"scaleDelta\"></param>\n        void UpdateSDFScale(float scaleDelta)\n        {\n            if (scaleDelta == 0 || scaleDelta == float.PositiveInfinity)\n            {\n                m_havePropertiesChanged = true;\n                OnPreRenderObject();\n                return;\n            }\n\n            for (int materialIndex = 0; materialIndex < m_textInfo.materialCount; materialIndex++)\n            {\n                TMP_MeshInfo meshInfo = m_textInfo.meshInfo[materialIndex];\n\n                for (int i = 0; i < meshInfo.uvs2.Length; i++)\n                {\n                    meshInfo.uvs2[i].y *= Mathf.Abs(scaleDelta);\n                }\n            }\n\n            // Push the updated uv2 scale information to the meshes.\n            for (int i = 0; i < m_textInfo.meshInfo.Length; i++)\n            {\n                if (i == 0)\n                    m_mesh.uv2 = m_textInfo.meshInfo[0].uvs2;\n                else\n                    m_subTextObjects[i].mesh.uv2 = m_textInfo.meshInfo[i].uvs2;\n            }\n        }\n\n\n        // Function to offset vertices position to account for line spacing changes.\n        protected override void AdjustLineOffset(int startIndex, int endIndex, float offset)\n        {\n            Vector3 vertexOffset = new Vector3(0, offset, 0);\n\n            for (int i = startIndex; i <= endIndex; i++)\n            {\n                m_textInfo.characterInfo[i].bottomLeft -= vertexOffset;\n                m_textInfo.characterInfo[i].topLeft -= vertexOffset;\n                m_textInfo.characterInfo[i].topRight -= vertexOffset;\n                m_textInfo.characterInfo[i].bottomRight -= vertexOffset;\n\n                m_textInfo.characterInfo[i].ascender -= vertexOffset.y;\n                m_textInfo.characterInfo[i].baseLine -= vertexOffset.y;\n                m_textInfo.characterInfo[i].descender -= vertexOffset.y;\n\n                if (m_textInfo.characterInfo[i].isVisible)\n                {\n                    m_textInfo.characterInfo[i].vertex_BL.position -= vertexOffset;\n                    m_textInfo.characterInfo[i].vertex_TL.position -= vertexOffset;\n                    m_textInfo.characterInfo[i].vertex_TR.position -= vertexOffset;\n                    m_textInfo.characterInfo[i].vertex_BR.position -= vertexOffset;\n                }\n            }\n        }\n\n    }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMPro_Private.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 8f8b248abe6b4dcebd6cdd0d754717f4\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {fileID: 2800000, guid: 8e098d8d28c5182419f7a1c8b91ca722, type: 3}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMPro_UGUI_Private.cs",
    "content": "//#define TMP_PROFILE_ON\n//#define TMP_PROFILE_PHASES_ON\n\n\nusing UnityEngine;\nusing UnityEngine.TextCore;\nusing System;\nusing System.Collections.Generic;\nusing UnityEngine.UI;\n\n#pragma warning disable 0414 // Disabled a few warnings related to serialized variables not used in this script but used in the editor.\n#pragma warning disable 0618 // Disabled warning due to SetVertices being deprecated until new release with SetMesh() is available.\n\nnamespace TMPro\n{\n\n    public partial class TextMeshProUGUI\n    {\n        [SerializeField]\n        private bool m_hasFontAssetChanged = false; // Used to track when font properties have changed.\n\n        [SerializeField]\n        protected TMP_SubMeshUI[] m_subTextObjects = new TMP_SubMeshUI[8];\n\n        private float m_previousLossyScaleY = -1; // Used for Tracking lossy scale changes in the transform;\n\n        private Vector3[] m_RectTransformCorners = new Vector3[4];\n        private CanvasRenderer m_canvasRenderer;\n        private Canvas m_canvas;\n\n\n        private bool m_isFirstAllocation; // Flag to determine if this is the first allocation of the buffers.\n        private int m_max_characters = 8; // Determines the initial allocation and size of the character array / buffer.\n        //private int m_max_numberOfLines = 4; // Determines the initial allocation and maximum number of lines of text. \n\n        // MASKING RELATED PROPERTIES\n        private bool m_isMaskingEnabled;\n        // This property is now obsolete and used for compatibility with previous releases (prior to release 0.1.54).\n        [SerializeField]\n        private Material m_baseMaterial;\n\n\n        private bool m_isScrollRegionSet;\n        //private Mask m_mask;\n        private int m_stencilID = 0;\n      \n        [SerializeField]\n        private Vector4 m_maskOffset;\n\n        // Matrix used to animated Env Map\n        private Matrix4x4 m_EnvMapMatrix = new Matrix4x4();\n\n\n        //private bool m_isEnabled;\n        [NonSerialized]\n        private bool m_isRegisteredForEvents;\n\n        // DEBUG Variables\n        //private System.Diagnostics.Stopwatch m_StopWatch;\n        //private int frame = 0;\n        //private int m_recursiveCount = 0;\n        private int m_recursiveCountA = 0;\n        private int loopCountA = 0;\n        //private int loopCountB = 0;\n        //private int loopCountC = 0;\n        //private int loopCountD = 0;\n        //private int loopCountE = 0;\n\n        //[SerializeField]\n        //private new Material m_MaskMaterial;\n\n\n        protected override void Awake()\n        {\n            //Debug.Log(\"***** Awake() called on object ID \" + GetInstanceID() + \". *****\");\n\n            #if UNITY_EDITOR\n            // Special handling for TMP Settings and importing Essential Resources\n            if (TMP_Settings.instance == null)\n            {\n                if (m_isWaitingOnResourceLoad == false)\n                    TMPro_EventManager.RESOURCE_LOAD_EVENT.Add(ON_RESOURCES_LOADED);\n\n                m_isWaitingOnResourceLoad = true;\n                return;\n            }\n            #endif\n\n            // Cache Reference to the Canvas\n            m_canvas = this.canvas;\n\n            m_isOrthographic = true;\n\n            // Cache Reference to RectTransform.\n            m_rectTransform = gameObject.GetComponent<RectTransform>();\n            if (m_rectTransform == null)  \n                m_rectTransform = gameObject.AddComponent<RectTransform>();\n\n            // Cache a reference to the CanvasRenderer.\n            m_canvasRenderer = GetComponent<CanvasRenderer>();\n            if (m_canvasRenderer == null) \n                m_canvasRenderer = gameObject.AddComponent<CanvasRenderer> ();\n\n            if (m_mesh == null)\n            {\n                m_mesh = new Mesh();\n                m_mesh.hideFlags = HideFlags.HideAndDontSave;\n\n                // Create new TextInfo for the text object.\n                m_textInfo = new TMP_TextInfo(this);\n            }\n\n            // Load TMP Settings for new text object instances.\n            LoadDefaultSettings();\n\n            // Load the font asset and assign material to renderer.\n            LoadFontAsset();\n\n            // Load Default TMP StyleSheet\n            TMP_StyleSheet.LoadDefaultStyleSheet();\n\n            // Allocate our initial buffers.\n            if (m_TextParsingBuffer == null)\n                m_TextParsingBuffer = new UnicodeChar[m_max_characters];\n\n            m_cached_TextElement = new TMP_Character();\n            m_isFirstAllocation = true;\n\n            // Check if we have a font asset assigned. Return if we don't because no one likes to see purple squares on screen.\n            if (m_fontAsset == null)\n            {\n                Debug.LogWarning(\"Please assign a Font Asset to this \" + transform.name + \" gameobject.\", this);\n                return;\n            }\n\n            // Check to make sure Sub Text Objects are tracked correctly in the event a Prefab is used.\n            TMP_SubMeshUI[] subTextObjects = GetComponentsInChildren<TMP_SubMeshUI>();\n            if (subTextObjects.Length > 0)\n            {\n                for (int i = 0; i < subTextObjects.Length; i++)\n                    m_subTextObjects[i + 1] = subTextObjects[i];\n            }\n\n            // Set flags to ensure our text is parsed and redrawn.\n            m_isInputParsingRequired = true;\n            m_havePropertiesChanged = true;\n            m_isCalculateSizeRequired = true;\n\n            m_isAwake = true;\n        }\n\n\n        protected override void OnEnable()\n        {\n            //Debug.Log(\"***** OnEnable() called on object ID \" + GetInstanceID() + \". *****\");\n\n            // Return if Awake() has not been called on the text object.\n            if (m_isAwake == false)\n                return;\n\n            if (!m_isRegisteredForEvents)\n            {\n                //Debug.Log(\"Registering for Events.\");\n                \n                #if UNITY_EDITOR\n                // Register Callbacks for various events.\n                TMPro_EventManager.MATERIAL_PROPERTY_EVENT.Add(ON_MATERIAL_PROPERTY_CHANGED);\n                TMPro_EventManager.FONT_PROPERTY_EVENT.Add(ON_FONT_PROPERTY_CHANGED);\n                TMPro_EventManager.TEXTMESHPRO_UGUI_PROPERTY_EVENT.Add(ON_TEXTMESHPRO_UGUI_PROPERTY_CHANGED);\n                TMPro_EventManager.DRAG_AND_DROP_MATERIAL_EVENT.Add(ON_DRAG_AND_DROP_MATERIAL);\n                TMPro_EventManager.TEXT_STYLE_PROPERTY_EVENT.Add(ON_TEXT_STYLE_CHANGED);\n                TMPro_EventManager.COLOR_GRADIENT_PROPERTY_EVENT.Add(ON_COLOR_GRADIENT_CHANGED);\n                TMPro_EventManager.TMP_SETTINGS_PROPERTY_EVENT.Add(ON_TMP_SETTINGS_CHANGED);\n                #endif\n                m_isRegisteredForEvents = true;\n            }\n\n            // Cache Reference to the Canvas\n            m_canvas = GetCanvas();\n\n            SetActiveSubMeshes(true);\n\n            // Register Graphic Component to receive event triggers\n            GraphicRegistry.RegisterGraphicForCanvas(m_canvas, this);\n\n            // Register text object for updates\n            TMP_UpdateManager.RegisterTextObjectForUpdate(this);\n\n            ComputeMarginSize();\n\n            m_verticesAlreadyDirty = false;\n            m_layoutAlreadyDirty = false;\n            m_ShouldRecalculateStencil = true;\n            m_isInputParsingRequired = true;\n            SetAllDirty();\n\n            RecalculateClipping();\n        }\n\n\n        protected override void OnDisable()\n        {\n            //Debug.Log(\"***** OnDisable() called on object ID \" + GetInstanceID() + \". *****\");\n\n            // Return if Awake() has not been called on the text object.\n            if (m_isAwake == false)\n                return;\n\n            if (m_MaskMaterial != null)\n            { \n                TMP_MaterialManager.ReleaseStencilMaterial(m_MaskMaterial);\n                m_MaskMaterial = null;\n            }\n\n            // UnRegister Graphic Component\n            GraphicRegistry.UnregisterGraphicForCanvas(m_canvas, this);\n            CanvasUpdateRegistry.UnRegisterCanvasElementForRebuild((ICanvasElement)this);\n\n            TMP_UpdateManager.UnRegisterTextObjectForUpdate(this);\n\n            if (m_canvasRenderer != null)\n                m_canvasRenderer.Clear();\n\n            SetActiveSubMeshes(false);\n\n            LayoutRebuilder.MarkLayoutForRebuild(m_rectTransform);\n            RecalculateClipping();\n        }\n\n\n        protected override void OnDestroy()\n        {\n            //Debug.Log(\"***** OnDestroy() called on object ID \" + GetInstanceID() + \". *****\");\n\n            // UnRegister Graphic Component\n            GraphicRegistry.UnregisterGraphicForCanvas(m_canvas, this);\n\n            TMP_UpdateManager.UnRegisterTextObjectForUpdate(this);\n\n            // Clean up remaining mesh\n            if (m_mesh != null)\n                DestroyImmediate(m_mesh);\n\n            // Clean up mask material\n            if (m_MaskMaterial != null)\n            {\n                TMP_MaterialManager.ReleaseStencilMaterial(m_MaskMaterial);\n                m_MaskMaterial = null;\n            }\n\n            #if UNITY_EDITOR\n            // Unregister the event this object was listening to\n            TMPro_EventManager.MATERIAL_PROPERTY_EVENT.Remove(ON_MATERIAL_PROPERTY_CHANGED);\n            TMPro_EventManager.FONT_PROPERTY_EVENT.Remove(ON_FONT_PROPERTY_CHANGED);\n            TMPro_EventManager.TEXTMESHPRO_UGUI_PROPERTY_EVENT.Remove(ON_TEXTMESHPRO_UGUI_PROPERTY_CHANGED);\n            TMPro_EventManager.DRAG_AND_DROP_MATERIAL_EVENT.Remove(ON_DRAG_AND_DROP_MATERIAL);\n            TMPro_EventManager.TEXT_STYLE_PROPERTY_EVENT.Remove(ON_TEXT_STYLE_CHANGED);\n            TMPro_EventManager.COLOR_GRADIENT_PROPERTY_EVENT.Remove(ON_COLOR_GRADIENT_CHANGED);\n            TMPro_EventManager.TMP_SETTINGS_PROPERTY_EVENT.Remove(ON_TMP_SETTINGS_CHANGED);\n            TMPro_EventManager.RESOURCE_LOAD_EVENT.Remove(ON_RESOURCES_LOADED);\n            #endif\n            m_isRegisteredForEvents = false;\n        }\n\n\n        #if UNITY_EDITOR\n        protected override void Reset()\n        {\n            //Debug.Log(\"***** Reset() *****\"); //has been called.\");\n\n            // Return if Awake() has not been called on the text object.\n            if (m_isAwake == false)\n                return;\n\n            LoadDefaultSettings();\n            LoadFontAsset();\n\n            m_isInputParsingRequired = true;\n            m_havePropertiesChanged = true;\n        }\n\n\n        protected override void OnValidate()\n        {\n            //Debug.Log(\"***** OnValidate() ***** Frame:\" + Time.frameCount); // ID \" + GetInstanceID()); // New Material [\" + m_sharedMaterial.name + \"] with ID \" + m_sharedMaterial.GetInstanceID() + \". Base Material is [\" + m_baseMaterial.name + \"] with ID \" + m_baseMaterial.GetInstanceID() + \". Previous Base Material is [\" + (m_lastBaseMaterial == null ? \"Null\" : m_lastBaseMaterial.name) + \"].\");\n\n            // Return if Awake() has not been called on the text object.\n            if (m_isAwake == false)\n                return;\n\n            // Handle Font Asset changes in the inspector.\n            if (m_fontAsset == null || m_hasFontAssetChanged)\n            {\n                LoadFontAsset();\n                m_isCalculateSizeRequired = true;\n                m_hasFontAssetChanged = false;\n            }\n\n\n            if (m_canvasRenderer == null || m_canvasRenderer.GetMaterial() == null || m_canvasRenderer.GetMaterial().GetTexture(ShaderUtilities.ID_MainTex) == null || m_fontAsset == null || m_fontAsset.atlasTexture.GetInstanceID() != m_canvasRenderer.GetMaterial().GetTexture(ShaderUtilities.ID_MainTex).GetInstanceID())\n            {\n                LoadFontAsset();\n                m_isCalculateSizeRequired = true;\n                m_hasFontAssetChanged = false;\n            }\n\n            m_padding = GetPaddingForMaterial();\n            ComputeMarginSize();\n\n            m_isInputParsingRequired = true;\n            m_inputSource = TextInputSources.Text;\n            m_havePropertiesChanged = true;\n            m_isCalculateSizeRequired = true;\n            m_isPreferredWidthDirty = true;\n            m_isPreferredHeightDirty = true;\n\n            SetAllDirty();\n        }\n\n\n        // Event received when TMP resources have been loaded.\n        void ON_RESOURCES_LOADED()\n        {\n            TMPro_EventManager.RESOURCE_LOAD_EVENT.Remove(ON_RESOURCES_LOADED);\n\n            if (this == null)\n                return;\n\n            Awake();\n            OnEnable();\n        }\n\n\n        // Event received when custom material editor properties are changed.\n        void ON_MATERIAL_PROPERTY_CHANGED(bool isChanged, Material mat)\n        {\n            //Debug.Log(\"ON_MATERIAL_PROPERTY_CHANGED event received.\"); // Targeted Material is: \" + mat.name + \"  m_sharedMaterial: \" + m_sharedMaterial.name + \" with ID:\" + m_sharedMaterial.GetInstanceID() + \"  m_renderer.sharedMaterial: \" + m_canvasRenderer.GetMaterial() + \"  Masking Material:\" + m_MaskMaterial.GetInstanceID());\n\n            ShaderUtilities.GetShaderPropertyIDs(); // Initialize ShaderUtilities and get shader property IDs.\n\n            int materialID = mat.GetInstanceID();\n            int sharedMaterialID = m_sharedMaterial.GetInstanceID();\n            int maskingMaterialID = m_MaskMaterial == null ? 0 : m_MaskMaterial.GetInstanceID();\n\n            if (m_canvasRenderer == null || m_canvasRenderer.GetMaterial() == null)\n            {\n                if (m_canvasRenderer == null) return;\n\n                if (m_fontAsset != null)\n                {\n                    m_canvasRenderer.SetMaterial(m_fontAsset.material, m_sharedMaterial.GetTexture(ShaderUtilities.ID_MainTex));\n                    //Debug.LogWarning(\"No Material was assigned to \" + name + \". \" + m_fontAsset.material.name + \" was assigned.\");\n                }\n                else\n                    Debug.LogWarning(\"No Font Asset assigned to \" + name + \". Please assign a Font Asset.\", this);\n            }\n\n\n            if (m_canvasRenderer.GetMaterial() != m_sharedMaterial && m_fontAsset == null) //    || m_renderer.sharedMaterials.Contains(mat))\n            {\n                //Debug.Log(\"ON_MATERIAL_PROPERTY_CHANGED Called on Target ID: \" + GetInstanceID() + \". Previous Material:\" + m_sharedMaterial + \"  New Material:\" + m_uiRenderer.GetMaterial()); // on Object ID:\" + GetInstanceID() + \". m_sharedMaterial: \" + m_sharedMaterial.name + \"  m_renderer.sharedMaterial: \" + m_renderer.sharedMaterial.name);         \n                m_sharedMaterial = m_canvasRenderer.GetMaterial();\n            }\n\n\n            // Make sure material properties are synchronized between the assigned material and masking material.\n            if (m_MaskMaterial != null)\n            {\n                UnityEditor.Undo.RecordObject(m_MaskMaterial, \"Material Property Changes\");\n                UnityEditor.Undo.RecordObject(m_sharedMaterial, \"Material Property Changes\");\n\n                if (materialID == sharedMaterialID)\n                {\n                    //Debug.Log(\"Copy base material properties to masking material if not null.\");\n                    float stencilID = m_MaskMaterial.GetFloat(ShaderUtilities.ID_StencilID);\n                    float stencilComp = m_MaskMaterial.GetFloat(ShaderUtilities.ID_StencilComp);\n                    //float stencilOp = m_MaskMaterial.GetFloat(ShaderUtilities.ID_StencilOp);\n                    //float stencilRead = m_MaskMaterial.GetFloat(ShaderUtilities.ID_StencilReadMask);\n                    //float stencilWrite = m_MaskMaterial.GetFloat(ShaderUtilities.ID_StencilWriteMask);\n\n                    m_MaskMaterial.CopyPropertiesFromMaterial(mat);\n                    m_MaskMaterial.shaderKeywords = mat.shaderKeywords;\n\n                    m_MaskMaterial.SetFloat(ShaderUtilities.ID_StencilID, stencilID);\n                    m_MaskMaterial.SetFloat(ShaderUtilities.ID_StencilComp, stencilComp);\n                    //m_MaskMaterial.SetFloat(ShaderUtilities.ID_StencilOp, stencilOp);\n                    //m_MaskMaterial.SetFloat(ShaderUtilities.ID_StencilReadMask, stencilID);\n                    //m_MaskMaterial.SetFloat(ShaderUtilities.ID_StencilWriteMask, 0);\n                }\n                else if (materialID == maskingMaterialID)\n                {\n                    // Update the padding \n                    GetPaddingForMaterial(mat);\n\n                    m_sharedMaterial.CopyPropertiesFromMaterial(mat);\n                    m_sharedMaterial.shaderKeywords = mat.shaderKeywords;\n                    m_sharedMaterial.SetFloat(ShaderUtilities.ID_StencilID, 0);\n                    m_sharedMaterial.SetFloat(ShaderUtilities.ID_StencilComp, 8);\n                    //m_sharedMaterial.SetFloat(ShaderUtilities.ID_StencilOp, 0);\n                    //m_sharedMaterial.SetFloat(ShaderUtilities.ID_StencilReadMask, 255);\n                    //m_sharedMaterial.SetFloat(ShaderUtilities.ID_StencilWriteMask, 255);\n                }\n\n            }\n\n            m_padding = GetPaddingForMaterial();\n            m_havePropertiesChanged = true;\n            SetVerticesDirty();\n            //SetMaterialDirty();\n        }\n\n\n        // Event received when font asset properties are changed in Font Inspector\n        void ON_FONT_PROPERTY_CHANGED(bool isChanged, TMP_FontAsset font)\n        {\n            if (MaterialReference.Contains(m_materialReferences, font))\n            {\n                //Debug.Log(\"ON_FONT_PROPERTY_CHANGED event received.\");\n                m_isInputParsingRequired = true;\n                m_havePropertiesChanged = true;\n\n                UpdateMeshPadding();\n\n                SetLayoutDirty();\n                SetVerticesDirty();\n            }\n        }\n\n\n        // Event received when UNDO / REDO Event alters the properties of the object.\n        void ON_TEXTMESHPRO_UGUI_PROPERTY_CHANGED(bool isChanged, TextMeshProUGUI obj)\n        {\n            //Debug.Log(\"Event Received by \" + obj);\n            \n            if (obj == this)\n            {\n                //Debug.Log(\"Undo / Redo Event Received by Object ID:\" + GetInstanceID());\n                m_havePropertiesChanged = true;\n                m_isInputParsingRequired = true;\n\n                ComputeMarginSize(); // Review this change\n                SetVerticesDirty();\n            }\n        }\n\n\n        // Event to Track Material Changed resulting from Drag-n-drop.\n        void ON_DRAG_AND_DROP_MATERIAL(GameObject obj, Material currentMaterial, Material newMaterial)\n        {\n            //Debug.Log(\"Drag-n-Drop Event - Receiving Object ID \" + GetInstanceID() + \". Sender ID \" + obj.GetInstanceID()); // +  \". Prefab Parent is \" + UnityEditor.PrefabUtility.GetPrefabParent(gameObject).GetInstanceID()); // + \". New Material is \" + newMaterial.name + \" with ID \" + newMaterial.GetInstanceID() + \". Base Material is \" + m_baseMaterial.name + \" with ID \" + m_baseMaterial.GetInstanceID());\n\n            // Check if event applies to this current object\n            #if UNITY_2018_2_OR_NEWER\n            if (obj == gameObject || UnityEditor.PrefabUtility.GetCorrespondingObjectFromSource(gameObject) == obj)\n            #else\n            if (obj == gameObject || UnityEditor.PrefabUtility.GetPrefabParent(gameObject) == obj)\n            #endif\n            {\n                UnityEditor.Undo.RecordObject(this, \"Material Assignment\");\n                UnityEditor.Undo.RecordObject(m_canvasRenderer, \"Material Assignment\");\n\n                m_sharedMaterial = newMaterial;\n\n                m_padding = GetPaddingForMaterial();\n\n                m_havePropertiesChanged = true;\n                SetVerticesDirty();\n                SetMaterialDirty();\n            }\n        }\n\n\n        // Event received when Text Styles are changed.\n        void ON_TEXT_STYLE_CHANGED(bool isChanged)\n        {\n            m_havePropertiesChanged = true;\n            m_isInputParsingRequired = true;\n            SetVerticesDirty();\n        }\n\n\n        /// <summary>\n        /// Event received when a Color Gradient Preset is modified.\n        /// </summary>\n        /// <param name=\"textObject\"></param>\n        void ON_COLOR_GRADIENT_CHANGED(TMP_ColorGradient gradient)\n        {\n            if (m_fontColorGradientPreset != null && gradient.GetInstanceID() == m_fontColorGradientPreset.GetInstanceID())\n            {\n                m_havePropertiesChanged = true;\n                SetVerticesDirty();\n            }\n        }\n\n\n        /// <summary>\n        /// Event received when the TMP Settings are changed.\n        /// </summary>\n        void ON_TMP_SETTINGS_CHANGED()\n        {\n            m_defaultSpriteAsset = null;\n            m_havePropertiesChanged = true;\n            m_isInputParsingRequired = true;\n            SetAllDirty();\n        }\n        #endif\n\n\n        // Function which loads either the default font or a newly assigned font asset. This function also assigned the appropriate material to the renderer.\n        protected override void LoadFontAsset()\n        {\n            //Debug.Log(\"***** LoadFontAsset() *****\"); //TextMeshPro LoadFontAsset() has been called.\"); // Current Font Asset is \" + (font != null ? font.name: \"Null\") );\n            \n            ShaderUtilities.GetShaderPropertyIDs(); // Initialize & Get shader property IDs.\n\n            if (m_fontAsset == null)\n            {\n                if (TMP_Settings.defaultFontAsset != null)\n                    m_fontAsset = TMP_Settings.defaultFontAsset;\n                else\n                    m_fontAsset = Resources.Load<TMP_FontAsset>(\"Fonts & Materials/LiberationSans SDF\");\n\n                if (m_fontAsset == null)\n                {\n                    Debug.LogWarning(\"The LiberationSans SDF Font Asset was not found. There is no Font Asset assigned to \" + gameObject.name + \".\", this);\n                    return;\n                }\n\n                if (m_fontAsset.characterLookupTable == null)\n                {\n                    Debug.Log(\"Dictionary is Null!\");\n                }\n\n                m_sharedMaterial = m_fontAsset.material;\n            }\n            else\n            {\n                // Read font definition if needed.\n                if (m_fontAsset.characterLookupTable == null)\n                    m_fontAsset.ReadFontAssetDefinition();\n\n                // Added for compatibility with previous releases.\n                if (m_sharedMaterial == null && m_baseMaterial != null)\n                {\n                    m_sharedMaterial = m_baseMaterial;\n                    m_baseMaterial = null;\n                }\n\n                // If font atlas texture doesn't match the assigned material font atlas, switch back to default material specified in the Font Asset.\n                if (m_sharedMaterial == null || m_sharedMaterial.GetTexture(ShaderUtilities.ID_MainTex) == null || m_fontAsset.atlasTexture.GetInstanceID() != m_sharedMaterial.GetTexture(ShaderUtilities.ID_MainTex).GetInstanceID())\n                {\n                    if (m_fontAsset.material == null)\n                        Debug.LogWarning(\"The Font Atlas Texture of the Font Asset \" + m_fontAsset.name + \" assigned to \" + gameObject.name + \" is missing.\", this);\n                    else\n                        m_sharedMaterial = m_fontAsset.material;\n                }\n            }\n\n\n            // Find and cache Underline & Ellipsis characters.\n            GetSpecialCharacters(m_fontAsset);\n\n            m_padding = GetPaddingForMaterial();\n\n            SetMaterialDirty();\n        }\n\n\n        /// <summary>\n        /// Method to retrieve the parent Canvas.\n        /// </summary>\n        private Canvas GetCanvas()\n        {\n            Canvas canvas = null;\n            var list = TMP_ListPool<Canvas>.Get();\n\n            gameObject.GetComponentsInParent(false, list);\n            if (list.Count > 0)\n            {\n                // Find the first active and enabled canvas.\n                for (int i = 0; i < list.Count; ++i)\n                {\n                    if (list[i].isActiveAndEnabled)\n                    {\n                        canvas = list[i];\n                        break;\n                    }\n                }\n            }\n\n            TMP_ListPool<Canvas>.Release(list);\n\n            return canvas;\n        }\n\n\n        /// <summary>\n        /// Method used when animating the Env Map on the material.\n        /// </summary>\n        void UpdateEnvMapMatrix()\n        {\n            if (!m_sharedMaterial.HasProperty(ShaderUtilities.ID_EnvMap) || m_sharedMaterial.GetTexture(ShaderUtilities.ID_EnvMap) == null)\n                return;\n\n            //Debug.Log(\"Updating Env Matrix...\");\n            Vector3 rotation = m_sharedMaterial.GetVector(ShaderUtilities.ID_EnvMatrixRotation);\n            m_EnvMapMatrix = Matrix4x4.TRS(Vector3.zero, Quaternion.Euler(rotation), Vector3.one);\n\n            m_sharedMaterial.SetMatrix(ShaderUtilities.ID_EnvMatrix, m_EnvMapMatrix);\n        }\n\n\n        // Enable Masking in the Shader\n        void EnableMasking()\n        {\n            if (m_fontMaterial == null)\n            {\n                m_fontMaterial = CreateMaterialInstance(m_sharedMaterial);\n                m_canvasRenderer.SetMaterial(m_fontMaterial, m_sharedMaterial.GetTexture(ShaderUtilities.ID_MainTex));\n            }\n\n            m_sharedMaterial = m_fontMaterial;\n            if (m_sharedMaterial.HasProperty(ShaderUtilities.ID_ClipRect))\n            {\n                m_sharedMaterial.EnableKeyword(ShaderUtilities.Keyword_MASK_SOFT);\n                m_sharedMaterial.DisableKeyword(ShaderUtilities.Keyword_MASK_HARD);\n                m_sharedMaterial.DisableKeyword(ShaderUtilities.Keyword_MASK_TEX);\n\n                UpdateMask(); // Update Masking Coordinates\n            }\n\n            m_isMaskingEnabled = true;\n\n            //m_uiRenderer.SetMaterial(m_sharedMaterial, null);\n\n            //m_padding = ShaderUtilities.GetPadding(m_sharedMaterial, m_enableExtraPadding, m_isUsingBold);\n            //m_alignmentPadding = ShaderUtilities.GetFontExtent(m_sharedMaterial);\n\n            /*\n            Material mat = m_uiRenderer.GetMaterial();\n            if (mat.HasProperty(ShaderUtilities.ID_MaskCoord))\n            {\n                mat.EnableKeyword(\"MASK_SOFT\");\n                mat.DisableKeyword(\"MASK_HARD\");\n                mat.DisableKeyword(\"MASK_OFF\");\n\n                m_isMaskingEnabled = true;\n                UpdateMask();\n            }\n            */\n        }\n\n\n        // Enable Masking in the Shader\n        void DisableMasking()\n        {\n            if (m_fontMaterial != null)\n            {\n                if (m_stencilID > 0)\n                    m_sharedMaterial = m_MaskMaterial;\n                else\n                    m_sharedMaterial = m_baseMaterial;\n                           \n                m_canvasRenderer.SetMaterial(m_sharedMaterial, m_sharedMaterial.GetTexture(ShaderUtilities.ID_MainTex));\n\n                DestroyImmediate(m_fontMaterial);\n            }\n              \n            m_isMaskingEnabled = false;\n            \n            /*\n            if (m_maskingMaterial != null && m_stencilID == 0)\n            {\n                m_sharedMaterial = m_baseMaterial;\n                m_uiRenderer.SetMaterial(m_sharedMaterial, null);\n            }\n            else if (m_stencilID > 0)\n            {\n                m_sharedMaterial.EnableKeyword(\"MASK_OFF\");\n                m_sharedMaterial.DisableKeyword(\"MASK_HARD\");\n                m_sharedMaterial.DisableKeyword(\"MASK_SOFT\");\n            }\n            */\n             \n          \n            /*\n            Material mat = m_uiRenderer.GetMaterial();\n            if (mat.HasProperty(ShaderUtilities.ID_MaskCoord))\n            {\n                mat.EnableKeyword(\"MASK_OFF\");\n                mat.DisableKeyword(\"MASK_HARD\");\n                mat.DisableKeyword(\"MASK_SOFT\");\n\n                m_isMaskingEnabled = false;\n                UpdateMask();\n            }\n            */\n        }\n\n\n        // Update & recompute Mask offset\n        void UpdateMask()\n        {\n            //Debug.Log(\"Updating Mask...\");\n\n            if (m_rectTransform != null)\n            {\n                //Material mat = m_uiRenderer.GetMaterial();\n                //if (mat == null || (m_overflowMode == TextOverflowModes.ScrollRect && m_isScrollRegionSet))\n                //    return;\n\n                if (!ShaderUtilities.isInitialized)\n                    ShaderUtilities.GetShaderPropertyIDs();\n                \n                //Debug.Log(\"Setting Mask for the first time.\");\n\n                m_isScrollRegionSet = true;\n\n                float softnessX = Mathf.Min(Mathf.Min(m_margin.x, m_margin.z), m_sharedMaterial.GetFloat(ShaderUtilities.ID_MaskSoftnessX));\n                float softnessY = Mathf.Min(Mathf.Min(m_margin.y, m_margin.w), m_sharedMaterial.GetFloat(ShaderUtilities.ID_MaskSoftnessY));\n\n                softnessX = softnessX > 0 ? softnessX : 0;\n                softnessY = softnessY > 0 ? softnessY : 0;\n\n                float width = (m_rectTransform.rect.width - Mathf.Max(m_margin.x, 0) - Mathf.Max(m_margin.z, 0)) / 2 + softnessX;\n                float height = (m_rectTransform.rect.height - Mathf.Max(m_margin.y, 0) - Mathf.Max(m_margin.w, 0)) / 2 + softnessY;\n\n                \n                Vector2 center = m_rectTransform.localPosition + new Vector3((0.5f - m_rectTransform.pivot.x) * m_rectTransform.rect.width + (Mathf.Max(m_margin.x, 0) - Mathf.Max(m_margin.z, 0)) / 2, (0.5f - m_rectTransform.pivot.y) * m_rectTransform.rect.height + (-Mathf.Max(m_margin.y, 0) + Mathf.Max(m_margin.w, 0)) / 2);\n        \n                //Vector2 center = m_rectTransform.localPosition + new Vector3((0.5f - m_rectTransform.pivot.x) * m_rectTransform.rect.width + (margin.x - margin.z) / 2, (0.5f - m_rectTransform.pivot.y) * m_rectTransform.rect.height + (-margin.y + margin.w) / 2);\n                Vector4 mask = new Vector4(center.x, center.y, width, height);\n                //Debug.Log(mask);\n\n\n\n                //Rect rect = new Rect(0, 0, m_rectTransform.rect.width + margin.x + margin.z, m_rectTransform.rect.height + margin.y + margin.w);\n                //int softness = (int)m_sharedMaterial.GetFloat(ShaderUtilities.ID_MaskSoftnessX) / 2;\n                m_sharedMaterial.SetVector(ShaderUtilities.ID_ClipRect, mask);\n            }\n        }\n\n\n        // Function called internally when a new material is assigned via the fontMaterial property.\n        protected override Material GetMaterial(Material mat)\n        {\n            // Get Shader PropertyIDs if they haven't been cached already.\n            ShaderUtilities.GetShaderPropertyIDs();\n            \n            // Check in case Object is disabled. If so, we don't have a valid reference to the Renderer.\n            // This can occur when the Duplicate Material Context menu is used on an inactive object.\n            //if (m_canvasRenderer == null)\n            //    m_canvasRenderer = GetComponent<CanvasRenderer>();\n\n            // Create Instance Material only if the new material is not the same instance previously used.\n            if (m_fontMaterial == null || m_fontMaterial.GetInstanceID() != mat.GetInstanceID())\n                m_fontMaterial = CreateMaterialInstance(mat);\n\n            m_sharedMaterial = m_fontMaterial;\n\n            m_padding = GetPaddingForMaterial();\n\n            m_ShouldRecalculateStencil = true;\n            SetVerticesDirty();\n            SetMaterialDirty();\n\n            return m_sharedMaterial;\n        }\n\n\n        /// <summary>\n        /// Method returning instances of the materials used by the text object.\n        /// </summary>\n        /// <returns></returns>\n        protected override Material[] GetMaterials(Material[] mats)\n        {\n            int materialCount = m_textInfo.materialCount;\n\n            if (m_fontMaterials == null)\n                m_fontMaterials = new Material[materialCount];\n            else if (m_fontMaterials.Length != materialCount)\n                TMP_TextInfo.Resize(ref m_fontMaterials, materialCount, false);\n\n            // Get instances of the materials\n            for (int i = 0; i < materialCount; i++)\n            {\n                if (i == 0)\n                    m_fontMaterials[i] = fontMaterial;\n                else\n                    m_fontMaterials[i] = m_subTextObjects[i].material;\n            }\n\n            m_fontSharedMaterials = m_fontMaterials;\n\n            return m_fontMaterials;\n        }\n\n\n        // Function called internally when a new shared material is assigned via the fontSharedMaterial property.\n        protected override void SetSharedMaterial(Material mat) \n        {\n            // Check in case Object is disabled. If so, we don't have a valid reference to the Renderer.\n            // This can occur when the Duplicate Material Context menu is used on an inactive object. \n            //if (m_canvasRenderer == null)\n            //    m_canvasRenderer = GetComponent<CanvasRenderer>();\n\n            m_sharedMaterial = mat;\n\n            m_padding = GetPaddingForMaterial();\n\n            SetMaterialDirty();\n        }\n\n\n        /// <summary>\n        /// Method returning an array containing the materials used by the text object.\n        /// </summary>\n        /// <returns></returns>\n        protected override Material[] GetSharedMaterials()\n        {\n            int materialCount = m_textInfo.materialCount;\n\n            if (m_fontSharedMaterials == null)\n                m_fontSharedMaterials = new Material[materialCount];\n            else if (m_fontSharedMaterials.Length != materialCount)\n                TMP_TextInfo.Resize(ref m_fontSharedMaterials, materialCount, false);\n\n            for (int i = 0; i < materialCount; i++)\n            {\n                if (i == 0)\n                    m_fontSharedMaterials[i] = m_sharedMaterial;\n                else\n                    m_fontSharedMaterials[i] = m_subTextObjects[i].sharedMaterial;\n            }\n\n            return m_fontSharedMaterials;\n        }\n\n\n        /// <summary>\n        /// Method used to assign new materials to the text and sub text objects.\n        /// </summary>\n        protected override void SetSharedMaterials(Material[] materials)\n        {\n            int materialCount = m_textInfo.materialCount;\n\n            // Check allocation of the fontSharedMaterials array.\n            if (m_fontSharedMaterials == null)\n                m_fontSharedMaterials = new Material[materialCount];\n            else if (m_fontSharedMaterials.Length != materialCount)\n                TMP_TextInfo.Resize(ref m_fontSharedMaterials, materialCount, false);\n\n            // Only assign as many materials as the text object contains.\n            for (int i = 0; i < materialCount; i++)\n            {\n                if (i == 0)\n                {\n                    // Only assign new material if the font atlas textures match.\n                    if (materials[i].GetTexture(ShaderUtilities.ID_MainTex) == null || materials[i].GetTexture(ShaderUtilities.ID_MainTex).GetInstanceID() != m_sharedMaterial.GetTexture(ShaderUtilities.ID_MainTex).GetInstanceID())\n                        continue;\n\n                    m_sharedMaterial = m_fontSharedMaterials[i] = materials[i];\n                    m_padding = GetPaddingForMaterial(m_sharedMaterial);\n                }\n                else\n                {\n                    // Only assign new material if the font atlas textures match.\n                    if (materials[i].GetTexture(ShaderUtilities.ID_MainTex) == null || materials[i].GetTexture(ShaderUtilities.ID_MainTex).GetInstanceID() != m_subTextObjects[i].sharedMaterial.GetTexture(ShaderUtilities.ID_MainTex).GetInstanceID())\n                        continue;\n\n                    // Only assign a new material if none were specified in the text input.\n                    if (m_subTextObjects[i].isDefaultMaterial)\n                        m_subTextObjects[i].sharedMaterial = m_fontSharedMaterials[i] = materials[i];\n                }\n            }\n        }\n\n\n        // This function will create an instance of the Font Material.\n        protected override void SetOutlineThickness(float thickness)\n        {\n            // Use material instance if one exists. Otherwise, create a new instance of the shared material.\n            if (m_fontMaterial != null && m_sharedMaterial.GetInstanceID() != m_fontMaterial.GetInstanceID())\n            {\n                m_sharedMaterial = m_fontMaterial;\n                m_canvasRenderer.SetMaterial(m_sharedMaterial, m_sharedMaterial.GetTexture(ShaderUtilities.ID_MainTex));\n            }\n            else if(m_fontMaterial == null)\n            {\n                m_fontMaterial = CreateMaterialInstance(m_sharedMaterial);\n                m_sharedMaterial = m_fontMaterial;\n                m_canvasRenderer.SetMaterial(m_sharedMaterial, m_sharedMaterial.GetTexture(ShaderUtilities.ID_MainTex));\n            }\n\n            thickness = Mathf.Clamp01(thickness);\n            m_sharedMaterial.SetFloat(ShaderUtilities.ID_OutlineWidth, thickness);\n            m_padding = GetPaddingForMaterial();\n        }\n\n\n        // This function will create an instance of the Font Material.\n        protected override void SetFaceColor(Color32 color)\n        {\n            // Use material instance if one exists. Otherwise, create a new instance of the shared material.\n            if (m_fontMaterial == null)\n                m_fontMaterial = CreateMaterialInstance(m_sharedMaterial);\n\n            m_sharedMaterial = m_fontMaterial;\n            m_padding = GetPaddingForMaterial();\n\n            m_sharedMaterial.SetColor(ShaderUtilities.ID_FaceColor, color);\n        }\n\n\n        // This function will create an instance of the Font Material.\n        protected override void SetOutlineColor(Color32 color)\n        {\n            // Use material instance if one exists. Otherwise, create a new instance of the shared material.\n            if (m_fontMaterial == null)\n                m_fontMaterial = CreateMaterialInstance(m_sharedMaterial);\n\n            m_sharedMaterial = m_fontMaterial;\n            m_padding = GetPaddingForMaterial();\n\n            m_sharedMaterial.SetColor(ShaderUtilities.ID_OutlineColor, color);\n        }\n\n\n        // Sets the Render Queue and Ztest mode \n        protected override void SetShaderDepth()\n        {\n            if (m_canvas == null || m_sharedMaterial == null)\n                return;\n\n            if (m_canvas.renderMode == RenderMode.ScreenSpaceOverlay || m_isOverlay)\n            {\n                // Should this use an instanced material?\n                m_sharedMaterial.SetFloat(ShaderUtilities.ShaderTag_ZTestMode, 0);\n            }\n            else\n            {   // TODO: This section needs to be tested.\n                m_sharedMaterial.SetFloat(ShaderUtilities.ShaderTag_ZTestMode, 4);\n            }\n        }\n\n\n        // Sets the Culling mode of the material\n        protected override void SetCulling()\n        {\n            if (m_isCullingEnabled)\n            {\n                Material mat = materialForRendering;\n\n                if (mat != null)\n                    mat.SetFloat(\"_CullMode\", 2);\n\n                for (int i = 1; i < m_subTextObjects.Length && m_subTextObjects[i] != null; i++)\n                {\n                    mat = m_subTextObjects[i].materialForRendering;\n\n                    if (mat != null)\n                    {\n                        mat.SetFloat(ShaderUtilities.ShaderTag_CullMode, 2);\n                    }\n                }\n            }\n            else\n            {\n                Material mat = materialForRendering;\n\n                if (mat != null)\n                    mat.SetFloat(\"_CullMode\", 0);\n\n                for (int i = 1; i < m_subTextObjects.Length && m_subTextObjects[i] != null; i++)\n                {\n                    mat = m_subTextObjects[i].materialForRendering;\n\n                    if (mat != null)\n                    {\n                        mat.SetFloat(ShaderUtilities.ShaderTag_CullMode, 0);\n                    }\n                }\n            }\n        }\n\n\n        // Set Perspective Correction Mode based on whether Camera is Orthographic or Perspective\n        void SetPerspectiveCorrection()\n        {\n            if (m_isOrthographic)\n                m_sharedMaterial.SetFloat(ShaderUtilities.ID_PerspectiveFilter, 0.0f);\n            else\n                m_sharedMaterial.SetFloat(ShaderUtilities.ID_PerspectiveFilter, 0.875f);\n        }\n\n\n        /// <summary>\n        /// Get the padding value for the currently assigned material.\n        /// </summary>\n        /// <returns></returns>\n        protected override float GetPaddingForMaterial(Material mat)\n        {\n            m_padding = ShaderUtilities.GetPadding(mat, m_enableExtraPadding, m_isUsingBold);\n            m_isMaskingEnabled = ShaderUtilities.IsMaskingEnabled(m_sharedMaterial);\n            m_isSDFShader = mat.HasProperty(ShaderUtilities.ID_WeightNormal);\n\n            return m_padding;\n        }\n\n\n        /// <summary>\n        /// Get the padding value for the currently assigned material.\n        /// </summary>\n        /// <returns></returns>\n        protected override float GetPaddingForMaterial()\n        {\n            ShaderUtilities.GetShaderPropertyIDs();\n\n            m_padding = ShaderUtilities.GetPadding(m_sharedMaterial, m_enableExtraPadding, m_isUsingBold);\n            m_isMaskingEnabled = ShaderUtilities.IsMaskingEnabled(m_sharedMaterial);\n            m_isSDFShader = m_sharedMaterial.HasProperty(ShaderUtilities.ID_WeightNormal);\n\n            return m_padding;\n        }\n\n        // Function to allocate the necessary buffers to render the text. This function is called whenever the buffer size needs to be increased.\n        void SetMeshArrays(int size)\n        {\n            m_textInfo.meshInfo[0].ResizeMeshInfo(size);\n\n            m_canvasRenderer.SetMesh(m_textInfo.meshInfo[0].mesh);\n        }\n\n\n        // This function parses through the Char[] to determine how many characters will be visible. It then makes sure the arrays are large enough for all those characters.\n        protected override int SetArraySizes(UnicodeChar[] chars)\n        {\n            //Debug.Log(\"*** SetArraySizes() on Instance ID (\" + GetInstanceID() + \") ***\");\n            #if TMP_PROFILE_ON\n            Profiler.BeginSample(\"SetArraySizes\");\n            #endif\n\n            int spriteCount = 0;\n\n            m_totalCharacterCount = 0;\n            m_isUsingBold = false;\n            m_isParsingText = false;\n            tag_NoParsing = false;\n            m_FontStyleInternal = m_fontStyle;\n\n            m_FontWeightInternal = (m_FontStyleInternal & FontStyles.Bold) == FontStyles.Bold ? FontWeight.Bold : m_fontWeight;\n            m_FontWeightStack.SetDefault(m_FontWeightInternal);\n\n            m_currentFontAsset = m_fontAsset;\n            m_currentMaterial = m_sharedMaterial;\n            m_currentMaterialIndex = 0;\n\n            m_materialReferenceStack.SetDefault(new MaterialReference(m_currentMaterialIndex, m_currentFontAsset, null, m_currentMaterial, m_padding));\n\n            m_materialReferenceIndexLookup.Clear();\n            MaterialReference.AddMaterialReference(m_currentMaterial, m_currentFontAsset, m_materialReferences, m_materialReferenceIndexLookup);\n\n            if (m_textInfo == null) m_textInfo = new TMP_TextInfo();\n            m_textElementType = TMP_TextElementType.Character;\n\n            // Clear Linked Text object if we have one.\n            if (m_linkedTextComponent != null)\n            {\n                m_linkedTextComponent.text = string.Empty;\n                m_linkedTextComponent.ForceMeshUpdate();\n            }\n\n            // Parsing XML tags in the text\n            for (int i = 0; i < chars.Length && chars[i].unicode != 0; i++)\n            {\n                //Make sure the characterInfo array can hold the next text element.\n                if (m_textInfo.characterInfo == null || m_totalCharacterCount >= m_textInfo.characterInfo.Length)\n                    TMP_TextInfo.Resize(ref m_textInfo.characterInfo, m_totalCharacterCount + 1, true);\n\n                int unicode = chars[i].unicode;\n\n                // PARSE XML TAGS\n                #region PARSE XML TAGS\n                if (m_isRichText && unicode == 60) // if Char '<'\n                {\n                    int prev_MaterialIndex = m_currentMaterialIndex;\n\n                    // Check if Tag is Valid\n                    if (ValidateHtmlTag(chars, i + 1, out int tagEnd))\n                    {\n                        int tagStartIndex = chars[i].stringIndex;\n                        i = tagEnd;\n\n                        if ((m_FontStyleInternal & FontStyles.Bold) == FontStyles.Bold) m_isUsingBold = true;\n\n                        if (m_textElementType == TMP_TextElementType.Sprite)\n                        {\n                            m_materialReferences[m_currentMaterialIndex].referenceCount += 1;\n\n                            m_textInfo.characterInfo[m_totalCharacterCount].character = (char)(57344 + m_spriteIndex);\n                            m_textInfo.characterInfo[m_totalCharacterCount].spriteIndex = m_spriteIndex;\n                            m_textInfo.characterInfo[m_totalCharacterCount].fontAsset = m_currentFontAsset;\n                            m_textInfo.characterInfo[m_totalCharacterCount].spriteAsset = m_currentSpriteAsset;\n                            m_textInfo.characterInfo[m_totalCharacterCount].materialReferenceIndex = m_currentMaterialIndex;\n                            m_textInfo.characterInfo[m_totalCharacterCount].textElement = m_currentSpriteAsset.spriteCharacterTable[m_spriteIndex];\n                            m_textInfo.characterInfo[m_totalCharacterCount].elementType = m_textElementType;\n                            m_textInfo.characterInfo[m_totalCharacterCount].index = tagStartIndex;\n                            m_textInfo.characterInfo[m_totalCharacterCount].stringLength = chars[i].stringIndex - tagStartIndex + 1;\n\n                            // Restore element type and material index to previous values.\n                            m_textElementType = TMP_TextElementType.Character;\n                            m_currentMaterialIndex = prev_MaterialIndex;\n\n                            spriteCount += 1;\n                            m_totalCharacterCount += 1;\n                        }\n\n                        continue;\n                    }\n                }\n                #endregion\n\n                bool isUsingAlternativeTypeface = false;\n                bool isUsingFallbackOrAlternativeTypeface = false;\n\n                TMP_Character character;\n                TMP_FontAsset tempFontAsset;\n                TMP_FontAsset prev_fontAsset = m_currentFontAsset;\n                Material prev_material = m_currentMaterial;\n                int prev_materialIndex = m_currentMaterialIndex;\n\n\n                // Handle Font Styles like LowerCase, UpperCase and SmallCaps.\n                #region Handling of LowerCase, UpperCase and SmallCaps Font Styles\n                if (m_textElementType == TMP_TextElementType.Character)\n                {\n                    if ((m_FontStyleInternal & FontStyles.UpperCase) == FontStyles.UpperCase)\n                    {\n                        // If this character is lowercase, switch to uppercase.\n                        if (char.IsLower((char)unicode))\n                            unicode = char.ToUpper((char)unicode);\n\n                    }\n                    else if ((m_FontStyleInternal & FontStyles.LowerCase) == FontStyles.LowerCase)\n                    {\n                        // If this character is uppercase, switch to lowercase.\n                        if (char.IsUpper((char)unicode))\n                            unicode = char.ToLower((char)unicode);\n                    }\n                    else if ((m_FontStyleInternal & FontStyles.SmallCaps) == FontStyles.SmallCaps)\n                    {\n                        // Only convert lowercase characters to uppercase.\n                        if (char.IsLower((char)unicode))\n                            unicode = char.ToUpper((char)unicode);\n                    }\n                }\n                #endregion\n\n\n                // Lookup the Glyph data for each character and cache it.\n                #region LOOKUP GLYPH\n                character = TMP_FontAssetUtilities.GetCharacterFromFontAsset((uint)unicode, m_currentFontAsset, false, m_FontStyleInternal, m_FontWeightInternal, out isUsingAlternativeTypeface, out tempFontAsset);\n\n                // Search for the glyph in the list of fallback assigned to the primary font asset.\n                if (character == null)\n                {\n                    if (m_currentFontAsset.fallbackFontAssetTable != null && m_currentFontAsset.fallbackFontAssetTable.Count > 0)\n                        character = TMP_FontAssetUtilities.GetCharacterFromFontAssets((uint)unicode, m_currentFontAsset.fallbackFontAssetTable, true, m_FontStyleInternal, m_FontWeightInternal, out isUsingAlternativeTypeface, out tempFontAsset);\n                }\n\n                // Search for the glyph in the Sprite Asset assigned to the text object.\n                if (character == null)\n                {\n                    TMP_SpriteAsset spriteAsset = this.spriteAsset;\n\n                    if (spriteAsset != null)\n                    {\n                        int spriteIndex = -1;\n\n                        // Check Default Sprite Asset and its Fallbacks\n                        spriteAsset = TMP_SpriteAsset.SearchForSpriteByUnicode(spriteAsset, (uint)unicode, true, out spriteIndex);\n\n                        if (spriteIndex != -1)\n                        {\n                            m_textElementType = TMP_TextElementType.Sprite;\n                            m_textInfo.characterInfo[m_totalCharacterCount].elementType = m_textElementType;\n\n                            m_currentMaterialIndex = MaterialReference.AddMaterialReference(spriteAsset.material, spriteAsset, m_materialReferences, m_materialReferenceIndexLookup);\n                            m_materialReferences[m_currentMaterialIndex].referenceCount += 1;\n\n                            m_textInfo.characterInfo[m_totalCharacterCount].character = (char)unicode;\n                            m_textInfo.characterInfo[m_totalCharacterCount].spriteIndex = spriteIndex;\n                            m_textInfo.characterInfo[m_totalCharacterCount].fontAsset = m_currentFontAsset;\n                            m_textInfo.characterInfo[m_totalCharacterCount].spriteAsset = spriteAsset;\n                            m_textInfo.characterInfo[m_totalCharacterCount].textElement = spriteAsset.spriteCharacterTable[m_spriteIndex];\n                            m_textInfo.characterInfo[m_totalCharacterCount].materialReferenceIndex = m_currentMaterialIndex;\n                            m_textInfo.characterInfo[m_totalCharacterCount].index = chars[i].stringIndex;\n                            m_textInfo.characterInfo[m_totalCharacterCount].stringLength = chars[i].length;\n\n                            // Restore element type and material index to previous values.\n                            m_textElementType = TMP_TextElementType.Character;\n                            m_currentMaterialIndex = prev_materialIndex;\n\n                            spriteCount += 1;\n                            m_totalCharacterCount += 1;\n\n                            continue;\n                        }\n                    }\n                }\n\n                // Search for the glyph in the list of fallback assigned in the TMP Settings (General Fallbacks).\n                if (character == null)\n                {\n                    if (TMP_Settings.fallbackFontAssets != null && TMP_Settings.fallbackFontAssets.Count > 0)\n                        character = TMP_FontAssetUtilities.GetCharacterFromFontAssets((uint)unicode, TMP_Settings.fallbackFontAssets, true, m_FontStyleInternal, m_FontWeightInternal, out isUsingAlternativeTypeface, out tempFontAsset);\n                }\n\n                // Search for the glyph in the Default Font Asset assigned in the TMP Settings file.\n                if (character == null)\n                {\n                    if (TMP_Settings.defaultFontAsset != null)\n                        character = TMP_FontAssetUtilities.GetCharacterFromFontAsset((uint)unicode, TMP_Settings.defaultFontAsset, true, m_FontStyleInternal, m_FontWeightInternal, out isUsingAlternativeTypeface, out tempFontAsset);\n                }\n\n                // TODO: Add support for using Sprite Assets like a special Emoji only Sprite Asset when UTF16 or UTF32 glyphs are requested.\n                // This would kind of mirror native Emoji support.\n                if (character == null)\n                {\n                    TMP_SpriteAsset spriteAsset = TMP_Settings.defaultSpriteAsset;\n\n                    if (spriteAsset != null)\n                    {\n                        int spriteIndex = -1;\n\n                        // Check Default Sprite Asset and its Fallbacks\n                        spriteAsset = TMP_SpriteAsset.SearchForSpriteByUnicode(spriteAsset, (uint)unicode, true, out spriteIndex);\n\n                        if (spriteIndex != -1)\n                        {\n                            m_textElementType = TMP_TextElementType.Sprite;\n                            m_textInfo.characterInfo[m_totalCharacterCount].elementType = m_textElementType;\n\n                            m_currentMaterialIndex = MaterialReference.AddMaterialReference(spriteAsset.material, spriteAsset, m_materialReferences, m_materialReferenceIndexLookup);\n                            m_materialReferences[m_currentMaterialIndex].referenceCount += 1;\n\n                            m_textInfo.characterInfo[m_totalCharacterCount].character = (char)unicode;\n                            m_textInfo.characterInfo[m_totalCharacterCount].spriteIndex = spriteIndex;\n                            m_textInfo.characterInfo[m_totalCharacterCount].fontAsset = m_currentFontAsset;\n                            m_textInfo.characterInfo[m_totalCharacterCount].spriteAsset = spriteAsset;\n                            m_textInfo.characterInfo[m_totalCharacterCount].textElement = spriteAsset.spriteCharacterTable[m_spriteIndex];\n                            m_textInfo.characterInfo[m_totalCharacterCount].materialReferenceIndex = m_currentMaterialIndex;\n                            m_textInfo.characterInfo[m_totalCharacterCount].index = chars[i].stringIndex;\n                            m_textInfo.characterInfo[m_totalCharacterCount].stringLength = chars[i].length;\n\n                            // Restore element type and material index to previous values.\n                            m_textElementType = TMP_TextElementType.Character;\n                            m_currentMaterialIndex = prev_materialIndex;\n\n                            spriteCount += 1;\n                            m_totalCharacterCount += 1;\n\n                            continue;\n                        }\n\n                    }\n                }\n\n                //Check if Lowercase or Uppercase variant of the character is available.\n                // Not sure this is necessary anyone as it is very unlikely with recursive search through fallback fonts.\n                //if (glyph == null)\n                //{\n                //    if (char.IsLower((char)c))\n                //    {\n                //        if (m_currentFontAsset.characterDictionary.TryGetValue(char.ToUpper((char)c), out glyph))\n                //            c = chars[i] = char.ToUpper((char)c);\n                //    }\n                //    else if (char.IsUpper((char)c))\n                //    {\n                //        if (m_currentFontAsset.characterDictionary.TryGetValue(char.ToLower((char)c), out glyph))\n                //            c = chars[i] = char.ToLower((char)c);\n                //    }\n                //}\n\n                // Replace missing glyph by the Square (9633) glyph or possibly the Space (32) glyph.\n                if (character == null)\n                {\n                    // Save the original unicode character\n                    int srcGlyph = unicode;\n\n                    // Try replacing the missing glyph character by TMP Settings Missing Glyph or Square (9633) character.\n                    unicode = chars[i].unicode = TMP_Settings.missingGlyphCharacter == 0 ? 9633 : TMP_Settings.missingGlyphCharacter;\n\n                    // Check for the missing glyph character in the currently assigned font asset and its fallbacks\n                    character = TMP_FontAssetUtilities.GetCharacterFromFontAsset((uint)unicode, m_currentFontAsset, true, m_FontStyleInternal, m_FontWeightInternal, out isUsingAlternativeTypeface, out tempFontAsset);\n\n                    if (character == null)\n                    {\n                        // Search for the missing glyph character in the TMP Settings Fallback list.\n                        if (TMP_Settings.fallbackFontAssets != null && TMP_Settings.fallbackFontAssets.Count > 0)\n                            character = TMP_FontAssetUtilities.GetCharacterFromFontAssets((uint)unicode, TMP_Settings.fallbackFontAssets, true, m_FontStyleInternal, m_FontWeightInternal, out isUsingAlternativeTypeface, out tempFontAsset);\n                    }\n\n                    if (character == null)\n                    {\n                        // Search for the missing glyph in the TMP Settings Default Font Asset.\n                        if (TMP_Settings.defaultFontAsset != null)\n                            character = TMP_FontAssetUtilities.GetCharacterFromFontAsset((uint)unicode, TMP_Settings.defaultFontAsset, true, m_FontStyleInternal, m_FontWeightInternal, out isUsingAlternativeTypeface, out tempFontAsset);\n                    }\n\n                    if (character == null)\n                    {\n                        // Use Space (32) Glyph from the currently assigned font asset.\n                        unicode = chars[i].unicode = 32;\n                        character = TMP_FontAssetUtilities.GetCharacterFromFontAsset((uint)unicode, m_currentFontAsset, true, m_FontStyleInternal, m_FontWeightInternal, out isUsingAlternativeTypeface, out tempFontAsset);\n                        if (!TMP_Settings.warningsDisabled) Debug.LogWarning(\"Character with ASCII value of \" + srcGlyph + \" was not found in the Font Asset Glyph Table. It was replaced by a space.\", this);\n                    }\n                }\n\n                // Determine if the font asset is still the current font asset or a fallback.\n                if (tempFontAsset != null)\n                {\n                    if (tempFontAsset.GetInstanceID() != m_currentFontAsset.GetInstanceID())\n                    {\n                        isUsingFallbackOrAlternativeTypeface = true;\n                        m_currentFontAsset = tempFontAsset;\n                    }\n                }\n                #endregion\n\n\n                m_textInfo.characterInfo[m_totalCharacterCount].elementType = TMP_TextElementType.Character;\n                m_textInfo.characterInfo[m_totalCharacterCount].textElement = character;\n                m_textInfo.characterInfo[m_totalCharacterCount].isUsingAlternateTypeface = isUsingAlternativeTypeface;\n                m_textInfo.characterInfo[m_totalCharacterCount].character = (char)unicode;\n                m_textInfo.characterInfo[m_totalCharacterCount].fontAsset = m_currentFontAsset;\n                m_textInfo.characterInfo[m_totalCharacterCount].index = chars[i].stringIndex;\n                m_textInfo.characterInfo[m_totalCharacterCount].stringLength = chars[i].length;\n\n                if (isUsingFallbackOrAlternativeTypeface)\n                {\n                    // Create Fallback material instance matching current material preset if necessary\n                    if (TMP_Settings.matchMaterialPreset)\n                        m_currentMaterial = TMP_MaterialManager.GetFallbackMaterial(m_currentMaterial, m_currentFontAsset.material);\n                    else\n                        m_currentMaterial = m_currentFontAsset.material;\n\n                    m_currentMaterialIndex = MaterialReference.AddMaterialReference(m_currentMaterial, m_currentFontAsset, m_materialReferences, m_materialReferenceIndexLookup);\n                }\n\n                if (!char.IsWhiteSpace((char)unicode) && unicode != 0x200B)\n                {\n                    // Limit the mesh of the main text object to 65535 vertices and use sub objects for the overflow.\n                    if (m_materialReferences[m_currentMaterialIndex].referenceCount < 16383)\n                        m_materialReferences[m_currentMaterialIndex].referenceCount += 1;\n                    else\n                    {\n                        m_currentMaterialIndex = MaterialReference.AddMaterialReference(new Material(m_currentMaterial), m_currentFontAsset, m_materialReferences, m_materialReferenceIndexLookup);\n                        m_materialReferences[m_currentMaterialIndex].referenceCount += 1;\n                    }\n                }\n\n                m_textInfo.characterInfo[m_totalCharacterCount].material = m_currentMaterial;\n                m_textInfo.characterInfo[m_totalCharacterCount].materialReferenceIndex = m_currentMaterialIndex;\n                m_materialReferences[m_currentMaterialIndex].isFallbackMaterial = isUsingFallbackOrAlternativeTypeface;\n\n                // Restore previous font asset and material if fallback font was used.\n                if (isUsingFallbackOrAlternativeTypeface)\n                {\n                    m_materialReferences[m_currentMaterialIndex].fallbackMaterial = prev_material;\n                    m_currentFontAsset = prev_fontAsset;\n                    m_currentMaterial = prev_material;\n                    m_currentMaterialIndex = prev_materialIndex;\n                }\n\n                m_totalCharacterCount += 1;\n            }\n\n            // Early return if we are calculating the preferred values.\n            if (m_isCalculatingPreferredValues)\n            {\n                m_isCalculatingPreferredValues = false;\n                m_isInputParsingRequired = true;\n                return m_totalCharacterCount;\n            }\n\n            // Save material and sprite count.\n            m_textInfo.spriteCount = spriteCount;\n            int materialCount = m_textInfo.materialCount = m_materialReferenceIndexLookup.Count;\n\n            // Check if we need to resize the MeshInfo array for handling different materials.\n            if (materialCount > m_textInfo.meshInfo.Length)\n                TMP_TextInfo.Resize(ref m_textInfo.meshInfo, materialCount, false);\n\n            // Resize SubTextObject array if necessary\n            if (materialCount > m_subTextObjects.Length)\n                TMP_TextInfo.Resize(ref m_subTextObjects, Mathf.NextPowerOfTwo(materialCount + 1));\n\n            // Resize CharacterInfo[] if allocations are excessive\n            if (m_textInfo.characterInfo.Length - m_totalCharacterCount > 256)\n                TMP_TextInfo.Resize(ref m_textInfo.characterInfo, Mathf.Max(m_totalCharacterCount + 1, 256), true);\n\n\n            // Iterate through the material references to set the mesh buffer allocations\n            for (int i = 0; i < materialCount; i++)\n            {\n                // Add new sub text object for each material reference\n                if (i > 0)\n                {\n                    if (m_subTextObjects[i] == null)\n                    {\n                        m_subTextObjects[i] = TMP_SubMeshUI.AddSubTextObject(this, m_materialReferences[i]);\n\n                        // Not sure this is necessary\n                        m_textInfo.meshInfo[i].vertices = null;\n                    }\n                    //else if (m_subTextObjects[i].gameObject.activeInHierarchy == false)\n                    //    m_subTextObjects[i].gameObject.SetActive(true);\n\n                    // Make sure the pivots are synchronized\n                    if (m_rectTransform.pivot != m_subTextObjects[i].rectTransform.pivot)\n                        m_subTextObjects[i].rectTransform.pivot = m_rectTransform.pivot;\n\n                    // Check if the material has changed.\n                    if (m_subTextObjects[i].sharedMaterial == null || m_subTextObjects[i].sharedMaterial.GetInstanceID() != m_materialReferences[i].material.GetInstanceID())\n                    {\n                        bool isDefaultMaterial = m_materialReferences[i].isDefaultMaterial;\n\n                        m_subTextObjects[i].isDefaultMaterial = isDefaultMaterial;\n\n                        // Assign new material if we are not using the default material or if the font asset has changed.\n                        if (!isDefaultMaterial || m_subTextObjects[i].sharedMaterial == null || m_subTextObjects[i].sharedMaterial.GetTexture(ShaderUtilities.ID_MainTex).GetInstanceID() != m_materialReferences[i].material.GetTexture(ShaderUtilities.ID_MainTex).GetInstanceID())\n                        {\n                            m_subTextObjects[i].sharedMaterial = m_materialReferences[i].material;\n                            m_subTextObjects[i].fontAsset = m_materialReferences[i].fontAsset;\n                            m_subTextObjects[i].spriteAsset = m_materialReferences[i].spriteAsset;\n                        }\n                    }\n\n                    // Check if we need to use a Fallback Material\n                    if (m_materialReferences[i].isFallbackMaterial)\n                    {\n                        m_subTextObjects[i].fallbackMaterial = m_materialReferences[i].material;\n                        m_subTextObjects[i].fallbackSourceMaterial = m_materialReferences[i].fallbackMaterial;\n                    }\n\n                }\n\n                int referenceCount = m_materialReferences[i].referenceCount;\n\n                // Check to make sure our buffers allocations can accommodate the required text elements.\n                if (m_textInfo.meshInfo[i].vertices == null || m_textInfo.meshInfo[i].vertices.Length < referenceCount * 4)\n                {\n                    if (m_textInfo.meshInfo[i].vertices == null)\n                    {\n                        if (i == 0)\n                            m_textInfo.meshInfo[i] = new TMP_MeshInfo(m_mesh, referenceCount + 1);\n                        else\n                            m_textInfo.meshInfo[i] = new TMP_MeshInfo(m_subTextObjects[i].mesh, referenceCount + 1);\n                    }\n                    else\n                        m_textInfo.meshInfo[i].ResizeMeshInfo(referenceCount > 1024 ? referenceCount + 256 : Mathf.NextPowerOfTwo(referenceCount + 1));\n                }\n                else if (m_VertexBufferAutoSizeReduction && referenceCount > 0 && m_textInfo.meshInfo[i].vertices.Length / 4 - referenceCount > 256)\n                {\n                    // Resize vertex buffers if allocations are excessive.\n                    //Debug.Log(\"Reducing the size of the vertex buffers.\");\n                    m_textInfo.meshInfo[i].ResizeMeshInfo(referenceCount > 1024 ? referenceCount + 256 : Mathf.NextPowerOfTwo(referenceCount + 1));\n                }\n            }\n\n            //TMP_MaterialManager.CleanupFallbackMaterials();\n\n            // Clean up unused SubMeshes\n            for (int i = materialCount; i < m_subTextObjects.Length && m_subTextObjects[i] != null; i++)\n            {\n                if (i < m_textInfo.meshInfo.Length)\n                {\n                    m_subTextObjects[i].canvasRenderer.SetMesh(null);\n\n                    // TODO: Figure out a way to handle this without running into Unity's Rebuild loop issue.\n                    //m_subTextObjects[i].gameObject.SetActive(false);\n                }\n            }\n\n            #if TMP_PROFILE_ON\n            Profiler.EndSample();\n            #endif\n\n            return m_totalCharacterCount;\n        }\n\n\n        // Added to sort handle the potential issue with OnWillRenderObject() not getting called when objects are not visible by camera.\n        //void OnBecameInvisible()\n        //{\n        //    if (m_mesh != null)\n        //        m_mesh.bounds = new Bounds(transform.position, new Vector3(1000, 1000, 0));\n        //}\n\n\n        /// <summary>\n        /// Update the margin width and height\n        /// </summary>\n        public override void ComputeMarginSize()\n        {\n            if (this.rectTransform != null)\n            {\n                //Debug.Log(\"*** ComputeMarginSize() *** Current RectTransform's Width is \" + m_rectTransform.rect.width + \" and Height is \" + m_rectTransform.rect.height); // + \" and size delta is \"  + m_rectTransform.sizeDelta);\n\n                m_marginWidth = m_rectTransform.rect.width - m_margin.x - m_margin.z;\n                m_marginHeight = m_rectTransform.rect.height - m_margin.y - m_margin.w;\n\n                // Update the corners of the RectTransform\n                m_RectTransformCorners = GetTextContainerLocalCorners();\n            }\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        protected override void OnDidApplyAnimationProperties()\n        {\n            m_havePropertiesChanged = true;\n            SetVerticesDirty();\n            SetLayoutDirty();\n            //Debug.Log(\"Animation Properties have changed.\");\n        }\n\n\n        protected override void OnCanvasHierarchyChanged()\n        {\n            base.OnCanvasHierarchyChanged();\n            m_canvas = this.canvas;\n        }\n\n\n        protected override void OnTransformParentChanged()\n        {\n            //Debug.Log(\"***** OnTransformParentChanged *****\");\n\n            base.OnTransformParentChanged();\n\n            m_canvas = this.canvas;\n\n            ComputeMarginSize();\n            m_havePropertiesChanged = true;\n        }\n\n\n        protected override void OnRectTransformDimensionsChange()\n        {\n            //Debug.Log(\"*** OnRectTransformDimensionsChange() *** ActiveInHierarchy: \" + this.gameObject.activeInHierarchy + \"  Frame: \" + Time.frameCount); \n\n            // Make sure object is active in Hierarchy\n            if (!this.gameObject.activeInHierarchy)\n                return;\n\n            ComputeMarginSize();\n\n            UpdateSubObjectPivot();\n\n            SetVerticesDirty();\n            SetLayoutDirty();\n        }\n\n\n        /// <summary>\n        /// Function used as a replacement for LateUpdate to check if the transform or scale of the text object has changed.\n        /// </summary>\n        internal override void InternalUpdate()\n        {\n            // We need to update the SDF scale or possibly regenerate the text object if lossy scale has changed.\n            if (m_havePropertiesChanged == false)\n            {\n                float lossyScaleY = m_rectTransform.lossyScale.y;\n                if (lossyScaleY != m_previousLossyScaleY && m_text != string.Empty && m_text != null)\n                {\n                    float scaleDelta = lossyScaleY / m_previousLossyScaleY;\n\n                    UpdateSDFScale(scaleDelta);\n\n                    m_previousLossyScaleY = lossyScaleY;\n                }\n            }\n\n            // Added to handle legacy animation mode.\n            if (m_isUsingLegacyAnimationComponent)\n            {\n                //if (m_havePropertiesChanged)\n                m_havePropertiesChanged = true;\n                OnPreRenderCanvas();\n            }\n        }\n\n\n\n        // Called just before the Canvas is rendered.\n        void OnPreRenderCanvas()\n        {\n            //Debug.Log(\"*** OnPreRenderCanvas() *** Frame: \" + Time.frameCount); \n\n            // Make sure object is active and that we have a valid Canvas.\n            if (!m_isAwake || (this.IsActive() == false && m_ignoreActiveState == false)) return;\n\n            if (m_canvas == null) { m_canvas = this.canvas; if (m_canvas == null) return; }\n\n\n            // Debug Variables\n            loopCountA = 0;\n            //loopCountB = 0;\n            //loopCountC = 0;\n            //loopCountD = 0;\n            //loopCountE = 0;\n\n            // Update Margins\n            //ComputeMarginSize();\n\n            // Update Mask\n            //    if (m_isMaskingEnabled)\n            //    {\n            //        UpdateMask();\n            //    }\n\n\n            if (m_havePropertiesChanged || m_isLayoutDirty)\n            {\n                //Debug.Log(\"Properties have changed!\"); // Assigned Material is:\" + m_sharedMaterial); // New Text is: \" + m_text + \".\");\n\n                // Update mesh padding if necessary.\n                if (checkPaddingRequired)\n                    UpdateMeshPadding();\n\n                // Reparse the text if the input has changed or text was truncated.\n                if (m_isInputParsingRequired || m_isTextTruncated)\n                    ParseInputText();\n\n                // Reset Font min / max used with Auto-sizing\n                if (m_enableAutoSizing)\n                    m_fontSize = Mathf.Clamp(m_fontSizeBase, m_fontSizeMin, m_fontSizeMax);\n\n                m_maxFontSize = m_fontSizeMax;\n                m_minFontSize = m_fontSizeMin;\n                m_lineSpacingDelta = 0;\n                m_charWidthAdjDelta = 0;\n                //m_recursiveCount = 0;\n\n                m_isCharacterWrappingEnabled = false;\n                m_isTextTruncated = false;\n\n                m_havePropertiesChanged = false;\n                m_isLayoutDirty = false;\n                m_ignoreActiveState = false;\n\n                GenerateTextMesh();\n            }\n        }\n\n\n\n        /// <summary>\n        /// This is the main function that is responsible for creating / displaying the text.\n        /// </summary>\n        protected override void GenerateTextMesh()\n        {\n            //Debug.Log(\"*** GenerateTextMesh() ***\"); // ***** Frame: \" + Time.frameCount); // + \". Point Size: \" + m_fontSize + \". Margins are (W) \" + m_marginWidth + \"  (H) \" + m_marginHeight); // \". Iteration Count: \" + loopCountA + \".  Min: \" + m_minFontSize + \"  Max: \" + m_maxFontSize + \"  Delta: \" + (m_maxFontSize - m_minFontSize) + \"  Font size is \" + m_fontSize); //called for Object with ID \" + GetInstanceID()); // Assigned Material is \" + m_uiRenderer.GetMaterial().name); // IncludeForMasking \" + this.m_IncludeForMasking); // and text is \" + m_text);\n            //Profiler.BeginSample(\"TMP Generate Text - Pre\");\n\n            // Early exit if no font asset was assigned. This should not be needed since LiberationSans SDF will be assigned by default.\n            if (m_fontAsset == null || m_fontAsset.characterLookupTable == null)\n            {\n                Debug.LogWarning(\"Can't Generate Mesh! No Font Asset has been assigned to Object ID: \" + this.GetInstanceID());\n                return;\n            }\n\n            // Clear TextInfo\n            if (m_textInfo != null)\n                m_textInfo.Clear();\n\n            // Early exit if we don't have any Text to generate.\n            if (m_TextParsingBuffer == null || m_TextParsingBuffer.Length == 0 || m_TextParsingBuffer[0].unicode == (char)0)\n            {\n                // Clear mesh and upload changes to the mesh.\n                ClearMesh();\n\n                m_preferredWidth = 0;\n                m_preferredHeight = 0;\n\n                // Event indicating the text has been regenerated.\n                TMPro_EventManager.ON_TEXT_CHANGED(this);\n\n                return;\n            }\n\n            m_currentFontAsset = m_fontAsset;\n            m_currentMaterial = m_sharedMaterial;\n            m_currentMaterialIndex = 0;\n            m_materialReferenceStack.SetDefault(new MaterialReference(m_currentMaterialIndex, m_currentFontAsset, null, m_currentMaterial, m_padding));\n\n            m_currentSpriteAsset = m_spriteAsset;\n\n            // Stop  all Sprite Animations\n            if (m_spriteAnimator != null)\n                m_spriteAnimator.StopAllAnimations();\n\n            // Total character count is computed when the text is parsed.\n            int totalCharacterCount = m_totalCharacterCount;\n\n            // Calculate the scale of the font based on selected font size and sampling point size.\n            // baseScale is calculated using the font asset assigned to the text object.\n            float baseScale = m_fontScale = (m_fontSize / m_fontAsset.faceInfo.pointSize * m_fontAsset.faceInfo.scale);\n            float currentElementScale = baseScale;\n            m_fontScaleMultiplier = 1;\n\n            m_currentFontSize = m_fontSize;\n            m_sizeStack.SetDefault(m_currentFontSize);\n            float fontSizeDelta = 0;\n\n            int charCode = 0; // Holds the character code of the currently being processed character.\n\n            m_FontStyleInternal = m_fontStyle; // Set the default style.\n            m_FontWeightInternal = (m_FontStyleInternal & FontStyles.Bold) == FontStyles.Bold ? FontWeight.Bold : m_fontWeight;\n            m_FontWeightStack.SetDefault(m_FontWeightInternal);\n            m_fontStyleStack.Clear();\n\n            m_lineJustification = m_textAlignment; // Sets the line justification mode to match editor alignment.\n            m_lineJustificationStack.SetDefault(m_lineJustification);\n\n            float padding = 0;\n            float style_padding = 0; // Extra padding required to accommodate Bold style.\n            float bold_xAdvance_multiplier = 1; // Used to increase spacing between character when style is bold.\n\n            m_baselineOffset = 0; // Used by subscript characters.\n            m_baselineOffsetStack.Clear();\n\n            // Underline\n            bool beginUnderline = false;\n            Vector3 underline_start = Vector3.zero; // Used to track where underline starts & ends.\n            Vector3 underline_end = Vector3.zero;\n\n            // Strike-through\n            bool beginStrikethrough = false;\n            Vector3 strikethrough_start = Vector3.zero;\n            Vector3 strikethrough_end = Vector3.zero;\n\n            // Text Highlight\n            bool beginHighlight = false;\n            Vector3 highlight_start = Vector3.zero;\n            Vector3 highlight_end = Vector3.zero;\n\n            m_fontColor32 = m_fontColor;\n            Color32 vertexColor;\n            m_htmlColor = m_fontColor32;\n            m_underlineColor = m_htmlColor;\n            m_strikethroughColor = m_htmlColor;\n\n            m_colorStack.SetDefault(m_htmlColor);\n            m_underlineColorStack.SetDefault(m_htmlColor);\n            m_strikethroughColorStack.SetDefault(m_htmlColor);\n            m_highlightColorStack.SetDefault(m_htmlColor);\n\n            m_colorGradientPreset = null;\n            m_colorGradientStack.SetDefault(null);\n\n            // Clear the Style stack.\n            //m_styleStack.Clear();\n\n            // Clear the Action stack.\n            m_actionStack.Clear();\n\n            m_isFXMatrixSet = false;\n\n            m_lineOffset = 0; // Amount of space between lines (font line spacing + m_linespacing).\n            m_lineHeight = TMP_Math.FLOAT_UNSET;\n            float lineGap = m_currentFontAsset.faceInfo.lineHeight - (m_currentFontAsset.faceInfo.ascentLine - m_currentFontAsset.faceInfo.descentLine);\n\n            m_cSpacing = 0; // Amount of space added between characters as a result of the use of the <cspace> tag.\n            m_monoSpacing = 0;\n            float lineOffsetDelta = 0;\n            m_xAdvance = 0; // Used to track the position of each character.\n\n            tag_LineIndent = 0; // Used for indentation of text.\n            tag_Indent = 0;\n            m_indentStack.SetDefault(0);\n            tag_NoParsing = false;\n            //m_isIgnoringAlignment = false;\n\n            m_characterCount = 0; // Total characters in the char[]\n\n            // Tracking of line information\n            m_firstCharacterOfLine = 0;\n            m_lastCharacterOfLine = 0;\n            m_firstVisibleCharacterOfLine = 0;\n            m_lastVisibleCharacterOfLine = 0;\n            m_maxLineAscender = k_LargeNegativeFloat;\n            m_maxLineDescender = k_LargePositiveFloat;\n            m_lineNumber = 0;\n            m_lineVisibleCharacterCount = 0;\n            bool isStartOfNewLine = true;\n            m_firstOverflowCharacterIndex = -1;\n\n            m_pageNumber = 0;\n            int pageToDisplay = Mathf.Clamp(m_pageToDisplay - 1, 0, m_textInfo.pageInfo.Length - 1);\n            int previousPageOverflowChar = 0;\n\n            int ellipsisIndex = 0;\n\n            Vector4 margins = m_margin;\n            float marginWidth = m_marginWidth;\n            float marginHeight = m_marginHeight;\n            m_marginLeft = 0;\n            m_marginRight = 0;\n            m_width = -1;\n            float width = marginWidth + 0.0001f - m_marginLeft - m_marginRight;\n\n            // Need to initialize these Extents structures\n            m_meshExtents.min = k_LargePositiveVector2;\n            m_meshExtents.max = k_LargeNegativeVector2;\n\n            // Initialize lineInfo\n            m_textInfo.ClearLineInfo();\n\n            // Tracking of the highest Ascender\n            m_maxCapHeight = 0;\n            m_maxAscender = 0;\n            m_maxDescender = 0;\n            float pageAscender = 0;\n            float maxVisibleDescender = 0;\n            bool isMaxVisibleDescenderSet = false;\n            m_isNewPage = false;\n\n            // Initialize struct to track states of word wrapping\n            bool isFirstWord = true;\n            m_isNonBreakingSpace = false;\n            bool ignoreNonBreakingSpace = false;\n            bool isLastBreakingChar = false;\n            float linebreakingWidth = 0;\n            int wrappingIndex = 0;\n\n            // Save character and line state before we begin layout.\n            SaveWordWrappingState(ref m_SavedWordWrapState, -1, -1);\n            SaveWordWrappingState(ref m_SavedLineState, -1, -1);\n\n            loopCountA += 1;\n            //Profiler.EndSample();\n\n            #if TMP_PROFILE_PHASES_ON\n            Profiler.BeginSample(\"TMP Generate Text - Phase I\");\n            #endif\n\n            // Parse through Character buffer to read HTML tags and begin creating mesh.\n            for (int i = 0; i < m_TextParsingBuffer.Length && m_TextParsingBuffer[i].unicode != 0; i++)\n            {\n                charCode = m_TextParsingBuffer[i].unicode;\n                \n                // Parse Rich Text Tag\n                #region Parse Rich Text Tag\n                if (m_isRichText && charCode == 60)  // '<'\n                {\n                    m_isParsingText = true;\n                    m_textElementType = TMP_TextElementType.Character;\n\n                    // Check if Tag is valid. If valid, skip to the end of the validated tag.\n                    if (ValidateHtmlTag(m_TextParsingBuffer, i + 1, out int tagEndIndex))\n                    {\n                        i = tagEndIndex;\n\n                        // Continue to next character or handle the sprite element\n                        if (m_textElementType == TMP_TextElementType.Character)\n                            continue;\n                    }\n                }\n                else\n                {\n                    m_textElementType = m_textInfo.characterInfo[m_characterCount].elementType;\n                    m_currentMaterialIndex = m_textInfo.characterInfo[m_characterCount].materialReferenceIndex;\n                    m_currentFontAsset = m_textInfo.characterInfo[m_characterCount].fontAsset;\n                }\n                #endregion End Parse Rich Text Tag\n\n                int prev_MaterialIndex = m_currentMaterialIndex;\n                bool isUsingAltTypeface = m_textInfo.characterInfo[m_characterCount].isUsingAlternateTypeface;\n\n                m_isParsingText = false;\n\n                // When using Linked text, mark character as ignored and skip to next character.\n                if (m_characterCount < m_firstVisibleCharacter)\n                {\n                    m_textInfo.characterInfo[m_characterCount].isVisible = false;\n                    m_textInfo.characterInfo[m_characterCount].character = (char)0x200B;\n                    m_characterCount += 1;\n                    continue;\n                }\n\n                // Handle Font Styles like LowerCase, UpperCase and SmallCaps.\n                #region Handling of LowerCase, UpperCase and SmallCaps Font Styles\n                #if TMP_PROFILE_ON\n                Profiler.BeginSample(\"Handle Font Style\");\n                #endif\n                float smallCapsMultiplier = 1.0f;\n\n                if (m_textElementType == TMP_TextElementType.Character)\n                {\n                    if ((m_FontStyleInternal & FontStyles.UpperCase) == FontStyles.UpperCase)\n                    {\n                        // If this character is lowercase, switch to uppercase.\n                        if (char.IsLower((char)charCode))\n                            charCode = char.ToUpper((char)charCode);\n\n                    }\n                    else if ((m_FontStyleInternal & FontStyles.LowerCase) == FontStyles.LowerCase)\n                    {\n                        // If this character is uppercase, switch to lowercase.\n                        if (char.IsUpper((char)charCode))\n                            charCode = char.ToLower((char)charCode);\n                    }\n                    else if ((m_FontStyleInternal & FontStyles.SmallCaps) == FontStyles.SmallCaps)\n                    {\n                        if (char.IsLower((char)charCode))\n                        {\n                            smallCapsMultiplier = 0.8f;\n                            charCode = char.ToUpper((char)charCode);\n                        }\n                    }\n                }\n                #if TMP_PROFILE_ON\n                Profiler.EndSample();\n                #endif\n                #endregion\n\n\n                // Look up Character Data from Dictionary and cache it.\n                #region Look up Character Data\n                #if TMP_PROFILE_ON\n                Profiler.BeginSample(\"Lookup Character Data\");\n                #endif\n                if (m_textElementType == TMP_TextElementType.Sprite)\n                {\n                    // If a sprite is used as a fallback then get a reference to it and set the color to white.\n                    m_currentSpriteAsset = m_textInfo.characterInfo[m_characterCount].spriteAsset;\n                    m_spriteIndex = m_textInfo.characterInfo[m_characterCount].spriteIndex;\n\n                    TMP_SpriteCharacter sprite = m_currentSpriteAsset.spriteCharacterTable[m_spriteIndex];\n                    if (sprite == null) continue;\n\n                    // Sprites are assigned in the E000 Private Area + sprite Index\n                    if (charCode == 60)\n                        charCode = 57344 + m_spriteIndex;\n                    else\n                        m_spriteColor = s_colorWhite;\n\n                    // The sprite scale calculations are based on the font asset assigned to the text object.\n                    float spriteScale = (m_currentFontSize / m_currentFontAsset.faceInfo.pointSize * m_currentFontAsset.faceInfo.scale);\n                    currentElementScale = m_currentFontAsset.faceInfo.ascentLine / sprite.glyph.metrics.height * sprite.scale * sprite.glyph.scale * spriteScale;\n\n                    m_cached_TextElement = sprite;\n\n                    m_textInfo.characterInfo[m_characterCount].elementType = TMP_TextElementType.Sprite;\n                    m_textInfo.characterInfo[m_characterCount].scale = spriteScale;\n                    m_textInfo.characterInfo[m_characterCount].spriteAsset = m_currentSpriteAsset;\n                    m_textInfo.characterInfo[m_characterCount].fontAsset = m_currentFontAsset;\n                    m_textInfo.characterInfo[m_characterCount].materialReferenceIndex = m_currentMaterialIndex;\n\n                    m_currentMaterialIndex = prev_MaterialIndex;\n\n                    padding = 0;\n                }\n                else if (m_textElementType == TMP_TextElementType.Character)\n                {\n                    m_cached_TextElement = m_textInfo.characterInfo[m_characterCount].textElement;\n                    if (m_cached_TextElement == null) continue;\n\n                    m_currentFontAsset = m_textInfo.characterInfo[m_characterCount].fontAsset;\n                    m_currentMaterial = m_textInfo.characterInfo[m_characterCount].material;\n                    m_currentMaterialIndex = m_textInfo.characterInfo[m_characterCount].materialReferenceIndex;\n\n                    // Re-calculate font scale as the font asset may have changed.\n                    m_fontScale = m_currentFontSize * smallCapsMultiplier / m_currentFontAsset.faceInfo.pointSize * m_currentFontAsset.faceInfo.scale;\n\n                    currentElementScale = m_fontScale * m_fontScaleMultiplier * m_cached_TextElement.scale * m_cached_TextElement.glyph.scale;\n\n                    m_textInfo.characterInfo[m_characterCount].elementType = TMP_TextElementType.Character;\n                    m_textInfo.characterInfo[m_characterCount].scale = currentElementScale;\n\n                    padding = m_currentMaterialIndex == 0 ? m_padding : m_subTextObjects[m_currentMaterialIndex].padding;\n                }\n                #if TMP_PROFILE_ON\n                Profiler.EndSample();\n                #endif\n                #endregion\n\n\n                // Handle Soft Hyphen\n                #region Handle Soft Hyphen\n                float old_scale = currentElementScale;\n                if (charCode == 0xAD)\n                {\n                    currentElementScale = 0;\n                }\n                #endregion\n\n\n                // Store some of the text object's information\n                m_textInfo.characterInfo[m_characterCount].character = (char)charCode;\n                m_textInfo.characterInfo[m_characterCount].pointSize = m_currentFontSize;\n                m_textInfo.characterInfo[m_characterCount].color = m_htmlColor;\n                m_textInfo.characterInfo[m_characterCount].underlineColor = m_underlineColor;\n                m_textInfo.characterInfo[m_characterCount].strikethroughColor = m_strikethroughColor;\n                m_textInfo.characterInfo[m_characterCount].highlightColor = m_highlightColor;\n                m_textInfo.characterInfo[m_characterCount].style = m_FontStyleInternal;\n                //m_textInfo.characterInfo[m_characterCount].index = m_TextParsingBuffer[i].stringIndex;\n                //m_textInfo.characterInfo[m_characterCount].isIgnoringAlignment = m_isIgnoringAlignment;\n\n\n                // Handle Kerning if Enabled.\n                #region Handle Kerning\n                TMP_GlyphValueRecord glyphAdjustments = new TMP_GlyphValueRecord();\n                float characterSpacingAdjustment = m_characterSpacing;\n                if (m_enableKerning)\n                {\n                    if (m_characterCount < totalCharacterCount - 1)\n                    {\n                        uint firstGlyphIndex = m_cached_TextElement.glyphIndex;\n                        uint secondGlyphIndex = m_textInfo.characterInfo[m_characterCount + 1].textElement.glyphIndex;\n                        long key = new GlyphPairKey(firstGlyphIndex, secondGlyphIndex).key;\n\n                        if (m_currentFontAsset.fontFeatureTable.m_GlyphPairAdjustmentRecordLookupDictionary.TryGetValue(key, out TMP_GlyphPairAdjustmentRecord adjustmentPair))\n                        {\n                            glyphAdjustments = adjustmentPair.firstAdjustmentRecord.glyphValueRecord;\n                            characterSpacingAdjustment = (adjustmentPair.featureLookupFlags & FontFeatureLookupFlags.IgnoreSpacingAdjustments) == FontFeatureLookupFlags.IgnoreSpacingAdjustments ? 0 : characterSpacingAdjustment;\n                        }\n                    }\n\n                    if (m_characterCount >= 1)\n                    {\n                        uint firstGlyphIndex = m_textInfo.characterInfo[m_characterCount - 1].textElement.glyphIndex;\n                        uint secondGlyphIndex = m_cached_TextElement.glyphIndex;\n                        long key = new GlyphPairKey(firstGlyphIndex, secondGlyphIndex).key;\n\n                        if (m_currentFontAsset.fontFeatureTable.m_GlyphPairAdjustmentRecordLookupDictionary.TryGetValue(key, out TMP_GlyphPairAdjustmentRecord adjustmentPair))\n                        {\n                            glyphAdjustments += adjustmentPair.secondAdjustmentRecord.glyphValueRecord;\n                            characterSpacingAdjustment = (adjustmentPair.featureLookupFlags & FontFeatureLookupFlags.IgnoreSpacingAdjustments) == FontFeatureLookupFlags.IgnoreSpacingAdjustments ? 0 : characterSpacingAdjustment;\n                        }\n                    }\n                }\n                #endregion\n\n\n                // Initial Implementation for RTL support.\n                #region Handle Right-to-Left\n                if (m_isRightToLeft)\n                {\n                    m_xAdvance -= ((m_cached_TextElement.glyph.metrics.horizontalAdvance * bold_xAdvance_multiplier + characterSpacingAdjustment + m_wordSpacing + m_currentFontAsset.normalSpacingOffset) * currentElementScale + m_cSpacing) * (1 - m_charWidthAdjDelta);\n\n                    if (char.IsWhiteSpace((char)charCode) || charCode == 0x200B)\n                        m_xAdvance -= m_wordSpacing * currentElementScale;\n                }\n                #endregion\n\n\n                // Handle Mono Spacing\n                #region Handle Mono Spacing\n                float monoAdvance = 0;\n                if (m_monoSpacing != 0)\n                {\n                    monoAdvance = (m_monoSpacing / 2 - (m_cached_TextElement.glyph.metrics.width / 2 + m_cached_TextElement.glyph.metrics.horizontalBearingX) * currentElementScale) * (1 - m_charWidthAdjDelta);\n                    m_xAdvance += monoAdvance;\n                }\n                #endregion\n\n\n                // Set Padding based on selected font style\n                #region Handle Style Padding\n                if (m_textElementType == TMP_TextElementType.Character && !isUsingAltTypeface && ((m_FontStyleInternal & FontStyles.Bold) == FontStyles.Bold)) // Checks for any combination of Bold Style.\n                {\n                    if (m_currentMaterial.HasProperty(ShaderUtilities.ID_GradientScale))\n                    {\n                        float gradientScale = m_currentMaterial.GetFloat(ShaderUtilities.ID_GradientScale);\n                        style_padding = m_currentFontAsset.boldStyle / 4.0f * gradientScale * m_currentMaterial.GetFloat(ShaderUtilities.ID_ScaleRatio_A);\n\n                        // Clamp overall padding to Gradient Scale size.\n                        if (style_padding + padding > gradientScale)\n                            padding = gradientScale - style_padding;\n                    }\n                    else\n                        style_padding = 0;\n\n                    bold_xAdvance_multiplier = 1 + m_currentFontAsset.boldSpacing * 0.01f;\n                }\n                else\n                {\n                    if (m_currentMaterial.HasProperty(ShaderUtilities.ID_GradientScale))\n                    {\n                        float gradientScale = m_currentMaterial.GetFloat(ShaderUtilities.ID_GradientScale);\n                        style_padding = m_currentFontAsset.normalStyle / 4.0f * gradientScale * m_currentMaterial.GetFloat(ShaderUtilities.ID_ScaleRatio_A);\n\n                        // Clamp overall padding to Gradient Scale size.\n                        if (style_padding + padding > gradientScale)\n                            padding = gradientScale - style_padding;\n                    }\n                    else\n                        style_padding = 0;\n\n                    bold_xAdvance_multiplier = 1.0f;\n                }\n                #endregion Handle Style Padding\n\n\n                // Determine the position of the vertices of the Character or Sprite.\n                #region Calculate Vertices Position\n                #if TMP_PROFILE_ON\n                Profiler.BeginSample(\"Calculate Vertices Position\");\n                #endif\n                float fontBaseLineOffset = m_currentFontAsset.faceInfo.baseline * m_fontScale * m_fontScaleMultiplier * m_currentFontAsset.faceInfo.scale;\n                Vector3 top_left;\n                top_left.x = m_xAdvance + ((m_cached_TextElement.glyph.metrics.horizontalBearingX - padding - style_padding + glyphAdjustments.xPlacement) * currentElementScale * (1 - m_charWidthAdjDelta));\n                top_left.y = fontBaseLineOffset + (m_cached_TextElement.glyph.metrics.horizontalBearingY + padding + glyphAdjustments.yPlacement) * currentElementScale - m_lineOffset + m_baselineOffset;\n                top_left.z = 0;\n\n                Vector3 bottom_left;\n                bottom_left.x = top_left.x;\n                bottom_left.y = top_left.y - ((m_cached_TextElement.glyph.metrics.height + padding * 2) * currentElementScale);\n                bottom_left.z = 0;\n\n                Vector3 top_right;\n                top_right.x = bottom_left.x + ((m_cached_TextElement.glyph.metrics.width + padding * 2 + style_padding * 2) * currentElementScale * (1 - m_charWidthAdjDelta));\n                top_right.y = top_left.y;\n                top_right.z = 0;\n\n                Vector3 bottom_right;\n                bottom_right.x = top_right.x;\n                bottom_right.y = bottom_left.y;\n                bottom_right.z = 0;\n\n                #if TMP_PROFILE_ON\n                Profiler.EndSample();\n                #endif\n                #endregion\n\n\n                // Check if we need to Shear the rectangles for Italic styles\n                #region Handle Italic & Shearing\n                if (m_textElementType == TMP_TextElementType.Character && !isUsingAltTypeface && ((m_FontStyleInternal & FontStyles.Italic) == FontStyles.Italic))\n                {\n                    // Shift Top vertices forward by half (Shear Value * height of character) and Bottom vertices back by same amount. \n                    float shear_value = m_currentFontAsset.italicStyle * 0.01f;\n                    Vector3 topShear = new Vector3(shear_value * ((m_cached_TextElement.glyph.metrics.horizontalBearingY + padding + style_padding) * currentElementScale), 0, 0);\n                    Vector3 bottomShear = new Vector3(shear_value * (((m_cached_TextElement.glyph.metrics.horizontalBearingY - m_cached_TextElement.glyph.metrics.height - padding - style_padding)) * currentElementScale), 0, 0);\n\n                    top_left = top_left + topShear;\n                    bottom_left = bottom_left + bottomShear;\n                    top_right = top_right + topShear;\n                    bottom_right = bottom_right + bottomShear;\n                }\n                #endregion Handle Italics & Shearing\n\n\n                // Handle Character Rotation\n                #region Handle Character Rotation\n                if (m_isFXMatrixSet)\n                {\n                    // Apply scale matrix when simulating Condensed text.\n                    if (m_FXMatrix.lossyScale.x != 1)\n                    {\n                        //top_left = m_FXMatrix.MultiplyPoint3x4(top_left);\n                        //bottom_left = m_FXMatrix.MultiplyPoint3x4(bottom_left);\n                        //top_right = m_FXMatrix.MultiplyPoint3x4(top_right);\n                        //bottom_right = m_FXMatrix.MultiplyPoint3x4(bottom_right);\n                    }\n\n                    Vector3 positionOffset = (top_right + bottom_left) / 2;\n\n                    top_left = m_FXMatrix.MultiplyPoint3x4(top_left - positionOffset) + positionOffset;\n                    bottom_left = m_FXMatrix.MultiplyPoint3x4(bottom_left - positionOffset) + positionOffset;\n                    top_right = m_FXMatrix.MultiplyPoint3x4(top_right - positionOffset) + positionOffset;\n                    bottom_right = m_FXMatrix.MultiplyPoint3x4(bottom_right - positionOffset) + positionOffset;\n                }\n                #endregion\n\n\n                // Store vertex information for the character or sprite.\n                m_textInfo.characterInfo[m_characterCount].bottomLeft = bottom_left;\n                m_textInfo.characterInfo[m_characterCount].topLeft = top_left;\n                m_textInfo.characterInfo[m_characterCount].topRight = top_right;\n                m_textInfo.characterInfo[m_characterCount].bottomRight = bottom_right;\n\n                m_textInfo.characterInfo[m_characterCount].origin = m_xAdvance;\n                m_textInfo.characterInfo[m_characterCount].baseLine = fontBaseLineOffset - m_lineOffset + m_baselineOffset;\n                m_textInfo.characterInfo[m_characterCount].aspectRatio = (top_right.x - bottom_left.x) / (top_left.y - bottom_left.y);\n\n\n                // Compute and save text element Ascender and maximum line Ascender.\n                float elementAscender = m_currentFontAsset.faceInfo.ascentLine * (m_textElementType == TMP_TextElementType.Character ? currentElementScale / smallCapsMultiplier : m_textInfo.characterInfo[m_characterCount].scale) + m_baselineOffset;\n                m_textInfo.characterInfo[m_characterCount].ascender = elementAscender - m_lineOffset;\n                m_maxLineAscender = elementAscender > m_maxLineAscender ? elementAscender : m_maxLineAscender;\n\n                // Compute and save text element Descender and maximum line Descender.\n                float elementDescender = m_currentFontAsset.faceInfo.descentLine * (m_textElementType == TMP_TextElementType.Character ? currentElementScale / smallCapsMultiplier : m_textInfo.characterInfo[m_characterCount].scale) + m_baselineOffset;\n                float elementDescenderII = m_textInfo.characterInfo[m_characterCount].descender = elementDescender - m_lineOffset;\n                m_maxLineDescender = elementDescender < m_maxLineDescender ? elementDescender : m_maxLineDescender;\n\n                // Adjust maxLineAscender and maxLineDescender if style is superscript or subscript\n                if ((m_FontStyleInternal & FontStyles.Subscript) == FontStyles.Subscript || (m_FontStyleInternal & FontStyles.Superscript) == FontStyles.Superscript)\n                {\n                    float baseAscender = (elementAscender - m_baselineOffset) / m_currentFontAsset.faceInfo.subscriptSize;\n                    elementAscender = m_maxLineAscender;\n                    m_maxLineAscender = baseAscender > m_maxLineAscender ? baseAscender : m_maxLineAscender;\n\n                    float baseDescender = (elementDescender - m_baselineOffset) / m_currentFontAsset.faceInfo.subscriptSize;\n                    elementDescender = m_maxLineDescender;\n                    m_maxLineDescender = baseDescender < m_maxLineDescender ? baseDescender : m_maxLineDescender;\n                }\n\n                if (m_lineNumber == 0 || m_isNewPage)\n                {\n                    m_maxAscender = m_maxAscender > elementAscender ? m_maxAscender : elementAscender;\n                    m_maxCapHeight = Mathf.Max(m_maxCapHeight, m_currentFontAsset.faceInfo.capLine * currentElementScale / smallCapsMultiplier);\n                }\n                if (m_lineOffset == 0) pageAscender = pageAscender > elementAscender ? pageAscender : elementAscender;\n\n\n                // Set Characters to not visible by default.\n                m_textInfo.characterInfo[m_characterCount].isVisible = false;\n\n                // Setup Mesh for visible text elements. ie. not a SPACE / LINEFEED / CARRIAGE RETURN.\n                #region Handle Visible Characters\n                //#if TMP_PROFILE_ON\n                //Profiler.BeginSample(\"Handle Visible Characters\");\n                //#endif\n                if (charCode == 9 || charCode == 0xA0 || charCode == 0x2007 || (!char.IsWhiteSpace((char)charCode) && charCode != 0x200B) || m_textElementType == TMP_TextElementType.Sprite)\n                {\n                    m_textInfo.characterInfo[m_characterCount].isVisible = true;\n\n                    #region Experimental Margin Shaper\n                    //Vector2 shapedMargins;\n                    //if (marginShaper)\n                    //{\n                    //    shapedMargins = m_marginShaper.GetShapedMargins(m_textInfo.characterInfo[m_characterCount].baseLine);\n                    //    if (shapedMargins.x < margins.x)\n                    //    {\n                    //        shapedMargins.x = m_marginLeft;\n                    //    }\n                    //    else\n                    //    {\n                    //        shapedMargins.x += m_marginLeft - margins.x;\n                    //    }\n                    //    if (shapedMargins.y < margins.z)\n                    //    {\n                    //        shapedMargins.y = m_marginRight;\n                    //    }\n                    //    else\n                    //    {\n                    //        shapedMargins.y += m_marginRight - margins.z;\n                    //    }\n                    //}\n                    //else\n                    //{\n                    //    shapedMargins.x = m_marginLeft;\n                    //    shapedMargins.y = m_marginRight;\n                    //}\n                    //width = marginWidth + 0.0001f - shapedMargins.x - shapedMargins.y;\n                    //if (m_width != -1 && m_width < width)\n                    //{\n                    //    width = m_width;\n                    //}\n                    //m_textInfo.lineInfo[m_lineNumber].marginLeft = shapedMargins.x;\n                    #endregion\n\n                    width = m_width != -1 ? Mathf.Min(marginWidth + 0.0001f - m_marginLeft - m_marginRight, m_width) : marginWidth + 0.0001f - m_marginLeft - m_marginRight;\n                    m_textInfo.lineInfo[m_lineNumber].marginLeft = m_marginLeft;\n\n                    bool isJustifiedOrFlush = ((_HorizontalAlignmentOptions)m_lineJustification & _HorizontalAlignmentOptions.Flush) == _HorizontalAlignmentOptions.Flush || ((_HorizontalAlignmentOptions)m_lineJustification & _HorizontalAlignmentOptions.Justified) == _HorizontalAlignmentOptions.Justified;\n\n                    // Calculate the line breaking width of the text.\n                    linebreakingWidth = Mathf.Abs(m_xAdvance) + (!m_isRightToLeft ? m_cached_TextElement.glyph.metrics.horizontalAdvance : 0) * (1 - m_charWidthAdjDelta) * (charCode != 0xAD ? currentElementScale : old_scale);\n\n                    // Check if Character exceeds the width of the Text Container\n                    #region Handle Line Breaking, Text Auto-Sizing and Horizontal Overflow\n                    if (linebreakingWidth > width * (isJustifiedOrFlush ? 1.05f : 1.0f))\n                    {\n                        ellipsisIndex = m_characterCount - 1; // Last safely rendered character\n\n                        // Word Wrapping\n                        #region Handle Word Wrapping\n                        if (enableWordWrapping && m_characterCount != m_firstCharacterOfLine)\n                        {\n                            // Check if word wrapping is still possible\n                            #region Line Breaking Check\n                            if (wrappingIndex == m_SavedWordWrapState.previous_WordBreak || isFirstWord)\n                            {\n                                // Word wrapping is no longer possible. Shrink size of text if auto-sizing is enabled.\n                                if (m_enableAutoSizing && m_fontSize > m_fontSizeMin)\n                                {\n                                    // Handle Character Width Adjustments\n                                    #region Character Width Adjustments\n                                    if (m_charWidthAdjDelta < m_charWidthMaxAdj / 100)\n                                    {\n                                        loopCountA = 0;\n                                        m_charWidthAdjDelta += 0.01f;\n                                        GenerateTextMesh();\n                                        return;\n                                    }\n                                    #endregion\n\n                                    // Adjust Point Size\n                                    m_maxFontSize = m_fontSize;\n\n                                    m_fontSize -= Mathf.Max((m_fontSize - m_minFontSize) / 2, 0.05f);\n                                    m_fontSize = (int)(Mathf.Max(m_fontSize, m_fontSizeMin) * 20 + 0.5f) / 20f;\n\n                                    if (loopCountA > 20) return; // Added to debug\n                                    GenerateTextMesh();\n                                    return;\n                                }\n\n                                // Word wrapping is no longer possible, now breaking up individual words.\n                                if (m_isCharacterWrappingEnabled == false)\n                                {\n                                    if (ignoreNonBreakingSpace == false)\n                                        ignoreNonBreakingSpace = true;\n                                    else\n                                        m_isCharacterWrappingEnabled = true;\n                                }\n                                else\n                                    isLastBreakingChar = true;\n\n                                //m_recursiveCount += 1;\n                                //if (m_recursiveCount > 20)\n                                //{\n                                //    Debug.Log(\"Recursive count exceeded!\");\n                                //    continue;\n                                //}\n                            }\n                            #endregion\n\n                            // Restore to previously stored state of last valid (space character or linefeed)\n                            i = RestoreWordWrappingState(ref m_SavedWordWrapState);\n                            wrappingIndex = i;  // Used to detect when line length can no longer be reduced.\n\n                            // Handling for Soft Hyphen\n                            if (m_TextParsingBuffer[i].unicode == 0xAD) // && !m_isCharacterWrappingEnabled) // && ellipsisIndex != i && !m_isCharacterWrappingEnabled)\n                            {\n                                m_isTextTruncated = true;\n                                m_TextParsingBuffer[i].unicode = 0x2D;\n                                GenerateTextMesh();\n                                return;\n                            }\n\n                            //Debug.Log(\"Last Visible Character of line # \" + m_lineNumber + \" is [\" + m_textInfo.characterInfo[m_lastVisibleCharacterOfLine].character + \" Character Count: \" + m_characterCount + \" Last visible: \" + m_lastVisibleCharacterOfLine);\n\n                            // Check if Line Spacing of previous line needs to be adjusted.\n                            if (m_lineNumber > 0 && !TMP_Math.Approximately(m_maxLineAscender, m_startOfLineAscender) && m_lineHeight == TMP_Math.FLOAT_UNSET && !m_isNewPage)\n                            {\n                                //Debug.Log(\"(Line Break - Adjusting Line Spacing on line #\" + m_lineNumber);\n                                float offsetDelta = m_maxLineAscender - m_startOfLineAscender;\n                                AdjustLineOffset(m_firstCharacterOfLine, m_characterCount, offsetDelta);\n                                m_lineOffset += offsetDelta;\n                                m_SavedWordWrapState.lineOffset = m_lineOffset;\n                                m_SavedWordWrapState.previousLineAscender = m_maxLineAscender;\n\n                                // TODO - Add check for character exceeding vertical bounds\n                            }\n                            m_isNewPage = false;\n\n                            // Calculate lineAscender & make sure if last character is superscript or subscript that we check that as well.\n                            float lineAscender = m_maxLineAscender - m_lineOffset;\n                            float lineDescender = m_maxLineDescender - m_lineOffset;\n\n\n                            // Update maxDescender and maxVisibleDescender\n                            m_maxDescender = m_maxDescender < lineDescender ? m_maxDescender : lineDescender;\n                            if (!isMaxVisibleDescenderSet)\n                                maxVisibleDescender = m_maxDescender;\n\n                            if (m_useMaxVisibleDescender && (m_characterCount >= m_maxVisibleCharacters || m_lineNumber >= m_maxVisibleLines))\n                                isMaxVisibleDescenderSet = true;\n\n                            // Track & Store lineInfo for the new line\n                            m_textInfo.lineInfo[m_lineNumber].firstCharacterIndex = m_firstCharacterOfLine;\n                            m_textInfo.lineInfo[m_lineNumber].firstVisibleCharacterIndex = m_firstVisibleCharacterOfLine = m_firstCharacterOfLine > m_firstVisibleCharacterOfLine ? m_firstCharacterOfLine : m_firstVisibleCharacterOfLine;\n                            m_textInfo.lineInfo[m_lineNumber].lastCharacterIndex = m_lastCharacterOfLine = m_characterCount - 1 > 0 ? m_characterCount - 1 : 0;\n                            m_textInfo.lineInfo[m_lineNumber].lastVisibleCharacterIndex = m_lastVisibleCharacterOfLine = m_lastVisibleCharacterOfLine < m_firstVisibleCharacterOfLine ? m_firstVisibleCharacterOfLine : m_lastVisibleCharacterOfLine;\n\n                            m_textInfo.lineInfo[m_lineNumber].characterCount = m_textInfo.lineInfo[m_lineNumber].lastCharacterIndex - m_textInfo.lineInfo[m_lineNumber].firstCharacterIndex + 1;\n                            m_textInfo.lineInfo[m_lineNumber].visibleCharacterCount = m_lineVisibleCharacterCount;\n                            m_textInfo.lineInfo[m_lineNumber].lineExtents.min = new Vector2(m_textInfo.characterInfo[m_firstVisibleCharacterOfLine].bottomLeft.x, lineDescender);\n                            m_textInfo.lineInfo[m_lineNumber].lineExtents.max = new Vector2(m_textInfo.characterInfo[m_lastVisibleCharacterOfLine].topRight.x, lineAscender);\n                            m_textInfo.lineInfo[m_lineNumber].length = m_textInfo.lineInfo[m_lineNumber].lineExtents.max.x;\n                            m_textInfo.lineInfo[m_lineNumber].width = width;\n\n                            //m_textInfo.lineInfo[m_lineNumber].alignment = m_lineJustification;\n\n                            m_textInfo.lineInfo[m_lineNumber].maxAdvance = m_textInfo.characterInfo[m_lastVisibleCharacterOfLine].xAdvance - (characterSpacingAdjustment + m_currentFontAsset.normalSpacingOffset) * currentElementScale - m_cSpacing;\n\n                            m_textInfo.lineInfo[m_lineNumber].baseline = 0 - m_lineOffset;\n                            m_textInfo.lineInfo[m_lineNumber].ascender = lineAscender;\n                            m_textInfo.lineInfo[m_lineNumber].descender = lineDescender;\n                            m_textInfo.lineInfo[m_lineNumber].lineHeight = lineAscender - lineDescender + lineGap * baseScale;\n\n                            m_firstCharacterOfLine = m_characterCount; // Store first character of the next line.\n                            m_lineVisibleCharacterCount = 0;\n\n                            // Store the state of the line before starting on the new line.\n                            SaveWordWrappingState(ref m_SavedLineState, i, m_characterCount - 1);\n\n                            m_lineNumber += 1;\n                            isStartOfNewLine = true;\n                            isFirstWord = true;\n\n                            // Check to make sure Array is large enough to hold a new line.\n                            if (m_lineNumber >= m_textInfo.lineInfo.Length)\n                                ResizeLineExtents(m_lineNumber);\n\n                            // Apply Line Spacing based on scale of the last character of the line.\n                            if (m_lineHeight == TMP_Math.FLOAT_UNSET)\n                            {\n                                float ascender = m_textInfo.characterInfo[m_characterCount].ascender - m_textInfo.characterInfo[m_characterCount].baseLine;\n                                lineOffsetDelta = 0 - m_maxLineDescender + ascender + (lineGap + m_lineSpacing + m_lineSpacingDelta) * baseScale;\n                                m_lineOffset += lineOffsetDelta;\n\n                                m_startOfLineAscender = ascender;\n                            }\n                            else\n                                m_lineOffset += m_lineHeight + m_lineSpacing * baseScale;\n\n                            m_maxLineAscender = k_LargeNegativeFloat;\n                            m_maxLineDescender = k_LargePositiveFloat;\n\n                            m_xAdvance = 0 + tag_Indent;\n\n                            continue;\n                        }\n                        #endregion End Word Wrapping\n\n\n                        // Text Auto-Sizing (text exceeding Width of container. \n                        #region Handle Text Auto-Sizing\n                        if (m_enableAutoSizing && m_fontSize > m_fontSizeMin)\n                        {\n                            // Handle Character Width Adjustments\n                            #region Character Width Adjustments\n                            if (m_charWidthAdjDelta < m_charWidthMaxAdj / 100)\n                            {\n                                loopCountA = 0;\n                                m_charWidthAdjDelta += 0.01f;\n                                GenerateTextMesh();\n                                return;\n                            }\n                            #endregion\n\n                            // Adjust Point Size\n                            m_maxFontSize = m_fontSize;\n\n                            m_fontSize -= Mathf.Max((m_fontSize - m_minFontSize) / 2, 0.05f);\n                            m_fontSize = (int)(Mathf.Max(m_fontSize, m_fontSizeMin) * 20 + 0.5f) / 20f;\n\n                            //m_recursiveCount = 0;\n                            if (loopCountA > 20) return; // Added to debug \n                            GenerateTextMesh();\n                            return;\n                        }\n                        #endregion End Text Auto-Sizing\n\n\n                        // Handle Text Overflow\n                        #region Handle Text Overflow\n                        switch (m_overflowMode)\n                        {\n                            case TextOverflowModes.Overflow:\n                                if (m_isMaskingEnabled)\n                                    DisableMasking();\n\n                                break;\n                            case TextOverflowModes.Ellipsis:\n                                if (m_isMaskingEnabled)\n                                    DisableMasking();\n\n                                m_isTextTruncated = true;\n\n                                if (m_characterCount < 1)\n                                {\n                                    m_textInfo.characterInfo[m_characterCount].isVisible = false;\n                                    //m_visibleCharacterCount = 0;\n                                    break;\n                                }\n\n                                m_TextParsingBuffer[i - 1].unicode = 8230;\n                                m_TextParsingBuffer[i].unicode = (char)0;\n\n                                if (m_cached_Ellipsis_Character != null)\n                                {\n                                    m_textInfo.characterInfo[ellipsisIndex].character = (char)8230;\n                                    m_textInfo.characterInfo[ellipsisIndex].textElement = m_cached_Ellipsis_Character;\n                                    m_textInfo.characterInfo[ellipsisIndex].fontAsset = m_materialReferences[0].fontAsset;\n                                    m_textInfo.characterInfo[ellipsisIndex].material = m_materialReferences[0].material;\n                                    m_textInfo.characterInfo[ellipsisIndex].materialReferenceIndex = 0;\n                                }\n                                else\n                                {\n                                    Debug.LogWarning(\"Unable to use Ellipsis character since it wasn't found in the current Font Asset [\" + m_fontAsset.name + \"]. Consider regenerating this font asset to include the Ellipsis character (u+2026).\\nNote: Warnings can be disabled in the TMP Settings file.\", this);\n                                }\n\n                                m_totalCharacterCount = ellipsisIndex + 1;\n\n                                GenerateTextMesh();\n                                return;\n                            //case TextOverflowModes.Masking:\n                            //    if (!m_isMaskingEnabled)\n                            //        EnableMasking();\n                            //    break;\n                            //case TextOverflowModes.ScrollRect:\n                            //    if (!m_isMaskingEnabled)\n                            //        EnableMasking();\n                            //    break;\n                            case TextOverflowModes.Truncate:\n                                if (m_isMaskingEnabled)\n                                    DisableMasking();\n\n                                m_textInfo.characterInfo[m_characterCount].isVisible = false;\n                                break;\n                            case TextOverflowModes.Linked:\n                                //m_textInfo.characterInfo[m_characterCount].isVisible = false;\n\n                                //if (m_linkedTextComponent != null)\n                                //{\n                                //    m_linkedTextComponent.text = text;\n                                //    m_linkedTextComponent.firstVisibleCharacter = m_characterCount;\n                                //    m_linkedTextComponent.ForceMeshUpdate();\n                                //}\n                                break;\n                        }\n                        #endregion End Text Overflow\n\n                    }\n                    #endregion End Check for Characters Exceeding Width of Text Container\n\n\n                    // Special handling of characters that are not ignored at the end of a line.\n                    if (charCode == 9 || charCode == 0xA0 || charCode == 0x2007)\n                    {\n                        m_textInfo.characterInfo[m_characterCount].isVisible = false;\n                        m_lastVisibleCharacterOfLine = m_characterCount;\n                        m_textInfo.lineInfo[m_lineNumber].spaceCount += 1;\n                        m_textInfo.spaceCount += 1;\n\n                        if (charCode == 0xA0)\n                            m_textInfo.lineInfo[m_lineNumber].controlCharacterCount += 1;\n                    }\n                    else\n                    {\n                        // Determine Vertex Color\n                        if (m_overrideHtmlColors)\n                            vertexColor = m_fontColor32;\n                        else\n                            vertexColor = m_htmlColor;\n\n                        // Store Character & Sprite Vertex Information\n                        if (m_textElementType == TMP_TextElementType.Character)\n                        {\n                            // Save Character Vertex Data\n                            SaveGlyphVertexInfo(padding, style_padding, vertexColor);\n                        }\n                        else if (m_textElementType == TMP_TextElementType.Sprite)\n                        {\n                            SaveSpriteVertexInfo(vertexColor);\n                        }\n                    }\n\n\n                    // Increase visible count for Characters.\n                    if (m_textInfo.characterInfo[m_characterCount].isVisible && charCode != 0xAD)\n                    {\n                        if (isStartOfNewLine) { isStartOfNewLine = false; m_firstVisibleCharacterOfLine = m_characterCount; }\n\n                        m_lineVisibleCharacterCount += 1;\n                        m_lastVisibleCharacterOfLine = m_characterCount;\n                    }\n                }\n                else\n                {   // This is a Space, Tab, LineFeed or Carriage Return\n\n                    // Track # of spaces per line which is used for line justification.\n                    if ((charCode == 10 || char.IsSeparator((char)charCode)) && charCode != 0xAD && charCode != 0x200B && charCode != 0x2060)\n                    {\n                        m_textInfo.lineInfo[m_lineNumber].spaceCount += 1;\n                        m_textInfo.spaceCount += 1;\n                    }\n                }\n                //#if TMP_PROFILE_ON\n                //Profiler.EndSample();\n                //#endif\n                #endregion Handle Visible Characters\n\n\n                // Check if Line Spacing of previous line needs to be adjusted.\n                #region Adjust Line Spacing\n                #if TMP_PROFILE_ON\n                Profiler.BeginSample(\"Adjust Line Spacing\");\n                #endif\n                if (m_lineNumber > 0 && !TMP_Math.Approximately(m_maxLineAscender, m_startOfLineAscender) && m_lineHeight == TMP_Math.FLOAT_UNSET && !m_isNewPage)\n                {\n                    //Debug.Log(\"Inline - Adjusting Line Spacing on line #\" + m_lineNumber);\n                    //float gap = 0; // Compute gap.\n\n                    float offsetDelta = m_maxLineAscender - m_startOfLineAscender;\n                    AdjustLineOffset(m_firstCharacterOfLine, m_characterCount, offsetDelta);\n                    elementDescenderII -= offsetDelta;\n                    m_lineOffset += offsetDelta;\n\n                    m_startOfLineAscender += offsetDelta;\n                    m_SavedWordWrapState.lineOffset = m_lineOffset;\n                    m_SavedWordWrapState.previousLineAscender = m_startOfLineAscender;\n                }\n                #if TMP_PROFILE_ON\n                Profiler.EndSample();\n                #endif\n                #endregion\n\n\n                // Store Rectangle positions for each Character.\n                #region Store Character Data\n                m_textInfo.characterInfo[m_characterCount].lineNumber = m_lineNumber;\n                m_textInfo.characterInfo[m_characterCount].pageNumber = m_pageNumber;\n\n                if (charCode != 10 && charCode != 13 && charCode != 8230 || m_textInfo.lineInfo[m_lineNumber].characterCount == 1)\n                    m_textInfo.lineInfo[m_lineNumber].alignment = m_lineJustification;\n                #endregion Store Character Data\n\n\n                // Check if text Exceeds the vertical bounds of the margin area.\n                #region Check Vertical Bounds & Auto-Sizing\n                #if TMP_PROFILE_ON\n                Profiler.BeginSample(\"Check Vertical Bounds\");\n                #endif\n                if (m_maxAscender - elementDescenderII > marginHeight + 0.0001f)\n                {\n                    // Handle Line spacing adjustments\n                    #region Line Spacing Adjustments\n                    if (m_enableAutoSizing && m_lineSpacingDelta > m_lineSpacingMax && m_lineNumber > 0)\n                    {\n                        loopCountA = 0;\n\n                        m_lineSpacingDelta -= 1;\n                        GenerateTextMesh();\n                        return;\n                    }\n                    #endregion\n\n\n                    // Handle Text Auto-sizing resulting from text exceeding vertical bounds.\n                    #region Text Auto-Sizing (Text greater than vertical bounds)\n                    if (m_enableAutoSizing && m_fontSize > m_fontSizeMin)\n                    {\n                        m_maxFontSize = m_fontSize;\n\n                        m_fontSize -= Mathf.Max((m_fontSize - m_minFontSize) / 2, 0.05f);\n                        m_fontSize = (int)(Mathf.Max(m_fontSize, m_fontSizeMin) * 20 + 0.5f) / 20f;\n\n                        //m_recursiveCount = 0;\n                        if (loopCountA > 20) return; // Added to debug \n                        GenerateTextMesh();\n                        return;\n                    }\n                    #endregion Text Auto-Sizing\n\n                    // Set isTextOverflowing and firstOverflowCharacterIndex\n                    if (m_firstOverflowCharacterIndex == -1)\n                        m_firstOverflowCharacterIndex = m_characterCount;\n\n                    // Handle Text Overflow\n                    #region Text Overflow\n                    switch (m_overflowMode)\n                    {\n                        case TextOverflowModes.Overflow:\n                            if (m_isMaskingEnabled)\n                                DisableMasking();\n\n                            break;\n                        case TextOverflowModes.Ellipsis:\n                            if (m_isMaskingEnabled)\n                                DisableMasking();\n\n                            if (m_lineNumber > 0)\n                            {\n                                m_TextParsingBuffer[m_textInfo.characterInfo[ellipsisIndex].index].unicode = 8230;\n                                m_TextParsingBuffer[m_textInfo.characterInfo[ellipsisIndex].index + 1].unicode = (char)0;\n\n                                if (m_cached_Ellipsis_Character != null)\n                                {\n                                    m_textInfo.characterInfo[ellipsisIndex].character = (char)8230;\n                                    m_textInfo.characterInfo[ellipsisIndex].textElement = m_cached_Ellipsis_Character;\n                                    m_textInfo.characterInfo[ellipsisIndex].fontAsset = m_materialReferences[0].fontAsset;\n                                    m_textInfo.characterInfo[ellipsisIndex].material = m_materialReferences[0].material;\n                                    m_textInfo.characterInfo[ellipsisIndex].materialReferenceIndex = 0;\n                                }\n                                else\n                                {\n                                    Debug.LogWarning(\"Unable to use Ellipsis character since it wasn't found in the current Font Asset [\" + m_fontAsset.name + \"]. Consider regenerating this font asset to include the Ellipsis character (u+2026).\\nNote: Warnings can be disabled in the TMP Settings file.\", this);\n                                }\n\n                                m_totalCharacterCount = ellipsisIndex + 1;\n\n                                GenerateTextMesh();\n                                m_isTextTruncated = true;\n                                return;\n                            }\n                            else\n                            {\n                                ClearMesh();\n                                return;\n                            }\n                        //case TextOverflowModes.Masking:\n                        //    if (!m_isMaskingEnabled)\n                        //        EnableMasking();\n                        //    break;\n                        //case TextOverflowModes.ScrollRect:\n                        //    if (!m_isMaskingEnabled)\n                        //        EnableMasking();\n                        //    break;\n                        case TextOverflowModes.Truncate:\n                            if (m_isMaskingEnabled)\n                                DisableMasking();\n\n                            // TODO : Optimize \n                            if (m_lineNumber > 0)\n                            {\n                                m_TextParsingBuffer[m_textInfo.characterInfo[ellipsisIndex].index + 1].unicode = (char)0;\n\n                                m_totalCharacterCount = ellipsisIndex + 1;\n\n                                GenerateTextMesh();\n                                m_isTextTruncated = true;\n                                return;\n                            }\n                            else\n                            {\n                                ClearMesh();\n                                return;\n                            }\n                        case TextOverflowModes.Page:\n                            if (m_isMaskingEnabled)\n                                DisableMasking();\n\n                            // Ignore Page Break, Linefeed or carriage return\n                            if (charCode == 13 || charCode == 10)\n                                break;\n\n                            // Return if the first character doesn't fit.\n                            if (i == 0)\n                            {\n                                ClearMesh();\n                                return;\n                            }\n                            else if (previousPageOverflowChar == i)\n                            {\n                                m_TextParsingBuffer[i].unicode = 0;\n                                m_isTextTruncated = true;\n                            }\n\n                            previousPageOverflowChar = i;\n\n                            // Go back to previous line and re-layout \n                            i = RestoreWordWrappingState(ref m_SavedLineState);\n\n                            m_isNewPage = true;\n                            m_xAdvance = 0 + tag_Indent;\n                            m_lineOffset = 0;\n                            m_maxAscender = 0;\n                            pageAscender = 0;\n                            m_lineNumber += 1;\n                            m_pageNumber += 1;\n                            continue;\n                        case TextOverflowModes.Linked:\n                            if (m_linkedTextComponent != null)\n                            {\n                                m_linkedTextComponent.text = text;\n                                m_linkedTextComponent.firstVisibleCharacter = m_characterCount;\n                                m_linkedTextComponent.ForceMeshUpdate();\n                            }\n\n                            // Truncate remaining text\n                            if (m_lineNumber > 0)\n                            {\n                                m_TextParsingBuffer[i].unicode = (char)0;\n\n                                m_totalCharacterCount = m_characterCount;\n\n                                // TODO : Optimize as we should be able to end the layout phase here without having to do another pass.\n                                GenerateTextMesh();\n                                m_isTextTruncated = true;\n                                return;\n                            }\n                            else\n                            {\n                                ClearMesh();\n                                return;\n                            }\n                    }\n                    #endregion End Text Overflow\n\n                }\n                #if TMP_PROFILE_ON\n                Profiler.EndSample();\n                #endif\n                #endregion Check Vertical Bounds\n\n\n                // Handle xAdvance & Tabulation Stops. Tab stops at every 25% of Font Size.\n                #region XAdvance, Tabulation & Stops\n                if (charCode == 9)\n                {\n                    float tabSize = m_currentFontAsset.faceInfo.tabWidth * m_currentFontAsset.tabSize * currentElementScale;\n                    float tabs = Mathf.Ceil(m_xAdvance / tabSize) * tabSize;\n                    m_xAdvance = tabs > m_xAdvance ? tabs : m_xAdvance + tabSize;\n                }\n                else if (m_monoSpacing != 0)\n                {\n                    m_xAdvance += (m_monoSpacing - monoAdvance + ((characterSpacingAdjustment + m_currentFontAsset.normalSpacingOffset) * currentElementScale) + m_cSpacing) * (1 - m_charWidthAdjDelta);\n\n                    if (char.IsWhiteSpace((char)charCode) || charCode == 0x200B)\n                        m_xAdvance += m_wordSpacing * currentElementScale;\n                }\n                else if (!m_isRightToLeft)\n                {\n                    float scaleFXMultiplier = 1;\n                    if (m_isFXMatrixSet) scaleFXMultiplier = m_FXMatrix.lossyScale.x;\n\n                    m_xAdvance += ((m_cached_TextElement.glyph.metrics.horizontalAdvance * scaleFXMultiplier * bold_xAdvance_multiplier + characterSpacingAdjustment + m_currentFontAsset.normalSpacingOffset + glyphAdjustments.xAdvance) * currentElementScale + m_cSpacing) * (1 - m_charWidthAdjDelta);\n\n                    if (char.IsWhiteSpace((char)charCode) || charCode == 0x200B)\n                        m_xAdvance += m_wordSpacing * currentElementScale;\n                }\n                else\n                {\n                    m_xAdvance -= glyphAdjustments.xAdvance * currentElementScale;\n                }\n\n\n                // Store xAdvance information\n                m_textInfo.characterInfo[m_characterCount].xAdvance = m_xAdvance;\n\n                #endregion Tabulation & Stops\n\n\n                // Handle Carriage Return\n                #region Carriage Return\n                if (charCode == 13)\n                {\n                    m_xAdvance = 0 + tag_Indent;\n                }\n                #endregion Carriage Return\n\n\n                // Handle Line Spacing Adjustments + Word Wrapping & special case for last line.\n                #region Check for Line Feed and Last Character\n                #if TMP_PROFILE_ON\n                Profiler.BeginSample(\"Process Linefeed\");\n                #endif\n                if (charCode == 10 || m_characterCount == totalCharacterCount - 1)\n                {\n                    // Check if Line Spacing of previous line needs to be adjusted.\n                    if (m_lineNumber > 0 && !TMP_Math.Approximately(m_maxLineAscender, m_startOfLineAscender) && m_lineHeight == TMP_Math.FLOAT_UNSET && !m_isNewPage)\n                    {\n                        //Debug.Log(\"Line Feed - Adjusting Line Spacing on line #\" + m_lineNumber);\n                        float offsetDelta = m_maxLineAscender - m_startOfLineAscender;\n                        AdjustLineOffset(m_firstCharacterOfLine, m_characterCount, offsetDelta);\n                        elementDescenderII -= offsetDelta;\n                        m_lineOffset += offsetDelta;\n                    }\n                    m_isNewPage = false;\n\n                    // Calculate lineAscender & make sure if last character is superscript or subscript that we check that as well.\n                    float lineAscender = m_maxLineAscender - m_lineOffset;\n                    float lineDescender = m_maxLineDescender - m_lineOffset;\n\n                    // Update maxDescender and maxVisibleDescender\n                    m_maxDescender = m_maxDescender < lineDescender ? m_maxDescender : lineDescender;\n                    if (!isMaxVisibleDescenderSet)\n                        maxVisibleDescender = m_maxDescender;\n\n                    if (m_useMaxVisibleDescender && (m_characterCount >= m_maxVisibleCharacters || m_lineNumber >= m_maxVisibleLines))\n                        isMaxVisibleDescenderSet = true;\n\n                    // Save Line Information\n                    m_textInfo.lineInfo[m_lineNumber].firstCharacterIndex = m_firstCharacterOfLine;\n                    m_textInfo.lineInfo[m_lineNumber].firstVisibleCharacterIndex = m_firstVisibleCharacterOfLine = m_firstCharacterOfLine > m_firstVisibleCharacterOfLine ? m_firstCharacterOfLine : m_firstVisibleCharacterOfLine;\n                    m_textInfo.lineInfo[m_lineNumber].lastCharacterIndex = m_lastCharacterOfLine = m_characterCount;\n                    m_textInfo.lineInfo[m_lineNumber].lastVisibleCharacterIndex = m_lastVisibleCharacterOfLine = m_lastVisibleCharacterOfLine < m_firstVisibleCharacterOfLine ? m_firstVisibleCharacterOfLine : m_lastVisibleCharacterOfLine;\n\n                    m_textInfo.lineInfo[m_lineNumber].characterCount = m_textInfo.lineInfo[m_lineNumber].lastCharacterIndex - m_textInfo.lineInfo[m_lineNumber].firstCharacterIndex + 1;\n                    m_textInfo.lineInfo[m_lineNumber].visibleCharacterCount = m_lineVisibleCharacterCount;\n                    m_textInfo.lineInfo[m_lineNumber].lineExtents.min = new Vector2(m_textInfo.characterInfo[m_firstVisibleCharacterOfLine].bottomLeft.x, lineDescender);\n                    m_textInfo.lineInfo[m_lineNumber].lineExtents.max = new Vector2(m_textInfo.characterInfo[m_lastVisibleCharacterOfLine].topRight.x, lineAscender);\n                    m_textInfo.lineInfo[m_lineNumber].length = m_textInfo.lineInfo[m_lineNumber].lineExtents.max.x - (padding * currentElementScale);\n                    m_textInfo.lineInfo[m_lineNumber].width = width;\n\n                    if (m_textInfo.lineInfo[m_lineNumber].characterCount == 1)\n                        m_textInfo.lineInfo[m_lineNumber].alignment = m_lineJustification;\n\n                    if (m_textInfo.characterInfo[m_lastVisibleCharacterOfLine].isVisible)\n                        m_textInfo.lineInfo[m_lineNumber].maxAdvance = m_textInfo.characterInfo[m_lastVisibleCharacterOfLine].xAdvance - (characterSpacingAdjustment + m_currentFontAsset.normalSpacingOffset) * currentElementScale - m_cSpacing;\n                    else\n                        m_textInfo.lineInfo[m_lineNumber].maxAdvance = m_textInfo.characterInfo[m_lastCharacterOfLine].xAdvance - (characterSpacingAdjustment + m_currentFontAsset.normalSpacingOffset) * currentElementScale - m_cSpacing;\n\n                    m_textInfo.lineInfo[m_lineNumber].baseline = 0 - m_lineOffset;\n                    m_textInfo.lineInfo[m_lineNumber].ascender = lineAscender;\n                    m_textInfo.lineInfo[m_lineNumber].descender = lineDescender;\n                    m_textInfo.lineInfo[m_lineNumber].lineHeight = lineAscender - lineDescender + lineGap * baseScale;\n\n                    m_firstCharacterOfLine = m_characterCount + 1;\n                    m_lineVisibleCharacterCount = 0;\n\n                    // Add new line if not last line or character.\n                    if (charCode == 10)\n                    {\n                        // Store the state of the line before starting on the new line.\n                        SaveWordWrappingState(ref m_SavedLineState, i, m_characterCount);\n                        // Store the state of the last Character before the new line.\n                        SaveWordWrappingState(ref m_SavedWordWrapState, i, m_characterCount);\n\n                        m_lineNumber += 1;\n                        isStartOfNewLine = true;\n                        ignoreNonBreakingSpace = false;\n                        isFirstWord = true;\n\n                        // Check to make sure Array is large enough to hold a new line.\n                        if (m_lineNumber >= m_textInfo.lineInfo.Length)\n                            ResizeLineExtents(m_lineNumber);\n\n                        // Apply Line Spacing\n                        if (m_lineHeight == TMP_Math.FLOAT_UNSET)\n                        {\n                            lineOffsetDelta = 0 - m_maxLineDescender + elementAscender + (lineGap + m_lineSpacing + m_paragraphSpacing + m_lineSpacingDelta) * baseScale;\n                            m_lineOffset += lineOffsetDelta;\n                        }\n                        else\n                            m_lineOffset += m_lineHeight + (m_lineSpacing + m_paragraphSpacing) * baseScale;\n\n                        m_maxLineAscender = k_LargeNegativeFloat;\n                        m_maxLineDescender = k_LargePositiveFloat;\n                        m_startOfLineAscender = elementAscender;\n\n                        m_xAdvance = 0 + tag_LineIndent + tag_Indent;\n\n                        ellipsisIndex = m_characterCount - 1;\n\n                        m_characterCount += 1;\n                        continue;\n                    }\n                }\n                #if TMP_PROFILE_ON\n                Profiler.EndSample();\n                #endif\n                #endregion Check for Linefeed or Last Character\n\n\n                // Store Rectangle positions for each Character.\n                #region Save CharacterInfo for the current character.\n                #if TMP_PROFILE_ON\n                Profiler.BeginSample(\"Save CharacterInfo & Extents\");\n                #endif\n                // Determine the bounds of the Mesh.\n                if (m_textInfo.characterInfo[m_characterCount].isVisible)\n                {\n                    m_meshExtents.min.x = Mathf.Min(m_meshExtents.min.x, m_textInfo.characterInfo[m_characterCount].bottomLeft.x);\n                    m_meshExtents.min.y = Mathf.Min(m_meshExtents.min.y, m_textInfo.characterInfo[m_characterCount].bottomLeft.y);\n\n                    m_meshExtents.max.x = Mathf.Max(m_meshExtents.max.x, m_textInfo.characterInfo[m_characterCount].topRight.x);\n                    m_meshExtents.max.y = Mathf.Max(m_meshExtents.max.y, m_textInfo.characterInfo[m_characterCount].topRight.y);\n\n                    //m_meshExtents.min = new Vector2(Mathf.Min(m_meshExtents.min.x, m_textInfo.characterInfo[m_characterCount].bottomLeft.x), Mathf.Min(m_meshExtents.min.y, m_textInfo.characterInfo[m_characterCount].bottomLeft.y));\n                    //m_meshExtents.max = new Vector2(Mathf.Max(m_meshExtents.max.x, m_textInfo.characterInfo[m_characterCount].topRight.x), Mathf.Max(m_meshExtents.max.y, m_textInfo.characterInfo[m_characterCount].topRight.y));\n                }\n\n\n                // Save pageInfo Data\n                if (m_overflowMode == TextOverflowModes.Page && charCode != 13 && charCode != 10) // && m_pageNumber < 16)\n                {\n                    // Check if we need to increase allocations for the pageInfo array.\n                    if (m_pageNumber + 1 > m_textInfo.pageInfo.Length)\n                        TMP_TextInfo.Resize(ref m_textInfo.pageInfo, m_pageNumber + 1, true);\n\n                    m_textInfo.pageInfo[m_pageNumber].ascender = pageAscender;\n                    m_textInfo.pageInfo[m_pageNumber].descender = elementDescender < m_textInfo.pageInfo[m_pageNumber].descender ? elementDescender : m_textInfo.pageInfo[m_pageNumber].descender;\n\n                    if (m_pageNumber == 0 && m_characterCount == 0)\n                        m_textInfo.pageInfo[m_pageNumber].firstCharacterIndex = m_characterCount;\n                    else if (m_characterCount > 0 && m_pageNumber != m_textInfo.characterInfo[m_characterCount - 1].pageNumber)\n                    {\n                        m_textInfo.pageInfo[m_pageNumber - 1].lastCharacterIndex = m_characterCount - 1;\n                        m_textInfo.pageInfo[m_pageNumber].firstCharacterIndex = m_characterCount;\n                    }\n                    else if (m_characterCount == totalCharacterCount - 1)\n                        m_textInfo.pageInfo[m_pageNumber].lastCharacterIndex = m_characterCount;\n                }\n                #if TMP_PROFILE_ON\n                Profiler.EndSample();\n                #endif\n                #endregion Saving CharacterInfo\n\n\n                // Save State of Mesh Creation for handling of Word Wrapping\n                #region Save Word Wrapping State\n                #if TMP_PROFILE_ON\n                Profiler.BeginSample(\"Save Word Wrapping State\");\n                #endif\n                if (m_enableWordWrapping || m_overflowMode == TextOverflowModes.Truncate || m_overflowMode == TextOverflowModes.Ellipsis)\n                {\n                    if ((char.IsWhiteSpace((char)charCode) || charCode == 0x200B || charCode == 0x2D || charCode == 0xAD) && (!m_isNonBreakingSpace || ignoreNonBreakingSpace) && charCode != 0xA0 && charCode != 0x2007 && charCode != 0x2011 && charCode != 0x202F && charCode != 0x2060)\n                    {\n                        // We store the state of numerous variables for the most recent Space, LineFeed or Carriage Return to enable them to be restored \n                        // for Word Wrapping.\n                        SaveWordWrappingState(ref m_SavedWordWrapState, i, m_characterCount);\n                        m_isCharacterWrappingEnabled = false;\n                        isFirstWord = false;\n                    }\n                    // Handling for East Asian languages\n                    else if ((  charCode > 0x1100 && charCode < 0x11ff || /* Hangul Jamo */\n                                charCode > 0x2E80 && charCode < 0x9FFF || /* CJK */\n                                charCode > 0xA960 && charCode < 0xA97F || /* Hangul Jame Extended-A */\n                                charCode > 0xAC00 && charCode < 0xD7FF || /* Hangul Syllables */\n                                charCode > 0xF900 && charCode < 0xFAFF || /* CJK Compatibility Ideographs */\n                                charCode > 0xFE30 && charCode < 0xFE4F || /* CJK Compatibility Forms */\n                                charCode > 0xFF00 && charCode < 0xFFEF)   /* CJK Halfwidth */\n                                && !m_isNonBreakingSpace)\n                    {\n                        if (isFirstWord || isLastBreakingChar || TMP_Settings.linebreakingRules.leadingCharacters.ContainsKey(charCode) == false &&\n                            (m_characterCount < totalCharacterCount - 1 &&\n                            TMP_Settings.linebreakingRules.followingCharacters.ContainsKey(m_textInfo.characterInfo[m_characterCount + 1].character) == false))\n                        {\n                            SaveWordWrappingState(ref m_SavedWordWrapState, i, m_characterCount);\n                            m_isCharacterWrappingEnabled = false;\n                            isFirstWord = false;\n                        }\n                    }\n                    else if ((isFirstWord || m_isCharacterWrappingEnabled == true || isLastBreakingChar))\n                        SaveWordWrappingState(ref m_SavedWordWrapState, i, m_characterCount);\n\n                }\n                #if TMP_PROFILE_ON\n                Profiler.EndSample();\n                #endif\n                #endregion Save Word Wrapping State\n\n                m_characterCount += 1;\n            }\n\n            // Check Auto Sizing and increase font size to fill text container.\n            #region Check Auto-Sizing (Upper Font Size Bounds)\n            fontSizeDelta = m_maxFontSize - m_minFontSize;\n            if (!m_isCharacterWrappingEnabled && m_enableAutoSizing && fontSizeDelta > 0.051f && m_fontSize < m_fontSizeMax)\n            {\n                m_minFontSize = m_fontSize;\n                m_fontSize += Mathf.Max((m_maxFontSize - m_fontSize) / 2, 0.05f);\n                m_fontSize = (int)(Mathf.Min(m_fontSize, m_fontSizeMax) * 20 + 0.5f) / 20f;\n\n                //Debug.Log(m_fontSize);\n\n                if (loopCountA > 20) return; // Added to debug\n                GenerateTextMesh();\n                return;\n            }\n            #endregion End Auto-sizing Check\n\n\n            m_isCharacterWrappingEnabled = false;\n\n            #if TMP_PROFILE_PHASES_ON\n                Profiler.EndSample();\n            #endif\n\n            //Debug.Log(\"Iteration Count: \" + loopCountA + \". Final Point Size: \" + m_fontSize); // + \"  B: \" + loopCountB + \"  C: \" + loopCountC + \"  D: \" + loopCountD);\n\n            // *** PHASE II of Text Generation ***\n            #if TMP_PROFILE_PHASES_ON\n                Profiler.BeginSample(\"TMP Generate Text - Phase II\");\n            #endif\n\n            // If there are no visible characters... no need to continue\n            if (m_characterCount == 0) // && m_visibleSpriteCount == 0)\n            {\n                ClearMesh();\n\n                // Event indicating the text has been regenerated.\n                TMPro_EventManager.ON_TEXT_CHANGED(this);\n                return;\n            }\n\n\n            // *** PHASE II of Text Generation ***\n            int last_vert_index = m_materialReferences[0].referenceCount * 4;\n\n            // Partial clear of the vertices array to mark unused vertices as degenerate.\n            m_textInfo.meshInfo[0].Clear(false);\n\n            // Handle Text Alignment\n            #region Text Vertical Alignment\n            #if TMP_PROFILE_ON\n            Profiler.BeginSample(\"Vertical Text Alignment\");\n            #endif\n            Vector3 anchorOffset = Vector3.zero;\n            Vector3[] corners = m_RectTransformCorners; // GetTextContainerLocalCorners();\n\n            switch (m_textAlignment)\n            {\n                // Top Vertically\n                case TextAlignmentOptions.Top:\n                case TextAlignmentOptions.TopLeft:\n                case TextAlignmentOptions.TopRight:\n                case TextAlignmentOptions.TopJustified:\n                case TextAlignmentOptions.TopFlush:\n                case TextAlignmentOptions.TopGeoAligned:\n                    if (m_overflowMode != TextOverflowModes.Page)\n                        anchorOffset = corners[1] + new Vector3(0 + margins.x, 0 - m_maxAscender - margins.y, 0);\n                    else\n                        anchorOffset = corners[1] + new Vector3(0 + margins.x, 0 - m_textInfo.pageInfo[pageToDisplay].ascender - margins.y, 0);\n                    break;\n\n                // Middle Vertically\n                case TextAlignmentOptions.Left:\n                case TextAlignmentOptions.Right:\n                case TextAlignmentOptions.Center:\n                case TextAlignmentOptions.Justified:\n                case TextAlignmentOptions.Flush:\n                case TextAlignmentOptions.CenterGeoAligned:\n                    if (m_overflowMode != TextOverflowModes.Page)\n                        anchorOffset = (corners[0] + corners[1]) / 2 + new Vector3(0 + margins.x, 0 - (m_maxAscender + margins.y + maxVisibleDescender - margins.w) / 2, 0);\n                    else\n                        anchorOffset = (corners[0] + corners[1]) / 2 + new Vector3(0 + margins.x, 0 - (m_textInfo.pageInfo[pageToDisplay].ascender + margins.y + m_textInfo.pageInfo[pageToDisplay].descender - margins.w) / 2, 0);\n                    break;\n\n                // Bottom Vertically\n                case TextAlignmentOptions.Bottom:\n                case TextAlignmentOptions.BottomLeft:\n                case TextAlignmentOptions.BottomRight:\n                case TextAlignmentOptions.BottomJustified:\n                case TextAlignmentOptions.BottomFlush:\n                case TextAlignmentOptions.BottomGeoAligned:\n                    if (m_overflowMode != TextOverflowModes.Page)\n                        anchorOffset = corners[0] + new Vector3(0 + margins.x, 0 - maxVisibleDescender + margins.w, 0);\n                    else\n                        anchorOffset = corners[0] + new Vector3(0 + margins.x, 0 - m_textInfo.pageInfo[pageToDisplay].descender + margins.w, 0);\n                    break;\n\n                // Baseline Vertically\n                case TextAlignmentOptions.Baseline:\n                case TextAlignmentOptions.BaselineLeft:\n                case TextAlignmentOptions.BaselineRight:\n                case TextAlignmentOptions.BaselineJustified:\n                case TextAlignmentOptions.BaselineFlush:\n                case TextAlignmentOptions.BaselineGeoAligned:\n                    anchorOffset = (corners[0] + corners[1]) / 2 + new Vector3(0 + margins.x, 0, 0);\n                    break;\n\n                // Midline Vertically \n                case TextAlignmentOptions.MidlineLeft:\n                case TextAlignmentOptions.Midline:\n                case TextAlignmentOptions.MidlineRight:\n                case TextAlignmentOptions.MidlineJustified:\n                case TextAlignmentOptions.MidlineFlush:\n                case TextAlignmentOptions.MidlineGeoAligned:\n                    anchorOffset = (corners[0] + corners[1]) / 2 + new Vector3(0 + margins.x, 0 - (m_meshExtents.max.y + margins.y + m_meshExtents.min.y - margins.w) / 2, 0);\n                    break;\n\n                // Capline Vertically \n                case TextAlignmentOptions.CaplineLeft:\n                case TextAlignmentOptions.Capline:\n                case TextAlignmentOptions.CaplineRight:\n                case TextAlignmentOptions.CaplineJustified:\n                case TextAlignmentOptions.CaplineFlush:\n                case TextAlignmentOptions.CaplineGeoAligned:\n                    anchorOffset = (corners[0] + corners[1]) / 2 + new Vector3(0 + margins.x, 0 - (m_maxCapHeight - margins.y - margins.w) / 2, 0);\n                    break;\n            }\n            #if TMP_PROFILE_ON\n            Profiler.EndSample();\n            #endif\n            #endregion\n\n\n            // Initialization for Second Pass\n            Vector3 justificationOffset = Vector3.zero;\n            Vector3 offset = Vector3.zero;\n            int vert_index_X4 = 0;\n            int sprite_index_X4 = 0;\n\n            int wordCount = 0;\n            int lineCount = 0;\n            int lastLine = 0;\n            bool isFirstSeperator = false;\n\n            bool isStartOfWord = false;\n            int wordFirstChar = 0;\n            int wordLastChar = 0;\n\n            // Second Pass : Line Justification, UV Mapping, Character & Line Visibility & more.\n            #region Handle Line Justification & UV Mapping & Character Visibility & More\n\n            // Variables used to handle Canvas Render Modes and SDF Scaling\n            bool isCameraAssigned = m_canvas.worldCamera == null ? false : true;\n            float lossyScale = m_previousLossyScaleY = this.transform.lossyScale.y;\n            RenderMode canvasRenderMode = m_canvas.renderMode;\n            float canvasScaleFactor = m_canvas.scaleFactor;\n\n            Color32 underlineColor = Color.white;\n            Color32 strikethroughColor = Color.white;\n            Color32 highlightColor = new Color32(255, 255, 0, 64);\n            float xScale = 0;\n            float xScaleMax = 0;\n            float underlineStartScale = 0;\n            float underlineEndScale = 0;\n            float underlineMaxScale = 0;\n            float underlineBaseLine = k_LargePositiveFloat;\n            int lastPage = 0;\n\n            float strikethroughPointSize = 0;\n            float strikethroughScale = 0;\n            float strikethroughBaseline = 0;\n\n            TMP_CharacterInfo[] characterInfos = m_textInfo.characterInfo;\n            #region Handle Line Justification & UV Mapping & Character Visibility & More\n            for (int i = 0; i < m_characterCount; i++)\n            {\n                TMP_FontAsset currentFontAsset = characterInfos[i].fontAsset;\n\n                char currentCharacter = characterInfos[i].character;\n\n                int currentLine = characterInfos[i].lineNumber;\n                TMP_LineInfo lineInfo = m_textInfo.lineInfo[currentLine];\n                lineCount = currentLine + 1;\n\n                TextAlignmentOptions lineAlignment = lineInfo.alignment;\n\n                // Process Line Justification\n                #region Handle Line Justification\n                #if TMP_PROFILE_ON\n                Profiler.BeginSample(\"Horizontal Text Alignment\");\n                #endif \n                //if (!characterInfos[i].isIgnoringAlignment)\n                //{\n                switch (lineAlignment)\n                {\n                    case TextAlignmentOptions.TopLeft:\n                    case TextAlignmentOptions.Left:\n                    case TextAlignmentOptions.BottomLeft:\n                    case TextAlignmentOptions.BaselineLeft:\n                    case TextAlignmentOptions.MidlineLeft:\n                    case TextAlignmentOptions.CaplineLeft:\n                        if (!m_isRightToLeft)\n                            justificationOffset = new Vector3(0 + lineInfo.marginLeft, 0, 0);\n                        else\n                            justificationOffset = new Vector3(0 - lineInfo.maxAdvance, 0, 0);\n                        break;\n\n                    case TextAlignmentOptions.Top:\n                    case TextAlignmentOptions.Center:\n                    case TextAlignmentOptions.Bottom:\n                    case TextAlignmentOptions.Baseline:\n                    case TextAlignmentOptions.Midline:\n                    case TextAlignmentOptions.Capline:\n                        justificationOffset = new Vector3(lineInfo.marginLeft + lineInfo.width / 2 - lineInfo.maxAdvance / 2, 0, 0);\n                        break;\n\n                    case TextAlignmentOptions.TopGeoAligned:\n                    case TextAlignmentOptions.CenterGeoAligned:\n                    case TextAlignmentOptions.BottomGeoAligned:\n                    case TextAlignmentOptions.BaselineGeoAligned:\n                    case TextAlignmentOptions.MidlineGeoAligned:\n                    case TextAlignmentOptions.CaplineGeoAligned:\n                        justificationOffset = new Vector3(lineInfo.marginLeft + lineInfo.width / 2 - (lineInfo.lineExtents.min.x + lineInfo.lineExtents.max.x) / 2, 0, 0);\n                        break;\n\n                    case TextAlignmentOptions.TopRight:\n                    case TextAlignmentOptions.Right:\n                    case TextAlignmentOptions.BottomRight:\n                    case TextAlignmentOptions.BaselineRight:\n                    case TextAlignmentOptions.MidlineRight:\n                    case TextAlignmentOptions.CaplineRight:\n                        if (!m_isRightToLeft)\n                            justificationOffset = new Vector3(lineInfo.marginLeft + lineInfo.width - lineInfo.maxAdvance, 0, 0);\n                        else\n                            justificationOffset = new Vector3(lineInfo.marginLeft + lineInfo.width, 0, 0);\n                        break;\n\n                    case TextAlignmentOptions.TopJustified:\n                    case TextAlignmentOptions.Justified:\n                    case TextAlignmentOptions.BottomJustified:\n                    case TextAlignmentOptions.BaselineJustified:\n                    case TextAlignmentOptions.MidlineJustified:\n                    case TextAlignmentOptions.CaplineJustified:\n                    case TextAlignmentOptions.TopFlush:\n                    case TextAlignmentOptions.Flush:\n                    case TextAlignmentOptions.BottomFlush:\n                    case TextAlignmentOptions.BaselineFlush:\n                    case TextAlignmentOptions.MidlineFlush:\n                    case TextAlignmentOptions.CaplineFlush:\n                        // Skip Zero Width Characters\n                        if (currentCharacter == 0xAD || currentCharacter == 0x200B || currentCharacter == 0x2060) break;\n\n                        char lastCharOfCurrentLine = characterInfos[lineInfo.lastCharacterIndex].character;\n                        bool isFlush = ((_HorizontalAlignmentOptions)lineAlignment & _HorizontalAlignmentOptions.Flush) == _HorizontalAlignmentOptions.Flush;\n\n                        // In Justified mode, all lines are justified except the last one.\n                        // In Flush mode, all lines are justified.\n                        if (char.IsControl(lastCharOfCurrentLine) == false && currentLine < m_lineNumber || isFlush || lineInfo.maxAdvance > lineInfo.width)\n                        {\n                            // First character of each line.\n                            if (currentLine != lastLine || i == 0 || i == m_firstVisibleCharacter)\n                            {\n                                if (!m_isRightToLeft)\n                                    justificationOffset = new Vector3(lineInfo.marginLeft, 0, 0);\n                                else\n                                    justificationOffset = new Vector3(lineInfo.marginLeft + lineInfo.width, 0, 0);\n\n                                if (char.IsSeparator(currentCharacter))\n                                    isFirstSeperator = true;\n                                else\n                                    isFirstSeperator = false;\n                            }\n                            else\n                            {\n                                float gap = !m_isRightToLeft ? lineInfo.width - lineInfo.maxAdvance : lineInfo.width + lineInfo.maxAdvance;\n\n                                int visibleCount = lineInfo.visibleCharacterCount - 1 + lineInfo.controlCharacterCount;\n\n                                // Get the number of spaces for each line ignoring the last character if it is not visible (ie. a space or linefeed).\n                                int spaces = (characterInfos[lineInfo.lastCharacterIndex].isVisible ? lineInfo.spaceCount : lineInfo.spaceCount - 1) - lineInfo.controlCharacterCount;\n\n                                if (isFirstSeperator) { spaces -= 1; visibleCount += 1; }\n\n                                float ratio = spaces > 0 ? m_wordWrappingRatios : 1;\n\n                                if (spaces < 1) spaces = 1;\n\n                                if (currentCharacter != 0xA0 && (currentCharacter == 9 || char.IsSeparator((char)currentCharacter)))\n                                {\n                                    if (!m_isRightToLeft)\n                                        justificationOffset += new Vector3(gap * (1 - ratio) / spaces, 0, 0);\n                                    else\n                                        justificationOffset -= new Vector3(gap * (1 - ratio) / spaces, 0, 0);\n                                }\n                                else\n                                {\n                                    if (!m_isRightToLeft)\n                                        justificationOffset += new Vector3(gap * ratio / visibleCount, 0, 0);\n                                    else\n                                        justificationOffset -= new Vector3(gap * ratio / visibleCount, 0, 0);\n                                }\n                            }\n                        }\n                        else\n                        {\n                            if (!m_isRightToLeft)\n                                justificationOffset = new Vector3(lineInfo.marginLeft, 0, 0); // Keep last line left justified.\n                            else\n                                justificationOffset = new Vector3(lineInfo.marginLeft + lineInfo.width, 0, 0); // Keep last line right justified.\n                        }\n                        //Debug.Log(\"Char [\" + (char)charCode + \"] Code:\" + charCode + \"  Line # \" + currentLine + \"  Offset:\" + justificationOffset + \"  # Spaces:\" + lineInfo.spaceCount + \"  # Characters:\" + lineInfo.characterCount);\n                        break;\n                }\n                //}\n                #if TMP_PROFILE_ON\n                Profiler.EndSample();\n                #endif\n                #endregion End Text Justification\n\n                offset = anchorOffset + justificationOffset;\n\n                // Handle UV2 mapping options and packing of scale information into UV2.\n                #region Handling of UV2 mapping & Scale packing\n                bool isCharacterVisible = characterInfos[i].isVisible;\n                if (isCharacterVisible)\n                {\n                    TMP_TextElementType elementType = characterInfos[i].elementType;\n                    switch (elementType)\n                    {\n                        // CHARACTERS\n                        case TMP_TextElementType.Character:\n                            Extents lineExtents = lineInfo.lineExtents;\n                            float uvOffset = (m_uvLineOffset * currentLine) % 1; // + m_uvOffset.x;\n\n                            // Setup UV2 based on Character Mapping Options Selected\n                            #region Handle UV Mapping Options\n                            #if TMP_PROFILE_ON\n                            Profiler.BeginSample(\"UV MAPPING\");\n                            #endif\n                            switch (m_horizontalMapping)\n                            {\n                                case TextureMappingOptions.Character:\n                                    characterInfos[i].vertex_BL.uv2.x = 0; //+ m_uvOffset.x;\n                                    characterInfos[i].vertex_TL.uv2.x = 0; //+ m_uvOffset.x;\n                                    characterInfos[i].vertex_TR.uv2.x = 1; //+ m_uvOffset.x;\n                                    characterInfos[i].vertex_BR.uv2.x = 1; //+ m_uvOffset.x;\n                                    break;\n\n                                case TextureMappingOptions.Line:\n                                    if (m_textAlignment != TextAlignmentOptions.Justified)\n                                    {\n                                        characterInfos[i].vertex_BL.uv2.x = (characterInfos[i].vertex_BL.position.x - lineExtents.min.x) / (lineExtents.max.x - lineExtents.min.x) + uvOffset;\n                                        characterInfos[i].vertex_TL.uv2.x = (characterInfos[i].vertex_TL.position.x - lineExtents.min.x) / (lineExtents.max.x - lineExtents.min.x) + uvOffset;\n                                        characterInfos[i].vertex_TR.uv2.x = (characterInfos[i].vertex_TR.position.x - lineExtents.min.x) / (lineExtents.max.x - lineExtents.min.x) + uvOffset;\n                                        characterInfos[i].vertex_BR.uv2.x = (characterInfos[i].vertex_BR.position.x - lineExtents.min.x) / (lineExtents.max.x - lineExtents.min.x) + uvOffset;\n                                        break;\n                                    }\n                                    else // Special Case if Justified is used in Line Mode.\n                                    {\n                                        characterInfos[i].vertex_BL.uv2.x = (characterInfos[i].vertex_BL.position.x + justificationOffset.x - m_meshExtents.min.x) / (m_meshExtents.max.x - m_meshExtents.min.x) + uvOffset;\n                                        characterInfos[i].vertex_TL.uv2.x = (characterInfos[i].vertex_TL.position.x + justificationOffset.x - m_meshExtents.min.x) / (m_meshExtents.max.x - m_meshExtents.min.x) + uvOffset;\n                                        characterInfos[i].vertex_TR.uv2.x = (characterInfos[i].vertex_TR.position.x + justificationOffset.x - m_meshExtents.min.x) / (m_meshExtents.max.x - m_meshExtents.min.x) + uvOffset;\n                                        characterInfos[i].vertex_BR.uv2.x = (characterInfos[i].vertex_BR.position.x + justificationOffset.x - m_meshExtents.min.x) / (m_meshExtents.max.x - m_meshExtents.min.x) + uvOffset;\n                                        break;\n                                    }\n\n                                case TextureMappingOptions.Paragraph:\n                                    characterInfos[i].vertex_BL.uv2.x = (characterInfos[i].vertex_BL.position.x + justificationOffset.x - m_meshExtents.min.x) / (m_meshExtents.max.x - m_meshExtents.min.x) + uvOffset;\n                                    characterInfos[i].vertex_TL.uv2.x = (characterInfos[i].vertex_TL.position.x + justificationOffset.x - m_meshExtents.min.x) / (m_meshExtents.max.x - m_meshExtents.min.x) + uvOffset;\n                                    characterInfos[i].vertex_TR.uv2.x = (characterInfos[i].vertex_TR.position.x + justificationOffset.x - m_meshExtents.min.x) / (m_meshExtents.max.x - m_meshExtents.min.x) + uvOffset;\n                                    characterInfos[i].vertex_BR.uv2.x = (characterInfos[i].vertex_BR.position.x + justificationOffset.x - m_meshExtents.min.x) / (m_meshExtents.max.x - m_meshExtents.min.x) + uvOffset;\n                                    break;\n\n                                case TextureMappingOptions.MatchAspect:\n\n                                    switch (m_verticalMapping)\n                                    {\n                                        case TextureMappingOptions.Character:\n                                            characterInfos[i].vertex_BL.uv2.y = 0; // + m_uvOffset.y;\n                                            characterInfos[i].vertex_TL.uv2.y = 1; // + m_uvOffset.y;\n                                            characterInfos[i].vertex_TR.uv2.y = 0; // + m_uvOffset.y;\n                                            characterInfos[i].vertex_BR.uv2.y = 1; // + m_uvOffset.y;\n                                            break;\n\n                                        case TextureMappingOptions.Line:\n                                            characterInfos[i].vertex_BL.uv2.y = (characterInfos[i].vertex_BL.position.y - lineExtents.min.y) / (lineExtents.max.y - lineExtents.min.y) + uvOffset;\n                                            characterInfos[i].vertex_TL.uv2.y = (characterInfos[i].vertex_TL.position.y - lineExtents.min.y) / (lineExtents.max.y - lineExtents.min.y) + uvOffset;\n                                            characterInfos[i].vertex_TR.uv2.y = characterInfos[i].vertex_BL.uv2.y;\n                                            characterInfos[i].vertex_BR.uv2.y = characterInfos[i].vertex_TL.uv2.y;\n                                            break;\n\n                                        case TextureMappingOptions.Paragraph:\n                                            characterInfos[i].vertex_BL.uv2.y = (characterInfos[i].vertex_BL.position.y - m_meshExtents.min.y) / (m_meshExtents.max.y - m_meshExtents.min.y) + uvOffset;\n                                            characterInfos[i].vertex_TL.uv2.y = (characterInfos[i].vertex_TL.position.y - m_meshExtents.min.y) / (m_meshExtents.max.y - m_meshExtents.min.y) + uvOffset;\n                                            characterInfos[i].vertex_TR.uv2.y = characterInfos[i].vertex_BL.uv2.y;\n                                            characterInfos[i].vertex_BR.uv2.y = characterInfos[i].vertex_TL.uv2.y;\n                                            break;\n\n                                        case TextureMappingOptions.MatchAspect:\n                                            Debug.Log(\"ERROR: Cannot Match both Vertical & Horizontal.\");\n                                            break;\n                                    }\n\n                                    //float xDelta = 1 - (_uv2s[vert_index + 0].y * textMeshCharacterInfo[i].AspectRatio); // Left aligned\n                                    float xDelta = (1 - ((characterInfos[i].vertex_BL.uv2.y + characterInfos[i].vertex_TL.uv2.y) * characterInfos[i].aspectRatio)) / 2; // Center of Rectangle\n\n                                    characterInfos[i].vertex_BL.uv2.x = (characterInfos[i].vertex_BL.uv2.y * characterInfos[i].aspectRatio) + xDelta + uvOffset;\n                                    characterInfos[i].vertex_TL.uv2.x = characterInfos[i].vertex_BL.uv2.x;\n                                    characterInfos[i].vertex_TR.uv2.x = (characterInfos[i].vertex_TL.uv2.y * characterInfos[i].aspectRatio) + xDelta + uvOffset;\n                                    characterInfos[i].vertex_BR.uv2.x = characterInfos[i].vertex_TR.uv2.x;\n                                    break;\n                            }\n\n                            switch (m_verticalMapping)\n                            {\n                                case TextureMappingOptions.Character:\n                                    characterInfos[i].vertex_BL.uv2.y = 0; // + m_uvOffset.y;\n                                    characterInfos[i].vertex_TL.uv2.y = 1; // + m_uvOffset.y;\n                                    characterInfos[i].vertex_TR.uv2.y = 1; // + m_uvOffset.y;\n                                    characterInfos[i].vertex_BR.uv2.y = 0; // + m_uvOffset.y;\n                                    break;\n\n                                case TextureMappingOptions.Line:\n                                    characterInfos[i].vertex_BL.uv2.y = (characterInfos[i].vertex_BL.position.y - lineInfo.descender) / (lineInfo.ascender - lineInfo.descender); // + m_uvOffset.y;\n                                    characterInfos[i].vertex_TL.uv2.y = (characterInfos[i].vertex_TL.position.y - lineInfo.descender) / (lineInfo.ascender - lineInfo.descender); // + m_uvOffset.y;\n                                    characterInfos[i].vertex_TR.uv2.y = characterInfos[i].vertex_TL.uv2.y;\n                                    characterInfos[i].vertex_BR.uv2.y = characterInfos[i].vertex_BL.uv2.y;\n                                    break;\n\n                                case TextureMappingOptions.Paragraph:\n                                    characterInfos[i].vertex_BL.uv2.y = (characterInfos[i].vertex_BL.position.y - m_meshExtents.min.y) / (m_meshExtents.max.y - m_meshExtents.min.y); // + m_uvOffset.y;\n                                    characterInfos[i].vertex_TL.uv2.y = (characterInfos[i].vertex_TL.position.y - m_meshExtents.min.y) / (m_meshExtents.max.y - m_meshExtents.min.y); // + m_uvOffset.y;\n                                    characterInfos[i].vertex_TR.uv2.y = characterInfos[i].vertex_TL.uv2.y;\n                                    characterInfos[i].vertex_BR.uv2.y = characterInfos[i].vertex_BL.uv2.y;\n                                    break;\n\n                                case TextureMappingOptions.MatchAspect:\n                                    float yDelta = (1 - ((characterInfos[i].vertex_BL.uv2.x + characterInfos[i].vertex_TR.uv2.x) / characterInfos[i].aspectRatio)) / 2; // Center of Rectangle\n\n                                    characterInfos[i].vertex_BL.uv2.y = yDelta + (characterInfos[i].vertex_BL.uv2.x / characterInfos[i].aspectRatio); // + m_uvOffset.y;\n                                    characterInfos[i].vertex_TL.uv2.y = yDelta + (characterInfos[i].vertex_TR.uv2.x / characterInfos[i].aspectRatio); // + m_uvOffset.y;\n                                    characterInfos[i].vertex_BR.uv2.y = characterInfos[i].vertex_BL.uv2.y;\n                                    characterInfos[i].vertex_TR.uv2.y = characterInfos[i].vertex_TL.uv2.y;\n                                    break;\n                            }\n                            #if TMP_PROFILE_ON\n                            Profiler.EndSample();\n                            #endif\n                            #endregion End UV Mapping Options\n\n                            // Pack UV's so that we can pass Xscale needed for Shader to maintain 1:1 ratio.\n                            #region Pack Scale into UV2\n                            #if TMP_PROFILE_ON\n                            Profiler.BeginSample(\"Pack UV\");\n                            #endif\n                            xScale = characterInfos[i].scale * (1 - m_charWidthAdjDelta);\n                            if (!characterInfos[i].isUsingAlternateTypeface && (characterInfos[i].style & FontStyles.Bold) == FontStyles.Bold) xScale *= -1;\n\n                            switch (canvasRenderMode)\n                            {\n                                case RenderMode.ScreenSpaceOverlay:\n                                    xScale *= Mathf.Abs(lossyScale) / canvasScaleFactor;\n                                    break;\n                                case RenderMode.ScreenSpaceCamera:\n                                    xScale *= isCameraAssigned ? Mathf.Abs(lossyScale) : 1;\n                                    break;\n                                case RenderMode.WorldSpace:\n                                    xScale *= Mathf.Abs(lossyScale);\n                                    break;\n                            }\n\n                            // isBold is encoded in the X value and SDF Scale in Y.\n                            //Vector2 vertexData = new Vector2((characterInfos[i].style & FontStyles.Bold) == FontStyles.Bold ? 1 : 0, xScale);\n                            //characterInfos[i].vertex_BL.uv2 = vertexData;\n                            //characterInfos[i].vertex_TL.uv2 = vertexData;\n                            //characterInfos[i].vertex_TR.uv2 = vertexData;\n                            //characterInfos[i].vertex_BR.uv2 = vertexData;\n\n                            float x0 = characterInfos[i].vertex_BL.uv2.x;\n                            float y0 = characterInfos[i].vertex_BL.uv2.y;\n                            float x1 = characterInfos[i].vertex_TR.uv2.x;\n                            float y1 = characterInfos[i].vertex_TR.uv2.y;\n\n                            float dx = (int)x0;\n                            float dy = (int)y0;\n\n                            x0 = x0 - dx;\n                            x1 = x1 - dx;\n                            y0 = y0 - dy;\n                            y1 = y1 - dy;\n\n                            // Optimization to avoid having a vector2 returned from the Pack UV function.\n                            characterInfos[i].vertex_BL.uv2.x = PackUV(x0, y0); characterInfos[i].vertex_BL.uv2.y = xScale;\n                            characterInfos[i].vertex_TL.uv2.x = PackUV(x0, y1); characterInfos[i].vertex_TL.uv2.y = xScale;\n                            characterInfos[i].vertex_TR.uv2.x = PackUV(x1, y1); characterInfos[i].vertex_TR.uv2.y = xScale;\n                            characterInfos[i].vertex_BR.uv2.x = PackUV(x1, y0); characterInfos[i].vertex_BR.uv2.y = xScale;\n                            #if TMP_PROFILE_ON\n                                Profiler.EndSample();\n                            #endif\n                            #endregion\n                            break;\n                        \n                        // SPRITES\n                        case TMP_TextElementType.Sprite:\n                            // Nothing right now\n                            break;\n                    }\n\n                    // Handle maxVisibleCharacters, maxVisibleLines and Overflow Page Mode.\n                    #region Handle maxVisibleCharacters / maxVisibleLines / Page Mode\n                    #if TMP_PROFILE_ON\n                    Profiler.BeginSample(\"Process MaxVisible Characters & Lines\");\n                    #endif\n                    if (i < m_maxVisibleCharacters && wordCount < m_maxVisibleWords && currentLine < m_maxVisibleLines && m_overflowMode != TextOverflowModes.Page)\n                    {\n                        characterInfos[i].vertex_BL.position += offset;\n                        characterInfos[i].vertex_TL.position += offset;\n                        characterInfos[i].vertex_TR.position += offset;\n                        characterInfos[i].vertex_BR.position += offset;\n                    }\n                    else if (i < m_maxVisibleCharacters && wordCount < m_maxVisibleWords && currentLine < m_maxVisibleLines && m_overflowMode == TextOverflowModes.Page && characterInfos[i].pageNumber == pageToDisplay)\n                    {\n                        characterInfos[i].vertex_BL.position += offset;\n                        characterInfos[i].vertex_TL.position += offset;\n                        characterInfos[i].vertex_TR.position += offset;\n                        characterInfos[i].vertex_BR.position += offset;\n                    }\n                    else\n                    {\n                        characterInfos[i].vertex_BL.position = Vector3.zero;\n                        characterInfos[i].vertex_TL.position = Vector3.zero;\n                        characterInfos[i].vertex_TR.position = Vector3.zero;\n                        characterInfos[i].vertex_BR.position = Vector3.zero;\n                        characterInfos[i].isVisible = false;\n                    }\n                    #if TMP_PROFILE_ON\n                    Profiler.EndSample();\n                    #endif\n                    #endregion\n\n\n                    // Fill Vertex Buffers for the various types of element\n                    if (elementType == TMP_TextElementType.Character)\n                    {\n                        FillCharacterVertexBuffers(i, vert_index_X4);\n                    }\n                    else if (elementType == TMP_TextElementType.Sprite)\n                    {\n                        FillSpriteVertexBuffers(i, sprite_index_X4);\n                    }\n                }\n                #endregion\n\n                // Apply Alignment and Justification Offset\n                m_textInfo.characterInfo[i].bottomLeft += offset;\n                m_textInfo.characterInfo[i].topLeft += offset;\n                m_textInfo.characterInfo[i].topRight += offset;\n                m_textInfo.characterInfo[i].bottomRight += offset;\n\n                m_textInfo.characterInfo[i].origin += offset.x;\n                m_textInfo.characterInfo[i].xAdvance += offset.x;\n\n                m_textInfo.characterInfo[i].ascender += offset.y;\n                m_textInfo.characterInfo[i].descender += offset.y;\n                m_textInfo.characterInfo[i].baseLine += offset.y;\n\n                // Update MeshExtents\n                if (isCharacterVisible)\n                {\n                    //m_meshExtents.min = new Vector2(Mathf.Min(m_meshExtents.min.x, m_textInfo.characterInfo[i].bottomLeft.x), Mathf.Min(m_meshExtents.min.y, m_textInfo.characterInfo[i].bottomLeft.y));\n                    //m_meshExtents.max = new Vector2(Mathf.Max(m_meshExtents.max.x, m_textInfo.characterInfo[i].topRight.x), Mathf.Max(m_meshExtents.max.y, m_textInfo.characterInfo[i].topLeft.y));\n                }\n\n                // Need to recompute lineExtent to account for the offset from justification.\n                #region Adjust lineExtents resulting from alignment offset\n                #if TMP_PROFILE_ON\n                    Profiler.BeginSample(\"Adjust LineExtents\");\n                #endif\n                if (currentLine != lastLine || i == m_characterCount - 1)\n                {\n                    // Update the previous line's extents\n                    if (currentLine != lastLine)\n                    {\n                        m_textInfo.lineInfo[lastLine].baseline += offset.y;\n                        m_textInfo.lineInfo[lastLine].ascender += offset.y;\n                        m_textInfo.lineInfo[lastLine].descender += offset.y;\n\n                        m_textInfo.lineInfo[lastLine].lineExtents.min = new Vector2(m_textInfo.characterInfo[m_textInfo.lineInfo[lastLine].firstCharacterIndex].bottomLeft.x, m_textInfo.lineInfo[lastLine].descender);\n                        m_textInfo.lineInfo[lastLine].lineExtents.max = new Vector2(m_textInfo.characterInfo[m_textInfo.lineInfo[lastLine].lastVisibleCharacterIndex].topRight.x, m_textInfo.lineInfo[lastLine].ascender);\n                    }\n\n                    // Update the current line's extents\n                    if (i == m_characterCount - 1)\n                    {\n                        m_textInfo.lineInfo[currentLine].baseline += offset.y;\n                        m_textInfo.lineInfo[currentLine].ascender += offset.y;\n                        m_textInfo.lineInfo[currentLine].descender += offset.y;\n\n                        m_textInfo.lineInfo[currentLine].lineExtents.min = new Vector2(m_textInfo.characterInfo[m_textInfo.lineInfo[currentLine].firstCharacterIndex].bottomLeft.x, m_textInfo.lineInfo[currentLine].descender);\n                        m_textInfo.lineInfo[currentLine].lineExtents.max = new Vector2(m_textInfo.characterInfo[m_textInfo.lineInfo[currentLine].lastVisibleCharacterIndex].topRight.x, m_textInfo.lineInfo[currentLine].ascender);\n                    }\n                }\n                #if TMP_PROFILE_ON\n                Profiler.EndSample();\n                #endif\n                #endregion\n\n\n                // Track Word Count per line and for the object\n                #region Track Word Count\n                #if TMP_PROFILE_ON\n                Profiler.BeginSample(\"Track Word Count\");\n                #endif\n                if (char.IsLetterOrDigit(currentCharacter) || currentCharacter == 0x2D || currentCharacter == 0xAD || currentCharacter == 0x2010 || currentCharacter == 0x2011)\n                {\n                    if (isStartOfWord == false)\n                    {\n                        isStartOfWord = true;\n                        wordFirstChar = i;\n                    }\n\n                    // If last character is a word\n                    if (isStartOfWord && i == m_characterCount - 1)\n                    {\n                        int size = m_textInfo.wordInfo.Length;\n                        int index = m_textInfo.wordCount;\n\n                        if (m_textInfo.wordCount + 1 > size)\n                            TMP_TextInfo.Resize(ref m_textInfo.wordInfo, size + 1);\n\n                        wordLastChar = i;\n\n                        m_textInfo.wordInfo[index].firstCharacterIndex = wordFirstChar;\n                        m_textInfo.wordInfo[index].lastCharacterIndex = wordLastChar;\n                        m_textInfo.wordInfo[index].characterCount = wordLastChar - wordFirstChar + 1;\n                        m_textInfo.wordInfo[index].textComponent = this;\n\n                        wordCount += 1;\n                        m_textInfo.wordCount += 1;\n                        m_textInfo.lineInfo[currentLine].wordCount += 1;\n                    }\n                }\n                else if (isStartOfWord || i == 0 && (!char.IsPunctuation(currentCharacter) || char.IsWhiteSpace(currentCharacter) || currentCharacter == 0x200B || i == m_characterCount - 1))\n                {\n                    if (i > 0 && i < characterInfos.Length - 1 && i < m_characterCount && (currentCharacter == 39 || currentCharacter == 8217) && char.IsLetterOrDigit(characterInfos[i - 1].character) && char.IsLetterOrDigit(characterInfos[i + 1].character))\n                    {\n\n                    }\n                    else\n                    {\n                        wordLastChar = i == m_characterCount - 1 && char.IsLetterOrDigit(currentCharacter) ? i : i - 1;\n                        isStartOfWord = false;\n\n                        int size = m_textInfo.wordInfo.Length;\n                        int index = m_textInfo.wordCount;\n\n                        if (m_textInfo.wordCount + 1 > size)\n                            TMP_TextInfo.Resize(ref m_textInfo.wordInfo, size + 1);\n\n                        m_textInfo.wordInfo[index].firstCharacterIndex = wordFirstChar;\n                        m_textInfo.wordInfo[index].lastCharacterIndex = wordLastChar;\n                        m_textInfo.wordInfo[index].characterCount = wordLastChar - wordFirstChar + 1;\n                        m_textInfo.wordInfo[index].textComponent = this;\n\n                        wordCount += 1;\n                        m_textInfo.wordCount += 1;\n                        m_textInfo.lineInfo[currentLine].wordCount += 1;\n                    }\n                }\n                #if TMP_PROFILE_ON\n                Profiler.EndSample();\n                #endif\n                #endregion\n\n\n                // Setup & Handle Underline\n                #region Underline\n                #if TMP_PROFILE_ON\n                Profiler.BeginSample(\"Process Underline & Strikethrough\");\n                #endif\n                // NOTE: Need to figure out how underline will be handled with multiple fonts and which font will be used for the underline.\n                bool isUnderline = (m_textInfo.characterInfo[i].style & FontStyles.Underline) == FontStyles.Underline;\n                if (isUnderline)\n                {\n                    bool isUnderlineVisible = true;\n                    int currentPage = m_textInfo.characterInfo[i].pageNumber;\n\n                    if (i > m_maxVisibleCharacters || currentLine > m_maxVisibleLines || (m_overflowMode == TextOverflowModes.Page && currentPage + 1 != m_pageToDisplay))\n                        isUnderlineVisible = false;\n\n                    // We only use the scale of visible characters.\n                    if (!char.IsWhiteSpace(currentCharacter) && currentCharacter != 0x200B)\n                    {\n                        underlineMaxScale = Mathf.Max(underlineMaxScale, m_textInfo.characterInfo[i].scale);\n                        xScaleMax = Mathf.Max(xScaleMax, Mathf.Abs(xScale));\n                        underlineBaseLine = Mathf.Min(currentPage == lastPage ? underlineBaseLine : k_LargePositiveFloat, m_textInfo.characterInfo[i].baseLine + font.faceInfo.underlineOffset * underlineMaxScale);\n                        lastPage = currentPage; // Need to track pages to ensure we reset baseline for the new pages.\n                    }\n\n                    if (beginUnderline == false && isUnderlineVisible == true && i <= lineInfo.lastVisibleCharacterIndex && currentCharacter != 10 && currentCharacter != 13)\n                    {\n                        if (i == lineInfo.lastVisibleCharacterIndex && char.IsSeparator(currentCharacter))\n                        { }\n                        else\n                        {\n                            beginUnderline = true;\n                            underlineStartScale = m_textInfo.characterInfo[i].scale;\n                            if (underlineMaxScale == 0)\n                            {\n                                underlineMaxScale = underlineStartScale;\n                                xScaleMax = xScale;\n                            }\n                            underline_start = new Vector3(m_textInfo.characterInfo[i].bottomLeft.x, underlineBaseLine, 0);\n                            underlineColor = m_textInfo.characterInfo[i].underlineColor;\n                        }\n                    }\n\n                    // End Underline if text only contains one character.\n                    if (beginUnderline && m_characterCount == 1)\n                    {\n                        beginUnderline = false;\n                        underline_end = new Vector3(m_textInfo.characterInfo[i].topRight.x, underlineBaseLine, 0);\n                        underlineEndScale = m_textInfo.characterInfo[i].scale;\n\n                        DrawUnderlineMesh(underline_start, underline_end, ref last_vert_index, underlineStartScale, underlineEndScale, underlineMaxScale, xScaleMax, underlineColor);\n                        underlineMaxScale = 0;\n                        xScaleMax = 0;\n                        underlineBaseLine = k_LargePositiveFloat;\n                    }\n                    else if (beginUnderline && (i == lineInfo.lastCharacterIndex || i >= lineInfo.lastVisibleCharacterIndex))\n                    {\n                        // Terminate underline at previous visible character if space or carriage return.\n                        if (char.IsWhiteSpace(currentCharacter) || currentCharacter == 0x200B)\n                        {\n                            int lastVisibleCharacterIndex = lineInfo.lastVisibleCharacterIndex;\n                            underline_end = new Vector3(m_textInfo.characterInfo[lastVisibleCharacterIndex].topRight.x, underlineBaseLine, 0);\n                            underlineEndScale = m_textInfo.characterInfo[lastVisibleCharacterIndex].scale;\n                        }\n                        else\n                        {   // End underline if last character of the line.\n                            underline_end = new Vector3(m_textInfo.characterInfo[i].topRight.x, underlineBaseLine, 0);\n                            underlineEndScale = m_textInfo.characterInfo[i].scale;\n                        }\n\n                        beginUnderline = false;\n                        DrawUnderlineMesh(underline_start, underline_end, ref last_vert_index, underlineStartScale, underlineEndScale, underlineMaxScale, xScaleMax, underlineColor);\n                        underlineMaxScale = 0;\n                        xScaleMax = 0;\n                        underlineBaseLine = k_LargePositiveFloat;\n                    }\n                    else if (beginUnderline && !isUnderlineVisible)\n                    {\n                        beginUnderline = false;\n                        underline_end = new Vector3(m_textInfo.characterInfo[i - 1].topRight.x, underlineBaseLine, 0);\n                        underlineEndScale = m_textInfo.characterInfo[i - 1].scale;\n\n                        DrawUnderlineMesh(underline_start, underline_end, ref last_vert_index, underlineStartScale, underlineEndScale, underlineMaxScale, xScaleMax, underlineColor);\n                        underlineMaxScale = 0;\n                        xScaleMax = 0;\n                        underlineBaseLine = k_LargePositiveFloat;\n                    }\n                    else if (beginUnderline && i < m_characterCount - 1 && !underlineColor.Compare(m_textInfo.characterInfo[i + 1].underlineColor))\n                    {\n                        // End underline if underline color has changed.\n                        beginUnderline = false;\n                        underline_end = new Vector3(m_textInfo.characterInfo[i].topRight.x, underlineBaseLine, 0);\n                        underlineEndScale = m_textInfo.characterInfo[i].scale;\n\n                        DrawUnderlineMesh(underline_start, underline_end, ref last_vert_index, underlineStartScale, underlineEndScale, underlineMaxScale, xScaleMax, underlineColor);\n                        underlineMaxScale = 0;\n                        xScaleMax = 0;\n                        underlineBaseLine = k_LargePositiveFloat;\n                    }\n                }\n                else\n                {\n                    // End Underline\n                    if (beginUnderline == true)\n                    {\n                        beginUnderline = false;\n                        underline_end = new Vector3(m_textInfo.characterInfo[i - 1].topRight.x, underlineBaseLine, 0);\n                        underlineEndScale = m_textInfo.characterInfo[i - 1].scale;\n\n                        DrawUnderlineMesh(underline_start, underline_end, ref last_vert_index, underlineStartScale, underlineEndScale, underlineMaxScale, xScaleMax, underlineColor);\n                        underlineMaxScale = 0;\n                        xScaleMax = 0;\n                        underlineBaseLine = k_LargePositiveFloat;\n                    }\n                }\n                #endregion\n\n\n                // Setup & Handle Strikethrough\n                #region Strikethrough\n                // NOTE: Need to figure out how underline will be handled with multiple fonts and which font will be used for the underline.\n                bool isStrikethrough = (m_textInfo.characterInfo[i].style & FontStyles.Strikethrough) == FontStyles.Strikethrough;\n                float strikethroughOffset = currentFontAsset.faceInfo.strikethroughOffset;\n\n                if (isStrikethrough)\n                {\n                    bool isStrikeThroughVisible = true;\n\n                    if (i > m_maxVisibleCharacters || currentLine > m_maxVisibleLines || (m_overflowMode == TextOverflowModes.Page && m_textInfo.characterInfo[i].pageNumber + 1 != m_pageToDisplay))\n                        isStrikeThroughVisible = false;\n\n                    if (beginStrikethrough == false && isStrikeThroughVisible && i <= lineInfo.lastVisibleCharacterIndex && currentCharacter != 10 && currentCharacter != 13)\n                    {\n                        if (i == lineInfo.lastVisibleCharacterIndex && char.IsSeparator(currentCharacter))\n                        { }\n                        else\n                        {\n                            beginStrikethrough = true;\n                            strikethroughPointSize = m_textInfo.characterInfo[i].pointSize;\n                            strikethroughScale = m_textInfo.characterInfo[i].scale;\n                            strikethrough_start = new Vector3(m_textInfo.characterInfo[i].bottomLeft.x, m_textInfo.characterInfo[i].baseLine + strikethroughOffset * strikethroughScale, 0);\n                            strikethroughColor = m_textInfo.characterInfo[i].strikethroughColor;\n                            strikethroughBaseline = m_textInfo.characterInfo[i].baseLine;\n                            //Debug.Log(\"Char [\" + currentCharacter + \"] Start Strikethrough POS: \" + strikethrough_start);\n                        }\n                    }\n\n                    // End Strikethrough if text only contains one character.\n                    if (beginStrikethrough && m_characterCount == 1)\n                    {\n                        beginStrikethrough = false;\n                        strikethrough_end = new Vector3(m_textInfo.characterInfo[i].topRight.x, m_textInfo.characterInfo[i].baseLine + strikethroughOffset * strikethroughScale, 0);\n\n                        DrawUnderlineMesh(strikethrough_start, strikethrough_end, ref last_vert_index, strikethroughScale, strikethroughScale, strikethroughScale, xScale, strikethroughColor);\n                    }\n                    else if (beginStrikethrough && i == lineInfo.lastCharacterIndex)\n                    {\n                        // Terminate Strikethrough at previous visible character if space or carriage return.\n                        if (char.IsWhiteSpace(currentCharacter) || currentCharacter == 0x200B)\n                        {\n                            int lastVisibleCharacterIndex = lineInfo.lastVisibleCharacterIndex;\n                            strikethrough_end = new Vector3(m_textInfo.characterInfo[lastVisibleCharacterIndex].topRight.x, m_textInfo.characterInfo[lastVisibleCharacterIndex].baseLine + strikethroughOffset * strikethroughScale, 0);\n                        }\n                        else\n                        {\n                            // Terminate Strikethrough at last character of line.\n                            strikethrough_end = new Vector3(m_textInfo.characterInfo[i].topRight.x, m_textInfo.characterInfo[i].baseLine + strikethroughOffset * strikethroughScale, 0);\n                        }\n\n                        beginStrikethrough = false;\n                        DrawUnderlineMesh(strikethrough_start, strikethrough_end, ref last_vert_index, strikethroughScale, strikethroughScale, strikethroughScale, xScale, strikethroughColor);\n                    }\n                    else if (beginStrikethrough && i < m_characterCount && (m_textInfo.characterInfo[i + 1].pointSize != strikethroughPointSize || !TMP_Math.Approximately(m_textInfo.characterInfo[i + 1].baseLine + offset.y, strikethroughBaseline)))\n                    {\n                        // Terminate Strikethrough if scale changes.\n                        beginStrikethrough = false;\n\n                        int lastVisibleCharacterIndex = lineInfo.lastVisibleCharacterIndex;\n                        if (i > lastVisibleCharacterIndex)\n                            strikethrough_end = new Vector3(m_textInfo.characterInfo[lastVisibleCharacterIndex].topRight.x, m_textInfo.characterInfo[lastVisibleCharacterIndex].baseLine + strikethroughOffset * strikethroughScale, 0);\n                        else\n                            strikethrough_end = new Vector3(m_textInfo.characterInfo[i].topRight.x, m_textInfo.characterInfo[i].baseLine + strikethroughOffset * strikethroughScale, 0);\n\n                        DrawUnderlineMesh(strikethrough_start, strikethrough_end, ref last_vert_index, strikethroughScale, strikethroughScale, strikethroughScale, xScale, strikethroughColor);\n                        //Debug.Log(\"Char [\" + currentCharacter + \"] at Index: \" + i + \"  End Strikethrough POS: \" + strikethrough_end + \"  Baseline: \" + m_textInfo.characterInfo[i].baseLine.ToString(\"f3\"));\n                    }\n                    else if (beginStrikethrough && i < m_characterCount && currentFontAsset.GetInstanceID() != characterInfos[i + 1].fontAsset.GetInstanceID())\n                    {\n                        // Terminate Strikethrough if font asset changes.\n                        beginStrikethrough = false;\n                        strikethrough_end = new Vector3(m_textInfo.characterInfo[i].topRight.x, m_textInfo.characterInfo[i].baseLine + strikethroughOffset * strikethroughScale, 0);\n\n                        DrawUnderlineMesh(strikethrough_start, strikethrough_end, ref last_vert_index, strikethroughScale, strikethroughScale, strikethroughScale, xScale, strikethroughColor);\n                    }\n                    else if (beginStrikethrough && !isStrikeThroughVisible)\n                    {\n                        // Terminate Strikethrough if character is not visible.\n                        beginStrikethrough = false;\n                        strikethrough_end = new Vector3(m_textInfo.characterInfo[i - 1].topRight.x, m_textInfo.characterInfo[i - 1].baseLine + strikethroughOffset * strikethroughScale, 0);\n\n                        DrawUnderlineMesh(strikethrough_start, strikethrough_end, ref last_vert_index, strikethroughScale, strikethroughScale, strikethroughScale, xScale, strikethroughColor);\n                    }\n                }\n                else\n                {\n                    // End Strikethrough\n                    if (beginStrikethrough == true)\n                    {\n                        beginStrikethrough = false;\n                        strikethrough_end = new Vector3(m_textInfo.characterInfo[i - 1].topRight.x, m_textInfo.characterInfo[i - 1].baseLine + strikethroughOffset * strikethroughScale, 0);\n\n                        DrawUnderlineMesh(strikethrough_start, strikethrough_end, ref last_vert_index, strikethroughScale, strikethroughScale, strikethroughScale, xScale, strikethroughColor);\n                    }\n                }\n                #endregion\n\n\n                // HANDLE TEXT HIGHLIGHTING\n                #region Text Highlighting\n                bool isHighlight = (m_textInfo.characterInfo[i].style & FontStyles.Highlight) == FontStyles.Highlight;\n                if (isHighlight)\n                {\n                    bool isHighlightVisible = true;\n                    int currentPage = m_textInfo.characterInfo[i].pageNumber;\n\n                    if (i > m_maxVisibleCharacters || currentLine > m_maxVisibleLines || (m_overflowMode == TextOverflowModes.Page && currentPage + 1 != m_pageToDisplay))\n                        isHighlightVisible = false;\n\n                    if (beginHighlight == false && isHighlightVisible == true && i <= lineInfo.lastVisibleCharacterIndex && currentCharacter != 10 && currentCharacter != 13)\n                    {\n                        if (i == lineInfo.lastVisibleCharacterIndex && char.IsSeparator(currentCharacter))\n                        { }\n                        else\n                        {\n                            beginHighlight = true;\n                            highlight_start = k_LargePositiveVector2;\n                            highlight_end = k_LargeNegativeVector2;\n                            highlightColor = m_textInfo.characterInfo[i].highlightColor;\n                        }\n                    }\n\n                    if (beginHighlight)\n                    {\n                        Color32 currentHighlightColor = m_textInfo.characterInfo[i].highlightColor;\n                        bool isColorTransition = false;\n\n                        // Handle Highlight color changes\n                        if (!highlightColor.Compare(currentHighlightColor))\n                        {\n                            // End drawing at the start of new highlight color to prevent a gap between highlight sections.\n                            highlight_end.x = (highlight_end.x + m_textInfo.characterInfo[i].bottomLeft.x) / 2;\n\n                            highlight_start.y = Mathf.Min(highlight_start.y, m_textInfo.characterInfo[i].descender);\n                            highlight_end.y = Mathf.Max(highlight_end.y, m_textInfo.characterInfo[i].ascender);\n\n                            DrawTextHighlight(highlight_start, highlight_end, ref last_vert_index, highlightColor);\n\n                            beginHighlight = true;\n                            highlight_start = highlight_end;\n\n                            highlight_end = new Vector3(m_textInfo.characterInfo[i].topRight.x, m_textInfo.characterInfo[i].descender, 0);\n                            highlightColor = m_textInfo.characterInfo[i].highlightColor;\n\n                            isColorTransition = true;\n                        }\n\n                        if (!isColorTransition)\n                        {\n                            // Use the Min / Max Extents of the Highlight area to handle different character sizes and fonts.\n                            highlight_start.x = Mathf.Min(highlight_start.x, m_textInfo.characterInfo[i].bottomLeft.x);\n                            highlight_start.y = Mathf.Min(highlight_start.y, m_textInfo.characterInfo[i].descender);\n\n                            highlight_end.x = Mathf.Max(highlight_end.x, m_textInfo.characterInfo[i].topRight.x); \n                            highlight_end.y = Mathf.Max(highlight_end.y, m_textInfo.characterInfo[i].ascender);\n                        }\n                    }\n\n                    // End Highlight if text only contains one character.\n                    if (beginHighlight && m_characterCount == 1)\n                    {\n                        beginHighlight = false;\n\n                        DrawTextHighlight(highlight_start, highlight_end, ref last_vert_index, highlightColor);\n                    }\n                    else if (beginHighlight && (i == lineInfo.lastCharacterIndex || i >= lineInfo.lastVisibleCharacterIndex))\n                    {\n                        beginHighlight = false;\n                        DrawTextHighlight(highlight_start, highlight_end, ref last_vert_index, highlightColor);\n                    }\n                    else if (beginHighlight && !isHighlightVisible)\n                    {\n                        beginHighlight = false;\n                        DrawTextHighlight(highlight_start, highlight_end, ref last_vert_index, highlightColor);\n                    }\n                }\n                else\n                {\n                    // End Highlight\n                    if (beginHighlight == true)\n                    {\n                        beginHighlight = false;\n                        DrawTextHighlight(highlight_start, highlight_end, ref last_vert_index, highlightColor);\n                    }\n                }\n                #endregion\n                #if TMP_PROFILE_ON\n                Profiler.EndSample();\n                #endif\n                #endregion\n\n                lastLine = currentLine;\n            }\n            #endregion\n\n\n            // METRICS ABOUT THE TEXT OBJECT\n            m_textInfo.characterCount = m_characterCount;\n            m_textInfo.spriteCount = m_spriteCount;\n            m_textInfo.lineCount = lineCount;\n            m_textInfo.wordCount = wordCount != 0 && m_characterCount > 0 ? wordCount : 1;\n            m_textInfo.pageCount = m_pageNumber + 1;\n\n            #if TMP_PROFILE_PHASES_ON\n                Profiler.EndSample();\n            #endif\n\n\n            // *** UPLOAD MESH DATA ***\n            #if TMP_PROFILE_PHASES_ON\n                Profiler.BeginSample(\"TMP Generate Text - Phase III\");\n            #endif\n            if (m_renderMode == TextRenderFlags.Render && IsActive())\n            {\n                // Clear unused vertices\n                //m_textInfo.meshInfo[0].ClearUnusedVertices();\n\n                // Must ensure the Canvas support the additon vertex attributes used by TMP.\n                if (m_canvas.additionalShaderChannels != (AdditionalCanvasShaderChannels)25)\n                    m_canvas.additionalShaderChannels |= (AdditionalCanvasShaderChannels)25;\n\n                // Sort the geometry of the text object if needed.\n                if (m_geometrySortingOrder != VertexSortingOrder.Normal)\n                    m_textInfo.meshInfo[0].SortGeometry(VertexSortingOrder.Reverse);\n\n                // Upload Mesh Data\n                m_mesh.MarkDynamic();\n                m_mesh.vertices = m_textInfo.meshInfo[0].vertices;\n                m_mesh.uv = m_textInfo.meshInfo[0].uvs0;\n                m_mesh.uv2 = m_textInfo.meshInfo[0].uvs2;\n                //m_mesh.uv4 = m_textInfo.meshInfo[0].uvs4;\n                m_mesh.colors32 = m_textInfo.meshInfo[0].colors32;\n\n                // Compute Bounds for the mesh. Manual computation is more efficient then using Mesh.recalcualteBounds.\n                m_mesh.RecalculateBounds();\n                //m_mesh.bounds = new Bounds(new Vector3((m_meshExtents.max.x + m_meshExtents.min.x) / 2, (m_meshExtents.max.y + m_meshExtents.min.y) / 2, 0) + offset, new Vector3(m_meshExtents.max.x - m_meshExtents.min.x, m_meshExtents.max.y - m_meshExtents.min.y, 0));\n\n                m_canvasRenderer.SetMesh(m_mesh);\n\n                // Cache CanvasRenderer color of the parent text object.\n                Color parentBaseColor = m_canvasRenderer.GetColor();\n\n                for (int i = 1; i < m_textInfo.materialCount; i++)\n                {\n                    // Clear unused vertices\n                    m_textInfo.meshInfo[i].ClearUnusedVertices();\n\n                    if (m_subTextObjects[i] == null) continue;\n\n                    // Sort the geometry of the sub-text objects if needed.\n                    if (m_geometrySortingOrder != VertexSortingOrder.Normal)\n                        m_textInfo.meshInfo[i].SortGeometry(VertexSortingOrder.Reverse);\n\n                    //m_subTextObjects[i].mesh.MarkDynamic();\n                    m_subTextObjects[i].mesh.vertices = m_textInfo.meshInfo[i].vertices;\n                    m_subTextObjects[i].mesh.uv = m_textInfo.meshInfo[i].uvs0;\n                    m_subTextObjects[i].mesh.uv2 = m_textInfo.meshInfo[i].uvs2;\n                    //m_subTextObjects[i].mesh.uv4 = m_textInfo.meshInfo[i].uvs4;\n                    m_subTextObjects[i].mesh.colors32 = m_textInfo.meshInfo[i].colors32;\n\n                    m_subTextObjects[i].mesh.RecalculateBounds();\n\n                    m_subTextObjects[i].canvasRenderer.SetMesh(m_subTextObjects[i].mesh);\n\n                    // Set CanvasRenderer color to match the parent text object.\n                    m_subTextObjects[i].canvasRenderer.SetColor(parentBaseColor);\n                }\n            }\n\n            // Event indicating the text has been regenerated.\n            TMPro_EventManager.ON_TEXT_CHANGED(this);\n            //SendOnTextChanged();\n\n            #if TMP_PROFILE_PHASES_ON\n                Profiler.EndSample();\n            #endif\n\n            //Debug.Log(\"Done Rendering Text.\");\n        }\n\n\n        /// <summary>\n        /// Method to return the local corners of the Text Container or RectTransform.\n        /// </summary>\n        /// <returns></returns>\n        protected override Vector3[] GetTextContainerLocalCorners()\n        {\n            if (m_rectTransform == null) m_rectTransform = this.rectTransform;\n\n            m_rectTransform.GetLocalCorners(m_RectTransformCorners);\n\n            return m_RectTransformCorners;\n        }\n\n\n        /// <summary>\n        /// Method to Enable or Disable child SubMesh objects.\n        /// </summary>\n        /// <param name=\"state\"></param>\n        protected override void SetActiveSubMeshes(bool state)\n        {\n            for (int i = 1; i < m_subTextObjects.Length && m_subTextObjects[i] != null; i++)\n            {\n                if (m_subTextObjects[i].enabled != state)\n                    m_subTextObjects[i].enabled = state;\n            }\n        }\n\n\n        /// <summary>\n        ///  Method returning the compound bounds of the text object and child sub objects.\n        /// </summary>\n        /// <returns></returns>\n        protected override Bounds GetCompoundBounds()\n        {\n            Bounds mainBounds = m_mesh.bounds;\n            Vector3 min = mainBounds.min;\n            Vector3 max = mainBounds.max;\n\n            for (int i = 1; i < m_subTextObjects.Length && m_subTextObjects[i] != null; i++)\n            {\n                Bounds subBounds = m_subTextObjects[i].mesh.bounds;\n                min.x = min.x < subBounds.min.x ? min.x : subBounds.min.x;\n                min.y = min.y < subBounds.min.y ? min.y : subBounds.min.y;\n\n                max.x = max.x > subBounds.max.x ? max.x : subBounds.max.x;\n                max.y = max.y > subBounds.max.y ? max.y : subBounds.max.y;\n            }\n\n            Vector3 center = (min + max) / 2;\n            Vector2 size = max - min;\n            return new Bounds(center, size);\n        }\n\n\n        //public override void UpdateGeometry()\n        //{\n\n        //}\n\n\n        /// <summary>\n        /// Method to Update Scale in UV2\n        /// </summary>\n        //void UpdateSDFScale(float lossyScale)\n        //{\n        //    // TODO: Resolve - Underline / Strikethrough segments not getting their SDF Scale adjusted.\n\n        //    //Debug.Log(\"Updating SDF Scale.\");\n\n        //    // Return if we don't have a valid reference to a Canvas.\n        //    if (m_canvas == null)\n        //    {\n        //        m_canvas = GetCanvas();\n        //        if (m_canvas == null) return;\n        //    }\n\n        //    lossyScale = lossyScale == 0 ? 1 : lossyScale;\n\n        //    float xScale = 0;\n        //    float canvasScaleFactor = m_canvas.scaleFactor;\n\n        //    if (m_canvas.renderMode == RenderMode.ScreenSpaceOverlay)\n        //        xScale = lossyScale / canvasScaleFactor;\n        //    else if (m_canvas.renderMode == RenderMode.ScreenSpaceCamera)\n        //        xScale = m_canvas.worldCamera != null ? lossyScale : 1;\n        //    else\n        //        xScale = lossyScale;\n\n        //    // Iterate through each of the characters.\n        //    for (int i = 0; i < m_textInfo.characterCount; i++)\n        //    {\n        //        // Only update scale for visible characters.\n        //        if (m_textInfo.characterInfo[i].isVisible && m_textInfo.characterInfo[i].elementType == TMP_TextElementType.Character)\n        //        {\n        //            float scale = xScale * m_textInfo.characterInfo[i].scale * (1 - m_charWidthAdjDelta);\n        //            if (!m_textInfo.characterInfo[i].isUsingAlternateTypeface && (m_textInfo.characterInfo[i].style & FontStyles.Bold) == FontStyles.Bold) scale *= -1;\n\n        //            int index = m_textInfo.characterInfo[i].materialReferenceIndex;\n        //            int vertexIndex = m_textInfo.characterInfo[i].vertexIndex;\n\n        //            m_textInfo.meshInfo[index].uvs2[vertexIndex + 0].y = scale;\n        //            m_textInfo.meshInfo[index].uvs2[vertexIndex + 1].y = scale;\n        //            m_textInfo.meshInfo[index].uvs2[vertexIndex + 2].y = scale;\n        //            m_textInfo.meshInfo[index].uvs2[vertexIndex + 3].y = scale;\n        //        }\n        //    }\n\n        //    // Push the updated uv2 scale information to the meshes.\n        //    for (int i = 0; i < m_textInfo.materialCount; i++)\n        //    {\n        //        if (i == 0)\n        //        {\n        //            m_mesh.uv2 = m_textInfo.meshInfo[0].uvs2;\n        //            m_canvasRenderer.SetMesh(m_mesh);\n        //        }\n        //        else\n        //        {\n        //            m_subTextObjects[i].mesh.uv2 = m_textInfo.meshInfo[i].uvs2;\n        //            m_subTextObjects[i].canvasRenderer.SetMesh(m_subTextObjects[i].mesh);\n        //        }\n        //    }\n        //}\n\n        /// <summary>\n        /// Method to update the SDF Scale in UV2.\n        /// </summary>\n        /// <param name=\"scaleDelta\"></param>\n        void UpdateSDFScale(float scaleDelta)\n        {\n            if (scaleDelta == 0 || scaleDelta == float.PositiveInfinity)\n            {\n                m_havePropertiesChanged = true;\n                OnPreRenderCanvas();\n                return;\n            }\n\n            for (int materialIndex = 0; materialIndex < m_textInfo.materialCount; materialIndex ++)\n            {\n                TMP_MeshInfo meshInfo = m_textInfo.meshInfo[materialIndex];\n\n                for (int i = 0; i < meshInfo.uvs2.Length; i++)\n                {\n                    meshInfo.uvs2[i].y *= Mathf.Abs(scaleDelta);\n                }\n            }\n\n            // Push the updated uv2 scale information to the meshes.\n            for (int i = 0; i < m_textInfo.materialCount; i++)\n            {\n                if (i == 0)\n                {\n                    m_mesh.uv2 = m_textInfo.meshInfo[0].uvs2;\n                    m_canvasRenderer.SetMesh(m_mesh);\n                }\n                else\n                {\n                    m_subTextObjects[i].mesh.uv2 = m_textInfo.meshInfo[i].uvs2;\n                    m_subTextObjects[i].canvasRenderer.SetMesh(m_subTextObjects[i].mesh);\n                }\n            }\n        }\n\n\n        // Function to offset vertices position to account for line spacing changes.\n        protected override void AdjustLineOffset(int startIndex, int endIndex, float offset)\n        {\n            Vector3 vertexOffset = new Vector3(0, offset, 0);\n\n            for (int i = startIndex; i <= endIndex; i++)\n            {\n                m_textInfo.characterInfo[i].bottomLeft -= vertexOffset;\n                m_textInfo.characterInfo[i].topLeft -= vertexOffset;\n                m_textInfo.characterInfo[i].topRight -= vertexOffset;\n                m_textInfo.characterInfo[i].bottomRight -= vertexOffset;\n\n                m_textInfo.characterInfo[i].ascender -= vertexOffset.y;\n                m_textInfo.characterInfo[i].baseLine -= vertexOffset.y;\n                m_textInfo.characterInfo[i].descender -= vertexOffset.y;\n\n                if (m_textInfo.characterInfo[i].isVisible)\n                {\n                    m_textInfo.characterInfo[i].vertex_BL.position -= vertexOffset;\n                    m_textInfo.characterInfo[i].vertex_TL.position -= vertexOffset;\n                    m_textInfo.characterInfo[i].vertex_TR.position -= vertexOffset;\n                    m_textInfo.characterInfo[i].vertex_BR.position -= vertexOffset;\n                }\n            }\n        }\n\n    }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TMPro_UGUI_Private.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 3069a00b8c364df395994d7d379e0a99\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {fileID: 2800000, guid: 8e098d8d28c5182419f7a1c8b91ca722, type: 3}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TextContainer.cs",
    "content": "﻿using UnityEngine;\nusing UnityEngine.EventSystems;\nusing System.Collections;\n\n\nnamespace TMPro\n{\n\n    public enum TextContainerAnchors { TopLeft = 0, Top = 1, TopRight = 2, Left = 3, Middle = 4, Right = 5, BottomLeft = 6, Bottom = 7, BottomRight = 8, Custom = 9 };\n\n\n    [RequireComponent(typeof(RectTransform))]\n    [AddComponentMenu(\"Layout/Text Container\")]\n    public class TextContainer : UIBehaviour\n    {\n\n        #pragma warning disable 0618 // Disabled warning related to deprecated properties. This is for backwards compatibility.\n\n        public bool hasChanged\n        {\n            get { return m_hasChanged; }\n            set { m_hasChanged = value; }\n        }\n        private bool m_hasChanged;\n\n\n        // Pivot / Transform Position\n        public Vector2 pivot\n        {\n            get { return m_pivot; }\n            set { /*Debug.Log(\"Pivot has changed.\");*/ if (m_pivot != value) { m_pivot = value; m_anchorPosition = GetAnchorPosition(m_pivot); m_hasChanged = true; OnContainerChanged(); } }\n        }\n        [SerializeField]\n        private Vector2 m_pivot;\n\n\n        public TextContainerAnchors anchorPosition\n        {\n            get { return m_anchorPosition; }\n            set { /*Debug.Log(\"Anchor has changed.\");*/ if (m_anchorPosition != value) { m_anchorPosition = value; m_pivot = GetPivot(m_anchorPosition); m_hasChanged = true; OnContainerChanged(); } }\n        }\n        [SerializeField]\n        private TextContainerAnchors m_anchorPosition = TextContainerAnchors.Middle;\n\n\n        // Rect which defines the Rectangle \n        public Rect rect\n        {\n            get { return m_rect; }\n            set { /*Debug.Log(\"Rectangle has changed.\");*/ if (m_rect != value) { m_rect = value; /*m_size = new Vector2(m_rect.width, m_rect.height);*/ m_hasChanged = true; OnContainerChanged(); } }\n        }\n        [SerializeField]\n        private Rect m_rect;\n\n\n        public Vector2 size\n        {\n            get { return new Vector2(m_rect.width, m_rect.height); }\n            set { /*Debug.Log(\"Size has changed.\");*/ if (new Vector2(m_rect.width, m_rect.height) != value) { SetRect(value); m_hasChanged = true; m_isDefaultWidth = false; m_isDefaultHeight = false; OnContainerChanged(); } }\n        }\n      \n\n        // Sets the width of the Text Container.\n        public float width\n        {\n            get { return m_rect.width; }\n            set { /*Debug.Log(\"Width has changed.\");*/ SetRect(new Vector2(value, m_rect.height)); m_hasChanged = true; m_isDefaultWidth = false; OnContainerChanged(); }\n        }\n\n\n        // Sets the height of the Text Container.\n        public float height\n        {\n            get { return m_rect.height; }\n            set { SetRect(new Vector2(m_rect.width, value)); m_hasChanged = true; m_isDefaultHeight = false; OnContainerChanged(); }\n        }\n\n\n        // Used to determine if the user has changed the width of the Text Container.\n        public bool isDefaultWidth\n        {\n            get { return m_isDefaultWidth; }\n        }\n        private bool m_isDefaultWidth;\n\n        // Used to determine if the user has changed the height of the Text Container.\n        public bool isDefaultHeight\n        {\n            get { return m_isDefaultHeight; }\n        }\n        private bool m_isDefaultHeight;\n\n\n        public bool isAutoFitting\n        {\n            get { return m_isAutoFitting; }\n            set { m_isAutoFitting = value; }\n        }\n        private bool m_isAutoFitting = false;\n\n\n        // Corners of the Text Container\n        public Vector3[] corners\n        {\n            get { return m_corners; }\n        }\n        private Vector3[] m_corners = new Vector3[4];\n\n\n        public Vector3[] worldCorners\n        {\n            get { return m_worldCorners; }\n        }\n        private Vector3[] m_worldCorners = new Vector3[4];\n\n\n        //public Vector3 normal\n        //{\n        //    get { return m_normal; }\n        //}\n        //private Vector3 m_normal;\n\n\n        // The margin offset from the Rectangle Bounds\n        public Vector4 margins\n        {\n            get { return m_margins; }\n            set { if (m_margins != value) { /*Debug.Log(\"Margins have changed.\");*/ m_margins = value; m_hasChanged = true; OnContainerChanged(); } }\n        }\n        [SerializeField]\n        private Vector4 m_margins;\n\n\n        /// <summary>\n        /// The RectTransform used by the object\n        /// </summary>\n        public RectTransform rectTransform\n        {\n            get\n            {\n                if (m_rectTransform == null) m_rectTransform = GetComponent<RectTransform>();\n\n                return m_rectTransform;\n            }\n        }\n        private RectTransform m_rectTransform;\n\n\n        //private Transform m_transform;\n        //private bool m_isAddingRectTransform;\n        private static Vector2 k_defaultSize = new Vector2(100, 100);\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        public TextMeshPro textMeshPro\n        {\n            get\n            {\n                if (m_textMeshPro == null) m_textMeshPro = GetComponent<TextMeshPro>();\n                return m_textMeshPro;\n            }\n        }\n        private TextMeshPro m_textMeshPro;\n\n\n        protected override void Awake()\n        {\n            Debug.LogWarning(\"The Text Container component is now Obsolete and can safely be removed from [\" + gameObject.name + \"].\", this);\n\n            return;\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        protected override void OnEnable()\n        {\n            //Debug.Log(\"Text Container OnEnable() called.\");\n\n            OnContainerChanged();\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        protected override void OnDisable()\n        {\n            //Debug.Log(\"OnDisable() called.\");\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        void OnContainerChanged()\n        {\n            //Debug.Log(\"OnContainerChanged\");\n\n            UpdateCorners();\n            //UpdateWorldCorners();\n\n            if (this.m_rectTransform != null)\n            {\n                m_rectTransform.sizeDelta = this.size;\n                m_rectTransform.hasChanged = true;\n            }\n\n            if (this.textMeshPro != null)\n            {\n                m_textMeshPro.SetVerticesDirty();\n                m_textMeshPro.margin = m_margins;\n            }\n        }\n\n\n#if UNITY_EDITOR\n        /// <summary>\n        /// \n        /// </summary>\n        protected override void OnValidate()\n        {\n            //Debug.Log(\"OnValidate() called.\");\n            m_hasChanged = true;\n            OnContainerChanged();\n        }\n#endif\n\n\n        /*\n        void LateUpdate()\n        {\n            // Used by the Run Time Text Input Component ... This will have to be changed.\n            if (m_transform.hasChanged)\n                UpdateWorldCorners();\n        }\n        */\n\n\n\n        /// <summary>\n        /// Callback from Unity to handle RectTransform changes.\n        /// </summary>\n        protected override void OnRectTransformDimensionsChange()\n        {\n            // Required to add a RectTransform to objects created in previous releases.\n            if (this.rectTransform == null) m_rectTransform = gameObject.AddComponent<RectTransform>();\n\n            if (m_rectTransform.sizeDelta != k_defaultSize)\n                this.size = m_rectTransform.sizeDelta;\n\n            pivot = m_rectTransform.pivot;\n\n            m_hasChanged = true;\n            OnContainerChanged();\n        }\n\n\n        private void SetRect(Vector2 size)\n        {\n            m_rect = new Rect(m_rect.x, m_rect.y, size.x, size.y);\n            //UpdateCorners();\n        }\n\n        private void UpdateCorners()\n        {\n            m_corners[0] = new Vector3(-m_pivot.x * m_rect.width, (- m_pivot.y) * m_rect.height);\n            m_corners[1] = new Vector3(-m_pivot.x * m_rect.width, (1 - m_pivot.y) * m_rect.height);\n            m_corners[2] = new Vector3((1 - m_pivot.x) * m_rect.width, (1 - m_pivot.y) * m_rect.height);\n            m_corners[3] = new Vector3((1 - m_pivot.x) * m_rect.width, (- m_pivot.y) * m_rect.height);\n            //Debug.Log(\"Pivot \" + m_pivot + \"  Corners 0: \" + m_corners[0] + \"  1: \" + m_corners[1] + \"  2: \" + m_corners[2] + \"  3: \" + m_corners[3]);\n\n            if (m_rectTransform != null)\n                m_rectTransform.pivot = m_pivot;\n        }\n\n\n        //private void UpdateWorldCorners()\n        //{\n        //    if (m_transform == null)\n        //        return;\n\n        //    Vector3 position = m_transform.position;\n        //    m_worldCorners[0] = position + m_transform.TransformDirection(m_corners[0]);\n        //    m_worldCorners[1] = position + m_transform.TransformDirection(m_corners[1]);\n        //    m_worldCorners[2] = position + m_transform.TransformDirection(m_corners[2]);\n        //    m_worldCorners[3] = position + m_transform.TransformDirection(m_corners[3]);\n\n        //    m_normal = Vector3.Cross(worldCorners[1] - worldCorners[0], worldCorners[3] - worldCorners[0]);\n        //}\n\n\n        //public Vector3[] GetWorldCorners()\n        //{\n        //    UpdateWorldCorners();\n\n        //    return m_worldCorners;\n        //}\n\n\n        Vector2 GetPivot(TextContainerAnchors anchor)\n        {\n            Vector2 pivot = Vector2.zero;\n\n            switch (anchor)\n            {\n                case TextContainerAnchors.TopLeft:\n                    pivot = new Vector2(0, 1);\n                    break;\n                case TextContainerAnchors.Top:\n                    pivot = new Vector2(0.5f, 1);\n                    break;\n                case TextContainerAnchors.TopRight:\n                    pivot = new Vector2(1, 1);\n                    break;\n                case TextContainerAnchors.Left:\n                    pivot = new Vector2(0, 0.5f);\n                    break;\n                case TextContainerAnchors.Middle:\n                    pivot = new Vector2(0.5f, 0.5f);\n                    break;\n                case TextContainerAnchors.Right:\n                    pivot = new Vector2(1, 0.5f);\n                    break;\n                case TextContainerAnchors.BottomLeft:\n                    pivot = new Vector2(0, 0);\n                    break;\n                case TextContainerAnchors.Bottom:\n                    pivot = new Vector2(0.5f, 0);\n                    break;\n                case TextContainerAnchors.BottomRight:\n                    pivot = new Vector2(1, 0);\n                    break;\n            }\n\n            return pivot;\n        }\n\n\n        // Method which returns the Anchor position based on pivot value.\n        TextContainerAnchors GetAnchorPosition(Vector2 pivot)\n        {\n\n            if (pivot == new Vector2(0, 1))\n                return TextContainerAnchors.TopLeft;\n            else if (pivot == new Vector2(0.5f, 1))\n                return TextContainerAnchors.Top;\n            else if (pivot == new Vector2(1f, 1))\n                return TextContainerAnchors.TopRight;\n            else if (pivot == new Vector2(0, 0.5f))\n                return TextContainerAnchors.Left;\n            else if (pivot == new Vector2(0.5f, 0.5f))\n                return TextContainerAnchors.Middle;\n            else if (pivot == new Vector2(1, 0.5f))\n                return TextContainerAnchors.Right;\n            else if (pivot == new Vector2(0, 0))\n                return TextContainerAnchors.BottomLeft;\n            else if (pivot == new Vector2(0.5f, 0))\n                return TextContainerAnchors.Bottom;\n            else if (pivot == new Vector2(1, 0))\n                return TextContainerAnchors.BottomRight;\n            else\n                return TextContainerAnchors.Custom;\n\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TextContainer.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 32d40088a6124c578ad6b428df586e2e\ntimeCreated: 1448498693\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: -110\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TextMeshPro.cs",
    "content": "using UnityEngine;\nusing System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine.UI;\n\nnamespace TMPro\n{\n\n    [DisallowMultipleComponent]\n    [RequireComponent(typeof(MeshRenderer))]\n    [RequireComponent(typeof(MeshFilter))] \n    [AddComponentMenu(\"Mesh/TextMeshPro - Text\")]\n    [ExecuteAlways]\n    public partial class TextMeshPro : TMP_Text, ILayoutElement\n    {\n        // Public Properties and Serializable Properties\n\n        /// <summary>\n        /// Sets the Renderer's sorting Layer ID\n        /// </summary>\n        public int sortingLayerID\n        {\n            get { return m_renderer.sortingLayerID; }\n            set { m_renderer.sortingLayerID = value; }\n        }\n\n        /// <summary>\n        /// Sets the Renderer's sorting order within the assigned layer.\n        /// </summary>\n        public int sortingOrder\n        {\n            get { return m_renderer.sortingOrder; }\n            set { m_renderer.sortingOrder = value; }\n        }\n\n        /// <summary>\n        /// Determines if the size of the text container will be adjusted to fit the text object when it is first created.\n        /// </summary>\n        public override bool autoSizeTextContainer\n        {\n            get { return m_autoSizeTextContainer; }\n\n            set { if (m_autoSizeTextContainer == value) return; m_autoSizeTextContainer = value; if (m_autoSizeTextContainer) { TMP_UpdateManager.RegisterTextElementForLayoutRebuild(this); SetLayoutDirty(); } }\n        }\n\n\n        /// <summary>\n        /// Returns a reference to the Text Container\n        /// </summary>\n        [Obsolete(\"The TextContainer is now obsolete. Use the RectTransform instead.\")]\n        public TextContainer textContainer\n        {\n            get\n            {\n                return null;\n            }\n        }\n\n\n        /// <summary>\n        /// Returns a reference to the Transform\n        /// </summary>\n        public new Transform transform\n        {\n            get\n            {\n                if (m_transform == null)\n                    m_transform = GetComponent<Transform>();\n                \n                return m_transform;\n            }\n        }\n\n\n        #pragma warning disable 0108\n        /// <summary>\n        /// Returns the rendered assigned to the text object.\n        /// </summary>\n        public Renderer renderer\n        {\n            get\n            {\n                if (m_renderer == null)\n                    m_renderer = GetComponent<Renderer>();\n\n                return m_renderer;\n            }\n        }\n\n\n        /// <summary>\n        /// Returns the mesh assigned to the text object.\n        /// </summary>\n        public override Mesh mesh\n        {\n            get\n            {\n                if (m_mesh == null)\n                {\n                    m_mesh = new Mesh();\n                    m_mesh.hideFlags = HideFlags.HideAndDontSave;\n                    this.meshFilter.mesh = m_mesh;\n                }\n\n                return m_mesh;\n            }\n        }\n\n        /// <summary>\n        /// Returns the Mesh Filter of the text object.\n        /// </summary>\n        public MeshFilter meshFilter\n        {\n            get\n            {\n                if (m_meshFilter == null)\n                    m_meshFilter = GetComponent<MeshFilter>();\n\n                return m_meshFilter;\n            }\n        }\n\n        // MASKING RELATED PROPERTIES\n        /// <summary>\n        /// Sets the mask type \n        /// </summary>\n        public MaskingTypes maskType\n        {\n            get { return m_maskType; }\n            set { m_maskType = value; SetMask(m_maskType); }\n        }\n\n\n        /// <summary>\n        /// Function used to set the mask type and coordinates in World Space\n        /// </summary>\n        /// <param name=\"type\"></param>\n        /// <param name=\"maskCoords\"></param>\n        public void SetMask(MaskingTypes type, Vector4 maskCoords)\n        {\n            SetMask(type);\n\n            SetMaskCoordinates(maskCoords);\n        }\n\n        /// <summary>\n        /// Function used to set the mask type, coordinates and softness\n        /// </summary>\n        /// <param name=\"type\"></param>\n        /// <param name=\"maskCoords\"></param>\n        /// <param name=\"softnessX\"></param>\n        /// <param name=\"softnessY\"></param>\n        public void SetMask(MaskingTypes type, Vector4 maskCoords, float softnessX, float softnessY)\n        {\n            SetMask(type);\n\n            SetMaskCoordinates(maskCoords, softnessX, softnessY);\n        }\n\n\n        /// <summary>\n        /// Schedule rebuilding of the text geometry.\n        /// </summary>\n        public override void SetVerticesDirty()\n        {\n            //Debug.Log(\"SetVerticesDirty()\");\n\n            if (m_verticesAlreadyDirty || this == null || !this.IsActive())\n                return;\n\n            TMP_UpdateManager.RegisterTextElementForGraphicRebuild(this);\n            m_verticesAlreadyDirty = true;\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        public override void SetLayoutDirty()\n        {\n            m_isPreferredWidthDirty = true;\n            m_isPreferredHeightDirty = true;\n\n            if (m_layoutAlreadyDirty || this == null || !this.IsActive())\n                return;\n\n            //TMP_UpdateManager.RegisterTextElementForLayoutRebuild(this);\n            m_layoutAlreadyDirty = true;\n            //LayoutRebuilder.MarkLayoutForRebuild(this.rectTransform);\n            m_isLayoutDirty = true;\n        }\n\n\n        /// <summary>\n        /// Schedule updating of the material used by the text object.\n        /// </summary>\n        public override void SetMaterialDirty()\n        {\n            //Debug.Log(\"SetMaterialDirty()\");\n\n            //if (!this.IsActive())\n            //    return;\n\n            //m_isMaterialDirty = true;\n            UpdateMaterial();\n            //TMP_UpdateManager.RegisterTextElementForGraphicRebuild(this);\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        public override void SetAllDirty()\n        {\n            m_isInputParsingRequired = true;\n\n            SetLayoutDirty();\n            SetVerticesDirty();\n            SetMaterialDirty();\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"update\"></param>\n        public override void Rebuild(CanvasUpdate update)\n        {\n            if (this == null) return;\n\n            if (update == CanvasUpdate.Prelayout)\n            {\n                if (m_autoSizeTextContainer)\n                {\n                    m_rectTransform.sizeDelta = GetPreferredValues(Mathf.Infinity, Mathf.Infinity);\n                }\n            }\n            else if (update == CanvasUpdate.PreRender)\n            {\n                this.OnPreRenderObject();\n                m_verticesAlreadyDirty = false;\n                m_layoutAlreadyDirty = false;\n\n                if (!m_isMaterialDirty) return;\n\n                UpdateMaterial();\n                m_isMaterialDirty = false;\n            }\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        protected override void UpdateMaterial()\n        {\n            //Debug.Log(\"*** UpdateMaterial() ***\");\n\n            //if (!this.IsActive())\n            //    return;\n\n            if (m_sharedMaterial == null)\n                return;\n\n            if (m_renderer == null) m_renderer = this.renderer;\n\n            // Only update the material if it has changed.\n            if (m_renderer.sharedMaterial.GetInstanceID() != m_sharedMaterial.GetInstanceID())\n                m_renderer.sharedMaterial = m_sharedMaterial;\n        }\n\n\n        /// <summary>\n        /// Function to be used to force recomputing of character padding when Shader / Material properties have been changed via script.\n        /// </summary>\n        public override void UpdateMeshPadding()\n        {\n            m_padding = ShaderUtilities.GetPadding(m_sharedMaterial, m_enableExtraPadding, m_isUsingBold);\n            m_isMaskingEnabled = ShaderUtilities.IsMaskingEnabled(m_sharedMaterial);\n            m_havePropertiesChanged = true;\n            checkPaddingRequired = false;\n\n            // Return if text object is not awake yet.\n            if (m_textInfo == null) return;\n\n            // Update sub text objects\n            for (int i = 1; i < m_textInfo.materialCount; i++)\n                m_subTextObjects[i].UpdateMeshPadding(m_enableExtraPadding, m_isUsingBold);\n        }\n\n\n        /// <summary>\n        /// Function to force regeneration of the mesh before its normal process time. This is useful when changes to the text object properties need to be applied immediately.\n        /// </summary>\n        public override void ForceMeshUpdate()\n        {\n            //Debug.Log(\"ForceMeshUpdate() called.\");\n            m_havePropertiesChanged = true;\n            OnPreRenderObject();\n        }\n\n\n        /// <summary>\n        /// Function to force regeneration of the mesh before its normal process time. This is useful when changes to the text object properties need to be applied immediately.\n        /// </summary>\n        /// <param name=\"ignoreInactive\">If set to true, the text object will be regenerated regardless of is active state.</param>\n        public override void ForceMeshUpdate(bool ignoreInactive)\n        {\n            m_havePropertiesChanged = true;\n            m_ignoreActiveState = true;\n            OnPreRenderObject();\n        }\n\n\n        /// <summary>\n        /// Function used to evaluate the length of a text string.\n        /// </summary>\n        /// <param name=\"text\"></param>\n        /// <returns></returns>\n        public override TMP_TextInfo GetTextInfo(string text)\n        {\n            StringToCharArray(text, ref m_TextParsingBuffer);\n            SetArraySizes(m_TextParsingBuffer);\n\n            m_renderMode = TextRenderFlags.DontRender;\n\n            ComputeMarginSize();\n\n            GenerateTextMesh();\n\n            m_renderMode = TextRenderFlags.Render;\n\n            return this.textInfo;\n        }\n\n\n        /// <summary>\n        /// Function to clear the geometry of the Primary and Sub Text objects.\n        /// </summary>\n        public override void ClearMesh(bool updateMesh)\n        {\n            if (m_textInfo.meshInfo[0].mesh == null) m_textInfo.meshInfo[0].mesh = m_mesh;\n\n            m_textInfo.ClearMeshInfo(updateMesh);\n        }\n\n\n        /// <summary>\n        /// Function to force the regeneration of the text object.\n        /// </summary>\n        /// <param name=\"flags\"> Flags to control which portions of the geometry gets uploaded.</param>\n        //public override void ForceMeshUpdate(TMP_VertexDataUpdateFlags flags) { }\n\n\n        /// <summary>\n        /// Function to update the geometry of the main and sub text objects.\n        /// </summary>\n        /// <param name=\"mesh\"></param>\n        /// <param name=\"index\"></param>\n        public override void UpdateGeometry(Mesh mesh, int index)\n        {\n            mesh.RecalculateBounds();\n        }\n\n\n        /// <summary>\n        /// Function to upload the updated vertex data and renderer.\n        /// </summary>\n        public override void UpdateVertexData(TMP_VertexDataUpdateFlags flags)\n        {\n            int materialCount = m_textInfo.materialCount;\n\n            for (int i = 0; i < materialCount; i++)\n            {\n                Mesh mesh;\n\n                if (i == 0)\n                    mesh = m_mesh;\n                else\n                {\n                    // Clear unused vertices\n                    // TODO: Causes issues when sorting geometry as last vertex data attribute get wiped out.\n                    //m_textInfo.meshInfo[i].ClearUnusedVertices();\n\n                    mesh = m_subTextObjects[i].mesh;\n                }\n\n                //mesh.MarkDynamic();\n\n                if ((flags & TMP_VertexDataUpdateFlags.Vertices) == TMP_VertexDataUpdateFlags.Vertices)\n                    mesh.vertices = m_textInfo.meshInfo[i].vertices;\n\n                if ((flags & TMP_VertexDataUpdateFlags.Uv0) == TMP_VertexDataUpdateFlags.Uv0)\n                    mesh.uv = m_textInfo.meshInfo[i].uvs0;\n\n                if ((flags & TMP_VertexDataUpdateFlags.Uv2) == TMP_VertexDataUpdateFlags.Uv2)\n                    mesh.uv2 = m_textInfo.meshInfo[i].uvs2;\n\n                //if ((flags & TMP_VertexDataUpdateFlags.Uv4) == TMP_VertexDataUpdateFlags.Uv4)\n                //    mesh.uv4 = m_textInfo.meshInfo[i].uvs4;\n\n                if ((flags & TMP_VertexDataUpdateFlags.Colors32) == TMP_VertexDataUpdateFlags.Colors32)\n                    mesh.colors32 = m_textInfo.meshInfo[i].colors32;\n\n                mesh.RecalculateBounds();\n            }\n        }\n\n\n        /// <summary>\n        /// Function to upload the updated vertex data and renderer.\n        /// </summary>\n        public override void UpdateVertexData()\n        {\n            int materialCount = m_textInfo.materialCount;\n\n            for (int i = 0; i < materialCount; i++)\n            {\n                Mesh mesh;\n\n                if (i == 0)\n                    mesh = m_mesh;\n                else\n                {\n                    // Clear unused vertices\n                    m_textInfo.meshInfo[i].ClearUnusedVertices();\n\n                    mesh = m_subTextObjects[i].mesh;\n                }\n\n\n                //mesh.MarkDynamic();\n                mesh.vertices = m_textInfo.meshInfo[i].vertices;\n                mesh.uv = m_textInfo.meshInfo[i].uvs0;\n                mesh.uv2 = m_textInfo.meshInfo[i].uvs2;\n                //mesh.uv4 = m_textInfo.meshInfo[i].uvs4;\n                mesh.colors32 = m_textInfo.meshInfo[i].colors32;\n\n                mesh.RecalculateBounds();\n            }\n        }\n\n        public void UpdateFontAsset()\n        {\n            LoadFontAsset();\n        }\n\n\n        private bool m_currentAutoSizeMode;\n\n\n        public void CalculateLayoutInputHorizontal()\n        {\n            //Debug.Log(\"*** CalculateLayoutInputHorizontal() ***\");\n\n            if (!this.gameObject.activeInHierarchy)\n                return;\n\n            //IsRectTransformDriven = true;\n\n            m_currentAutoSizeMode = m_enableAutoSizing;\n\n            if (m_isCalculateSizeRequired || m_rectTransform.hasChanged)\n            {\n                //Debug.Log(\"Calculating Layout Horizontal\");\n\n                //m_LayoutPhase = AutoLayoutPhase.Horizontal;\n                //m_isRebuildingLayout = true;\n\n                m_minWidth = 0;\n                m_flexibleWidth = 0;\n\n                //m_renderMode = TextRenderFlags.GetPreferredSizes; // Set Text to not Render and exit early once we have new width values.\n\n                if (m_enableAutoSizing)\n                {\n                    m_fontSize = m_fontSizeMax;\n                }\n\n                // Set Margins to Infinity\n                m_marginWidth = k_LargePositiveFloat;\n                m_marginHeight = k_LargePositiveFloat;\n\n                if (m_isInputParsingRequired || m_isTextTruncated)\n                    ParseInputText();\n\n                GenerateTextMesh();\n\n                m_renderMode = TextRenderFlags.Render;\n\n                //m_preferredWidth = (int)m_preferredWidth + 1f;\n\n                ComputeMarginSize();\n\n                //Debug.Log(\"Preferred Width: \" + m_preferredWidth + \"  Margin Width: \" + m_marginWidth + \"  Preferred Height: \" + m_preferredHeight + \"  Margin Height: \" + m_marginHeight + \"  Rendered Width: \" + m_renderedWidth + \"  Height: \" + m_renderedHeight + \"  RectTransform Width: \" + m_rectTransform.rect);\n\n                m_isLayoutDirty = true;\n            }\n        }\n\n\n        public void CalculateLayoutInputVertical()\n        {\n            //Debug.Log(\"*** CalculateLayoutInputVertical() ***\");\n\n            // Check if object is active\n            if (!this.gameObject.activeInHierarchy) // || IsRectTransformDriven == false)\n                return;\n\n            //IsRectTransformDriven = true;\n\n            if (m_isCalculateSizeRequired || m_rectTransform.hasChanged)\n            {\n                //Debug.Log(\"Calculating Layout InputVertical\");\n\n                //m_LayoutPhase = AutoLayoutPhase.Vertical;\n                //m_isRebuildingLayout = true;\n\n                m_minHeight = 0;\n                m_flexibleHeight = 0;\n\n                //m_renderMode = TextRenderFlags.GetPreferredSizes;\n\n                if (m_enableAutoSizing)\n                {\n                    m_currentAutoSizeMode = true;\n                    m_enableAutoSizing = false;\n                }\n\n                m_marginHeight = k_LargePositiveFloat;\n\n                GenerateTextMesh();\n\n                m_enableAutoSizing = m_currentAutoSizeMode;\n\n                m_renderMode = TextRenderFlags.Render;\n\n                //m_preferredHeight = (int)m_preferredHeight + 1f;\n\n                ComputeMarginSize();\n\n                //Debug.Log(\"Preferred Height: \" + m_preferredHeight + \"  Margin Height: \" + m_marginHeight + \"  Preferred Width: \" + m_preferredWidth + \"  Margin Width: \" + m_marginWidth + \"  Rendered Width: \" + m_renderedWidth + \"  Height: \" + m_renderedHeight + \"  RectTransform Width: \" + m_rectTransform.rect);\n\n                m_isLayoutDirty = true;\n            }\n\n            m_isCalculateSizeRequired = false;\n        }\n    }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TextMeshPro.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 9541d86e2fd84c1d9990edf0852d74ab\nlabels:\n- Text\n- TextMesh\n- Mesh\n- Glow\n- Shadow\n- Outline\n- Bevel\n- Pro\n- TextMeshPro\n- Kerning\n- Distance\n- Field\n- Signed\n- Font\n- Atlas\n- Creator\n- Advanced\n- Rendering\n- TrueType\n- Dynamic\n- Layout\n- Style\n- Styles\n- Fonts\n- SDF\n- Scene\n- GUI\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: -105\n  icon: {fileID: 2800000, guid: 2fd6421f253b4ef1a19526541f9ffc0c, type: 3}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TextMeshProUGUI.cs",
    "content": "using UnityEngine;\nusing System;\nusing System.Collections;\nusing System.Collections.Generic;\n\nusing UnityEngine.UI;\nusing UnityEngine.EventSystems;\nusing UnityEngine.UI.CoroutineTween;\n\n\n#pragma warning disable 0414 // Disabled a few warnings related to serialized variables not used in this script but used in the editor.\n\nnamespace TMPro\n{\n\n    [DisallowMultipleComponent]\n    [RequireComponent(typeof(RectTransform))]\n    [RequireComponent(typeof(CanvasRenderer))]\n    [AddComponentMenu(\"UI/TextMeshPro - Text (UI)\", 11)]\n    [ExecuteAlways]\n    public partial class TextMeshProUGUI : TMP_Text, ILayoutElement\n    {\n        /// <summary>\n        /// Get the material that will be used for rendering.\n        /// </summary>\n        public override Material materialForRendering\n        {\n            get { return TMP_MaterialManager.GetMaterialForRendering(this, m_sharedMaterial); }\n        }\n\n        /// <summary>\n        /// Determines if the size of the text container will be adjusted to fit the text object when it is first created.\n        /// </summary>\n        public override bool autoSizeTextContainer\n        {\n            get { return m_autoSizeTextContainer; }\n\n            set { if (m_autoSizeTextContainer == value) return; m_autoSizeTextContainer = value; if (m_autoSizeTextContainer) { CanvasUpdateRegistry.RegisterCanvasElementForLayoutRebuild(this); SetLayoutDirty(); } }\n        }\n\n\n\n        /// <summary>\n        /// Reference to the Mesh used by the text object.\n        /// </summary>\n        public override Mesh mesh\n        {\n            get { return m_mesh; }\n        }\n\n\n        /// <summary>\n        /// Reference to the CanvasRenderer used by the text object.\n        /// </summary>\n        public new CanvasRenderer canvasRenderer\n        {\n            get\n            {\n                if (m_canvasRenderer == null) m_canvasRenderer = GetComponent<CanvasRenderer>();\n\n                return m_canvasRenderer;\n            }\n        }\n\n\n        /// <summary>\n        /// Anchor dampening prevents the anchor position from being adjusted unless the positional change exceeds about 40% of the width of the underline character. This essentially stabilizes the anchor position.\n        /// </summary>\n        //public bool anchorDampening\n        //{\n        //    get { return m_anchorDampening; }\n        //    set { if (m_anchorDampening != value) { havePropertiesChanged = true; m_anchorDampening = value; /* ScheduleUpdate(); */ } }\n        //}\n\n\n        private bool m_isRebuildingLayout = false;\n        //private bool m_isLayoutDirty = false;\n\n\n        /// <summary>\n        /// Function called by Unity when the horizontal layout needs to be recalculated.\n        /// </summary>\n        public void CalculateLayoutInputHorizontal()\n        {\n            //Debug.Log(\"*** CalculateLayoutHorizontal() ***\"); // at Frame: \" + Time.frameCount); // called on Object ID \" + GetInstanceID());\n            \n            //// Check if object is active\n            if (!this.gameObject.activeInHierarchy)\n                return;\n\n            if (m_isCalculateSizeRequired || m_rectTransform.hasChanged)\n            {\n                m_preferredWidth = GetPreferredWidth();\n\n                ComputeMarginSize();\n\n                m_isLayoutDirty = true;\n            }\n        }\n\n\n        /// <summary>\n        /// Function called by Unity when the vertical layout needs to be recalculated.\n        /// </summary>\n        public void CalculateLayoutInputVertical()\n        {\n            //Debug.Log(\"*** CalculateLayoutInputVertical() ***\"); // at Frame: \" + Time.frameCount); // called on Object ID \" + GetInstanceID());\n            \n            //// Check if object is active\n            if (!this.gameObject.activeInHierarchy) // || IsRectTransformDriven == false)\n                return;\n\n            if (m_isCalculateSizeRequired || m_rectTransform.hasChanged)\n            {\n                m_preferredHeight = GetPreferredHeight();\n\n                ComputeMarginSize();\n\n                m_isLayoutDirty = true;\n            }\n\n            m_isCalculateSizeRequired = false;\n        }\n\n\n        public override void SetVerticesDirty()\n        {\n            if (m_verticesAlreadyDirty || this == null || !this.IsActive() || CanvasUpdateRegistry.IsRebuildingGraphics())\n                return;\n\n            m_verticesAlreadyDirty = true;\n            CanvasUpdateRegistry.RegisterCanvasElementForGraphicRebuild((ICanvasElement)this);\n\n            if (m_OnDirtyVertsCallback != null)\n                m_OnDirtyVertsCallback();\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        public override void SetLayoutDirty()\n        {\n            m_isPreferredWidthDirty = true;\n            m_isPreferredHeightDirty = true;\n\n            if ( m_layoutAlreadyDirty || this == null || !this.IsActive())\n                return;\n\n            m_layoutAlreadyDirty = true;\n            LayoutRebuilder.MarkLayoutForRebuild(this.rectTransform);\n\n            m_isLayoutDirty = true;\n\n            if (m_OnDirtyLayoutCallback != null)\n                m_OnDirtyLayoutCallback();\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        public override void SetMaterialDirty()\n        {\n            //Debug.Log(\"SetMaterialDirty()\");\n\n            if (this == null || !this.IsActive() || CanvasUpdateRegistry.IsRebuildingGraphics())\n                return;\n\n            m_isMaterialDirty = true;\n            CanvasUpdateRegistry.RegisterCanvasElementForGraphicRebuild((ICanvasElement)this);\n\n            if (m_OnDirtyMaterialCallback != null)\n                m_OnDirtyMaterialCallback();\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        public override void SetAllDirty()\n        {\n            m_isInputParsingRequired = true;\n\n            SetLayoutDirty();\n            SetVerticesDirty();\n            SetMaterialDirty();\n        }\n\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"update\"></param>\n        public override void Rebuild(CanvasUpdate update)\n        {\n            if (this == null) return;\n\n            if (update == CanvasUpdate.Prelayout)\n            {\n                if (m_autoSizeTextContainer)\n                {\n                    m_rectTransform.sizeDelta = GetPreferredValues(Mathf.Infinity, Mathf.Infinity);\n                }\n            }\n            else if (update == CanvasUpdate.PreRender)\n            {\n                OnPreRenderCanvas();\n\n                m_verticesAlreadyDirty = false;\n                m_layoutAlreadyDirty = false;\n\n                if (!m_isMaterialDirty) return;\n\n                UpdateMaterial();\n                m_isMaterialDirty = false;\n            }\n        }\n\n\n        /// <summary>\n        /// Method to keep the pivot of the sub text objects in sync with the parent pivot.\n        /// </summary>\n        private void UpdateSubObjectPivot()\n        {\n            if (m_textInfo == null) return;\n\n            for (int i = 1; i < m_subTextObjects.Length && m_subTextObjects[i] != null; i++)\n            {\n                m_subTextObjects[i].SetPivotDirty();\n            }\n            //m_isPivotDirty = false;\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"baseMaterial\"></param>\n        /// <returns></returns>\n        public override Material GetModifiedMaterial(Material baseMaterial)\n        {\n            Material mat = baseMaterial;\n\n            if (m_ShouldRecalculateStencil)\n            {\n                m_stencilID = TMP_MaterialManager.GetStencilID(gameObject);\n                m_ShouldRecalculateStencil = false;\n            }\n\n            // Release masking material\n            //if (m_MaskMaterial != null)\n            //    MaterialManager.ReleaseStencilMaterial(m_MaskMaterial);\n\n            if (m_stencilID > 0)\n            {\n                mat = TMP_MaterialManager.GetStencilMaterial(baseMaterial, m_stencilID);\n                if (m_MaskMaterial != null)\n                    TMP_MaterialManager.ReleaseStencilMaterial(m_MaskMaterial);\n\n                m_MaskMaterial = mat;\n            }\n\n            return mat;\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        protected override void UpdateMaterial()\n        {\n            //Debug.Log(\"*** UpdateMaterial() ***\");\n\n            //if (!this.IsActive())\n            //    return;\n\n            if (m_sharedMaterial == null) return;\n\n            if (m_canvasRenderer == null) m_canvasRenderer = this.canvasRenderer;\n\n            m_canvasRenderer.materialCount = 1;\n            m_canvasRenderer.SetMaterial(materialForRendering, 0);\n        }\n\n\n        //public override void OnRebuildRequested()\n        //{\n        //    //Debug.Log(\"OnRebuildRequested\");\n\n        //    base.OnRebuildRequested();\n        //}\n\n\n\n        //public override bool Raycast(Vector2 sp, Camera eventCamera)\n        //{\n        //    //Debug.Log(\"Raycast Event. ScreenPoint: \" + sp);\n        //    return base.Raycast(sp, eventCamera);\n        //}\n\n\n        // MASKING RELATED PROPERTIES\n        /// <summary>\n        /// Sets the masking offset from the bounds of the object\n        /// </summary>\n        public Vector4 maskOffset\n        {\n            get { return m_maskOffset; }\n            set { m_maskOffset = value; UpdateMask(); m_havePropertiesChanged = true; }\n        }\n\n\n        //public override Material defaultMaterial \n        //{\n        //    get { Debug.Log(\"Default Material called.\"); return m_sharedMaterial; }\n        //}\n\n\n\n        //protected override void OnCanvasHierarchyChanged()\n        //{\n        //    //Debug.Log(\"OnCanvasHierarchyChanged...\");\n        //}\n\n\n        // IClippable implementation\n        /// <summary>\n        /// Method called when the state of a parent changes.\n        /// </summary>\n        public override void RecalculateClipping()\n        {\n            //Debug.Log(\"***** RecalculateClipping() *****\");\n\n            base.RecalculateClipping();\n        }\n\n        // IMaskable Implementation\n        /// <summary>\n        /// Method called when Stencil Mask needs to be updated on this element and parents.\n        /// </summary>\n        public override void RecalculateMasking()\n        {\n            //Debug.Log(\"***** RecalculateMasking() *****\");\n\n            this.m_ShouldRecalculateStencil = true;\n            SetMaterialDirty();\n        }\n\n        /// <summary>\n        /// Override of the Cull function to provide for the ability to override the culling of the text object.\n        /// </summary>\n        /// <param name=\"clipRect\"></param>\n        /// <param name=\"validRect\"></param>\n        public override void Cull(Rect clipRect, bool validRect)\n        {\n            if (m_ignoreRectMaskCulling) return;\n\n            base.Cull(clipRect, validRect);\n        }\n\n\n        //protected override void UpdateGeometry()\n        //{\n        //    //Debug.Log(\"UpdateGeometry\");\n        //    //base.UpdateGeometry();\n        //}\n\n\n        //protected override void UpdateMaterial()\n        //{\n        //    //Debug.Log(\"UpdateMaterial called.\");\n        ////    base.UpdateMaterial();\n        //}\n\n\n        /*\n        /// <summary>\n        /// Sets the mask type \n        /// </summary>\n        public MaskingTypes mask\n        {\n            get { return m_mask; }\n            set { m_mask = value; havePropertiesChanged = true; isMaskUpdateRequired = true; }\n        }\n\n        /// <summary>\n        /// Set the masking offset mode (as percentage or pixels)\n        /// </summary>\n        public MaskingOffsetMode maskOffsetMode\n        {\n            get { return m_maskOffsetMode; }\n            set { m_maskOffsetMode = value; havePropertiesChanged = true; isMaskUpdateRequired = true; }\n        }\n        */\n\n\n\n        /*\n        /// <summary>\n        /// Sets the softness of the mask\n        /// </summary>\n        public Vector2 maskSoftness\n        {\n            get { return m_maskSoftness; }\n            set { m_maskSoftness = value; havePropertiesChanged = true; isMaskUpdateRequired = true; }\n        }\n\n        /// <summary>\n        /// Allows to move / offset the mesh vertices by a set amount\n        /// </summary>\n        public Vector2 vertexOffset\n        {\n            get { return m_vertexOffset; }\n            set { m_vertexOffset = value; havePropertiesChanged = true; isMaskUpdateRequired = true; }\n        }\n        */\n\n\n        /// <summary>\n        /// Function to be used to force recomputing of character padding when Shader / Material properties have been changed via script.\n        /// </summary>\n        public override void UpdateMeshPadding()\n        {\n            m_padding = ShaderUtilities.GetPadding(m_sharedMaterial, m_enableExtraPadding, m_isUsingBold);\n            m_isMaskingEnabled = ShaderUtilities.IsMaskingEnabled(m_sharedMaterial);\n            m_havePropertiesChanged = true;\n            checkPaddingRequired = false;\n\n            // Return if text object is not awake yet.\n            if (m_textInfo == null) return;\n\n            // Update sub text objects\n            for (int i = 1; i < m_textInfo.materialCount; i++)\n                m_subTextObjects[i].UpdateMeshPadding(m_enableExtraPadding, m_isUsingBold);\n        }\n\n\n        /// <summary>\n        /// Tweens the CanvasRenderer color associated with this Graphic.\n        /// </summary>\n        /// <param name=\"targetColor\">Target color.</param>\n        /// <param name=\"duration\">Tween duration.</param>\n        /// <param name=\"ignoreTimeScale\">Should ignore Time.scale?</param>\n        /// <param name=\"useAlpha\">Should also Tween the alpha channel?</param>\n        protected override void InternalCrossFadeColor(Color targetColor, float duration, bool ignoreTimeScale, bool useAlpha)\n        {\n            int materialCount = m_textInfo.materialCount;\n\n            for (int i = 1; i < materialCount; i++)\n            {\n                m_subTextObjects[i].CrossFadeColor(targetColor, duration, ignoreTimeScale, useAlpha);\n            }\n        }\n\n\n        /// <summary>\n        /// Tweens the alpha of the CanvasRenderer color associated with this Graphic.\n        /// </summary>\n        /// <param name=\"alpha\">Target alpha.</param>\n        /// <param name=\"duration\">Duration of the tween in seconds.</param>\n        /// <param name=\"ignoreTimeScale\">Should ignore Time.scale?</param>\n        protected override void InternalCrossFadeAlpha(float alpha, float duration, bool ignoreTimeScale)\n        {\n            int materialCount = m_textInfo.materialCount;\n\n            for (int i = 1; i < materialCount; i++)\n            {\n                m_subTextObjects[i].CrossFadeAlpha(alpha, duration, ignoreTimeScale);\n            }\n        }\n\n\n        /// <summary>\n        /// Function to force regeneration of the mesh before its normal process time. This is useful when changes to the text object properties need to be applied immediately.\n        /// </summary>\n        public override void ForceMeshUpdate()\n        {\n            //if (m_isEnabled == false) this.OnEnable();\n\n            m_havePropertiesChanged = true;\n            OnPreRenderCanvas();\n        }\n\n\n        /// <summary>\n        /// Function to force regeneration of the mesh before its normal process time. This is useful when changes to the text object properties need to be applied immediately.\n        /// </summary>\n        /// <param name=\"ignoreInactive\">If set to true, the text object will be regenerated regardless of is active state.</param>\n        public override void ForceMeshUpdate(bool ignoreInactive)\n        {\n            m_havePropertiesChanged = true;\n            m_ignoreActiveState = true;\n            OnPreRenderCanvas();\n        }\n\n\n        /// <summary>\n        /// Function used to evaluate the length of a text string.\n        /// </summary>\n        /// <param name=\"text\"></param>\n        /// <returns></returns>\n        public override TMP_TextInfo GetTextInfo(string text)\n        {\n            StringToCharArray(text, ref m_TextParsingBuffer);\n            SetArraySizes(m_TextParsingBuffer);\n\n            m_renderMode = TextRenderFlags.DontRender;\n\n            ComputeMarginSize();\n\n            // Need to make sure we have a valid reference to a Canvas.\n            if (m_canvas == null) m_canvas = this.canvas;\n\n            GenerateTextMesh();\n\n            m_renderMode = TextRenderFlags.Render;\n\n            return this.textInfo;\n        }\n\n        /// <summary>\n        /// Function to clear the geometry of the Primary and Sub Text objects.\n        /// </summary>\n        public override void ClearMesh()\n        {\n            m_canvasRenderer.SetMesh(null);\n\n            for (int i = 1; i < m_subTextObjects.Length && m_subTextObjects[i] != null; i++)\n                m_subTextObjects[i].canvasRenderer.SetMesh(null);\n\n            //if (m_linkedTextComponent != null)\n            //   m_linkedTextComponent.ClearMesh();\n        }\n\n\n        /// <summary>\n        /// Function to force the regeneration of the text object.\n        /// </summary>\n        /// <param name=\"flags\"> Flags to control which portions of the geometry gets uploaded.</param>\n        //public override void ForceMeshUpdate(TMP_VertexDataUpdateFlags flags) { }\n\n\n        /// <summary>\n        /// Function to update the geometry of the main and sub text objects.\n        /// </summary>\n        /// <param name=\"mesh\"></param>\n        /// <param name=\"index\"></param>\n        public override void UpdateGeometry(Mesh mesh, int index)\n        {\n            mesh.RecalculateBounds();\n\n            if (index == 0)\n            {\n                m_canvasRenderer.SetMesh(mesh);\n            }\n            else\n            {\n                m_subTextObjects[index].canvasRenderer.SetMesh(mesh);\n            }\n        }\n\n\n        /// <summary>\n        /// Function to upload the updated vertex data and renderer.\n        /// </summary>\n        public override void UpdateVertexData(TMP_VertexDataUpdateFlags flags)\n        {\n            int materialCount = m_textInfo.materialCount;\n\n            for (int i = 0; i < materialCount; i++)\n            {\n                Mesh mesh;\n\n                if (i == 0)\n                    mesh = m_mesh;\n                else\n                {\n                    // Clear unused vertices\n                    // TODO: Causes issues when sorting geometry as last vertex data attribute get wiped out.\n                    //m_textInfo.meshInfo[i].ClearUnusedVertices();\n\n                    mesh = m_subTextObjects[i].mesh;\n                }\n\n                if ((flags & TMP_VertexDataUpdateFlags.Vertices) == TMP_VertexDataUpdateFlags.Vertices)\n                    mesh.vertices = m_textInfo.meshInfo[i].vertices;\n\n                if ((flags & TMP_VertexDataUpdateFlags.Uv0) == TMP_VertexDataUpdateFlags.Uv0)\n                    mesh.uv = m_textInfo.meshInfo[i].uvs0;\n\n                if ((flags & TMP_VertexDataUpdateFlags.Uv2) == TMP_VertexDataUpdateFlags.Uv2)\n                    mesh.uv2 = m_textInfo.meshInfo[i].uvs2;\n\n                //if ((flags & TMP_VertexDataUpdateFlags.Uv4) == TMP_VertexDataUpdateFlags.Uv4)\n                //    mesh.uv4 = m_textInfo.meshInfo[i].uvs4;\n\n                if ((flags & TMP_VertexDataUpdateFlags.Colors32) == TMP_VertexDataUpdateFlags.Colors32)\n                    mesh.colors32 = m_textInfo.meshInfo[i].colors32;\n\n                mesh.RecalculateBounds();\n\n                if (i == 0)\n                    m_canvasRenderer.SetMesh(mesh);\n                else\n                    m_subTextObjects[i].canvasRenderer.SetMesh(mesh);\n            }\n        }\n\n\n        /// <summary>\n        /// Function to upload the updated vertex data and renderer.\n        /// </summary>\n        public override void UpdateVertexData()\n        {\n            int materialCount = m_textInfo.materialCount;\n\n            for (int i = 0; i < materialCount; i++)\n            {\n                Mesh mesh;\n\n                if (i == 0)\n                    mesh = m_mesh;\n                else\n                {\n                    // Clear unused vertices\n                    m_textInfo.meshInfo[i].ClearUnusedVertices();\n\n                    mesh = m_subTextObjects[i].mesh;\n                }\n\n                //mesh.MarkDynamic();\n                mesh.vertices = m_textInfo.meshInfo[i].vertices;\n                mesh.uv = m_textInfo.meshInfo[i].uvs0;\n                mesh.uv2 = m_textInfo.meshInfo[i].uvs2;\n                //mesh.uv4 = m_textInfo.meshInfo[i].uvs4;\n                mesh.colors32 = m_textInfo.meshInfo[i].colors32;\n\n                mesh.RecalculateBounds();\n\n                if (i == 0)\n                    m_canvasRenderer.SetMesh(mesh);\n                else\n                    m_subTextObjects[i].canvasRenderer.SetMesh(mesh);\n            }\n        }\n\n\n        public void UpdateFontAsset()\n        {        \n            LoadFontAsset();\n        }\n\n    }\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/TextMeshProUGUI.cs.meta",
    "content": "fileFormatVersion: 2\nguid: f4688fdb7df04437aeb418b961361dc5\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: -100\n  icon: {fileID: 2800000, guid: 2fd6421f253b4ef1a19526541f9ffc0c, type: 3}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/Unity.TextMeshPro.asmdef",
    "content": "{\n    \"name\": \"Unity.TextMeshPro\",\n    \"references\": [ \"Unity.ugui\" ],\n    \"optionalUnityReferences\": [],\n    \"includePlatforms\": [],\n    \"excludePlatforms\": [],\n    \"allowUnsafeCode\": false,\n    \"overrideReferences\": false,\n    \"precompiledReferences\": [],\n    \"autoReferenced\": true,\n    \"defineConstraints\": [],\n    \"versionDefines\": []\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime/Unity.TextMeshPro.asmdef.meta",
    "content": "fileFormatVersion: 2\nguid: 6055be8ebefd69e48b49212b09b47b2f\nAssemblyDefinitionImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts/Runtime.meta",
    "content": "fileFormatVersion: 2\nguid: 5fc988a1d5b04aee9a5222502b201a45\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Scripts.meta",
    "content": "fileFormatVersion: 2\nguid: e6a1d1e3d2384453a7371b4a07a41ca4\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Tests/Editor/TMP_EditorTests.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing UnityEngine.TestTools;\nusing NUnit.Framework;\nusing System.IO;\nusing System.Collections;\n\n\nnamespace TMPro\n{\n    [Category(\"Text Parsing & Layout\")]\n    class TMP_EditorTests\n    {\n        private TextMeshPro m_TextComponent;\n\n        // Characters: 22  Spaces: 4  Words: 5  Lines:\n        private const string m_TextBlock_00 = \"A simple line of text.\";\n\n        // Characters: 104  Spaces: 14  Words: 15  Lines:\n        private const string m_TextBlock_01 = \"Unity 2017 introduces new features that help teams of artists and developers build experiences together.\";\n\n        // Characters: 1500  Spaces: 228  Words: 241 \n        private const string m_TextBlock_02 = \"The European languages are members of the same family. Their separate existence is a myth. For science, music, sport, etc, Europe uses the same vocabulary. The languages only differ in their grammar, their pronunciation and their most common words.\" +\n            \"Everyone realizes why a new common language would be desirable: one could refuse to pay expensive translators.To achieve this, it would be necessary to have uniform grammar, pronunciation and more common words.If several languages coalesce, the grammar of the resulting language is more simple and regular than that of the individual languages.\" +\n            \"The new common language will be more simple and regular than the existing European languages.It will be as simple as Occidental; in fact, it will be Occidental.To an English person, it will seem like simplified English, as a skeptical Cambridge friend of mine told me what Occidental is. The European languages are members of the same family.\" +\n            \"Their separate existence is a myth. For science, music, sport, etc, Europe uses the same vocabulary.The languages only differ in their grammar, their pronunciation and their most common words.Everyone realizes why a new common language would be desirable: one could refuse to pay expensive translators.To achieve this, it would be necessary to\" +\n            \"have uniform grammar, pronunciation and more common words.If several languages coalesce, the grammar of the resulting language is more simple and regular than that of the individual languages.The new common language will be\";\n\n        // Characters: 2500  Spaces: 343  Words: 370\n        private const string m_TextBlock_03 = \"Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. \" +\n            \"Nullam dictum felis eu pede mollis pretium.Integer tincidunt.Cras dapibus.Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim.Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus.Phasellus viverra nulla ut metus varius laoreet.Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue.Curabitur ullamcorper ultricies nisi. \" +\n            \"Nam eget dui.Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum.Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem.Maecenas nec odio et ante tincidunt tempus.Donec vitae sapien ut libero venenatis faucibus.Nullam quis ante.Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. \" +\n            \"Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc, quis gravida magna mi a libero. Fusce vulputate eleifend sapien. Vestibulum purus quam, scelerisque ut, mollis sed, nonummy id, metus.Nullam accumsan lorem in dui.Cras ultricies mi eu turpis hendrerit fringilla.Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In ac dui quis mi consectetuer lacinia. Nam pretium turpis et arcu. \" +\n            \"Duis arcu tortor, suscipit eget, imperdiet nec, imperdiet iaculis, ipsum. Sed aliquam ultrices mauris.Integer ante arcu, accumsan a, consectetuer eget, posuere ut, mauris.Praesent adipiscing. Phasellus ullamcorper ipsum rutrum nunc.Nunc nonummy metus.Vestibulum volutpat pretium libero. Cras id dui.Aenean ut eros et nisl sagittis vestibulum.Nullam nulla eros, ultricies sit amet, nonummy id, imperdiet feugiat, pede.Sed lectus. Donec mollis hendrerit risus. Phasellus nec sem in justo pellentesque facilisis. \" +\n            \"Etiam imperdiet imperdiet orci. Nunc nec neque.Phasellus leo dolor, tempus non, auctor et, hendrerit quis, nisi.Curabitur ligula sapien, tincidunt non, euismod vitae, posuere imperdiet, leo.Maecenas malesuada. Praesent nan. The end of this of this long block of text.\";\n\n        // Characters: 3423  Spaces: 453  Words: 500\n        private const string m_TextBlock_04 = \"Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Aenean commodo ligula eget dolor.Aenean massa.Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem.Nulla consequat massa quis enim.Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu.In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo.Nullam dictum felis eu pede mollis pretium.Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus.\" +\n            \"Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim.Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus.Phasellus viverra nulla ut metus varius laoreet.Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue.Curabitur ullamcorper ultricies nisi. Nam eget dui.Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum.Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem.Maecenas nec odio et ante tincidunt tempus.Donec vitae sapien ut libero venenatis faucibus.Nullam quis ante.\" +\n            \"Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc, quis gravida magna mi a libero. Fusce vulputate eleifend sapien. Vestibulum purus quam, scelerisque ut, mollis sed, nonummy id, metus.Nullam accumsan lorem in dui.Cras ultricies mi eu turpis hendrerit fringilla.Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In ac dui quis mi consectetuer lacinia.Nam pretium turpis et arcu.\" +\n            \"Duis arcu tortor, suscipit eget, imperdiet nec, imperdiet iaculis, ipsum. Sed aliquam ultrices mauris.Integer ante arcu, accumsan a, consectetuer eget, posuere ut, mauris.Praesent adipiscing. Phasellus ullamcorper ipsum rutrum nunc.Nunc nonummy metus.Vestibulum volutpat pretium libero. Cras id dui.Aenean ut eros et nisl sagittis vestibulum.Nullam nulla eros, ultricies sit amet, nonummy id, imperdiet feugiat, pede.Sed lectus. Donec mollis hendrerit risus. Phasellus nec sem in justo pellentesque facilisis.Etiam imperdiet imperdiet orci. Nunc nec neque.\" +\n            \"Phasellus leo dolor, tempus non, auctor et, hendrerit quis, nisi.Curabitur ligula sapien, tincidunt non, euismod vitae, posuere imperdiet, leo.Maecenas malesuada. Praesent congue erat at massa.Sed cursus turpis vitae tortor.Donec posuere vulputate arcu. Phasellus accumsan cursus velit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed aliquam, nisi quis porttitor congue, elit erat euismod orci, ac placerat dolor lectus quis orci.Phasellus consectetuer vestibulum elit.Aenean tellus metus, bibendum sed, posuere ac, mattis non, nunc.Vestibulum fringilla pede sit amet augue.\" +\n            \"In turpis. Pellentesque posuere. Praesent turpis. Aenean posuere, tortor sed cursus feugiat, nunc augue blandit nunc, eu sollicitudin urna dolor sagittis lacus. Donec elit libero, sodales nec, volutpat a, suscipit non, turpis.Nullam sagittis. Suspendisse pulvinar, augue ac venenatis condimentum, sem libero volutpat nibh, nec pellentesque velit pede quis nunc. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Fusce id purus.Ut varius tincidunt libero.Phasellus dolor.Maecenas vestibulum mollis\";\n\n        // \n        private const string m_TextBlock_05 = \"This block of text contains <b>bold</b> and <i>italicized</i> characters.\";\n\n        private const string m_TextBlock_06 = \"<align=center><style=H1><#ffffff><u>Multiple<#80f0ff> Alignment</color> per text object</u></color></style></align><line-height=2em>\\n\" +\n            \"</line-height> The <<#ffffa0>align</color>> tag in TextMesh<#40a0ff>Pro</color> provides the ability to control the alignment of lines and paragraphs which is essential when working with text.\\n\" +\n            \"<align=left> You may want some block of text to be<#80f0ff>left aligned</color> <<#ffffa0>align=<#80f0ff>left</color></color>> which is sort of the standard.</align>\\n\" +\n            \"<style=Quote><#ffffa0>\\\"Using <#80f0ff>Center Alignment</color> <<#ffffa0>align=<#80f0ff>center</color></color>> for a title or displaying a quote is another good example of text alignment.\\\"</color></style>\\n\" +\n            \"<align=right><#80f0ff>Right Alignment</color> <<#ffffa0>align=<#80f0ff>right</color></color>> can be useful to create contrast between lines and paragraphs of text.\\n\" +\n            \"<align=justified><#80f0ff>Justified Alignment</color> <<#ffffa0>align=<#80f0ff>justified</color></color>> results in text that is flush on both the left and right margins. Used well, justified type can look clean and classy.\\n\" +\n            \"<style=Quote><align=left><#ffffa0>\\\"Text formatting and alignment has a huge impact on how people will read and perceive your text.\\\"</color>\\n\" +\n            \"<size=65%><align=right> -Stephan Bouchard</style>\";\n\n        private readonly string[] testStrings = new string[] { m_TextBlock_00, m_TextBlock_01, m_TextBlock_02, m_TextBlock_03, m_TextBlock_04, m_TextBlock_05, m_TextBlock_06 };\n\n\n        [OneTimeSetUp]\n        public void Setup()\n        {\n            if (Directory.Exists(Path.GetFullPath(\"Assets/TextMesh Pro\")) || Directory.Exists(Path.GetFullPath(\"Packages/com.unity.textmeshpro.tests/TextMesh Pro\")))\n            {\n                GameObject textObject = new GameObject(\"Text Object\");\n                m_TextComponent = textObject.AddComponent<TextMeshPro>();\n\n                m_TextComponent.fontSize = 18;\n            }\n            else\n            {\n                Debug.Log(\"Skipping over Editor tests as TMP Essential Resources are missing from the current test project.\");\n                Assert.Ignore();\n\n                return;\n            }\n        }\n\n\n        [Test]\n        [TestCase(\"/Package Resources/TMP Essential Resources.unitypackage\", \"ce4ff17ca867d2b48b5c8a4181611901\")]\n        [TestCase(\"/Package Resources/TMP Examples & Extras.unitypackage\", \"bc00e25696e4132499f56528d3fed2e3\")]\n        [TestCase(\"/PackageConversionData.json\", \"05f5bfd584002f948982a1498890f9a9\")]\n        public void InternalResourceCheck(string filePath, string guid)\n        {\n            string packageRelativePath = EditorUtilities.TMP_EditorUtility.packageRelativePath;\n            string packageFullPath = EditorUtilities.TMP_EditorUtility.packageFullPath;\n\n            Assert.AreEqual(AssetDatabase.AssetPathToGUID(packageRelativePath + filePath), guid);\n            Assert.IsTrue(System.IO.File.Exists(packageFullPath + filePath));\n\n        }\n\n\n        [Test]\n        [TestCase(4, 3423, 453, 500, 1)]\n        [TestCase(3, 2500, 343, 370, 1)]\n        [TestCase(2, 1500, 228, 241, 1)]\n        [TestCase(1, 104, 14, 15, 1)]\n        [TestCase(0, 22, 4, 5, 1)]\n        public void TextParsing_TextInfoTest_WordWrappingDisabled(int sourceTextIndex, int characterCount, int spaceCount, int wordCount, int lineCount)\n        {\n            m_TextComponent.text = testStrings[sourceTextIndex];\n            m_TextComponent.enableWordWrapping = false;\n            m_TextComponent.alignment = TextAlignmentOptions.TopLeft;\n\n            // Size the RectTransform\n            m_TextComponent.rectTransform.sizeDelta = new Vector2(50, 5);\n\n            // Force text generation to populate the TextInfo data structure.\n            m_TextComponent.ForceMeshUpdate();\n\n            Assert.AreEqual(m_TextComponent.textInfo.characterCount, characterCount);\n            Assert.AreEqual(m_TextComponent.textInfo.spaceCount, spaceCount);\n            Assert.AreEqual(m_TextComponent.textInfo.wordCount, wordCount);\n            Assert.AreEqual(m_TextComponent.textInfo.lineCount, lineCount);\n        }\n\n\n        [Test]\n        [TestCase(4, 3423, 453, 500, 29)]\n        [TestCase(3, 2500, 343, 370, 21)]\n        [TestCase(2, 1500, 228, 241, 13)]\n        [TestCase(1, 104, 14, 15, 1)]\n        [TestCase(0, 22, 4, 5, 1)]\n        public void TextParsing_TextInfoTest_WordWrappingEnabled(int sourceTextIndex, int characterCount, int spaceCount, int wordCount, int lineCount)\n        {\n            m_TextComponent.text = testStrings[sourceTextIndex];\n            m_TextComponent.enableWordWrapping = true;\n            m_TextComponent.alignment = TextAlignmentOptions.TopLeft;\n\n            // Size the RectTransform\n            m_TextComponent.rectTransform.sizeDelta = new Vector2(100, 50);\n\n            // Force text generation to populate the TextInfo data structure.\n            m_TextComponent.ForceMeshUpdate();\n\n            Assert.AreEqual(m_TextComponent.textInfo.characterCount, characterCount);\n            Assert.AreEqual(m_TextComponent.textInfo.spaceCount, spaceCount);\n            Assert.AreEqual(m_TextComponent.textInfo.wordCount, wordCount);\n            Assert.AreEqual(m_TextComponent.textInfo.lineCount, lineCount);\n        }\n\n\n        [Test]\n        [TestCase(4, 3423, 453, 500, 27)]\n        [TestCase(3, 2500, 343, 370, 20)]\n        [TestCase(2, 1500, 228, 241, 13)]\n        public void TextParsing_TextInfoTest_TopJustifiedAlignment(int sourceTextIndex, int characterCount, int spaceCount, int wordCount, int lineCount)\n        {\n            m_TextComponent.text = testStrings[sourceTextIndex];\n            m_TextComponent.enableWordWrapping = true;\n            m_TextComponent.alignment = TextAlignmentOptions.TopJustified;\n\n            // Size the RectTransform\n            m_TextComponent.rectTransform.sizeDelta = new Vector2(100, 50);\n\n            // Force text generation to populate the TextInfo data structure.\n            m_TextComponent.ForceMeshUpdate();\n\n            Assert.AreEqual(m_TextComponent.textInfo.characterCount, characterCount);\n            Assert.AreEqual(m_TextComponent.textInfo.spaceCount, spaceCount);\n            Assert.AreEqual(m_TextComponent.textInfo.wordCount, wordCount);\n            Assert.AreEqual(m_TextComponent.textInfo.lineCount, lineCount);\n        }\n\n\n        [Test]\n        [TestCase(6, 768, 124, 126, 14)]\n        [TestCase(5, 59, 8, 9, 1)]\n        public void TextParsing_TextInfoTest_RichText(int sourceTextIndex, int characterCount, int spaceCount, int wordCount, int lineCount)\n        {\n            m_TextComponent.text = testStrings[sourceTextIndex];\n            m_TextComponent.enableWordWrapping = true;\n            m_TextComponent.alignment = TextAlignmentOptions.TopLeft;\n\n            // Size the RectTransform\n            m_TextComponent.rectTransform.sizeDelta = new Vector2(70, 35);\n\n            // Force text generation to populate the TextInfo data structure.\n            m_TextComponent.ForceMeshUpdate();\n\n            Assert.AreEqual(m_TextComponent.textInfo.characterCount, characterCount);\n            Assert.AreEqual(m_TextComponent.textInfo.spaceCount, spaceCount);\n            Assert.AreEqual(m_TextComponent.textInfo.wordCount, wordCount);\n            Assert.AreEqual(m_TextComponent.textInfo.lineCount, lineCount);\n        }\n\n\n        // Add tests that check position of individual characters in a complex block of text.\n        // These test also use the data contained inside the TMP_TextInfo class.\n\n\n        //[OneTimeTearDown]\n        //public void Cleanup()\n        //{\n        //    // Remove TMP Essential Resources if they were imported in the project as a result of running tests.\n        //    if (TMPro_EventManager.temporaryResourcesImported == true)\n        //    {\n        //        if (Directory.Exists(Path.GetFullPath(\"Assets/TextMesh Pro\")))\n        //        {\n        //            AssetDatabase.DeleteAsset(\"Assets/TextMesh Pro\");\n        //            TMPro_EventManager.temporaryResourcesImported = false;\n        //        }\n        //    }\n        //}\n\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Tests/Editor/TMP_EditorTests.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 592f7288ed0df2c4b884e2cd9baac023\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Tests/Editor/Unity.TextMeshPro.Editor.Tests.asmdef",
    "content": "{\n    \"name\": \"Unity.TextMeshPro.Editor.Tests\",\n    \"references\": [\n        \"Unity.TextMeshPro\",\n        \"Unity.TextMeshPro.Editor\",\n\t\t\"Unity.ugui\",\n        \"Unity.ugui.Editor\"\n    ],\n    \"optionalUnityReferences\": [\n        \"TestAssemblies\"\n    ],\n    \"includePlatforms\": [\n        \"Editor\"\n    ],\n    \"excludePlatforms\": []\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Tests/Editor/Unity.TextMeshPro.Editor.Tests.asmdef.meta",
    "content": "fileFormatVersion: 2\nguid: 656e461844099ae43a609ff6109b0877\nAssemblyDefinitionImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Tests/Editor.meta",
    "content": "fileFormatVersion: 2\nguid: 28542eca5f1b4c64813acfbd512524b6\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Tests/Runtime/TMP_RuntimeTests.cs",
    "content": "﻿using UnityEngine;\nusing UnityEngine.TestTools;\nusing NUnit.Framework;\nusing System.IO;\nusing System.Collections;\nusing System.Collections.Generic;\n\nnamespace TMPro\n{\n    [Category(\"Text Parsing & Layout\")]\n    class TMP_RuntimeTests\n    {\n        private TextMeshPro m_TextComponent;\n\n        // Characters: 22  Spaces: 4  Words: 5  Lines:\n        private const string m_TextBlock_00 = \"A simple line of text.\";\n\n        // Characters: 104  Spaces: 14  Words: 15  Lines:\n        private const string m_TextBlock_01 = \"Unity 2017 introduces new features that help teams of artists and developers build experiences together.\";\n\n        // Characters: 1500  Spaces: 228  Words: 241 \n        private const string m_TextBlock_02 = \"The European languages are members of the same family. Their separate existence is a myth. For science, music, sport, etc, Europe uses the same vocabulary. The languages only differ in their grammar, their pronunciation and their most common words.\" +\n            \"Everyone realizes why a new common language would be desirable: one could refuse to pay expensive translators.To achieve this, it would be necessary to have uniform grammar, pronunciation and more common words.If several languages coalesce, the grammar of the resulting language is more simple and regular than that of the individual languages.\" +\n            \"The new common language will be more simple and regular than the existing European languages.It will be as simple as Occidental; in fact, it will be Occidental.To an English person, it will seem like simplified English, as a skeptical Cambridge friend of mine told me what Occidental is. The European languages are members of the same family.\" +\n            \"Their separate existence is a myth. For science, music, sport, etc, Europe uses the same vocabulary.The languages only differ in their grammar, their pronunciation and their most common words.Everyone realizes why a new common language would be desirable: one could refuse to pay expensive translators.To achieve this, it would be necessary to\" +\n            \"have uniform grammar, pronunciation and more common words.If several languages coalesce, the grammar of the resulting language is more simple and regular than that of the individual languages.The new common language will be\";\n\n        // Characters: 2500  Spaces: 343  Words: 370\n        private const string m_TextBlock_03 = \"Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. \" +\n            \"Nullam dictum felis eu pede mollis pretium.Integer tincidunt.Cras dapibus.Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim.Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus.Phasellus viverra nulla ut metus varius laoreet.Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue.Curabitur ullamcorper ultricies nisi. \" +\n            \"Nam eget dui.Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum.Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem.Maecenas nec odio et ante tincidunt tempus.Donec vitae sapien ut libero venenatis faucibus.Nullam quis ante.Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. \" +\n            \"Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc, quis gravida magna mi a libero. Fusce vulputate eleifend sapien. Vestibulum purus quam, scelerisque ut, mollis sed, nonummy id, metus.Nullam accumsan lorem in dui.Cras ultricies mi eu turpis hendrerit fringilla.Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In ac dui quis mi consectetuer lacinia. Nam pretium turpis et arcu. \" +\n            \"Duis arcu tortor, suscipit eget, imperdiet nec, imperdiet iaculis, ipsum. Sed aliquam ultrices mauris.Integer ante arcu, accumsan a, consectetuer eget, posuere ut, mauris.Praesent adipiscing. Phasellus ullamcorper ipsum rutrum nunc.Nunc nonummy metus.Vestibulum volutpat pretium libero. Cras id dui.Aenean ut eros et nisl sagittis vestibulum.Nullam nulla eros, ultricies sit amet, nonummy id, imperdiet feugiat, pede.Sed lectus. Donec mollis hendrerit risus. Phasellus nec sem in justo pellentesque facilisis. \" +\n            \"Etiam imperdiet imperdiet orci. Nunc nec neque.Phasellus leo dolor, tempus non, auctor et, hendrerit quis, nisi.Curabitur ligula sapien, tincidunt non, euismod vitae, posuere imperdiet, leo.Maecenas malesuada. Praesent nan. The end of this of this long block of text.\";\n\n        // Characters: 3423  Spaces: 453  Words: 500\n        private const string m_TextBlock_04 = \"Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Aenean commodo ligula eget dolor.Aenean massa.Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem.Nulla consequat massa quis enim.Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu.In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo.Nullam dictum felis eu pede mollis pretium.Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus.\" +\n            \"Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim.Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus.Phasellus viverra nulla ut metus varius laoreet.Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue.Curabitur ullamcorper ultricies nisi. Nam eget dui.Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum.Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem.Maecenas nec odio et ante tincidunt tempus.Donec vitae sapien ut libero venenatis faucibus.Nullam quis ante.\" +\n            \"Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc, quis gravida magna mi a libero. Fusce vulputate eleifend sapien. Vestibulum purus quam, scelerisque ut, mollis sed, nonummy id, metus.Nullam accumsan lorem in dui.Cras ultricies mi eu turpis hendrerit fringilla.Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In ac dui quis mi consectetuer lacinia.Nam pretium turpis et arcu.\" +\n            \"Duis arcu tortor, suscipit eget, imperdiet nec, imperdiet iaculis, ipsum. Sed aliquam ultrices mauris.Integer ante arcu, accumsan a, consectetuer eget, posuere ut, mauris.Praesent adipiscing. Phasellus ullamcorper ipsum rutrum nunc.Nunc nonummy metus.Vestibulum volutpat pretium libero. Cras id dui.Aenean ut eros et nisl sagittis vestibulum.Nullam nulla eros, ultricies sit amet, nonummy id, imperdiet feugiat, pede.Sed lectus. Donec mollis hendrerit risus. Phasellus nec sem in justo pellentesque facilisis.Etiam imperdiet imperdiet orci. Nunc nec neque.\" +\n            \"Phasellus leo dolor, tempus non, auctor et, hendrerit quis, nisi.Curabitur ligula sapien, tincidunt non, euismod vitae, posuere imperdiet, leo.Maecenas malesuada. Praesent congue erat at massa.Sed cursus turpis vitae tortor.Donec posuere vulputate arcu. Phasellus accumsan cursus velit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed aliquam, nisi quis porttitor congue, elit erat euismod orci, ac placerat dolor lectus quis orci.Phasellus consectetuer vestibulum elit.Aenean tellus metus, bibendum sed, posuere ac, mattis non, nunc.Vestibulum fringilla pede sit amet augue.\" +\n            \"In turpis. Pellentesque posuere. Praesent turpis. Aenean posuere, tortor sed cursus feugiat, nunc augue blandit nunc, eu sollicitudin urna dolor sagittis lacus. Donec elit libero, sodales nec, volutpat a, suscipit non, turpis.Nullam sagittis. Suspendisse pulvinar, augue ac venenatis condimentum, sem libero volutpat nibh, nec pellentesque velit pede quis nunc. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Fusce id purus.Ut varius tincidunt libero.Phasellus dolor.Maecenas vestibulum mollis\";\n\n        // \n        private const string m_TextBlock_05 = \"This block of text contains <b>bold</b> and <i>italicized</i> characters.\";\n\n        private const string m_TextBlock_06 = \"<align=center><style=H1><#ffffff><u>Multiple<#80f0ff> Alignment</color> per text object</u></color></style></align><line-height=2em>\\n\" +\n            \"</line-height> The <<#ffffa0>align</color>> tag in TextMesh<#40a0ff>Pro</color> provides the ability to control the alignment of lines and paragraphs which is essential when working with text.\\n\" +\n            \"<align=left> You may want some block of text to be<#80f0ff>left aligned</color> <<#ffffa0>align=<#80f0ff>left</color></color>> which is sort of the standard.</align>\\n\" +\n            \"<style=Quote><#ffffa0>\\\"Using <#80f0ff>Center Alignment</color> <<#ffffa0>align=<#80f0ff>center</color></color>> for a title or displaying a quote is another good example of text alignment.\\\"</color></style>\\n\" +\n            \"<align=right><#80f0ff>Right Alignment</color> <<#ffffa0>align=<#80f0ff>right</color></color>> can be useful to create contrast between lines and paragraphs of text.\\n\" +\n            \"<align=justified><#80f0ff>Justified Alignment</color> <<#ffffa0>align=<#80f0ff>justified</color></color>> results in text that is flush on both the left and right margins. Used well, justified type can look clean and classy.\\n\" +\n            \"<style=Quote><align=left><#ffffa0>\\\"Text formatting and alignment has a huge impact on how people will read and perceive your text.\\\"</color>\\n\" +\n            \"<size=65%><align=right> -Stephan Bouchard</style>\";\n\n        private readonly string[] testStrings = new string[] { m_TextBlock_00, m_TextBlock_01, m_TextBlock_02, m_TextBlock_03, m_TextBlock_04, m_TextBlock_05, m_TextBlock_06 };\n\n        [OneTimeSetUp]\n        public void Setup()\n        {\n            if (Directory.Exists(Path.GetFullPath(\"Assets/TextMesh Pro\")) || Directory.Exists(Path.GetFullPath(\"Packages/com.unity.textmeshpro.tests/TextMesh Pro\")))\n            {\n                GameObject textObject = new GameObject(\"Text Object\");\n                m_TextComponent = textObject.AddComponent<TextMeshPro>();\n\n                m_TextComponent.fontSize = 18;\n            }\n            else\n            {\n                Debug.Log(\"Skipping over Editor tests as TMP Essential Resources are missing from the current test project.\");\n                Assert.Ignore();\n\n                return;\n            }\n        }\n\n        public static IEnumerable<object[]> TestCases_Parsing_TextInfo_WordWrapDisabled()\n        {\n            yield return new object[] { 0, 22, 4, 5, 1 };\n            yield return new object[] { 1, 104, 14, 15, 1 };\n            yield return new object[] { 2, 1500, 228, 241, 1 };\n            yield return new object[] { 3, 2500, 343, 370, 1 };\n            yield return new object[] { 4, 3423, 453, 500, 1 };\n        }\n\n        [Test, TestCaseSource(\"TestCases_Parsing_TextInfo_WordWrapDisabled\")]\n        public void Parsing_TextInfo_WordWrapDisabled(int sourceTextIndex, int characterCount, int spaceCount, int wordCount, int lineCount)\n        {\n            m_TextComponent.text = testStrings[sourceTextIndex];\n            m_TextComponent.enableWordWrapping = false;\n            m_TextComponent.alignment = TextAlignmentOptions.TopLeft;\n\n            // Size the RectTransform\n            m_TextComponent.rectTransform.sizeDelta = new Vector2(50, 5);\n\n            // Force text generation to populate the TextInfo data structure.\n            m_TextComponent.ForceMeshUpdate();\n\n            Assert.AreEqual(m_TextComponent.textInfo.characterCount, characterCount);\n            Assert.AreEqual(m_TextComponent.textInfo.spaceCount, spaceCount);\n            Assert.AreEqual(m_TextComponent.textInfo.wordCount, wordCount);\n            Assert.AreEqual(m_TextComponent.textInfo.lineCount, lineCount);\n        }\n\n\n        public static IEnumerable<object[]> TestCases_Parsing_TextInfo_WordWrapEnabled()\n        {\n            yield return new object[] { 0, 22, 4, 5, 1 };\n            yield return new object[] { 1, 104, 14, 15, 1 };\n            yield return new object[] { 2, 1500, 228, 241, 13 };\n            yield return new object[] { 3, 2500, 343, 370, 21 };\n            yield return new object[] { 4, 3423, 453, 500, 29 };\n        }\n\n        [Test, TestCaseSource(\"TestCases_Parsing_TextInfo_WordWrapEnabled\")]\n        public void Parsing_TextInfo_WordWrapEnabled(int sourceTextIndex, int characterCount, int spaceCount, int wordCount, int lineCount)\n        {\n            m_TextComponent.text = testStrings[sourceTextIndex];\n            m_TextComponent.enableWordWrapping = true;\n            m_TextComponent.alignment = TextAlignmentOptions.TopLeft;\n\n            // Size the RectTransform\n            m_TextComponent.rectTransform.sizeDelta = new Vector2(100, 50);\n\n            // Force text generation to populate the TextInfo data structure.\n            m_TextComponent.ForceMeshUpdate();\n\n            Assert.AreEqual(m_TextComponent.textInfo.characterCount, characterCount);\n            Assert.AreEqual(m_TextComponent.textInfo.spaceCount, spaceCount);\n            Assert.AreEqual(m_TextComponent.textInfo.wordCount, wordCount);\n            Assert.AreEqual(m_TextComponent.textInfo.lineCount, lineCount);\n        }\n\n\n        public static IEnumerable<object[]> TestCases_Parsing_TextInfo_AlignmentTopJustified()\n        {\n            yield return new object[] { 2, 1500, 228, 241, 13 };\n            yield return new object[] { 3, 2500, 343, 370, 20 };\n            yield return new object[] { 4, 3423, 453, 500, 27 };\n        }\n\n        [Test, TestCaseSource(\"TestCases_Parsing_TextInfo_AlignmentTopJustified\")]\n        public void Parsing_TextInfo_AlignmentTopJustified(int sourceTextIndex, int characterCount, int spaceCount, int wordCount, int lineCount)\n        {\n            m_TextComponent.text = testStrings[sourceTextIndex];\n            m_TextComponent.enableWordWrapping = true;\n            m_TextComponent.alignment = TextAlignmentOptions.TopJustified;\n\n            // Size the RectTransform\n            m_TextComponent.rectTransform.sizeDelta = new Vector2(100, 50);\n\n            // Force text generation to populate the TextInfo data structure.\n            m_TextComponent.ForceMeshUpdate();\n\n            Assert.AreEqual(m_TextComponent.textInfo.characterCount, characterCount);\n            Assert.AreEqual(m_TextComponent.textInfo.spaceCount, spaceCount);\n            Assert.AreEqual(m_TextComponent.textInfo.wordCount, wordCount);\n            Assert.AreEqual(m_TextComponent.textInfo.lineCount, lineCount);\n        }\n\n\n        public static IEnumerable<object[]> TestCases_Parsing_TextInfo_RichText()\n        {\n            yield return new object[] { 5, 59, 8, 9, 1 };\n            yield return new object[] { 6, 768, 124, 126, 14 };\n        }\n\n        [Test, TestCaseSource(\"TestCases_Parsing_TextInfo_RichText\")]\n        public void Parsing_TextInfo_RichText(int sourceTextIndex, int characterCount, int spaceCount, int wordCount, int lineCount)\n        {\n            m_TextComponent.text = testStrings[sourceTextIndex];\n            m_TextComponent.enableWordWrapping = true;\n            m_TextComponent.alignment = TextAlignmentOptions.TopLeft;\n\n            // Size the RectTransform\n            m_TextComponent.rectTransform.sizeDelta = new Vector2(70, 35);\n\n            // Force text generation to populate the TextInfo data structure.\n            m_TextComponent.ForceMeshUpdate();\n\n            Assert.AreEqual(m_TextComponent.textInfo.characterCount, characterCount);\n            Assert.AreEqual(m_TextComponent.textInfo.spaceCount, spaceCount);\n            Assert.AreEqual(m_TextComponent.textInfo.wordCount, wordCount);\n            Assert.AreEqual(m_TextComponent.textInfo.lineCount, lineCount);\n        }\n\n\n        //[OneTimeTearDown]\n        //public void Cleanup()\n        //{\n        //    // Remove TMP Essential Resources if they were imported in the project as a result of running tests.\n        //    if (TMPro_EventManager.temporaryResourcesImported == true)\n        //    {\n        //        string testResourceFolderPath = Path.GetFullPath(\"Assets/TextMesh Pro\");\n\n        //        if (Directory.Exists(testResourceFolderPath))\n        //        {\n        //            Directory.Delete(testResourceFolderPath);\n        //            File.Delete(Path.GetFullPath(\"Assets/TextMesh Pro.meta\"));\n        //        }\n\n        //        TMPro_EventManager.temporaryResourcesImported = false;\n        //    }\n        //}\n\n    }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Tests/Runtime/TMP_RuntimeTests.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 9de24983a2c6cbe4f925c3e98a79b804\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Tests/Runtime/Unity.TextMeshPro.Tests.asmdef",
    "content": "{\n    \"name\": \"Unity.TextMeshPro.Tests\",\n    \"references\": [\n        \"Unity.TextMeshPro\",\n\t\t\"Unity.ugui\"\n    ],\n    \"optionalUnityReferences\": [\n        \"TestAssemblies\"\n    ],\n    \"includePlatforms\": [],\n    \"excludePlatforms\": []\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Tests/Runtime/Unity.TextMeshPro.Tests.asmdef.meta",
    "content": "fileFormatVersion: 2\nguid: bb05cab7d802aa5468f8f2f86840d984\nAssemblyDefinitionImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Tests/Runtime.meta",
    "content": "fileFormatVersion: 2\nguid: f5600e6ae5a1464da659eca36bef9d64\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/Tests.meta",
    "content": "fileFormatVersion: 2\nguid: 2ce4bbcc4722440890a03312706037fe\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/package.json",
    "content": "{\n  \"name\": \"com.unity.textmeshpro\",\n  \"displayName\": \"TextMesh Pro\",\n  \"version\": \"2.0.1\",\n  \"unity\": \"2019.1\",\n  \"description\": \"TextMesh Pro is the ultimate text solution for Unity. It's the perfect replacement for Unity's UI Text and the legacy Text Mesh.\\n\\nPowerful and easy to use, TextMesh Pro uses Advanced Text Rendering techniques along with a set of custom shaders; delivering substantial visual quality improvements while giving users incredible flexibility when it comes to text styling and texturing.\\n\\nTextMesh Pro provides Improved Control over text formatting and layout with features like character, word, line and paragraph spacing, kerning, justified text, Links, over 30 Rich Text Tags available, support for Multi Font & Sprites, Custom Styles and more.\\n\\nGreat performance. Since the geometry created by TextMesh Pro uses two triangles per character just like Unity's text components, this improved visual quality and flexibility comes at no additional performance cost.\\n\\n\\nSpecial Notes:\\n==========\\nThis release requires .Net 4.x Scripting Runtime\",\n  \"keywords\": [\n    \"TextMeshPro\",\n    \"TextMesh Pro\",\n    \"Text\",\n    \"SDF\"\n  ],\n  \"category\": \"Text Rendering\",\n  \"dependencies\": { \"com.unity.ugui\": \"1.0.0\" },\n  \"relatedPackages\": { \"com.unity.textmeshpro.tests\": \"1.0.1\" },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://gitlab.cds.internal.unity3d.com/upm-packages/text/com.unity.textmeshpro.git\",\n    \"revision\": \"dcedac21\"\n  }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/PackageCache/com.unity.textmeshpro@2.0.1/package.json.meta",
    "content": "fileFormatVersion: 2\nguid: 220e9325710f4235a43492dd1ee4980d\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/ProjectSettings.asset",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!129 &1\nPlayerSettings:\n  m_ObjectHideFlags: 0\n  serializedVersion: 18\n  productGUID: 580dda51bd9d0bb48adc8fd3c9d1d4b6\n  AndroidProfiler: 0\n  AndroidFilterTouchesWhenObscured: 0\n  AndroidEnableSustainedPerformanceMode: 0\n  defaultScreenOrientation: 4\n  targetDevice: 2\n  useOnDemandResources: 0\n  accelerometerFrequency: 60\n  companyName: DefaultCompany\n  productName: scattererShaders\n  defaultCursor: {fileID: 0}\n  cursorHotspot: {x: 0, y: 0}\n  m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1}\n  m_ShowUnitySplashScreen: 1\n  m_ShowUnitySplashLogo: 1\n  m_SplashScreenOverlayOpacity: 1\n  m_SplashScreenAnimation: 1\n  m_SplashScreenLogoStyle: 1\n  m_SplashScreenDrawMode: 0\n  m_SplashScreenBackgroundAnimationZoom: 1\n  m_SplashScreenLogoAnimationZoom: 1\n  m_SplashScreenBackgroundLandscapeAspect: 1\n  m_SplashScreenBackgroundPortraitAspect: 1\n  m_SplashScreenBackgroundLandscapeUvs:\n    serializedVersion: 2\n    x: 0\n    y: 0\n    width: 1\n    height: 1\n  m_SplashScreenBackgroundPortraitUvs:\n    serializedVersion: 2\n    x: 0\n    y: 0\n    width: 1\n    height: 1\n  m_SplashScreenLogos: []\n  m_VirtualRealitySplashScreen: {fileID: 0}\n  m_HolographicTrackingLossScreen: {fileID: 0}\n  defaultScreenWidth: 1024\n  defaultScreenHeight: 768\n  defaultScreenWidthWeb: 960\n  defaultScreenHeightWeb: 600\n  m_StereoRenderingPath: 0\n  m_ActiveColorSpace: 0\n  m_MTRendering: 1\n  m_StackTraceTypes: 010000000100000001000000010000000100000001000000\n  iosShowActivityIndicatorOnLoading: -1\n  androidShowActivityIndicatorOnLoading: -1\n  displayResolutionDialog: 0\n  iosUseCustomAppBackgroundBehavior: 0\n  iosAllowHTTPDownload: 1\n  allowedAutorotateToPortrait: 1\n  allowedAutorotateToPortraitUpsideDown: 1\n  allowedAutorotateToLandscapeRight: 1\n  allowedAutorotateToLandscapeLeft: 1\n  useOSAutorotation: 1\n  use32BitDisplayBuffer: 1\n  preserveFramebufferAlpha: 0\n  disableDepthAndStencilBuffers: 0\n  androidStartInFullscreen: 1\n  androidRenderOutsideSafeArea: 1\n  androidUseSwappy: 0\n  androidBlitType: 0\n  defaultIsNativeResolution: 1\n  macRetinaSupport: 1\n  runInBackground: 0\n  captureSingleScreen: 0\n  muteOtherAudioSources: 0\n  Prepare IOS For Recording: 0\n  Force IOS Speakers When Recording: 0\n  deferSystemGesturesMode: 0\n  hideHomeButton: 0\n  submitAnalytics: 1\n  usePlayerLog: 1\n  bakeCollisionMeshes: 0\n  forceSingleInstance: 0\n  useFlipModelSwapchain: 1\n  resizableWindow: 0\n  useMacAppStoreValidation: 0\n  macAppStoreCategory: public.app-category.games\n  gpuSkinning: 0\n  graphicsJobs: 0\n  xboxPIXTextureCapture: 0\n  xboxEnableAvatar: 0\n  xboxEnableKinect: 0\n  xboxEnableKinectAutoTracking: 0\n  xboxEnableFitness: 0\n  visibleInBackground: 1\n  allowFullscreenSwitch: 1\n  graphicsJobMode: 0\n  fullscreenMode: 1\n  xboxSpeechDB: 0\n  xboxEnableHeadOrientation: 0\n  xboxEnableGuest: 0\n  xboxEnablePIXSampling: 0\n  metalFramebufferOnly: 0\n  xboxOneResolution: 0\n  xboxOneSResolution: 0\n  xboxOneXResolution: 3\n  xboxOneMonoLoggingLevel: 0\n  xboxOneLoggingLevel: 1\n  xboxOneDisableEsram: 0\n  xboxOnePresentImmediateThreshold: 0\n  switchQueueCommandMemory: 1048576\n  switchQueueControlMemory: 16384\n  switchQueueComputeMemory: 262144\n  switchNVNShaderPoolsGranularity: 33554432\n  switchNVNDefaultPoolsGranularity: 16777216\n  switchNVNOtherPoolsGranularity: 16777216\n  vulkanEnableSetSRGBWrite: 0\n  m_SupportedAspectRatios:\n    4:3: 1\n    5:4: 1\n    16:10: 1\n    16:9: 1\n    Others: 1\n  bundleVersion: 1.0\n  preloadedAssets: []\n  metroInputSource: 0\n  wsaTransparentSwapchain: 0\n  m_HolographicPauseOnTrackingLoss: 1\n  xboxOneDisableKinectGpuReservation: 1\n  xboxOneEnable7thCore: 1\n  vrSettings:\n    cardboard:\n      depthFormat: 0\n      enableTransitionView: 0\n    daydream:\n      depthFormat: 0\n      useSustainedPerformanceMode: 0\n      enableVideoLayer: 0\n      useProtectedVideoMemory: 0\n      minimumSupportedHeadTracking: 0\n      maximumSupportedHeadTracking: 1\n    hololens:\n      depthFormat: 1\n      depthBufferSharingEnabled: 1\n    lumin:\n      depthFormat: 0\n      frameTiming: 2\n      enableGLCache: 0\n      glCacheMaxBlobSize: 524288\n      glCacheMaxFileSize: 8388608\n    oculus:\n      sharedDepthBuffer: 1\n      dashSupport: 1\n      lowOverheadMode: 0\n      protectedContext: 0\n      v2Signing: 0\n    enable360StereoCapture: 0\n  isWsaHolographicRemotingEnabled: 0\n  protectGraphicsMemory: 0\n  enableFrameTimingStats: 0\n  useHDRDisplay: 0\n  m_ColorGamuts: 00000000\n  targetPixelDensity: 30\n  resolutionScalingMode: 0\n  androidSupportedAspectRatio: 1\n  androidMaxAspectRatio: 2.1\n  applicationIdentifier: {}\n  buildNumber: {}\n  AndroidBundleVersionCode: 1\n  AndroidMinSdkVersion: 16\n  AndroidTargetSdkVersion: 0\n  AndroidPreferredInstallLocation: 1\n  aotOptions: \n  stripEngineCode: 1\n  iPhoneStrippingLevel: 0\n  iPhoneScriptCallOptimization: 0\n  ForceInternetPermission: 0\n  ForceSDCardPermission: 0\n  CreateWallpaper: 0\n  APKExpansionFiles: 0\n  keepLoadedShadersAlive: 0\n  StripUnusedMeshComponents: 0\n  VertexChannelCompressionMask: 4054\n  iPhoneSdkVersion: 988\n  iOSTargetOSVersionString: 9.0\n  tvOSSdkVersion: 0\n  tvOSRequireExtendedGameController: 0\n  tvOSTargetOSVersionString: 9.0\n  uIPrerenderedIcon: 0\n  uIRequiresPersistentWiFi: 0\n  uIRequiresFullScreen: 1\n  uIStatusBarHidden: 1\n  uIExitOnSuspend: 0\n  uIStatusBarStyle: 0\n  iPhoneSplashScreen: {fileID: 0}\n  iPhoneHighResSplashScreen: {fileID: 0}\n  iPhoneTallHighResSplashScreen: {fileID: 0}\n  iPhone47inSplashScreen: {fileID: 0}\n  iPhone55inPortraitSplashScreen: {fileID: 0}\n  iPhone55inLandscapeSplashScreen: {fileID: 0}\n  iPhone58inPortraitSplashScreen: {fileID: 0}\n  iPhone58inLandscapeSplashScreen: {fileID: 0}\n  iPadPortraitSplashScreen: {fileID: 0}\n  iPadHighResPortraitSplashScreen: {fileID: 0}\n  iPadLandscapeSplashScreen: {fileID: 0}\n  iPadHighResLandscapeSplashScreen: {fileID: 0}\n  iPhone65inPortraitSplashScreen: {fileID: 0}\n  iPhone65inLandscapeSplashScreen: {fileID: 0}\n  iPhone61inPortraitSplashScreen: {fileID: 0}\n  iPhone61inLandscapeSplashScreen: {fileID: 0}\n  appleTVSplashScreen: {fileID: 0}\n  appleTVSplashScreen2x: {fileID: 0}\n  tvOSSmallIconLayers: []\n  tvOSSmallIconLayers2x: []\n  tvOSLargeIconLayers: []\n  tvOSLargeIconLayers2x: []\n  tvOSTopShelfImageLayers: []\n  tvOSTopShelfImageLayers2x: []\n  tvOSTopShelfImageWideLayers: []\n  tvOSTopShelfImageWideLayers2x: []\n  iOSLaunchScreenType: 0\n  iOSLaunchScreenPortrait: {fileID: 0}\n  iOSLaunchScreenLandscape: {fileID: 0}\n  iOSLaunchScreenBackgroundColor:\n    serializedVersion: 2\n    rgba: 0\n  iOSLaunchScreenFillPct: 100\n  iOSLaunchScreenSize: 100\n  iOSLaunchScreenCustomXibPath: \n  iOSLaunchScreeniPadType: 0\n  iOSLaunchScreeniPadImage: {fileID: 0}\n  iOSLaunchScreeniPadBackgroundColor:\n    serializedVersion: 2\n    rgba: 0\n  iOSLaunchScreeniPadFillPct: 100\n  iOSLaunchScreeniPadSize: 100\n  iOSLaunchScreeniPadCustomXibPath: \n  iOSUseLaunchScreenStoryboard: 0\n  iOSLaunchScreenCustomStoryboardPath: \n  iOSDeviceRequirements: []\n  iOSURLSchemes: []\n  iOSBackgroundModes: 0\n  iOSMetalForceHardShadows: 0\n  metalEditorSupport: 1\n  metalAPIValidation: 1\n  iOSRenderExtraFrameOnPause: 0\n  appleDeveloperTeamID: \n  iOSManualSigningProvisioningProfileID: \n  tvOSManualSigningProvisioningProfileID: \n  iOSManualSigningProvisioningProfileType: 0\n  tvOSManualSigningProvisioningProfileType: 0\n  appleEnableAutomaticSigning: 0\n  iOSRequireARKit: 0\n  iOSAutomaticallyDetectAndAddCapabilities: 1\n  appleEnableProMotion: 0\n  clonedFromGUID: 00000000000000000000000000000000\n  templatePackageId: \n  templateDefaultScene: \n  AndroidTargetArchitectures: 1\n  AndroidSplashScreenScale: 0\n  androidSplashScreen: {fileID: 0}\n  AndroidKeystoreName: \n  AndroidKeyaliasName: \n  AndroidBuildApkPerCpuArchitecture: 0\n  AndroidTVCompatibility: 0\n  AndroidIsGame: 1\n  AndroidEnableTango: 0\n  androidEnableBanner: 1\n  androidUseLowAccuracyLocation: 0\n  androidUseCustomKeystore: 0\n  m_AndroidBanners:\n  - width: 320\n    height: 180\n    banner: {fileID: 0}\n  androidGamepadSupportLevel: 0\n  AndroidValidateAppBundleSize: 1\n  AndroidAppBundleSizeToValidate: 150\n  resolutionDialogBanner: {fileID: 0}\n  m_BuildTargetIcons: []\n  m_BuildTargetPlatformIcons: []\n  m_BuildTargetBatching: []\n  m_BuildTargetGraphicsAPIs:\n  - m_BuildTarget: WindowsStandaloneSupport\n    m_APIs: 02000000\n    m_Automatic: 0\n  - m_BuildTarget: MacStandaloneSupport\n    m_APIs: 11000000\n    m_Automatic: 0\n  - m_BuildTarget: LinuxStandaloneSupport\n    m_APIs: 11000000\n    m_Automatic: 0\n  m_BuildTargetVRSettings: []\n  openGLRequireES31: 0\n  openGLRequireES31AEP: 0\n  openGLRequireES32: 0\n  vuforiaEnabled: 0\n  m_TemplateCustomTags: {}\n  mobileMTRendering:\n    Android: 1\n    iPhone: 1\n    tvOS: 1\n  m_BuildTargetGroupLightmapEncodingQuality: []\n  m_BuildTargetGroupLightmapSettings: []\n  playModeTestRunnerEnabled: 0\n  runPlayModeTestAsEditModeTest: 0\n  actionOnDotNetUnhandledException: 1\n  enableInternalProfiler: 0\n  logObjCUncaughtExceptions: 1\n  enableCrashReportAPI: 0\n  cameraUsageDescription: \n  locationUsageDescription: \n  microphoneUsageDescription: \n  switchNetLibKey: \n  switchSocketMemoryPoolSize: 6144\n  switchSocketAllocatorPoolSize: 128\n  switchSocketConcurrencyLimit: 14\n  switchScreenResolutionBehavior: 2\n  switchUseCPUProfiler: 0\n  switchApplicationID: 0x01004b9000490000\n  switchNSODependencies: \n  switchTitleNames_0: \n  switchTitleNames_1: \n  switchTitleNames_2: \n  switchTitleNames_3: \n  switchTitleNames_4: \n  switchTitleNames_5: \n  switchTitleNames_6: \n  switchTitleNames_7: \n  switchTitleNames_8: \n  switchTitleNames_9: \n  switchTitleNames_10: \n  switchTitleNames_11: \n  switchTitleNames_12: \n  switchTitleNames_13: \n  switchTitleNames_14: \n  switchPublisherNames_0: \n  switchPublisherNames_1: \n  switchPublisherNames_2: \n  switchPublisherNames_3: \n  switchPublisherNames_4: \n  switchPublisherNames_5: \n  switchPublisherNames_6: \n  switchPublisherNames_7: \n  switchPublisherNames_8: \n  switchPublisherNames_9: \n  switchPublisherNames_10: \n  switchPublisherNames_11: \n  switchPublisherNames_12: \n  switchPublisherNames_13: \n  switchPublisherNames_14: \n  switchIcons_0: {fileID: 0}\n  switchIcons_1: {fileID: 0}\n  switchIcons_2: {fileID: 0}\n  switchIcons_3: {fileID: 0}\n  switchIcons_4: {fileID: 0}\n  switchIcons_5: {fileID: 0}\n  switchIcons_6: {fileID: 0}\n  switchIcons_7: {fileID: 0}\n  switchIcons_8: {fileID: 0}\n  switchIcons_9: {fileID: 0}\n  switchIcons_10: {fileID: 0}\n  switchIcons_11: {fileID: 0}\n  switchIcons_12: {fileID: 0}\n  switchIcons_13: {fileID: 0}\n  switchIcons_14: {fileID: 0}\n  switchSmallIcons_0: {fileID: 0}\n  switchSmallIcons_1: {fileID: 0}\n  switchSmallIcons_2: {fileID: 0}\n  switchSmallIcons_3: {fileID: 0}\n  switchSmallIcons_4: {fileID: 0}\n  switchSmallIcons_5: {fileID: 0}\n  switchSmallIcons_6: {fileID: 0}\n  switchSmallIcons_7: {fileID: 0}\n  switchSmallIcons_8: {fileID: 0}\n  switchSmallIcons_9: {fileID: 0}\n  switchSmallIcons_10: {fileID: 0}\n  switchSmallIcons_11: {fileID: 0}\n  switchSmallIcons_12: {fileID: 0}\n  switchSmallIcons_13: {fileID: 0}\n  switchSmallIcons_14: {fileID: 0}\n  switchManualHTML: \n  switchAccessibleURLs: \n  switchLegalInformation: \n  switchMainThreadStackSize: 1048576\n  switchPresenceGroupId: \n  switchLogoHandling: 0\n  switchReleaseVersion: 0\n  switchDisplayVersion: 1.0.0\n  switchStartupUserAccount: 0\n  switchTouchScreenUsage: 0\n  switchSupportedLanguagesMask: 0\n  switchLogoType: 0\n  switchApplicationErrorCodeCategory: \n  switchUserAccountSaveDataSize: 0\n  switchUserAccountSaveDataJournalSize: 0\n  switchApplicationAttribute: 0\n  switchCardSpecSize: -1\n  switchCardSpecClock: -1\n  switchRatingsMask: 0\n  switchRatingsInt_0: 0\n  switchRatingsInt_1: 0\n  switchRatingsInt_2: 0\n  switchRatingsInt_3: 0\n  switchRatingsInt_4: 0\n  switchRatingsInt_5: 0\n  switchRatingsInt_6: 0\n  switchRatingsInt_7: 0\n  switchRatingsInt_8: 0\n  switchRatingsInt_9: 0\n  switchRatingsInt_10: 0\n  switchRatingsInt_11: 0\n  switchRatingsInt_12: 0\n  switchLocalCommunicationIds_0: \n  switchLocalCommunicationIds_1: \n  switchLocalCommunicationIds_2: \n  switchLocalCommunicationIds_3: \n  switchLocalCommunicationIds_4: \n  switchLocalCommunicationIds_5: \n  switchLocalCommunicationIds_6: \n  switchLocalCommunicationIds_7: \n  switchParentalControl: 0\n  switchAllowsScreenshot: 1\n  switchAllowsVideoCapturing: 1\n  switchAllowsRuntimeAddOnContentInstall: 0\n  switchDataLossConfirmation: 0\n  switchUserAccountLockEnabled: 0\n  switchSystemResourceMemory: 16777216\n  switchSupportedNpadStyles: 22\n  switchNativeFsCacheSize: 32\n  switchIsHoldTypeHorizontal: 0\n  switchSupportedNpadCount: 8\n  switchSocketConfigEnabled: 0\n  switchTcpInitialSendBufferSize: 32\n  switchTcpInitialReceiveBufferSize: 64\n  switchTcpAutoSendBufferSizeMax: 256\n  switchTcpAutoReceiveBufferSizeMax: 256\n  switchUdpSendBufferSize: 9\n  switchUdpReceiveBufferSize: 42\n  switchSocketBufferEfficiency: 4\n  switchSocketInitializeEnabled: 1\n  switchNetworkInterfaceManagerInitializeEnabled: 1\n  switchPlayerConnectionEnabled: 1\n  ps4NPAgeRating: 12\n  ps4NPTitleSecret: \n  ps4NPTrophyPackPath: \n  ps4ParentalLevel: 11\n  ps4ContentID: ED1633-NPXX51362_00-0000000000000000\n  ps4Category: 0\n  ps4MasterVersion: 01.00\n  ps4AppVersion: 01.00\n  ps4AppType: 0\n  ps4ParamSfxPath: \n  ps4VideoOutPixelFormat: 0\n  ps4VideoOutInitialWidth: 1920\n  ps4VideoOutBaseModeInitialWidth: 1920\n  ps4VideoOutReprojectionRate: 60\n  ps4PronunciationXMLPath: \n  ps4PronunciationSIGPath: \n  ps4BackgroundImagePath: \n  ps4StartupImagePath: \n  ps4StartupImagesFolder: \n  ps4IconImagesFolder: \n  ps4SaveDataImagePath: \n  ps4SdkOverride: \n  ps4BGMPath: \n  ps4ShareFilePath: \n  ps4ShareOverlayImagePath: \n  ps4PrivacyGuardImagePath: \n  ps4NPtitleDatPath: \n  ps4RemotePlayKeyAssignment: -1\n  ps4RemotePlayKeyMappingDir: \n  ps4PlayTogetherPlayerCount: 0\n  ps4EnterButtonAssignment: 2\n  ps4ApplicationParam1: 0\n  ps4ApplicationParam2: 0\n  ps4ApplicationParam3: 0\n  ps4ApplicationParam4: 0\n  ps4DownloadDataSize: 0\n  ps4GarlicHeapSize: 2048\n  ps4ProGarlicHeapSize: 2560\n  playerPrefsMaxSize: 32768\n  ps4Passcode: frAQBc8Wsa1xVPfvJcrgRYwTiizs2trQ\n  ps4pnSessions: 1\n  ps4pnPresence: 1\n  ps4pnFriends: 1\n  ps4pnGameCustomData: 1\n  playerPrefsSupport: 0\n  enableApplicationExit: 0\n  resetTempFolder: 1\n  restrictedAudioUsageRights: 0\n  ps4UseResolutionFallback: 0\n  ps4ReprojectionSupport: 0\n  ps4UseAudio3dBackend: 0\n  ps4SocialScreenEnabled: 0\n  ps4ScriptOptimizationLevel: 2\n  ps4Audio3dVirtualSpeakerCount: 14\n  ps4attribCpuUsage: 0\n  ps4PatchPkgPath: \n  ps4PatchLatestPkgPath: \n  ps4PatchChangeinfoPath: \n  ps4PatchDayOne: 0\n  ps4attribUserManagement: 0\n  ps4attribMoveSupport: 0\n  ps4attrib3DSupport: 0\n  ps4attribShareSupport: 0\n  ps4attribExclusiveVR: 0\n  ps4disableAutoHideSplash: 0\n  ps4videoRecordingFeaturesUsed: 0\n  ps4contentSearchFeaturesUsed: 0\n  ps4attribEyeToEyeDistanceSettingVR: 0\n  ps4IncludedModules: []\n  monoEnv: \n  splashScreenBackgroundSourceLandscape: {fileID: 0}\n  splashScreenBackgroundSourcePortrait: {fileID: 0}\n  blurSplashScreenBackground: 1\n  spritePackerPolicy: \n  webGLMemorySize: 32\n  webGLExceptionSupport: 1\n  webGLNameFilesAsHashes: 0\n  webGLDataCaching: 1\n  webGLDebugSymbols: 0\n  webGLEmscriptenArgs: \n  webGLModulesDirectory: \n  webGLTemplate: APPLICATION:Default\n  webGLAnalyzeBuildSize: 0\n  webGLUseEmbeddedResources: 0\n  webGLCompressionFormat: 0\n  webGLLinkerTarget: 1\n  webGLThreadsSupport: 0\n  webGLWasmStreaming: 0\n  scriptingDefineSymbols: {}\n  platformArchitecture: {}\n  scriptingBackend: {}\n  il2cppCompilerConfiguration: {}\n  managedStrippingLevel: {}\n  incrementalIl2cppBuild: {}\n  allowUnsafeCode: 0\n  additionalIl2CppArgs: \n  scriptingRuntimeVersion: 1\n  gcIncremental: 0\n  gcWBarrierValidation: 0\n  apiCompatibilityLevelPerPlatform: {}\n  m_RenderingPath: 1\n  m_MobileRenderingPath: 1\n  metroPackageName: scattererShaders\n  metroPackageVersion: \n  metroCertificatePath: \n  metroCertificatePassword: \n  metroCertificateSubject: \n  metroCertificateIssuer: \n  metroCertificateNotAfter: 0000000000000000\n  metroApplicationDescription: scattererShaders\n  wsaImages: {}\n  metroTileShortName: \n  metroTileShowName: 0\n  metroMediumTileShowName: 0\n  metroLargeTileShowName: 0\n  metroWideTileShowName: 0\n  metroSupportStreamingInstall: 0\n  metroLastRequiredScene: 0\n  metroDefaultTileSize: 1\n  metroTileForegroundText: 2\n  metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0}\n  metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628,\n    a: 1}\n  metroSplashScreenUseBackgroundColor: 0\n  platformCapabilities: {}\n  metroTargetDeviceFamilies: {}\n  metroFTAName: \n  metroFTAFileTypes: []\n  metroProtocolName: \n  XboxOneProductId: \n  XboxOneUpdateKey: \n  XboxOneSandboxId: \n  XboxOneContentId: \n  XboxOneTitleId: \n  XboxOneSCId: \n  XboxOneGameOsOverridePath: \n  XboxOnePackagingOverridePath: \n  XboxOneAppManifestOverridePath: \n  XboxOneVersion: 1.0.0.0\n  XboxOnePackageEncryption: 0\n  XboxOnePackageUpdateGranularity: 2\n  XboxOneDescription: \n  XboxOneLanguage:\n  - enus\n  XboxOneCapability: []\n  XboxOneGameRating: {}\n  XboxOneIsContentPackage: 0\n  XboxOneEnableGPUVariability: 1\n  XboxOneSockets: {}\n  XboxOneSplashScreen: {fileID: 0}\n  XboxOneAllowedProductIds: []\n  XboxOnePersistentLocalStorageSize: 0\n  XboxOneXTitleMemory: 8\n  xboxOneScriptCompiler: 1\n  XboxOneOverrideIdentityName: \n  vrEditorSettings:\n    daydream:\n      daydreamIconForeground: {fileID: 0}\n      daydreamIconBackground: {fileID: 0}\n  cloudServicesEnabled: {}\n  luminIcon:\n    m_Name: \n    m_ModelFolderPath: \n    m_PortalFolderPath: \n  luminCert:\n    m_CertPath: \n    m_SignPackage: 1\n  luminIsChannelApp: 0\n  luminVersion:\n    m_VersionCode: 1\n    m_VersionName: \n  facebookSdkVersion: \n  facebookAppId: \n  facebookCookies: 1\n  facebookLogging: 1\n  facebookStatus: 1\n  facebookXfbml: 0\n  facebookFrictionlessRequests: 1\n  apiCompatibilityLevel: 6\n  cloudProjectId: \n  framebufferDepthMemorylessMode: 0\n  projectName: \n  organizationId: \n  cloudEnabled: 0\n  enableNativePlatformBackendsForNewInputSystem: 0\n  disableOldInputManagerSupport: 0\n  legacyClampBlendShapeWeights: 0\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/ScriptAssemblies/BuiltinAssemblies.stamp",
    "content": "08d7a90c9c1c0c00.08d7a9176c263600"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/StateCache/Hierarchy/d2da7c-mainStage.json",
    "content": "﻿{\"m_ExpandedPrefabGameObjectFileIDs\":[],\"m_ExpandedSceneGameObjectInstanceIDs\":[],\"m_ScrollY\":0.0,\"m_LastClickedFileID\":0,\"m_LastClickedInstanceID\":0}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/StateCache/LayerSettings/LayerSettings.json",
    "content": "﻿{\"visibleLayersValue\":-1,\"lockedLayersValue\":0}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/StateCache/SceneView/e16c04-mainStage.json",
    "content": "﻿{\"cameraMode\":{\"drawMode\":0,\"name\":\"Shaded\",\"section\":\"Shading Mode\"},\"sceneLighting\":true,\"audioPlay\":false,\"sceneViewState\":{\"showFog\":true,\"showMaterialUpdate\":false,\"showSkybox\":true,\"showFlares\":true,\"showImageEffects\":true,\"showParticleSystems\":true},\"in2DMode\":false,\"pivot\":{\"x\":2.5099687576293947,\"y\":2.2473466396331789,\"z\":-3.8579397201538088},\"rotation\":{\"x\":-0.09469340741634369,\"y\":0.6731113195419312,\"z\":-0.08752819150686264,\"w\":-0.7282131314277649},\"size\":15.153814315795899,\"orthographic\":false}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/shadercompiler-UnityShaderCompiler.exe0.log",
    "content": "Base path: 'C:/Program Files/Unity2019.2/Editor/Data', plugins path 'C:/Program Files/Unity2019.2/Editor/Data/PlaybackEngines'\nCmd: initializeCompiler\nCmd: preprocessCompute\n  insize=2283 outsize=2282 ok=1\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/shadercompiler-UnityShaderCompiler.exe1.log",
    "content": "Base path: 'C:/Program Files/Unity2019.2/Editor/Data', plugins path 'C:/Program Files/Unity2019.2/Editor/Data/PlaybackEngines'\nCmd: initializeCompiler\nCmd: compileComputeKernel\n  api=4 insize=2359 outsize=2352 ok=1\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/shadercompiler-UnityShaderCompiler.exe2.log",
    "content": "Base path: 'C:/Program Files/Unity2019.2/Editor/Data', plugins path 'C:/Program Files/Unity2019.2/Editor/Data/PlaybackEngines'\nCmd: initializeCompiler\nCmd: compileSnippet\n  api=15 type=0 insize=2318 outsize=53566 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=1 insize=2318 outsize=0 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=0 insize=2736 outsize=19414 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=1 insize=2736 outsize=0 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=0 insize=1135 outsize=2856 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=1 insize=5188 outsize=0 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=1 insize=2320 outsize=0 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=1 insize=1349 outsize=0 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/shadercompiler-UnityShaderCompiler.exe3.log",
    "content": "Base path: 'C:/Program Files/Unity2019.2/Editor/Data', plugins path 'C:/Program Files/Unity2019.2/Editor/Data/PlaybackEngines'\nCmd: initializeCompiler\nCmd: compileSnippet\n  api=15 type=1 insize=1120 outsize=0 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=0 insize=1613 outsize=8764 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=1 insize=1613 outsize=0 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=0 insize=2320 outsize=52716 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=1 insize=2348 outsize=0 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=0 insize=2320 outsize=52716 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=0 insize=1135 outsize=2856 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=1 insize=2336 outsize=0 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=0 insize=1615 outsize=7914 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/shadercompiler-UnityShaderCompiler.exe4.log",
    "content": "Base path: 'C:/Program Files/Unity2019.2/Editor/Data', plugins path 'C:/Program Files/Unity2019.2/Editor/Data/PlaybackEngines'\nCmd: initializeCompiler\nCmd: compileSnippet\n  api=15 type=0 insize=1135 outsize=2856 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=0 insize=1689 outsize=5952 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=1 insize=1689 outsize=0 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=1 insize=1347 outsize=0 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=0 insize=1349 outsize=3071 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=1 insize=2336 outsize=0 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=0 insize=2348 outsize=52119 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=0 insize=1615 outsize=7914 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=1 insize=1615 outsize=0 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=0 insize=5188 outsize=44661 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=1 insize=5188 outsize=0 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/shadercompiler-UnityShaderCompiler.exe5.log",
    "content": "Base path: 'C:/Program Files/Unity2019.2/Editor/Data', plugins path 'C:/Program Files/Unity2019.2/Editor/Data/PlaybackEngines'\nCmd: initializeCompiler\nCmd: compileSnippet\n  api=15 type=1 insize=2320 outsize=0 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=0 insize=2736 outsize=19414 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=1 insize=1689 outsize=0 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=0 insize=1120 outsize=6648 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=1 insize=1120 outsize=0 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=1 insize=1349 outsize=0 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=0 insize=2736 outsize=19414 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=0 insize=2336 outsize=52092 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/shadercompiler-UnityShaderCompiler.exe6.log",
    "content": "Base path: 'C:/Program Files/Unity2019.2/Editor/Data', plugins path 'C:/Program Files/Unity2019.2/Editor/Data/PlaybackEngines'\nCmd: initializeCompiler\nCmd: compileSnippet\n  api=15 type=1 insize=2285 outsize=0 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=1 insize=1135 outsize=0 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=1 insize=2736 outsize=0 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=0 insize=1689 outsize=5952 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=1 insize=1689 outsize=0 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=0 insize=1120 outsize=6648 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Library/shadercompiler-UnityShaderCompiler.exe7.log",
    "content": "Base path: 'C:/Program Files/Unity2019.2/Editor/Data', plugins path 'C:/Program Files/Unity2019.2/Editor/Data/PlaybackEngines'\nCmd: initializeCompiler\nCmd: compileSnippet\n  api=15 type=1 insize=1135 outsize=0 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=0 insize=5186 outsize=45511 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=1 insize=5186 outsize=0 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=0 insize=2334 outsize=52942 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=1 insize=2334 outsize=0 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=0 insize=2285 outsize=51916 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=0 insize=5188 outsize=44661 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=1 insize=2736 outsize=0 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=0 insize=2348 outsize=52119 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=1 insize=2348 outsize=0 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\nCmd: compileSnippet\n  api=15 type=1 insize=1615 outsize=0 kw= pd=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR ok=1\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Logs/Packages-Update.log",
    "content": "\n=== Thu Oct 24 21:17:01 2019\n\nPackages were changed.\nUpdate Mode: resetToDefaultDependencies\n\nThe following packages were added:\n  com.unity.textmeshpro@2.0.1\n  com.unity.package-manager-ui@2.2.0\n  com.unity.collab-proxy@1.2.16\n  com.unity.ext.nunit@1.0.0\n  com.unity.test-framework@1.0.13\n  com.unity.timeline@1.1.0\n  com.unity.ide.vscode@1.0.7\n  com.unity.ide.rider@1.1.0\n  com.unity.ugui@1.0.0\n  com.unity.modules.ai@1.0.0\n  com.unity.modules.animation@1.0.0\n  com.unity.modules.androidjni@1.0.0\n  com.unity.modules.assetbundle@1.0.0\n  com.unity.modules.audio@1.0.0\n  com.unity.modules.cloth@1.0.0\n  com.unity.modules.director@1.0.0\n  com.unity.modules.imageconversion@1.0.0\n  com.unity.modules.imgui@1.0.0\n  com.unity.modules.jsonserialize@1.0.0\n  com.unity.modules.particlesystem@1.0.0\n  com.unity.modules.physics@1.0.0\n  com.unity.modules.physics2d@1.0.0\n  com.unity.modules.screencapture@1.0.0\n  com.unity.modules.terrain@1.0.0\n  com.unity.modules.terrainphysics@1.0.0\n  com.unity.modules.tilemap@1.0.0\n  com.unity.modules.ui@1.0.0\n  com.unity.modules.uielements@1.0.0\n  com.unity.modules.umbra@1.0.0\n  com.unity.modules.unityanalytics@1.0.0\n  com.unity.modules.unitywebrequest@1.0.0\n  com.unity.modules.unitywebrequestassetbundle@1.0.0\n  com.unity.modules.unitywebrequestaudio@1.0.0\n  com.unity.modules.unitywebrequesttexture@1.0.0\n  com.unity.modules.unitywebrequestwww@1.0.0\n  com.unity.modules.vehicles@1.0.0\n  com.unity.modules.video@1.0.0\n  com.unity.modules.vr@1.0.0\n  com.unity.modules.wind@1.0.0\n  com.unity.modules.xr@1.0.0\n\n=== Sat Jun 13 12:27:18 2020\n\nPackages were changed.\nUpdate Mode: updateDependencies\n\nThe following packages were updated:\n  com.unity.ide.vscode from version 1.0.7 to 1.1.3\n\n=== Wed Oct  6 21:27:07 2021\n\nPackages were changed.\nUpdate Mode: updateDependencies\n\nThe following packages were updated:\n  com.unity.ext.nunit from version 1.0.0 to 1.0.6\n  com.unity.ide.rider from version 1.1.0 to 1.1.4\n  com.unity.ide.vscode from version 1.1.3 to 1.2.3\n  com.unity.test-framework from version 1.0.13 to 1.1.20\n  com.unity.timeline from version 1.1.0 to 1.2.6\nThe following packages were removed:\n  com.unity.package-manager-ui@2.2.0\n\n=== Sat Jan  8 20:02:45 2022\n\nPackages were changed.\nUpdate Mode: resetToDefaultDependencies\n\nThe following packages were added:\n  com.unity.textmeshpro@2.0.1\n  com.unity.package-manager-ui@2.2.0\n  com.unity.collab-proxy@1.2.16\n  com.unity.ext.nunit@1.0.0\n  com.unity.test-framework@1.0.13\n  com.unity.timeline@1.1.0\n  com.unity.ide.vscode@1.1.3\n  com.unity.ide.rider@1.1.0\n  com.unity.ugui@1.0.0\n  com.unity.modules.ai@1.0.0\n  com.unity.modules.animation@1.0.0\n  com.unity.modules.androidjni@1.0.0\n  com.unity.modules.assetbundle@1.0.0\n  com.unity.modules.audio@1.0.0\n  com.unity.modules.cloth@1.0.0\n  com.unity.modules.director@1.0.0\n  com.unity.modules.imageconversion@1.0.0\n  com.unity.modules.imgui@1.0.0\n  com.unity.modules.jsonserialize@1.0.0\n  com.unity.modules.particlesystem@1.0.0\n  com.unity.modules.physics@1.0.0\n  com.unity.modules.physics2d@1.0.0\n  com.unity.modules.screencapture@1.0.0\n  com.unity.modules.terrain@1.0.0\n  com.unity.modules.terrainphysics@1.0.0\n  com.unity.modules.tilemap@1.0.0\n  com.unity.modules.ui@1.0.0\n  com.unity.modules.uielements@1.0.0\n  com.unity.modules.umbra@1.0.0\n  com.unity.modules.unityanalytics@1.0.0\n  com.unity.modules.unitywebrequest@1.0.0\n  com.unity.modules.unitywebrequestassetbundle@1.0.0\n  com.unity.modules.unitywebrequestaudio@1.0.0\n  com.unity.modules.unitywebrequesttexture@1.0.0\n  com.unity.modules.unitywebrequestwww@1.0.0\n  com.unity.modules.vehicles@1.0.0\n  com.unity.modules.video@1.0.0\n  com.unity.modules.vr@1.0.0\n  com.unity.modules.wind@1.0.0\n  com.unity.modules.xr@1.0.0\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/Packages/manifest.json",
    "content": "{\n  \"dependencies\": {\n    \"com.unity.collab-proxy\": \"1.2.16\",\n    \"com.unity.ext.nunit\": \"1.0.0\",\n    \"com.unity.ide.rider\": \"1.1.0\",\n    \"com.unity.ide.vscode\": \"1.1.3\",\n    \"com.unity.package-manager-ui\": \"2.2.0\",\n    \"com.unity.test-framework\": \"1.0.13\",\n    \"com.unity.textmeshpro\": \"2.0.1\",\n    \"com.unity.timeline\": \"1.1.0\",\n    \"com.unity.ugui\": \"1.0.0\",\n    \"com.unity.modules.ai\": \"1.0.0\",\n    \"com.unity.modules.androidjni\": \"1.0.0\",\n    \"com.unity.modules.animation\": \"1.0.0\",\n    \"com.unity.modules.assetbundle\": \"1.0.0\",\n    \"com.unity.modules.audio\": \"1.0.0\",\n    \"com.unity.modules.cloth\": \"1.0.0\",\n    \"com.unity.modules.director\": \"1.0.0\",\n    \"com.unity.modules.imageconversion\": \"1.0.0\",\n    \"com.unity.modules.imgui\": \"1.0.0\",\n    \"com.unity.modules.jsonserialize\": \"1.0.0\",\n    \"com.unity.modules.particlesystem\": \"1.0.0\",\n    \"com.unity.modules.physics\": \"1.0.0\",\n    \"com.unity.modules.physics2d\": \"1.0.0\",\n    \"com.unity.modules.screencapture\": \"1.0.0\",\n    \"com.unity.modules.terrain\": \"1.0.0\",\n    \"com.unity.modules.terrainphysics\": \"1.0.0\",\n    \"com.unity.modules.tilemap\": \"1.0.0\",\n    \"com.unity.modules.ui\": \"1.0.0\",\n    \"com.unity.modules.uielements\": \"1.0.0\",\n    \"com.unity.modules.umbra\": \"1.0.0\",\n    \"com.unity.modules.unityanalytics\": \"1.0.0\",\n    \"com.unity.modules.unitywebrequest\": \"1.0.0\",\n    \"com.unity.modules.unitywebrequestassetbundle\": \"1.0.0\",\n    \"com.unity.modules.unitywebrequestaudio\": \"1.0.0\",\n    \"com.unity.modules.unitywebrequesttexture\": \"1.0.0\",\n    \"com.unity.modules.unitywebrequestwww\": \"1.0.0\",\n    \"com.unity.modules.vehicles\": \"1.0.0\",\n    \"com.unity.modules.video\": \"1.0.0\",\n    \"com.unity.modules.vr\": \"1.0.0\",\n    \"com.unity.modules.wind\": \"1.0.0\",\n    \"com.unity.modules.xr\": \"1.0.0\"\n  }\n}\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/ProjectSettings/PackageManagerSettings.asset",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!114 &1\nMonoBehaviour:\n  m_ObjectHideFlags: 61\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_ScopedRegistriesSettingsExpanded: 1\n  oneTimeWarningShown: 0\n  m_Registries:\n  - m_Id: main\n    m_Name: \n    m_Url: https://packages.unity.com\n    m_Scopes: []\n    m_IsDefault: 1\n  m_UserSelectedRegistryName: \n  m_UserAddingNewScopedRegistry: 0\n  m_RegistryInfoDraft:\n    m_ErrorMessage: \n    m_Original:\n      m_Id: \n      m_Name: \n      m_Url: \n      m_Scopes: []\n      m_IsDefault: 0\n    m_Modified: 0\n    m_Name: \n    m_Url: \n    m_Scopes:\n    - \n    m_SelectedScopeIndex: 0\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/ProjectSettings/ProjectVersion.txt",
    "content": "m_EditorVersion: 2019.2.21f1\nm_EditorVersionWithRevision: 2019.2.21f1 (9d528d026557)\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/ProjectSettings/XRSettings.asset",
    "content": "{\n    \"m_SettingKeys\": [\n        \"VR Device Disabled\",\n        \"VR Device User Alert\"\n    ],\n    \"m_SettingValues\": [\n        \"False\",\n        \"False\"\n    ]\n}"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/obj/Debug/Assembly-CSharp-Editor.csproj.FileListAbsolute.txt",
    "content": "E:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Assembly-CSharp-Editor.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Assembly-CSharp-Editor.pdb\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Boo.Lang.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Microsoft.Win32.Primitives.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\mscorlib.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\netstandard.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\nunit.framework.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.AppContext.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Collections.Concurrent.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Collections.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Collections.NonGeneric.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Collections.Specialized.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.ComponentModel.Annotations.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.ComponentModel.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.ComponentModel.EventBasedAsync.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.ComponentModel.Primitives.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.ComponentModel.TypeConverter.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Console.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Data.Common.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Data.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Diagnostics.Contracts.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Diagnostics.Debug.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Diagnostics.FileVersionInfo.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Diagnostics.Process.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Diagnostics.StackTrace.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Diagnostics.TextWriterTraceListener.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Diagnostics.Tools.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Diagnostics.TraceSource.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Drawing.Primitives.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Dynamic.Runtime.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Globalization.Calendars.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Globalization.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Globalization.Extensions.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.IO.Compression.ZipFile.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.IO.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.IO.FileSystem.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.IO.FileSystem.DriveInfo.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.IO.FileSystem.Primitives.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.IO.FileSystem.Watcher.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.IO.IsolatedStorage.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.IO.MemoryMappedFiles.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.IO.Pipes.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.IO.UnmanagedMemoryStream.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Linq.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Linq.Expressions.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Linq.Parallel.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Linq.Queryable.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Net.NameResolution.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Net.NetworkInformation.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Net.Ping.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Net.Primitives.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Net.Requests.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Net.Security.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Net.Sockets.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Net.WebHeaderCollection.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Net.WebSockets.Client.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Net.WebSockets.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.ObjectModel.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Reflection.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Reflection.Extensions.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Reflection.Primitives.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Resources.Reader.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Resources.ResourceManager.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Resources.Writer.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Runtime.CompilerServices.VisualC.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Runtime.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Runtime.Extensions.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Runtime.Handles.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Runtime.InteropServices.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Runtime.InteropServices.RuntimeInformation.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Runtime.Numerics.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Runtime.Serialization.Formatters.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Runtime.Serialization.Json.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Runtime.Serialization.Primitives.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Runtime.Serialization.Xml.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Security.Claims.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Security.Cryptography.Algorithms.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Security.Cryptography.Csp.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Security.Cryptography.Encoding.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Security.Cryptography.Primitives.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Security.Cryptography.X509Certificates.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Security.Principal.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Security.SecureString.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.ServiceModel.Http.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Text.Encoding.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Text.Encoding.Extensions.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Text.RegularExpressions.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Threading.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Threading.Overlapped.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Threading.Tasks.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Threading.Tasks.Parallel.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Threading.Thread.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Threading.ThreadPool.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Threading.Timer.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.ValueTuple.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Xml.ReaderWriter.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Xml.XDocument.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Xml.XmlDocument.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Xml.XmlSerializer.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Xml.XPath.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Xml.XPath.XDocument.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.CollabProxy.Editor.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.Rider.Editor.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.TextMeshPro.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.TextMeshPro.Editor.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.Timeline.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.Timeline.Editor.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.VSCode.Editor.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEditor.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEditor.Graphs.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEditor.LinuxStandalone.Extensions.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEditor.OSXStandalone.Extensions.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEditor.TestRunner.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEditor.UI.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEditor.VR.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEditor.WindowsStandalone.Extensions.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.AccessibilityModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.AIModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.AndroidJNIModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.AnimationModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ARModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.AssetBundleModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.AudioModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ClothModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ClusterInputModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ClusterRendererModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.CoreModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.CrashReportingModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.DirectorModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.DSPGraphModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.FileSystemHttpModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.GameCenterModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.GridModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.HotReloadModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ImageConversionModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.IMGUIModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.InputLegacyModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.InputModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.JSONSerializeModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.LocalizationModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ParticleSystemModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.PerformanceReportingModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.Physics2DModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.PhysicsModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ProfilerModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ScreenCaptureModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.SharedInternalsModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.SpriteMaskModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.SpriteShapeModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.StreamingModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.SubstanceModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.TerrainModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.TerrainPhysicsModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.TestRunner.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.TextCoreModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.TextRenderingModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.TilemapModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.TLSModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UI.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UIElementsModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UIModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UmbraModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UNETModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityAnalyticsModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityConnectModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityTestProtocolModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityWebRequestAssetBundleModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityWebRequestAudioModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityWebRequestModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityWebRequestTextureModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityWebRequestWWWModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.VehiclesModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.VFXModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.VideoModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.VRModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.WindModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.XRModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityScript.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityScript.Lang.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.Cecil.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.SerializationLogic.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.Legacy.NRefactory.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\ExCSS.Unity.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.EnterpriseServices.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Transactions.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Boo.Lang.Compiler.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Boo.Lang.PatternMatching.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Boo.Lang.Parser.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Boo.Lang.Useful.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.CecilTools.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Assembly-CSharp.pdb\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEditor.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEditor.TestRunner.pdb\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.TestRunner.pdb\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.Timeline.Editor.pdb\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.VSCode.Editor.pdb\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.TextMeshPro.Editor.pdb\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UI.pdb\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.Timeline.pdb\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.CollabProxy.Editor.pdb\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.Rider.Editor.pdb\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.TextMeshPro.pdb\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEditor.UI.pdb\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.AIModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ARModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.AccessibilityModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.AndroidJNIModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.AnimationModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.AssetBundleModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.AudioModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ClothModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ClusterInputModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ClusterRendererModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.CoreModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.CrashReportingModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.DSPGraphModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.DirectorModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.FileSystemHttpModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.GameCenterModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.GridModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.HotReloadModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.IMGUIModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ImageConversionModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.InputModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.InputLegacyModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.JSONSerializeModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.LocalizationModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ParticleSystemModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.PerformanceReportingModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.PhysicsModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.Physics2DModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ProfilerModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ScreenCaptureModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.SharedInternalsModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.SpriteMaskModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.SpriteShapeModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.StreamingModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.SubstanceModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.TLSModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.TerrainModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.TerrainPhysicsModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.TextCoreModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.TextRenderingModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.TilemapModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UIModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UIElementsModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UNETModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UmbraModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityAnalyticsModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityConnectModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityTestProtocolModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityWebRequestModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityWebRequestAssetBundleModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityWebRequestAudioModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityWebRequestTextureModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityWebRequestWWWModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.VFXModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.VRModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.VehiclesModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.VideoModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.WindModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.XRModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEditor.VR.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\nunit.framework.pdb\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\nunit.framework.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\obj\\Debug\\Assembly-CSharp-Editor.csprojResolveAssemblyReference.cache\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\obj\\Debug\\Assembly-CSharp-Editor.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\obj\\Debug\\Assembly-CSharp-Editor.pdb\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Assembly-CSharp-Editor.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Assembly-CSharp-Editor.pdb\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Boo.Lang.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Microsoft.Win32.Primitives.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\mscorlib.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\nunit.framework.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.AppContext.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Collections.Concurrent.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Collections.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Collections.NonGeneric.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Collections.Specialized.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.ComponentModel.Annotations.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.ComponentModel.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.ComponentModel.EventBasedAsync.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.ComponentModel.Primitives.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.ComponentModel.TypeConverter.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Console.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Data.Common.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Data.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Diagnostics.Contracts.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Diagnostics.Debug.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Diagnostics.FileVersionInfo.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Diagnostics.Process.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Diagnostics.StackTrace.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Diagnostics.TextWriterTraceListener.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Diagnostics.Tools.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Diagnostics.TraceSource.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Drawing.Primitives.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Dynamic.Runtime.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Globalization.Calendars.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Globalization.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Globalization.Extensions.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.IO.Compression.ZipFile.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.IO.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.IO.FileSystem.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.IO.FileSystem.DriveInfo.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.IO.FileSystem.Primitives.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.IO.FileSystem.Watcher.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.IO.IsolatedStorage.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.IO.MemoryMappedFiles.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.IO.Pipes.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.IO.UnmanagedMemoryStream.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Linq.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Linq.Expressions.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Linq.Parallel.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Linq.Queryable.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Net.NameResolution.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Net.NetworkInformation.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Net.Ping.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Net.Primitives.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Net.Requests.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Net.Security.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Net.Sockets.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Net.WebHeaderCollection.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Net.WebSockets.Client.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Net.WebSockets.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.ObjectModel.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Reflection.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Reflection.Extensions.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Reflection.Primitives.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Resources.Reader.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Resources.ResourceManager.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Resources.Writer.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Runtime.CompilerServices.VisualC.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Runtime.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Runtime.Extensions.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Runtime.Handles.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Runtime.InteropServices.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Runtime.InteropServices.RuntimeInformation.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Runtime.Numerics.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Runtime.Serialization.Formatters.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Runtime.Serialization.Json.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Runtime.Serialization.Primitives.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Runtime.Serialization.Xml.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Security.Claims.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Security.Cryptography.Algorithms.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Security.Cryptography.Csp.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Security.Cryptography.Encoding.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Security.Cryptography.Primitives.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Security.Cryptography.X509Certificates.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Security.Principal.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Security.SecureString.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.ServiceModel.Http.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Text.Encoding.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Text.Encoding.Extensions.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Text.RegularExpressions.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Threading.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Threading.Overlapped.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Threading.Tasks.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Threading.Tasks.Parallel.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Threading.Thread.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Threading.ThreadPool.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Threading.Timer.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.ValueTuple.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Xml.ReaderWriter.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Xml.XDocument.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Xml.XmlDocument.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Xml.XmlSerializer.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Xml.XPath.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Xml.XPath.XDocument.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.CollabProxy.Editor.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.Rider.Editor.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.TextMeshPro.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.TextMeshPro.Editor.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.Timeline.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.Timeline.Editor.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.VSCode.Editor.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEditor.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEditor.Graphs.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEditor.LinuxStandalone.Extensions.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEditor.OSXStandalone.Extensions.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEditor.TestRunner.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEditor.UI.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEditor.VR.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEditor.WebGL.Extensions.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEditor.WindowsStandalone.Extensions.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.AccessibilityModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.AIModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.AndroidJNIModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.AnimationModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ARModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.AssetBundleModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.AudioModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ClothModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ClusterInputModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ClusterRendererModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.CoreModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.CrashReportingModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.DirectorModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.DSPGraphModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.FileSystemHttpModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.GameCenterModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.GridModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.HotReloadModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ImageConversionModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.IMGUIModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.InputLegacyModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.InputModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.JSONSerializeModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.LocalizationModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ParticleSystemModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.PerformanceReportingModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.Physics2DModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.PhysicsModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ProfilerModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ScreenCaptureModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.SharedInternalsModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.SpriteMaskModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.SpriteShapeModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.StreamingModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.SubstanceModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.TerrainModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.TerrainPhysicsModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.TestRunner.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.TextCoreModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.TextRenderingModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.TilemapModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.TLSModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UI.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UIElementsModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UIModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UmbraModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UNETModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityAnalyticsModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityConnectModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityTestProtocolModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityWebRequestAssetBundleModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityWebRequestAudioModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityWebRequestModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityWebRequestTextureModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityWebRequestWWWModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.VehiclesModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.VFXModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.VideoModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.VRModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.WindModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.XRModule.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityScript.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityScript.Lang.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.Cecil.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.SerializationLogic.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.Legacy.NRefactory.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\ExCSS.Unity.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.EnterpriseServices.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Transactions.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Boo.Lang.Compiler.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Boo.Lang.PatternMatching.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Boo.Lang.Parser.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Boo.Lang.Useful.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.CecilTools.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Assembly-CSharp.pdb\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEditor.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEditor.TestRunner.pdb\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.TestRunner.pdb\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.Timeline.Editor.pdb\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.VSCode.Editor.pdb\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.TextMeshPro.Editor.pdb\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UI.pdb\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.Timeline.pdb\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.CollabProxy.Editor.pdb\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.Rider.Editor.pdb\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.TextMeshPro.pdb\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEditor.UI.pdb\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.AIModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ARModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.AccessibilityModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.AndroidJNIModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.AnimationModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.AssetBundleModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.AudioModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ClothModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ClusterInputModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ClusterRendererModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.CoreModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.CrashReportingModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.DSPGraphModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.DirectorModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.FileSystemHttpModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.GameCenterModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.GridModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.HotReloadModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.IMGUIModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ImageConversionModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.InputModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.InputLegacyModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.JSONSerializeModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.LocalizationModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ParticleSystemModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.PerformanceReportingModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.PhysicsModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.Physics2DModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ProfilerModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ScreenCaptureModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.SharedInternalsModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.SpriteMaskModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.SpriteShapeModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.StreamingModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.SubstanceModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.TLSModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.TerrainModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.TerrainPhysicsModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.TextCoreModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.TextRenderingModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.TilemapModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UIModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UIElementsModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UNETModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UmbraModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityAnalyticsModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityConnectModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityTestProtocolModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityWebRequestModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityWebRequestAssetBundleModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityWebRequestAudioModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityWebRequestTextureModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityWebRequestWWWModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.VFXModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.VRModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.VehiclesModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.VideoModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.WindModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.XRModule.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEditor.VR.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\nunit.framework.pdb\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\nunit.framework.xml\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\obj\\Debug\\Assembly-CSharp-Editor.csprojResolveAssemblyReference.cache\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\obj\\Debug\\Assembly-CSharp-Editor.dll\nC:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\obj\\Debug\\Assembly-CSharp-Editor.pdb\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/obj/Debug/Assembly-CSharp.csproj.FileListAbsolute.txt",
    "content": "E:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Assembly-CSharp.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Assembly-CSharp.pdb\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Boo.Lang.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Microsoft.Win32.Primitives.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\mscorlib.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\netstandard.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.AppContext.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Collections.Concurrent.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Collections.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Collections.NonGeneric.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Collections.Specialized.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.ComponentModel.Annotations.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.ComponentModel.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.ComponentModel.EventBasedAsync.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.ComponentModel.Primitives.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.ComponentModel.TypeConverter.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Console.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Data.Common.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Data.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Diagnostics.Contracts.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Diagnostics.Debug.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Diagnostics.FileVersionInfo.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Diagnostics.Process.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Diagnostics.StackTrace.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Diagnostics.TextWriterTraceListener.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Diagnostics.Tools.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Diagnostics.TraceSource.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Drawing.Primitives.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Dynamic.Runtime.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Globalization.Calendars.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Globalization.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Globalization.Extensions.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.IO.Compression.ZipFile.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.IO.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.IO.FileSystem.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.IO.FileSystem.DriveInfo.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.IO.FileSystem.Primitives.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.IO.FileSystem.Watcher.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.IO.IsolatedStorage.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.IO.MemoryMappedFiles.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.IO.Pipes.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.IO.UnmanagedMemoryStream.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Linq.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Linq.Expressions.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Linq.Parallel.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Linq.Queryable.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Net.NameResolution.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Net.NetworkInformation.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Net.Ping.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Net.Primitives.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Net.Requests.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Net.Security.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Net.Sockets.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Net.WebHeaderCollection.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Net.WebSockets.Client.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Net.WebSockets.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.ObjectModel.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Reflection.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Reflection.Extensions.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Reflection.Primitives.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Resources.Reader.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Resources.ResourceManager.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Resources.Writer.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Runtime.CompilerServices.VisualC.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Runtime.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Runtime.Extensions.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Runtime.Handles.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Runtime.InteropServices.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Runtime.InteropServices.RuntimeInformation.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Runtime.Numerics.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Runtime.Serialization.Formatters.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Runtime.Serialization.Json.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Runtime.Serialization.Primitives.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Runtime.Serialization.Xml.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Security.Claims.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Security.Cryptography.Algorithms.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Security.Cryptography.Csp.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Security.Cryptography.Encoding.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Security.Cryptography.Primitives.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Security.Cryptography.X509Certificates.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Security.Principal.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Security.SecureString.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.ServiceModel.Http.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Text.Encoding.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Text.Encoding.Extensions.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Text.RegularExpressions.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Threading.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Threading.Overlapped.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Threading.Tasks.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Threading.Tasks.Parallel.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Threading.Thread.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Threading.ThreadPool.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Threading.Timer.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.ValueTuple.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Xml.ReaderWriter.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Xml.XDocument.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Xml.XmlDocument.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Xml.XmlSerializer.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Xml.XPath.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Xml.XPath.XDocument.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.CollabProxy.Editor.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.Rider.Editor.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.TextMeshPro.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.TextMeshPro.Editor.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.Timeline.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.Timeline.Editor.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.VSCode.Editor.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEditor.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEditor.UI.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.AccessibilityModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.AIModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.AndroidJNIModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.AnimationModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ARModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.AssetBundleModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.AudioModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ClothModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ClusterInputModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ClusterRendererModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.CoreModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.CrashReportingModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.DirectorModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.DSPGraphModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.FileSystemHttpModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.GameCenterModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.GridModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.HotReloadModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ImageConversionModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.IMGUIModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.InputLegacyModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.InputModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.JSONSerializeModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.LocalizationModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ParticleSystemModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.PerformanceReportingModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.Physics2DModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.PhysicsModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ProfilerModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ScreenCaptureModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.SharedInternalsModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.SpriteMaskModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.SpriteShapeModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.StreamingModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.SubstanceModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.TerrainModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.TerrainPhysicsModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.TextCoreModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.TextRenderingModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.TilemapModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.TLSModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UI.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UIElementsModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UIModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UmbraModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UNETModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityAnalyticsModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityConnectModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityTestProtocolModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityWebRequestAssetBundleModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityWebRequestAudioModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityWebRequestModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityWebRequestTextureModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityWebRequestWWWModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.VehiclesModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.VFXModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.VideoModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.VRModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.WindModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.XRModule.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityScript.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityScript.Lang.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.Cecil.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.SerializationLogic.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.Legacy.NRefactory.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\ExCSS.Unity.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.EnterpriseServices.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\System.Transactions.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Boo.Lang.Compiler.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Boo.Lang.PatternMatching.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Boo.Lang.Parser.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Boo.Lang.Useful.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.CecilTools.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEditor.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.Timeline.Editor.pdb\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.VSCode.Editor.pdb\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.TextMeshPro.Editor.pdb\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UI.pdb\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.Timeline.pdb\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.CollabProxy.Editor.pdb\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.Rider.Editor.pdb\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\Unity.TextMeshPro.pdb\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEditor.UI.pdb\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.AIModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ARModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.AccessibilityModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.AndroidJNIModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.AnimationModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.AssetBundleModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.AudioModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ClothModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ClusterInputModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ClusterRendererModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.CoreModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.CrashReportingModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.DSPGraphModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.DirectorModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.FileSystemHttpModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.GameCenterModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.GridModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.HotReloadModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.IMGUIModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ImageConversionModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.InputModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.InputLegacyModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.JSONSerializeModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.LocalizationModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ParticleSystemModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.PerformanceReportingModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.PhysicsModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.Physics2DModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ProfilerModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.ScreenCaptureModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.SharedInternalsModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.SpriteMaskModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.SpriteShapeModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.StreamingModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.SubstanceModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.TLSModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.TerrainModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.TerrainPhysicsModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.TextCoreModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.TextRenderingModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.TilemapModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UIModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UIElementsModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UNETModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UmbraModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityAnalyticsModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityConnectModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityTestProtocolModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityWebRequestModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityWebRequestAssetBundleModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityWebRequestAudioModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityWebRequestTextureModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.UnityWebRequestWWWModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.VFXModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.VRModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.VehiclesModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.VideoModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.WindModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Debug\\UnityEngine.XRModule.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\obj\\Debug\\Assembly-CSharp.csprojResolveAssemblyReference.cache\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\obj\\Debug\\Assembly-CSharp.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\obj\\Debug\\Assembly-CSharp.pdb\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs",
    "content": ""
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs",
    "content": ""
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs",
    "content": ""
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/obj/Release/Assembly-CSharp.csproj.FileListAbsolute.txt",
    "content": "E:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Release\\Assembly-CSharp.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Release\\Assembly-CSharp.pdb\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Release\\UnityEditor.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Release\\UnityEngine.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Release\\UnityEngine.Networking.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Release\\UnityEngine.UI.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Release\\Mono.Cecil.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Release\\Unity.SerializationLogic.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Release\\Unity.DataContract.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Release\\ICSharpCode.NRefactory.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Release\\Unity.UNetWeaver.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Release\\Unity.CecilTools.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Release\\Mono.Cecil.Pdb.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Release\\Mono.Cecil.Mdb.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Release\\UnityEngine.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Release\\UnityEditor.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Release\\UnityEngine.UI.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\Temp\\bin\\Release\\UnityEngine.Networking.xml\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\obj\\Release\\Assembly-CSharp.dll\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\obj\\Release\\Assembly-CSharp.pdb\nE:\\gh\\scattererGithub\\Scatterer\\scatterer\\Shaders\\scattererShaders\\obj\\Release\\Assembly-CSharp.csprojResolveAssemblyReference.cache\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/scattererShaders-csharp.sln",
    "content": "Microsoft Visual Studio Solution File, Format Version 11.00\n# Visual Studio 2008\n\n\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tGlobalSection(MonoDevelopProperties) = preSolution\n\t\tStartupItem = Assembly-CSharp.csproj\n\tEndGlobalSection\n\nEndGlobal\n"
  },
  {
    "path": "scatterer/OldShaders/scattererShaders/scattererShaders.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 11.00\n# Visual Studio 2010\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Assembly-CSharp\", \"Assembly-CSharp.csproj\", \"{87622294-0BFC-2C93-A2E6-774E6D27C210}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Assembly-CSharp-Editor\", \"Assembly-CSharp-Editor.csproj\", \"{1BA7E86D-23C1-619A-C471-A2388FCC27DA}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{87622294-0BFC-2C93-A2E6-774E6D27C210}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{87622294-0BFC-2C93-A2E6-774E6D27C210}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{87622294-0BFC-2C93-A2E6-774E6D27C210}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{87622294-0BFC-2C93-A2E6-774E6D27C210}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{1BA7E86D-23C1-619A-C471-A2388FCC27DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{1BA7E86D-23C1-619A-C471-A2388FCC27DA}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{1BA7E86D-23C1-619A-C471-A2388FCC27DA}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{1BA7E86D-23C1-619A-C471-A2388FCC27DA}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "scatterer/Scatterer.cs",
    "content": "using System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing UnityEngine;\r\nusing UnityEngine.Rendering;\r\n\r\n[assembly:AssemblyVersion(\"0.0878\")]\r\nnamespace Scatterer\r\n{\r\n\t[KSPAddon(KSPAddon.Startup.EveryScene, false)]\r\n\tpublic class Scatterer: MonoBehaviour\r\n\t{\t\r\n\t\tprivate static Scatterer instance;\r\n\t\tpublic static Scatterer Instance {get {return instance;}}\r\n\r\n\t\tpublic MainSettingsReadWrite mainSettings = new MainSettingsReadWrite();\r\n\t\tpublic PluginDataReadWrite pluginData     = new PluginDataReadWrite();\r\n\t\tpublic ConfigReader planetsConfigsReader  = new ConfigReader ();\r\n\r\n\t\tpublic GUIhandler guiHandler = new GUIhandler();\r\n\t\t\r\n\t\tpublic ScattererCelestialBodiesManager scattererCelestialBodiesManager = new ScattererCelestialBodiesManager ();\r\n\t\tpublic SunflareManager sunflareManager; GameObject sunflareManagerGO;\r\n\t\tpublic EVEReflectionHandler eveReflectionHandler;\r\n\t\tprivate Coroutine cloudReappliedCoroutine;\r\n\t\t//public PlanetshineManager planetshineManager;\r\n\r\n\t\tDisableAmbientLight ambientLightScript;\r\n\t\tpublic SunlightModulatorsManager sunlightModulatorsManagerInstance;\r\n\t\t\r\n\t\tpublic ShadowRemoveFadeCommandBuffer shadowFadeRemover;\r\n\t\tpublic TweakShadowCascades shadowCascadeTweaker;\r\n\r\n\t\t//probably move these to buffer rendering manager\r\n\t\tDepthToDistanceCommandBuffer farDepthCommandbuffer, nearDepthCommandbuffer;\r\n\t\tpublic DepthPrePassMerger nearDepthPassMerger;\r\n\t\t\r\n\t\tpublic Light sunLight, scaledSpaceSunLight, mainMenuLight;\r\n\t\tpublic Light[] lights;\r\n\t\tpublic Camera farCamera, scaledSpaceCamera, nearCamera;\r\n\t\tstatic float originalShadowDistance = 0f;\r\n\r\n\t\t//classic SQUAD\r\n\t\tReflectionProbeChecker reflectionProbeChecker;\r\n\t\tGameObject ReflectionProbeCheckerGO;\r\n\t\t\r\n\t\tbool coreInitiated = false;\r\n\t\tpublic bool isActive = false;\r\n\t\tpublic bool unifiedCameraMode = false;\r\n\t\tpublic string versionNumber = \"0.0878p\";\r\n\r\n\t\tpublic List<GenericAntiAliasing> antiAliasingScripts = new List<GenericAntiAliasing>();\r\n\r\n\t\tvoid Awake ()\r\n\t\t{\r\n\t\t\tif (instance == null)\r\n\t\t\t{\r\n\t\t\t\tinstance = this;\r\n\t\t\t\tUtils.LogDebug(\"Core instance created\");\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\t//destroy any duplicate instances that may be created by a duplicate install\r\n\t\t\t\tUtils.LogError(\"Destroying duplicate instance, check your install for duplicate scatterer folders, or nested GameData folders\");\r\n\t\t\t\tUnityEngine.Object.DestroyImmediate(this);\r\n\t\t\t}\r\n\r\n\t\t\tUtils.LogInfo (\"Version:\"+versionNumber);\r\n\t\t\tUtils.LogInfo (\"Running on: \" + SystemInfo.graphicsDeviceVersion + \" on \" +SystemInfo.operatingSystem);\r\n\t\t\tUtils.LogInfo (\"Game resolution: \" + Screen.width.ToString() + \"x\" +Screen.height.ToString());\r\n\t\t\tUtils.LogInfo (\"Compute shader support: \" + SystemInfo.supportsComputeShaders.ToString());\r\n\t\t\tUtils.LogInfo (\"Async GPU readback support: \" + SystemInfo.supportsAsyncGPUReadback.ToString());\r\n\r\n\t\t\tif (HighLogic.LoadedSceneIsFlight || HighLogic.LoadedScene == GameScenes.SPACECENTER || HighLogic.LoadedScene == GameScenes.TRACKSTATION || HighLogic.LoadedScene == GameScenes.MAINMENU)\r\n\t\t\t{\r\n\t\t\t\tisActive = true;\r\n\r\n\t\t\t\tLoadSettings ();\r\n\t\t\t\tscattererCelestialBodiesManager.Init ();\r\n\r\n\t\t\t\tguiHandler.Init();\r\n\r\n\t\t\t\tif (mainSettings.useOceanShaders)\r\n\t\t\t\t{\r\n\t\t\t\t\tOceanUtils.removeStockOceansIfNotDone();\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tOceanUtils.restoreOceansIfNeeded();\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (HighLogic.LoadedScene == GameScenes.MAINMENU)\r\n\t\t\t\t{\r\n\t\t\t\t\tif (mainSettings.integrateWithEVEClouds)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tShaderReplacer.Instance.replaceEVEshaders();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (isActive)\r\n\t\t\t{\r\n\t\t\t\tStartCoroutine (DelayedInit ());\r\n\t\t\t}\r\n\r\n\t\t\t// The built-in AA breaks basically all post effects\r\n\t\t\tif (HighLogic.LoadedSceneIsFlight || HighLogic.LoadedScene == GameScenes.SPACECENTER)\r\n\t\t\t{\r\n\t\t\t\tQualitySettings.antiAliasing = 0;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t//wait for 5 frames for EVE, TUFX and the game to finish setting up\r\n\t\tIEnumerator DelayedInit()\r\n\t\t{\r\n\t\t\tint delayFrames = 5;\r\n\t\t\tfor (int i=0; i<delayFrames; i++)\r\n\t\t\t\tyield return new WaitForFixedUpdate ();\r\n\r\n\t\t\tInit();\r\n\t\t}\r\n\r\n\t\tvoid Init()\r\n\t\t{\r\n\t\t\tSetupMainCameras ();\r\n\r\n\t\t\tFindSunlights ();\r\n\r\n\t\t\tSetShadows();\r\n\t\t\t\r\n\t\t\tUtils.FixKopernicusRingsRenderQueue ();\t\t\t\r\n\t\t\tUtils.FixSunsCoronaRenderQueue ();\r\n\r\n\t\t\tAddReflectionProbeFixer ();\r\n\r\n//\t\t\tif (mainSettings.usePlanetShine)\r\n//\t\t\t{\r\n//\t\t\t\tplanetshineManager = new PlanetshineManager();\r\n//\t\t\t}\r\n\r\n\t\t\tif (HighLogic.LoadedScene != GameScenes.TRACKSTATION)\r\n\t\t\t{\r\n\t\t\t\t// copy stock depth buffers and combine into a single depth buffer\r\n\t\t\t\tif (!unifiedCameraMode && (mainSettings.useOceanShaders || mainSettings.fullLensFlareReplacement))\r\n\t\t\t\t{\r\n\t\t\t\t\tfarDepthCommandbuffer = farCamera.gameObject.AddComponent<DepthToDistanceCommandBuffer>();\r\n\t\t\t\t\tnearDepthCommandbuffer = nearCamera.gameObject.AddComponent<DepthToDistanceCommandBuffer>();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// TODO: move all AA logic to a separate class?\r\n\t\t\tif (HighLogic.LoadedSceneIsFlight || HighLogic.LoadedScene == GameScenes.SPACECENTER)\r\n\t\t\t{\r\n\t\t\t\t//cleanup any forgotten/glitched AA scripts\r\n\t\t\t\tforeach (GenericAntiAliasing antiAliasing in Resources.FindObjectsOfTypeAll(typeof(GenericAntiAliasing)))\r\n\t\t\t\t{\r\n\t\t\t\t\tif (antiAliasing)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tComponent.DestroyImmediate(antiAliasing);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (mainSettings.useSubpixelMorphologicalAntialiasing)\r\n\t\t\t\t{\r\n\t\t\t\t\tSubpixelMorphologicalAntialiasing nearAA = nearCamera.gameObject.AddComponent<SubpixelMorphologicalAntialiasing>();\r\n\t\t\t\t\tantiAliasingScripts.Add(nearAA);\r\n\t\t\t\t\t\r\n\t\t\t\t\t// On camera change change apply to new camera\r\n\t\t\t\t\tGameEvents.OnCameraChange.Add(SMAAOnCameraChange);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (mainSettings.useTemporalAntiAliasing)\r\n\t\t\t\t{\r\n                    ShaderReplacer.Instance.LoadedShaders.TryGetValue(\"Scatterer/Internal-MotionVectors\", out Shader customMotionVectorsShader);\r\n\r\n                    // The custom motion vectors shader fixes NaN motion vectors on the scaled camera's skybox and combines the motion vectors of all cameras\r\n                    if (customMotionVectorsShader != null)\r\n                    {\r\n                        GraphicsSettings.SetShaderMode(BuiltinShaderType.MotionVectors, BuiltinShaderMode.UseCustom);\r\n                        GraphicsSettings.SetCustomShader(BuiltinShaderType.MotionVectors, customMotionVectorsShader);\r\n                    }\r\n\r\n                    TemporalAntiAliasing nearAA, farAA, scaledAA;\r\n\r\n\t\t\t\t\tnearAA = nearCamera.gameObject.AddComponent<TemporalAntiAliasing>();\r\n\t\t\t\t\tnearAA.checkOceanDepth = mainSettings.useOceanShaders;\r\n\t\t\t\t\tnearAA.resetMotionVectors = false;\r\n\t\t\t\t\tantiAliasingScripts.Add(nearAA);\r\n\r\n\t\t\t\t\tif (!unifiedCameraMode && farCamera)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tfarAA = farCamera.gameObject.AddComponent<TemporalAntiAliasing>();\r\n\t\t\t\t\t\tfarAA.checkOceanDepth = mainSettings.useOceanShaders;\r\n                        farAA.resetMotionVectors = false;\r\n                        antiAliasingScripts.Add(farAA);\r\n\t\t\t\t\t}\r\n\r\n                    // doesn't seem to hurt performance more\r\n                    scaledAA = scaledSpaceCamera.gameObject.AddComponent<TemporalAntiAliasing>();\r\n\t\t\t\t\tscaledAA.jitterTransparencies = true;\r\n\t\t\t\t\tantiAliasingScripts.Add(scaledAA);\r\n\r\n\t\t\t\t\tif (!mainSettings.useSubpixelMorphologicalAntialiasing)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tGameEvents.OnCameraChange.Add(AddTAAToInternalCamera);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tif(mainSettings.mergeDepthPrePass)\r\n\t\t\t\t{\r\n\t\t\t\t\tUtils.LogInfo(\"Adding nearDepthPassMerger\");\r\n\t\t\t\t\tnearDepthPassMerger = (DepthPrePassMerger) nearCamera.gameObject.AddComponent<DepthPrePassMerger>();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif ((mainSettings.fullLensFlareReplacement) && (HighLogic.LoadedScene != GameScenes.MAINMENU))\r\n\t\t\t{\r\n\t\t\t\tsunflareManagerGO = new GameObject(\"Scatterer sunflare manager\");\r\n\t\t\t\tsunflareManager = sunflareManagerGO.AddComponent<SunflareManager>();\r\n\t\t\t\tsunflareManager.Init();\r\n\t\t\t}\r\n\r\n\t\t\tif (mainSettings.integrateWithEVEClouds)\r\n\t\t\t{\r\n\t\t\t\teveReflectionHandler = new EVEReflectionHandler();\r\n\t\t\t\teveReflectionHandler.Start();\r\n\t\t\t}\r\n\r\n\t\t\tif (mainSettings.disableAmbientLight && !ambientLightScript)\r\n\t\t\t{\r\n\t\t\t\tambientLightScript = (DisableAmbientLight) scaledSpaceCamera.gameObject.AddComponent (typeof(DisableAmbientLight));\r\n\t\t\t}\r\n\r\n\t\t\tif (!unifiedCameraMode)\r\n\t\t\t\tshadowFadeRemover = (ShadowRemoveFadeCommandBuffer)nearCamera.gameObject.AddComponent (typeof(ShadowRemoveFadeCommandBuffer));\r\n\r\n\t\t\t//magically fix stupid issues when reverting to space center from map view\r\n\t\t\tif (HighLogic.LoadedScene == GameScenes.SPACECENTER)\r\n\t\t\t{\r\n\t\t\t\tMapView.MapIsEnabled = false;\r\n\t\t\t}\r\n\r\n\t\t\tif (mainSettings.sunlightExtinction || (mainSettings.underwaterLightDimming && mainSettings.useOceanShaders))\r\n\t\t\t{\r\n\t\t\t\tsunlightModulatorsManagerInstance = new SunlightModulatorsManager();\r\n\t\t\t}\r\n\r\n\t\t\tcoreInitiated = true;\r\n\r\n\t\t\tUtils.LogDebug(\"Core setup done\");\r\n\t\t}\r\n\r\n\t\tvoid Update()\r\n\t\t{\r\n\t\t\tguiHandler.UpdateGUIvisible ();\r\n\r\n\t\t\t//TODO: get rid of this check, maybe move to coroutine? what happens when coroutine exits?\r\n\t\t\tif (coreInitiated)\r\n\t\t\t{\r\n                // The built-in AA breaks basically all post effects\r\n                if (HighLogic.LoadedSceneIsFlight || HighLogic.LoadedScene == GameScenes.SPACECENTER)\r\n\t\t\t\t{\r\n\t\t\t\t\tQualitySettings.antiAliasing = 0;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tscattererCelestialBodiesManager.Update ();\r\n\r\n\t\t\t\t/*\r\n\t\t\t\t//move this out of this update, let it be a one time thing\r\n\t\t\t\t//TODO: check what this means\r\n\t\t\t\tif (bufferManager)\r\n\t\t\t\t{\r\n\t\t\t\t\tif (!bufferManager.depthTextureCleared && (MapView.MapIsEnabled || !scattererCelestialBodiesManager.isPQSEnabledOnScattererPlanet) )\r\n\t\t\t\t\t\tbufferManager.ClearDepthTexture();\r\n\t\t\t\t}\r\n\t\t\t\t*/\r\n\r\n\t\t\t\tif (sunflareManager != null)\r\n\t\t\t\t{\r\n\t\t\t\t\tsunflareManager.UpdateFlares();\r\n\t\t\t\t}\r\n\r\n//\t\t\t\tif(planetshineManager != null)\r\n//\t\t\t\t{\r\n//\t\t\t\t\tplanetshineManager.UpdatePlanetshine();\r\n//\t\t\t\t}\r\n\t\t\t}\r\n\t\t} \r\n\r\n\t\tvoid OnDestroy ()\r\n\t\t{\r\n\t\t\tGameEvents.OnCameraChange.Remove(SMAAOnCameraChange);\r\n\t\t\tGameEvents.OnCameraChange.Remove(AddTAAToInternalCamera);\r\n\r\n\t\t\tif (isActive)\r\n\t\t\t{\r\n\t\t\t\tif (sunlightModulatorsManagerInstance != null)\r\n\t\t\t\t{\r\n\t\t\t\t\tsunlightModulatorsManagerInstance.Cleanup();\r\n\t\t\t\t}\r\n\r\n//\t\t\t\tif(planetshineManager != null)\r\n//\t\t\t\t{\r\n//\t\t\t\t\tplanetshineManager.Cleanup();\r\n//\t\t\t\t}\r\n\r\n\t\t\t\tif (scattererCelestialBodiesManager != null)\r\n\t\t\t\t{\r\n\t\t\t\t\tscattererCelestialBodiesManager.Cleanup();\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (ambientLightScript)\r\n\t\t\t\t{\r\n\t\t\t\t\tComponent.DestroyImmediate(ambientLightScript);\r\n\t\t\t\t}\t\t\t\t\r\n\r\n\t\t\t\tif (nearCamera)\r\n\t\t\t\t{\r\n\t\t\t\t\tif (nearCamera.gameObject.GetComponent (typeof(Wireframe)))\r\n\t\t\t\t\t\tComponent.DestroyImmediate (nearCamera.gameObject.GetComponent (typeof(Wireframe)));\r\n\t\t\t\t\t\r\n\t\t\t\t\tif (farCamera && farCamera.gameObject.GetComponent (typeof(Wireframe)))\r\n\t\t\t\t\t\tComponent.DestroyImmediate (farCamera.gameObject.GetComponent (typeof(Wireframe)));\r\n\t\t\t\t\t\r\n\t\t\t\t\tif (scaledSpaceCamera.gameObject.GetComponent (typeof(Wireframe)))\r\n\t\t\t\t\t\tComponent.DestroyImmediate (scaledSpaceCamera.gameObject.GetComponent (typeof(Wireframe)));\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (sunflareManager)\r\n\t\t\t\t{\r\n\t\t\t\t\tUnityEngine.Component.DestroyImmediate(sunflareManager);\r\n\t\t\t\t\tGameObject.DestroyImmediate(sunflareManagerGO);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (shadowFadeRemover)\r\n\t\t\t\t{\r\n\t\t\t\t\tComponent.DestroyImmediate(shadowFadeRemover);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (shadowCascadeTweaker)\r\n\t\t\t\t{\r\n\t\t\t\t\tComponent.DestroyImmediate(shadowCascadeTweaker);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (farDepthCommandbuffer)\r\n\t\t\t\t\tComponent.DestroyImmediate (farDepthCommandbuffer);\r\n\t\t\t\t\r\n\t\t\t\tif (nearDepthCommandbuffer)\r\n\t\t\t\t\tComponent.DestroyImmediate (nearDepthCommandbuffer);\r\n\r\n\t\t\t\tif (nearDepthPassMerger)\r\n\t\t\t\t\tComponent.DestroyImmediate (nearDepthPassMerger);\r\n\r\n\t\t\t\tforeach (GenericAntiAliasing antiAliasing in antiAliasingScripts)\r\n\t\t\t\t{\r\n\t\t\t\t\tif (antiAliasing)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tComponent.DestroyImmediate(antiAliasing);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (reflectionProbeChecker)\r\n\t\t\t\t{\r\n\t\t\t\t\tComponent.DestroyImmediate (reflectionProbeChecker);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (ReflectionProbeCheckerGO)\r\n\t\t\t\t{\r\n\t\t\t\t\tUnityEngine.GameObject.DestroyImmediate (ReflectionProbeCheckerGO);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tQualitySettings.antiAliasing = GameSettings.ANTI_ALIASING;\r\n\r\n\t\t\t\tif (eveReflectionHandler != null)\r\n\t\t\t\t\teveReflectionHandler.CleanUp();\r\n\r\n\t\t\t\tpluginData.inGameWindowLocation=new Vector2(guiHandler.windowRect.x,guiHandler.windowRect.y);\r\n\t\t\t\tSaveSettings();\r\n\t\t\t}\r\n\r\n\t\t\tUnityEngine.Object.DestroyImmediate (guiHandler);\r\n\t\t\t\r\n\t\t}\r\n\r\n\t\tvoid OnGUI ()\r\n\t\t{\r\n\t\t\tguiHandler.DrawGui ();\r\n\t\t}\r\n\t\t\r\n\t\tpublic void LoadSettings ()\r\n\t\t{\r\n\t\t\tmainSettings.loadMainSettings ();\r\n\t\t\tpluginData.loadPluginData ();\r\n\t\t\tplanetsConfigsReader.loadConfigs ();\r\n\r\n\t\t\t// HACK: for mainMenu everything is jumbled, so just attempt to load every planet always\r\n\t\t\tif (HighLogic.LoadedScene == GameScenes.MAINMENU)\r\n\t\t\t{\r\n\t\t\t\tforeach (ScattererCelestialBody _SCB in planetsConfigsReader.scattererCelestialBodies)\r\n\t\t\t\t{\r\n\t\t\t\t\t_SCB.loadDistance = Mathf.Infinity;\r\n\t\t\t\t\t_SCB.unloadDistance = Mathf.Infinity;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tpublic void SaveSettings ()\r\n\t\t{\r\n\t\t\tpluginData.savePluginData ();\r\n\t\t\tmainSettings.saveMainSettingsIfChanged ();\r\n\t\t}\r\n\r\n\t\tvoid SetupMainCameras()\r\n\t\t{\r\n\t\t\tscaledSpaceCamera = Camera.allCameras.FirstOrDefault (_cam => _cam.name == \"Camera ScaledSpace\");\r\n\t\t\tfarCamera = Camera.allCameras.FirstOrDefault (_cam => _cam.name == \"Camera 01\");\r\n\t\t\tnearCamera = Camera.allCameras.FirstOrDefault (_cam => _cam.name == \"Camera 00\");\r\n\r\n\t\t\tif (nearCamera && !farCamera) \r\n\t\t\t{\r\n\t\t\t\tUtils.LogInfo(\"Running in unified camera mode\");\r\n\t\t\t\tunifiedCameraMode = true;\r\n\t\t\t}\r\n\r\n\t\t\tif (scaledSpaceCamera && nearCamera)\r\n\t\t\t{\r\n\t\t\t\tif (mainSettings.terrainShadows)\r\n\t\t\t\t{\r\n\t\t\t\t\tif (!unifiedCameraMode && (mainSettings.dualCamShadowCascadeSplitsOverride != Vector3.zero))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tshadowCascadeTweaker = (TweakShadowCascades) Utils.getEarliestLocalCamera().gameObject.AddComponent(typeof(TweakShadowCascades));\r\n\t\t\t\t\t\tshadowCascadeTweaker.Init(mainSettings.dualCamShadowCascadeSplitsOverride);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (unifiedCameraMode && (mainSettings.unifiedCamShadowCascadeSplitsOverride != Vector3.zero))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tshadowCascadeTweaker = (TweakShadowCascades) Utils.getEarliestLocalCamera().gameObject.AddComponent(typeof(TweakShadowCascades));\r\n\t\t\t\t\t\tshadowCascadeTweaker.Init(mainSettings.unifiedCamShadowCascadeSplitsOverride);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tif (mainSettings.overrideNearClipPlane)\r\n\t\t\t\t{\r\n\t\t\t\t\tUtils.LogDebug(\"Override near clip plane from:\"+nearCamera.nearClipPlane.ToString()+\" to:\"+mainSettings.nearClipPlane.ToString());\r\n\t\t\t\t\tnearCamera.nearClipPlane = mainSettings.nearClipPlane;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (HighLogic.LoadedScene == GameScenes.MAINMENU)\r\n\t\t\t{\r\n\t\t\t\t// If are in main menu, where there is only 1 camera, affect all cameras to Landscape camera\r\n\t\t\t\tscaledSpaceCamera = Camera.allCameras.Single(_cam  => _cam.name == \"Landscape Camera\");\r\n\t\t\t\tfarCamera = scaledSpaceCamera;\r\n\t\t\t\tnearCamera = scaledSpaceCamera;\r\n\t\t\t}\r\n\t\t\telse if (HighLogic.LoadedScene == GameScenes.TRACKSTATION)\r\n\t\t\t{\r\n\t\t\t\t// If in trackstation, just to get rid of some nullrefs\r\n\t\t\t\tfarCamera = scaledSpaceCamera;\r\n\t\t\t\tnearCamera = scaledSpaceCamera;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid SetShadows()\r\n\t\t{\r\n\t\t\tif (HighLogic.LoadedScene != GameScenes.MAINMENU)\r\n\t\t\t{\r\n\t\t\t\tif (unifiedCameraMode && (mainSettings.d3d11ShadowFix || mainSettings.terrainShadows))\r\n\t\t\t\t{\r\n\t\t\t\t\tQualitySettings.shadowProjection = ShadowProjection.StableFit; //way more resistant to jittering\r\n\t\t\t\t\tGraphicsSettings.SetShaderMode (BuiltinShaderType.ScreenSpaceShadows, BuiltinShaderMode.UseCustom);\r\n\r\n\t\t\t\t\tGraphicsSettings.SetCustomShader (BuiltinShaderType.ScreenSpaceShadows, ShaderReplacer.Instance.LoadedShaders [(\"Scatterer/customScreenSpaceShadows\")]);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (mainSettings.shadowsOnOcean || mainSettings.oceanLightRays)\r\n\t\t\t\t{\r\n\t\t\t\t\tif (unifiedCameraMode || SystemInfo.graphicsDeviceVersion.Contains(\"Direct3D 11.0\"))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tQualitySettings.shadowProjection = ShadowProjection.StableFit;\t//StableFit + splitSpheres is the only thing that works Correctly for unified camera (dx11) ocean shadows\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \t//Otherwise we get artifacts near shadow cascade edges\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tQualitySettings.shadowProjection = ShadowProjection.CloseFit;\t//CloseFit without SplitSpheres seems to be the only setting that works for OpenGL for ocean shadows\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//Seems like I lack the correct variables to determine which shadow path to take\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//also try without the transparent tag\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (mainSettings.terrainShadows)\r\n\t\t\t\t{\r\n\t\t\t\t\tif (originalShadowDistance == 0f)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\toriginalShadowDistance = QualitySettings.shadowDistance;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tQualitySettings.shadowDistance = unifiedCameraMode ? mainSettings.unifiedCamShadowsDistance : mainSettings.dualCamShadowsDistance;\r\n\t\t\t\t\tUtils.LogDebug (\"Set shadow distance: \" + QualitySettings.shadowDistance.ToString ());\r\n\t\t\t\t\tUtils.LogDebug (\"Number of shadow cascades detected \" + QualitySettings.shadowCascades.ToString ());\r\n\r\n\t\t\t\t\tSetShadowsForLight (sunLight);\r\n\r\n\t\t\t\t\t// And finally force shadow Casting and receiving on celestial bodies if not already set\r\n\t\t\t\t\tforeach (CelestialBody _sc in FlightGlobals.Bodies)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif (_sc.pqsController)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t_sc.pqsController.meshCastShadows = true;\r\n\t\t\t\t\t\t\t_sc.pqsController.meshRecieveShadows = true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tDisableCustomShadowResForLight (sunLight);\r\n\r\n\t\t\t\t\tif (originalShadowDistance != 0f)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tUtils.LogDebug(\"Restore original shadow distance: \"+originalShadowDistance.ToString());\r\n\t\t\t\t\t\tQualitySettings.shadowDistance = originalShadowDistance;;\r\n\t\t\t\t\t\toriginalShadowDistance = 0f;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void SetShadowsForLight (Light light)\r\n\t\t{\r\n\t\t\tif (light && mainSettings.terrainShadows && (HighLogic.LoadedScene != GameScenes.MAINMENU))\r\n\t\t\t{\r\n\t\t\t\t//fixes checkerboard artifacts aka shadow acne\r\n\t\t\t\tfloat bias = unifiedCameraMode ? mainSettings.unifiedCamShadowNormalBiasOverride : mainSettings.dualCamShadowNormalBiasOverride;\r\n\t\t\t\tfloat normalBias = unifiedCameraMode ? mainSettings.unifiedCamShadowBiasOverride : mainSettings.dualCamShadowBiasOverride;\r\n\t\t\t\tif (bias != 0f)\r\n\t\t\t\t\tlight.shadowBias = bias;\r\n\t\t\t\tif (normalBias != 0f)\r\n\t\t\t\t\tlight.shadowNormalBias = normalBias;\r\n\t\t\t\tint customRes = unifiedCameraMode ? mainSettings.unifiedCamShadowResolutionOverride : mainSettings.dualCamShadowResolutionOverride;\r\n\t\t\t\tif (customRes != 0)\r\n\t\t\t\t{\r\n\t\t\t\t\tif (Utils.IsPowerOfTwo (customRes))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tUtils.LogDebug (\"Setting shadowmap resolution to: \" + customRes.ToString () + \" on \" + light.name);\r\n\t\t\t\t\t\tlight.shadowCustomResolution = customRes;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tUtils.LogError (\"Selected shadowmap resolution not a power of 2: \" + customRes.ToString ());\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t\tlight.shadowCustomResolution = 0;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void DisableCustomShadowResForLight (Light light)\r\n\t\t{\r\n\t\t\tif (light && !mainSettings.terrainShadows && (HighLogic.LoadedScene != GameScenes.MAINMENU))\r\n\t\t\t{\r\n\t\t\t\tlight.shadowCustomResolution = 0;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid FindSunlights ()\r\n\t\t{\r\n\t\t\tlights = (Light[])Light.FindObjectsOfType (typeof(Light));\r\n\t\t\tforeach (Light _light in lights)\r\n\t\t\t{\r\n\t\t\t\tif (_light.gameObject.name == \"SunLight\")\r\n\t\t\t\t{\r\n\t\t\t\t\tsunLight = _light;\r\n\t\t\t\t}\r\n\t\t\t\tif (_light.gameObject.name == \"Scaledspace SunLight\")\r\n\t\t\t\t{\r\n\t\t\t\t\tscaledSpaceSunLight = _light;\r\n\t\t\t\t}\r\n\t\t\t\tif (_light.gameObject.name.Contains (\"PlanetLight\") || _light.gameObject.name.Contains (\"Directional light\"))\r\n\t\t\t\t{\r\n\t\t\t\t\tmainMenuLight = _light;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// TODO: this shouldn't be here\r\n\t\tpublic void TriggerOnCloudReapplied()\r\n        {\r\n\t\t\tif (cloudReappliedCoroutine != null)\r\n\t\t\t\tStopCoroutine(cloudReappliedCoroutine);\r\n\r\n\t\t\tcloudReappliedCoroutine = StartCoroutine(DelayedOnCloudsReapplied());\r\n        }\r\n\r\n\t\tIEnumerator DelayedOnCloudsReapplied()\r\n\t\t{\r\n\t\t\tyield return new WaitForFixedUpdate();\r\n\t\t\tyield return new WaitForFixedUpdate();\r\n\r\n\t\t\tif (eveReflectionHandler != null)\r\n\t\t\t\teveReflectionHandler.OnCloudsReapplied();\r\n\t\t}\r\n\r\n\t\tpublic void OnRenderTexturesLost()\r\n\t\t{\r\n\t\t\tforeach (ScattererCelestialBody _cur in planetsConfigsReader.scattererCelestialBodies)\r\n\t\t\t{\r\n\t\t\t\tif (_cur.active)\r\n\t\t\t\t{\r\n\t\t\t\t\t_cur.prolandManager.skyNode.ReInitMaterialUniformsOnRenderTexturesLoss ();\r\n\t\t\t\t\tif (_cur.prolandManager.hasOcean && mainSettings.useOceanShaders && !_cur.prolandManager.skyNode.inScaledSpace)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t_cur.prolandManager.reBuildOcean ();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Just a dummy gameObject so the reflectionProbeChecker can capture the reflection Camera\r\n\t\tpublic void AddReflectionProbeFixer()\r\n\t\t{\r\n\t\t\tReflectionProbeCheckerGO = new GameObject (\"Scatterer ReflectionProbeCheckerGO\");\r\n\t\t\t//ReflectionProbeCheckerGO.transform.parent = nearCamera.transform; //VesselViewer doesn't like this for some reason\r\n\t\t\tReflectionProbeCheckerGO.layer = 15;\r\n\r\n\t\t\treflectionProbeChecker = ReflectionProbeCheckerGO.AddComponent<ReflectionProbeChecker> ();\r\n\r\n\t\t\tMeshFilter _mf = ReflectionProbeCheckerGO.AddComponent<MeshFilter> ();\r\n\t\t\t_mf.mesh.Clear ();\r\n\t\t\t_mf.mesh = MeshFactory.MakePlane (2, 2, MeshFactory.PLANE.XY, false, false);\r\n\t\t\t_mf.mesh.bounds = new Bounds (Vector4.zero, new Vector3 (Mathf.Infinity, Mathf.Infinity, Mathf.Infinity));\r\n\r\n\t\t\tMeshRenderer _mr = ReflectionProbeCheckerGO.AddComponent<MeshRenderer> ();\r\n\t\t\t_mr.sharedMaterial = new Material (ShaderReplacer.Instance.LoadedShaders[(\"Scatterer/invisible\")]);\r\n\t\t\t_mr.material = new Material (ShaderReplacer.Instance.LoadedShaders[(\"Scatterer/invisible\")]);\r\n\t\t\t_mr.receiveShadows = false;\r\n\t\t\t_mr.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;\r\n\t\t\t_mr.enabled = true;\r\n\t\t}\r\n\t\t\r\n\t\tpublic void AddTAAToInternalCamera(CameraManager.CameraMode cameraMode)\r\n\t\t{\r\n\t\t\tif (cameraMode == CameraManager.CameraMode.IVA)\r\n\t\t\t{\r\n\t\t\t\tCamera internalCamera = Camera.allCameras.FirstOrDefault (_cam => _cam.name == \"InternalCamera\");\r\n\t\t\t\tif (internalCamera)\r\n\t\t\t\t{\r\n\t\t\t\t\tTemporalAntiAliasing internalTAA = internalCamera.GetComponent<TemporalAntiAliasing>();\r\n\t\t\t\t\tif(internalTAA == null)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tinternalTAA = internalCamera.gameObject.AddComponent<TemporalAntiAliasing>();\r\n                        internalTAA.resetMotionVectors = false;\r\n                        antiAliasingScripts.Add(internalTAA);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void SMAAOnCameraChange(CameraManager.CameraMode cameraMode)\r\n\t\t{\r\n\t\t\tif (cameraMode == CameraManager.CameraMode.IVA)\r\n\t\t\t{\r\n\t\t\t\tCamera internalCamera = Camera.allCameras.FirstOrDefault (_cam => _cam.name == \"InternalCamera\");\r\n\t\t\t\tif (internalCamera)\r\n\t\t\t\t{\r\n\t\t\t\t\t// Add depth-based SMAA to internal camera, to avoid blurring over cockpit elements and text especially with custom IVAs\r\n\t\t\t\t\tSubpixelMorphologicalAntialiasing internalSMAA = internalCamera.gameObject.AddComponent<SubpixelMorphologicalAntialiasing>();\r\n\t\t\t\t\tinternalSMAA.forceDepthBuffermode();\r\n\t\t\t\t\tantiAliasingScripts.Add(internalSMAA);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n            {\r\n\t\t\t\tvar ivaSmaaScripts = antiAliasingScripts.OfType<SubpixelMorphologicalAntialiasing>()\r\n\t\t\t\t\t.Where(x => x.QualityUsed == SubpixelMorphologicalAntialiasing.Quality.DepthMode).ToList();\r\n\r\n\t\t\t\tantiAliasingScripts.RemoveAll(script => ivaSmaaScripts.Contains(script));\r\n\r\n\t\t\t\tforeach (var ivaSmaaScript in ivaSmaaScripts)\r\n\t\t\t\t{\r\n\t\t\t\t\tComponent.DestroyImmediate(ivaSmaaScript);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "scatterer/Utilities/Camera/DepthPrePassMerger.cs",
    "content": "using System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.IO;\r\nusing System.Reflection;\r\nusing System.Runtime;\r\nusing KSP;\r\nusing KSP.IO;\r\nusing UnityEngine;\r\nusing UnityEngine.Rendering;\r\n\r\nnamespace Scatterer\r\n{\r\n\t// Merges the depth pre-pass result into the screenbuffer's depth to reduce overdraw and make the pre-pass more useful\r\n\t// Only usable with MSAA off so only for depth buffer mode\r\n\tpublic class DepthPrePassMerger : MonoBehaviour\r\n\t{\r\n\t\tMaterial copyCameraDepthMaterial;\r\n\t\tCommandBuffer depthInitCommandBuffer;\r\n\t\tCamera targetCamera;\r\n\r\n\t\tpublic DepthPrePassMerger ()\r\n\t\t{\r\n\t\t\tUtils.LogInfo(\"Adding DepthPrePassMerger\");\r\n\t\t\ttargetCamera = GetComponent<Camera> ();\r\n\r\n\t\t\tUtils.LogInfo (\"targetCamera.depthTextureMode \" + targetCamera.depthTextureMode.ToString ());\r\n\r\n\t\t\tif (QualitySettings.antiAliasing == 0)\r\n\t\t\t{\r\n\t\t\t\tif (targetCamera.depthTextureMode == DepthTextureMode.None)\r\n\t\t\t\t\ttargetCamera.depthTextureMode = DepthTextureMode.Depth;\r\n\r\n\t\t\t\tcopyCameraDepthMaterial = new Material (ShaderReplacer.Instance.LoadedShaders[\"Scatterer/CopyCameraDepth\"]);\r\n\t\t\t\tdepthInitCommandBuffer = new CommandBuffer();\r\n\t\t\t\tdepthInitCommandBuffer.name = \"Scatterer depth merge commandbuffer\";\r\n\t\t\t\tdepthInitCommandBuffer.Blit(null, BuiltinRenderTextureType.CameraTarget, copyCameraDepthMaterial, 1);\r\n\t\t\t\ttargetCamera.AddCommandBuffer(CameraEvent.BeforeForwardOpaque, depthInitCommandBuffer);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void OnDestroy()\r\n\t\t{\r\n\t\t\tif (targetCamera && depthInitCommandBuffer != null)\r\n\t\t\t{\r\n\t\t\t\ttargetCamera.RemoveCommandBuffer(CameraEvent.BeforeForwardOpaque, depthInitCommandBuffer);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/Utilities/Camera/DepthToDistanceCommandBuffer.cs",
    "content": "using UnityEngine;\r\nusing UnityEngine.Rendering;\r\n\r\nnamespace Scatterer\r\n{\r\n    public class DepthToDistanceCommandBuffer : MonoBehaviour\r\n    {\r\n\r\n        private CommandBuffer buffer;\r\n        public Camera camera;\r\n        private Material material;\r\n        private static RenderTexture renderTexture;\r\n        private bool initialized = false;\r\n        public static RenderTexture RenderTexture { get => renderTexture; }\r\n\r\n        private void Init()\r\n        {\r\n            // after depth texture is rendered on far and near cameras, copy it and merge it as a single distance buffer\r\n            camera = gameObject.GetComponent<Camera>();\r\n            buffer = new CommandBuffer();\r\n            buffer.name = \"Scatterer DepthToDistanceCommandBuffer\";\r\n\r\n            if (!renderTexture)\r\n            {\r\n                if (camera == null || camera.activeTexture == null)\r\n                {\r\n                    return;\r\n                }\r\n                renderTexture = RenderTextureUtils.CreateRenderTexture(camera.activeTexture.width, camera.activeTexture.height, RenderTextureFormat.RFloat, false, FilterMode.Point);\r\n            }\r\n\r\n            material = new Material(ShaderReplacer.Instance.LoadedShaders[(\"Scatterer/DepthToDistance\")]);\r\n\r\n            if (camera == Utils.getEarliestLocalCamera())\r\n            {\r\n                buffer.SetRenderTarget(renderTexture);\r\n                buffer.ClearRenderTarget(false, true, Color.white);\r\n            }\r\n\r\n            buffer.Blit(null, renderTexture, material);\r\n\r\n            camera.AddCommandBuffer(CameraEvent.AfterForwardOpaque, buffer);\r\n\r\n            initialized = true;\r\n        }\r\n\r\n        public void OnPostRender()\r\n        {\r\n            if (initialized && camera.activeTexture != null)\r\n            {\r\n                if (renderTexture.width != camera.activeTexture.width || renderTexture.height != camera.activeTexture.height)\r\n                {\r\n                    renderTexture.Release();\r\n                    renderTexture = null;\r\n\r\n                    buffer.Clear();\r\n                    buffer = null;\r\n\r\n                    initialized = false;\r\n                }\r\n            }\r\n\r\n            if (!initialized)\r\n                Init();\r\n        }\r\n\r\n        public void OnDestroy()\r\n        {\r\n            camera.RemoveCommandBuffer(CameraEvent.AfterForwardOpaque, buffer);\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "scatterer/Utilities/Camera/DisableAmbientLight.cs",
    "content": "using UnityEngine;\r\n\r\nnamespace Scatterer\r\n{\r\n\r\n\tpublic class DisableAmbientLight : MonoBehaviour\r\n\t{\r\n\t\tColor ambientLight, originalAmbientLight;\r\n\r\n\t\tprivate void Awake()\r\n\t\t{\r\n\t\t\tambientLight = Color.black;\r\n\t\t}\r\n\r\n\t\tpublic void OnPreRender()\r\n\t\t{\r\n\t\t\toriginalAmbientLight = RenderSettings.ambientLight;\r\n\t\t\tRenderSettings.ambientLight = ambientLight;\r\n\t\t}\r\n\r\n\t\tpublic void OnPostRender()\r\n\t\t{\r\n\t\t\tRestoreLight ();\r\n\t\t}\r\n\r\n\t\tpublic void RestoreLight()\r\n\t\t{\r\n\t\t\tRenderSettings.ambientLight = originalAmbientLight;\r\n\t\t}\r\n\r\n\t\tpublic void OnDestroy()\r\n        {\r\n\t\t\tRestoreLight();\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/Utilities/Camera/DisableEffectsChecker.cs",
    "content": "//used just to remove the postprocessing and the ocean from texture replacer's reflections because they look messed up and bog down performance\r\n//this part gets added to the postprocessingCube, it will then detect when TR attempts to render it and a script to the TR camera to disable the effects on it\r\n//the TR camera only gets created only once an IVA kerbal appears on screen, and thus it is necessary to do this as the camera may not exist when scatterer is initializing\r\n\r\nusing UnityEngine;\r\nusing System.Collections;\r\nusing System.IO;\r\n\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\n\r\nusing KSP.IO;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class DisableEffectsChecker : MonoBehaviour\r\n\t{\r\n\t\tDictionary<Camera,DisableEffectsForReflectionsCamera> camToEffectsDisablerDictionary =  new Dictionary<Camera,DisableEffectsForReflectionsCamera>() ;\r\n\t\tpublic ProlandManager manager;\r\n\r\n\t\tpublic DisableEffectsChecker ()\r\n\t\t{\r\n\t\t}\r\n\r\n\t\tpublic void OnWillRenderObject()\r\n\t\t{\r\n\t\t\tCamera cam = Camera.current;\r\n\t\t\tif (!cam)\r\n\t\t\t\treturn;\r\n\r\n\t\t\tif (!camToEffectsDisablerDictionary.ContainsKey(cam))\r\n\t\t\t{\r\n\t\t\t\tif ((cam.name == \"TRReflectionCamera\") || (cam.name==\"Reflection Probes Camera\"))\r\n\t\t\t\t{\r\n\t\t\t\t\tcamToEffectsDisablerDictionary[cam] = (DisableEffectsForReflectionsCamera) cam.gameObject.AddComponent(typeof(DisableEffectsForReflectionsCamera));\r\n\t\t\t\t\tcamToEffectsDisablerDictionary[cam].manager = manager;\r\n\t\t\t\t\t\r\n\t\t\t\t\tUtils.LogDebug(\"Ocean effects disabled from reflections Camera \"+cam.name);\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\t//we add it anyway to avoid doing a string compare\r\n\t\t\t\t\tcamToEffectsDisablerDictionary[cam] = null;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\r\n\t\t}\r\n\r\n\t\tpublic void OnDestroy()\r\n\t\t{\r\n\t\t\tif (camToEffectsDisablerDictionary.Count != 0) \r\n\t\t\t{\r\n\t\t\t\tforeach (var _val in camToEffectsDisablerDictionary.Values)\r\n\t\t\t\t{\r\n\t\t\t\t\tComponent.Destroy (_val);\r\n\t\t\t\t\tUnityEngine.Object.Destroy (_val);\r\n\t\t\t\t}\r\n\t\t\t\tcamToEffectsDisablerDictionary.Clear();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/Utilities/Camera/DisableEffectsForReflectionsCamera.cs",
    "content": "//used just to remove the postprocessing and the ocean from texture replacer's reflections because they look messed up and bog down performance\r\n//this script gets added to the camera to disable the effects on\r\n\r\nusing UnityEngine;\r\nusing System.Collections;\r\nusing System.IO;\r\n\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\n\r\nusing KSP.IO;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class DisableEffectsForReflectionsCamera : MonoBehaviour\r\n\t{\r\n\t\tpublic ProlandManager manager;\r\n\r\n\t\tpublic DisableEffectsForReflectionsCamera ()\r\n\t\t{\r\n\t\t}\r\n\r\n\t\t//also add EVE cloud Projectors, EVE/PlanetLight, underwaterProjector, sunflare, should be all\r\n\t\t//and scatteringProjector not disabling correctly\r\n\t\tpublic void OnPreCull()\r\n\t\t{\r\n\t\t\tif (manager.GetSkyNode ().localScatteringContainer != null)\r\n\t\t\t{\r\n\t\t\t\tmanager.GetSkyNode().localScatteringContainer.SetActivated (false);\r\n\t\t\t\tmanager.GetSkyNode().localScatteringContainer.UpdateContainer();\r\n\t\t\t}\r\n\r\n\t\t\tif (manager.GetOceanNode())\r\n\t\t\t{\r\n\t\t\t\tmanager.GetOceanNode().setWaterMeshrenderersEnabled (false);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void OnPostRender()\r\n\t\t{\r\n\t\t\tif (manager.GetSkyNode ().localScatteringContainer != null)\r\n\t\t\t\tmanager.GetSkyNode().localScatteringContainer.SetActivated (true);\r\n\r\n\t\t\tif (manager.GetOceanNode())\r\n\t\t\t\tmanager.GetOceanNode().setWaterMeshrenderersEnabled (true);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/Utilities/Camera/ReflectionProbeChecker.cs",
    "content": "using UnityEngine;\r\nusing System.Collections;\r\nusing System.IO;\r\n\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\n\r\nusing KSP.IO;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class ReflectionProbeChecker : MonoBehaviour\r\n\t{\r\n\t\tDictionary<Camera,ReflectionProbeFixer> camToFixer =  new Dictionary<Camera,ReflectionProbeFixer>() ;\r\n\r\n\t\tpublic ReflectionProbeChecker ()\r\n\t\t{\r\n\t\t}\r\n\r\n\t\tpublic void OnUpdate()\r\n\t\t{\r\n\t\t\tgameObject.transform.position = Scatterer.Instance.nearCamera.transform.position + (Scatterer.Instance.nearCamera.transform.forward * -5000f);\r\n\t\t}\r\n\r\n\t\tpublic void OnWillRenderObject()\r\n\t\t{\r\n\t\t\tCamera cam = Camera.current;\r\n\t\t\tif (!cam)\r\n\t\t\t\treturn;\r\n\r\n\t\t\tif (!camToFixer.ContainsKey(cam))\r\n\t\t\t{\r\n\t\t\t\tif (cam.name==\"Reflection Probes Camera\")\r\n\t\t\t\t{\r\n\t\t\t\t\tcamToFixer[cam] = (ReflectionProbeFixer) cam.gameObject.AddComponent(typeof(ReflectionProbeFixer));\r\n\r\n\t\t\t\t\t//Grab the reflection probe and set it's distance to 100km so reflections no longer disappear when using cameraTools stationary camera\r\n\t\t\t\t\tReflectionProbe[] probes = Resources.FindObjectsOfTypeAll<ReflectionProbe> ();\r\n\t\t\t\t\tforeach (ReflectionProbe _probe in probes)\r\n\t\t\t\t\t{\r\n                        float size = Mathf.Max(10000000f, _probe.size.x);\r\n                        _probe.size = new Vector3(size, size, size);\r\n                    }\r\n\r\n\t\t\t\t\tUtils.LogDebug(\"Added reflection probe fixer to \"+cam.name);\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\t//we add it anyway to avoid doing a string compare\r\n\t\t\t\t\tcamToFixer[cam] = null;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tpublic void OnDestroy()\r\n\t\t{\r\n\t\t\tif (camToFixer.Count != 0) \r\n\t\t\t{\r\n\t\t\t\tforeach (var _val in camToFixer.Values)\r\n\t\t\t\t{\r\n\t\t\t\t\tif (_val)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tComponent.DestroyImmediate (_val);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tcamToFixer.Clear();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/Utilities/Camera/ReflectionProbeFixer.cs",
    "content": "// Stock KSP reflectionProbes Reflection probes seem to render the scaled scenery and the local scenery together, without clearing the depth buffer in between\r\n// and without adjusting for depth/scale differences between the two. This causes issues: https://bugs.kerbalspaceprogram.com/issues/25179\r\n// Fix this by adding a separate scaledSpace Camera\r\n\r\nusing UnityEngine;\r\nusing System.Collections;\r\nusing System.IO;\r\n\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\n\r\nusing KSP.IO;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class ReflectionProbeFixer : MonoBehaviour\r\n\t{\r\n\t\tCamera scaledCamera;\r\n\t\tGameObject scaledCameraGO;\r\n\t\t\r\n\t\tCamera reflectionProbeCamera;\r\n\t\tint tweakedCullingMask;\r\n\t\t\r\n\t\tpublic ReflectionProbeFixer ()\r\n\t\t{\r\n\t\t}\r\n\r\n\t\tpublic void Awake()\r\n\t\t{\r\n\t\t\t// Create a camera that will render scaledSpace for reflection probes\r\n\t\t\tscaledCameraGO = new GameObject(\"ScattererReflectionProbeScaledSpaceCamera\");\r\n\t\t\tscaledCamera = scaledCameraGO.AddComponent<Camera>();\r\n\t\t\tscaledCamera.enabled = false;\r\n\t\t\treflectionProbeCamera = gameObject.GetComponent<Camera> ();\r\n\r\n\t\t\t// Remove scaledSpace rendering from the stock reflection probe Camera\r\n\t\t\ttweakedCullingMask = reflectionProbeCamera.cullingMask;\r\n\t\t\tif ((tweakedCullingMask & (1 << 10)) != 0)\r\n\t\t\t{\r\n\t\t\t\ttweakedCullingMask = tweakedCullingMask - (1 << 10);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// We need to do this every frame as it gets reset\r\n\t\tpublic void OnPreCull()\r\n\t\t{\r\n\t\t\treflectionProbeCamera.cullingMask = tweakedCullingMask; \r\n\t\t\treflectionProbeCamera.clearFlags = CameraClearFlags.Depth; // Clear only depth for this Camera, scaledCamera clears color+depth\r\n\r\n\t\t\tscaledCamera.CopyFrom(reflectionProbeCamera);\r\n\t\t\tscaledCamera.enabled = false;\r\n\t\t\tscaledCamera.clearFlags = CameraClearFlags.Color;\r\n\t\t\tscaledCamera.backgroundColor = Color.black;\r\n\t\t\t\r\n\t\t\t// Setup and render scaled scene first\r\n\t\t\tscaledCamera.cullingMask = ScaledCamera.Instance.galaxyCamera.cullingMask;\r\n\r\n            // The reflectionProbe camera has manually set viewMatrix and doesn't use the transforms, we want to keep everything the same except for position\r\n            Matrix4x4 viewMatrix = scaledCamera.worldToCameraMatrix;\r\n\r\n            viewMatrix.m03 = ScaledCamera.Instance.galaxyCamera.transform.position.x;\r\n            viewMatrix.m13 = ScaledCamera.Instance.galaxyCamera.transform.position.y;\r\n            viewMatrix.m23 = ScaledCamera.Instance.galaxyCamera.transform.position.z;\r\n\r\n            scaledCamera.worldToCameraMatrix = viewMatrix;\r\n\r\n\t\t\tscaledCamera.targetTexture = reflectionProbeCamera.targetTexture;\r\n\t\t\tscaledCamera.Render ();\r\n\r\n            // Render scaled scene second\r\n            scaledCamera.clearFlags = CameraClearFlags.Depth;\r\n            scaledCamera.cullingMask = (1<<9) | (1<<10);\r\n\r\n            viewMatrix.m03 = Scatterer.Instance.scaledSpaceCamera.transform.position.x;\r\n            viewMatrix.m13 = Scatterer.Instance.scaledSpaceCamera.transform.position.y;\r\n            viewMatrix.m23 = Scatterer.Instance.scaledSpaceCamera.transform.position.z;\r\n\r\n            scaledCamera.worldToCameraMatrix = viewMatrix;\r\n\r\n            scaledCamera.Render();\r\n        }\r\n\r\n        public void OnDestroy()\r\n\t\t{\r\n\t\t\tif (scaledCamera)\r\n\t\t\t{\r\n\t\t\t\tComponent.DestroyImmediate(scaledCamera);\r\n\t\t\t}\r\n\r\n\t\t\tif (scaledCameraGO)\r\n\t\t\t{\r\n\t\t\t\tUnityEngine.Object.DestroyImmediate (scaledCameraGO);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/Utilities/Camera/ScreenCopyCommandBuffer.cs",
    "content": "using System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.IO;\r\nusing System.Reflection;\r\nusing System.Runtime;\r\nusing KSP;\r\nusing KSP.IO;\r\nusing UnityEngine;\r\nusing UnityEngine.Rendering;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class ScreenCopyCommandBuffer : MonoBehaviour\r\n\t{\r\n\t\tprivate static Dictionary<Camera,ScreenCopyCommandBuffer> CameraToCommandBufferHandler = new Dictionary<Camera,ScreenCopyCommandBuffer>();\r\n\t\t\r\n\t\tpublic static void EnableScreenCopyForFrame(Camera cam)\r\n\t\t{\r\n\t\t\tif (CameraToCommandBufferHandler.ContainsKey (cam))\r\n\t\t\t{\r\n\t\t\t\tif(CameraToCommandBufferHandler[cam])\r\n\t\t\t\t\tCameraToCommandBufferHandler[cam].EnableScreenCopyForFrame();\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tScreenCopyCommandBuffer handler = (ScreenCopyCommandBuffer) cam.gameObject.AddComponent(typeof(ScreenCopyCommandBuffer));\r\n\r\n\t\t\t\tif ((cam.name == \"TRReflectionCamera\") || (cam.name==\"Reflection Probes Camera\"))\r\n\t\t\t\t\thandler.reflectionProbeMode = true;\r\n\t\t\t\t\r\n\t\t\t\thandler.Initialize();\r\n\t\t\t\tCameraToCommandBufferHandler[cam] = handler;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic bool reflectionProbeMode = false;\r\n\t\tbool isEnabled = false;\r\n\t\tbool isInitialized = false;\r\n\t\tbool hdrEnabled = false;\r\n\r\n\t\tprivate Camera targetCamera;\r\n\t\tprivate CommandBuffer screenCopyCommandBuffer;\r\n\t\tprivate int colorCopyRenderTextureNameID;\r\n\t\t\r\n\t\tpublic ScreenCopyCommandBuffer ()\r\n\t\t{\r\n\t\t}\r\n\t\t\r\n\t\tpublic void Initialize()\r\n\t\t{\r\n\t\t\ttargetCamera = GetComponent<Camera> ();\r\n\r\n\t\t\tif (!reflectionProbeMode)\r\n            {\r\n                targetCamera.forceIntoRenderTexture = true;\r\n            }\r\n\r\n\t\t\tcolorCopyRenderTextureNameID = Shader.PropertyToID(nameof(colorCopyRenderTextureNameID));\r\n\r\n            screenCopyCommandBuffer = new CommandBuffer();\r\n\t\t\tscreenCopyCommandBuffer.name = \"Scatterer screen copy CommandBuffer\";\r\n\r\n\t\t\tReinit();\r\n\t\t\t\r\n\t\t\tisInitialized = true;\r\n\t\t}\r\n\r\n\t\tprivate void Reinit()\r\n        {\r\n\t\t\ttargetCamera.RemoveCommandBuffer(CameraEvent.AfterImageEffectsOpaque, screenCopyCommandBuffer);\r\n\r\n\t\t\tscreenCopyCommandBuffer.Clear();\r\n\r\n\t\t\tif (!reflectionProbeMode)\r\n\t\t\t{\r\n\t\t\t\tscreenCopyCommandBuffer.GetTemporaryRT(colorCopyRenderTextureNameID, -1, -1, 0, FilterMode.Point, hdrEnabled ? RenderTextureFormat.DefaultHDR : RenderTextureFormat.ARGB32);\r\n\t\t\t\tscreenCopyCommandBuffer.Blit(BuiltinRenderTextureType.CameraTarget, colorCopyRenderTextureNameID);\r\n\t\t\t\tscreenCopyCommandBuffer.SetGlobalTexture(\"ScattererScreenCopyBeforeOcean\", colorCopyRenderTextureNameID);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tscreenCopyCommandBuffer.SetGlobalTexture(\"ScattererScreenCopyBeforeOcean\", Texture2D.blackTexture); //Hack but will stop sky flickering\r\n\t\t\t}\r\n\t\t}\r\n\r\n        public void EnableScreenCopyForFrame()\r\n\t\t{\r\n\t\t\tif (!isEnabled && isInitialized)\r\n\t\t\t{\r\n\t\t\t\tif (hdrEnabled != targetCamera.allowHDR)\r\n\t\t\t\t\tReinit();\r\n\r\n\t\t\t\ttargetCamera.AddCommandBuffer(CameraEvent.AfterImageEffectsOpaque, screenCopyCommandBuffer);\r\n\t\t\t\tisEnabled = true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid OnPostRender()\r\n\t\t{\r\n\t\t\tif (!isInitialized)\r\n\t\t\t{\r\n\t\t\t\tInitialize ();\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tif (isEnabled && targetCamera.stereoActiveEye != Camera.MonoOrStereoscopicEye.Left)\r\n\t\t\t\t{\r\n\t\t\t\t\ttargetCamera.RemoveCommandBuffer (CameraEvent.AfterImageEffectsOpaque, screenCopyCommandBuffer);\r\n\t\t\t\t\tisEnabled = false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tpublic void OnDestroy ()\r\n\t\t{\r\n\t\t\tif (targetCamera != null)\r\n\t\t\t{\r\n\t\t\t\tif (screenCopyCommandBuffer != null)\r\n\t\t\t\t{\r\n\t\t\t\t\ttargetCamera.RemoveCommandBuffer (CameraEvent.AfterImageEffectsOpaque, screenCopyCommandBuffer);\r\n\t\t\t\t\tscreenCopyCommandBuffer.Release();\r\n\t\t\t\t\tscreenCopyCommandBuffer = null;\r\n\t\t\t\t\tisEnabled = false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/Utilities/Camera/TweakShadowCascades.cs",
    "content": "\r\nusing UnityEngine;\r\nusing System.Collections;\r\nusing System.IO;\r\n\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\n\r\nusing KSP.IO;\r\n\r\nnamespace Scatterer\r\n{\r\n\r\n\tpublic class TweakShadowCascades : MonoBehaviour\r\n\t{\r\n\t\tVector3 tweakedSplit, defaultSplit;\r\n\r\n\t\tpublic TweakShadowCascades()\r\n\t\t{\r\n\r\n\t\t}\r\n\r\n\t\tpublic void Init(Vector3 inputSplit)\r\n\t\t{\r\n\t\t\tUtils.LogDebug (\"Adding TweakShadowCascades: \" + inputSplit.ToString (\"F3\") +\" to Camera \"+gameObject.GetComponent<Camera>().name );\r\n\t\t\tdefaultSplit = QualitySettings.shadowCascade4Split;\r\n\t\t\tUtils.LogDebug (\"Default split: \" + defaultSplit.ToString (\"F3\"));\r\n\t\t\ttweakedSplit = inputSplit;\r\n\r\n\t\t}\r\n\r\n\t\tpublic void OnPreRender()\r\n\t\t{\r\n\t\t\tQualitySettings.shadowCascade4Split= tweakedSplit;\r\n\t\t}\r\n\r\n\t\tpublic void OnPostRender()\r\n\t\t{\r\n\t\t\tQualitySettings.shadowCascade4Split = defaultSplit;\r\n\t\t}\r\n\r\n\t\tpublic void OnDestroy()\r\n\t\t{\r\n\t\t\tQualitySettings.shadowCascade4Split = defaultSplit;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/Utilities/Camera/WireFrame.cs",
    "content": "using UnityEngine;\r\nusing System.Collections;\r\n\r\nnamespace Scatterer\r\n{\r\n\r\npublic class Wireframe : MonoBehaviour {\r\n\t\r\n\t// Use this for initialization\r\n\tvoid Start () {\r\n\r\n\t}\r\n\t\r\n\t// Update is called once per frame\r\n\tvoid Update () {\r\n\t\t\r\n\t}\r\n\t\r\n\tvoid OnPreRender()\r\n\t{\r\n\t\tGL.wireframe = true;\r\n\t}\r\n\t\r\n\tvoid OnPostRender() {\r\n\t\tGL.wireframe = false;\r\n\t}\r\n}\r\n}"
  },
  {
    "path": "scatterer/Utilities/Dx12UnifiedCamera.cs",
    "content": "//Enables unified camera mode on Directx12, Dx12 still runs slower than Dx11 on both CPU and GPU for some reason (higher loads and lower framerates), also ocean shader causes crash\r\nusing System;\r\nusing UnityEngine;\r\nusing System.Reflection;\r\n\r\nnamespace Scatterer\r\n{\r\n\t[KSPAddon(KSPAddon.Startup.Instantly, false)]\r\n\tpublic class Dx12UnifiedCamera : MonoBehaviour\r\n\t{\r\n\t\tpublic void Start()\r\n\t\t{\r\n\t\t\tif (SystemInfo.graphicsDeviceVersion.Contains (\"Direct3D 12\"))\r\n\t\t\t{\r\n\t\t\t\tType t = typeof(GameSettings);\r\n\t\t\t\tBindingFlags Flags =  BindingFlags.FlattenHierarchy |  BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static;\r\n\t\t\t\tt.GetField (\"graphicsVersion\", Flags).SetValue (null, GameSettings.GraphicsType.D3D11);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/Utilities/EVE/EVEReflectionHandler.cs",
    "content": "using System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Reflection;\r\nusing UnityEngine;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic struct EVECloudLayer\r\n\t{\r\n\t\tpublic object CloudObject;\r\n\t\tpublic Material Clouds2dMaterial;\r\n\t\tpublic MeshRenderer Clouds2dMeshRenderer;\r\n\t\tpublic Material CloudShadowMaterial;\r\n\t\tpublic Material ParticleVolumetricsMaterial;\r\n\t}\r\n\r\n\tpublic class EVEReflectionHandler\r\n\t{\r\n\t\tpublic Dictionary<String, List<EVECloudLayer>> EVECloudLayers = new Dictionary<String, List<EVECloudLayer>>();\r\n\r\n\t\tpublic object EVEInstance;\r\n\t\tprivate EventVoid onCloudsApplyEvent;\r\n\r\n\t\tprivate const BindingFlags flags = BindingFlags.FlattenHierarchy | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static;\r\n\r\n\t\tpublic EVEReflectionHandler ()\r\n\t\t{\r\n\t\t}\r\n\r\n\t\tpublic void Start()\r\n\t\t{\r\n\t\t\tMapEVEClouds ();\r\n\t\t}\r\n\r\n\t\tpublic void MapEVEClouds()\r\n        {\r\n            Utils.LogDebug(\"Mapping EVE clouds\");\r\n\r\n            CleanUp();\r\n            EVECloudLayers.Clear();\r\n\r\n            Type EVEType = null;\r\n\r\n            if (!GetEVETypeAndInstance(ref EVEType, ref EVEInstance))\r\n                return;\r\n\r\n\t\t\tGetOnApplyEvent(ref EVEType);\r\n\r\n\t\t\tIList objectList = EVEType.GetField(\"ObjectList\", flags).GetValue(EVEInstance) as IList;\r\n\r\n            foreach (object cloudObject in objectList)\r\n            {\r\n                String body = cloudObject.GetType().GetField(\"body\", flags).GetValue(cloudObject) as String;\r\n\r\n\t\t\t\tEVECloudLayer cloudLayer = new EVECloudLayer();\r\n\t\t\t\tcloudLayer.CloudObject = cloudObject;\r\n\r\n\t\t\t\tMap2DLayer(ref cloudLayer, cloudObject, body);\r\n\t\t\t\tMapParticleVolumetrics(ref cloudLayer, cloudObject, body);\r\n\r\n\t\t\t\tif (EVECloudLayers.ContainsKey(body))\r\n                {\r\n                    EVECloudLayers[body].Add(cloudLayer);\r\n                }\r\n                else\r\n                {\r\n                    List<EVECloudLayer> cloudsList = new List<EVECloudLayer>() { cloudLayer };\r\n                    EVECloudLayers.Add(body, cloudsList);\r\n                }\r\n\t\t\t}\r\n        }\r\n\r\n\t\tprivate void Map2DLayer(ref EVECloudLayer cloudLayer, object cloudObject, string body)\r\n        {\r\n\t\t\tobject cloud2dObj;\r\n\t\t\tif (HighLogic.LoadedScene == GameScenes.MAINMENU)\r\n\t\t\t{\r\n\t\t\t\tobject cloudsPQS = cloudObject.GetType().GetField(\"cloudsPQS\", flags).GetValue(cloudObject) as object;\r\n\r\n\t\t\t\tif (cloudsPQS == null)\r\n\t\t\t\t{\r\n\t\t\t\t\tUtils.LogDebug(\"cloudsPQS not found for layer on planet :\" + body);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tcloud2dObj = cloudsPQS.GetType().GetField(\"mainMenuLayer\", flags).GetValue(cloudsPQS) as object;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tcloud2dObj = cloudObject.GetType().GetField(\"layer2D\", flags).GetValue(cloudObject) as object;\r\n\t\t\t}\r\n\r\n\t\t\tif (cloud2dObj != null)\r\n\t\t\t{\r\n\t\t\t\tGameObject cloudmesh = cloud2dObj.GetType().GetField(\"CloudMesh\", flags).GetValue(cloud2dObj) as GameObject;\r\n\t\t\t\tif (cloudmesh == null)\r\n\t\t\t\t{\r\n\t\t\t\t\tUtils.LogDebug(\"cloudmesh null\");\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tMaterial shadowMaterial = null;\r\n\r\n\t\t\t\tobject screenSpaceShadow = null;\r\n\r\n\t\t\t\ttry\r\n\t\t\t\t{\r\n\t\t\t\t\tscreenSpaceShadow = cloud2dObj.GetType().GetField(\"screenSpaceShadow\", flags).GetValue(cloud2dObj) as object;\r\n\t\t\t\t}\r\n\t\t\t\tcatch (Exception) { }\r\n\r\n\t\t\t\tif (screenSpaceShadow != null)\r\n\t\t\t\t{\r\n\t\t\t\t\tshadowMaterial = screenSpaceShadow.GetType().GetField(\"material\", flags).GetValue(screenSpaceShadow) as Material;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tProjector shadowProjector = cloud2dObj.GetType().GetField(\"ShadowProjector\", flags).GetValue(cloud2dObj) as Projector;\r\n\r\n\t\t\t\t\tif (shadowProjector != null && shadowProjector.material != null)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tshadowMaterial = shadowProjector.material;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcloudLayer.Clouds2dMeshRenderer = cloudmesh.GetComponent<MeshRenderer>();\r\n\t\t\t\tcloudLayer.Clouds2dMaterial = cloudLayer.Clouds2dMeshRenderer.material;\r\n\t\t\t\tcloudLayer.CloudShadowMaterial = shadowMaterial;\r\n\r\n\t\t\t\tcloudLayer.Clouds2dMaterial.renderQueue = 2999; //fix for EVE cloud renderqueue, TODO: check if outdated and remove it\r\n\r\n\t\t\t\tUtils.LogDebug(\"Detected EVE 2d cloud layer for planet: \" + body);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate void MapParticleVolumetrics(ref EVECloudLayer cloudLayer, object cloudObject, string body)\r\n\t\t{\r\n\t\t\ttry\r\n\t\t\t{\r\n\t\t\t\tobject cloudsPQS = cloudObject.GetType().GetField(\"cloudsPQS\", flags)?.GetValue(cloudObject) as object;\r\n\t\t\t\tobject layerVolume = cloudsPQS?.GetType().GetField(\"layerVolume\", flags)?.GetValue(cloudsPQS) as object;\r\n\t\t\t\tif (layerVolume == null)\r\n\t\t\t\t{\r\n\t\t\t\t\tUtils.LogDebug(\"No particle volumetric cloud for layer on planet: \" + body);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tMaterial ParticleMaterial = layerVolume.GetType().GetField(\"ParticleMaterial\", flags)?.GetValue(layerVolume) as Material;\r\n\r\n\t\t\t\tif (ParticleMaterial == null)\r\n\t\t\t\t{\r\n\t\t\t\t\tUtils.LogDebug(\"Particle volumetric cloud has no material on planet: \" + body);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcloudLayer.ParticleVolumetricsMaterial = ParticleMaterial;\r\n\t\t\t\tUtils.LogDebug(\"Particle volumetric cloud mapped for layer on planet: \" + body);\r\n\t\t\t}\r\n\t\t\tcatch (Exception stupid)\r\n\t\t\t{\r\n\t\t\t\tUtils.LogDebug(\"Particle volumetric clouds error on planet: \" + body + stupid.ToString());\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void invokeClouds2dReassign(string celestialBodyName)\r\n\t\t{\t\r\n\t\t\tforeach (var cloudLayer in EVECloudLayers[celestialBodyName])\r\n\t\t\t{\r\n\t\t\t\tif (cloudLayer.CloudObject != null)\r\n\t\t\t\t{ \r\n\t\t\t\t\tobject cloud2dObj = cloudLayer.CloudObject.GetType ().GetField (\"layer2D\", flags).GetValue (cloudLayer.CloudObject) as object;\r\n\t\t\t\t\tif (cloud2dObj == null) {\r\n\t\t\t\t\t\tUtils.LogDebug (\" layer2d not found for layer on planet: \" + celestialBodyName);\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t\tbool cloud2dScaled = (bool)cloud2dObj.GetType ().GetField (\"isScaled\", flags).GetValue (cloud2dObj);\r\n\t\t\t\t\r\n\t\t\t\t\tMethodInfo scaledGetter = cloud2dObj.GetType ().GetProperty (\"Scaled\").GetGetMethod ();\r\n\t\t\t\t\tMethodInfo scaledSetter = cloud2dObj.GetType ().GetProperty (\"Scaled\").GetSetMethod ();\r\n\t\t\t\t\r\n\t\t\t\t\t//if in scaled mode, switch it to local then back to scaled, to set all the properties\r\n\t\t\t\t\tif (cloud2dScaled)\r\n\t\t\t\t\t\tscaledSetter.Invoke (cloud2dObj, new object[] { !cloud2dScaled });\r\n\t\t\t\t\r\n\t\t\t\t\tscaledSetter.Invoke (cloud2dObj, new object[] { cloud2dScaled });\r\n\r\n\t\t\t\t\t//set the radius for use in the scatterer shader to have smooth scattering\r\n\t\t\t\t\tfloat radius = (float) cloud2dObj.GetType ().GetField (\"radius\", flags).GetValue (cloud2dObj);\r\n\t\t\t\t\tGameObject cloudmesh = cloud2dObj.GetType().GetField(\"CloudMesh\", flags).GetValue(cloud2dObj) as GameObject;\r\n\t\t\t\t\tcloudmesh.GetComponent < MeshRenderer > ().material.SetFloat(\"_Radius\",radius);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate bool GetEVETypeAndInstance(ref Type type, ref object instance)\r\n\t\t{\r\n\t\t\ttype = ReflectionUtils.getType(\"Atmosphere.CloudsManager\");\r\n\r\n\t\t\tif (type == null)\r\n\t\t\t{\r\n\t\t\t\tUtils.LogDebug(\"Eve assembly type not found\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tUtils.LogDebug(\"Eve assembly version: \" + type.Assembly.GetName().ToString());\r\n\r\n\t\t\ttry\r\n\t\t\t{\r\n\t\t\t\tinstance = type.GetField(\"instance\", flags).GetValue(null);\r\n\t\t\t}\r\n\t\t\tcatch (Exception)\r\n\t\t\t{\r\n\t\t\t\tUtils.LogDebug(\"No EVE Instance found\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif (instance == null)\r\n\t\t\t{\r\n\t\t\t\tUtils.LogError(\"Failed grabbing EVE Instance\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tUtils.LogInfo(\"Successfully grabbed EVE Instance\");\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tprivate void GetOnApplyEvent(ref Type EVEType)\r\n\t\t{\r\n\t\t\ttry\r\n\t\t\t{\r\n\t\t\t\tonCloudsApplyEvent = EVEType.GetField(\"onApply\", flags).GetValue(EVEInstance) as EventVoid;\r\n\r\n\t\t\t\tif (onCloudsApplyEvent != null)\r\n\t\t\t\t{\r\n\t\t\t\t\tonCloudsApplyEvent.Add(Scatterer.Instance.TriggerOnCloudReapplied);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcatch (Exception)\r\n\t\t\t{\r\n\t\t\t\tUtils.LogDebug(\"No EVE onCloudsApplyEvent found\");\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void OnCloudsReapplied()\r\n\t\t{\r\n\t\t\tMapEVEClouds();\r\n\r\n\t\t\tforeach (ScattererCelestialBody _cel in Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies)\r\n\t\t\t{\r\n\t\t\t\tif (_cel.active)\r\n\t\t\t\t{\r\n\t\t\t\t\t_cel.prolandManager.skyNode.InitEVEClouds();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tScatterer.Instance.OnRenderTexturesLost(); // to recreate any ocean stuck with old cloud shadows\r\n\t\t}\r\n\r\n\t\tpublic void CleanUp()\r\n        {\r\n\t\t\tif (onCloudsApplyEvent != null)\r\n\t\t\t\tonCloudsApplyEvent.Remove(Scatterer.Instance.TriggerOnCloudReapplied);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/Utilities/Math/MathUtility.cs",
    "content": "﻿using UnityEngine;\r\nusing System;\r\n\r\npublic class MathUtility \r\n{\r\n\r\n\tpublic static readonly double Rad2Deg = 180.0 / Math.PI;\r\n\tpublic static readonly double Deg2Rad = Math.PI / 180.0;\r\n\t\r\n\tpublic static double Safe_Acos(double r)\r\n\t{\r\n\t\treturn Math.Acos(Math.Min(1.0,Math.Max(-1.0,r)));\t\r\n\t}\r\n\r\n\tpublic static double Safe_Asin(double r)\r\n\t{\r\n\t\treturn Math.Asin(Math.Min(1.0,Math.Max(-1.0,r)));\t\r\n\t}\r\n\r\n\tpublic static float Safe_Acos(float r)\r\n\t{\r\n\t\treturn Mathf.Acos(Mathf.Min(1.0f,Mathf.Max(-1.0f,r)));\t\r\n\t}\r\n\t\r\n\tpublic static float Safe_Asin(float r)\r\n\t{\r\n\t\treturn Mathf.Asin(Mathf.Min(1.0f,Mathf.Max(-1.0f,r)));\t\r\n\t}\r\n\t\r\n\tpublic static bool IsFinite(float f)\r\n\t{\r\n\t\treturn !(float.IsInfinity(f) || float.IsNaN(f));\t\t\r\n\t}\r\n\r\n\tpublic static bool IsFinite(double f)\r\n\t{\r\n\t\treturn !(double.IsInfinity(f) || double.IsNaN(f));\t\t\r\n\t}\r\n\r\n\tpublic static double HorizontalFovToVerticalFov(double hfov, double screenWidth, double screenHeight)\r\n\t{\r\n\t\treturn 2.0 * Math.Atan( Math.Tan(hfov*0.5*Deg2Rad) * screenHeight/screenWidth ) * Rad2Deg;\r\n\t}\r\n\r\n\tpublic static double VerticalFovToHorizontalFov(double vfov, double screenWidth, double screenHeight)\r\n\t{\r\n\t\treturn 2.0 * Math.Atan( Math.Tan(vfov*0.5*Deg2Rad) * screenWidth/screenHeight ) * Rad2Deg;\r\n\t}\r\n\r\n\tprivate static bool USE_LAST = false;\r\n\tprivate static float Y2;\r\n\r\n\tpublic static void ResetGRandom() {\r\n\t\tUSE_LAST = false;\r\n\t}\r\n\r\n\tpublic static float GRandom(float mean, float stdDeviation)\r\n\t{\r\n\t\tfloat x1, x2, w, y1;\r\n\t\t\r\n\t\tif(USE_LAST) \r\n\t\t{\r\n\t\t\ty1 = Y2;\r\n\t\t\tUSE_LAST = false;\r\n\t\t} \r\n\t\telse \r\n\t\t{\r\n\t\t\tdo \r\n\t\t\t{\r\n\t\t\t\tx1 = 2.0f *  UnityEngine.Random.value - 1.0f;\r\n\t\t\t\tx2 = 2.0f * UnityEngine.Random.value - 1.0f;\r\n\t\t\t\tw  = x1 * x1 + x2 * x2;\r\n\t\t\t} \r\n\t\t\twhile (w >= 1.0f);\r\n\r\n\t\t\tw  = Mathf.Sqrt((-2.0f * Mathf.Log(w)) / w);\r\n\t\t\ty1 = x1 * w;\r\n\t\t\tY2 = x2 * w;\r\n\t\t\tUSE_LAST = true;\r\n\t\t}\r\n\r\n\t\treturn mean + y1 * stdDeviation;\r\n\t}\r\n\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "scatterer/Utilities/Math/Matrix3x3.cs",
    "content": "﻿\r\nusing UnityEngine;\r\n\r\npublic class Matrix3x3  \r\n{\r\n\t//Members varibles\r\n\t\r\n\tpublic float[,] m = new float[3,3];\r\n\t\r\n\t//Constructors\r\n\t\r\n\tpublic Matrix3x3() {}\r\n\t\r\n\tpublic Matrix3x3(float m00, float m01, float m02,\r\n\t                 float m10, float m11, float m12,\r\n\t                 float m20, float m21, float m22)\r\n\t{\r\n\t\tm[0,0] = m00; m[0,1] = m01; m[0,2] = m02;\r\n\t\tm[1,0] = m10; m[1,1] = m11; m[1,2] = m12;\r\n\t\tm[2,0] = m20; m[2,1] = m21; m[2,2] = m22;\r\n\t\t\r\n\t}\r\n\t\r\n\tpublic Matrix3x3(float[,] m)\r\n\t{\r\n\t\tSystem.Array.Copy(m, this.m, 9);\r\n\t}\r\n\t\r\n\tpublic Matrix3x3(Matrix3x3 m)\r\n\t{\r\n\t\tSystem.Array.Copy(m.m, this.m, 9);\r\n\t}\r\n\t\r\n\t//Operator Overloads\r\n\t\r\n\tpublic static Matrix3x3 operator +(Matrix3x3 m1, Matrix3x3 m2) \r\n\t{\r\n\t\tMatrix3x3 kSum = new Matrix3x3();\r\n\t\tfor (int iRow = 0; iRow < 3; iRow++) {\r\n\t\t\tfor (int iCol = 0; iCol < 3; iCol++) {\r\n\t\t\t\tkSum.m[iRow,iCol] = m1.m[iRow,iCol] + m2.m[iRow,iCol];\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn kSum;\r\n\t}\r\n\t\r\n\tpublic static Matrix3x3 operator -(Matrix3x3 m1, Matrix3x3 m2) \r\n\t{\r\n\t\tMatrix3x3 kSum = new Matrix3x3();\r\n\t\tfor (int iRow = 0; iRow < 3; iRow++) {\r\n\t\t\tfor (int iCol = 0; iCol < 3; iCol++) {\r\n\t\t\t\tkSum.m[iRow,iCol] = m1.m[iRow,iCol] - m2.m[iRow,iCol];\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn kSum;\r\n\t}\r\n\t\r\n\tpublic static Matrix3x3 operator *(Matrix3x3 m1, Matrix3x3 m2) \r\n\t{\r\n\t\tMatrix3x3 kProd = new Matrix3x3();\r\n\t\tfor (int iRow = 0; iRow < 3; iRow++) {\r\n\t\t\tfor (int iCol = 0; iCol < 3; iCol++) {\r\n\t\t\t\tkProd.m[iRow,iCol] = m1.m[iRow,0] * m2.m[0,iCol] + \r\n\t\t\t\t\tm1.m[iRow,1] * m2.m[1,iCol] + \r\n\t\t\t\t\t\tm1.m[iRow,2] * m2.m[2,iCol];\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn kProd;\r\n\t}\r\n\t\r\n\tpublic static Vector3 operator *(Matrix3x3 m, Vector3 v)\r\n\t{\r\n\t\tVector3 kProd = new Vector3();\r\n\t\t\r\n\t\tkProd.x = m.m[0,0] * v.x + m.m[0,1] * v.y + m.m[0,2] * v.z;\r\n\t\tkProd.y = m.m[1,0] * v.x + m.m[1,1] * v.y + m.m[1,2] * v.z;\r\n\t\tkProd.z = m.m[2,0] * v.x + m.m[2,1] * v.y + m.m[2,2] * v.z;\r\n\t\t\r\n\t\treturn kProd;\r\n\t}\r\n\t\r\n\tpublic static Matrix3x3 operator *(Matrix3x3 m, float s)\r\n\t{\r\n\t\tMatrix3x3 kProd = new Matrix3x3();\r\n\t\tfor (int iRow = 0; iRow < 3; iRow++) {\r\n\t\t\tfor (int iCol = 0; iCol < 3; iCol++) {\r\n\t\t\t\tkProd.m[iRow,iCol] = m.m[iRow,iCol] * s;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn kProd;\r\n\t}\r\n\t\r\n\t//Functions\r\n\t\r\n\tpublic override string ToString()\r\n\t{\r\n\t\treturn  m[0,0] + \",\" + m[0,1] + \",\" + m[0,2] + \"\\n\" + \r\n\t\t\t\tm[1,0] + \",\" + m[1,1] + \",\" + m[1,2] + \"\\n\" + \r\n\t\t\t\tm[2,0] + \",\" + m[2,1] + \",\" + m[2,2];\r\n\t}\r\n\t\r\n\tpublic Matrix3x3 Transpose()\r\n\t{\r\n\t\tMatrix3x3 kTranspose = new Matrix3x3();\r\n\t\tfor (int iRow = 0; iRow < 3; iRow++) {\r\n\t\t\tfor (int iCol = 0; iCol < 3; iCol++) {\r\n\t\t\t\tkTranspose.m[iRow,iCol] = m[iCol,iRow];\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn kTranspose;\r\n\t}\r\n\t\r\n\tprivate float Determinant()\r\n\t{\r\n\t\tfloat fCofactor00 = m[1,1] * m[2,2] - m[1,2] * m[2,1];\r\n\t\tfloat fCofactor10 = m[1,2] * m[2,0] - m[1,0] * m[2,2];\r\n\t\tfloat fCofactor20 = m[1,0] * m[2,1] - m[1,1] * m[2,0];\r\n\t\t\r\n\t\tfloat fDet = m[0,0] * fCofactor00 + m[0,1] * fCofactor10 + m[0,2] * fCofactor20;\r\n\t\t\r\n\t\treturn fDet;\r\n\t}\r\n\t\r\n\t//public bool Inverse(ref Matrix3x3 mInv, float tolerance = 1e-06f)\r\n\tpublic bool Inverse(ref Matrix3x3 mInv, float tolerance)\r\n\t{\r\n\t\t// Invert a 3x3 using cofactors.  This is about 8 times faster than\r\n\t\t// the Numerical Recipes code which uses Gaussian elimination.\r\n\t\tmInv.m[0,0] = m[1,1] * m[2,2] - m[1,2] * m[2,1];\r\n\t\tmInv.m[0,1] = m[0,2] * m[2,1] - m[0,1] * m[2,2];\r\n\t\tmInv.m[0,2] = m[0,1] * m[1,2] - m[0,2] * m[1,1];\r\n\t\tmInv.m[1,0] = m[1,2] * m[2,0] - m[1,0] * m[2,2];\r\n\t\tmInv.m[1,1] = m[0,0] * m[2,2] - m[0,2] * m[2,0];\r\n\t\tmInv.m[1,2] = m[0,2] * m[1,0] - m[0,0] * m[1,2];\r\n\t\tmInv.m[2,0] = m[1,0] * m[2,1] - m[1,1] * m[2,0];\r\n\t\tmInv.m[2,1] = m[0,1] * m[2,0] - m[0,0] * m[2,1];\r\n\t\tmInv.m[2,2] = m[0,0] * m[1,1] - m[0,1] * m[1,0];\r\n\t\t\r\n\t\tfloat fDet = m[0,0] * mInv.m[0,0] + m[0,1] * mInv.m[1,0] + m[0,2] * mInv.m[2,0];\r\n\t\t\r\n\t\tif (System.Math.Abs(fDet) <= tolerance) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\t\r\n\t\tfloat fInvDet = 1.0f / fDet;\r\n\t\t\r\n\t\tfor (int iRow = 0; iRow < 3; iRow++) {\r\n\t\t\tfor (int iCol = 0; iCol < 3; iCol++)\r\n\t\t\t\tmInv.m[iRow,iCol] *= fInvDet;\r\n\t\t}\r\n\t\t\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\t//public Matrix3x3 Inverse(float tolerance = 1e-06f)\r\n\tpublic Matrix3x3 Inverse(float tolerance)\r\n\t{\r\n\t\tMatrix3x3 kInverse = new Matrix3x3();\r\n\t\tInverse(ref kInverse, tolerance);\r\n\t\treturn kInverse;\r\n\t}\r\n\t\r\n\tpublic Vector3d2 GetColumn(int iCol)\r\n\t{\r\n\t\treturn new Vector3d2(m[0,iCol], m[1,iCol], m[2,iCol]);\r\n\t}\r\n\t\r\n\tpublic void SetColumn(int iCol, Vector3 v)\r\n\t{\r\n\t\tm[0,iCol] = v.x;\r\n\t\tm[1,iCol] = v.y;\r\n\t\tm[2,iCol] = v.z;\r\n\t}\r\n\t\r\n\tpublic Vector3d2 GetRow(int iRow)\r\n\t{\r\n\t\treturn new Vector3d2(m[iRow,0], m[iRow,1], m[iRow,2]);\r\n\t}\r\n\t\r\n\tpublic void SetRow(int iRow, Vector3 v)\r\n\t{\r\n\t\tm[iRow,0] = v.x;\r\n\t\tm[iRow,1] = v.y;\r\n\t\tm[iRow,2] = v.z;\r\n\t}\r\n\r\n\tpublic Matrix4x4 ToMatrix4x4()\r\n\t{\r\n\t\tMatrix4x4 mat = new Matrix4x4();\r\n\t\t\r\n\t\tmat.m00 = m[0,0]; mat.m01 = m[0,1]; mat.m02 = m[0,2];\r\n\t\tmat.m10 = m[1,0]; mat.m11 = m[1,1]; mat.m12 = m[1,2];\r\n\t\tmat.m20 = m[2,0]; mat.m21 = m[2,1]; mat.m22 = m[2,2];\r\n\t\t\r\n\t\treturn mat;\r\n\t}\r\n\r\n\tstatic public Matrix3x3 Rotate(Vector3 rotation)\r\n\t{\r\n\t\tQuat x = new Quat(new Vector3d2(1,0,0), rotation.x * MathUtility.Deg2Rad );\r\n\t\tQuat y = new Quat(new Vector3d2(0,1,0), rotation.y * MathUtility.Deg2Rad );\r\n\t\tQuat z = new Quat(new Vector3d2(0,0,1), rotation.z * MathUtility.Deg2Rad );\r\n\t\t\r\n\t\treturn (z*y*x).ToMatrix3x3();\r\n\t}\r\n\r\n\tstatic public Matrix3x3 Identity()\r\n\t{\r\n\t\treturn new Matrix3x3(1,0,0,0,1,0,0,0,1);\r\n\t}\r\n\t\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "scatterer/Utilities/Math/Matrix3x3d.cs",
    "content": "﻿\r\nusing UnityEngine;\r\n\r\npublic class Matrix3x3d  \r\n{\r\n\t//Members varibles\r\n\t\r\n\tpublic double[,] m = new double[3,3];\r\n\t\r\n\t//Constructors\r\n\t\r\n\tpublic Matrix3x3d() {}\r\n\t\r\n\tpublic Matrix3x3d(double m00, double m01, double m02,\r\n\t\t\t\t\t  double m10, double m11, double m12,\r\n\t\t\t\t\t  double m20, double m21, double m22)\r\n\t{\r\n\t\tm[0,0] = m00; m[0,1] = m01; m[0,2] = m02;\r\n\t\tm[1,0] = m10; m[1,1] = m11; m[1,2] = m12;\r\n\t\tm[2,0] = m20; m[2,1] = m21; m[2,2] = m22;\r\n\r\n\t}\r\n\t\r\n\tpublic Matrix3x3d(double[,] m)\r\n\t{\r\n\t\tSystem.Array.Copy(m, this.m, 9);\r\n\t}\r\n\t\r\n\tpublic Matrix3x3d(Matrix3x3d m)\r\n\t{\r\n\t\tSystem.Array.Copy(m.m, this.m, 9);\r\n\t}\r\n\t\r\n\t//Operator Overloads\r\n\t\r\n\tpublic static Matrix3x3d operator +(Matrix3x3d m1, Matrix3x3d m2) \r\n   \t{\r\n\t\tMatrix3x3d kSum = new Matrix3x3d();\r\n\t\tfor (int iRow = 0; iRow < 3; iRow++) {\r\n\t\t\tfor (int iCol = 0; iCol < 3; iCol++) {\r\n\t\t    \tkSum.m[iRow,iCol] = m1.m[iRow,iCol] + m2.m[iRow,iCol];\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn kSum;\r\n   \t}\r\n\t\r\n\tpublic static Matrix3x3d operator -(Matrix3x3d m1, Matrix3x3d m2) \r\n   \t{\r\n\t\tMatrix3x3d kSum = new Matrix3x3d();\r\n\t\tfor (int iRow = 0; iRow < 3; iRow++) {\r\n\t\t\tfor (int iCol = 0; iCol < 3; iCol++) {\r\n\t\t    \tkSum.m[iRow,iCol] = m1.m[iRow,iCol] - m2.m[iRow,iCol];\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn kSum;\r\n   \t}\r\n\t\r\n\tpublic static Matrix3x3d operator *(Matrix3x3d m1, Matrix3x3d m2) \r\n   \t{\r\n\t\tMatrix3x3d kProd = new Matrix3x3d();\r\n\t\tfor (int iRow = 0; iRow < 3; iRow++) {\r\n\t\t\tfor (int iCol = 0; iCol < 3; iCol++) {\r\n\t\t    \tkProd.m[iRow,iCol] = m1.m[iRow,0] * m2.m[0,iCol] + \r\n\t\t\t\t\t\t\t\t\t m1.m[iRow,1] * m2.m[1,iCol] + \r\n\t\t\t\t\t\t\t\t\t m1.m[iRow,2] * m2.m[2,iCol];\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn kProd;\r\n   \t}\r\n\t\r\n\tpublic static Vector3d2 operator *(Matrix3x3d m, Vector3d2 v)\r\n\t{\r\n\t    Vector3d2 kProd = new Vector3d2();\r\n\t  \r\n\t    kProd.x = m.m[0,0] * v.x + m.m[0,1] * v.y + m.m[0,2] * v.z;\r\n\t\tkProd.y = m.m[1,0] * v.x + m.m[1,1] * v.y + m.m[1,2] * v.z;\r\n\t\tkProd.z = m.m[2,0] * v.x + m.m[2,1] * v.y + m.m[2,2] * v.z;\r\n\t\t\r\n\t    return kProd;\r\n\t}\r\n\t\r\n\tpublic static Matrix3x3d operator *(Matrix3x3d m, double s)\r\n\t{\r\n\t\tMatrix3x3d kProd = new Matrix3x3d();\r\n\t\tfor (int iRow = 0; iRow < 3; iRow++) {\r\n\t\t\tfor (int iCol = 0; iCol < 3; iCol++) {\r\n\t\t    \tkProd.m[iRow,iCol] = m.m[iRow,iCol] * s;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn kProd;\r\n\t}\r\n\t\r\n\t//Functions\r\n\t\r\n\tpublic override string ToString()\r\n   \t{\r\n\t\treturn  m[0,0] + \",\" + m[0,1] + \",\" + m[0,2] + \"\\n\" + \r\n\t\t\t\tm[1,0] + \",\" + m[1,1] + \",\" + m[1,2] + \"\\n\" + \r\n\t\t\t\tm[2,0] + \",\" + m[2,1] + \",\" + m[2,2];\r\n   \t}\r\n\t\r\n\tpublic Matrix3x3d Transpose()\r\n\t{\r\n\t    Matrix3x3d kTranspose = new Matrix3x3d();\r\n\t    for (int iRow = 0; iRow < 3; iRow++) {\r\n\t        for (int iCol = 0; iCol < 3; iCol++) {\r\n\t            kTranspose.m[iRow,iCol] = m[iCol,iRow];\r\n\t        }\r\n\t    }\r\n\t    return kTranspose;\r\n\t}\r\n\t\r\n\tprivate double Determinant()\r\n\t{\r\n\t    double fCofactor00 = m[1,1] * m[2,2] - m[1,2] * m[2,1];\r\n\t    double fCofactor10 = m[1,2] * m[2,0] - m[1,0] * m[2,2];\r\n\t    double fCofactor20 = m[1,0] * m[2,1] - m[1,1] * m[2,0];\r\n\t\t\r\n\t    double fDet = m[0,0] * fCofactor00 + m[0,1] * fCofactor10 + m[0,2] * fCofactor20;\r\n\t\t\r\n\t    return fDet;\r\n\t}\r\n\t\r\n\t//public bool Inverse(ref Matrix3x3d mInv, double tolerance = 1e-06)\r\n\tpublic bool Inverse(ref Matrix3x3d mInv, double tolerance)\r\n\t{\r\n\t    // Invert a 3x3 using cofactors.  This is about 8 times faster than\r\n\t    // the Numerical Recipes code which uses Gaussian elimination.\r\n\t    mInv.m[0,0] = m[1,1] * m[2,2] - m[1,2] * m[2,1];\r\n\t    mInv.m[0,1] = m[0,2] * m[2,1] - m[0,1] * m[2,2];\r\n\t    mInv.m[0,2] = m[0,1] * m[1,2] - m[0,2] * m[1,1];\r\n\t    mInv.m[1,0] = m[1,2] * m[2,0] - m[1,0] * m[2,2];\r\n\t    mInv.m[1,1] = m[0,0] * m[2,2] - m[0,2] * m[2,0];\r\n\t    mInv.m[1,2] = m[0,2] * m[1,0] - m[0,0] * m[1,2];\r\n\t    mInv.m[2,0] = m[1,0] * m[2,1] - m[1,1] * m[2,0];\r\n\t    mInv.m[2,1] = m[0,1] * m[2,0] - m[0,0] * m[2,1];\r\n\t    mInv.m[2,2] = m[0,0] * m[1,1] - m[0,1] * m[1,0];\r\n\t\t\r\n\t    double fDet = m[0,0] * mInv.m[0,0] + m[0,1] * mInv.m[1,0] + m[0,2] * mInv.m[2,0];\r\n\t\t\r\n\t    if (System.Math.Abs(fDet) <= tolerance) {\r\n\t        return false;\r\n\t    }\r\n\t\t\r\n\t    double fInvDet = 1.0 / fDet;\r\n\t\t\r\n\t    for (int iRow = 0; iRow < 3; iRow++) {\r\n\t        for (int iCol = 0; iCol < 3; iCol++)\r\n\t            mInv.m[iRow,iCol] *= fInvDet;\r\n\t    }\r\n\t\t\r\n\t    return true;\r\n\t}\r\n\t\r\n\t//public Matrix3x3d Inverse(double tolerance = 1e-06)\r\n\tpublic Matrix3x3d Inverse(double tolerance)\r\n\t{\r\n\t    Matrix3x3d kInverse = new Matrix3x3d();\r\n\t    Inverse(ref kInverse, tolerance);\r\n\t    return kInverse;\r\n\t}\r\n\t\r\n\tpublic Vector3d2 GetColumn(int iCol)\r\n\t{\r\n\t    return new Vector3d2(m[0,iCol], m[1,iCol], m[2,iCol]);\r\n\t}\r\n\r\n\tpublic void SetColumn(int iCol, Vector3d2 v)\r\n\t{\r\n\t    m[0,iCol] = v.x;\r\n\t    m[1,iCol] = v.y;\r\n\t    m[2,iCol] = v.z;\r\n\t}\r\n\t\r\n\tpublic Vector3d2 GetRow(int iRow)\r\n\t{\r\n\t    return new Vector3d2(m[iRow,0], m[iRow,1], m[iRow,2]);\r\n\t}\r\n\r\n\tpublic void SetRow(int iRow, Vector3d2 v)\r\n\t{\r\n\t    m[iRow,0] = v.x;\r\n\t    m[iRow,1] = v.y;\r\n\t    m[iRow,2] = v.z;\r\n\t}\r\n\r\n\tpublic Matrix4x4d ToMatrix4x4d()\r\n\t{\r\n\t\treturn new Matrix4x4d(m[0,0], m[0,1], m[0,2], 0.0,\r\n\t\t                      m[1,0], m[1,1], m[1,2], 0.0,\r\n\t\t                      m[2,0], m[2,1], m[2,2], 0.0,\r\n\t\t                      0.0, 0.0, 0.0, 0.0);\r\n\t}\r\n\r\n\tpublic Matrix4x4 ToMatrix4x4()\r\n\t{\r\n\t\tMatrix4x4 mat = new Matrix4x4();\r\n\t\t\r\n\t\tmat.m00 = (float)m[0,0]; mat.m01 = (float)m[0,1]; mat.m02 = (float)m[0,2];\r\n\t\tmat.m10 = (float)m[1,0]; mat.m11 = (float)m[1,1]; mat.m12 = (float)m[1,2];\r\n\t\tmat.m20 = (float)m[2,0]; mat.m21 = (float)m[2,1]; mat.m22 = (float)m[2,2];\r\n\t\t\r\n\t\treturn mat;\r\n\t}\r\n\t\r\n\tstatic public Matrix3x3d Identity()\r\n\t{\r\n\t\treturn new Matrix3x3d(1,0,0,0,1,0,0,0,1);\r\n\t}\r\n\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "scatterer/Utilities/Math/Matrix4x4d.cs",
    "content": "﻿\r\nusing UnityEngine;\r\n\r\n#pragma warning disable 660, 661\r\n\r\npublic class Matrix4x4d  \r\n{\r\n\t//Members varibles\r\n\t\r\n\tpublic double[,] m = new double[4,4];\r\n\t\r\n\t//Constructors\r\n\t\r\n\tpublic Matrix4x4d() {}\r\n\t\r\n\tpublic Matrix4x4d(double m00, double m01, double m02, double m03,\r\n\t\t\t\t\t  double m10, double m11, double m12, double m13,\r\n\t\t\t\t\t  double m20, double m21, double m22, double m23,\r\n\t\t\t\t\t  double m30, double m31, double m32, double m33)\r\n\t{\r\n\t\tm[0,0] = m00; m[0,1] = m01; m[0,2] = m02; m[0,3] = m03;\r\n\t\tm[1,0] = m10; m[1,1] = m11; m[1,2] = m12; m[1,3] = m13;\r\n\t\tm[2,0] = m20; m[2,1] = m21; m[2,2] = m22; m[2,3] = m23;\r\n\t\tm[3,0] = m30; m[3,1] = m31; m[3,2] = m32; m[3,3] = m33;\r\n\r\n\t}\r\n\t\r\n\tpublic Matrix4x4d(Matrix4x4 mat)\r\n\t{\r\n\t\tm[0,0] = mat.m00; m[0,1] = mat.m01; m[0,2] = mat.m02; m[0,3] = mat.m03;\r\n\t\tm[1,0] = mat.m10; m[1,1] = mat.m11; m[1,2] = mat.m12; m[1,3] = mat.m13;\r\n\t\tm[2,0] = mat.m20; m[2,1] = mat.m21; m[2,2] = mat.m22; m[2,3] = mat.m23;\r\n\t\tm[3,0] = mat.m30; m[3,1] = mat.m31; m[3,2] = mat.m32; m[3,3] = mat.m33;\r\n\r\n\t}\r\n\t\r\n\tpublic Matrix4x4d(double[,] m)\r\n\t{\r\n\t\tSystem.Array.Copy(m, this.m, 16);\r\n\t}\r\n\t\r\n\tpublic Matrix4x4d(Matrix4x4d m)\r\n\t{\r\n\t\tSystem.Array.Copy(m.m, this.m, 16);\r\n\t}\r\n\t\r\n\t//Operator Overloads\r\n\t\r\n\tpublic static Matrix4x4d operator +(Matrix4x4d m1, Matrix4x4d m2) \r\n   \t{\r\n\t\tMatrix4x4d kSum = new Matrix4x4d();\r\n\t\tfor (int iRow = 0; iRow < 4; iRow++) {\r\n\t\t\tfor (int iCol = 0; iCol < 4; iCol++) {\r\n\t\t    \tkSum.m[iRow,iCol] = m1.m[iRow,iCol] + m2.m[iRow,iCol];\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn kSum;\r\n   \t}\r\n\t\r\n\tpublic static Matrix4x4d operator -(Matrix4x4d m1, Matrix4x4d m2) \r\n   \t{\r\n\t\tMatrix4x4d kSum = new Matrix4x4d();\r\n\t\tfor (int iRow = 0; iRow < 4; iRow++) {\r\n\t\t\tfor (int iCol = 0; iCol < 4; iCol++) {\r\n\t\t    \tkSum.m[iRow,iCol] = m1.m[iRow,iCol] - m2.m[iRow,iCol];\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn kSum;\r\n   \t}\r\n\t\r\n\tpublic static Matrix4x4d operator *(Matrix4x4d m1, Matrix4x4d m2) \r\n   \t{\r\n\t\tMatrix4x4d kProd = new Matrix4x4d();\r\n\t\tfor (int iRow = 0; iRow < 4; iRow++) {\r\n\t\t\tfor (int iCol = 0; iCol < 4; iCol++) {\r\n\t\t\t\t\r\n\t\t    \tkProd.m[iRow,iCol] = m1.m[iRow,0] * m2.m[0,iCol] + \r\n\t\t\t\t\t\t\t\t\t m1.m[iRow,1] * m2.m[1,iCol] + \r\n\t\t\t\t\t\t\t\t\t m1.m[iRow,2] * m2.m[2,iCol] +\r\n\t\t\t\t\t\t\t\t\t m1.m[iRow,3] * m2.m[3,iCol];\t\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn kProd;\r\n   \t}\r\n\t\r\n\tpublic static Vector3d2 operator *(Matrix4x4d m, Vector3d2 v)\r\n\t{\r\n\t    Vector3d2 kProd = new Vector3d2();\r\n\t\r\n\t    double fInvW = 1.0 / (m.m[3,0] * v.x + m.m[3,1] * v.y + m.m[3,2] * v.z + m.m[3,3]);\r\n\t\r\n\t    kProd.x = (m.m[0,0] * v.x + m.m[0,1] * v.y + m.m[0,2] * v.z + m.m[0,3]) * fInvW;\r\n\t    kProd.y = (m.m[1,0] * v.x + m.m[1,1] * v.y + m.m[1,2] * v.z + m.m[1,3]) * fInvW;\r\n\t    kProd.z = (m.m[2,0] * v.x + m.m[2,1] * v.y + m.m[2,2] * v.z + m.m[2,3]) * fInvW;\r\n\t\r\n\t    return kProd;\r\n\t}\r\n\t\r\n\tpublic static Vector4d operator *(Matrix4x4d m, Vector4d v)\r\n\t{\r\n\t    Vector4d kProd = new Vector4d();\r\n\t  \r\n\t    kProd.x = m.m[0,0] * v.x + m.m[0,1] * v.y + m.m[0,2] * v.z + m.m[0,3] * v.w;\r\n\t\tkProd.y = m.m[1,0] * v.x + m.m[1,1] * v.y + m.m[1,2] * v.z + m.m[1,3] * v.w;\r\n\t\tkProd.z = m.m[2,0] * v.x + m.m[2,1] * v.y + m.m[2,2] * v.z + m.m[2,3] * v.w;\r\n\t\t\r\n\t    return kProd;\r\n\t}\r\n\t\r\n\tpublic static Matrix4x4d operator *(Matrix4x4d m, double s)\r\n\t{\r\n\t\tMatrix4x4d kProd = new Matrix4x4d();\r\n\t\tfor (int iRow = 0; iRow < 4; iRow++) {\r\n\t\t\tfor (int iCol = 0; iCol < 4; iCol++) {\r\n\t\t    \tkProd.m[iRow,iCol] = m.m[iRow,iCol] * s;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn kProd;\r\n\t}\r\n\t\r\n\tpublic static bool operator ==(Matrix4x4d m1, Matrix4x4d m2)\r\n\t{\r\n\r\n\t\tfor (int iRow = 0; iRow < 4; iRow++) {\r\n\t\t\tfor (int iCol = 0; iCol < 4; iCol++) {\r\n\t\t\t\tif(m1.m[iRow,iCol] != m2.m[iRow,iCol]) return false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\tpublic static bool operator !=(Matrix4x4d m1, Matrix4x4d m2)\r\n\t{\r\n\t\tfor (int iRow = 0; iRow < 4; iRow++) {\r\n\t\t\tfor (int iCol = 0; iCol < 4; iCol++) {\r\n\t\t\t\tif(m1.m[iRow,iCol] != m2.m[iRow,iCol]) return true;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\treturn false;\r\n\t}\r\n\t\r\n\t//Functions\r\n\t\r\n\tpublic override string ToString()\r\n   \t{\r\n\t\treturn  m[0,0] + \",\" + m[0,1] + \",\" + m[0,2] + \",\" + m[0,3] + \"\\n\" + \r\n\t\t\t\tm[1,0] + \",\" + m[1,1] + \",\" + m[1,2] + \",\" + m[1,3] + \"\\n\" + \r\n\t\t\t\tm[2,0] + \",\" + m[2,1] + \",\" + m[2,2] + \",\" + m[2,3] + \"\\n\" +\r\n\t\t\t\tm[3,0] + \",\" + m[3,1] + \",\" + m[3,2] + \",\" + m[3,3];\r\n   \t}\r\n\r\n\tpublic Matrix4x4d Transpose()\r\n\t{\r\n\t    Matrix4x4d kTranspose = new Matrix4x4d();\r\n\t    for (int iRow = 0; iRow < 4; iRow++) {\r\n\t        for (int iCol = 0; iCol < 4; iCol++) {\r\n\t            kTranspose.m[iRow,iCol] = m[iCol,iRow];\r\n\t        }\r\n\t    }\r\n\t    return kTranspose;\r\n\t}\r\n\t\r\n\tprivate double MINOR(int r0, int r1, int r2, int c0, int c1, int c2)\r\n\t{\r\n\t    return m[r0,c0] *(m[r1,c1] * m[r2,c2] - m[r2,c1] * m[r1,c2]) -\r\n\t           m[r0,c1] *(m[r1,c0] * m[r2,c2] - m[r2,c0] * m[r1,c2]) +\r\n\t           m[r0,c2] *(m[r1,c0] * m[r2,c1] - m[r2,c0] * m[r1,c1]);\r\n\t}\r\n\t\r\n\tprivate double Determinant()\r\n\t{\r\n\t    return (m[0,0] * MINOR(1, 2, 3, 1, 2, 3) -\r\n\t            m[0,1] * MINOR(1, 2, 3, 0, 2, 3) +\r\n\t            m[0,2] * MINOR(1, 2, 3, 0, 1, 3) -\r\n\t            m[0,3] * MINOR(1, 2, 3, 0, 1, 2));\r\n\t}\r\n\t\r\n\tprivate Matrix4x4d Adjoint()\r\n\t{\r\n\t    return new Matrix4x4d(\r\n\t\t\t\tMINOR(1, 2, 3, 1, 2, 3),\r\n\t\t\t\t-MINOR(0, 2, 3, 1, 2, 3),\r\n\t\t\t\tMINOR(0, 1, 3, 1, 2, 3),\r\n\t\t\t\t-MINOR(0, 1, 2, 1, 2, 3),\r\n\t\t\t\t\r\n\t\t\t\t-MINOR(1, 2, 3, 0, 2, 3),\r\n\t\t\t\tMINOR(0, 2, 3, 0, 2, 3),\r\n\t\t\t\t-MINOR(0, 1, 3, 0, 2, 3),\r\n\t\t\t\tMINOR(0, 1, 2, 0, 2, 3),\r\n\t\t\t\t\r\n\t\t\t\tMINOR(1, 2, 3, 0, 1, 3),\r\n\t\t\t\t-MINOR(0, 2, 3, 0, 1, 3),\r\n\t\t\t\tMINOR(0, 1, 3, 0, 1, 3),\r\n\t\t\t\t-MINOR(0, 1, 2, 0, 1, 3),\r\n\t\t\t\t\r\n\t\t\t\t-MINOR(1, 2, 3, 0, 1, 2),\r\n\t\t\t\tMINOR(0, 2, 3, 0, 1, 2),\r\n\t\t\t\t-MINOR(0, 1, 3, 0, 1, 2),\r\n\t\t\t\tMINOR(0, 1, 2, 0, 1, 2));\r\n\t}\r\n\t\r\n\tpublic Matrix4x4d Inverse()\r\n\t{\r\n\t    return Adjoint() * (1.0f / Determinant());\r\n\t}\r\n\t\r\n\tpublic Vector4d GetColumn(int iCol)\r\n\t{\r\n\t    return new Vector4d(m[0,iCol], m[1,iCol], m[2,iCol], m[3,iCol]);\r\n\t}\r\n\r\n\tpublic void SetColumn(int iCol, Vector4d v)\r\n\t{\r\n\t    m[0,iCol] = v.x;\r\n\t    m[1,iCol] = v.y;\r\n\t    m[2,iCol] = v.z;\r\n\t\tm[3,iCol] = v.w;\r\n\t}\r\n\t\r\n\tpublic Vector4d GetRow(int iRow)\r\n\t{\r\n\t    return new Vector4d(m[iRow,0], m[iRow,1], m[iRow,2], m[iRow,3]);\r\n\t}\r\n\r\n\tpublic void SetRow(int iRow, Vector4d v)\r\n\t{\r\n\t    m[iRow,0] = v.x;\r\n\t    m[iRow,1] = v.y;\r\n\t    m[iRow,2] = v.z;\r\n\t\tm[iRow,3] = v.w;\r\n\t}\r\n\t\r\n\tpublic Matrix4x4 ToMatrix4x4()\r\n\t{\r\n\t\tMatrix4x4 mat = new Matrix4x4();\r\n\t\t\r\n\t\tmat.m00 = (float)m[0,0]; mat.m01 = (float)m[0,1]; mat.m02 = (float)m[0,2]; mat.m03 = (float)m[0,3];\r\n\t\tmat.m10 = (float)m[1,0]; mat.m11 = (float)m[1,1]; mat.m12 = (float)m[1,2]; mat.m13 = (float)m[1,3];\r\n\t\tmat.m20 = (float)m[2,0]; mat.m21 = (float)m[2,1]; mat.m22 = (float)m[2,2]; mat.m23 = (float)m[2,3];\r\n\t\tmat.m30 = (float)m[3,0]; mat.m31 = (float)m[3,1]; mat.m32 = (float)m[3,2]; mat.m33 = (float)m[3,3];\r\n\t\t\r\n\t\treturn mat;\r\n\t}\r\n\r\n\tpublic Matrix3x3d ToMatrix3x3d()\r\n\t{\r\n\t\tMatrix3x3d mat = new Matrix3x3d();\r\n\t\t\r\n\t\tmat.m[0,0] = m[0,0]; mat.m[0,1] = m[0,1]; mat.m[0,2] = m[0,2];\r\n\t\tmat.m[1,0] = m[1,0]; mat.m[1,1] = m[1,1]; mat.m[1,2] = m[1,2];\r\n\t\tmat.m[2,0] = m[2,0]; mat.m[2,1] = m[2,1]; mat.m[2,2] = m[2,2];\r\n\t\t\r\n\t\treturn mat;\r\n\t}\r\n\r\n\t//Static Function\r\n\t\r\n\tstatic public Matrix4x4d ToMatrix4x4d(Matrix4x4 matf)\r\n\t{\r\n\t\tMatrix4x4d mat = new Matrix4x4d();\r\n\t\t\r\n\t\tmat.m[0,0] = matf.m00; mat.m[0,1] = matf.m01; mat.m[0,2] = matf.m02; mat.m[0,3] = matf.m03;\r\n\t\tmat.m[1,0] = matf.m10; mat.m[1,1] = matf.m11; mat.m[1,2] = matf.m12; mat.m[1,3] = matf.m13;\r\n\t\tmat.m[2,0] = matf.m20; mat.m[2,1] = matf.m21; mat.m[2,2] = matf.m22; mat.m[2,3] = matf.m23;\r\n\t\tmat.m[3,0] = matf.m30; mat.m[3,1] = matf.m31; mat.m[3,2] = matf.m32; mat.m[3,3] = matf.m33;\r\n\t\t\r\n\t\treturn mat;\r\n\t}\r\n\r\n\tstatic public Matrix4x4d Translate(Vector3d2 v)\r\n\t{\r\n\t    return new Matrix4x4d(\t1, 0, 0, v.x,\r\n\t                      \t\t0, 1, 0, v.y,\r\n\t                      \t\t0, 0, 1, v.z,\r\n\t                      \t\t0, 0, 0, 1);\r\n\t}\r\n\r\n\tstatic public Matrix4x4d Translate(Vector3 v)\r\n\t{\r\n\t\treturn new Matrix4x4d(\t1, 0, 0, v.x,\r\n\t\t                        0, 1, 0, v.y,\r\n\t\t                      \t0, 0, 1, v.z,\r\n\t\t                      \t0, 0, 0, 1);\r\n\t}\r\n\r\n\tstatic public Matrix4x4d Scale(Vector3d2 v)\r\n\t{\r\n\t\treturn new Matrix4x4d(\tv.x, 0, 0, 0,\r\n\t\t                      \t0, v.y, 0, 0,\r\n\t\t                      \t0, 0, v.z, 0,\r\n\t\t                      \t0, 0, 0, 1);\r\n\t}\r\n\r\n\tstatic public Matrix4x4d Scale(Vector3 v)\r\n\t{\r\n\t\treturn new Matrix4x4d(\tv.x, 0, 0, 0,\r\n\t\t                      \t0, v.y, 0, 0,\r\n\t\t                      \t0, 0, v.z, 0,\r\n\t\t                      \t0, 0, 0, 1);\r\n\t}\r\n\t\r\n\tstatic  public Matrix4x4d RotateX(double angle)\r\n\t{\r\n\t\tdouble ca = System.Math.Cos(angle * System.Math.PI / 180.0);\r\n    \tdouble sa = System.Math.Sin(angle * System.Math.PI / 180.0);\r\n\t\t\r\n\t    return new Matrix4x4d(\t1, 0, 0, 0,\r\n\t                      \t\t0, ca, -sa, 0,\r\n\t                      \t\t0, sa, ca, 0,\r\n\t                      \t\t0, 0, 0, 1);\r\n\t}\r\n\t\r\n\tstatic  public Matrix4x4d RotateY(double angle)\r\n\t{\r\n\t\tdouble ca = System.Math.Cos(angle * System.Math.PI / 180.0);\r\n    \tdouble sa = System.Math.Sin(angle * System.Math.PI / 180.0);\r\n\t\t\r\n\t    return new Matrix4x4d(\tca, 0, sa, 0,\r\n\t                      \t\t0, 1, 0, 0,\r\n\t                      \t\t-sa, 0, ca, 0,\r\n\t                      \t\t0, 0, 0, 1);\r\n\t}\r\n\r\n\tstatic  public Matrix4x4d RotateZ(double angle)\r\n\t{\r\n\t\tdouble ca = System.Math.Cos(angle * System.Math.PI / 180.0);\r\n    \tdouble sa = System.Math.Sin(angle * System.Math.PI / 180.0);\r\n\t\t\r\n\t    return new Matrix4x4d(\tca, -sa, 0, 0,\r\n\t                      \t\tsa, ca, 0, 0,\r\n\t                      \t\t0, 0, 1, 0,\r\n\t                      \t\t0, 0, 0, 1);\r\n\t}\r\n\r\n\tstatic public Matrix4x4d Rotate(Vector3 rotation)\r\n\t{\r\n\t\tQuat x = new Quat(new Vector3d2(1,0,0), rotation.x * MathUtility.Deg2Rad );\r\n\t\tQuat y = new Quat(new Vector3d2(0,1,0), rotation.y * MathUtility.Deg2Rad );\r\n\t\tQuat z = new Quat(new Vector3d2(0,0,1), rotation.z * MathUtility.Deg2Rad );\r\n\t\t\r\n\t\treturn (z*y*x).ToMatrix4x4d();\r\n\t}\r\n\r\n\tstatic public Matrix4x4d Rotate(Vector3d2 rotation)\r\n\t{\r\n\t\tQuat x = new Quat(new Vector3d2(1,0,0), rotation.x * MathUtility.Deg2Rad );\r\n\t\tQuat y = new Quat(new Vector3d2(0,1,0), rotation.y * MathUtility.Deg2Rad );\r\n\t\tQuat z = new Quat(new Vector3d2(0,0,1), rotation.z * MathUtility.Deg2Rad );\r\n\t\t\r\n\t\treturn (z*y*x).ToMatrix4x4d();\r\n\t}\r\n\t\r\n\tstatic  public Matrix4x4d Perspective(double fovy, double aspect, double zNear, double zFar)\r\n\t{\r\n\t    double f = 1.0 / System.Math.Tan((fovy * System.Math.PI / 180.0) / 2.0);\r\n\t    return new Matrix4x4d(\tf / aspect,0,0,0,\r\n\t                      \t\t0,f,0,0,\r\n\t                      \t\t0,0,(zFar + zNear) / (zNear - zFar), (2.0*zFar*zNear) / (zNear - zFar),\r\n\t                      \t\t0,0,-1,0);\r\n\t}\r\n\t\r\n\tstatic  public Matrix4x4d Ortho(double xRight, double xLeft, double yTop, double yBottom, double zNear, double zFar)\r\n\t{\r\n\t    double tx, ty, tz;\r\n\t    tx = - (xRight + xLeft) / (xRight - xLeft);\r\n\t    ty = - (yTop + yBottom) / (yTop - yBottom);\r\n\t    tz = - (zFar + zNear) / (zFar - zNear);\r\n\t    return new Matrix4x4d(\t2.0 / (xRight - xLeft),0,0,tx,\r\n\t                       \t\t0,2.0 / (yTop - yBottom),0,ty,\r\n\t                       \t\t0,0,-2.0 / (zFar - zNear), tz,\r\n\t                       \t\t0,0,0,1);\r\n\t}\r\n\t\r\n\tstatic public Matrix4x4d Identity()\r\n\t{\r\n\t\treturn new Matrix4x4d(\t1,0,0,0,\r\n\t\t\t\t\t\t\t\t0,1,0,0,\r\n\t\t\t\t\t\t\t\t0,0,1,0,\r\n\t\t\t\t\t\t\t\t0,0,0,1);\r\n\t}\r\n\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "scatterer/Utilities/Math/Quat.cs",
    "content": "﻿\r\nusing UnityEngine;\r\n\r\npublic class Quat {\r\n\t\r\n\t//Member varibles\r\n\t\r\n\tpublic double x, y, z, w;\r\n\t\r\n\t//Constructors\r\n\t\r\n\tpublic Quat() {}\r\n\t\r\n\tpublic Quat(double x, double y, double z, double w)\r\n\t{\r\n\t\tthis.x = x;\r\n\t    this.y = y;\r\n\t\tthis.z = z;\r\n\t\tthis.w = w;\r\n\t}\r\n\t\r\n\tpublic Quat(double[] v)\r\n\t{\r\n\t\tthis.x = v[0];\r\n\t    this.y = v[1];\r\n\t\tthis.z = v[2];\r\n\t\tthis.w = v[3];\r\n\t}\r\n\t\r\n\tpublic Quat(Quat q)\r\n\t{\r\n\t\tthis.x = q.x;\r\n\t    this.y = q.y;\r\n\t\tthis.z = q.z;\r\n\t\tthis.w = q.w;\r\n\t}\r\n\r\n\tpublic Quat(Quaternion q)\r\n\t{\r\n\t\tthis.x = (double)q.x;\r\n\t\tthis.y = (double)q.y;\r\n\t\tthis.z = (double)q.z;\r\n\t\tthis.w = (double)q.w;\r\n\t}\r\n\t\r\n\tpublic Quat(Vector3d2 axis, double angle)\r\n\t{\r\n\t    Vector3d2 axisN = axis.Normalized();\r\n\t    double a = angle * 0.5;\r\n\t    double sina = System.Math.Sin(a);\r\n\t    double cosa = System.Math.Cos(a);\r\n\t    x = axisN.x * sina;\r\n\t    y = axisN.y * sina;\r\n\t    z = axisN.z * sina;\r\n\t    w = cosa;\r\n\t}\r\n\r\n\tpublic Quat(Vector3 axis, float angle)\r\n\t{\r\n\t\tVector3 axisN = axis.normalized;\r\n\t\tfloat a = angle * 0.5f;\r\n\t\tfloat sina = Mathf.Sin(a);\r\n\t\tfloat cosa = Mathf.Cos(a);\r\n\t\tx = (double)(axisN.x * sina);\r\n\t\ty = (double)(axisN.y * sina);\r\n\t\tz = (double)(axisN.z * sina);\r\n\t\tw = (double)cosa;\r\n\t}\r\n\t\r\n\tpublic Quat(Vector3d2 to, Vector3d2 _from)\r\n\t{\r\n\t    Vector3d2 f = _from.Normalized();\r\n\t    Vector3d2 t = to.Normalized();\r\n\t\r\n\t    double dotProdPlus1 = 1.0 + f.Dot(t);\r\n\t\r\n\t    if (dotProdPlus1 < 1e-7) {\r\n\t        w = 0;\r\n\t        if (System.Math.Abs(f.x) < 0.6) {\r\n\t            double norm = System.Math.Sqrt(1 - f.x * f.x);\r\n\t            x = 0;\r\n\t            y = f.z / norm;\r\n\t            z = -f.y / norm;\r\n\t        } else if (System.Math.Abs(f.y) < 0.6) {\r\n\t            double norm = System.Math.Sqrt(1 - f.y * f.y);\r\n\t            x = -f.z / norm;\r\n\t            y = 0;\r\n\t            z = f.x / norm;\r\n\t        } else {\r\n\t            double norm = System.Math.Sqrt(1 - f.z * f.z);\r\n\t            x = f.y / norm;\r\n\t            y = -f.x / norm;\r\n\t            z = 0;\r\n\t        }\r\n\t    } else {\r\n\t        double s = System.Math.Sqrt(0.5 * dotProdPlus1);\r\n\t        Vector3d2 tmp = (f.Cross(t)) / (2.0 * s);\r\n\t        x = tmp.x;\r\n\t        y = tmp.y;\r\n\t        z = tmp.z;\r\n\t        w = s;\r\n\t    }\r\n\t}\r\n\t\r\n\t//Operator Overloads\r\n\t\r\n\tpublic static Quat operator*( Quat q1, Quat q2 )\r\n\t{\r\n\t    return new Quat(q2.w * q1.x  + q2.x * q1.w  + q2.y * q1.z  - q2.z * q1.y,\r\n\t                \tq2.w * q1.y  - q2.x * q1.z  + q2.y * q1.w  + q2.z * q1.x,\r\n\t                \tq2.w * q1.z  + q2.x * q1.y  - q2.y * q1.x  + q2.z * q1.w,\r\n\t                \tq2.w * q1.w  - q2.x * q1.x  - q2.y * q1.y  - q2.z * q1.z);\r\n\t}\r\n\t\r\n\tpublic static Vector3d2 operator*(Quat q, Vector3d2 v)\r\n\t{\r\n\t    return q.ToMatrix3x3d() * v;\r\n\t}\r\n\t\r\n\t//Functions\r\n\r\n\tpublic Matrix3x3 ToMatrix3x3()\r\n\t{\r\n\t\tfloat \txx = (float)(x * x),\r\n\t\t\t\txy = (float)(x * y),\r\n\t\t\t\txz = (float)(x * z),\r\n\t\t\t\txw = (float)(x * w),\r\n\t\t\t\tyy = (float)(y * y),\r\n\t\t\t\tyz = (float)(y * z),\r\n\t\t\t\tyw = (float)(y * w),\r\n\t\t\t\tzz = (float)(z * z),\r\n\t\t\t\tzw = (float)(z * w);\r\n\t\t\r\n\t\treturn new Matrix3x3\r\n\t\t\t(\r\n\t\t\t\t1.0f - 2.0f * (yy + zz), 2.0f * (xy - zw), 2.0f * (xz + yw),\r\n\t\t\t\t2.0f * (xy + zw), 1.0f - 2.0f * (xx + zz), 2.0f * (yz - xw),\r\n\t\t\t\t2.0f * (xz - yw), 2.0f * (yz + xw), 1.0f - 2.0f * (xx + yy)\r\n\t\t\t);\r\n\t}\r\n\t\r\n\tpublic Matrix3x3d ToMatrix3x3d()\r\n\t{\r\n\t    double \txx = x * x,\r\n\t         \txy = x * y,\r\n\t        \txz = x * z,\r\n\t         \txw = x * w,\r\n\t         \tyy = y * y,\r\n\t         \tyz = y * z,\r\n\t         \tyw = y * w,\r\n\t         \tzz = z * z,\r\n\t         \tzw = z * w;\r\n\t\t\r\n\t\treturn new Matrix3x3d\r\n\t\t(\r\n\t\t \t1.0 - 2.0 * (yy + zz), 2.0 * (xy - zw), 2.0 * (xz + yw),\r\n\t\t \t2.0 * (xy + zw), 1.0 - 2.0 * (xx + zz), 2.0 * (yz - xw),\r\n\t\t \t2.0 * (xz - yw), 2.0 * (yz + xw), 1.0 - 2.0 * (xx + yy)\r\n\t\t);\r\n\t}\r\n\r\n\tpublic Matrix4x4d ToMatrix4x4d()\r\n\t{\r\n\t\tdouble \txx = x * x,\r\n\t\t\t\txy = x * y,\r\n\t\t\t\txz = x * z,\r\n\t\t\t\txw = x * w,\r\n\t\t\t\tyy = y * y,\r\n\t\t\t\tyz = y * z,\r\n\t\t\t\tyw = y * w,\r\n\t\t\t\tzz = z * z,\r\n\t\t\t\tzw = z * w;\r\n\t\t\r\n\t\treturn new Matrix4x4d\r\n\t\t(\r\n\t\t\t1.0 - 2.0 * (yy + zz), 2.0 * (xy - zw), 2.0 * (xz + yw), 0.0,\r\n\t\t\t2.0 * (xy + zw), 1.0 - 2.0 * (xx + zz), 2.0 * (yz - xw), 0.0,\r\n\t\t\t2.0 * (xz - yw), 2.0 * (yz + xw), 1.0 - 2.0 * (xx + yy), 0.0,\r\n\t\t\t0.0, 0.0, 0.0, 1.0\r\n\t\t);\r\n\t}\r\n\t\r\n\tpublic Quat Inverse()\r\n\t{\r\n\t    return new Quat(-x, -y, -z, w);\r\n\t}\r\n\r\n\tdouble Length()\r\n\t{\r\n\t    double len = x * x + y * y + z * z + w * w;\r\n\t    return System.Math.Sqrt(len);\r\n\t}\r\n\t\r\n\tpublic void Normalize()\r\n\t{\r\n\t    double invLength = 1.0 / Length();\r\n\t    x *= invLength; \r\n\t\ty *= invLength; \r\n\t\tz *= invLength; \r\n\t\tw *= invLength;\r\n\t}\r\n\r\n\tpublic Quat Normalized()\r\n\t{\r\n\t    double invLength = 1.0 / Length();\r\n\t    return new Quat(x * invLength, y * invLength, z * invLength, w * invLength);\r\n\t}\r\n\t\r\n\tpublic Quat Slerp(Quat _from, Quat to, double t)\r\n\t{\r\n\t    if (t <= 0) {\r\n\t        return new Quat(_from);\r\n\t    } else if (t >= 1) {\r\n\t        return new Quat(to);\r\n\t    } else {\r\n\t        double cosom = _from.x * to.x + _from.y * to.y + _from.z * to.z + _from.w * to.w;\r\n\t        double absCosom = System.Math.Abs(cosom);\r\n\t\r\n\t        double scale0;\r\n\t        double scale1;\r\n\t\r\n\t        if ((1 - absCosom) > 1e-6) {\r\n\t            double omega = MathUtility.Safe_Acos(absCosom);\r\n\t            double sinom = 1.0 / System.Math.Sin( omega );\r\n\t            scale0 = System.Math.Sin( ( 1.0 - t ) * omega ) * sinom;\r\n\t            scale1 = System.Math.Sin( t * omega ) * sinom;\r\n\t        } else {\r\n\t            scale0 = 1 - t;\r\n\t            scale1 = t;\r\n\t        }\r\n\t        Quat res = new Quat(scale0 * _from.x + scale1 * to.x,\r\n                                scale0 * _from.y + scale1 * to.y,\r\n                                scale0 * _from.z + scale1 * to.z,\r\n                                scale0 * _from.w + scale1 * to.w);\r\n\t\t\t\r\n\t        return res.Normalized();\r\n\t    }\r\n\t}\r\n\r\n\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "scatterer/Utilities/Math/Vector2d.cs",
    "content": "﻿using UnityEngine;\r\n\r\npublic class Vector2d\r\n{\r\n\t//Member varibles\r\n\t\r\n\tpublic double x, y;\r\n\t\r\n\t//Constructors\r\n\t\r\n\tpublic Vector2d()\r\n\t{\r\n\t\tthis.x = 0.0f; \r\n\t\tthis.y = 0.0f; \r\n\t}\r\n\t\r\n\tpublic Vector2d(double v) \r\n\t{\r\n\t\tthis.x = v; \r\n\t\tthis.y = v; \r\n\t}\r\n\t\r\n\tpublic Vector2d(double x, double y) \r\n\t{\r\n\t\tthis.x = x; \r\n\t\tthis.y = y; \r\n\t}\r\n\t\r\n\tpublic Vector2d(Vector2d v) \r\n\t{ \r\n\t\tx = v.x; \r\n\t\ty = v.y; \r\n\t}\r\n\t\r\n\tpublic Vector2d(double[] v) \r\n\t{ \r\n\t\tx = v[0]; \r\n\t\ty = v[1]; \r\n\t}\r\n\t\r\n\t//Operator overloads\r\n\t\r\n\tpublic static Vector2d operator +(Vector2d v1, Vector2d v2) \r\n   \t{\r\n    \treturn new Vector2d(v1.x+v2.x, v1.y+v2.y);\r\n   \t}\r\n\t\r\n\tpublic static Vector2d operator -(Vector2d v1, Vector2d v2) \r\n   \t{\r\n    \treturn new Vector2d(v1.x-v2.x, v1.y-v2.y);\r\n   \t}\r\n\t\r\n\tpublic static Vector2d operator *(Vector2d v1, Vector2d v2) \r\n   \t{\r\n    \treturn new Vector2d(v1.x*v2.x, v1.y*v2.y);\r\n   \t}\r\n\t\r\n\tpublic static Vector2d operator *(Vector2d v, double s) \r\n   \t{\r\n    \treturn new Vector2d(v.x*s, v.y*s);\r\n   \t}\r\n\t\r\n\tpublic static Vector2d operator *(double s, Vector2d v) \r\n   \t{\r\n    \treturn new Vector2d(v.x*s, v.y*s);\r\n   \t}\r\n\t\r\n\tpublic static Vector2d operator /(Vector2d v, double s) \r\n   \t{\r\n    \treturn new Vector2d(v.x/s, v.y/s);\r\n   \t}\r\n\t\r\n\tpublic static Vector2d operator /(Vector2d v1, Vector2d v2) \r\n   \t{\r\n    \treturn new Vector2d(v1.x/v2.x, v1.y/v2.y);\r\n   \t}\r\n\t\r\n\t//Functions\r\n\t\r\n\tpublic override string ToString()\r\n   \t{\r\n\t\treturn \"(\" + x + \",\" + y + \")\";\r\n   \t}\r\n\t\r\n\tpublic double Magnitude()\r\n\t{\r\n\t\treturn System.Math.Sqrt(x*x + y*y);\r\n\t}\r\n\t\r\n\tpublic double SqrMagnitude()\r\n\t{\r\n\t\treturn (x*x + y*y);\r\n\t}\r\n\t\r\n\tpublic double Dot(Vector2d v)\r\n\t{\r\n\t\treturn (x*v.x + y*v.y);\r\n\t}\r\n\r\n\tpublic void Normalize()\r\n\t{\r\n    \tdouble invLength = 1.0 / System.Math.Sqrt(x*x + y*y);\r\n    \tx *= invLength;\r\n\t\ty *= invLength;\r\n\t}\r\n\t\r\n\tpublic Vector2d Normalized()\r\n\t{\r\n    \tdouble invLength = 1.0 / System.Math.Sqrt(x*x + y*y);\r\n    \treturn new Vector2d(x * invLength, y * invLength);\r\n\t}\r\n\r\n\tpublic Vector2d Normalized(double l)\r\n\t{\r\n\t\tdouble length = System.Math.Sqrt(x * x + y * y);\r\n\t\tdouble invLength = l / length;\r\n\t\treturn new Vector2d(x * invLength, y * invLength);\r\n\t}\r\n\r\n\tpublic double Cross(Vector2d v)\r\n\t{\r\n\t\treturn x * v.y - y * v.x;\r\n\t}\r\n\r\n\tstatic public double Cross(Vector2d u, Vector2d v)\r\n\t{\r\n\t\treturn u.x * v.y - u.y * v.x;\r\n\t}\r\n\r\n\tpublic Vector2 ToVector2()\r\n\t{\r\n\t\treturn new Vector2((float)x,(float)y);\r\n\t}\r\n\t\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "scatterer/Utilities/Math/Vector2i.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections;\r\n\r\npublic class Vector2i \r\n{\r\n\tpublic int x, y;\r\n\r\n\tpublic Vector2i() {}\r\n\r\n\tpublic Vector2i(int x, int y)\r\n\t{\r\n\t\tthis.x = x;\r\n\t\tthis.y = y;\r\n\t}\r\n\r\n\tpublic Vector2i(Vector2 v)\r\n\t{\r\n\t\tthis.x = (int)v.x;\r\n\t\tthis.y = (int)v.y;\r\n\t}\r\n\t\r\n}\r\n"
  },
  {
    "path": "scatterer/Utilities/Math/Vector3d2.cs",
    "content": "﻿\r\nusing UnityEngine;\r\n\r\npublic class Vector3d2\r\n{\r\n\t//Member varibles\r\n\t\r\n\tpublic double x, y, z;\r\n\t\r\n\t//Constructors\r\n\t\r\n\tpublic Vector3d2()\r\n\t{\r\n\t\tthis.x = 0.0f; \r\n\t\tthis.y = 0.0f; \r\n\t\tthis.z = 0.0f;\r\n\t}\r\n\t\r\n\tpublic Vector3d2(double v) \r\n\t{\r\n\t\tthis.x = v; \r\n\t\tthis.y = v; \r\n\t\tthis.z = v;\r\n\t}\r\n\t\r\n\tpublic Vector3d2(double x, double y, double z) \r\n\t{\r\n\t\tthis.x = x; \r\n\t\tthis.y = y;\r\n\t\tthis.z = z;\r\n\t}\r\n\t\r\n\tpublic Vector3d2(Vector2d v, double z) \r\n\t{ \r\n\t\tx = v.x; \r\n\t\ty = v.y; \r\n\t\tthis.z = z;\r\n\t}\r\n\t\r\n\tpublic Vector3d2(Vector3d2 v) \r\n\t{ \r\n\t\tx = v.x; \r\n\t\ty = v.y; \r\n\t\tz = v.z;\r\n\t}\r\n\t\r\n\tpublic Vector3d2(Vector3 v) \r\n\t{ \r\n\t\tx = v.x; \r\n\t\ty = v.y; \r\n\t\tz = v.z;\r\n\t}\r\n\t\r\n\tpublic Vector3d2(Vector2 v, double z) \r\n\t{ \r\n\t\tx = v.x; \r\n\t\ty = v.y; \r\n\t\tthis.z = z;\r\n\t}\r\n\t\r\n\tpublic Vector3d2(double[] v) \r\n\t{ \r\n\t\tx = v[0]; \r\n\t\ty = v[1];\r\n\t\tz = v[2];\r\n\t}\r\n\t\r\n\t//Operator overloads\r\n\t\r\n\tpublic static Vector3d2 operator +(Vector3d2 v1, Vector3d2 v2) \r\n\t{\r\n\t\treturn new Vector3d2(v1.x+v2.x, v1.y+v2.y, v1.z+v2.z);\r\n\t}\r\n\t\r\n\tpublic static Vector3d2 operator -(Vector3d2 v1, Vector3d2 v2) \r\n\t{\r\n\t\treturn new Vector3d2(v1.x-v2.x, v1.y-v2.y, v1.z-v2.z);\r\n\t}\r\n\t\r\n\tpublic static Vector3d2 operator *(Vector3d2 v1, Vector3d2 v2) \r\n\t{\r\n\t\treturn new Vector3d2(v1.x*v2.x, v1.y*v2.y, v1.z*v2.z);\r\n\t}\r\n\t\r\n\tpublic static Vector3d2 operator *(Vector3d2 v, double s) \r\n\t{\r\n\t\treturn new Vector3d2(v.x*s, v.y*s, v.z*s);\r\n\t}\r\n\t\r\n\tpublic static Vector3d2 operator *(double s, Vector3d2 v) \r\n\t{\r\n\t\treturn new Vector3d2(v.x*s, v.y*s, v.z*s);\r\n\t}\r\n\t\r\n\tpublic static Vector3d2 operator /(Vector3d2 v, double s) \r\n\t{\r\n\t\treturn new Vector3d2(v.x/s, v.y/s, v.z/s);\r\n\t}\r\n\t\r\n\tpublic static Vector3d2 operator /(Vector3d2 v1, Vector3d2 v2) \r\n\t{\r\n\t\treturn new Vector3d2(v1.x/v2.x, v1.y/v2.y, v1.z/v2.z);\r\n\t}\r\n\t\r\n\t//Functions\r\n\t\r\n\tpublic override string ToString()\r\n\t{\r\n\t\treturn \"(\" + x + \",\" + y + \",\" + z + \")\";\r\n\t}\r\n\t\r\n\tpublic double Magnitude()\r\n\t{\r\n\t\treturn System.Math.Sqrt(x*x + y*y + z*z);\r\n\t}\r\n\t\r\n\tpublic double SqrMagnitude()\r\n\t{\r\n\t\treturn (x*x + y*y + z*z);\r\n\t}\r\n\t\r\n\tpublic double Dot(Vector3d2 v)\r\n\t{\r\n\t\treturn (x*v.x + y*v.y + z*v.z);\r\n\t}\r\n\t\r\n\tpublic void Normalize()\r\n\t{\r\n\t\tdouble invLength = 1.0 / System.Math.Sqrt(x*x + y*y + z*z);\r\n\t\tx *= invLength;\r\n\t\ty *= invLength;\r\n\t\tz *= invLength;\r\n\t}\r\n\t\r\n\tpublic Vector3d2 Normalized()\r\n\t{\r\n\t\tdouble invLength = 1.0 / System.Math.Sqrt(x*x + y*y + z*z);\r\n\t\treturn new Vector3d2(x * invLength, y * invLength, z * invLength);\r\n\t}\r\n\t\r\n\tpublic Vector3d2 Normalized(double l)\r\n\t{\r\n\t\tdouble length = System.Math.Sqrt(x*x + y*y + z*z);\r\n\t\tdouble invLength = l / length;\r\n\t\treturn new Vector3d2(x * invLength, y * invLength, z * invLength);\r\n\t}\r\n\t\r\n\tpublic Vector3d2 Normalized(ref double previousLength)\r\n\t{\r\n\t\tpreviousLength = System.Math.Sqrt(x*x + y*y + z*z);\r\n\t\tdouble invLength = 1.0 / previousLength;\r\n\t\treturn new Vector3d2(x * invLength, y * invLength, z * invLength);\r\n\t}\r\n\t\r\n\tpublic Vector3d2 Cross(Vector3d2 v)\r\n\t{\r\n\t\treturn new Vector3d2(y*v.z - z*v.y, z*v.x - x*v.z, x*v.y - y*v.x);\r\n\t}\r\n\t\r\n\tpublic Vector2d XY()\r\n\t{\r\n\t\treturn new Vector2d(x,y);\t\r\n\t}\r\n\t\r\n\tpublic Vector3 ToVector3()\r\n\t{\r\n\t\treturn new Vector3((float)x,(float)y,(float)z);\r\n\t}\r\n\t\r\n\tpublic static Vector3d2 UnitX() {\r\n\t\treturn new Vector3d2(1,0,0);\r\n\t}\r\n\tpublic static Vector3d2 UnitY() {\r\n\t\treturn new Vector3d2(0,1,0);\r\n\t}\r\n\t\r\n\tpublic static Vector3d2 UnitZ() {\r\n\t\treturn new Vector3d2(0,0,1);\r\n\t}\r\n\t\r\n\tpublic static Vector3d2 Zero() {\r\n\t\treturn new Vector3d2(0,0,0);\r\n\t}\r\n\t\r\n\t\r\n\t\r\n}"
  },
  {
    "path": "scatterer/Utilities/Math/Vector4d.cs",
    "content": "﻿using UnityEngine;\r\n\r\npublic class Vector4d\r\n{\r\n\t//Member varibles\r\n\t\r\n\tpublic double x, y, z, w;\r\n\t\r\n\t//Constructors\r\n\t\r\n\tpublic Vector4d()\r\n\t{\r\n\t\tthis.x = 0.0f; \r\n\t\tthis.y = 0.0f; \r\n\t\tthis.z = 0.0f;\r\n\t\tthis.w = 0.0f;\r\n\t}\r\n\t\r\n\tpublic Vector4d(double v) \r\n\t{\r\n\t\tthis.x = v; \r\n\t\tthis.y = v; \r\n\t\tthis.z = v;\r\n\t\tthis.w = v;\r\n\t}\r\n\t\r\n\tpublic Vector4d(double x, double y, double z, double w) \r\n\t{\r\n\t\tthis.x = x; \r\n\t\tthis.y = y;\r\n\t\tthis.z = z;\r\n\t\tthis.w = w;\r\n\t}\r\n\t\r\n\tpublic Vector4d(Vector2d v, double z, double w) \r\n\t{ \r\n\t\tx = v.x; \r\n\t\ty = v.y; \r\n\t\tthis.z = z;\r\n\t\tthis.w = w;\r\n\t}\r\n\t\r\n\tpublic Vector4d(Vector3d2 v, double w) \r\n\t{ \r\n\t\tx = v.x; \r\n\t\ty = v.y; \r\n\t\tz = v.z;\r\n\t\tthis.w = w;\r\n\t}\r\n\t\r\n\tpublic Vector4d(Vector4d v) \r\n\t{ \r\n\t\tx = v.x; \r\n\t\ty = v.y; \r\n\t\tz = v.z;\r\n\t\tw = v.w;\r\n\t}\r\n\r\n\tpublic Vector4d(Vector4 v) \r\n\t{ \r\n\t\tx = (double)v.x; \r\n\t\ty = (double)v.y; \r\n\t\tz = (double)v.z;\r\n\t\tw = (double)v.w;\r\n\t}\r\n\r\n\tpublic Vector4d(Vector3 v, double w) \r\n\t{ \r\n\t\tx = (double)v.x; \r\n\t\ty = (double)v.y; \r\n\t\tz = (double)v.z;\r\n\t\tthis.w = w;\r\n\t}\r\n\t\r\n\tpublic Vector4d(double[] v) \r\n\t{ \r\n\t\tx = v[0]; \r\n\t\ty = v[1];\r\n\t\tz = v[2];\r\n\t\tw = v[3];\r\n\t}\r\n\t\r\n\t//Operator overloads\r\n\t\r\n\tpublic static Vector4d operator +(Vector4d v1, Vector4d v2) \r\n   \t{\r\n    \treturn new Vector4d(v1.x+v2.x, v1.y+v2.y, v1.z+v2.z, v1.w+v2.w);\r\n   \t}\r\n\t\r\n\tpublic static Vector4d operator -(Vector4d v1, Vector4d v2) \r\n   \t{\r\n    \treturn new Vector4d(v1.x-v2.x, v1.y-v2.y, v1.z-v2.z, v1.w-v2.w);\r\n   \t}\r\n\t\r\n\tpublic static Vector4d operator *(Vector4d v1, Vector4d v2) \r\n   \t{\r\n    \treturn new Vector4d(v1.x*v2.x, v1.y*v2.y, v1.z*v2.z, v1.w*v2.w);\r\n   \t}\r\n\t\r\n\tpublic static Vector4d operator *(Vector4d v, double s) \r\n   \t{\r\n    \treturn new Vector4d(v.x*s, v.y*s, v.z*s, v.w*s);\r\n   \t}\r\n\t\r\n\tpublic static Vector4d operator *(double s, Vector4d v) \r\n   \t{\r\n    \treturn new Vector4d(v.x*s, v.y*s, v.z*s, v.w*s);\r\n   \t}\r\n\t\r\n\tpublic static Vector4d operator /(Vector4d v, double s) \r\n   \t{\r\n    \treturn new Vector4d(v.x/s, v.y/s, v.z/s, v.w/s);\r\n   \t}\r\n\t\r\n\tpublic static Vector4d operator /(Vector4d v1, Vector4d v2) \r\n   \t{\r\n    \treturn new Vector4d(v1.x/v2.x, v1.y/v2.y, v1.z/v2.z, v1.w/v2.w);\r\n   \t}\r\n\t\r\n\t//Functions\r\n\t\r\n\tpublic override string ToString() {\r\n\t\treturn \"(\" + x + \",\" + y + \",\" + z + \",\" + w + \")\";\r\n   \t}\r\n\r\n\tpublic Vector4 ToVector4() {\r\n\t\treturn new Vector4((float)x,(float)y,(float)z, (float)w);\r\n\t}\r\n\t\r\n\tpublic Vector3d2 XYZ() {\r\n\t\treturn new Vector3d2(x,y,z);\t\r\n\t}\r\n\r\n\tpublic Vector4d XYZ0() {\r\n\t\treturn new Vector4d(x,y,z,0);\t\r\n\t}\r\n\r\n\tpublic double Magnitude() {\r\n\t\treturn System.Math.Sqrt(x*x + y*y + z*z + w*w);\r\n\t}\r\n\t\r\n\tpublic double SqrMagnitude() {\r\n\t\treturn (x*x + y*y + z*z + w*w);\r\n\t}\r\n\t\r\n\tpublic double Dot(Vector3d2 v) {\r\n\t\treturn (x*v.x + y*v.y + z*v.z + w);\r\n\t}\r\n\t\r\n\tpublic double Dot(Vector4d v) {\r\n\t\treturn (x*v.x + y*v.y + z*v.z + w*v.w);\r\n\t}\r\n\r\n\tpublic void Normalize()\r\n\t{\r\n    \tdouble invLength = 1.0 / System.Math.Sqrt(x*x + y*y + z*z + w*w);\r\n    \tx *= invLength;\r\n\t\ty *= invLength;\r\n\t\tz *= invLength;\r\n\t\tw *= invLength;\r\n\t}\r\n\t\r\n\tpublic Vector4d Normalized()\r\n\t{\r\n\t\tdouble invLength = 1.0 / System.Math.Sqrt(x*x + y*y + z*z + w*w);\r\n    \treturn new Vector4d(x * invLength, y * invLength, z * invLength, w * invLength);\r\n\t}\r\n\r\n\tpublic static Vector4d UnitX() {\r\n\t\treturn new Vector4d(1,0,0,0);\r\n\t}\r\n\tpublic static Vector4d UnitY() {\r\n\t\treturn new Vector4d(0,1,0,0);\r\n\t}\r\n\t\r\n\tpublic static Vector4d UnitZ() {\r\n\t\treturn new Vector4d(0,0,1,0);\r\n\t}\r\n\r\n\tpublic static Vector4d UnitW() {\r\n\t\treturn new Vector4d(0,0,0,1);\r\n\t}\r\n\t\r\n\tpublic static Vector4d Zero() {\r\n\t\treturn new Vector4d(0,0,0,0);\r\n\t}\r\n\t\r\n\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "scatterer/Utilities/Misc/IcoSphere.cs",
    "content": "using UnityEngine;\r\nusing UnityEngine.Rendering;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic static class IcoSphere\r\n\t{\r\n\t\tprivate struct TriangleIndices\r\n\t\t{\r\n\t\t\tpublic int v1;\r\n\t\t\tpublic int v2;\r\n\t\t\tpublic int v3;\r\n\t\t\t\r\n\t\t\tpublic TriangleIndices(int v1, int v2, int v3)\r\n\t\t\t{\r\n\t\t\t\tthis.v1 = v1;\r\n\t\t\t\tthis.v2 = v2;\r\n\t\t\t\tthis.v3 = v3;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t// return index of point in the middle of p1 and p2\r\n\t\tprivate static int getMiddlePoint(int p1, int p2, ref List<Vector3> vertices, ref Dictionary<long, int> cache, float radius)\r\n\t\t{\r\n\t\t\t// first check if we have it already\r\n\t\t\tbool firstIsSmaller = p1 < p2;\r\n\t\t\tlong smallerIndex = firstIsSmaller ? p1 : p2;\r\n\t\t\tlong greaterIndex = firstIsSmaller ? p2 : p1;\r\n\t\t\tlong key = (smallerIndex << 32) + greaterIndex;\r\n\t\t\t\r\n\t\t\tint ret;\r\n\t\t\tif (cache.TryGetValue(key, out ret))\r\n\t\t\t{\r\n\t\t\t\treturn ret;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t// not in cache, calculate it\r\n\t\t\tVector3 point1 = vertices[p1];\r\n\t\t\tVector3 point2 = vertices[p2];\r\n\t\t\tVector3 middle = new Vector3\r\n\t\t\t\t(\r\n\t\t\t\t\t(point1.x + point2.x) / 2f, \r\n\t\t\t\t\t(point1.y + point2.y) / 2f, \r\n\t\t\t\t\t(point1.z + point2.z) / 2f\r\n\t\t\t\t\t);\r\n\t\t\t\r\n\t\t\t// add vertex makes sure point is on unit sphere\r\n\t\t\tint i = vertices.Count;\r\n\t\t\tvertices.Add( middle.normalized * radius ); \r\n\t\t\t\r\n\t\t\t// store it, return index\r\n\t\t\tcache.Add(key, i);\r\n\t\t\t\r\n\t\t\treturn i;\r\n\t\t}\r\n\r\n\t\t//consider building this only once, same for the 32bit index plane\r\n\t\tpublic static Mesh CreateIcoSphereMesh()\r\n\t\t{\r\n\t\t\tMesh mesh = new Mesh ();\r\n\t\t\tmesh.Clear();\r\n\t\t\t\r\n\t\t\tList<Vector3> vertList = new List<Vector3>();\r\n\t\t\tDictionary<long, int> middlePointIndexCache = new Dictionary<long, int>();\r\n\t\t\t\r\n\t\t\tint recursionLevel = 5;\r\n\t\t\tfloat radius = 1f;\r\n\t\t\t\r\n\t\t\t// create 12 vertices of a icosahedron\r\n\t\t\tfloat t = (1f + Mathf.Sqrt(5f)) / 2f;\r\n\t\t\t\r\n\t\t\tvertList.Add(new Vector3(-1f,  t,  0f).normalized * radius);\r\n\t\t\tvertList.Add(new Vector3( 1f,  t,  0f).normalized * radius);\r\n\t\t\tvertList.Add(new Vector3(-1f, -t,  0f).normalized * radius);\r\n\t\t\tvertList.Add(new Vector3( 1f, -t,  0f).normalized * radius);\r\n\t\t\t\r\n\t\t\tvertList.Add(new Vector3( 0f, -1f,  t).normalized * radius);\r\n\t\t\tvertList.Add(new Vector3( 0f,  1f,  t).normalized * radius);\r\n\t\t\tvertList.Add(new Vector3( 0f, -1f, -t).normalized * radius);\r\n\t\t\tvertList.Add(new Vector3( 0f,  1f, -t).normalized * radius);\r\n\t\t\t\r\n\t\t\tvertList.Add(new Vector3( t,  0f, -1f).normalized * radius);\r\n\t\t\tvertList.Add(new Vector3( t,  0f,  1f).normalized * radius);\r\n\t\t\tvertList.Add(new Vector3(-t,  0f, -1f).normalized * radius);\r\n\t\t\tvertList.Add(new Vector3(-t,  0f,  1f).normalized * radius);\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t// create 20 triangles of the icosahedron\r\n\t\t\tList<TriangleIndices> faces = new List<TriangleIndices>();\r\n\t\t\t\r\n\t\t\t// 5 faces around point 0\r\n\t\t\tfaces.Add(new TriangleIndices(0, 11, 5));\r\n\t\t\tfaces.Add(new TriangleIndices(0, 5, 1));\r\n\t\t\tfaces.Add(new TriangleIndices(0, 1, 7));\r\n\t\t\tfaces.Add(new TriangleIndices(0, 7, 10));\r\n\t\t\tfaces.Add(new TriangleIndices(0, 10, 11));\r\n\t\t\t\r\n\t\t\t// 5 adjacent faces \r\n\t\t\tfaces.Add(new TriangleIndices(1, 5, 9));\r\n\t\t\tfaces.Add(new TriangleIndices(5, 11, 4));\r\n\t\t\tfaces.Add(new TriangleIndices(11, 10, 2));\r\n\t\t\tfaces.Add(new TriangleIndices(10, 7, 6));\r\n\t\t\tfaces.Add(new TriangleIndices(7, 1, 8));\r\n\t\t\t\r\n\t\t\t// 5 faces around point 3\r\n\t\t\tfaces.Add(new TriangleIndices(3, 9, 4));\r\n\t\t\tfaces.Add(new TriangleIndices(3, 4, 2));\r\n\t\t\tfaces.Add(new TriangleIndices(3, 2, 6));\r\n\t\t\tfaces.Add(new TriangleIndices(3, 6, 8));\r\n\t\t\tfaces.Add(new TriangleIndices(3, 8, 9));\r\n\t\t\t\r\n\t\t\t// 5 adjacent faces \r\n\t\t\tfaces.Add(new TriangleIndices(4, 9, 5));\r\n\t\t\tfaces.Add(new TriangleIndices(2, 4, 11));\r\n\t\t\tfaces.Add(new TriangleIndices(6, 2, 10));\r\n\t\t\tfaces.Add(new TriangleIndices(8, 6, 7));\r\n\t\t\tfaces.Add(new TriangleIndices(9, 8, 1));\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t// refine triangles\r\n\t\t\tfor (int i = 0; i < recursionLevel; i++)\r\n\t\t\t{\r\n\t\t\t\tList<TriangleIndices> faces2 = new List<TriangleIndices>();\r\n\t\t\t\tforeach (var tri in faces)\r\n\t\t\t\t{\r\n\t\t\t\t\t// replace triangle by 4 triangles\r\n\t\t\t\t\tint a = getMiddlePoint(tri.v1, tri.v2, ref vertList, ref middlePointIndexCache, radius);\r\n\t\t\t\t\tint b = getMiddlePoint(tri.v2, tri.v3, ref vertList, ref middlePointIndexCache, radius);\r\n\t\t\t\t\tint c = getMiddlePoint(tri.v3, tri.v1, ref vertList, ref middlePointIndexCache, radius);\r\n\t\t\t\t\t\r\n\t\t\t\t\tfaces2.Add(new TriangleIndices(tri.v1, a, c));\r\n\t\t\t\t\tfaces2.Add(new TriangleIndices(tri.v2, b, a));\r\n\t\t\t\t\tfaces2.Add(new TriangleIndices(tri.v3, c, b));\r\n\t\t\t\t\tfaces2.Add(new TriangleIndices(a, b, c));\r\n\t\t\t\t}\r\n\t\t\t\tfaces = faces2;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tmesh.vertices = vertList.ToArray();\r\n\t\t\t\r\n\t\t\tList< int > triList = new List<int>();\r\n\t\t\tfor( int i = 0; i < faces.Count; i++ )\r\n\t\t\t{\r\n\t\t\t\ttriList.Add( faces[i].v1 );\r\n\t\t\t\ttriList.Add( faces[i].v2 );\r\n\t\t\t\ttriList.Add( faces[i].v3 );\r\n\t\t\t}\t\t\r\n\t\t\tmesh.triangles = triList.ToArray();\r\n\t\t\tmesh.uv = new Vector2[ mesh.vertices.Length ];\r\n\t\t\t\r\n\t\t\tVector3[] normales = new Vector3[ vertList.Count];\r\n\t\t\tfor( int i = 0; i < normales.Length; i++ )\r\n\t\t\t\tnormales[i] = vertList[i].normalized;\r\n\t\t\t\r\n\t\t\t\r\n\t\t\tmesh.normals = normales;\r\n\t\t\t\r\n\t\t\tmesh.RecalculateBounds();\r\n\t\t\tmesh.Optimize();\r\n\r\n\t\t\treturn mesh;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/Utilities/Misc/MeshFactory.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEngine.Rendering;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic static class MeshFactory  \r\n\t{\r\n\t\tpublic enum PLANE { XY, XZ, YZ };\r\n\r\n\t\tpublic static Mesh MakePlane(int w, int h, PLANE plane, bool _01, bool cw, float UVoffset=0f, float UVscale=1f) \r\n\t\t{\r\n\t\t\tVector3[] vertices = new Vector3[w*h];\r\n\t\t\tVector2[] texcoords = new Vector2[w*h];\r\n\t\t\tVector3[] normals = new Vector3[w*h];\r\n\t\t\tint[] indices = new int[w*h*6];\r\n\t\t\t\r\n\t\t\tfor(int x = 0; x < w; x++)\r\n\t\t\t{\r\n\t\t\t\tfor(int y = 0; y < h; y++)\r\n\t\t\t\t{\r\n\t\t\t\t\tVector2 uv = new Vector3((float)x / (float)(w-1), (float)y / (float)(h-1));\r\n\r\n\t\t\t\t\tuv.y *= UVscale;\r\n\t\t\t\t\tuv.y += UVoffset;\r\n\r\n\t\t\t\t\tVector2 p = new Vector2();\r\n\t\t\t\t\t\r\n\t\t\t\t\tif(_01)\r\n\t\t\t\t\t\tp = uv;\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tp.x = (uv.x-0.5f)*2.0f;\r\n\t\t\t\t\t\tp.y = (uv.y-0.5f)*2.0f;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tVector3 pos, norm;\r\n\t\t\t\t\t\r\n\t\t\t\t\tswitch((int)plane)\r\n\t\t\t\t\t{\r\n\t\t\t\t\tcase (int)PLANE.XY:\r\n\t\t\t\t\t\tpos = new Vector3(p.x, p.y, 0.0f);\r\n\t\t\t\t\t\tnorm = new Vector3(0.0f, 0.0f, 1.0f);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\r\n\t\t\t\t\tcase (int)PLANE.XZ:\r\n\t\t\t\t\t\tpos = new Vector3(p.x, 0.0f, p.y);\r\n\t\t\t\t\t\tnorm = new Vector3(0.0f, 1.0f, 0.0f);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\r\n\t\t\t\t\tcase (int)PLANE.YZ:\r\n\t\t\t\t\t\tpos = new Vector3(0.0f, p.x, p.y);\r\n\t\t\t\t\t\tnorm = new Vector3(1.0f, 0.0f, 0.0f);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tpos = new Vector3(p.x, p.y, 0.0f);\r\n\t\t\t\t\t\tnorm = new Vector3(0.0f, 0.0f, 1.0f);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\ttexcoords[x+y*w] = uv;\r\n\t\t\t\t\tvertices[x+y*w] = pos;\r\n\t\t\t\t\tnormals[x+y*w] = norm;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tint num = 0;\r\n\t\t\tfor(int x = 0; x < w-1; x++)\r\n\t\t\t{\r\n\t\t\t\tfor(int y = 0; y < h-1; y++)\r\n\t\t\t\t{\r\n\t\t\t\t\tif(cw)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tindices[num++] = x + y * w;\r\n\t\t\t\t\t\tindices[num++] = x + (y+1) * w;\r\n\t\t\t\t\t\tindices[num++] = (x+1) + y * w;\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tindices[num++] = x + (y+1) * w;\r\n\t\t\t\t\t\tindices[num++] = (x+1) + (y+1) * w;\r\n\t\t\t\t\t\tindices[num++] = (x+1) + y * w;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tindices[num++] = x + y * w;\r\n\t\t\t\t\t\tindices[num++] = (x+1) + y * w;\r\n\t\t\t\t\t\tindices[num++] = x + (y+1) * w;\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tindices[num++] = x + (y+1) * w;\r\n\t\t\t\t\t\tindices[num++] = (x+1) + y * w;\r\n\t\t\t\t\t\tindices[num++] = (x+1) + (y+1) * w;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tMesh mesh = new Mesh();\r\n\t\t\t\r\n\t\t\tmesh.vertices = vertices;\r\n\t\t\tmesh.uv = texcoords;\r\n\t\t\tmesh.triangles = indices;\r\n\t\t\tmesh.normals = normals;\r\n\t\t\t\r\n\t\t\treturn mesh;\r\n\t\t}\r\n\t\t\r\n\t\tpublic static Mesh MakePlaneWithFrustumIndexes() //basically the same above for w=2, h=2, XY, false, false + frustum corner indexes stored in the vertexes\r\n\t\t\t//the frustum corner indexes later allow to reconstruct world viewdir inexpensively in the shader\r\n\t\t\t//by passing the frustum corners directions in world space\r\n\t\t{\r\n\t\t\t\r\n\t\t\tVector3[] vertices = new Vector3[4];\r\n\t\t\tVector2[] texcoords = new Vector2[4];\r\n\t\t\tint[] indices = new int[6];\r\n\t\t\t\r\n\t\t\tfor(int x = 0; x < 2; x++)\r\n\t\t\t{\r\n\t\t\t\tfor(int y = 0; y < 2; y++)\r\n\t\t\t\t{\r\n\t\t\t\t\tVector2 uv = new Vector3((float)x , (float)y);\r\n\t\t\t\t\tVector2 p = new Vector2();\r\n\t\t\t\t\t\r\n\t\t\t\t\tp.x = (uv.x-0.5f)*2.0f;\r\n\t\t\t\t\tp.y = (uv.y-0.5f)*2.0f;\r\n\t\t\t\t\t\r\n\t\t\t\t\tVector3 pos = new Vector3(p.x, p.y, (float)(x + 2*y));\r\n\r\n\t\t\t\t\ttexcoords[x+y*2] = uv;\r\n\t\t\t\t\tvertices[x+y*2] = pos;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tindices [0] = 0;\r\n\t\t\tindices [1] = 1;\r\n\t\t\tindices [2] = 2;\r\n\t\t\t\r\n\t\t\tindices [3] = 2;\r\n\t\t\tindices [4] = 1;\r\n\t\t\tindices [5] = 3;\r\n\t\t\t\r\n\t\t\tMesh mesh = new Mesh();\r\n\t\t\t\r\n\t\t\tmesh.vertices = vertices;\r\n\t\t\tmesh.uv = texcoords;\r\n\t\t\tmesh.triangles = indices;\r\n\t\t\t\r\n\t\t\treturn mesh;\r\n\t\t}\r\n\r\n\t\t//Makes a plane with 32bit index format, for meshes bigger than 256*256\r\n\t\tpublic static Mesh MakePlane32BitIndexFormat(int w, int h, PLANE plane, bool _01, bool cw, float UVoffset=0f, float UVscale=1f) \r\n\t\t{\r\n\t\t\t\r\n\t\t\tVector3[] vertices = new Vector3[w*h];\r\n\t\t\tVector2[] texcoords = new Vector2[w*h];\r\n\t\t\tint[] indices = new int[w*h*6];\r\n\t\t\t\r\n\t\t\tfor(int x = 0; x < w; x++)\r\n\t\t\t{\r\n\t\t\t\tfor(int y = 0; y < h; y++)\r\n\t\t\t\t{\r\n\t\t\t\t\tVector2 uv = new Vector3((float)x / (float)(w-1), (float)y / (float)(h-1));\r\n\t\t\t\t\t\r\n\t\t\t\t\tuv.y *= UVscale;\r\n\t\t\t\t\tuv.y += UVoffset;\r\n\t\t\t\t\t\r\n\t\t\t\t\tVector2 p = new Vector2();\r\n\t\t\t\t\t\r\n\t\t\t\t\tif(_01)\r\n\t\t\t\t\t\tp = uv;\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tp.x = (uv.x-0.5f)*2.0f;\r\n\t\t\t\t\t\tp.y = (uv.y-0.5f)*2.0f;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\tVector3 pos;\r\n\t\t\t\t\t\r\n\t\t\t\t\tswitch((int)plane)\r\n\t\t\t\t\t{\r\n\t\t\t\t\tcase (int)PLANE.XY:\r\n\t\t\t\t\t\tpos = new Vector3(p.x, p.y, 0.0f);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\r\n\t\t\t\t\tcase (int)PLANE.XZ:\r\n\t\t\t\t\t\tpos = new Vector3(p.x, 0.0f, p.y);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\r\n\t\t\t\t\tcase (int)PLANE.YZ:\r\n\t\t\t\t\t\tpos = new Vector3(0.0f, p.x, p.y);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tpos = new Vector3(p.x, p.y, 0.0f);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\ttexcoords[x+y*w] = uv;\r\n\t\t\t\t\tvertices[x+y*w] = pos;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tint num = 0;\r\n\t\t\tfor(int x = 0; x < w-1; x++)\r\n\t\t\t{\r\n\t\t\t\tfor(int y = 0; y < h-1; y++)\r\n\t\t\t\t{\r\n\t\t\t\t\tif(cw)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tindices[num++] = x + y * w;\r\n\t\t\t\t\t\tindices[num++] = x + (y+1) * w;\r\n\t\t\t\t\t\tindices[num++] = (x+1) + y * w;\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tindices[num++] = x + (y+1) * w;\r\n\t\t\t\t\t\tindices[num++] = (x+1) + (y+1) * w;\r\n\t\t\t\t\t\tindices[num++] = (x+1) + y * w;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tindices[num++] = x + y * w;\r\n\t\t\t\t\t\tindices[num++] = (x+1) + y * w;\r\n\t\t\t\t\t\tindices[num++] = x + (y+1) * w;\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tindices[num++] = x + (y+1) * w;\r\n\t\t\t\t\t\tindices[num++] = (x+1) + y * w;\r\n\t\t\t\t\t\tindices[num++] = (x+1) + (y+1) * w;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tMesh mesh = new Mesh();\r\n\t\t\t\r\n\t\t\tmesh.indexFormat = IndexFormat.UInt32;\r\n\t\t\tmesh.SetVertices(new List<Vector3>(vertices));\r\n\t\t\tmesh.SetUVs(0, new List<Vector2>(texcoords));\r\n\t\t\tmesh.SetIndices(indices, MeshTopology.Triangles, 0);\r\n\t\t\t\r\n\t\t\t\r\n\t\t\treturn mesh;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/Utilities/Misc/PlanetSecondaryLightUpdater.cs",
    "content": "// I split the scaled planet material into 2 materials, one for the main light pass and another for the secondary light passes so I can inject eclipses in-between the two materials\r\n// This causes issues with Kopernicus ondemand though, when it unloads the planet the texture is lost, when it loads it back it only updates the texture for the original material (main pass)\r\n// This syncs up the second material every few frames\r\n\r\nusing UnityEngine;\r\nusing System;\r\nusing System.IO;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\nusing KSP.IO;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class PlanetSecondaryLightUpdater : MonoBehaviour\r\n\t{\r\n\t\tMaterial sourceMaterial, targetMaterial;\r\n\r\n\t\tpublic PlanetSecondaryLightUpdater ()\r\n\t\t{\r\n\t\t}\r\n\r\n\t\tpublic void Init(Material inSourceMaterial, Material inTargetMaterial)\r\n\t\t{\r\n\t\t\tsourceMaterial = inSourceMaterial;\r\n\t\t\ttargetMaterial = inTargetMaterial;\r\n\r\n\t\t\ttry {StartCoroutine(UpdateCoroutine ());}\r\n\t\t\tcatch (Exception e){Utils.LogError(\"Error when starting PlanetSecondaryLightUpdater::UpdateCoroutine coroutine \"+e.Message);};\r\n\t\t}\r\n\t\t\r\n\t\tIEnumerator UpdateCoroutine()\r\n\t\t{\r\n\t\t\twhile (true)\r\n\t\t\t{\r\n\t\t\t\tif (sourceMaterial && targetMaterial)\r\n\t\t\t\t{\r\n\t\t\t\t\ttargetMaterial.CopyPropertiesFromMaterial (sourceMaterial);\r\n\t\t\t\t\ttargetMaterial.SetShaderPassEnabled (\"ForwardBase\", false);\r\n\t\t\t\t\ttargetMaterial.SetShaderPassEnabled (\"ForwardAdd\", true);\r\n\t\t\t\t\ttargetMaterial.renderQueue = 2002;\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tyield return new WaitForSeconds (1.3f);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void OnDestroy()\r\n\t\t{\r\n\t\t\tStopAllCoroutines ();\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/Utilities/Misc/Utils.cs",
    "content": "using System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.IO;\r\nusing System.Reflection;\r\nusing System.Runtime;\r\nusing KSP;\r\nusing KSP.IO;\r\nusing UnityEngine;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic static class Utils\r\n\t{\t\t\r\n\t\tprivate static string pluginPath;\r\n\t\tpublic static string PluginPath\r\n\t\t{\r\n\t\t\tget\r\n\t\t\t{\r\n\t\t\t\tif (pluginPath == null)\r\n\t\t\t\t{\r\n\t\t\t\t\tstring codeBase = Assembly.GetExecutingAssembly ().CodeBase;\r\n\t\t\t\t\tUriBuilder uri = new UriBuilder (codeBase);\r\n\t\t\t\t\tpluginPath = Uri.UnescapeDataString (uri.Path);\r\n\t\t\t\t\tpluginPath = Path.GetDirectoryName (pluginPath);\t\t\t\t\t\r\n\t\t\t\t}\r\n\t\t\t\treturn pluginPath;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tprivate static string gameDataPath;\r\n\t\tpublic static string GameDataPath\r\n\t\t{\r\n\t\t\tget\r\n\t\t\t{\r\n\t\t\t\tif (gameDataPath==null)\r\n\t\t\t\t{\r\n\t\t\t\t\tgameDataPath= KSPUtil.ApplicationRootPath + \"GameData/\";\t\t\t\t\r\n\t\t\t\t}\r\n\t\t\t\treturn gameDataPath;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic static void LogDebug(string log)\r\n\t\t{\r\n\t\t\tDebug.Log (\"[Scatterer][Debug] \" + log);\r\n\t\t}\r\n\t\t\r\n\t\tpublic static void LogInfo(string log)\r\n\t\t{\r\n\t\t\tDebug.Log (\"[Scatterer][Info] \" + log);\r\n\t\t}\r\n\t\t\r\n\t\tpublic static void LogError(string log)\r\n\t\t{\r\n\t\t\tDebug.LogError(\"[Scatterer][Error] \" + log);\r\n\t\t}\r\n\r\n\t\tpublic static GameObject GetMainMenuObject(CelestialBody celestialBody)\r\n\t\t{\r\n\t\t\tstring name = celestialBody.name;\r\n\r\n\t\t\tGameObject mainMenuObject = GameObject.FindObjectsOfType<GameObject>().FirstOrDefault(b => ( (b.name == name) && b.transform.parent.name.Contains(\"Scene\")));\r\n\t\t\t\r\n\t\t\tif (!mainMenuObject)\r\n\t\t\t{\r\n\t\t\t\tthrow new Exception(\"No correct main menu object found for \"+celestialBody.name);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\treturn mainMenuObject;\r\n\t\t}\r\n\t\t\r\n\t\tpublic static Transform GetScaledTransform (string body)\r\n\t\t{\r\n\t\t\treturn (ScaledSpace.Instance.transform.FindChild (body));\t\r\n\t\t}\r\n\t\t\r\n\t\tpublic static void FixKopernicusRingsRenderQueue ()\r\n\t\t{\r\n\t\t\tforeach (CelestialBody _cb in FlightGlobals.Bodies) {\r\n\t\t\t\tGameObject ringObject;\r\n\t\t\t\tringObject = GameObject.Find (_cb.name + \"Ring\");\r\n\t\t\t\tif (ringObject) {\r\n\t\t\t\t\tringObject.GetComponent<MeshRenderer> ().material.renderQueue = 3005;\r\n\t\t\t\t\tUtils.LogDebug (\"Found rings for \" + _cb.name);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tpublic static void FixSunsCoronaRenderQueue ()\r\n\t\t{\r\n\t\t\tforeach(ScattererCelestialBody _scattererCB in Scatterer.Instance.planetsConfigsReader.scattererCelestialBodies)\r\n\t\t\t{\r\n\t\t\t\tTransform scaledSunTransform = Utils.GetScaledTransform (_scattererCB.mainSunCelestialBody);\r\n\t\t\t\tif (scaledSunTransform != null)\r\n\t\t\t\t{ \r\n\t\t\t\t\tforeach (Transform child in scaledSunTransform)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif (child != null)\r\n\t\t\t\t\t\t{ \r\n\t\t\t\t\t\t\tMeshRenderer temp = child.gameObject.GetComponent<MeshRenderer> ();\r\n\t\t\t\t\t\t\tif (temp != null)\r\n\t\t\t\t\t\t\t{ \r\n\t\t\t\t\t\t\t\ttemp.material.renderQueue = 2998;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic static RenderTexture CreateTexture(string name, int width, int height, int depth, RenderTextureFormat format, bool useMipmap, FilterMode filtermode, int antiAliasing)\r\n\t\t{\r\n\t\t\t\r\n\t\t\tRenderTexture renderTexture = new RenderTexture ( width,height,depth, format);\r\n\t\t\trenderTexture.name = name;\r\n\t\t\trenderTexture.useMipMap=useMipmap;\r\n\t\t\trenderTexture.filterMode = filtermode;\r\n\t\t\trenderTexture.antiAliasing = antiAliasing;\r\n\t\t\trenderTexture.Create ();\r\n\t\t\t\r\n\t\t\treturn renderTexture;\r\n\t\t}\r\n\r\n\t\t// As of 1.9.1 there are two rendering modes in KSP, unified localCamera (Directx 11) and dual local cameras (the old mode)\r\n\t\t// Sometimes we need to do some work on the first local camera to render, which can be either the unified camera or the far camera\r\n\t\tpublic static Camera getEarliestLocalCamera()\r\n\t\t{\r\n\t\t\treturn Scatterer.Instance.unifiedCameraMode ? Scatterer.Instance.nearCamera : Scatterer.Instance.farCamera;\r\n\t\t}\r\n\r\n\t\t// Will return true for zero, so be aware\r\n\t\tpublic static bool IsPowerOfTwo(int x)\r\n\t\t{\r\n\t\t\treturn (x & (x - 1)) == 0;\r\n\t\t}\r\n\r\n\t\t// If condition is true, enable keywordOn and disable keywordOff, else do the opposite\r\n\t\tpublic static void EnableOrDisableShaderKeywords(Material mat, string keywordOn, string keywordOff, bool enable) \r\n\t\t{\r\n\t\t\tif (mat)\r\n\t\t\t{\r\n\t\t\t\tif (enable)\r\n\t\t\t\t{\r\n\t\t\t\t\tmat.EnableKeyword (keywordOn);\r\n\t\t\t\t\tmat.DisableKeyword (keywordOff);\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tmat.EnableKeyword (keywordOff);\r\n\t\t\t\t\tmat.DisableKeyword (keywordOn);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t//Thanks to linx for this snippet\r\n\t\tpublic static Texture2D LoadDDSTexture(byte[] data, string name)\r\n\t\t{\r\n\t\t\tTexture2D texture=null;\r\n\t\t\t\r\n\t\t\tbyte ddsSizeCheck = data[4];\r\n\t\t\tif (ddsSizeCheck != 124)\r\n\t\t\t{\r\n\t\t\t\tLogError(\"This DDS texture is invalid - Unable to read the size check value from the header.\");\r\n\t\t\t\treturn texture;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t\r\n\t\t\tint height = data[13] * 256 + data[12];\r\n\t\t\tint width = data[17] * 256 + data[16];\r\n\t\t\t\r\n\t\t\tint DDS_HEADER_SIZE = 128;\r\n\t\t\tbyte[] dxtBytes = new byte[data.Length - DDS_HEADER_SIZE];\r\n\t\t\tBuffer.BlockCopy(data, DDS_HEADER_SIZE, dxtBytes, 0, data.Length - DDS_HEADER_SIZE);\r\n\t\t\tint mipMapCount = (data[28]) | (data[29] << 8) | (data[30] << 16) | (data[31] << 24);\r\n\t\t\t\r\n\t\t\tTextureFormat format = TextureFormat.YUY2; //just an invalid type\r\n\t\t\tif (data[84] == 'D')\r\n\t\t\t{\r\n\t\t\t\tif (data[87] == 49) //Also char '1'\r\n\t\t\t\t{\r\n\t\t\t\t\tformat = TextureFormat.DXT1;\r\n\t\t\t\t}\r\n\t\t\t\telse if (data[87] == 53)    //Also char '5'\r\n\t\t\t\t{\r\n\t\t\t\t\tformat = TextureFormat.DXT5;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif (format == TextureFormat.YUY2)\r\n\t\t\t{\r\n\t\t\t\tLogError(\"Format of texture \"+name+\" unidentified\");\r\n\t\t\t\treturn texture;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif (mipMapCount == 1)\r\n\t\t\t{\r\n\t\t\t\ttexture = new Texture2D(width, height, format, false);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\ttexture = new Texture2D(width, height, format, true);\r\n\t\t\t}\r\n\t\t\ttry\r\n\t\t\t{\r\n\t\t\t\ttexture.LoadRawTextureData(dxtBytes);\r\n\t\t\t}\r\n\t\t\tcatch\r\n\t\t\t{\r\n\t\t\t\tLogError(\"Texture \"+name+\" couldn't be loaded\");\r\n\t\t\t\treturn texture;\r\n\t\t\t}\r\n\t\t\ttexture.Apply();\r\n\t\t\t\r\n\t\t\tLogInfo (\"Loaded texture \" + name + \" \" + width.ToString () + \"x\" + height.ToString () + \" mip count: \" + mipMapCount.ToString ());\r\n\t\t\t\r\n\t\t\treturn texture;\r\n\t\t}\r\n\r\n\t\tpublic static void SetToneMapping(Material mat)\r\n\t\t{\r\n\t\t\t//mat.SetInt(\"TONEMAPPING_MODE\", Scatterer.Instance.mainSettings.scatteringTonemapper);\r\n\r\n\t\t\t// set them globally for the composite clouds material\r\n\t\t\tShader.SetGlobalInt(\"TONEMAPPING_MODE\", Scatterer.Instance.mainSettings.scatteringTonemapper);\r\n\r\n\t\t\t/*\r\n\t\t\tif (Scatterer.Instance.mainSettings.scatteringTonemapper == 3)\r\n\t\t\t{\r\n\t\t\t\tHableCurve curve = new HableCurve();\r\n\t\t\t\tcurve.Init(\r\n\t\t\t\t\t\tScatterer.Instance.mainSettings.hableToeStrength,\r\n\t\t\t\t\t\tScatterer.Instance.mainSettings.hableToeLength,\r\n\t\t\t\t\t\tScatterer.Instance.mainSettings.hableShoulderStrength,\r\n\t\t\t\t\t\tScatterer.Instance.mainSettings.hableShoulderLength,\r\n\t\t\t\t\t\tScatterer.Instance.mainSettings.hableShoulderAngle,\r\n\t\t\t\t\t\tScatterer.Instance.mainSettings.hableGamma\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\tcurve.SetMaterialParams(mat);\r\n\t\t\t}\r\n\t\t\t*/\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/Utilities/Occlusion/ShadowMapCopier.cs",
    "content": "using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.IO;\nusing System.Reflection;\nusing System.Runtime;\nusing KSP;\nusing KSP.IO;\nusing UnityEngine;\nusing UnityEngine.Rendering;\n\n\nnamespace Scatterer\n{\n\tpublic class ShadowMapCopier : MonoBehaviour\n\t{\n\t\tprivate CommandBuffer copyCascadeCB0, copyCascadeCB1, copyCascadeCB2, copyCascadeCB3, textureCopyBuffer;\n\t\tprivate Light m_Light;\n\t\tbool commandBufferAdded = false;\n\n\t\tprivate static Dictionary<Light, ShadowMapCopier> instances = new Dictionary<Light, ShadowMapCopier>();\n\n\t\tpublic static void RequestShadowMapCopy(Light light)\n\t\t{\n\t\t\tif (instances.ContainsKey (light))\n\t\t\t{\n\t\t\t\tinstances[light].RequestShadowMapCopy();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tinstances[light] = ScaledCamera.Instance.galaxyCamera.gameObject.AddComponent<ShadowMapCopier>();\n\t\t\t\tinstances[light].Init(light);\n\t\t\t\tinstances[light].RequestShadowMapCopy();\n\t\t\t}\n\t\t}\n\n\t\tpublic ShadowMapCopier ()\n\t\t{\n\t\t}\n\n\t\tpublic void Init (Light light)\n\t\t{\n\t\t\tm_Light = light;\n\t\t\tCreateTextureCopyCB ();\n\t\t\tGameEvents.onGameSceneLoadRequested.Add(RecreateForSceneChange);\n\t\t}\n\t\t\n\t\tpublic void RecreateForSceneChange(GameScenes scene)\n\t\t{\n\t\t\tStartCoroutine (DelayedRecreateForSceneChange());\n\t\t}\n\n\t\t//When scene changes, the resolution of the shadowMap can change so recreate the commandBuffers\n\t\tIEnumerator DelayedRecreateForSceneChange()\n\t\t{\n\t\t\tfor (int i=0; i<7; i++)\n\t\t\t\tyield return new WaitForFixedUpdate ();\n\n\t\t\tDisable ();\n\t\t\tCreateTextureCopyCB ();\n\t\t}\n\n        //Adds one one commandbuffer which does an optimized pixel-by-pixel texture copy\n        private void CreateTextureCopyCB()\n        {\n            textureCopyBuffer = new CommandBuffer();\n            textureCopyBuffer.name = \"Scatterer shadowMap copy CommandBuffer\";\n            textureCopyBuffer.CopyTexture (BuiltinRenderTextureType.CurrentActive, ShadowMapCopy.RenderTexture);\n        }\n\n\t\t//These are adapted for copying one cascade and then rendering other stuff on top, like clouds, however since I'm going to render them separately, better do a fast copytexture\n\t\tprivate void CreateCopyCascadeCBs()\n\t\t{\n\t\t\tcopyCascadeCB0 = CreateCopyCascadeCB (ShadowMapCopy.RenderTexture,   0f,   0f, 0.5f, 0.5f);\n\t\t\tcopyCascadeCB1 = CreateCopyCascadeCB (ShadowMapCopy.RenderTexture, 0.5f,   0f, 0.5f, 0.5f);\n\t\t\tcopyCascadeCB2 = CreateCopyCascadeCB (ShadowMapCopy.RenderTexture,   0f, 0.5f, 0.5f, 0.5f);\n\t\t\tcopyCascadeCB3 = CreateCopyCascadeCB (ShadowMapCopy.RenderTexture, 0.5f, 0.5f, 0.5f, 0.5f);\n\t\t}\n\n        private CommandBuffer CreateCopyCascadeCB(RenderTexture targetRt, float startX, float startY, float width, float height)\n        {\n            CommandBuffer cascadeCopyCB = new CommandBuffer();\n            cascadeCopyCB.name = \"Scatterer shadowMap cascade copy CommandBuffer\";\n            Rect cascadeRect = new Rect ((int)(startX * targetRt.width), (int)(startY * targetRt.height), (int)(width * targetRt.width), (int)(height * targetRt.height));\n\n\t\t\tcascadeCopyCB.EnableScissorRect(cascadeRect);\n\t\t\tcascadeCopyCB.SetShadowSamplingMode(BuiltinRenderTextureType.CurrentActive, ShadowSamplingMode.RawDepth);\n\t\t\tcascadeCopyCB.Blit (BuiltinRenderTextureType.CurrentActive,targetRt);\n\t\t\tcascadeCopyCB.DisableScissorRect();\n\n\t\t\treturn cascadeCopyCB;\n\t\t}\n\n\t\tpublic void Disable()\n\t\t{\n\t\t\tm_Light.RemoveCommandBuffer(LightEvent.AfterShadowMap, textureCopyBuffer);\n\n\t\t\tcommandBufferAdded = false;\n\t\t}\n\n\t\tpublic void Enable ()\n\t\t{\n\t\t\tif (!commandBufferAdded)\n\t\t\t{\n\t\t\t\tm_Light.AddCommandBuffer(LightEvent.AfterShadowMap, textureCopyBuffer);\n\n\t\t\t\tcommandBufferAdded = true;\n\t\t\t}\n\t\t}\n\n\t\tpublic void OnPreRender()\n\t\t{\n\t\t\tif (commandBufferAdded)\n\t\t\t\tDisable ();\n\t\t}\n\n\t\tprivate void RequestShadowMapCopy()\n\t\t{\t\n\t\t\tif (!commandBufferAdded)\n\t\t\t\tEnable ();\n\t\t}\n\n\t\tpublic void OnDestroy ()\n\t\t{\n\t\t\tDisable ();\n\t\t}\n\t}\n\n\tpublic static class ShadowMapCopy\n\t{\n\t\tprivate static RenderTexture renderTexture;\n\n\t\tpublic static RenderTexture RenderTexture\n\t\t{\n\t\t\tget \n\t\t\t{\n\t\t\t\tif (!renderTexture)\n\t\t\t\t{\n\t\t\t\t\tCreateTexture();\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t//If the size of the shadowMap changed from the last time we created a copy\n\t\t\t\t\tif (Scatterer.Instance.sunLight.shadowCustomResolution != renderTexture.width)\n\t\t\t\t\t{\n\t\t\t\t\t\trenderTexture.Release();\n\t\t\t\t\t\tCreateTexture();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn renderTexture;\n\t\t\t}\n\t\t}\n\n\t\tprivate static void CreateTexture()\n\t\t{\n\t\t\t//I think we can leave it because they all should have the same custom resolution anyway\n\t\t\trenderTexture = new RenderTexture ((int) Scatterer.Instance.sunLight.shadowCustomResolution, (int) Scatterer.Instance.sunLight.shadowCustomResolution, 0, RenderTextureFormat.Shadowmap);\n\t\t\trenderTexture.useMipMap = false;\n\t\t\trenderTexture.antiAliasing = 1;\n\t\t\trenderTexture.filterMode = FilterMode.Point;\n\t\t\trenderTexture.Create ();\n\t\t}\n\t}\n}\n\n"
  },
  {
    "path": "scatterer/Utilities/Occlusion/ShadowMapRetrieveCommandBuffer.cs",
    "content": "using UnityEngine;\r\nusing UnityEngine.Rendering;\r\nusing System.Collections.Generic;\r\nusing System;\r\n\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class ShadowMapRetrieveCommandBuffer : MonoBehaviour\r\n\t{\r\n\r\n\t\tprivate CommandBuffer m_Buffer;\r\n\t\tprivate Light m_Light;\r\n\r\n        public void Start ()\r\n        {\r\n            m_Buffer = new CommandBuffer();\r\n            m_Buffer.name = \"Scatterer ShadowMapRetrieve CommandBuffer\";\r\n\r\n\t\t\t//instead of making a copy like shadowMapCopyCommandbuffer, here we just set the shadowmap as a global texture, for access in shader\r\n\t\t\tm_Buffer.SetGlobalTexture (ShaderProperties._ShadowMapTextureScatterer_PROPERTY, new RenderTargetIdentifier(BuiltinRenderTextureType.CurrentActive));\r\n\t\t\t\r\n\t\t\tm_Light = GetComponent<Light>();\r\n\t\t\tm_Light.AddCommandBuffer (LightEvent.AfterShadowMap, m_Buffer);\r\n\t\t}\r\n\r\n\t\tpublic void OnDestroy ()\r\n\t\t{\r\n\t\t\tm_Light.RemoveCommandBuffer (LightEvent.AfterShadowMap, m_Buffer);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/Utilities/Occlusion/ShadowMaskCopyCommandBuffer.cs",
    "content": "using UnityEngine;\r\nusing UnityEngine.Rendering;\r\nusing System.Collections.Generic;\r\nusing System;\r\n\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class ShadowMaskCopyCommandBuffer : MonoBehaviour\r\n\t{\r\n\r\n\t\tprivate CommandBuffer m_Buffer;\r\n\t\tprivate Light m_Light;\r\n\r\n        public ShadowMaskCopyCommandBuffer ()\r\n        {\r\n            // after light's screenspace shadow mask is computed, copy it\r\n            m_Buffer = new CommandBuffer();\r\n            m_Buffer.name = \"Scatterer ScreenspaceShadowMaskCopy CommandBuffer\";\r\n            \r\n//            m_Buffer.Blit (BuiltinRenderTextureType.CurrentActive, Core.Instance.bufferRenderingManager.occlusionTexture);\r\n            \r\n            m_Light = GetComponent<Light>();\r\n            m_Light.AddCommandBuffer (LightEvent.AfterScreenspaceMask, m_Buffer);\r\n        }\r\n\r\n\t\tpublic void OnDestroy ()\r\n\t\t{\r\n\t\t\tm_Light.RemoveCommandBuffer (LightEvent.AfterScreenspaceMask, m_Buffer);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/Utilities/Occlusion/ShadowMaskModulateCommandBuffer.cs",
    "content": "using UnityEngine;\r\nusing UnityEngine.Rendering;\r\nusing System.Collections.Generic;\r\nusing System;\r\n\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class ShadowMaskModulateCommandBuffer : MonoBehaviour\r\n\t{\r\n\r\n\t\tprivate CommandBuffer m_Buffer;\r\n\t\tprivate Light m_Light;\r\n\t\tprivate Material m_ShadowMaskModulateMaterial;\r\n\r\n        public ShadowMaskModulateCommandBuffer ()\r\n        {\r\n            // after light's screenspace shadow mask is computed, copy it\r\n            m_Buffer = new CommandBuffer();\r\n            m_Buffer.name = \"Scatterer ScreenspaceShadowMaskmodulate CommandBuffer\";\r\n\r\n\t\t\tm_ShadowMaskModulateMaterial = new Material (ShaderReplacer.Instance.LoadedShaders[(\"Scatterer/ModulateShadowMaskWithOcclusion\")]);\r\n//\t\t\tm_ShadowMaskModulateMaterial.SetTexture (\"OcclusionTexture\", Core.Instance.bufferRenderingManager.occlusionTexture);\r\n\r\n\t\t\t//after light's screenspace shadow mask is computed, modulate it by occlusion texture\r\n//\t\t\tm_Buffer.Blit (Core.Instance.bufferRenderingManager.occlusionTexture, BuiltinRenderTextureType.CurrentActive, m_ShadowMaskModulateMaterial);\r\n\r\n\t\t\tm_Light = GetComponent<Light>();\r\n\t\t\tm_Light.AddCommandBuffer (LightEvent.AfterScreenspaceMask, m_Buffer);\r\n\t\t}\r\n\r\n\t\tpublic void OnDestroy ()\r\n\t\t{\r\n\t\t\tm_Light.RemoveCommandBuffer (LightEvent.AfterScreenspaceMask, m_Buffer);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/Utilities/Occlusion/ShadowRemoveFadeCommandBuffer.cs",
    "content": "//\"fixes\" the shadows fading near far clip plane\r\nusing UnityEngine;\r\nusing UnityEngine.Rendering;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class ShadowRemoveFadeCommandBuffer : MonoBehaviour\r\n\t{\r\n\t\tprivate CommandBuffer m_Buffer;\r\n\t\tprivate Camera m_Camera;\r\n\r\n        private void Awake ()\r\n        {\r\n            m_Buffer = new CommandBuffer();\r\n            m_Buffer.name = \"Scatterer ShadowRemoveFade CommandBuffer\";\r\n                    \r\n            //works for the fade but doesn't fix breaks in squares/axis-aligned lines near farclipPlane of nearCamera, limitation of what? idk\r\n            //could still be ok for SSAO, maybe passable for eclipses but not sure\r\n            m_Buffer.SetGlobalVector (ShaderProperties.unity_ShadowFadeCenterAndType_PROPERTY,new Vector4(float.PositiveInfinity,float.PositiveInfinity,float.PositiveInfinity,-1f));\r\n\r\n\t\t\tm_Camera = GetComponent<Camera>();\r\n\t\t\tm_Camera.AddCommandBuffer (CameraEvent.BeforeForwardOpaque, m_Buffer);\r\n\t\t}\r\n\r\n\t\tpublic void OnDestroy ()\r\n\t\t{\r\n\t\t\tm_Camera.RemoveCommandBuffer (CameraEvent.BeforeForwardOpaque, m_Buffer);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/Utilities/ReflectionUtils.cs",
    "content": "using System;\r\nnamespace Scatterer\r\n{\r\n\tpublic static class ReflectionUtils\r\n\t{\r\n\t\tinternal static Type getType(string name)\r\n\t\t{\r\n\t\t\tType type = null;\r\n\t\t\tAssemblyLoader.loadedAssemblies.TypeOperation(t =>{if (t.FullName == name)type = t;});\r\n\t\t\t\r\n\t\t\tif (type != null)\r\n\t\t\t{\r\n\t\t\t\treturn type;\r\n\t\t\t}\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/Utilities/Shader/ShaderProperties.cs",
    "content": "//here we get the int for each shader property beforehand\r\n//that way we don't do a string compare for lookup every frame (what Shader.SetFloat/Color/Matrix does)\r\n\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing UnityEngine;\r\n\r\nnamespace Scatterer\r\n{\r\n\t[KSPAddon(KSPAddon.Startup.Instantly, true)]\r\n\tpublic class ShaderProperties : MonoBehaviour\r\n\t{\r\n\t\t//sorry about this huge wall\r\n\t\t//I wrote a script to take care of the whole thing\r\n\t\t//And by script I mean a regex\r\n\r\n\t\tpublic static int Rg_PROPERTY { get { return Rg; } }\r\n\t\tprivate static int Rg;\r\n\t\tpublic static int Rt_PROPERTY { get { return Rt; } }\r\n\t\tprivate static int Rt;\r\n\t\tpublic static int RL_PROPERTY { get { return RL; } }\r\n\t\tprivate static int RL;\r\n\t\tpublic static int mieG_PROPERTY { get { return mieG; } }\r\n\t\tprivate static int mieG;\r\n\t\tpublic static int _Sun_Intensity_PROPERTY { get { return _Sun_Intensity; } }\r\n\t\tprivate static int _Sun_Intensity;\r\n\t\tpublic static int _Sun_WorldSunDir_PROPERTY { get { return _Sun_WorldSunDir; } }\r\n\t\tprivate static int _Sun_WorldSunDir;\r\n\t\tpublic static int _Godray_WorldSunDir_PROPERTY { get { return _Godray_WorldSunDir; } }\r\n\t\tprivate static int _Godray_WorldSunDir;\r\n\t\tpublic static int SUN_DIR_PROPERTY { get { return SUN_DIR; } }\r\n\t\tprivate static int SUN_DIR;\r\n\t\tpublic static int SUN_INTENSITY_PROPERTY { get { return SUN_INTENSITY; } }\r\n\t\tprivate static int SUN_INTENSITY;\r\n\t\tpublic static int _Globals_WorldToCamera_PROPERTY { get { return _Globals_WorldToCamera; } }\r\n\t\tprivate static int _Globals_WorldToCamera;\r\n\t\tpublic static int _Globals_CameraToWorld_PROPERTY { get { return _Globals_CameraToWorld; } }\r\n\t\tprivate static int _Globals_CameraToWorld;\r\n\t\tpublic static int _Globals_CameraToScreen_PROPERTY { get { return _Globals_CameraToScreen; } }\r\n\t\tprivate static int _Globals_CameraToScreen;\r\n\t\tpublic static int _Globals_ScreenToCamera_PROPERTY { get { return _Globals_ScreenToCamera; } }\r\n\t\tprivate static int _Globals_ScreenToCamera;\r\n\t\tpublic static int _Globals_WorldCameraPos_PROPERTY { get { return _Globals_WorldCameraPos; } }\r\n\t\tprivate static int _Globals_WorldCameraPos;\r\n\t\tpublic static int _Scatterer_Origin_PROPERTY { get { return _Scatterer_Origin; } }\r\n\t\tprivate static int _Scatterer_Origin;\r\n\t\tpublic static int _Exposure_PROPERTY { get { return _Exposure; } }\r\n\t\tprivate static int _Exposure;\r\n\t\tpublic static int _ScatteringExposure_PROPERTY { get { return _ScatteringExposure; } }\r\n\t\tprivate static int _ScatteringExposure;\r\n\t\tpublic static int _RimExposure_PROPERTY { get { return _RimExposure; } }\r\n\t\tprivate static int _RimExposure;\r\n\t\tpublic static int lightOccluders1_PROPERTY { get { return lightOccluders1; } }\r\n\t\tprivate static int lightOccluders1;\r\n\t\tpublic static int lightOccluders2_PROPERTY { get { return lightOccluders2; } }\r\n\t\tprivate static int lightOccluders2;\r\n\t\tpublic static int sunPosAndRadius_PROPERTY { get { return sunPosAndRadius; } }\r\n\t\tprivate static int sunPosAndRadius;\r\n\t\tpublic static int extinctionGroundFade_PROPERTY { get { return extinctionGroundFade; } }\r\n\t\tprivate static int extinctionGroundFade;\r\n\t\tpublic static int _Alpha_Global_PROPERTY { get { return _Alpha_Global; } }\r\n\t\tprivate static int _Alpha_Global;\r\n\t\tpublic static int _Extinction_Tint_PROPERTY { get { return _Extinction_Tint; } }\r\n\t\tprivate static int _Extinction_Tint;\r\n\t\tpublic static int extinctionMultiplier_PROPERTY { get { return extinctionMultiplier; } }\r\n\t\tprivate static int extinctionMultiplier;\r\n\t\tpublic static int extinctionRimFade_PROPERTY { get { return extinctionRimFade; } }\r\n\t\tprivate static int extinctionRimFade;\r\n\t\tpublic static int _extinctionScatterIntensity_PROPERTY { get { return _extinctionScatterIntensity; } }\r\n\t\tprivate static int _extinctionScatterIntensity;\r\n\t\tpublic static int _global_alpha_PROPERTY { get { return _global_alpha; } }\r\n\t\tprivate static int _global_alpha;\r\n\t\tpublic static int _global_depth_PROPERTY { get { return _global_depth; } }\r\n\t\tprivate static int _global_depth;\r\n\t\tpublic static int _Post_Extinction_Tint_PROPERTY { get { return _Post_Extinction_Tint; } }\r\n\t\tprivate static int _Post_Extinction_Tint;\r\n\t\tpublic static int postExtinctionMultiplier_PROPERTY { get { return postExtinctionMultiplier; } }\r\n\t\tprivate static int postExtinctionMultiplier;\r\n\t\tpublic static int _ViewProjInv_PROPERTY { get { return _ViewProjInv; } }\r\n\t\tprivate static int _ViewProjInv;\r\n\t\tpublic static int _camPos_PROPERTY { get { return _camPos; } }\r\n\t\tprivate static int _camPos;\r\n\t\tpublic static int _Ocean_SunDir_PROPERTY { get { return _Ocean_SunDir; } }\r\n\t\tprivate static int _Ocean_SunDir;\r\n\t\tpublic static int _Ocean_CameraToOcean_PROPERTY { get { return _Ocean_CameraToOcean; } }\r\n\t\tprivate static int _Ocean_CameraToOcean;\r\n\t\tpublic static int _Ocean_OceanToCamera_PROPERTY { get { return _Ocean_OceanToCamera; } }\r\n\t\tprivate static int _Ocean_OceanToCamera;\r\n\t\tpublic static int _Globals_WorldToOcean_PROPERTY { get { return _Globals_WorldToOcean; } }\r\n\t\tprivate static int _Globals_WorldToOcean;\r\n\t\tpublic static int _Globals_OceanToWorld_PROPERTY { get { return _Globals_OceanToWorld; } }\r\n\t\tprivate static int _Globals_OceanToWorld;\r\n\t\tpublic static int _Ocean_CameraPos_PROPERTY { get { return _Ocean_CameraPos; } }\r\n\t\tprivate static int _Ocean_CameraPos;\r\n\t\tpublic static int _Ocean_Color_PROPERTY { get { return _Ocean_Color; } }\r\n\t\tprivate static int _Ocean_Color;\r\n\t\tpublic static int _Ocean_ScreenGridSize_PROPERTY { get { return _Ocean_ScreenGridSize; } }\r\n\t\tprivate static int _Ocean_ScreenGridSize;\r\n\t\tpublic static int _Ocean_Radius_PROPERTY { get { return _Ocean_Radius; } }\r\n\t\tprivate static int _Ocean_Radius;\r\n\t\tpublic static int _OceanAlpha_PROPERTY { get { return _OceanAlpha; } }\r\n\t\tprivate static int _OceanAlpha;\r\n\t\tpublic static int alphaRadius_PROPERTY { get { return alphaRadius; } }\r\n\t\tprivate static int alphaRadius;\r\n\t\tpublic static int sphereDir_PROPERTY { get { return sphereDir; } }\r\n\t\tprivate static int sphereDir;\r\n\t\tpublic static int cosTheta_PROPERTY { get { return cosTheta; } }\r\n\t\tprivate static int cosTheta;\r\n\t\tpublic static int sinTheta_PROPERTY { get { return sinTheta; } }\r\n\t\tprivate static int sinTheta;\r\n\t\tpublic static int _Ocean_MapSize_PROPERTY { get { return _Ocean_MapSize; } }\r\n\t\tprivate static int _Ocean_MapSize;\r\n\t\tpublic static int _Ocean_Choppyness_PROPERTY { get { return _Ocean_Choppyness; } }\r\n\t\tprivate static int _Ocean_Choppyness;\r\n\t\tpublic static int _Ocean_GridSizes_PROPERTY { get { return _Ocean_GridSizes; } }\r\n\t\tprivate static int _Ocean_GridSizes;\r\n\t\tpublic static int _Ocean_HeightOffset_PROPERTY { get { return _Ocean_HeightOffset; } }\r\n\t\tprivate static int _Ocean_HeightOffset;\r\n\t\tpublic static int _Ocean_Variance_PROPERTY { get { return _Ocean_Variance; } }\r\n\t\tprivate static int _Ocean_Variance;\r\n\t\tpublic static int _Ocean_Map0_PROPERTY { get { return _Ocean_Map0; } }\r\n\t\tprivate static int _Ocean_Map0;\r\n\t\tpublic static int _Ocean_Map1_PROPERTY { get { return _Ocean_Map1; } }\r\n\t\tprivate static int _Ocean_Map1;\r\n\t\tpublic static int _Ocean_Map2_PROPERTY { get { return _Ocean_Map2; } }\r\n\t\tprivate static int _Ocean_Map2;\r\n\t\tpublic static int _Ocean_Map3_PROPERTY { get { return _Ocean_Map3; } }\r\n\t\tprivate static int _Ocean_Map3;\r\n\t\tpublic static int _Ocean_Map4_PROPERTY { get { return _Ocean_Map4; } }\r\n\t\tprivate static int _Ocean_Map4;\r\n\t\tpublic static int _VarianceMax_PROPERTY { get { return _VarianceMax; } }\r\n\t\tprivate static int _VarianceMax;\r\n\t\tpublic static int _Map5_PROPERTY { get { return _Map5; } }\r\n\t\tprivate static int _Map5;\r\n\t\tpublic static int _Map6_PROPERTY { get { return _Map6; } }\r\n\t\tprivate static int _Map6;\r\n\t\tpublic static int _Map7_PROPERTY { get { return _Map7; } }\r\n\t\tprivate static int _Map7;\r\n\t\tpublic static int _Choppyness_PROPERTY { get { return _Choppyness\t; } }\r\n\t\tprivate static int _Choppyness;\r\n\t\tpublic static int _Ocean_WhiteCapStr_PROPERTY { get { return _Ocean_WhiteCapStr; } }\r\n\t\tprivate static int _Ocean_WhiteCapStr;\r\n\t\tpublic static int farWhiteCapStr_PROPERTY { get { return farWhiteCapStr; } }\r\n\t\tprivate static int farWhiteCapStr;\r\n\t\tpublic static int _Ocean_Foam0_PROPERTY { get { return _Ocean_Foam0; } }\r\n\t\tprivate static int _Ocean_Foam0;\r\n\t\tpublic static int _Ocean_Foam1_PROPERTY { get { return _Ocean_Foam1; } }\r\n\t\tprivate static int _Ocean_Foam1;\r\n\t\tpublic static int Transmittance_PROPERTY { get { return Transmittance; } }\r\n\t\tprivate static int Transmittance;\r\n\t\tpublic static int Inscatter_PROPERTY { get { return Inscatter; } }\r\n\t\tprivate static int Inscatter;\r\n\t\tpublic static int Irradiance_PROPERTY { get { return Irradiance; } }\r\n\t\tprivate static int Irradiance;\r\n\t\tpublic static int _customDepthTexture_PROPERTY { get { return _customDepthTexture; } }\r\n\t\tprivate static int _customDepthTexture;\r\n\t\tpublic static int _godrayDepthTexture_PROPERTY { get { return _godrayDepthTexture; } }\r\n\t\tprivate static int _godrayDepthTexture;\r\n\t\tpublic static int godraysSoftwareSwitch_PROPERTY { get { return godraysSoftwareSwitch; } }\r\n\t\tprivate static int godraysSoftwareSwitch;\r\n\t\tpublic static int M_PI_PROPERTY { get { return M_PI; } }\r\n\t\tprivate static int M_PI;\r\n\t\tpublic static int SKY_W_PROPERTY { get { return SKY_W; } }\r\n\t\tprivate static int SKY_W;\r\n\t\tpublic static int SKY_H_PROPERTY { get { return SKY_H; } }\r\n\t\tprivate static int SKY_H;\r\n\t\tpublic static int betaMSca_PROPERTY { get { return betaMSca; } }\r\n\t\tprivate static int betaMSca;\r\n\t\tpublic static int betaMEx_PROPERTY { get { return betaMEx; } }\r\n\t\tprivate static int betaMEx;\r\n\t\tpublic static int HR_PROPERTY { get { return HR; } }\r\n\t\tprivate static int HR;\r\n\t\tpublic static int HM_PROPERTY { get { return HM; } }\r\n\t\tprivate static int HM;\r\n\t\tpublic static int betaR_PROPERTY { get { return betaR; } }\r\n\t\tprivate static int betaR;\r\n\r\n\t\tpublic static int TRANSMITTANCE_W_PROPERTY { get { return TRANSMITTANCE_W; } }\r\n\t\tprivate static int TRANSMITTANCE_W;\r\n\r\n\t\tpublic static int TRANSMITTANCE_H_PROPERTY { get { return TRANSMITTANCE_H; } }\r\n\t\tprivate static int TRANSMITTANCE_H;\r\n\r\n\t\tpublic static int _Spectrum01_PROPERTY { get { return _Spectrum01; } }\r\n\t\tprivate static int _Spectrum01;\r\n\t\tpublic static int _Spectrum23_PROPERTY { get { return _Spectrum23; } }\r\n\t\tprivate static int _Spectrum23;\r\n\t\tpublic static int _WTable_PROPERTY { get { return _WTable; } }\r\n\t\tprivate static int _WTable;\r\n\t\tpublic static int _Offset_PROPERTY { get { return _Offset; } }\r\n\t\tprivate static int _Offset;\r\n\t\tpublic static int _InverseGridSizes_PROPERTY { get { return _InverseGridSizes; } }\r\n\t\tprivate static int _InverseGridSizes;\r\n\r\n\t\tpublic static int _T_PROPERTY { get { return _T; } }\r\n\t\tprivate static int _T;\r\n\t\tpublic static int _Buffer1_PROPERTY { get { return _Buffer1; } }\r\n\t\tprivate static int _Buffer1;\r\n\t\tpublic static int _Buffer2_PROPERTY { get { return _Buffer2; } }\r\n\t\tprivate static int _Buffer2;\r\n\r\n\t\tpublic static int _PlanetOpacity_PROPERTY { get { return _PlanetOpacity; } }\r\n\t\tprivate static int _PlanetOpacity;\r\n\t\t\r\n\t\tpublic static int extinctionThickness_PROPERTY { get { return extinctionThickness; } }\r\n\t\tprivate static int extinctionThickness;\r\n\t\t\r\n\t\tpublic static int _planetPos_PROPERTY { get { return _planetPos; } }\r\n\t\tprivate static int _planetPos;\r\n\t\t\r\n\t\tpublic static int planetShineSources_PROPERTY { get { return planetShineSources; } }\r\n\t\tprivate static int planetShineSources;\r\n\r\n\t\tpublic static int planetShineRGB_PROPERTY { get { return planetShineRGB; } }\r\n\t\tprivate static int planetShineRGB;\r\n\r\n\t\tpublic static int cloudPlanetShineRGB_PROPERTY { get { return cloudPlanetShineRGB; } }\r\n\t\tprivate static int cloudPlanetShineRGB;\r\n\r\n\t\tpublic static int _Sky_Transmittance_PROPERTY { get { return _Sky_Transmittance; } }\r\n\t\tprivate static int _Sky_Transmittance;\r\n\t\t\r\n\t\tpublic static int ringInnerRadius_PROPERTY { get { return ringInnerRadius; } }\r\n\t\tprivate static int ringInnerRadius;\r\n\t\t\r\n\t\tpublic static int ringOuterRadius_PROPERTY { get { return ringOuterRadius; } }\r\n\t\tprivate static int ringOuterRadius;\r\n\t\t\r\n\t\tpublic static int ringNormal_PROPERTY { get { return ringNormal; } }\r\n\t\tprivate static int ringNormal;\r\n\t\t\r\n\t\tpublic static int ringTexture_PROPERTY { get { return ringTexture; } }\r\n\t\tprivate static int ringTexture;\r\n\t\t\r\n\t\tpublic static int cloudColorMultiplier_PROPERTY { get { return cloudColorMultiplier; } }\r\n\t\tprivate static int cloudColorMultiplier;\r\n\t\t\r\n\t\tpublic static int cloudScatteringMultiplier_PROPERTY { get { return cloudScatteringMultiplier; } }\r\n\t\tprivate static int cloudScatteringMultiplier;\r\n\t\t\r\n\t\tpublic static int cloudSkyIrradianceMultiplier_PROPERTY { get { return cloudSkyIrradianceMultiplier; } }\r\n\t\tprivate static int cloudSkyIrradianceMultiplier;\r\n\r\n\t\tpublic static int preserveCloudColors_PROPERTY { get { return preserveCloudColors; } }\r\n\t\tprivate static int preserveCloudColors;\r\n\t\t\r\n\t\tpublic static int _PlanetWorldPos_PROPERTY { get { return _PlanetWorldPos; } }\r\n\t\tprivate static int _PlanetWorldPos;\r\n\t\t\r\n\t\tpublic static int extinctionTint_PROPERTY { get { return extinctionTint; } }\r\n\t\tprivate static int extinctionTint;\r\n\t\t\r\n\t\tpublic static int _SkyExposure_PROPERTY { get { return _SkyExposure; } }\r\n\t\tprivate static int _SkyExposure;\r\n\t\t\r\n\t\tpublic static int _camForward_PROPERTY { get { return _camForward; } }\r\n\t\tprivate static int _camForward;\r\n\t\t\r\n\t\tpublic static int _sunColor_PROPERTY { get { return _sunColor; } }\r\n\t\tprivate static int _sunColor;\r\n\r\n\t\tpublic static int cloudSunColor_PROPERTY { get { return cloudSunColor; } }\r\n\t\tprivate static int cloudSunColor;\r\n\t\t\r\n\t\tpublic static int _ScattererCameraOverlap_PROPERTY { get { return _ScattererCameraOverlap; } }\r\n\t\tprivate static int _ScattererCameraOverlap;\r\n\t\t\r\n\t\tpublic static int flatScaledSpaceModel_PROPERTY { get { return flatScaledSpaceModel; } }\r\n\t\tprivate static int flatScaledSpaceModel;\r\n\r\n\t\tpublic static int renderSunFlare_PROPERTY { get { return renderSunFlare; } }\r\n\t\tprivate static int renderSunFlare;\r\n\r\n\t\tpublic static int scattererReconstructedCloud_PROPERTY { get { return scattererReconstructedCloud; } }\r\n\t\tprivate static int scattererReconstructedCloud;\r\n\r\n\t\tpublic static int scattererCloudLightVolumeEnabled_PROPERTY { get { return scattererCloudLightVolumeEnabled; } }\r\n\t\tprivate static int scattererCloudLightVolumeEnabled;\r\n\r\n\t\tpublic static int sunWorldPosition_PROPERTY { get { return sunWorldPosition; } }\r\n\t\tprivate static int sunWorldPosition;\r\n\t\t\r\n\t\tpublic static int aspectRatio_PROPERTY { get { return aspectRatio; } }\r\n\t\tprivate static int aspectRatio;\r\n\t\t\r\n\t\tpublic static int sunGlareScale_PROPERTY { get { return sunGlareScale; } }\r\n\t\tprivate static int sunGlareScale;\r\n\t\t\r\n\t\tpublic static int sunGlareFade_PROPERTY { get { return sunGlareFade; } }\r\n\t\tprivate static int sunGlareFade;\r\n\t\t\r\n\t\tpublic static int ghost1Fade_PROPERTY { get { return ghost1Fade; } }\r\n\t\tprivate static int ghost1Fade;\r\n\r\n\t\tpublic static int ghost2Fade_PROPERTY { get { return ghost2Fade; } }\r\n\t\tprivate static int ghost2Fade;\r\n\r\n\t\tpublic static int ghost3Fade_PROPERTY { get { return ghost3Fade; } }\r\n\t\tprivate static int ghost3Fade;\r\n\t\t\r\n\t\tpublic static int _ButterFlyLookUp_PROPERTY { get { return _ButterFlyLookUp; } }\r\n\t\tprivate static int _ButterFlyLookUp;\r\n\t\t\r\n\t\tpublic static int _ReadBuffer0_PROPERTY { get { return _ReadBuffer0; } }\r\n\t\tprivate static int _ReadBuffer0;\r\n\t\t\r\n\t\tpublic static int _ReadBuffer1_PROPERTY { get { return _ReadBuffer1; } }\r\n\t\tprivate static int _ReadBuffer1;\r\n\t\t\r\n\t\tpublic static int _MainTex_PROPERTY { get { return _MainTex; } }\r\n\t\tprivate static int _MainTex;\r\n\t\t\t\t\r\n\t\tpublic static int _ZwriteVariable_PROPERTY { get { return _ZwriteVariable; } }\r\n\t\tprivate static int _ZwriteVariable;\r\n\t\t\r\n\t\tpublic static int warpTime_PROPERTY { get { return warpTime; } }\r\n\t\tprivate static int warpTime;\r\n\t\t\r\n\t\tpublic static int renderOnCurrentCamera_PROPERTY { get { return renderOnCurrentCamera; } }\r\n\t\tprivate static int renderOnCurrentCamera;\r\n\t\t\r\n\t\tpublic static int useDbufferOnCamera_PROPERTY { get { return useDbufferOnCamera; } }\r\n\t\tprivate static int useDbufferOnCamera;\r\n\t\t\r\n\t\tpublic static int shoreFoam_PROPERTY { get { return shoreFoam; } }\r\n\t\tprivate static int shoreFoam;\r\n\t\t\r\n\t\tpublic static int CameraToWorld_PROPERTY { get { return CameraToWorld; } }\r\n\t\tprivate static int CameraToWorld;\r\n\t\t\r\n\t\tpublic static int WorldToLight_PROPERTY { get { return WorldToLight; } }\r\n\t\tprivate static int WorldToLight;\r\n\r\n\t\tpublic static int LightDir_PROPERTY { get { return LightDir; } }\r\n\t\tprivate static int LightDir;\r\n\t\t\r\n\t\tpublic static int PlanetOrigin_PROPERTY { get { return PlanetOrigin\t; } }\r\n\t\tprivate static int PlanetOrigin\t;\r\n\t\t\r\n\t\tpublic static int refractionIndex_PROPERTY { get { return refractionIndex; } }\r\n\t\tprivate static int refractionIndex;\r\n\t\t\r\n\t\tpublic static int unity_ShadowFadeCenterAndType_PROPERTY { get { return unity_ShadowFadeCenterAndType; } }\r\n\t\tprivate static int unity_ShadowFadeCenterAndType;\r\n\t\t\r\n\t\tpublic static int _ShadowMapTextureScatterer_PROPERTY { get { return _ShadowMapTextureScatterer; } }\r\n\t\tprivate static int _ShadowMapTextureScatterer;\r\n\r\n\t\tpublic static int _ShadowMapTextureCopyScatterer_PROPERTY { get { return _ShadowMapTextureCopyScatterer; } }\r\n\t\tprivate static int _ShadowMapTextureCopyScatterer;\r\n\r\n\t\tpublic static int ScattererAdditionalInvProjection_PROPERTY { get { return ScattererAdditionalInvProjection; } }\r\n\t\tprivate static int ScattererAdditionalInvProjection;\r\n\t\t\r\n\t\tpublic static int AdditionalDepthBuffer_PROPERTY { get { return AdditionalDepthBuffer; } }\r\n\t\tprivate static int AdditionalDepthBuffer;\r\n\r\n\t\tpublic static int lightDirection_PROPERTY { get { return lightDirection; } }\r\n\t\tprivate static int lightDirection;\r\n\r\n\t\tpublic static int _godrayCloudThreshold_PROPERTY { get { return _godrayCloudThreshold; } }\r\n\t\tprivate static int _godrayCloudThreshold;\r\n\r\n\t\tpublic static int lightToWorld_PROPERTY { get { return lightToWorld; } }\r\n\t\tprivate static int lightToWorld;\r\n\t\t\r\n\t\tpublic static int _godrayStrength_PROPERTY { get { return _godrayStrength; } }\r\n\t\tprivate static int _godrayStrength;\r\n\r\n\t\tpublic static int render_ocean_cloud_shadow_PROPERTY { get { return render_ocean_cloud_shadow; } }\r\n\t\tprivate static int render_ocean_cloud_shadow;\r\n\r\n\t\tpublic static int frameNumber_PROPERTY { get { return frameNumber; } }\r\n\t\tprivate static int frameNumber;\r\n\r\n\t\tpublic static int downscaledDepth_PROPERTY { get { return downscaledDepth; } }\r\n\t\tprivate static int downscaledDepth;\r\n\r\n\t\tpublic static int historyGodrayOcclusionBuffer_PROPERTY { get { return historyGodrayOcclusionBuffer; } }\r\n\t\tprivate static int historyGodrayOcclusionBuffer;\r\n\r\n\t\tpublic static int historyGodrayDepthBuffer_PROPERTY { get { return historyGodrayDepthBuffer; } }\r\n\t\tprivate static int historyGodrayDepthBuffer;\r\n\r\n\t\tpublic static int previousVP_PROPERTY { get { return previousVP; } }\r\n\t\tprivate static int previousVP;\r\n\r\n\t\tpublic static int inverseProjection_PROPERTY { get { return inverseProjection; } }\r\n\t\tprivate static int inverseProjection;\r\n\r\n\t\tpublic static int downscaledGodrayDepth_PROPERTY { get { return downscaledGodrayDepth; } }\r\n\t\tprivate static int downscaledGodrayDepth;\r\n\r\n\t\tpublic static int godraysStepCount_PROPERTY { get { return godraysStepCount; } }\r\n\t\tprivate static int godraysStepCount;\r\n\r\n\t\tpublic static int _ScreenColor_PROPERTY { get { return _ScreenColor; } }\r\n\t\tprivate static int _ScreenColor;\r\n\r\n\t\tpublic static int _HistoryTex_PROPERTY { get { return _HistoryTex; } }\r\n\t\tprivate static int _HistoryTex;\r\n\r\n\t\tpublic static int renderSkyOnCurrentCamera_PROPERTY { get { return renderSkyOnCurrentCamera; } }\r\n\t\tprivate static int renderSkyOnCurrentCamera;\r\n\r\n\t\tpublic static int AtmosphereAtlas_PROPERTY { get { return AtmosphereAtlas; } }\r\n\t\tprivate static int AtmosphereAtlas;\r\n\r\n\t\tpublic static int InscatterAtlasScaleAndOffset_PROPERTY { get { return InscatterAtlasScaleAndOffset; } }\r\n\t\tprivate static int InscatterAtlasScaleAndOffset;\r\n\r\n\t\tpublic static int IrradianceAtlasScaleAndOffset_PROPERTY { get { return IrradianceAtlasScaleAndOffset; } }\r\n\t\tprivate static int IrradianceAtlasScaleAndOffset;\r\n\r\n\t\tpublic static int TransmittanceAtlasScaleAndOffset_PROPERTY { get { return TransmittanceAtlasScaleAndOffset; } }\r\n\t\tprivate static int TransmittanceAtlasScaleAndOffset;\r\n\r\n\t\tpublic static int AtmosphereAtlasDimensions_PROPERTY { get { return AtmosphereAtlasDimensions; } }\r\n\t\tprivate static int AtmosphereAtlasDimensions;\r\n\r\n\t\tpublic static int PRECOMPUTED_SCTR_LUT_DIM_PROPERTY { get { return PRECOMPUTED_SCTR_LUT_DIM; } }\r\n\t\tprivate static int PRECOMPUTED_SCTR_LUT_DIM;\r\n\r\n\t\tprivate void Awake()\r\n\t\t{\r\n\t\t\tRg = Shader.PropertyToID(\"Rg\");\r\n\t\t\tRt = Shader.PropertyToID(\"Rt\");\r\n\t\t\tRL = Shader.PropertyToID(\"RL\");\r\n\t\t\tmieG = Shader.PropertyToID(\"mieG\");\r\n\t\t\t_Sun_Intensity = Shader.PropertyToID(\"_Sun_Intensity\");\r\n\t\t\t_Sun_WorldSunDir = Shader.PropertyToID(\"_Sun_WorldSunDir\");\r\n\t\t\t_Godray_WorldSunDir = Shader.PropertyToID(\"_Godray_WorldSunDir\");\r\n\t\t\tSUN_DIR = Shader.PropertyToID(\"SUN_DIR\");\r\n\t\t\tSUN_INTENSITY = Shader.PropertyToID(\"SUN_INTENSITY\");\r\n\t\t\t_Globals_WorldToCamera = Shader.PropertyToID(\"_Globals_WorldToCamera\");\r\n\t\t\t_Globals_CameraToWorld = Shader.PropertyToID(\"_Globals_CameraToWorld\");\r\n\t\t\t_Globals_CameraToScreen = Shader.PropertyToID(\"_Globals_CameraToScreen\");\r\n\t\t\t_Globals_ScreenToCamera = Shader.PropertyToID(\"_Globals_ScreenToCamera\");\r\n\t\t\t_Globals_WorldCameraPos = Shader.PropertyToID(\"_Globals_WorldCameraPos\");\r\n\t\t\t_Scatterer_Origin = Shader.PropertyToID(\"_Scatterer_Origin\");\r\n\t\t\t_Exposure = Shader.PropertyToID(\"_Exposure\");\r\n\t\t\t_ScatteringExposure = Shader.PropertyToID (\"_ScatteringExposure\");\r\n\t\t\t_RimExposure = Shader.PropertyToID(\"_RimExposure\");\r\n\t\t\tlightOccluders1 = Shader.PropertyToID(\"lightOccluders1\");\r\n\t\t\tlightOccluders2 = Shader.PropertyToID(\"lightOccluders2\");\r\n\t\t\tsunPosAndRadius = Shader.PropertyToID(\"sunPosAndRadius\");\r\n\t\t\textinctionGroundFade = Shader.PropertyToID(\"extinctionGroundFade\");\r\n\t\t\t_Alpha_Global = Shader.PropertyToID(\"_Alpha_Global\");\r\n\t\t\t_Extinction_Tint = Shader.PropertyToID(\"_Extinction_Tint\");\r\n\t\t\textinctionMultiplier = Shader.PropertyToID(\"extinctionMultiplier\");\r\n\t\t\textinctionRimFade = Shader.PropertyToID(\"extinctionRimFade\");\r\n\t\t\t_extinctionScatterIntensity = Shader.PropertyToID(\"_extinctionScatterIntensity\");\r\n\t\t\t_global_alpha = Shader.PropertyToID(\"_global_alpha\");\r\n\t\t\t_global_depth = Shader.PropertyToID(\"_global_depth\");\r\n\t\t\t_Post_Extinction_Tint = Shader.PropertyToID(\"_Post_Extinction_Tint\");\r\n\t\t\tpostExtinctionMultiplier = Shader.PropertyToID(\"postExtinctionMultiplier\");\r\n\t\t\t_ViewProjInv = Shader.PropertyToID(\"_ViewProjInv\");\r\n\t\t\t_camPos = Shader.PropertyToID(\"_camPos\");\r\n\t\t\t_Ocean_SunDir = Shader.PropertyToID(\"_Ocean_SunDir\");\r\n\t\t\t_Ocean_CameraToOcean = Shader.PropertyToID(\"_Ocean_CameraToOcean\");\r\n\t\t\t_Ocean_OceanToCamera = Shader.PropertyToID(\"_Ocean_OceanToCamera\");\r\n\t\t\t_Globals_WorldToOcean = Shader.PropertyToID(\"_Globals_WorldToOcean\");\r\n\t\t\t_Globals_OceanToWorld = Shader.PropertyToID(\"_Globals_OceanToWorld\");\r\n\t\t\t_Ocean_CameraPos = Shader.PropertyToID(\"_Ocean_CameraPos\");\r\n\t\t\t_Ocean_Color = Shader.PropertyToID(\"_Ocean_Color\");\r\n\t\t\t_Ocean_ScreenGridSize = Shader.PropertyToID(\"_Ocean_ScreenGridSize\");\r\n\t\t\t_Ocean_Radius = Shader.PropertyToID(\"_Ocean_Radius\");\r\n\t\t\t_OceanAlpha = Shader.PropertyToID(\"_OceanAlpha\");\r\n\t\t\talphaRadius = Shader.PropertyToID(\"alphaRadius\");\r\n\t\t\tsphereDir = Shader.PropertyToID(\"sphereDir\");\r\n\t\t\tcosTheta = Shader.PropertyToID(\"cosTheta\");\r\n\t\t\tsinTheta = Shader.PropertyToID(\"sinTheta\");\r\n\t\t\t_Ocean_MapSize = Shader.PropertyToID(\"_Ocean_MapSize\");\r\n\t\t\t_Ocean_Choppyness = Shader.PropertyToID(\"_Ocean_Choppyness\");\r\n\t\t\t_Ocean_GridSizes = Shader.PropertyToID(\"_Ocean_GridSizes\");\r\n\t\t\t_Ocean_HeightOffset = Shader.PropertyToID(\"_Ocean_HeightOffset\");\r\n\t\t\t_Ocean_Variance = Shader.PropertyToID(\"_Ocean_Variance\");\r\n\t\t\t_Ocean_Map0 = Shader.PropertyToID(\"_Ocean_Map0\");\r\n\t\t\t_Ocean_Map1 = Shader.PropertyToID(\"_Ocean_Map1\");\r\n\t\t\t_Ocean_Map2 = Shader.PropertyToID(\"_Ocean_Map2\");\r\n\t\t\t_Ocean_Map3 = Shader.PropertyToID(\"_Ocean_Map3\");\r\n\t\t\t_Ocean_Map4 = Shader.PropertyToID(\"_Ocean_Map4\");\r\n\t\t\t_VarianceMax = Shader.PropertyToID(\"_VarianceMax\");\r\n\t\t\t_Map5 = Shader.PropertyToID(\"_Map5\");\r\n\t\t\t_Map6 = Shader.PropertyToID(\"_Map6\");\r\n\t\t\t_Map7 = Shader.PropertyToID(\"_Map7\");\r\n\t\t\t_Choppyness\t= Shader.PropertyToID(\"_Choppyness\");\r\n\t\t\t_Ocean_WhiteCapStr = Shader.PropertyToID(\"_Ocean_WhiteCapStr\");\r\n\t\t\tfarWhiteCapStr = Shader.PropertyToID(\"farWhiteCapStr\");\r\n\t\t\t_Ocean_Foam0 = Shader.PropertyToID(\"_Ocean_Foam0\");\r\n\t\t\t_Ocean_Foam1 = Shader.PropertyToID(\"_Ocean_Foam1\");\r\n\r\n\t\t\tTransmittance = Shader.PropertyToID(\"Transmittance\");\r\n\t\t\tInscatter = Shader.PropertyToID(\"Inscatter\");\r\n\t\t\tIrradiance = Shader.PropertyToID(\"Irradiance\");\r\n\t\t\t_customDepthTexture = Shader.PropertyToID(\"_customDepthTexture\");\r\n\t\t\t_godrayDepthTexture = Shader.PropertyToID(\"_godrayDepthTexture\");\r\n\t\t\tgodraysSoftwareSwitch = Shader.PropertyToID(\"godraysSoftwareSwitch\");\r\n\r\n\t\t\tM_PI = Shader.PropertyToID(\"M_PI\");\r\n\t\t\tSKY_W = Shader.PropertyToID(\"SKY_W\");\r\n\t\t\tSKY_H = Shader.PropertyToID(\"SKY_H\");\r\n\t\t\tbetaMSca = Shader.PropertyToID(\"betaMSca\");\r\n\t\t\tbetaMEx = Shader.PropertyToID(\"betaMEx\");\r\n\t\t\tHR = Shader.PropertyToID(\"HR\");\r\n\t\t\tHM = Shader.PropertyToID(\"HM\");\r\n\t\t\tbetaR = Shader.PropertyToID(\"betaR\");\r\n\r\n\t\t\tTRANSMITTANCE_W = Shader.PropertyToID(\"TRANSMITTANCE_W\");\r\n\t\t\tTRANSMITTANCE_H = Shader.PropertyToID(\"TRANSMITTANCE_H\");\r\n\r\n\t\t\t_Spectrum01 = Shader.PropertyToID(\"_Spectrum01\");\r\n\t\t\t_Spectrum23 = Shader.PropertyToID(\"_Spectrum23\");\r\n\t\t\t_WTable = Shader.PropertyToID(\"_WTable\");\r\n\t\t\t_Offset = Shader.PropertyToID(\"_Offset\");\r\n\t\t\t_InverseGridSizes = Shader.PropertyToID(\"_InverseGridSizes\");\r\n\t\t\t_InverseGridSizes = Shader.PropertyToID(\"_InverseGridSizes\");\r\n\r\n\t\t\t_T = Shader.PropertyToID(\"_T\");\r\n\t\t\t_Buffer1 = Shader.PropertyToID(\"_Buffer1\");\r\n\t\t\t_Buffer2 = Shader.PropertyToID(\"_Buffer2\");\r\n\r\n\t\t\t_PlanetOpacity = Shader.PropertyToID(\"_PlanetOpacity\");\r\n\t\t\textinctionThickness = Shader.PropertyToID(\"extinctionThickness\");\r\n\t\t\t_planetPos = Shader.PropertyToID(\"_planetPos\");\r\n\t\t\tplanetShineSources = Shader.PropertyToID(\"planetShineSources\");\r\n\t\t\tplanetShineRGB = Shader.PropertyToID(\"planetShineRGB\");\r\n\t\t\tcloudPlanetShineRGB = Shader.PropertyToID(\"cloudPlanetShineRGB\");\r\n\t\t\t_Sky_Transmittance = Shader.PropertyToID(\"_Sky_Transmittance\");\r\n\t\t\tringInnerRadius = Shader.PropertyToID(\"ringInnerRadius\");\r\n\t\t\tringOuterRadius = Shader.PropertyToID(\"ringOuterRadius\");\r\n\t\t\tringNormal = Shader.PropertyToID(\"ringNormal\");\r\n\t\t\tringTexture = Shader.PropertyToID(\"ringTexture\");\r\n\t\t\tcloudColorMultiplier = Shader.PropertyToID(\"cloudColorMultiplier\");\r\n\t\t\tcloudScatteringMultiplier = Shader.PropertyToID(\"cloudScatteringMultiplier\");\r\n\t\t\tcloudSkyIrradianceMultiplier = Shader.PropertyToID(\"cloudSkyIrradianceMultiplier\");\r\n\t\t\tpreserveCloudColors =  Shader.PropertyToID(\"preserveCloudColors\");\r\n\t\t\t_PlanetWorldPos = Shader.PropertyToID(\"_PlanetWorldPos\");\r\n\t\t\textinctionTint = Shader.PropertyToID(\"extinctionTint\");\r\n\t\t\t_SkyExposure = Shader.PropertyToID(\"_SkyExposure\");\r\n\t\t\t_camForward = Shader.PropertyToID(\"_camForward\");\r\n\t\t\t_sunColor = Shader.PropertyToID(\"_sunColor\");\r\n\t\t\tcloudSunColor = Shader.PropertyToID(\"cloudSunColor\");\r\n\t\t\t_ScattererCameraOverlap = Shader.PropertyToID(\"_ScattererCameraOverlap\");\r\n\t\t\tflatScaledSpaceModel = Shader.PropertyToID(\"flatScaledSpaceModel\");\r\n\r\n\t\t\trenderSunFlare = Shader.PropertyToID(\"renderSunFlare\");\r\n\t\t\tscattererReconstructedCloud = Shader.PropertyToID(\"scattererReconstructedCloud\");\r\n\t\t\tscattererCloudLightVolumeEnabled = Shader.PropertyToID(\"scattererCloudLightVolumeEnabled\");\r\n\t\t\tsunWorldPosition = Shader.PropertyToID(\"sunWorldPosition\");\r\n\t\t\taspectRatio = Shader.PropertyToID(\"aspectRatio\");\r\n\t\t\tsunGlareScale = Shader.PropertyToID(\"sunGlareScale\");\r\n\t\t\tsunGlareFade = Shader.PropertyToID(\"sunGlareFade\");\r\n\t\t\tghost1Fade = Shader.PropertyToID(\"ghost1Fade\");\r\n\t\t\tghost2Fade = Shader.PropertyToID(\"ghost2Fade\");\r\n\t\t\tghost3Fade = Shader.PropertyToID(\"ghost3Fade\");\r\n\t\t\t_ButterFlyLookUp = Shader.PropertyToID(\"_ButterFlyLookUp\");\r\n\t\t\t_ReadBuffer0 = Shader.PropertyToID(\"_ReadBuffer0\");\r\n\t\t\t_ReadBuffer1 = Shader.PropertyToID(\"_ReadBuffer1\");\r\n\t\t\t_MainTex = Shader.PropertyToID(\"_MainTex\");\r\n\t\t\t_ZwriteVariable = Shader.PropertyToID(\"_ZwriteVariable\");\r\n\t\t\twarpTime = Shader.PropertyToID(\"warpTime\");\r\n\t\t\trenderOnCurrentCamera = Shader.PropertyToID(\"renderOnCurrentCamera\");\r\n\t\t\tuseDbufferOnCamera = Shader.PropertyToID(\"useDbufferOnCamera\");\r\n\t\t\tshoreFoam = Shader.PropertyToID(\"shoreFoam\");\r\n\r\n\t\t\tCameraToWorld = Shader.PropertyToID(\"CameraToWorld\");\r\n\t\t\tWorldToLight = Shader.PropertyToID(\"WorldToLight\");\r\n\t\t\tLightDir = Shader.PropertyToID(\"LightDir\");\r\n\t\t\tPlanetOrigin = Shader.PropertyToID(\"PlanetOrigin\");\r\n\t\t\trefractionIndex = Shader.PropertyToID(\"refractionIndex\");\r\n\r\n\t\t\tunity_ShadowFadeCenterAndType = Shader.PropertyToID(\"unity_ShadowFadeCenterAndType\");\r\n\t\t\t_ShadowMapTextureScatterer = Shader.PropertyToID(\"_ShadowMapTextureScatterer\");\r\n\r\n\t\t\t_ShadowMapTextureCopyScatterer = Shader.PropertyToID(\"_ShadowMapTextureCopyScatterer\");\r\n\r\n\t\t\tScattererAdditionalInvProjection = Shader.PropertyToID(\"ScattererAdditionalInvProjection\");\r\n\t\t\tAdditionalDepthBuffer = Shader.PropertyToID(\"AdditionalDepthBuffer\");\r\n\r\n\t\t\tlightDirection = Shader.PropertyToID(\"lightDirection\");\r\n\t\t\t_godrayCloudThreshold = Shader.PropertyToID(\"_godrayCloudThreshold\");\r\n\r\n\t\t\tlightToWorld = Shader.PropertyToID(\"lightToWorld\");\r\n\r\n\t\t\t_godrayStrength = Shader.PropertyToID(\"_godrayStrength\");\r\n\r\n\t\t\trender_ocean_cloud_shadow = Shader.PropertyToID(\"render_ocean_cloud_shadow\");\r\n\r\n\t\t\tframeNumber = Shader.PropertyToID(\"frameNumber\");\r\n\t\t\tdownscaledDepth = Shader.PropertyToID(\"downscaledDepth\");\r\n\t\t\thistoryGodrayOcclusionBuffer = Shader.PropertyToID(\"historyGodrayOcclusionBuffer\");\r\n\t\t\thistoryGodrayDepthBuffer = Shader.PropertyToID(\"historyGodrayDepthBuffer\");\r\n\t\t\tpreviousVP = Shader.PropertyToID(\"previousVP\");\r\n\t\t\tinverseProjection = Shader.PropertyToID(\"inverseProjection\");\r\n\t\t\tdownscaledGodrayDepth = Shader.PropertyToID(\"downscaledGodrayDepth\");\r\n\t\t\tgodraysStepCount = Shader.PropertyToID(\"godraysStepCount\");\r\n\r\n\t\t\t_ScreenColor = Shader.PropertyToID(\"_ScreenColor\");\r\n\t\t\t_HistoryTex = Shader.PropertyToID(\"_HistoryTex\");\r\n\r\n\t\t\trenderSkyOnCurrentCamera = Shader.PropertyToID(\"renderSkyOnCurrentCamera\");\r\n\r\n\t\t\tAtmosphereAtlas = Shader.PropertyToID(\"AtmosphereAtlas\");\r\n\t\t\tInscatterAtlasScaleAndOffset = Shader.PropertyToID(\"InscatterAtlasScaleAndOffset\");\r\n\t\t\tIrradianceAtlasScaleAndOffset = Shader.PropertyToID(\"IrradianceAtlasScaleAndOffset\");\r\n\t\t\tTransmittanceAtlasScaleAndOffset = Shader.PropertyToID(\"TransmittanceAtlasScaleAndOffset\");\r\n\t\t\tPRECOMPUTED_SCTR_LUT_DIM = Shader.PropertyToID(\"PRECOMPUTED_SCTR_LUT_DIM\");\r\n\t\t\tAtmosphereAtlasDimensions = Shader.PropertyToID(\"AtmosphereAtlasDimensions\");\r\n\t\t}\r\n\t}\r\n}"
  },
  {
    "path": "scatterer/Utilities/Shader/ShaderReplacer.cs",
    "content": "using System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Reflection;\r\nusing UnityEngine;\r\n\r\nnamespace Scatterer\r\n{\r\n\tpublic class ShaderReplacer\r\n\t{\r\n\t\tprivate static ShaderReplacer instance;\r\n\t\tpublic Dictionary<string, Shader> LoadedShaders = new Dictionary<string, Shader>();\r\n\t\tpublic Dictionary<string, ComputeShader> LoadedComputeShaders = new Dictionary<string, ComputeShader>();\r\n\t\tpublic Dictionary<string, Texture> LoadedTextures = new Dictionary<string, Texture>();\r\n\t\tstring path;\r\n\r\n\t\tpublic Dictionary<string, string> gameShaders = new Dictionary<string, string>();\r\n\r\n\t\tconst string eveShaderPrefix = \"EVE\";\r\n\t\tconst string scattererShaderPrefix = \"Scatterer-EVE\";\r\n\r\n\t\tprivate ShaderReplacer()\r\n\t\t{\r\n\t\t\tInit ();\r\n\t\t}\r\n\t\t\r\n\t\tpublic static ShaderReplacer Instance\r\n\t\t{\r\n\t\t\tget \r\n\t\t\t{\r\n\t\t\t\tif (instance == null)\r\n\t\t\t\t{\r\n\t\t\t\t\tinstance = new ShaderReplacer();\r\n\t\t\t\t\tUtils.LogDebug(\"ShaderReplacer instance created\");\r\n\t\t\t\t}\r\n\t\t\t\treturn instance;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\r\n\t\tprivate void Init()\r\n\t\t{\r\n\t\t\tstring codeBase = Assembly.GetExecutingAssembly ().CodeBase;\r\n\t\t\tUriBuilder uri = new UriBuilder (codeBase);\r\n\t\t\tpath = Uri.UnescapeDataString (uri.Path);\r\n\t\t\tpath = Path.GetDirectoryName (path);\r\n\r\n\t\t\tLoadAssetBundle ();\r\n\t\t}\r\n\r\n\t\tpublic void LoadAssetBundle()\r\n\t\t{\r\n\t\t\tstring shaderspath;\r\n\r\n\t\t\tif (Application.platform == RuntimePlatform.WindowsPlayer && SystemInfo.graphicsDeviceVersion.StartsWith(\"Direct\"))\r\n\t\t\t\tshaderspath = path + \"/shaders/scatterershaders-directx\";\r\n\t\t\telse\r\n\t\t\t\tshaderspath = path+\"/shaders/scatterershaders-opengl\";\r\n\r\n\t\t\tLoadedShaders.Clear ();\r\n\t\t\tLoadedComputeShaders.Clear ();\r\n\t\t\tLoadedTextures.Clear ();\r\n\r\n\t\t\tusing (WWW www = new WWW(\"file://\"+shaderspath))\r\n\t\t\t{\r\n\t\t\t\tAssetBundle bundle = www.assetBundle;\r\n\t\t\t\tShader[] shaders = bundle.LoadAllAssets<Shader>();\r\n\t\t\t\t\r\n\t\t\t\tforeach (Shader shader in shaders)\r\n\t\t\t\t{\r\n\t\t\t\t\t//Utils.Log (\"\"+shader.name+\" loaded. Supported?\"+shader.isSupported.ToString());\r\n\t\t\t\t\tLoadedShaders.Add(shader.name, shader);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tComputeShader[] computeShaders = bundle.LoadAllAssets<ComputeShader>();\r\n\t\t\t\t\r\n\t\t\t\tforeach (ComputeShader computeShader in computeShaders)\r\n\t\t\t\t{\r\n\t\t\t\t\t//Utils.LogInfo (\"Compute shader \"+computeShader.name+\" loaded.\");\r\n\t\t\t\t\tLoadedComputeShaders.Add(computeShader.name, computeShader);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tTexture[] textures = bundle.LoadAllAssets<Texture>();\r\n\r\n\t\t\t\tforeach (Texture texture in textures)\r\n\t\t\t\t{\r\n\t\t\t\t\tLoadedTextures.Add(texture.name, texture);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tbundle.Unload(false); // unload the raw asset bundle\r\n\t\t\t\twww.Dispose();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void replaceEVEshaders()\r\n\t\t{\r\n\t\t\tUtils.LogDebug (\"Replacing EVE shaders\");\r\n\r\n\t\t\tType EVEshaderLoaderType = getType (\"ShaderLoader.ShaderLoaderClass\");\r\n\r\n\t\t\tif (EVEshaderLoaderType == null)\r\n\t\t\t{\r\n\t\t\t\tUtils.LogDebug(\"Eve shaderloader type not found\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tDictionary<string, Shader> EVEshaderDictionary = null;\r\n\r\n\t\t\tUtils.LogDebug(\"Eve shaderloader type found\");\r\n\t\t\tUtils.LogDebug(\"Eve shaderloader version: \" + EVEshaderLoaderType.Assembly.GetName().ToString());\r\n\r\n\t\t\tconst BindingFlags flags = BindingFlags.FlattenHierarchy | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static;\r\n\r\n\t\t\ttry\r\n\t\t\t{\r\n\t\t\t\tEVEshaderDictionary = EVEshaderLoaderType.GetField(\"shaderDictionary\", flags).GetValue(null) as Dictionary<string, Shader>;\r\n\t\t\t}\r\n\t\t\tcatch (Exception)\r\n\t\t\t{\r\n\t\t\t\tUtils.LogDebug(\"No EVE shader dictionary found\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tUtils.LogDebug(\"Successfully grabbed EVE shader dictionary\");\r\n\r\n\t\t\tvar shadersToReplace = new List<string>() { \"Cloud\", \"ScreenSpaceCloudShadow\", \"CloudVolumeParticle\", \"GeometryCloudVolumeParticle\", \"GeometryCloudVolumeParticleToTexture\" };\r\n\r\n\t\t\tforeach (var shaderName in shadersToReplace)\r\n            {\r\n\t\t\t\tReplaceOrAddShader(shaderName, EVEshaderDictionary);\r\n\t\t\t}\r\n\r\n\t\t\t//replace shaders of already created materials\r\n\t\t\tMaterial[] materials = Resources.FindObjectsOfTypeAll<Material>();\r\n\t\t\tforeach (Material mat in materials)\r\n\t\t\t{\r\n\t\t\t\t\tReplaceShaderInMaterial(mat, shadersToReplace);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void ReplaceOrAddShader(string shadername, Dictionary<string, Shader> eveShaderDictionary)\r\n\t\t{\r\n\t\t\tstring eveShaderName = eveShaderPrefix + \"/\" + shadername;\r\n\t\t\tstring scattererShaderName = scattererShaderPrefix + \"/\" + shadername;\r\n\r\n\t\t\tif (LoadedShaders.ContainsKey(scattererShaderName))\r\n\t\t\t{\r\n\t\t\t\tif (eveShaderDictionary.ContainsKey(eveShaderName))\r\n\t\t\t\t{\r\n\t\t\t\t\teveShaderDictionary[eveShaderName] = LoadedShaders[scattererShaderName];\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\teveShaderDictionary.Add(eveShaderName, LoadedShaders[scattererShaderName]);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tUtils.LogDebug(\"replaced \"+ shadername +\" in EVE shader dictionary\");\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t\tUtils.LogDebug(\"Shader \" + scattererShaderName + \" not loaded?\");\r\n\t\t}\r\n\r\n\r\n\t\tprivate void ReplaceShaderInMaterial(Material mat, List<string> shadersToReplace)\r\n\t\t{\r\n\t\t\tString name = mat.shader.name;\r\n\r\n\t\t\tif (name.StartsWith(eveShaderPrefix) && shadersToReplace.Contains(name.Substring(eveShaderPrefix.Length+1)))\r\n\t\t\t{\r\n\t\t\t\tUtils.LogDebug(\"replacing \" + name);\r\n\t\t\t\tstring replacementShaderName = scattererShaderPrefix + \"/\" + name.Substring(eveShaderPrefix.Length + 1);\r\n\r\n\t\t\t\tif (LoadedShaders.ContainsKey(replacementShaderName))\r\n\t\t\t\t{\r\n\t\t\t\t\tmat.shader = LoadedShaders[replacementShaderName];\r\n\t\t\t\t\tUtils.LogDebug(\"Shader replaced\");\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tUtils.LogDebug(\"Shader \" + replacementShaderName + \" not loaded?\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal static Type getType(string name)\r\n\t\t{\r\n\t\t\tType type = null;\r\n\t\t\tAssemblyLoader.loadedAssemblies.TypeOperation(t =>\r\n\t\t\t{\r\n\t\t\t\tif (t.FullName == name)\r\n\t\t\t\t\ttype = t;\r\n\t\t\t});\r\n\t\t\t\r\n\t\t\tif (type != null)\r\n\t\t\t{\r\n\t\t\t\treturn type;\r\n\t\t\t}\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n}"
  },
  {
    "path": "scatterer/Utilities/Textures/RenderTextureUtils.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing UnityEngine;\nusing UnityEngine.Rendering;\n\nnamespace Scatterer\n{\n    public struct FlipFlop<T>\n    {\n        public FlipFlop(T flip, T flop)\n        {\n            this.flip = flip;\n            this.flop = flop;\n        }\n\n        public T this[bool useFlip]\n        {\n            get => useFlip ? flip : flop;\n            set\n            {\n                if (useFlip) flip = value;\n                else flop = value;\n            }\n        }\n\n        T flip;\n        T flop;\n    }\n\n    public static class RenderTextureUtils\n\t{\n        public static FlipFlop<RenderTexture> CreateFlipFlopRT(int width, int height, RenderTextureFormat format, FilterMode filterMode, TextureDimension dimension = TextureDimension.Tex2D, int depth = 0, bool randomReadWrite = false)\n        {\n            return new FlipFlop<RenderTexture>(\n                CreateRenderTexture(width, height, format, false, filterMode, dimension, depth, randomReadWrite),\n                CreateRenderTexture(width, height, format, false, filterMode, dimension, depth, randomReadWrite));\n        }\n\n        public static void ReleaseFlipFlopRT(ref FlipFlop<RenderTexture> flipFlop)\n        {\n            RenderTexture rt;\n\n            rt = flipFlop[false];\n            if (rt != null) rt.Release();\n            rt = flipFlop[true];\n            if (rt != null) rt.Release();\n\n            flipFlop = new FlipFlop<RenderTexture>(null, null);\n        }\n\n        public static void ResizeRT(RenderTexture rt, int newWidth, int newHeight)\n        {\n            if (rt != null)\n            {\n                rt.Release();\n                rt.width = newWidth;\n                rt.height = newHeight;\n                rt.Create();\n            }\n        }\n\n        public static void ResizeFlipFlopRT(ref FlipFlop<RenderTexture> flipFlop, int newWidth, int newHeight, int newDepth = 0)\n        {\n            RenderTextureUtils.ResizeRT(flipFlop[false], newWidth, newHeight);\n            RenderTextureUtils.ResizeRT(flipFlop[true], newWidth, newHeight);\n        }\n\n        public static RenderTexture CreateRenderTexture(int width, int height, RenderTextureFormat format, bool useMips, FilterMode filterMode, TextureDimension dimension = TextureDimension.Tex2D, int depth = 0, bool randomReadWrite = false)\n        {\n            var rt = new RenderTexture(width, height, 0, format);\n            rt.anisoLevel = 1;\n            rt.antiAliasing = 1;\n            rt.dimension = dimension;\n            rt.volumeDepth = depth;\n            rt.useMipMap = useMips;\n            rt.autoGenerateMips = useMips;\n            rt.filterMode = filterMode;\n            rt.enableRandomWrite = randomReadWrite;\n            rt.Create();\n\n            return rt;\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/Utilities/Textures/VRUtils.cs",
    "content": "﻿using UnityEngine;\nusing UnityEngine.XR;\n\n\nnamespace Scatterer\n{\n    public static class VRUtils\n    {\n        public static bool VREnabled()\n        {\n            return XRSettings.loadedDeviceName != string.Empty;\n        }\n\n        public static void GetEyeTextureResolution(out int width, out int height)\n        {\n            width = XRSettings.eyeTextureWidth;\n            height = XRSettings.eyeTextureHeight;\n        }\n\n        public static FlipFlop<FlipFlop<RenderTexture>> CreateVRFlipFlopRT(bool supportVR, int width, int height, RenderTextureFormat format, FilterMode filterMode)\n        {\n            return new FlipFlop<FlipFlop<RenderTexture>>(\n                supportVR ? RenderTextureUtils.CreateFlipFlopRT(width, height, format, filterMode) : new FlipFlop<RenderTexture>(null, null),\n                RenderTextureUtils.CreateFlipFlopRT(width, height, format, filterMode));\n        }\n\n        public static void ReleaseVRFlipFlopRT(ref FlipFlop<FlipFlop<RenderTexture>> flipFlop)\n        {\n            var ff = flipFlop[false];\n            RenderTextureUtils.ReleaseFlipFlopRT(ref ff);\n            ff = flipFlop[true];\n            RenderTextureUtils.ReleaseFlipFlopRT(ref ff);\n\n            flipFlop = new FlipFlop<FlipFlop<RenderTexture>>(ff, ff);\n        }\n\n        public static Matrix4x4 GetNonJitteredProjectionMatrixForCamera(Camera cam)\n        {\n            if (cam.stereoActiveEye == Camera.MonoOrStereoscopicEye.Mono)\n            {\n                return cam.nonJitteredProjectionMatrix;\n            }\n            else\n            {\n                return cam.GetStereoNonJitteredProjectionMatrix(cam.stereoActiveEye == Camera.MonoOrStereoscopicEye.Left ? Camera.StereoscopicEye.Left : Camera.StereoscopicEye.Right);\n            }\n        }\n\n        public static Matrix4x4 GetViewMatrixForCamera(Camera cam)\n        {\n            if (cam.stereoActiveEye == Camera.MonoOrStereoscopicEye.Mono)\n            {\n                return cam.worldToCameraMatrix;\n            }\n            else\n            {\n                return cam.GetStereoViewMatrix(cam.stereoActiveEye == Camera.MonoOrStereoscopicEye.Left ? Camera.StereoscopicEye.Left : Camera.StereoscopicEye.Right);\n            }\n        }\n\n        public static void ResizeVRFlipFlopRT(ref FlipFlop<FlipFlop<RenderTexture>> flipFlop, int newWidth, int newHeight)\n        {\n            var leftEyeFlipFlop = flipFlop[false];\n            var rightEyeFlipFlop = flipFlop[true];\n\n            if (leftEyeFlipFlop[true] != null)\n                RenderTextureUtils.ResizeFlipFlopRT(ref leftEyeFlipFlop, newWidth, newHeight);\n\n            if (rightEyeFlipFlop[true] != null)\n                RenderTextureUtils.ResizeFlipFlopRT(ref rightEyeFlipFlop, newWidth, newHeight);\n        }\n    }\n}\n"
  },
  {
    "path": "scatterer/Utilities/VsyncStartupFix.cs",
    "content": "//Fixes slow game startup, thanks Linx and Poodmund for this\r\n\r\nusing System;\r\nusing UnityEngine;\r\n\r\nnamespace Scatterer\r\n{\r\n\t[KSPAddon(KSPAddon.Startup.Instantly, false)]\r\n\tpublic class VsyncStartupFix : MonoBehaviour\r\n\t{\r\n\t\tpublic void Start()\r\n\t\t{\r\n\t\t\tFixVsync ();\r\n\t\t}\r\n\t\t\r\n\r\n\t\tprivate void FixVsync()\r\n\t\t{\r\n\t\t\tQualitySettings.vSyncCount = 0;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "scatterer/scatterer.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProductVersion>8.0.30703</ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectGuid>{604EF0A2-B04D-4A3C-99AB-B039093AE098}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <RootNamespace>scatterer</RootNamespace>\n    <AssemblyName>scatterer</AssemblyName>\n    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>True</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>False</Optimize>\n    <OutputPath>bin\\Debug</OutputPath>\n    <DefineConstants>DEBUG;</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <ConsolePause>False</ConsolePause>\n    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>none</DebugType>\n    <Optimize>True</Optimize>\n    <OutputPath>bin\\Release</OutputPath>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <ConsolePause>False</ConsolePause>\n    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>\n    <CustomCommands>\n      <CustomCommands>\n        <Command type=\"AfterBuild\" command=\"xcopy &quot;${ProjectDir}\\bin\\release\\scatterer.dll&quot; &quot;C:\\Steam\\steamapps\\common\\Kerbal Space Program\\GameData\\scatterer&quot; /Y\" />\n        <Command type=\"AfterBuild\" command=\"&quot;C:\\Steam\\steamapps\\common\\Kerbal Space Program\\dx11.bat&quot;\" externalConsole=\"True\" />\n      </CustomCommands>\n    </CustomCommands>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildBinPath)\\Microsoft.CSharp.targets\" />\n  <ItemGroup>\n    <Reference Include=\"UnityEngine\">\n      <HintPath>..\\..\\..\\..\\Steam\\steamapps\\common\\Kerbal Space Program\\KSP_x64_Data\\Managed\\UnityEngine.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Assembly-CSharp-firstpass\">\n      <HintPath>..\\..\\..\\..\\Steam\\steamapps\\common\\Kerbal Space Program\\KSP_x64_Data\\Managed\\Assembly-CSharp-firstpass.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System\">\n      <HintPath>..\\..\\..\\..\\Steam\\steamapps\\common\\Kerbal Space Program\\KSP_x64_Data\\Managed\\System.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Assembly-CSharp\">\n      <HintPath>..\\..\\..\\..\\Steam\\steamapps\\common\\Kerbal Space Program\\KSP_x64_Data\\Managed\\Assembly-CSharp.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Core\">\n      <HintPath>..\\..\\..\\..\\Steam\\steamapps\\common\\Kerbal Space Program\\KSP_x64_Data\\Managed\\System.Core.dll</HintPath>\n    </Reference>\n    <Reference Include=\"KSPAssets\">\n      <HintPath>..\\..\\..\\..\\Steam\\steamapps\\common\\Kerbal Space Program\\KSP_x64_Data\\Managed\\KSPAssets.dll</HintPath>\n    </Reference>\n    <Reference Include=\"UnityEngine.CoreModule\">\n      <HintPath>..\\..\\..\\..\\Steam\\steamapps\\common\\Kerbal Space Program\\KSP_x64_Data\\Managed\\UnityEngine.CoreModule.dll</HintPath>\n    </Reference>\n    <Reference Include=\"UnityEngine.PhysicsModule\">\n      <HintPath>..\\..\\..\\..\\Steam\\steamapps\\common\\Kerbal Space Program\\KSP_x64_Data\\Managed\\UnityEngine.PhysicsModule.dll</HintPath>\n    </Reference>\n    <Reference Include=\"UnityEngine.InputLegacyModule\">\n      <HintPath>..\\..\\..\\..\\Steam\\steamapps\\common\\Kerbal Space Program\\KSP_x64_Data\\Managed\\UnityEngine.InputLegacyModule.dll</HintPath>\n    </Reference>\n    <Reference Include=\"UnityEngine.IMGUIModule\">\n      <HintPath>..\\..\\..\\..\\Steam\\steamapps\\common\\Kerbal Space Program\\KSP_x64_Data\\Managed\\UnityEngine.IMGUIModule.dll</HintPath>\n    </Reference>\n    <Reference Include=\"UnityEngine.AssetBundleModule\">\n      <HintPath>..\\..\\..\\..\\Steam\\steamapps\\common\\Kerbal Space Program\\KSP_x64_Data\\Managed\\UnityEngine.AssetBundleModule.dll</HintPath>\n    </Reference>\n    <Reference Include=\"UnityEngine.AnimationModule\">\n      <HintPath>..\\..\\..\\..\\Steam\\steamapps\\common\\Kerbal Space Program\\KSP_x64_Data\\Managed\\UnityEngine.AnimationModule.dll</HintPath>\n    </Reference>\n    <Reference Include=\"UnityEngine.ImageConversionModule\">\n      <HintPath>..\\..\\..\\..\\Steam\\steamapps\\common\\Kerbal Space Program\\KSP_x64_Data\\Managed\\UnityEngine.ImageConversionModule.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Security\">\n      <HintPath>..\\..\\..\\..\\Steam\\steamapps\\common\\Kerbal Space Program\\KSP_x64_Data\\Managed\\System.Security.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Xml\">\n      <HintPath>..\\..\\..\\..\\Steam\\steamapps\\common\\Kerbal Space Program\\KSP_x64_Data\\Managed\\System.Xml.dll</HintPath>\n    </Reference>\n    <Reference Include=\"TDx.TDxInput\">\n      <HintPath>..\\..\\..\\..\\Steam\\steamapps\\common\\Kerbal Space Program\\KSP_x64_Data\\Managed\\TDx.TDxInput.dll</HintPath>\n    </Reference>\n    <Reference Include=\"UnityEngine.UI\">\n      <HintPath>..\\..\\..\\..\\Steam\\steamapps\\common\\Kerbal Space Program\\KSP_x64_Data\\Managed\\UnityEngine.UI.dll</HintPath>\n    </Reference>\n    <Reference Include=\"UnityEngine.UIModule\">\n      <HintPath>..\\..\\..\\..\\Steam\\steamapps\\common\\Kerbal Space Program\\KSP_x64_Data\\Managed\\UnityEngine.UIModule.dll</HintPath>\n    </Reference>\n    <Reference Include=\"UnityEngine.UnityWebRequestWWWModule\">\n      <HintPath>..\\..\\..\\..\\Steam\\steamapps\\common\\Kerbal Space Program\\KSP_x64_Data\\Managed\\UnityEngine.UnityWebRequestWWWModule.dll</HintPath>\n    </Reference>\n    <Reference Include=\"UnityEngine.VRModule\">\n      <HintPath>..\\..\\..\\..\\Steam\\steamapps\\common\\Kerbal Space Program\\KSP_x64_Data\\Managed\\UnityEngine.VRModule.dll</HintPath>\n    </Reference>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"DataSerialization\\ConfigPoint.cs\" />\n    <Compile Include=\"DataSerialization\\PlanetshineSource.cs\" />\n    <Compile Include=\"DataSerialization\\ScattererCelestialBody.cs\" />\n    <Compile Include=\"Effects\\Proland\\Ocean\\GPUWaveInteractionHandler.cs\" />\n    <Compile Include=\"Effects\\SunFlare\\SunFlare.cs\" />\n    <Compile Include=\"Effects\\SunFlare\\SunflareCameraHook.cs\" />\n    <Compile Include=\"Effects\\Tonemapping\\HableCurve.cs\" />\n    <Compile Include=\"GUI\\GUIhandler.cs\" />\n    <Compile Include=\"GUI\\ToolbarButton.cs\" />\n    <Compile Include=\"Utilities\\Math\\MathUtility.cs\" />\n    <Compile Include=\"Utilities\\Math\\Matrix3x3.cs\" />\n    <Compile Include=\"Utilities\\Math\\Matrix3x3d.cs\" />\n    <Compile Include=\"Utilities\\Math\\Matrix4x4d.cs\" />\n    <Compile Include=\"Utilities\\Math\\Quat.cs\" />\n    <Compile Include=\"Utilities\\Math\\Vector2d.cs\" />\n    <Compile Include=\"Utilities\\Math\\Vector2i.cs\" />\n    <Compile Include=\"Utilities\\Math\\Vector3d2.cs\" />\n    <Compile Include=\"Utilities\\Math\\Vector4d.cs\" />\n    <Compile Include=\"Effects\\SunlightModulator\\SunlightModulator.cs\" />\n    <Compile Include=\"Effects\\SunlightModulator\\SunlightModulatorPostRenderHook.cs\" />\n    <Compile Include=\"Effects\\SunlightModulator\\SunlightModulatorPreRenderHook.cs\" />\n    <Compile Include=\"Effects\\PlanetShine\\PlanetShineLight.cs\" />\n    <Compile Include=\"DataSerialization\\MainSettingsReadWrite.cs\" />\n    <Compile Include=\"DataSerialization\\PluginDataReadWrite.cs\" />\n    <Compile Include=\"Effects\\SunFlare\\SunflareManager.cs\" />\n    <Compile Include=\"DataSerialization\\ConfigReader.cs\" />\n    <Compile Include=\"Utilities\\ReflectionUtils.cs\" />\n    <Compile Include=\"Effects\\PlanetShine\\PlanetshineManager.cs\" />\n    <Compile Include=\"Effects\\Proland\\Ocean\\FourierCPU.cs\" />\n    <Compile Include=\"Effects\\Proland\\Ocean\\FourierGPU.cs\" />\n    <Compile Include=\"Effects\\Proland\\Ocean\\OceanFFTcpu.cs\" />\n    <Compile Include=\"Effects\\Proland\\Ocean\\OceanFFTgpu.cs\" />\n    <Compile Include=\"Effects\\Proland\\Ocean\\OceanNode.cs\" />\n    <Compile Include=\"Effects\\Proland\\Ocean\\OceanWhiteCaps.cs\" />\n    <Compile Include=\"Effects\\Proland\\Ocean\\UnderwaterDimmingHook.cs\" />\n    <Compile Include=\"Effects\\Proland\\Ocean\\Utils\\FakeOceanPQS.cs\" />\n    <Compile Include=\"Effects\\Proland\\Ocean\\Utils\\OceanUtils.cs\" />\n    <Compile Include=\"Effects\\Proland\\Ocean\\Utils\\RTUtility.cs\" />\n    <Compile Include=\"Effects\\Proland\\Ocean\\Utils\\WriteFloat.cs\" />\n    <Compile Include=\"Effects\\Proland\\Atmosphere\\SkyNode.cs\" />\n    <Compile Include=\"Effects\\Proland\\Atmosphere\\Utils\\AtmospherePQS.cs\" />\n    <Compile Include=\"Effects\\Proland\\Atmosphere\\Utils\\AtmosphereUtils.cs\" />\n    <Compile Include=\"Effects\\Proland\\ProlandManager.cs\" />\n    <Compile Include=\"Scatterer.cs\" />\n    <Compile Include=\"Utilities\\Shader\\ShaderReplacer.cs\" />\n    <Compile Include=\"Utilities\\Shader\\ShaderProperties.cs\" />\n    <Compile Include=\"Utilities\\Camera\\DisableEffectsChecker.cs\" />\n    <Compile Include=\"Utilities\\Camera\\DisableAmbientLight.cs\" />\n    <Compile Include=\"Utilities\\Camera\\WireFrame.cs\" />\n    <Compile Include=\"Utilities\\Camera\\DepthToDistanceCommandBuffer.cs\" />\n    <Compile Include=\"Utilities\\Misc\\Utils.cs\" />\n    <Compile Include=\"Utilities\\Misc\\MeshFactory.cs\" />\n    <Compile Include=\"Utilities\\Occlusion\\ShadowMaskCopyCommandBuffer.cs\" />\n    <Compile Include=\"Utilities\\Occlusion\\ShadowRemoveFadeCommandBuffer.cs\" />\n    <Compile Include=\"Utilities\\Occlusion\\ShadowMaskModulateCommandBuffer.cs\" />\n    <Compile Include=\"Utilities\\Occlusion\\ShadowMapRetrieveCommandBuffer.cs\" />\n    <Compile Include=\"Effects\\ScattererCelestialBodiesManager.cs\" />\n    <Compile Include=\"Effects\\Proland\\Ocean\\Caustics\\CausticsShadowMaskModulate.cs\" />\n    <Compile Include=\"GUI\\ModularGUI\\ModularGUI.cs\" />\n    <Compile Include=\"GUI\\ModularGUI\\AbstractGUIModule.cs\" />\n    <Compile Include=\"GUI\\ModularGUI\\GUIModuleBool.cs\" />\n    <Compile Include=\"GUI\\ModularGUI\\GUIModuleFloat.cs\" />\n    <Compile Include=\"GUI\\ModularGUI\\GUIModuleInt.cs\" />\n    <Compile Include=\"GUI\\ModularGUI\\GUIModuleVector2.cs\" />\n    <Compile Include=\"GUI\\ModularGUI\\GUIModuleVector3.cs\" />\n    <Compile Include=\"GUI\\ModularGUI\\GUIModuleVector4.cs\" />\n    <Compile Include=\"GUI\\ModularGUI\\GUIModuleLabel.cs\" />\n    <Compile Include=\"GUI\\ModularGUI\\GUIModuleString.cs\" />\n    <Compile Include=\"Utilities\\Camera\\TweakShadowCascades.cs\" />\n    <Compile Include=\"Utilities\\Camera\\DisableEffectsForReflectionsCamera.cs\" />\n    <Compile Include=\"Utilities\\Camera\\ReflectionProbeFixer.cs\" />\n    <Compile Include=\"Utilities\\Camera\\ReflectionProbeChecker.cs\" />\n    <Compile Include=\"Effects\\Proland\\Ocean\\Utils\\CBUtility.cs\" />\n    <Compile Include=\"Effects\\Proland\\Ocean\\Caustics\\CausticsLightRaysRenderer.cs\" />\n    <Compile Include=\"Effects\\Proland\\Ocean\\OceanCameraUpdateHook.cs\" />\n    <Compile Include=\"Effects\\Proland\\Atmosphere\\Godrays\\LegacyGodraysRenderer.cs\" />\n    <Compile Include=\"Utilities\\EVE\\EVEReflectionHandler.cs\" />\n    <Compile Include=\"Utilities\\Misc\\IcoSphere.cs\" />\n    <Compile Include=\"Utilities\\Occlusion\\ShadowMapCopier.cs\" />\n    <Compile Include=\"Effects\\Proland\\Atmosphere\\Utils\\SkySphereContainer.cs\" />\n    <Compile Include=\"Effects\\Proland\\Atmosphere\\Utils\\ScaledScatteringContainer.cs\" />\n    <Compile Include=\"DataSerialization\\QualityPresetsLoader.cs\" />\n    <Compile Include=\"Effects\\Proland\\Atmosphere\\Utils\\ScreenSpaceScatteringContainer.cs\" />\n    <Compile Include=\"Effects\\Proland\\Atmosphere\\Utils\\AtmosphereProjectorContainer.cs\" />\n    <Compile Include=\"Effects\\Proland\\Ocean\\OceanRenderingHook.cs\" />\n    <Compile Include=\"Utilities\\Camera\\ScreenCopyCommandBuffer.cs\" />\n    <Compile Include=\"Effects\\Proland\\Atmosphere\\Utils\\GenericLocalAtmosphereContainer.cs\" />\n    <Compile Include=\"Utilities\\Camera\\DepthPrePassMerger.cs\" />\n    <Compile Include=\"Effects\\AntiAliasing\\Utils\\HaltonSeq.cs\" />\n    <Compile Include=\"Effects\\AntiAliasing\\TemporalAntiAliasing.cs\" />\n    <Compile Include=\"Effects\\AntiAliasing\\SubpixelMorphologicalAntialiasing.cs\" />\n    <Compile Include=\"Effects\\AntiAliasing\\GenericAntiAliasing.cs\" />\n    <Compile Include=\"Effects\\SunFlare\\SunflareSettingsV2.cs\" />\n    <Compile Include=\"Effects\\SunFlare\\SunflareSettingsV1.cs\" />\n    <Compile Include=\"Utilities\\Textures\\RenderTextureUtils.cs\" />\n    <Compile Include=\"Utilities\\Textures\\VRUtils.cs\" />\n    <Compile Include=\"Utilities\\VsyncStartupFix.cs\" />\n    <Compile Include=\"Effects\\Proland\\Atmosphere\\Preprocessing\\AtmoPreprocessor.cs\" />\n    <Compile Include=\"GUI\\MainOptionsGUI.cs\" />\n    <Compile Include=\"GUI\\SunflareGUI.cs\" />\n    <Compile Include=\"GUI\\ConfigPointGUI.cs\" />\n    <Compile Include=\"GUI\\OceanGUI.cs\" />\n    <Compile Include=\"GUI\\AtmoGUI.cs\" />\n    <Compile Include=\"Utilities\\Misc\\PlanetSecondaryLightUpdater.cs\" />\n    <Compile Include=\"Utilities\\Dx12UnifiedCamera.cs\" />\n  </ItemGroup>\n  <ItemGroup />\n  <PropertyGroup>\n    <PostBuildEvent>xcopy \"$(ProjectDir)bin\\Release\\scatterer.dll\" \"C:\\Steam\\steamapps\\common\\Kerbal Space Program\\GameData\\scatterer\" /Y\n\n\"C:\\Steam\\steamapps\\common\\Kerbal Space Program\\dx11.bat\"</PostBuildEvent>\n  </PropertyGroup>\n</Project>"
  },
  {
    "path": "scatterer/scatterer.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.32126.315\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Scatterer\", \"Scatterer.csproj\", \"{604EF0A2-B04D-4A3C-99AB-B039093AE098}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{604EF0A2-B04D-4A3C-99AB-B039093AE098}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{604EF0A2-B04D-4A3C-99AB-B039093AE098}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{604EF0A2-B04D-4A3C-99AB-B039093AE098}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{604EF0A2-B04D-4A3C-99AB-B039093AE098}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {B8023EC5-FC75-4821-B315-FAC57582B37B}\n\tEndGlobalSection\n\tGlobalSection(MonoDevelopProperties) = preSolution\n\t\toutputpath = bin\n\tEndGlobalSection\nEndGlobal\n"
  }
]