diff --git a/.licenses/catppuccin/LICENSE b/.licenses/catppuccin/LICENSE
new file mode 100644
index 0000000..bd77794
--- /dev/null
+++ b/.licenses/catppuccin/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2021 Catppuccin
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/.licenses/codeopshq/dotfiles b/.licenses/codeopshq/dotfiles
new file mode 100644
index 0000000..5f99ebe
--- /dev/null
+++ b/.licenses/codeopshq/dotfiles
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2025 CodeOps HQ
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/.licenses/edc/bass b/.licenses/edc/bass
new file mode 100644
index 0000000..e4ddb07
--- /dev/null
+++ b/.licenses/edc/bass
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2017 Eddie Cao
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/.licenses/end-4/dots-hyprland b/.licenses/end-4/dots-hyprland
new file mode 100644
index 0000000..f288702
--- /dev/null
+++ b/.licenses/end-4/dots-hyprland
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/.licenses/noelsimbolon/mpv-config b/.licenses/noelsimbolon/mpv-config
new file mode 100644
index 0000000..ff4ea6b
--- /dev/null
+++ b/.licenses/noelsimbolon/mpv-config
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2021 noelsimbolon
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/.licenses/syndrizzle/hotfiles b/.licenses/syndrizzle/hotfiles
new file mode 100644
index 0000000..8b0069d
--- /dev/null
+++ b/.licenses/syndrizzle/hotfiles
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2022 Sahil Nihalani
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/.licenses/vinceliuice/Elegant-grub2-themes b/.licenses/vinceliuice/Elegant-grub2-themes
new file mode 100644
index 0000000..e72bfdd
--- /dev/null
+++ b/.licenses/vinceliuice/Elegant-grub2-themes
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..ed990f8
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,621 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
\ No newline at end of file
diff --git a/eww/Lyrics/eww.scss b/eww/Lyrics/eww.scss
index 183cdd8..54cd57b 100644
--- a/eww/Lyrics/eww.scss
+++ b/eww/Lyrics/eww.scss
@@ -27,7 +27,7 @@
.lyrics-box-single {
margin: 5px 0px 5px 10px;
- min-width: 743px;
+ min-width: 735px;
}
.lyrics-text {
diff --git a/eww/Lyrics/eww.yuck b/eww/Lyrics/eww.yuck
index 9ec13eb..0719b3d 100644
--- a/eww/Lyrics/eww.yuck
+++ b/eww/Lyrics/eww.yuck
@@ -90,6 +90,6 @@
:windowtype "normal"
:wm-ignore true
:monitor 0
- :geometry (geometry :x 1092 :y -51)
+ :geometry (geometry :x 1100 :y -51)
(lyrics-single)
)
\ No newline at end of file
diff --git a/fish/functions/__bass.py b/fish/functions/__bass.py
index 3f02bd4..d56d880 100755
--- a/fish/functions/__bass.py
+++ b/fish/functions/__bass.py
@@ -1,3 +1,9 @@
+'''
+Author: Uyanide pywang0608@foxmail.com
+Date: 2025-06-14 20:23:25
+LastEditTime: 2025-08-03 01:15:54
+Description:
+'''
"""
To be used with a companion fish function like this:
diff --git a/ghostty/.gitignore b/ghostty/.gitignore
new file mode 100644
index 0000000..4039784
--- /dev/null
+++ b/ghostty/.gitignore
@@ -0,0 +1 @@
+shaders
\ No newline at end of file
diff --git a/ghostty/config b/ghostty/config
index 317e83a..637f5b5 100644
--- a/ghostty/config
+++ b/ghostty/config
@@ -18,4 +18,5 @@ font-size = 12
cursor-style = bar
# just for fun
+# see https://github.com/hackr-sh/ghostty-shaders
# custom-shader = ~/.config/ghostty/shaders/glitchy.glsl
diff --git a/ghostty/shaders/animated-gradient-shader.glsl b/ghostty/shaders/animated-gradient-shader.glsl
deleted file mode 100644
index 01b541c..0000000
--- a/ghostty/shaders/animated-gradient-shader.glsl
+++ /dev/null
@@ -1,40 +0,0 @@
-// credits: https://github.com/unkn0wncode
-void mainImage(out vec4 fragColor, in vec2 fragCoord)
-{
- vec2 uv = fragCoord.xy / iResolution.xy;
-
- // Create seamless gradient animation
- float speed = 0.2;
- float gradientFactor = (uv.x + uv.y) / 2.0;
-
- // Use smoothstep and multiple sin waves for smoother transition
- float t = sin(iTime * speed) * 0.5 + 0.5;
- gradientFactor = smoothstep(0.0, 1.0, gradientFactor);
-
- // Create smooth circular animation
- float angle = iTime * speed;
- vec3 color1 = vec3(0.1, 0.1, 0.5);
- vec3 color2 = vec3(0.5, 0.1, 0.1);
- vec3 color3 = vec3(0.1, 0.5, 0.1);
-
- // Smooth interpolation between colors using multiple mix operations
- vec3 gradientStartColor = mix(
- mix(color1, color2, smoothstep(0.0, 1.0, sin(angle) * 0.5 + 0.5)),
- color3,
- smoothstep(0.0, 1.0, sin(angle + 2.0) * 0.5 + 0.5)
- );
-
- vec3 gradientEndColor = mix(
- mix(color2, color3, smoothstep(0.0, 1.0, sin(angle + 1.0) * 0.5 + 0.5)),
- color1,
- smoothstep(0.0, 1.0, sin(angle + 3.0) * 0.5 + 0.5)
- );
-
- vec3 gradientColor = mix(gradientStartColor, gradientEndColor, gradientFactor);
-
- vec4 terminalColor = texture(iChannel0, uv);
- float mask = 1.0 - step(0.5, dot(terminalColor.rgb, vec3(1.0)));
- vec3 blendedColor = mix(terminalColor.rgb, gradientColor, mask);
-
- fragColor = vec4(blendedColor, terminalColor.a);
-}
diff --git a/ghostty/shaders/bettercrt.glsl b/ghostty/shaders/bettercrt.glsl
deleted file mode 100644
index 8f58b89..0000000
--- a/ghostty/shaders/bettercrt.glsl
+++ /dev/null
@@ -1,33 +0,0 @@
-// Original shader collected from: https://www.shadertoy.com/view/WsVSzV
-// Licensed under Shadertoy's default since the original creator didn't provide any license. (CC BY NC SA 3.0)
-// Slight modifications were made to give a green-ish effect.
-
-// This shader was modified by April Hall (arithefirst)
-// Sourced from https://github.com/m-ahdal/ghostty-shaders/blob/main/retro-terminal.glsl
-// Changes made:
-// - Removed tint
-// - Made the boundaries match ghostty's background color
-
-float warp = 0.25; // simulate curvature of CRT monitor
-float scan = 0.50; // simulate darkness between scanlines
-
-void mainImage(out vec4 fragColor, in vec2 fragCoord)
-{
- // squared distance from center
- vec2 uv = fragCoord / iResolution.xy;
- vec2 dc = abs(0.5 - uv);
- dc *= dc;
-
- // warp the fragment coordinates
- uv.x -= 0.5; uv.x *= 1.0 + (dc.y * (0.3 * warp)); uv.x += 0.5;
- uv.y -= 0.5; uv.y *= 1.0 + (dc.x * (0.4 * warp)); uv.y += 0.5;
-
- // determine if we are drawing in a scanline
- float apply = abs(sin(fragCoord.y) * 0.25 * scan);
-
- // sample the texture
- vec3 color = texture(iChannel0, uv).rgb;
-
- // mix the sampled color with the scanline intensity
- fragColor = vec4(mix(color, vec3(0.0), apply), 1.0);
-}
diff --git a/ghostty/shaders/bloom.glsl b/ghostty/shaders/bloom.glsl
deleted file mode 100644
index ad22448..0000000
--- a/ghostty/shaders/bloom.glsl
+++ /dev/null
@@ -1,52 +0,0 @@
-// source: https://gist.github.com/qwerasd205/c3da6c610c8ffe17d6d2d3cc7068f17f
-// credits: https://github.com/qwerasd205
-// Golden spiral samples, [x, y, weight] weight is inverse of distance.
-const vec3[24] samples = {
- vec3(0.1693761725038636, 0.9855514761735895, 1),
- vec3(-1.333070830962943, 0.4721463328627773, 0.7071067811865475),
- vec3(-0.8464394909806497, -1.51113870578065, 0.5773502691896258),
- vec3(1.554155680728463, -1.2588090085709776, 0.5),
- vec3(1.681364377589461, 1.4741145918052656, 0.4472135954999579),
- vec3(-1.2795157692199817, 2.088741103228784, 0.4082482904638631),
- vec3(-2.4575847530631187, -0.9799373355024756, 0.3779644730092272),
- vec3(0.5874641440200847, -2.7667464429345077, 0.35355339059327373),
- vec3(2.997715703369726, 0.11704939884745152, 0.3333333333333333),
- vec3(0.41360842451688395, 3.1351121305574803, 0.31622776601683794),
- vec3(-3.167149933769243, 0.9844599011770256, 0.30151134457776363),
- vec3(-1.5736713846521535, -3.0860263079123245, 0.2886751345948129),
- vec3(2.888202648340422, -2.1583061557896213, 0.2773500981126146),
- vec3(2.7150778983300325, 2.5745586041105715, 0.2672612419124244),
- vec3(-2.1504069972377464, 3.2211410627650165, 0.2581988897471611),
- vec3(-3.6548858794907493, -1.6253643308191343, 0.25),
- vec3(1.0130775986052671, -3.9967078676335834, 0.24253562503633297),
- vec3(4.229723673607257, 0.33081361055181563, 0.23570226039551587),
- vec3(0.40107790291173834, 4.340407413572593, 0.22941573387056174),
- vec3(-4.319124570236028, 1.159811599693438, 0.22360679774997896),
- vec3(-1.9209044802827355, -4.160543952132907, 0.2182178902359924),
- vec3(3.8639122286635708, -2.6589814382925123, 0.21320071635561041),
- vec3(3.3486228404946234, 3.4331800232609, 0.20851441405707477),
- vec3(-2.8769733643574344, 3.9652268864187157, 0.20412414523193154)
- };
-
-float lum(vec4 c) {
- return 0.299 * c.r + 0.587 * c.g + 0.114 * c.b;
-}
-
-void mainImage(out vec4 fragColor, in vec2 fragCoord) {
- vec2 uv = fragCoord.xy / iResolution.xy;
-
- vec4 color = texture(iChannel0, uv);
-
- vec2 step = vec2(1.414) / iResolution.xy;
-
- for (int i = 0; i < 24; i++) {
- vec3 s = samples[i];
- vec4 c = texture(iChannel0, uv + s.xy * step);
- float l = lum(c);
- if (l > 0.2) {
- color += l * s.z * c * 0.2;
- }
- }
-
- fragColor = color;
-}
\ No newline at end of file
diff --git a/ghostty/shaders/cineShader-Lava.glsl b/ghostty/shaders/cineShader-Lava.glsl
deleted file mode 100644
index 224a2ce..0000000
--- a/ghostty/shaders/cineShader-Lava.glsl
+++ /dev/null
@@ -1,79 +0,0 @@
-// INFO: This shader is a port of https://www.shadertoy.com/view/3sySRK
-
-// INFO: Change these variables to create some variation in the animation
-#define BLACK_BLEND_THRESHOLD .4 // This is controls the dim of the screen
-#define COLOR_SPEED 0.1 // This controls the speed at which the colors change
-#define MOVEMENT_SPEED 0.1 // This controls the speed at which the balls move
-
-float opSmoothUnion( float d1, float d2, float k )
-{
- float h = clamp( 0.5 + 0.5*(d2-d1)/k, 0.0, 1.0 );
- return mix( d2, d1, h ) - k*h*(1.0-h);
-}
-
-float sdSphere( vec3 p, float s )
-{
- return length(p)-s;
-}
-
-float map(vec3 p)
-{
- float d = 2.0;
- for (int i = 0; i < 16; i++) {
- float fi = float(i);
- float time = iTime * (fract(fi * 412.531 + 0.513) - 0.5) * 2.0;
- d = opSmoothUnion(
- sdSphere(p + sin(time*MOVEMENT_SPEED + fi * vec3(52.5126, 64.62744, 632.25)) * vec3(2.0, 2.0, 0.8), mix(0.5, 1.0, fract(fi * 412.531 + 0.5124))),
- d,
- 0.4
- );
- }
- return d;
-}
-
-vec3 calcNormal( in vec3 p )
-{
- const float h = 1e-5; // or some other value
- const vec2 k = vec2(1,-1);
- return normalize( k.xyy*map( p + k.xyy*h ) +
- k.yyx*map( p + k.yyx*h ) +
- k.yxy*map( p + k.yxy*h ) +
- k.xxx*map( p + k.xxx*h ) );
-}
-
-void mainImage( out vec4 fragColor, in vec2 fragCoord )
-{
- vec2 uv = fragCoord/iResolution.xy;
-
- vec3 rayOri = vec3((uv - 0.5) * vec2(iResolution.x/iResolution.y, 1.0) * 6.0, 3.0);
- vec3 rayDir = vec3(0.0, 0.0, -1.0);
-
- float depth = 0.0;
- vec3 p;
-
- for(int i = 0; i < 64; i++) {
- p = rayOri + rayDir * depth;
- float dist = map(p);
- depth += dist;
- if (dist < 1e-6) {
- break;
- }
- }
-
- depth = min(6.0, depth);
- vec3 n = calcNormal(p);
- float b = max(0.0, dot(n, vec3(0.577)));
- vec3 col = (0.5 + 0.5 * cos((b + iTime*COLOR_SPEED * 3.0) + uv.xyx * 2.0 + vec3(0,2,4))) * (0.85 + b * 0.35);
- col *= exp( -depth * 0.15 );
-
-
- vec2 termUV = fragCoord.xy / iResolution.xy;
- vec4 terminalColor = texture(iChannel0, termUV);
-
- float alpha = step(length(terminalColor.rgb), BLACK_BLEND_THRESHOLD);
- vec3 blendedColor = mix(terminalColor.rgb * 1.0, col.rgb * 0.3, alpha);
-
- fragColor = vec4(blendedColor, terminalColor.a);
-
-}
-
diff --git a/ghostty/shaders/crt.glsl b/ghostty/shaders/crt.glsl
deleted file mode 100644
index 31d1bec..0000000
--- a/ghostty/shaders/crt.glsl
+++ /dev/null
@@ -1,310 +0,0 @@
-// source: https://gist.github.com/qwerasd205/c3da6c610c8ffe17d6d2d3cc7068f17f
-// credits: https://github.com/qwerasd205
-//==============================================================
-//
-// [CRTS] PUBLIC DOMAIN CRT-STYLED SCALAR by Timothy Lottes
-//
-// [+] Adapted with alterations for use in Ghostty by Qwerasd.
-// For more information on changes, see comment below license.
-//
-//==============================================================
-//
-// LICENSE = UNLICENSE (aka PUBLIC DOMAIN)
-//
-//--------------------------------------------------------------
-// This is free and unencumbered software released into the
-// public domain.
-//--------------------------------------------------------------
-// Anyone is free to copy, modify, publish, use, compile, sell,
-// or distribute this software, either in source code form or as
-// a compiled binary, for any purpose, commercial or
-// non-commercial, and by any means.
-//--------------------------------------------------------------
-// In jurisdictions that recognize copyright laws, the author or
-// authors of this software dedicate any and all copyright
-// interest in the software to the public domain. We make this
-// dedication for the benefit of the public at large and to the
-// detriment of our heirs and successors. We intend this
-// dedication to be an overt act of relinquishment in perpetuity
-// of all present and future rights to this software under
-// copyright law.
-//--------------------------------------------------------------
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-// KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-// AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
-// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-// DEALINGS IN THE SOFTWARE.
-//--------------------------------------------------------------
-// For more information, please refer to
-//
-//==============================================================
-
-// This shader is a modified version of the excellent
-// FixingPixelArtFast by Timothy Lottes on Shadertoy.
-//
-// The original shader can be found at:
-// https://www.shadertoy.com/view/MtSfRK
-//
-// Modifications have been made to reduce the verbosity,
-// and many of the comments have been removed / reworded.
-// Additionally, the license has been moved to the top of
-// the file, and can be read above. I (Qwerasd) choose to
-// release the modified version under the same license.
-
-// The appearance of this shader can be altered
-// by adjusting the parameters defined below.
-
-// "Scanlines" per real screen pixel.
-// e.g. SCALE 0.5 means each scanline is 2 pixels.
-// Recommended values:
-// o High DPI displays: 0.33333333
-// - Low DPI displays: 0.66666666
-#define SCALE 0.33333333
-
-// "Tube" warp
-#define CRTS_WARP 1
-
-// Darkness of vignette in corners after warping
-// 0.0 = completely black
-// 1.0 = no vignetting
-#define MIN_VIN 0.5
-
-// Try different masks
-// #define CRTS_MASK_GRILLE 1
-// #define CRTS_MASK_GRILLE_LITE 1
-// #define CRTS_MASK_NONE 1
-#define CRTS_MASK_SHADOW 1
-
-// Scanline thinness
-// 0.50 = fused scanlines
-// 0.70 = recommended default
-// 1.00 = thinner scanlines (too thin)
-#define INPUT_THIN 0.75
-
-// Horizonal scan blur
-// -3.0 = pixely
-// -2.5 = default
-// -2.0 = smooth
-// -1.0 = too blurry
-#define INPUT_BLUR -2.75
-
-// Shadow mask effect, ranges from,
-// 0.25 = large amount of mask (not recommended, too dark)
-// 0.50 = recommended default
-// 1.00 = no shadow mask
-#define INPUT_MASK 0.65
-
-float FromSrgb1(float c) {
- return (c <= 0.04045) ? c * (1.0 / 12.92) :
- pow(c * (1.0 / 1.055) + (0.055 / 1.055), 2.4);
-}
-vec3 FromSrgb(vec3 c) {
- return vec3(
- FromSrgb1(c.r), FromSrgb1(c.g), FromSrgb1(c.b));
-}
-
-vec3 CrtsFetch(vec2 uv) {
- return FromSrgb(texture(iChannel0, uv.xy).rgb);
-}
-
-#define CrtsRcpF1(x) (1.0/(x))
-#define CrtsSatF1(x) clamp((x),0.0,1.0)
-
-float CrtsMax3F1(float a, float b, float c) {
- return max(a, max(b, c));
-}
-
-vec2 CrtsTone(
- float thin,
- float mask) {
- #ifdef CRTS_MASK_NONE
- mask = 1.0;
- #endif
-
- #ifdef CRTS_MASK_GRILLE_LITE
- // Normal R mask is {1.0,mask,mask}
- // LITE R mask is {mask,1.0,1.0}
- mask = 0.5 + mask * 0.5;
- #endif
-
- vec2 ret;
- float midOut = 0.18 / ((1.5 - thin) * (0.5 * mask + 0.5));
- float pMidIn = 0.18;
- ret.x = ((-pMidIn) + midOut) / ((1.0 - pMidIn) * midOut);
- ret.y = ((-pMidIn) * midOut + pMidIn) / (midOut * (-pMidIn) + midOut);
-
- return ret;
-}
-
-vec3 CrtsMask(vec2 pos, float dark) {
- #ifdef CRTS_MASK_GRILLE
- vec3 m = vec3(dark, dark, dark);
- float x = fract(pos.x * (1.0 / 3.0));
- if (x < (1.0 / 3.0)) m.r = 1.0;
- else if (x < (2.0 / 3.0)) m.g = 1.0;
- else m.b = 1.0;
- return m;
- #endif
-
- #ifdef CRTS_MASK_GRILLE_LITE
- vec3 m = vec3(1.0, 1.0, 1.0);
- float x = fract(pos.x * (1.0 / 3.0));
- if (x < (1.0 / 3.0)) m.r = dark;
- else if (x < (2.0 / 3.0)) m.g = dark;
- else m.b = dark;
- return m;
- #endif
-
- #ifdef CRTS_MASK_NONE
- return vec3(1.0, 1.0, 1.0);
- #endif
-
- #ifdef CRTS_MASK_SHADOW
- pos.x += pos.y * 3.0;
- vec3 m = vec3(dark, dark, dark);
- float x = fract(pos.x * (1.0 / 6.0));
- if (x < (1.0 / 3.0)) m.r = 1.0;
- else if (x < (2.0 / 3.0)) m.g = 1.0;
- else m.b = 1.0;
- return m;
- #endif
-}
-
-vec3 CrtsFilter(
- vec2 ipos,
- vec2 inputSizeDivOutputSize,
- vec2 halfInputSize,
- vec2 rcpInputSize,
- vec2 rcpOutputSize,
- vec2 twoDivOutputSize,
- float inputHeight,
- vec2 warp,
- float thin,
- float blur,
- float mask,
- vec2 tone
-) {
- // Optional apply warp
- vec2 pos;
- #ifdef CRTS_WARP
- // Convert to {-1 to 1} range
- pos = ipos * twoDivOutputSize - vec2(1.0, 1.0);
-
- // Distort pushes image outside {-1 to 1} range
- pos *= vec2(
- 1.0 + (pos.y * pos.y) * warp.x,
- 1.0 + (pos.x * pos.x) * warp.y);
-
- // TODO: Vignette needs optimization
- float vin = 1.0 - (
- (1.0 - CrtsSatF1(pos.x * pos.x)) * (1.0 - CrtsSatF1(pos.y * pos.y)));
- vin = CrtsSatF1((-vin) * inputHeight + inputHeight);
-
- // Leave in {0 to inputSize}
- pos = pos * halfInputSize + halfInputSize;
- #else
- pos = ipos * inputSizeDivOutputSize;
- #endif
-
- // Snap to center of first scanline
- float y0 = floor(pos.y - 0.5) + 0.5;
- // Snap to center of one of four pixels
- float x0 = floor(pos.x - 1.5) + 0.5;
-
- // Inital UV position
- vec2 p = vec2(x0 * rcpInputSize.x, y0 * rcpInputSize.y);
- // Fetch 4 nearest texels from 2 nearest scanlines
- vec3 colA0 = CrtsFetch(p);
- p.x += rcpInputSize.x;
- vec3 colA1 = CrtsFetch(p);
- p.x += rcpInputSize.x;
- vec3 colA2 = CrtsFetch(p);
- p.x += rcpInputSize.x;
- vec3 colA3 = CrtsFetch(p);
- p.y += rcpInputSize.y;
- vec3 colB3 = CrtsFetch(p);
- p.x -= rcpInputSize.x;
- vec3 colB2 = CrtsFetch(p);
- p.x -= rcpInputSize.x;
- vec3 colB1 = CrtsFetch(p);
- p.x -= rcpInputSize.x;
- vec3 colB0 = CrtsFetch(p);
-
- // Vertical filter
- // Scanline intensity is using sine wave
- // Easy filter window and integral used later in exposure
- float off = pos.y - y0;
- float pi2 = 6.28318530717958;
- float hlf = 0.5;
- float scanA = cos(min(0.5, off * thin) * pi2) * hlf + hlf;
- float scanB = cos(min(0.5, (-off) * thin + thin) * pi2) * hlf + hlf;
-
- // Horizontal kernel is simple gaussian filter
- float off0 = pos.x - x0;
- float off1 = off0 - 1.0;
- float off2 = off0 - 2.0;
- float off3 = off0 - 3.0;
- float pix0 = exp2(blur * off0 * off0);
- float pix1 = exp2(blur * off1 * off1);
- float pix2 = exp2(blur * off2 * off2);
- float pix3 = exp2(blur * off3 * off3);
- float pixT = CrtsRcpF1(pix0 + pix1 + pix2 + pix3);
-
- #ifdef CRTS_WARP
- // Get rid of wrong pixels on edge
- pixT *= max(MIN_VIN, vin);
- #endif
-
- scanA *= pixT;
- scanB *= pixT;
-
- // Apply horizontal and vertical filters
- vec3 color =
- (colA0 * pix0 + colA1 * pix1 + colA2 * pix2 + colA3 * pix3) * scanA +
- (colB0 * pix0 + colB1 * pix1 + colB2 * pix2 + colB3 * pix3) * scanB;
-
- // Apply phosphor mask
- color *= CrtsMask(ipos, mask);
-
- // Tonal control, start by protecting from /0
- float peak = max(1.0 / (256.0 * 65536.0),
- CrtsMax3F1(color.r, color.g, color.b));
- // Compute the ratios of {R,G,B}
- vec3 ratio = color * CrtsRcpF1(peak);
- // Apply tonal curve to peak value
- peak = peak * CrtsRcpF1(peak * tone.x + tone.y);
- // Reconstruct color
- return ratio * peak;
-}
-
-float ToSrgb1(float c) {
- return (c < 0.0031308 ? c * 12.92 : 1.055 * pow(c, 0.41666) - 0.055);
-}
-vec3 ToSrgb(vec3 c) {
- return vec3(
- ToSrgb1(c.r), ToSrgb1(c.g), ToSrgb1(c.b));
-}
-
-void mainImage(out vec4 fragColor, in vec2 fragCoord) {
- float aspect = iResolution.x / iResolution.y;
- fragColor.rgb = CrtsFilter(
- fragCoord.xy,
- vec2(1.0),
- iResolution.xy * SCALE * 0.5,
- 1.0 / (iResolution.xy * SCALE),
- 1.0 / iResolution.xy,
- 2.0 / iResolution.xy,
- iResolution.y,
- vec2(1.0 / (50.0 * aspect), 1.0 / 50.0),
- INPUT_THIN,
- INPUT_BLUR,
- INPUT_MASK,
- CrtsTone(INPUT_THIN, INPUT_MASK)
- );
-
- // Linear to SRGB for output.
- fragColor.rgb = ToSrgb(fragColor.rgb);
-}
\ No newline at end of file
diff --git a/ghostty/shaders/cubes.glsl b/ghostty/shaders/cubes.glsl
deleted file mode 100644
index 2a09505..0000000
--- a/ghostty/shaders/cubes.glsl
+++ /dev/null
@@ -1,114 +0,0 @@
-// credits: https://github.com/rymdlego
-
-const float speed = 0.2;
-const float cube_size = 1.0;
-const float cube_brightness = 1.0;
-const float cube_rotation_speed = 2.8;
-const float camera_rotation_speed = 0.1;
-
-
-
-mat3 rotationMatrix(vec3 m,float a) {
- m = normalize(m);
- float c = cos(a),s=sin(a);
- return mat3(c+(1.-c)*m.x*m.x,
- (1.-c)*m.x*m.y-s*m.z,
- (1.-c)*m.x*m.z+s*m.y,
- (1.-c)*m.x*m.y+s*m.z,
- c+(1.-c)*m.y*m.y,
- (1.-c)*m.y*m.z-s*m.x,
- (1.-c)*m.x*m.z-s*m.y,
- (1.-c)*m.y*m.z+s*m.x,
- c+(1.-c)*m.z*m.z);
-}
-
-float sphere(vec3 pos, float radius)
-{
- return length(pos) - radius;
-}
-
-float box(vec3 pos, vec3 size)
-{
- float t = iTime;
- pos = pos * 0.9 * rotationMatrix(vec3(sin(t/4.0*speed)*10.,cos(t/4.0*speed)*12.,2.7), t*2.4/4.0*speed*cube_rotation_speed);
- return length(max(abs(pos) - size, 0.0));
-}
-
-
-float distfunc(vec3 pos)
-{
- float t = iTime;
-
- float size = 0.45 + 0.25*abs(16.0*sin(t*speed/4.0));
- // float size = 2.3 + 1.8*tan((t-5.4)*6.549);
- size = cube_size * 0.16 * clamp(size, 2.0, 4.0);
-
- //pos = pos * rotationMatrix(vec3(0.,-3.,0.7), 3.3 * mod(t/30.0, 4.0));
- vec3 q = mod(pos, 5.0) - 2.5;
- float obj1 = box(q, vec3(size));
- return obj1;
-}
-
-void mainImage( out vec4 fragColor, in vec2 fragCoord )
-{
- float t = iTime;
- vec2 screenPos = -1.0 + 2.0 * fragCoord.xy / iResolution.xy;
- screenPos.x *= iResolution.x / iResolution.y;
- vec3 cameraOrigin = vec3(t*1.0*speed, 0.0, 0.0);
- // vec3 cameraOrigin = vec3(t*1.8*speed, 3.0+t*0.02*speed, 0.0);
- vec3 cameraTarget = vec3(t*100., 0.0, 0.0);
- cameraTarget = vec3(t*20.0,0.0,0.0) * rotationMatrix(vec3(0.0,0.0,1.0), t*speed*camera_rotation_speed);
-
- vec3 upDirection = vec3(0.5, 1.0, 0.6);
-
- vec3 cameraDir = normalize(cameraTarget - cameraOrigin);
- vec3 cameraRight = normalize(cross(upDirection, cameraOrigin));
- vec3 cameraUp = cross(cameraDir, cameraRight);
-
- vec3 rayDir = normalize(cameraRight * screenPos.x + cameraUp * screenPos.y + cameraDir);
-
- const int MAX_ITER = 64;
- const float MAX_DIST = 48.0;
- const float EPSILON = 0.001;
-
- float totalDist = 0.0;
- vec3 pos = cameraOrigin;
- float dist = EPSILON;
-
- for (int i = 0; i < MAX_ITER; i++)
- {
- if (dist < EPSILON || totalDist > MAX_DIST)
- break;
- dist = distfunc(pos);
- totalDist += dist;
- pos += dist*rayDir;
- }
-
- vec4 cubes;
-
- if (dist < EPSILON)
- {
- // Lighting Code
- vec2 eps = vec2(0.0, EPSILON);
- vec3 normal = normalize(vec3(
- distfunc(pos + eps.yxx) - distfunc(pos - eps.yxx),
- distfunc(pos + eps.xyx) - distfunc(pos - eps.xyx),
- distfunc(pos + eps.xxy) - distfunc(pos - eps.xxy)));
- float diffuse = max(0., dot(-rayDir, normal));
- float specular = pow(diffuse, 32.0);
- vec3 color = vec3(diffuse + specular);
- vec3 cubeColor = vec3(abs(screenPos),0.5+0.5*sin(t*2.0))*0.8;
- cubeColor = mix(cubeColor.rgb, vec3(0.0,0.0,0.0), 1.0);
- color += cubeColor;
- cubes = vec4(color, 1.0) * vec4(1.0 - (totalDist/MAX_DIST));
- cubes = vec4(cubes.rgb*0.02*cube_brightness, 0.1);
- }
- else {
- cubes = vec4(0.0);
- }
-
- vec2 uv = fragCoord/iResolution.xy;
- vec4 terminalColor = texture(iChannel0, uv);
- vec3 blendedColor = terminalColor.rgb + cubes.rgb;
- fragColor = vec4(blendedColor, terminalColor.a);
-}
diff --git a/ghostty/shaders/dither.glsl b/ghostty/shaders/dither.glsl
deleted file mode 100644
index 7bfe740..0000000
--- a/ghostty/shaders/dither.glsl
+++ /dev/null
@@ -1,30 +0,0 @@
-// Simple "dithering" effect
-// (c) moni-dz (https://github.com/moni-dz)
-// CC BY-NC-SA 4.0 (https://creativecommons.org/licenses/by-nc-sa/4.0/)
-
-// Packed bayer pattern using bit manipulation
-const float bayerPattern[4] = float[4](
- 0x0514, // Encoding 0,8,2,10
- 0xC4E6, // Encoding 12,4,14,6
- 0x3B19, // Encoding 3,11,1,9
- 0xF7D5 // Encoding 15,7,13,5
-);
-
-float getBayerFromPacked(int x, int y) {
- int idx = (x & 3) + ((y & 3) << 2);
- return float((int(bayerPattern[y & 3]) >> ((x & 3) << 2)) & 0xF) * (1.0 / 16.0);
-}
-
-#define LEVELS 2.0 // Available color steps per channel
-#define INV_LEVELS (1.0 / LEVELS)
-
-void mainImage(out vec4 fragColor, in vec2 fragCoord)
-{
- vec2 uv = fragCoord * (1.0 / iResolution.xy);
- vec3 color = texture(iChannel0, uv).rgb;
-
- float threshold = getBayerFromPacked(int(fragCoord.x), int(fragCoord.y));
- vec3 dithered = floor(color * LEVELS + threshold) * INV_LEVELS;
-
- fragColor = vec4(dithered, 1.0);
-}
diff --git a/ghostty/shaders/drunkard.glsl b/ghostty/shaders/drunkard.glsl
deleted file mode 100644
index e900d4a..0000000
--- a/ghostty/shaders/drunkard.glsl
+++ /dev/null
@@ -1,68 +0,0 @@
-// Drunken stupor effect using fractal Brownian motion and Perlin noise
-// (c) moni-dz (https://github.com/moni-dz)
-// CC BY-NC-SA 4.0 (https://creativecommons.org/licenses/by-nc-sa/4.0/)
-
-vec2 hash2(vec2 p) {
- uvec2 q = uvec2(floatBitsToUint(p.x), floatBitsToUint(p.y));
- q = (q * uvec2(1597334673U, 3812015801U)) ^ (q.yx * uvec2(2798796415U, 1979697793U));
- return vec2(q) * (1.0/float(0xffffffffU)) * 2.0 - 1.0;
-}
-
-float perlin2d(vec2 p) {
- vec2 i = floor(p);
- vec2 f = fract(p);
- vec2 u = f*f*(3.0-2.0*f);
-
- return mix(mix(dot(hash2(i + vec2(0.0,0.0)), f - vec2(0.0,0.0)),
- dot(hash2(i + vec2(1.0,0.0)), f - vec2(1.0,0.0)), u.x),
- mix(dot(hash2(i + vec2(0.0,1.0)), f - vec2(0.0,1.0)),
- dot(hash2(i + vec2(1.0,1.0)), f - vec2(1.0,1.0)), u.x), u.y);
-}
-
-#define OCTAVES 10 // How many passes of fractal Brownian motion to perform
-#define GAIN 0.5 // How much should each pixel move
-#define LACUNARITY 2.0 // How fast should each ripple be per pass
-
-float fbm(vec2 p) {
- float sum = 0.0;
- float amp = 0.5;
- float freq = 1.0;
-
- for(int i = 0; i < OCTAVES; i++) {
- sum += amp * perlin2d(p * freq);
- freq *= LACUNARITY;
- amp *= GAIN;
- }
-
- return sum;
-}
-
-
-#define NOISE_SCALE 1.0 // How distorted the image you want to be
-#define NOISE_INTENSITY 0.05 // How strong the noise effect is
-#define ABERRATION true // Chromatic aberration
-#define ABERRATION_DELTA 0.1 // How strong the chromatic aberration effect is
-#define ANIMATE true
-#define SPEED 0.4 // Animation speed
-
-void mainImage(out vec4 fragColor, in vec2 fragCoord)
-{
- vec2 uv = fragCoord/iResolution.xy;
- float time = ANIMATE ? iTime * SPEED : 0.0;
-
- vec2 noisePos = uv * NOISE_SCALE + vec2(time);
- float noise = fbm(noisePos) * NOISE_INTENSITY;
-
- vec3 col;
-
- if (ABERRATION) {
- col.r = texture(iChannel0, uv + vec2(noise * (1.0 + ABERRATION_DELTA))).r;
- col.g = texture(iChannel0, uv + vec2(noise)).g;
- col.b = texture(iChannel0, uv + vec2(noise * (1.0 - ABERRATION_DELTA))).b;
- } else {
- vec2 distortedUV = uv + vec2(noise);
- col = texture(iChannel0, distortedUV).rgb;
- }
-
- fragColor = vec4(col, 1.0);
-}
diff --git a/ghostty/shaders/fireworks-rockets.glsl b/ghostty/shaders/fireworks-rockets.glsl
deleted file mode 100644
index e2f0b5a..0000000
--- a/ghostty/shaders/fireworks-rockets.glsl
+++ /dev/null
@@ -1,109 +0,0 @@
-// This Ghostty shader is a lightly modified port of https://www.shadertoy.com/view/4dBGRw
-
-#define BLACK_BLEND_THRESHOLD .4
-
-//Creates a diagonal red-and-white striped pattern.
-vec3 barberpole(vec2 pos, vec2 rocketpos) {
- float d = (pos.x - rocketpos.x) + (pos.y - rocketpos.y);
- vec3 col = vec3(1.0);
-
- d = mod(d * 20., 2.0);
- if (d > 1.0) {
- col = vec3(1.0, 0.0, 0.0);
- }
-
- return col;
-}
-
-vec3 rocket(vec2 pos, vec2 rocketpos) {
- vec3 col = vec3(0.0);
- float f = 0.;
- float absx = abs(rocketpos.x - pos.x);
- float absy = abs(rocketpos.y - pos.y);
-
- // Wooden stick
- if (absx < 0.01 && absy < 0.22) {
- col = vec3(1.0, 0.5, 0.5);
- }
-
- // Barberpole
- if (absx < 0.05 && absy < 0.15) {
- col = barberpole(pos, rocketpos);
- }
-
- // Rocket Point
- float pointw = (rocketpos.y - pos.y - 0.25) * -0.7;
- if ((rocketpos.y - pos.y) > 0.1) {
- f = smoothstep(pointw - 0.001, pointw + 0.001, absx);
-
- col = mix(vec3(1.0, 0.0, 0.0), col, f);
- }
-
- // Shadow
- f = -.5 + smoothstep(-0.05, 0.05, (rocketpos.x - pos.x));
- col *= 0.7 + f;
-
- return col;
-}
-
-float rand(float val, float seed) {
- return cos(val * sin(val * seed) * seed);
-}
-
-float distance2(in vec2 a, in vec2 b) {
- return dot(a - b, a - b);
-}
-
-mat2 rr = mat2(cos(1.0), -sin(1.0), sin(1.0), cos(1.0));
-
-vec3 drawParticles(vec2 pos, vec3 particolor, float time, vec2 cpos, float gravity, float seed, float timelength) {
- vec3 col = vec3(0.0);
- vec2 pp = vec2(1.0, 0.0);
- for (float i = 1.0; i <= 128.0; i++) {
- float d = rand(i, seed);
- float fade = (i / 128.0) * time;
- vec2 particpos = cpos + time * pp * d;
- pp = rr * pp;
- col = mix(particolor / fade, col, smoothstep(0.0, 0.0001, distance2(particpos, pos)));
- }
- col *= smoothstep(0.0, 1.0, (timelength - time) / timelength);
-
- return col;
-}
-vec3 drawFireworks(float time, vec2 uv, vec3 particolor, float seed) {
- float timeoffset = 2.0;
- vec3 col = vec3(0.0);
- if (time <= 0.) {
- return col;
- }
- if (mod(time, 6.0) > timeoffset) {
- col = drawParticles(uv, particolor, mod(time, 6.0) - timeoffset, vec2(rand(ceil(time / 6.0), seed), -0.5), 0.5, ceil(time / 6.0), seed);
- } else {
- col = rocket(uv * 3., vec2(3. * rand(ceil(time / 6.0), seed), 3. * (-0.5 + (timeoffset - mod(time, 6.0)))));
- }
- return col;
-}
-
-void mainImage(out vec4 fragColor, in vec2 fragCoord)
-{
- vec2 uv = 1.0 - 2.0 * fragCoord.xy / iResolution.xy;
- uv.x *= iResolution.x / iResolution.y;
- vec3 col = vec3(0.1, 0.1, 0.2);
-
- // Flip the y-axis so that the rocket is drawn from the bottom of the screen
- uv.y = -uv.y;
-
- col += 0.1 * uv.y;
-
- col += drawFireworks(iTime, uv, vec3(1.0, 0.1, 0.1), 1.);
- col += drawFireworks(iTime - 2.0, uv, vec3(0.0, 1.0, 0.5), 2.);
- col += drawFireworks(iTime - 4.0, uv, vec3(1.0, 1.0, 0.1), 3.);
-
- vec2 termUV = fragCoord.xy / iResolution.xy;
- vec4 terminalColor = texture(iChannel0, termUV);
-
- float alpha = step(length(terminalColor.rgb), BLACK_BLEND_THRESHOLD);
- vec3 blendedColor = mix(terminalColor.rgb * 1.0, col.rgb * 0.3, alpha);
-
- fragColor = vec4(blendedColor, terminalColor.a);
-}
diff --git a/ghostty/shaders/fireworks.glsl b/ghostty/shaders/fireworks.glsl
deleted file mode 100644
index 42bc98d..0000000
--- a/ghostty/shaders/fireworks.glsl
+++ /dev/null
@@ -1,116 +0,0 @@
-// This Ghostty shader is a port of https://www.shadertoy.com/view/lscGRl
-
-// "Fireworks" by Martijn Steinrucken aka BigWings - 2015
-// License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.
-// Email:countfrolic@gmail.com Twitter:@The_ArtOfCode
-
-#define BLACK_BLEND_THRESHOLD .4
-#define PI 3.141592653589793238
-#define TWOPI 6.283185307179586
-#define S(x,y,z) smoothstep(x,y,z)
-#define B(x,y,z,w) S(x-z, x+z, w)*S(y+z, y-z, w)
-#define saturate(x) clamp(x,0.,1.)
-
-#define NUM_EXPLOSIONS 3.
-#define NUM_PARTICLES 42.
-
-// Noise functions by Dave Hoskins
-#define MOD3 vec3(.1031,.11369,.13787)
-vec3 hash31(float p) {
- vec3 p3 = fract(vec3(p) * MOD3);
- p3 += dot(p3, p3.yzx + 19.19);
- return fract(vec3((p3.x + p3.y) * p3.z, (p3.x + p3.z) * p3.y, (p3.y + p3.z) * p3.x));
-}
-float hash12(vec2 p) {
- vec3 p3 = fract(vec3(p.xyx) * MOD3);
- p3 += dot(p3, p3.yzx + 19.19);
- return fract((p3.x + p3.y) * p3.z);
-}
-
-float circ(vec2 uv, vec2 pos, float size) {
- uv -= pos;
-
- size *= size;
- return S(size * 1.1, size, dot(uv, uv));
-}
-
-float light(vec2 uv, vec2 pos, float size) {
- uv -= pos;
-
- size *= size;
- return size / dot(uv, uv);
-}
-
-vec3 explosion(vec2 uv, vec2 p, float seed, float t) {
- vec3 col = vec3(0.);
-
- vec3 en = hash31(seed);
- vec3 baseCol = en;
- for (float i = 0.; i < NUM_PARTICLES; i++) {
- vec3 n = hash31(i) - .5;
-
- vec2 startP = p - vec2(0., t * t * .1);
- vec2 endP = startP + normalize(n.xy) * n.z - vec2(0., t * .2);
-
- float pt = 1. - pow(t - 1., 2.);
- vec2 pos = mix(p, endP, pt);
- float size = mix(.01, .005, S(0., .1, pt));
- size *= S(1., .1, pt);
-
- float sparkle = (sin((pt + n.z) * 21.) * .5 + .5);
- sparkle = pow(sparkle, pow(en.x, 3.) * 50.) * mix(0.01, .01, en.y * n.y);
-
- //size += sparkle*B(.6, 1., .1, t);
- size += sparkle * B(en.x, en.y, en.z, t);
-
- col += baseCol * light(uv, pos, size);
- }
-
- return col;
-}
-
-vec3 Rainbow(vec3 c) {
- float t = iTime;
-
- float avg = (c.r + c.g + c.b) / 3.;
- c = avg + (c - avg) * sin(vec3(0., .333, .666) + t);
-
- c += sin(vec3(.4, .3, .3) * t + vec3(1.1244, 3.43215, 6.435)) * vec3(.4, .1, .5);
-
- return c;
-}
-
-void mainImage(out vec4 fragColor, in vec2 fragCoord)
-{
- vec2 uv = fragCoord.xy / iResolution.xy;
- uv.x -= .5;
- uv.x *= iResolution.x / iResolution.y;
-
- // Flip the y-axis so that the gravity is downwards
- uv.y = -uv.y + 1.;
-
- float n = hash12(uv + 10.);
- float t = iTime * .5;
-
- vec3 c = vec3(0.);
-
- for (float i = 0.; i < NUM_EXPLOSIONS; i++) {
- float et = t + i * 1234.45235;
- float id = floor(et);
- et -= id;
-
- vec2 p = hash31(id).xy;
- p.x -= .5;
- p.x *= 1.6;
- c += explosion(uv, p, id, et);
- }
- c = Rainbow(c);
-
- vec2 termUV = fragCoord.xy / iResolution.xy;
- vec4 terminalColor = texture(iChannel0, termUV);
-
- float alpha = step(length(terminalColor.rgb), BLACK_BLEND_THRESHOLD);
- vec3 blendedColor = mix(terminalColor.rgb * 1.0, c.rgb * 0.3, alpha);
-
- fragColor = vec4(blendedColor, terminalColor.a);
-}
diff --git a/ghostty/shaders/galaxy.glsl b/ghostty/shaders/galaxy.glsl
deleted file mode 100644
index 8a7eda9..0000000
--- a/ghostty/shaders/galaxy.glsl
+++ /dev/null
@@ -1,139 +0,0 @@
-float triangle(float x, float period) {
- return 2.0 * abs(3.0* ((x / period) - floor((x / period) + 0.5))) - 1.0;
-}
-
-float field(in vec3 position) {
- float strength = 7.0 + 0.03 * log(1.0e-6 + fract(sin(iTime) * 373.11));
- float accumulated = 0.0;
- float previousMagnitude = 0.0;
- float totalWeight = 0.0;
-
- for (int i = 0; i < 6; ++i) {
- float magnitude = dot(position, position);
- position = abs(position) / magnitude + vec3(-0.5, -0.8 + 0.1 * sin(-iTime * 0.1 + 2.0), -1.1 + 0.3 * cos(iTime * 0.3));
- float weight = exp(-float(i) / 7.0);
- accumulated += weight * exp(-strength * pow(abs(magnitude - previousMagnitude), 2.3));
- totalWeight += weight;
- previousMagnitude = magnitude;
- }
-
- return max(0.0, 5.0 * accumulated / totalWeight - 0.7);
-}
-
-void mainImage(out vec4 fragColor, in vec2 fragCoord) {
- const float baseSpeed = 0.02;
- const int maxIterations = 16;
- const float formulaParameter = 0.79;
- const float volumeSteps = 7.0;
- const float stepSize = 0.24;
- const float zoomFactor = 0.1;
- const float tilingFactor = 0.85;
- const float baseBrightness = 0.0008;
- const float darkMatter = 0.2;
- const float distanceFading = 0.56;
- const float colorSaturation = 0.9;
- const float transverseMotion = 0.2;
- const float cloudOpacity = 0.48;
- const float zoomSpeed = 0.0002;
-
- vec2 normalizedCoordinates = 2.0 * fragCoord.xy / vec2(512) - 1.0;
- vec2 scaledCoordinates = normalizedCoordinates * vec2(512) / 512.0;
-
- float timeElapsed = iTime;
- float speedAdjustment = -baseSpeed;
- float formulaAdjustment = formulaParameter;
-
- speedAdjustment = zoomSpeed * cos(iTime * 0.02 + 3.1415926 / 4.0);
-
- vec2 uvCoordinates = scaledCoordinates;
-
- float rotationXZ = 0.9;
- float rotationYZ = -0.6;
- float rotationXY = 0.9 + iTime * 0.08;
-
- mat2 rotationMatrixXZ = mat2(vec2(cos(rotationXZ), sin(rotationXZ)), vec2(-sin(rotationXZ), cos(rotationXZ)));
- mat2 rotationMatrixYZ = mat2(vec2(cos(rotationYZ), sin(rotationYZ)), vec2(-sin(rotationYZ), cos(rotationYZ)));
- mat2 rotationMatrixXY = mat2(vec2(cos(rotationXY), sin(rotationXY)), vec2(-sin(rotationXY), cos(rotationXY)));
-
- vec2 canvasCenter = vec2(0.5, 0.5);
- vec3 rayDirection = vec3(uvCoordinates * zoomFactor, 1.0);
- vec3 cameraPosition = vec3(0.0, 0.0, 0.0);
- cameraPosition.x -= 2.0 * (canvasCenter.x - 0.5);
- cameraPosition.y -= 2.0 * (canvasCenter.y - 0.5);
-
- vec3 forwardVector = vec3(0.0, 0.0, 1.0);
- cameraPosition.x += transverseMotion * cos(0.01 * iTime) + 0.001 * iTime;
- cameraPosition.y += transverseMotion * sin(0.01 * iTime) + 0.001 * iTime;
- cameraPosition.z += 0.003 * iTime;
-
- rayDirection.xz *= rotationMatrixXZ;
- forwardVector.xz *= rotationMatrixXZ;
- rayDirection.yz *= rotationMatrixYZ;
- forwardVector.yz *= rotationMatrixYZ;
-
- cameraPosition.xy *= -1.0 * rotationMatrixXY;
- cameraPosition.xz *= rotationMatrixXZ;
- cameraPosition.yz *= rotationMatrixYZ;
-
- float zoomOffset = (timeElapsed - 3311.0) * speedAdjustment;
- cameraPosition += forwardVector * zoomOffset;
- float sampleOffset = mod(zoomOffset, stepSize);
- float normalizedSampleOffset = sampleOffset / stepSize;
-
- float stepDistance = 0.24;
- float secondaryStepDistance = stepDistance + stepSize / 2.0;
- vec3 accumulatedColor = vec3(0.0);
- float fieldContribution = 0.0;
- vec3 backgroundColor = vec3(0.0);
-
- for (float stepIndex = 0.0; stepIndex < volumeSteps; ++stepIndex) {
- vec3 primaryPosition = cameraPosition + (stepDistance + sampleOffset) * rayDirection;
- vec3 secondaryPosition = cameraPosition + (secondaryStepDistance + sampleOffset) * rayDirection;
-
- primaryPosition = abs(vec3(tilingFactor) - mod(primaryPosition, vec3(tilingFactor * 2.0)));
- secondaryPosition = abs(vec3(tilingFactor) - mod(secondaryPosition, vec3(tilingFactor * 2.0)));
-
- fieldContribution = field(secondaryPosition);
-
- float particleAccumulator = 0.0, particleDistance = 0.0;
- for (int i = 0; i < maxIterations; ++i) {
- primaryPosition = abs(primaryPosition) / dot(primaryPosition, primaryPosition) - formulaAdjustment;
- float distanceChange = abs(length(primaryPosition) - particleDistance);
- particleAccumulator += i > 2 ? min(12.0, distanceChange) : distanceChange;
- particleDistance = length(primaryPosition);
- }
- particleAccumulator *= particleAccumulator * particleAccumulator;
-
- float fadeFactor = pow(distanceFading, max(0.0, float(stepIndex) - normalizedSampleOffset));
- accumulatedColor += vec3(stepDistance, stepDistance * stepDistance, stepDistance * stepDistance * stepDistance * stepDistance)
- * particleAccumulator * baseBrightness * fadeFactor;
- backgroundColor += mix(0.4, 1.0, cloudOpacity) * vec3(1.8 * fieldContribution * fieldContribution * fieldContribution,
- 1.4 * fieldContribution * fieldContribution, fieldContribution) * fadeFactor;
- stepDistance += stepSize;
- secondaryStepDistance += stepSize;
- }
-
- accumulatedColor = mix(vec3(length(accumulatedColor)), accumulatedColor, colorSaturation);
-
- vec4 foregroundColor = vec4(accumulatedColor * 0.01, 1.0);
- backgroundColor *= cloudOpacity;
- backgroundColor.b *= 1.8;
- backgroundColor.r *= 0.05;
-
- backgroundColor.b = 0.5 * mix(backgroundColor.g, backgroundColor.b, 0.8);
- backgroundColor.g = 0.0;
- backgroundColor.bg = mix(backgroundColor.gb, backgroundColor.bg, 0.5 * (cos(iTime * 0.01) + 1.0));
-
- vec2 terminalUV = fragCoord.xy / iResolution.xy;
- vec4 terminalColor = texture(iChannel0, terminalUV);
-
- float brightnessThreshold = 0.1;
- float terminalBrightness = dot(terminalColor.rgb, vec3(0.2126, 0.7152, 0.0722));
-
- if (terminalBrightness < brightnessThreshold) {
- fragColor = mix(terminalColor, vec4(foregroundColor.rgb + backgroundColor, 1.0), 0.24);
- } else {
- fragColor = terminalColor;
- }
-}
-
diff --git a/ghostty/shaders/gears-and-belts.glsl b/ghostty/shaders/gears-and-belts.glsl
deleted file mode 100644
index 9976b34..0000000
--- a/ghostty/shaders/gears-and-belts.glsl
+++ /dev/null
@@ -1,377 +0,0 @@
-// sligltly modified version of https://www.shadertoy.com/view/DsVSDV
-// The only changes are done in the mainImage function
-// Ive added comments on what to modify
-// works really well with most colorschemes
-
-#define Rot(a) mat2(cos(a),-sin(a),sin(a),cos(a))
-#define antialiasing(n) n/min(iResolution.y,iResolution.x)
-#define S(d,b) smoothstep(antialiasing(3.0),b,d)
-#define B(p,s) max(abs(p).x-s.x,abs(p).y-s.y)
-#define deg45 .707
-#define R45(p) (( p + vec2(p.y,-p.x) ) *deg45)
-#define Tri(p,s) max(R45(p).x,max(R45(p).y,B(p,s)))
-#define DF(a,b) length(a) * cos( mod( atan(a.y,a.x)+6.28/(b*8.0), 6.28/((b*8.0)*0.5))+(b-1.)*6.28/(b*8.0) + vec2(0,11) )
-
-float random (vec2 p) {
- return fract(sin(dot(p.xy, vec2(12.9898,78.233)))* 43758.5453123);
-}
-
-float innerGear(vec2 p, float dir){
- p*=Rot(radians(-iTime*45.+45.)*dir);
- vec2 prevP = p;
-
- //p*=Rot(radians(iTime*45.+20.));
- p = DF(p,7.);
- p-=vec2(0.24);
- p*=Rot(deg45);
- float d = B(p,vec2(0.01,0.06));
- p = prevP;
- float d2 = abs(length(p)-0.42)-0.02;
- d = min(d,d2);
- d2 = abs(length(p)-0.578)-0.02;
- d = min(d,d2);
- d2 = abs(length(p)-0.499)-0.005;
- d = min(d,d2);
-
- p = DF(p,7.);
- p-=vec2(0.43);
- p*=Rot(deg45);
- d2 = B(p,vec2(0.01,0.04));
- d = min(d,d2);
-
- return d;
-}
-
-vec3 pattern1(vec2 p, vec3 col, float dir){
- vec2 prevP = p;
- float size = 0.499;
- float thick = 0.15;
-
- p+=vec2(size);
- float d = abs(length(p)-size)-thick;
- d = max(d,innerGear(p,dir));
- col = mix(col,vec3(1.),S(d,0.0));
-
- p = prevP;
- p-=vec2(size);
- d = abs(length(p)-size)-thick;
- d = max(d,innerGear(p,dir));
- col = mix(col,vec3(1.),S(d,0.0));
-
- return col;
-}
-
-vec3 pattern2(vec2 p, vec3 col, float dir){
-
- vec2 prevP = p;
- float size = 0.33;
- float thick = 0.15;
- float thift = 0.0;
- float speed = 0.3;
-
- p-=vec2(size,0.);
- float d = B(p,vec2(size,thick));
-
- p.x+=thift;
- p.x-=iTime*speed*dir;
- p.x=mod(p.x,0.08)-0.04;
- d = max(d,B(p,vec2(0.011,thick)));
- p = prevP;
- d = max(-(abs(p.y)-0.1),d);
- //d = min(B(p,vec2(1.,0.1)),d);
- p.y=abs(p.y)-0.079;
- d = min(B(p,vec2(1.,0.02)),d);
-
- p = prevP;
- p-=vec2(0.0,size);
- float d2 = B(p,vec2(thick,size));
-
- p.y+=thift;
- p.y+=iTime*speed*dir;
- p.y=mod(p.y,0.08)-0.04;
- d2 = max(d2,B(p,vec2(thick,0.011)));
-
- p = prevP;
- d2 = max(-(abs(p.x)-0.1),d2);
- d2 = min(B(p,vec2(0.005,1.)),d2);
- p.x=abs(p.x)-0.079;
- d2 = min(B(p,vec2(0.02,1.)),d2);
-
- d = min(d,d2);
-
- p = prevP;
- p+=vec2(0.0,size);
- d2 = B(p,vec2(thick,size));
-
- p.y+=thift;
- p.y-=iTime*speed*dir;
- p.y=mod(p.y,0.08)-0.04;
- d2 = max(d2,B(p,vec2(thick,0.011)));
-
- p = prevP;
- d2 = max(-(abs(p.x)-0.1),d2);
- d2 = min(B(p,vec2(0.005,1.)),d2);
- p.x=abs(p.x)-0.079;
- d2 = min(B(p,vec2(0.02,1.)),d2);
-
- d = min(d,d2);
-
- p = prevP;
- p+=vec2(size,0.0);
- d2 = B(p,vec2(size,thick));
-
- p.x+=thift;
- p.x+=iTime*speed*dir;
- p.x=mod(p.x,0.08)-0.04;
- d2 = max(d2,B(p,vec2(0.011,thick)));
- d = min(d,d2);
- p = prevP;
- d = max(-(abs(p.y)-0.1),d);
- d = min(B(p,vec2(1.,0.005)),d);
- p.y=abs(p.y)-0.079;
- d = min(B(p,vec2(1.,0.02)),d);
-
- p = prevP;
- d2 = abs(B(p,vec2(size*0.3)))-0.05;
- d = min(d,d2);
-
- col = mix(col,vec3(1.),S(d,0.0));
-
- d = B(p,vec2(0.08));
- col = mix(col,vec3(0.),S(d,0.0));
-
- p*=Rot(radians(60.*iTime*dir));
- d = B(p,vec2(0.03));
- col = mix(col,vec3(1.),S(d,0.0));
-
- return col;
-}
-
-vec3 drawBelt(vec2 p, vec3 col, float size){
- vec2 prevP = p;
-
- p*=size;
- vec2 id = floor(p);
- vec2 gr = fract(p)-0.5;
- float dir = mod(id.x+id.y,2.)*2.-1.;
- float n = random(id);
-
- if(n<0.5){
- if(n<0.25){
- gr.x*=-1.;
- }
- col = pattern1(gr,col,dir);
- } else {
- if(n>0.75){
- gr.x*=-1.;
- }
- col = pattern2(gr,col,dir);
- }
-
- return col;
-}
-
-vec3 gear(vec2 p, vec3 col, float dir){
- vec2 prevP = p;
-
- p*=Rot(radians(iTime*45.+13.)*-dir);
- p = DF(p,7.);
- p-=vec2(0.23);
- p*=Rot(deg45);
- float d = B(p,vec2(0.01,0.04));
- p = prevP;
- float d2 = abs(length(p)-0.29)-0.02;
- d = min(d,d2);
- col = mix(col,vec3(1.),S(d,0.0));
-
- p*=Rot(radians(iTime*30.-30.)*dir);
- p = DF(p,6.);
- p-=vec2(0.14);
- p*=Rot(radians(45.));
- d = B(p,vec2(0.01,0.03));
- p = prevP;
- d2 =abs( length(p)-0.1)-0.02;
- p*=Rot(radians(iTime*25.+30.)*-dir);
- d2 = max(-(abs(p.x)-0.05),d2);
- d = min(d,d2);
- col = mix(col,vec3(1.),S(d,0.0));
-
- return col;
-}
-
-vec3 item0(vec2 p, vec3 col, float dir){
- vec2 prevP = p;
- p.x*=dir;
- p*=Rot(radians(iTime*30.+30.));
- float d = abs(length(p)-0.2)-0.05;
- col = mix(col,vec3(0.3),S(d,0.0));
-
- d = abs(length(p)-0.2)-0.05;
- d = max(-p.x,d);
- float a = clamp(atan(p.x,p.y)*0.5,0.3,1.);
-
- col = mix(col,vec3(a),S(d,0.0));
-
- return col;
-}
-
-
-vec3 item1(vec2 p, vec3 col, float dir){
- p.x*=dir;
- vec2 prevP = p;
- p*=Rot(radians(iTime*30.+30.));
- float d = abs(length(p)-0.25)-0.04;
- d = abs(max((abs(p.y)-0.15),d))-0.005;
- float d2 = abs(length(p)-0.25)-0.01;
- d2 = max((abs(p.y)-0.12),d2);
- d = min(d,d2);
-
- d2 = abs(length(p)-0.27)-0.01;
- d2 = max(-(abs(p.y)-0.22),d2);
- d = min(d,d2);
- d2 = B(p,vec2(0.01,0.32));
- d2 = max(-(abs(p.y)-0.22),d2);
- d = min(d,d2);
-
- p = prevP;
- p*=Rot(radians(iTime*-20.+30.));
- p = DF(p,2.);
- p-=vec2(0.105);
- p*=Rot(radians(45.));
- d2 = B(p,vec2(0.03,0.01));
- d = min(d,d2);
-
- p = prevP;
- d2 = abs(length(p)-0.09)-0.005;
- d2 = max(-(abs(p.x)-0.03),d2);
- d2 = max(-(abs(p.y)-0.03),d2);
- d = min(d,d2);
-
- col = mix(col,vec3(0.6),S(d,0.0));
-
- return col;
-}
-
-vec3 item2(vec2 p, vec3 col, float dir){
- p.x*=dir;
- p*=Rot(radians(iTime*50.-10.));
- vec2 prevP = p;
- float d = abs(length(p)-0.15)-0.005;
- float d2 = abs(length(p)-0.2)-0.01;
- d2 = max((abs(p.y)-0.15),d2);
- d = min(d,d2);
-
- p = DF(p,1.);
- p-=vec2(0.13);
- p*=Rot(radians(45.));
- d2 = B(p,vec2(0.008,0.1));
- d = min(d,d2);
-
- p = prevP;
- p = DF(p,4.);
- p-=vec2(0.18);
- p*=Rot(radians(45.));
- d2 = B(p,vec2(0.005,0.02));
- d = min(d,d2);
-
- col = mix(col,vec3(0.6),S(d,0.0));
-
- return col;
-}
-
-float needle(vec2 p){
- p.y-=0.05;
- p*=1.5;
- vec2 prevP = p;
- p.y-=0.3;
- p.x*=6.;
- float d = Tri(p,vec2(0.3));
- p = prevP;
- p.y+=0.1;
- p.x*=2.;
- p.y*=-1.;
- float d2 = Tri(p,vec2(0.1));
- d = min(d,d2);
- return d;
-}
-
-vec3 item3(vec2 p, vec3 col, float dir){
-
- p*=Rot(radians(sin(iTime*dir)*120.));
- vec2 prevP = p;
-
- p.y= abs(p.y)-0.05;
- float d = needle(p);
- p = prevP;
- float d2 = abs(length(p)-0.1)-0.003;
- d2 = max(-(abs(p.x)-0.05),d2);
- d = min(d,d2);
- d2 = abs(length(p)-0.2)-0.005;
- d2 = max(-(abs(p.x)-0.08),d2);
- d = min(d,d2);
-
- p = DF(p,4.);
- p-=vec2(0.18);
- d2 = length(p)-0.01;
- p = prevP;
- d2 = max(-(abs(p.x)-0.03),d2);
- d = min(d,d2);
-
- col = mix(col,vec3(0.6),S(d,0.0));
-
- return col;
-}
-
-vec3 drawGearsAndItems(vec2 p, vec3 col, float size){
- vec2 prevP = p;
- p*=size;
- p+=vec2(0.5);
-
- vec2 id = floor(p);
- vec2 gr = fract(p)-0.5;
-
- float n = random(id);
- float dir = mod(id.x+id.y,2.)*2.-1.;
- if(n<0.3){
- col = gear(gr,col,dir);
- } else if(n>=0.3 && n<0.5){
- col = item0(gr,col,dir);
- } else if(n>=0.5 && n<0.7){
- col = item1(gr,col,dir);
- } else if(n>=0.7 && n<0.8) {
- col = item2(gr,col,dir);
- } else if(n>=0.8){
- col = item3(gr,col,dir);
- }
-
- return col;
-}
-
-void mainImage( out vec4 fragColor, in vec2 fragCoord )
-{
- vec2 p = (fragCoord-0.5*iResolution.xy)/iResolution.y;
- // set speed of downwards motion
- p.y+=iTime*0.02;
-
- float size = 4.;
- vec3 col = vec3(0.);
-
- // Modify the colors to be darker by multiplying with a small factor
- vec3 darkFactor = vec3(.5); // This makes everything 50% as bright
-
- // Get the original colors but make them darker
- col = drawBelt(p, col, size) * darkFactor;
- col = drawGearsAndItems(p, col, size) * darkFactor;
-
- // Additional option: you can add a color tint to make it less stark white
- vec3 tint = vec3(0.1, 0.12, 0.15); // Slight blue-ish dark tint
- col = col * tint;
-
- vec2 uv = fragCoord/iResolution.xy;
- vec4 terminalColor = texture(iChannel0, uv);
-
- // Blend with reduced opacity for the shader elements
- vec3 blendedColor = terminalColor.rgb + col.rgb * 0.7; // Reduced blend factor
-
- fragColor = vec4(blendedColor, terminalColor.a);
-}
diff --git a/ghostty/shaders/glitchy.glsl b/ghostty/shaders/glitchy.glsl
deleted file mode 100644
index 603e3ec..0000000
--- a/ghostty/shaders/glitchy.glsl
+++ /dev/null
@@ -1,117 +0,0 @@
-// modified version of https://www.shadertoy.com/view/wld3WN
-// amount of seconds for which the glitch loop occurs
-#define DURATION 10.
-// percentage of the duration for which the glitch is triggered
-#define AMT .1
-
-#define SS(a, b, x) (smoothstep(a, b, x) * smoothstep(b, a, x))
-
-#define UI0 1597334673U
-#define UI1 3812015801U
-#define UI2 uvec2(UI0, UI1)
-#define UI3 uvec3(UI0, UI1, 2798796415U)
-#define UIF (1. / float(0xffffffffU))
-
-// Hash by David_Hoskins
-vec3 hash33(vec3 p)
-{
- uvec3 q = uvec3(ivec3(p)) * UI3;
- q = (q.x ^ q.y ^ q.z)*UI3;
- return -1. + 2. * vec3(q) * UIF;
-}
-
-// Gradient noise by iq
-float gnoise(vec3 x)
-{
- // grid
- vec3 p = floor(x);
- vec3 w = fract(x);
-
- // quintic interpolant
- vec3 u = w * w * w * (w * (w * 6. - 15.) + 10.);
-
- // gradients
- vec3 ga = hash33(p + vec3(0., 0., 0.));
- vec3 gb = hash33(p + vec3(1., 0., 0.));
- vec3 gc = hash33(p + vec3(0., 1., 0.));
- vec3 gd = hash33(p + vec3(1., 1., 0.));
- vec3 ge = hash33(p + vec3(0., 0., 1.));
- vec3 gf = hash33(p + vec3(1., 0., 1.));
- vec3 gg = hash33(p + vec3(0., 1., 1.));
- vec3 gh = hash33(p + vec3(1., 1., 1.));
-
- // projections
- float va = dot(ga, w - vec3(0., 0., 0.));
- float vb = dot(gb, w - vec3(1., 0., 0.));
- float vc = dot(gc, w - vec3(0., 1., 0.));
- float vd = dot(gd, w - vec3(1., 1., 0.));
- float ve = dot(ge, w - vec3(0., 0., 1.));
- float vf = dot(gf, w - vec3(1., 0., 1.));
- float vg = dot(gg, w - vec3(0., 1., 1.));
- float vh = dot(gh, w - vec3(1., 1., 1.));
-
- // interpolation
- float gNoise = va + u.x * (vb - va) +
- u.y * (vc - va) +
- u.z * (ve - va) +
- u.x * u.y * (va - vb - vc + vd) +
- u.y * u.z * (va - vc - ve + vg) +
- u.z * u.x * (va - vb - ve + vf) +
- u.x * u.y * u.z * (-va + vb + vc - vd + ve - vf - vg + vh);
-
- return 2. * gNoise;
-}
-
-// gradient noise in range [0, 1]
-float gnoise01(vec3 x)
-{
- return .5 + .5 * gnoise(x);
-}
-
-// warp uvs for the crt effect
-vec2 crt(vec2 uv)
-{
- float tht = atan(uv.y, uv.x);
- float r = length(uv);
- // curve without distorting the center
- r /= (1. - .1 * r * r);
- uv.x = r * cos(tht);
- uv.y = r * sin(tht);
- return .5 * (uv + 1.);
-}
-
-
-void mainImage( out vec4 fragColor, in vec2 fragCoord )
-{
- vec2 uv = fragCoord / iResolution.xy;
- float t = iTime;
-
- // smoothed interval for which the glitch gets triggered
- float glitchAmount = SS(DURATION * .001, DURATION * AMT, mod(t, DURATION));
- float displayNoise = 0.;
- vec3 col = vec3(0.);
- vec2 eps = vec2(5. / iResolution.x, 0.);
- vec2 st = vec2(0.);
-
- // analog distortion
- float y = uv.y * iResolution.y;
- float distortion = gnoise(vec3(0., y * .01, t * 500.)) * (glitchAmount * 4. + .1);
- distortion *= gnoise(vec3(0., y * .02, t * 250.)) * (glitchAmount * 2. + .025);
-
- ++displayNoise;
- distortion += smoothstep(.999, 1., sin((uv.y + t * 1.6) * 2.)) * .02;
- distortion -= smoothstep(.999, 1., sin((uv.y + t) * 2.)) * .02;
- st = uv + vec2(distortion, 0.);
- // chromatic aberration
- col.r += textureLod(iChannel0, st + eps + distortion, 0.).r;
- col.g += textureLod(iChannel0, st, 0.).g;
- col.b += textureLod(iChannel0, st - eps - distortion, 0.).b;
-
- // white noise + scanlines
- displayNoise = 0.2 * clamp(displayNoise, 0., 1.);
- col += (.15 + .65 * glitchAmount) * (hash33(vec3(fragCoord, mod(float(iFrame),
- 1000.))).r) * displayNoise;
- col -= (.25 + .75 * glitchAmount) * (sin(4. * t + uv.y * iResolution.y * 1.75))
- * displayNoise;
- fragColor = vec4(col, 1.0);
-}
diff --git a/ghostty/shaders/glow-rgbsplit-twitchy.glsl b/ghostty/shaders/glow-rgbsplit-twitchy.glsl
deleted file mode 100644
index 9411e4e..0000000
--- a/ghostty/shaders/glow-rgbsplit-twitchy.glsl
+++ /dev/null
@@ -1,144 +0,0 @@
-// First it does a "chromatic aberration" by splitting the rgb signals by a product of sin functions
-// over time, then it does a glow effect in a perceptual color space
-// Based on kalgynirae's Ghostty passable glow shader and NickWest's Chromatic Aberration shader demo
-// Passable glow: https://github.com/kalgynirae/dotfiles/blob/main/ghostty/glow.glsl
-// "Chromatic Aberration": https://www.shadertoy.com/view/Mds3zn
-
-// sRGB linear -> nonlinear transform from https://bottosson.github.io/posts/colorwrong/
-float f(float x) {
- if (x >= 0.0031308) {
- return 1.055 * pow(x, 1.0 / 2.4) - 0.055;
- } else {
- return 12.92 * x;
- }
-}
-
-float f_inv(float x) {
- if (x >= 0.04045) {
- return pow((x + 0.055) / 1.055, 2.4);
- } else {
- return x / 12.92;
- }
-}
-
-// Oklab <-> linear sRGB conversions from https://bottosson.github.io/posts/oklab/
-vec4 toOklab(vec4 rgb) {
- vec3 c = vec3(f_inv(rgb.r), f_inv(rgb.g), f_inv(rgb.b));
- float l = 0.4122214708 * c.r + 0.5363325363 * c.g + 0.0514459929 * c.b;
- float m = 0.2119034982 * c.r + 0.6806995451 * c.g + 0.1073969566 * c.b;
- float s = 0.0883024619 * c.r + 0.2817188376 * c.g + 0.6299787005 * c.b;
- float l_ = pow(l, 1.0 / 3.0);
- float m_ = pow(m, 1.0 / 3.0);
- float s_ = pow(s, 1.0 / 3.0);
- return vec4(
- 0.2104542553 * l_ + 0.7936177850 * m_ - 0.0040720468 * s_,
- 1.9779984951 * l_ - 2.4285922050 * m_ + 0.4505937099 * s_,
- 0.0259040371 * l_ + 0.7827717662 * m_ - 0.8086757660 * s_,
- rgb.a
- );
-}
-
-vec4 toRgb(vec4 oklab) {
- vec3 c = oklab.rgb;
- float l_ = c.r + 0.3963377774 * c.g + 0.2158037573 * c.b;
- float m_ = c.r - 0.1055613458 * c.g - 0.0638541728 * c.b;
- float s_ = c.r - 0.0894841775 * c.g - 1.2914855480 * c.b;
- float l = l_ * l_ * l_;
- float m = m_ * m_ * m_;
- float s = s_ * s_ * s_;
- vec3 linear_srgb = vec3(
- 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,
- -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,
- -0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s
- );
- return vec4(
- clamp(f(linear_srgb.r), 0.0, 1.0),
- clamp(f(linear_srgb.g), 0.0, 1.0),
- clamp(f(linear_srgb.b), 0.0, 1.0),
- oklab.a
- );
-}
-
-// Bloom samples from https://gist.github.com/qwerasd205/c3da6c610c8ffe17d6d2d3cc7068f17f
-const vec3[24] samples = {
- vec3(0.1693761725038636, 0.9855514761735895, 1),
- vec3(-1.333070830962943, 0.4721463328627773, 0.7071067811865475),
- vec3(-0.8464394909806497, -1.51113870578065, 0.5773502691896258),
- vec3(1.554155680728463, -1.2588090085709776, 0.5),
- vec3(1.681364377589461, 1.4741145918052656, 0.4472135954999579),
- vec3(-1.2795157692199817, 2.088741103228784, 0.4082482904638631),
- vec3(-2.4575847530631187, -0.9799373355024756, 0.3779644730092272),
- vec3(0.5874641440200847, -2.7667464429345077, 0.35355339059327373),
- vec3(2.997715703369726, 0.11704939884745152, 0.3333333333333333),
- vec3(0.41360842451688395, 3.1351121305574803, 0.31622776601683794),
- vec3(-3.167149933769243, 0.9844599011770256, 0.30151134457776363),
- vec3(-1.5736713846521535, -3.0860263079123245, 0.2886751345948129),
- vec3(2.888202648340422, -2.1583061557896213, 0.2773500981126146),
- vec3(2.7150778983300325, 2.5745586041105715, 0.2672612419124244),
- vec3(-2.1504069972377464, 3.2211410627650165, 0.2581988897471611),
- vec3(-3.6548858794907493, -1.6253643308191343, 0.25),
- vec3(1.0130775986052671, -3.9967078676335834, 0.24253562503633297),
- vec3(4.229723673607257, 0.33081361055181563, 0.23570226039551587),
- vec3(0.40107790291173834, 4.340407413572593, 0.22941573387056174),
- vec3(-4.319124570236028, 1.159811599693438, 0.22360679774997896),
- vec3(-1.9209044802827355, -4.160543952132907, 0.2182178902359924),
- vec3(3.8639122286635708, -2.6589814382925123, 0.21320071635561041),
- vec3(3.3486228404946234, 3.4331800232609, 0.20851441405707477),
- vec3(-2.8769733643574344, 3.9652268864187157, 0.20412414523193154)
-};
-
-float offsetFunction(float iTime) {
- float amount = 1.0;
- const float periods[4] = {6.0, 16.0, 19.0, 27.0};
- for (int i = 0; i < 4; i++) {
- amount *= 1.0 + 0.5 * sin(iTime*periods[i]);
- }
- //return amount;
- return amount * periods[3];
-}
-
-const float DIM_CUTOFF = 0.35;
-const float BRIGHT_CUTOFF = 0.65;
-const float ABBERATION_FACTOR = 0.05;
-
-void mainImage(out vec4 fragColor, in vec2 fragCoord) {
- vec2 uv = fragCoord.xy / iResolution.xy;
-
- float amount = offsetFunction(iTime);
-
- vec3 col;
- col.r = texture( iChannel0, vec2(uv.x-ABBERATION_FACTOR*amount / iResolution.x, uv.y) ).r;
- col.g = texture( iChannel0, uv ).g;
- col.b = texture( iChannel0, vec2(uv.x+ABBERATION_FACTOR*amount / iResolution.x, uv.y) ).b;
-
- vec4 splittedColor = vec4(col, 1.0);
- vec4 source = toOklab(splittedColor);
- vec4 dest = source;
-
- if (source.x > DIM_CUTOFF) {
- dest.x *= 1.2;
- // dest.x = 1.2;
- } else {
- vec2 step = vec2(1.414) / iResolution.xy;
- vec3 glow = vec3(0.0);
- for (int i = 0; i < 24; i++) {
- vec3 s = samples[i];
- float weight = s.z;
- vec4 c = toOklab(texture(iChannel0, uv + s.xy * step));
- if (c.x > DIM_CUTOFF) {
- glow.yz += c.yz * weight * 0.3;
- if (c.x <= BRIGHT_CUTOFF) {
- glow.x += c.x * weight * 0.05;
- } else {
- glow.x += c.x * weight * 0.10;
- }
- }
- }
- // float lightness_diff = clamp(glow.x - dest.x, 0.0, 1.0);
- // dest.x = lightness_diff;
- // dest.yz = dest.yz * (1.0 - lightness_diff) + glow.yz * lightness_diff;
- dest.xyz += glow.xyz;
- }
-
- fragColor = toRgb(dest);
-}
diff --git a/ghostty/shaders/gradient-background.glsl b/ghostty/shaders/gradient-background.glsl
deleted file mode 100644
index beae0cf..0000000
--- a/ghostty/shaders/gradient-background.glsl
+++ /dev/null
@@ -1,25 +0,0 @@
-// credits: https://github.com/unkn0wncode
-void mainImage(out vec4 fragColor, in vec2 fragCoord)
-{
- // Normalize pixel coordinates (range from 0 to 1)
- vec2 uv = fragCoord.xy / iResolution.xy;
-
- // Create a gradient from bottom right to top left as a function (x + y)/2
- float gradientFactor = (uv.x + uv.y) / 2.0;
-
- // Define gradient colors (adjust to your preference)
- vec3 gradientStartColor = vec3(0.1, 0.1, 0.5); // Start color (e.g., dark blue)
- vec3 gradientEndColor = vec3(0.5, 0.1, 0.1); // End color (e.g., dark red)
-
- vec3 gradientColor = mix(gradientStartColor, gradientEndColor, gradientFactor);
-
- // Sample the terminal screen texture including alpha channel
- vec4 terminalColor = texture(iChannel0, uv);
-
- // Make a mask that is 1.0 where the terminal content is not black
- float mask = 1 - step(0.5, dot(terminalColor.rgb, vec3(1.0)));
- vec3 blendedColor = mix(terminalColor.rgb, gradientColor, mask);
-
- // Apply terminal's alpha to control overall opacity
- fragColor = vec4(blendedColor, terminalColor.a);
-}
\ No newline at end of file
diff --git a/ghostty/shaders/in-game-crt.glsl b/ghostty/shaders/in-game-crt.glsl
deleted file mode 100644
index 34cfc62..0000000
--- a/ghostty/shaders/in-game-crt.glsl
+++ /dev/null
@@ -1,304 +0,0 @@
-// In-game CRT shader
-// Author: sarphiv
-// License: CC BY-NC-SA 4.0
-// Description:
-// Shader for ghostty that is focussed on being usable while looking like a stylized CRT terminal in a modern video game.
-// I know a tiny bit about shaders, and nothing about GLSL,
-// so this is a Frakenstein's monster combination of other shaders together with a lot of surgery.
-// On the bright side, i've cleaned up the body parts and surgery a lot.
-
-// Based on:
-// 1. https://gist.github.com/mitchellh/39d62186910dcc27cad097fed16eb882 (forces the choice of license)
-// 2. https://gist.github.com/qwerasd205/c3da6c610c8ffe17d6d2d3cc7068f17f
-// 3. https://gist.github.com/seanwcom/0fbe6b270aaa5f28823e053d3dbb14ca
-
-
-// Settings:
-// How straight the terminal is in each axis
-// (x, y) \in R^2 : x, y > 0
-#define CURVE 13.0, 11.0
-
-// How far apart the different colors are from each other
-// x \in R
-#define COLOR_FRINGING_SPREAD 1.0
-
-// How much the ghost images are spread out
-// x \in R : x >= 0
-#define GHOSTING_SPREAD 0.75
-// How visible ghost images are
-// x \in R : x >= 0
-#define GHOSTING_STRENGTH 1.0
-
-// How much of the non-linearly darkened colors are mixed in
-// [0, 1]
-#define DARKEN_MIX 0.4
-
-// How far in the vignette spreads
-// x \in R : x >= 0
-#define VIGNETTE_SPREAD 0.3
-// How bright the vignette is
-// x \in R : x >= 0
-#define VIGNETTE_BRIGHTNESS 6.4
-
-// Tint all colors
-// [0, 1]^3
-#define TINT 0.93, 1.00, 0.96
-
-// How visible the scan line effect is
-// NOTE: Technically these are not scan lines, but rather the lack of them
-// [0, 1]
-#define SCAN_LINES_STRENGTH 0.15
-// How bright the spaces between the lines are
-// [0, 1]
-#define SCAN_LINES_VARIANCE 0.35
-// Pixels per scan line effect
-// x \in R : x > 0
-#define SCAN_LINES_PERIOD 4.0
-
-// How visible the aperture grille is
-// x \in R : x >= 0
-#define APERTURE_GRILLE_STRENGTH 0.2
-// Pixels per aperture grille
-// x \in R : x > 0
-#define APERTURE_GRILLE_PERIOD 2.0
-
-// How much the screen flickers
-// x \in R : x >= 0
-#define FLICKER_STRENGTH 0.05
-// How fast the screen flickers
-// x \in R : x > 0
-#define FLICKER_FREQUENCY 15.0
-
-// How much noise is added to filled areas
-// [0, 1]
-#define NOISE_CONTENT_STRENGTH 0.15
-// How much noise is added everywhere
-// [0, 1]
-#define NOISE_UNIFORM_STRENGTH 0.03
-
-// How big the bloom is
-// x \in R : x >= 0
-#define BLOOM_SPREAD 8.0
-// How visible the bloom is
-// [0, 1]
-#define BLOOM_STRENGTH 0.04
-
-// How fast colors fade in and out
-// [0, 1]
-#define FADE_FACTOR 0.55
-
-
-
-// Disabled values for when the settings are not defined
-#ifndef COLOR_FRINGING_SPREAD
-#define COLOR_FRINGING_SPREAD 0.0
-#endif
-
-#if !defined(GHOSTING_SPREAD) || !defined(GHOSTING_STRENGTH)
-#undef GHOSTING_SPREAD
-#undef GHOSTING_STRENGTH
-#define GHOSTING_SPREAD 0.0
-#define GHOSTING_STRENGTH 0.0
-#endif
-
-#ifndef DARKEN_MIX
-#define DARKEN_MIX 0.0
-#endif
-
-#if !defined(VIGNETTE_SPREAD) || !defined(VIGNETTE_BRIGHTNESS)
-#undef VIGNETTE_SPREAD
-#undef VIGNETTE_BRIGHTNESS
-#define VIGNETTE_SPREAD 0.0
-#define VIGNETTE_BRIGHTNESS 1.0
-#endif
-
-#ifndef TINT
-#define TINT 1.00, 1.00, 1.00
-#endif
-
-#if !defined(SCAN_LINES_STRENGTH) || !defined(SCAN_LINES_VARIANCE) || !defined(SCAN_LINES_PERIOD)
-#undef SCAN_LINES_STRENGTH
-#undef SCAN_LINES_VARIANCE
-#undef SCAN_LINES_PERIOD
-#define SCAN_LINES_STRENGTH 0.0
-#define SCAN_LINES_VARIANCE 1.0
-#define SCAN_LINES_PERIOD 1.0
-#endif
-
-#if !defined(APERTURE_GRILLE_STRENGTH) || !defined(APERTURE_GRILLE_PERIOD)
-#undef APERTURE_GRILLE_STRENGTH
-#undef APERTURE_GRILLE_PERIOD
-#define APERTURE_GRILLE_STRENGTH 0.0
-#define APERTURE_GRILLE_PERIOD 1.0
-#endif
-
-#if !defined(FLICKER_STRENGTH) || !defined(FLICKER_FREQUENCY)
-#undef FLICKER_STRENGTH
-#undef FLICKER_FREQUENCY
-#define FLICKER_STRENGTH 0.0
-#define FLICKER_FREQUENCY 1.0
-#endif
-
-#if !defined(NOISE_CONTENT_STRENGTH) || !defined(NOISE_UNIFORM_STRENGTH)
-#undef NOISE_CONTENT_STRENGTH
-#undef NOISE_UNIFORM_STRENGTH
-#define NOISE_CONTENT_STRENGTH 0.0
-#define NOISE_UNIFORM_STRENGTH 0.0
-#endif
-
-#if !defined(BLOOM_SPREAD) || !defined(BLOOM_STRENGTH)
-#undef BLOOM_SPREAD
-#undef BLOOM_STRENGTH
-#define BLOOM_SPREAD 0.0
-#define BLOOM_STRENGTH 0.0
-#endif
-
-#ifndef FADE_FACTOR
-#define FADE_FACTOR 1.00
-#endif
-
-
-
-// Constants
-#define PI 3.1415926535897932384626433832795
-
-#ifdef BLOOM_SPREAD
-// Golden spiral samples used for bloom.
-// [x, y, weight] weight is inverse of distance.
-const vec3[24] bloom_samples = {
- vec3( 0.1693761725038636, 0.9855514761735895, 1),
- vec3(-1.333070830962943, 0.4721463328627773, 0.7071067811865475),
- vec3(-0.8464394909806497, -1.51113870578065, 0.5773502691896258),
- vec3( 1.554155680728463, -1.2588090085709776, 0.5),
- vec3( 1.681364377589461, 1.4741145918052656, 0.4472135954999579),
- vec3(-1.2795157692199817, 2.088741103228784, 0.4082482904638631),
- vec3(-2.4575847530631187, -0.9799373355024756, 0.3779644730092272),
- vec3( 0.5874641440200847, -2.7667464429345077, 0.35355339059327373),
- vec3( 2.997715703369726, 0.11704939884745152, 0.3333333333333333),
- vec3( 0.41360842451688395, 3.1351121305574803, 0.31622776601683794),
- vec3(-3.167149933769243, 0.9844599011770256, 0.30151134457776363),
- vec3(-1.5736713846521535, -3.0860263079123245, 0.2886751345948129),
- vec3( 2.888202648340422, -2.1583061557896213, 0.2773500981126146),
- vec3( 2.7150778983300325, 2.5745586041105715, 0.2672612419124244),
- vec3(-2.1504069972377464, 3.2211410627650165, 0.2581988897471611),
- vec3(-3.6548858794907493, -1.6253643308191343, 0.25),
- vec3( 1.0130775986052671, -3.9967078676335834, 0.24253562503633297),
- vec3( 4.229723673607257, 0.33081361055181563, 0.23570226039551587),
- vec3( 0.40107790291173834, 4.340407413572593, 0.22941573387056174),
- vec3(-4.319124570236028, 1.159811599693438, 0.22360679774997896),
- vec3(-1.9209044802827355, -4.160543952132907, 0.2182178902359924),
- vec3( 3.8639122286635708, -2.6589814382925123, 0.21320071635561041),
- vec3( 3.3486228404946234, 3.4331800232609, 0.20851441405707477),
- vec3(-2.8769733643574344, 3.9652268864187157, 0.20412414523193154)
-};
-#endif
-
-
-
-
-void mainImage(out vec4 fragColor, in vec2 fragCoord) {
- // Get texture coordinates
- vec2 uv = fragCoord.xy / iResolution.xy;
-
-#ifdef CURVE
- // Curve texture coordinates to mimic non-flat CRT monior
- uv = (uv - 0.5) * 2.0;
- uv.xy *= 1.0 + pow((abs(vec2(uv.y, uv.x)) / vec2(CURVE)), vec2(2.0));
- uv = (uv / 2.0) + 0.5;
-#endif
-
-
- // Retrieve colors from appropriate locations
- fragColor.r = texture(iChannel0, vec2(uv.x + 0.0003 * COLOR_FRINGING_SPREAD, uv.y + 0.0003 * COLOR_FRINGING_SPREAD)).x;
- fragColor.g = texture(iChannel0, vec2(uv.x + 0.0000 * COLOR_FRINGING_SPREAD, uv.y - 0.0006 * COLOR_FRINGING_SPREAD)).y;
- fragColor.b = texture(iChannel0, vec2(uv.x - 0.0006 * COLOR_FRINGING_SPREAD, uv.y + 0.0000 * COLOR_FRINGING_SPREAD)).z;
- fragColor.a = texture(iChannel0, uv).a;
-
-
- // Add faint ghost images
- fragColor.r += 0.04 * GHOSTING_STRENGTH * texture(iChannel0, GHOSTING_SPREAD * vec2(+0.025, -0.027) + uv.xy).x;
- fragColor.g += 0.02 * GHOSTING_STRENGTH * texture(iChannel0, GHOSTING_SPREAD * vec2(-0.022, -0.020) + uv.xy).y;
- fragColor.b += 0.04 * GHOSTING_STRENGTH * texture(iChannel0, GHOSTING_SPREAD * vec2(-0.020, -0.018) + uv.xy).z;
-
-
- // Quadratically darken everything
- fragColor.rgb = mix(fragColor.rgb, fragColor.rgb*fragColor.rgb, DARKEN_MIX);
-
-
- // Vignette effect
- fragColor.rgb *= VIGNETTE_BRIGHTNESS * pow(uv.x * uv.y * (1.0-uv.x) * (1.0-uv.y), VIGNETTE_SPREAD);
-
-
- // Tint all colors
- fragColor.rgb *= vec3(TINT);
-
-
- // NOTE: At this point, RGB values may be above 1
-
-
- // Add scan lines effect
- fragColor.rgb *= mix(
- 1.0,
- SCAN_LINES_VARIANCE/2.0*(1.0 + sin(2*PI* uv.y * iResolution.y/SCAN_LINES_PERIOD)),
- SCAN_LINES_STRENGTH
- );
-
-
- // Add aperture grille
- int aperture_grille_step = int(8 * mod(fragCoord.x, APERTURE_GRILLE_PERIOD) / APERTURE_GRILLE_PERIOD);
- float aperture_grille_mask;
-
- if (aperture_grille_step < 3)
- aperture_grille_mask = 0.0;
- else if (aperture_grille_step < 4)
- aperture_grille_mask = mod(8*fragCoord.x, APERTURE_GRILLE_PERIOD) / APERTURE_GRILLE_PERIOD;
- else if (aperture_grille_step < 7)
- aperture_grille_mask = 1.0;
- else if (aperture_grille_step < 8)
- aperture_grille_mask = mod(-8*fragCoord.x, APERTURE_GRILLE_PERIOD) / APERTURE_GRILLE_PERIOD;
-
- fragColor.rgb *= 1.0 - APERTURE_GRILLE_STRENGTH*aperture_grille_mask;
-
-
- // Add flicker
- fragColor *= 1.0 - FLICKER_STRENGTH/2.0*(1.0 + sin(2*PI*FLICKER_FREQUENCY*iTime));
-
-
- // Add noise
- // NOTE: Hard-coded noise distributions
- float noiseContent = smoothstep(0.4, 0.6, fract(sin(uv.x * uv.y * (1.0-uv.x) * (1.0-uv.y) * iTime * 4096.0) * 65536.0));
- float noiseUniform = smoothstep(0.4, 0.6, fract(sin(uv.x * uv.y * (1.0-uv.x) * (1.0-uv.y) * iTime * 8192.0) * 65536.0));
- fragColor.rgb *= clamp(noiseContent + 1.0 - NOISE_CONTENT_STRENGTH, 0.0, 1.0);
- fragColor.rgb = clamp(fragColor.rgb + noiseUniform * NOISE_UNIFORM_STRENGTH, 0.0, 1.0);
-
-
- // NOTE: At this point, RGB values are again within [0, 1]
-
-
- // Remove output outside of screen bounds
- if (uv.x < 0.0 || uv.x > 1.0)
- fragColor.rgb *= 0.0;
- if (uv.y < 0.0 || uv.y > 1.0)
- fragColor.rgb *= 0.0;
-
-
-#ifdef BLOOM_SPREAD
- // Add bloom
- vec2 step = BLOOM_SPREAD * vec2(1.414) / iResolution.xy;
-
- for (int i = 0; i < 24; i++) {
- vec3 bloom_sample = bloom_samples[i];
- vec4 neighbor = texture(iChannel0, uv + bloom_sample.xy * step);
- float luminance = 0.299 * neighbor.r + 0.587 * neighbor.g + 0.114 * neighbor.b;
-
- fragColor += luminance * bloom_sample.z * neighbor * BLOOM_STRENGTH;
- }
-
- fragColor = clamp(fragColor, 0.0, 1.0);
-#endif
-
-
- // Add fade effect to smoothen out color transitions
- // NOTE: May need to be iTime/iTimeDelta dependent
- fragColor = vec4(FADE_FACTOR*fragColor.rgb, FADE_FACTOR);
-}
diff --git a/ghostty/shaders/inside-the-matrix.glsl b/ghostty/shaders/inside-the-matrix.glsl
deleted file mode 100644
index 6992069..0000000
--- a/ghostty/shaders/inside-the-matrix.glsl
+++ /dev/null
@@ -1,413 +0,0 @@
-/*
- Feel free to do anything you want with this code.
- This shader uses "runes" code by FabriceNeyret2 (https://www.shadertoy.com/view/4ltyDM)
- which is based on "runes" by otaviogood (https://shadertoy.com/view/MsXSRn).
- These random runes look good as matrix symbols and have acceptable performance.
-
- @pkazmier modified this shader to work in Ghostty.
-*/
-
-const int ITERATIONS = 40; //use less value if you need more performance
-const float SPEED = .5;
-
-const float STRIP_CHARS_MIN = 7.;
-const float STRIP_CHARS_MAX = 40.;
-const float STRIP_CHAR_HEIGHT = 0.15;
-const float STRIP_CHAR_WIDTH = 0.10;
-const float ZCELL_SIZE = 1. * (STRIP_CHAR_HEIGHT * STRIP_CHARS_MAX); //the multiplier can't be less than 1.
-const float XYCELL_SIZE = 12. * STRIP_CHAR_WIDTH; //the multiplier can't be less than 1.
-
-const int BLOCK_SIZE = 10; //in cells
-const int BLOCK_GAP = 2; //in cells
-
-const float WALK_SPEED = 0.5 * XYCELL_SIZE;
-const float BLOCKS_BEFORE_TURN = 3.;
-
-
-const float PI = 3.14159265359;
-
-
-// ---- random ----
-
-float hash(float v) {
- return fract(sin(v)*43758.5453123);
-}
-
-float hash(vec2 v) {
- return hash(dot(v, vec2(5.3983, 5.4427)));
-}
-
-vec2 hash2(vec2 v)
-{
- v = vec2(v * mat2(127.1, 311.7, 269.5, 183.3));
- return fract(sin(v)*43758.5453123);
-}
-
-vec4 hash4(vec2 v)
-{
- vec4 p = vec4(v * mat4x2( 127.1, 311.7,
- 269.5, 183.3,
- 113.5, 271.9,
- 246.1, 124.6 ));
- return fract(sin(p)*43758.5453123);
-}
-
-vec4 hash4(vec3 v)
-{
- vec4 p = vec4(v * mat4x3( 127.1, 311.7, 74.7,
- 269.5, 183.3, 246.1,
- 113.5, 271.9, 124.6,
- 271.9, 269.5, 311.7 ) );
- return fract(sin(p)*43758.5453123);
-}
-
-
-// ---- symbols ----
-// Slightly modified version of "runes" by FabriceNeyret2 - https://www.shadertoy.com/view/4ltyDM
-// Which is based on "runes" by otaviogood - https://shadertoy.com/view/MsXSRn
-
-float rune_line(vec2 p, vec2 a, vec2 b) { // from https://www.shadertoy.com/view/4dcfW8
- p -= a, b -= a;
- float h = clamp(dot(p, b) / dot(b, b), 0., 1.); // proj coord on line
- return length(p - b * h); // dist to segment
-}
-
-float rune(vec2 U, vec2 seed, float highlight)
-{
- float d = 1e5;
- for (int i = 0; i < 4; i++) // number of strokes
- {
- vec4 pos = hash4(seed);
- seed += 1.;
-
- // each rune touches the edge of its box on all 4 sides
- if (i == 0) pos.y = .0;
- if (i == 1) pos.x = .999;
- if (i == 2) pos.x = .0;
- if (i == 3) pos.y = .999;
- // snap the random line endpoints to a grid 2x3
- vec4 snaps = vec4(2, 3, 2, 3);
- pos = ( floor(pos * snaps) + .5) / snaps;
-
- if (pos.xy != pos.zw) //filter out single points (when start and end are the same)
- d = min(d, rune_line(U, pos.xy, pos.zw + .001) ); // closest line
- }
- return smoothstep(0.1, 0., d) + highlight*smoothstep(0.4, 0., d);
-}
-
-float random_char(vec2 outer, vec2 inner, float highlight) {
- vec2 seed = vec2(dot(outer, vec2(269.5, 183.3)), dot(outer, vec2(113.5, 271.9)));
- return rune(inner, seed, highlight);
-}
-
-
-// ---- digital rain ----
-
-// xy - horizontal, z - vertical
-vec3 rain(vec3 ro3, vec3 rd3, float time) {
- vec4 result = vec4(0.);
-
- // normalized 2d projection
- vec2 ro2 = vec2(ro3);
- vec2 rd2 = normalize(vec2(rd3));
-
- // we use formulas `ro3 + rd3 * t3` and `ro2 + rd2 * t2`, `t3_to_t2` is a multiplier to convert t3 to t2
- bool prefer_dx = abs(rd2.x) > abs(rd2.y);
- float t3_to_t2 = prefer_dx ? rd3.x / rd2.x : rd3.y / rd2.y;
-
- // at first, horizontal space (xy) is divided into cells (which are columns in 3D)
- // then each xy-cell is divided into vertical cells (along z) - each of these cells contains one raindrop
-
- ivec3 cell_side = ivec3(step(0., rd3)); //for positive rd.x use cell side with higher x (1) as the next side, for negative - with lower x (0), the same for y and z
- ivec3 cell_shift = ivec3(sign(rd3)); //shift to move to the next cell
-
- // move through xy-cells in the ray direction
- float t2 = 0.; // the ray formula is: ro2 + rd2 * t2, where t2 is positive as the ray has a direction.
- ivec2 next_cell = ivec2(floor(ro2/XYCELL_SIZE)); //first cell index where ray origin is located
- for (int i=0; i= t2s && tmin <= t2) {
- float u = s.x * rd2.y - s.y * rd2.x; //horizontal coord in the matrix strip
- if (abs(u) < target_rad) {
- u = (u/target_rad + 1.) / 2.;
- float z = ro3.z + rd3.z * tmin/t3_to_t2;
- float v = (z - target_z) / target_length; //vertical coord in the matrix strip
- if (v >= 0.0 && v < 1.0) {
- float c = floor(v * chars_count); //symbol index relative to the start of the strip, with addition of char_z_shift it becomes an index relative to the whole cell
- float q = fract(v * chars_count);
- vec2 char_hash = hash2(vec2(c+char_z_shift, cell_hash2.x));
- if (char_hash.x >= 0.1 || c == 0.) { //10% of missed symbols
- float time_factor = floor(c == 0. ? time*5.0 : //first symbol is changed fast
- time*(1.0*cell_hash2.z + //strips are changed sometime with different speed
- cell_hash2.w*cell_hash2.w*4.*pow(char_hash.y, 4.))); //some symbols in some strips are changed relatively often
- float a = random_char(vec2(char_hash.x, time_factor), vec2(u,q), max(1., 3. - c/2.)*0.2); //alpha
- a *= clamp((chars_count - 0.5 - c) / 2., 0., 1.); //tail fade
- if (a > 0.) {
- float attenuation = 1. + pow(0.06*tmin/t3_to_t2, 2.);
- vec3 col = (c == 0. ? vec3(0.67, 1.0, 0.82) : vec3(0.25, 0.80, 0.40)) / attenuation;
- float a1 = result.a;
- result.a = a1 + (1. - a1) * a;
- result.xyz = (result.xyz * a1 + col * (1. - a1) * a) / result.a;
- if (result.a > 0.98) return result.xyz;
- }
- }
- }
- }
- }
- // not found in this cell - go to next vertical cell
- zcell += cell_shift.z;
- }
- // go to next horizontal cell
- }
-
- return result.xyz * result.a;
-}
-
-
-// ---- main, camera ----
-
-vec2 rotate(vec2 v, float a) {
- float s = sin(a);
- float c = cos(a);
- mat2 m = mat2(c, -s, s, c);
- return m * v;
-}
-
-vec3 rotateX(vec3 v, float a) {
- float s = sin(a);
- float c = cos(a);
- return mat3(1.,0.,0.,0.,c,-s,0.,s,c) * v;
-}
-
-vec3 rotateY(vec3 v, float a) {
- float s = sin(a);
- float c = cos(a);
- return mat3(c,0.,-s,0.,1.,0.,s,0.,c) * v;
-}
-
-vec3 rotateZ(vec3 v, float a) {
- float s = sin(a);
- float c = cos(a);
- return mat3(c,-s,0.,s,c,0.,0.,0.,1.) * v;
-}
-
-float smoothstep1(float x) {
- return smoothstep(0., 1., x);
-}
-
-void mainImage( out vec4 fragColor, in vec2 fragCoord )
-{
- if (STRIP_CHAR_WIDTH > XYCELL_SIZE || STRIP_CHAR_HEIGHT * STRIP_CHARS_MAX > ZCELL_SIZE) {
- // error
- fragColor = vec4(1., 0., 0., 1.);
- return;
- }
-
- vec2 uv = fragCoord.xy / iResolution.xy;
-
- float time = iTime * SPEED;
-
- const float turn_rad = 0.25 / BLOCKS_BEFORE_TURN; //0 .. 0.5
- const float turn_abs_time = (PI/2.*turn_rad) * 1.5; //multiplier different than 1 means a slow down on turns
- const float turn_time = turn_abs_time / (1. - 2.*turn_rad + turn_abs_time); //0..1, but should be <= 0.5
-
- float level1_size = float(BLOCK_SIZE) * BLOCKS_BEFORE_TURN * XYCELL_SIZE;
- float level2_size = 4. * level1_size;
- float gap_size = float(BLOCK_GAP) * XYCELL_SIZE;
-
- vec3 ro = vec3(gap_size/2., gap_size/2., 0.);
- vec3 rd = vec3(uv.x, 2.0, uv.y);
-
- float tq = fract(time / (level2_size*4.) * WALK_SPEED); //the whole cycle time counter
- float t8 = fract(tq*4.); //time counter while walking on one of the four big sides
- float t1 = fract(t8*8.); //time counter while walking on one of the eight sides of the big side
-
- vec2 prev;
- vec2 dir;
- if (tq < 0.25) {
- prev = vec2(0.,0.);
- dir = vec2(0.,1.);
- } else if (tq < 0.5) {
- prev = vec2(0.,1.);
- dir = vec2(1.,0.);
- } else if (tq < 0.75) {
- prev = vec2(1.,1.);
- dir = vec2(0.,-1.);
- } else {
- prev = vec2(1.,0.);
- dir = vec2(-1.,0.);
- }
- float angle = floor(tq * 4.); //0..4 wich means 0..2*PI
-
- prev *= 4.;
-
- const float first_turn_look_angle = 0.4;
- const float second_turn_drift_angle = 0.5;
- const float fifth_turn_drift_angle = 0.25;
-
- vec2 turn;
- float turn_sign = 0.;
- vec2 dirL = rotate(dir, -PI/2.);
- vec2 dirR = -dirL;
- float up_down = 0.;
- float rotate_on_turns = 1.;
- float roll_on_turns = 1.;
- float add_angel = 0.;
- if (t8 < 0.125) {
- turn = dirL;
- //dir = dir;
- turn_sign = -1.;
- angle -= first_turn_look_angle * (max(0., t1 - (1. - turn_time*2.)) / turn_time - max(0., t1 - (1. - turn_time)) / turn_time * 2.5);
- roll_on_turns = 0.;
- } else if (t8 < 0.250) {
- prev += dir;
- turn = dir;
- dir = dirL;
- angle -= 1.;
- turn_sign = 1.;
- add_angel += first_turn_look_angle*0.5 + (-first_turn_look_angle*0.5+1.0+second_turn_drift_angle)*t1;
- rotate_on_turns = 0.;
- roll_on_turns = 0.;
- } else if (t8 < 0.375) {
- prev += dir + dirL;
- turn = dirR;
- //dir = dir;
- turn_sign = 1.;
- add_angel += second_turn_drift_angle*sqrt(1.-t1);
- //roll_on_turns = 0.;
- } else if (t8 < 0.5) {
- prev += dir + dir + dirL;
- turn = dirR;
- dir = dirR;
- angle += 1.;
- turn_sign = 0.;
- up_down = sin(t1*PI) * 0.37;
- } else if (t8 < 0.625) {
- prev += dir + dir;
- turn = dir;
- dir = dirR;
- angle += 1.;
- turn_sign = -1.;
- up_down = sin(-min(1., t1/(1.-turn_time))*PI) * 0.37;
- } else if (t8 < 0.750) {
- prev += dir + dir + dirR;
- turn = dirL;
- //dir = dir;
- turn_sign = -1.;
- add_angel -= (fifth_turn_drift_angle + 1.) * smoothstep1(t1);
- rotate_on_turns = 0.;
- roll_on_turns = 0.;
- } else if (t8 < 0.875) {
- prev += dir + dir + dir + dirR;
- turn = dir;
- dir = dirL;
- angle -= 1.;
- turn_sign = 1.;
- add_angel -= fifth_turn_drift_angle - smoothstep1(t1) * (fifth_turn_drift_angle * 2. + 1.);
- rotate_on_turns = 0.;
- roll_on_turns = 0.;
- } else {
- prev += dir + dir + dir;
- turn = dirR;
- //dir = dir;
- turn_sign = 1.;
- angle += fifth_turn_drift_angle * (1.5*min(1., (1.-t1)/turn_time) - 0.5*smoothstep1(1. - min(1.,t1/(1.-turn_time))));
- }
-
- if (iMouse.x > 10. || iMouse.y > 10.) {
- vec2 mouse = iMouse.xy / iResolution.xy * 2. - 1.;
- up_down = -0.7 * mouse.y;
- angle += mouse.x;
- rotate_on_turns = 1.;
- roll_on_turns = 0.;
- } else {
- angle += add_angel;
- }
-
- rd = rotateX(rd, up_down);
-
- vec2 p;
- if (turn_sign == 0.) {
- // move forward
- p = prev + dir * (turn_rad + 1. * t1);
- }
- else if (t1 > (1. - turn_time)) {
- // turn
- float tr = (t1 - (1. - turn_time)) / turn_time;
- vec2 c = prev + dir * (1. - turn_rad) + turn * turn_rad;
- p = c + turn_rad * rotate(dir, (tr - 1.) * turn_sign * PI/2.);
- angle += tr * turn_sign * rotate_on_turns;
- rd = rotateY(rd, sin(tr*turn_sign*PI) * 0.2 * roll_on_turns); //roll
- } else {
- // move forward
- t1 /= (1. - turn_time);
- p = prev + dir * (turn_rad + (1. - turn_rad*2.) * t1);
- }
-
- rd = rotateZ(rd, angle * PI/2.);
-
- ro.xy += level1_size * p;
-
- ro += rd * 0.2;
- rd = normalize(rd);
-
- // vec3 col = rain(ro, rd, time);
- vec3 col = rain(ro, rd, time) * 0.25;
-
- // Sample the terminal screen texture including alpha channel
- vec4 terminalColor = texture(iChannel0, uv);
-
- // Combine the matrix effect with the terminal color
- // vec3 blendedColor = terminalColor.rgb + col;
-
- // Make a mask that is 1.0 where the terminal content is not black
- float mask = 1.2 - step(0.5, dot(terminalColor.rgb, vec3(1.0)));
- vec3 blendedColor = mix(terminalColor.rgb * 1.2, col, mask);
-
- fragColor = vec4(blendedColor, terminalColor.a);
-}
diff --git a/ghostty/shaders/just-snow.glsl b/ghostty/shaders/just-snow.glsl
deleted file mode 100644
index c72b7fd..0000000
--- a/ghostty/shaders/just-snow.glsl
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright (c) 2013 Andrew Baldwin (twitter: baldand, www: http://thndl.com)
-// License = Attribution-NonCommercial-ShareAlike (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_US)
-
-// "Just snow"
-// Simple (but not cheap) snow made from multiple parallax layers with randomly positioned
-// flakes and directions. Also includes a DoF effect. Pan around with mouse.
-
-#define LIGHT_SNOW // Comment this out for a blizzard
-
-#ifdef LIGHT_SNOW
- #define LAYERS 50
- #define DEPTH .5
- #define WIDTH .3
- #define SPEED .6
-#else // BLIZZARD
- #define LAYERS 200
- #define DEPTH .1
- #define WIDTH .8
- #define SPEED 1.5
-#endif
-
-void mainImage( out vec4 fragColor, in vec2 fragCoord )
-{
- const mat3 p = mat3(13.323122,23.5112,21.71123,21.1212,28.7312,11.9312,21.8112,14.7212,61.3934);
- vec2 uv = fragCoord.xy / iResolution.xy;
-
- vec3 acc = vec3(0.0);
- float dof = 5.0 * sin(iTime * 0.1);
- for (int i = 0; i < LAYERS; i++) {
- float fi = float(i);
- vec2 q =-uv*(1.0 + fi * DEPTH);
- q += vec2(q.y * (WIDTH * mod(fi * 7.238917, 1.0) - WIDTH * 0.5), -SPEED * iTime / (1.0 + fi * DEPTH * 0.03));
- vec3 n = vec3(floor(q), 31.189 + fi);
- vec3 m = floor(n) * 0.00001 + fract(n);
- vec3 mp = (31415.9 + m) / fract(p * m);
- vec3 r = fract(mp);
- vec2 s = abs(mod(q, 1.0) - 0.5 + 0.9 * r.xy - 0.45);
- s += 0.01 * abs(2.0 * fract(10.0 * q.yx) - 1.0);
- float d = 0.6 * max(s.x - s.y, s.x + s.y) + max(s.x, s.y) - 0.01;
- float edge = 0.005 + 0.05 * min(0.5 * abs(fi - 5.0 - dof), 1.0);
- acc += vec3(smoothstep(edge, -edge, d) * (r.x / (1.0 + 0.02 * fi * DEPTH)));
- }
-
- // Sample the terminal screen texture including alpha channel
- vec4 terminalColor = texture(iChannel0, uv);
-
- // Combine the snow effect with the terminal color
- vec3 blendedColor = terminalColor.rgb + acc;
-
- // Use the terminal's original alpha
- fragColor = vec4(blendedColor, terminalColor.a);
-}
diff --git a/ghostty/shaders/matrix-hallway.glsl b/ghostty/shaders/matrix-hallway.glsl
deleted file mode 100644
index 2bbee86..0000000
--- a/ghostty/shaders/matrix-hallway.glsl
+++ /dev/null
@@ -1,40 +0,0 @@
-// based on the following Shader Toy entry
-//
-// [SH17A] Matrix rain. Created by Reinder Nijhoff 2017
-// Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
-// @reindernijhoff
-//
-// https://www.shadertoy.com/view/ldjBW1
-//
-
-#define SPEED_MULTIPLIER 1.
-#define GREEN_ALPHA .33
-
-#define BLACK_BLEND_THRESHOLD .4
-
-#define R fract(1e2 * sin(p.x * 8. + p.y))
-
-void mainImage(out vec4 fragColor, vec2 fragCoord) {
- vec3 v = vec3(fragCoord, 1) / iResolution - .5;
- // vec3 s = .5 / abs(v);
- // scale?
- vec3 s = .9 / abs(v);
- s.z = min(s.y, s.x);
- vec3 i = ceil( 8e2 * s.z * ( s.y < s.x ? v.xzz : v.zyz ) ) * .1;
- vec3 j = fract(i);
- i -= j;
- vec3 p = vec3(9, int(iTime * SPEED_MULTIPLIER * (9. + 8. * sin(i).x)), 0) + i;
- vec3 col = fragColor.rgb;
- col.g = R / s.z;
- p *= j;
- col *= (R >.5 && j.x < .6 && j.y < .8) ? GREEN_ALPHA : 0.;
-
- // Sample the terminal screen texture including alpha channel
- vec2 uv = fragCoord.xy / iResolution.xy;
- vec4 terminalColor = texture(iChannel0, uv);
-
- float alpha = step(length(terminalColor.rgb), BLACK_BLEND_THRESHOLD);
- vec3 blendedColor = mix(terminalColor.rgb * 1.2, col, alpha);
-
- fragColor = vec4(blendedColor, terminalColor.a);
-}
diff --git a/ghostty/shaders/mnoise.glsl b/ghostty/shaders/mnoise.glsl
deleted file mode 100644
index a414a46..0000000
--- a/ghostty/shaders/mnoise.glsl
+++ /dev/null
@@ -1,119 +0,0 @@
-vec3 mod289(vec3 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; }
-vec4 mod289(vec4 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; }
-vec4 permute(vec4 x) { return mod289(((x * 34.0) + 10.0) * x); }
-vec4 taylorInvSqrt(vec4 r) { return 1.79284291400159 - 0.85373472095314 * r; }
-float snoise(vec3 v) {
- const vec2 C = vec2(1.0 / 6.0, 1.0 / 3.0);
- const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);
-
- // First corner
- vec3 i = floor(v + dot(v, C.yyy));
- vec3 x0 = v - i + dot(i, C.xxx);
-
- // Other corners
- vec3 g = step(x0.yzx, x0.xyz);
- vec3 l = 1.0 - g;
- vec3 i1 = min(g.xyz, l.zxy);
- vec3 i2 = max(g.xyz, l.zxy);
-
- // x0 = x0 - 0.0 + 0.0 * C.xxx;
- // x1 = x0 - i1 + 1.0 * C.xxx;
- // x2 = x0 - i2 + 2.0 * C.xxx;
- // x3 = x0 - 1.0 + 3.0 * C.xxx;
- vec3 x1 = x0 - i1 + C.xxx;
- vec3 x2 = x0 - i2 + C.yyy; // 2.0*C.x = 1/3 = C.y
- vec3 x3 = x0 - D.yyy; // -1.0+3.0*C.x = -0.5 = -D.y
-
- // Permutations
- i = mod289(i);
- vec4 p = permute(permute(permute(i.z + vec4(0.0, i1.z, i2.z, 1.0)) + i.y +
- vec4(0.0, i1.y, i2.y, 1.0)) +
- i.x + vec4(0.0, i1.x, i2.x, 1.0));
-
- // Gradients: 7x7 points over a square, mapped onto an octahedron.
- // The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294)
- float n_ = 0.142857142857; // 1.0/7.0
- vec3 ns = n_ * D.wyz - D.xzx;
-
- vec4 j = p - 49.0 * floor(p * ns.z * ns.z); // mod(p,7*7)
-
- vec4 x_ = floor(j * ns.z);
- vec4 y_ = floor(j - 7.0 * x_); // mod(j,N)
-
- vec4 x = x_ * ns.x + ns.yyyy;
- vec4 y = y_ * ns.x + ns.yyyy;
- vec4 h = 1.0 - abs(x) - abs(y);
-
- vec4 b0 = vec4(x.xy, y.xy);
- vec4 b1 = vec4(x.zw, y.zw);
-
- // vec4 s0 = vec4(lessThan(b0,0.0))*2.0 - 1.0;
- // vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0;
- vec4 s0 = floor(b0) * 2.0 + 1.0;
- vec4 s1 = floor(b1) * 2.0 + 1.0;
- vec4 sh = -step(h, vec4(0.0));
-
- vec4 a0 = b0.xzyw + s0.xzyw * sh.xxyy;
- vec4 a1 = b1.xzyw + s1.xzyw * sh.zzww;
-
- vec3 p0 = vec3(a0.xy, h.x);
- vec3 p1 = vec3(a0.zw, h.y);
- vec3 p2 = vec3(a1.xy, h.z);
- vec3 p3 = vec3(a1.zw, h.w);
-
- // Normalise gradients
- vec4 norm =
- taylorInvSqrt(vec4(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3)));
- p0 *= norm.x;
- p1 *= norm.y;
- p2 *= norm.z;
- p3 *= norm.w;
-
- // Mix final noise value
- vec4 m =
- max(0.5 - vec4(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), 0.0);
- m = m * m;
- return 105.0 *
- dot(m * m, vec4(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3)));
-}
-
-float noise2D(vec2 uv) {
- uvec2 pos = uvec2(floor(uv * 1000.));
- return float((pos.x * 68657387u ^ pos.y * 361524851u + pos.x) % 890129u) *
- (1.0 / 890128.0);
-}
-
-float roundRectSDF(vec2 center, vec2 size, float radius) {
- return length(max(abs(center) - size + radius, 0.)) - radius;
-}
-
-void mainImage(out vec4 fragColor, in vec2 fragCoord) {
- vec2 uv = fragCoord / iResolution.xy, sd = vec2(2.), sdh = vec2(1.);
- vec4 ghosttyCol = texture(iChannel0, uv);
- float ratio = iResolution.y / iResolution.x,
- fw = max(fwidth(uv.x), fwidth(uv.y));
-
- vec2 puv = floor(uv * vec2(60., 60. * ratio)) / 60.;
- puv +=
- (smoothstep(0., 0.7, noise2D(puv)) - 0.5) * 0.05 - vec2(0., iTime * 0.08);
-
- uv = fract(vec2(uv.x, uv.y * ratio) * 10.);
- float d = roundRectSDF((sd + 0.01) * (uv - .5), sdh, 0.075),
- d2 = roundRectSDF((sd + 0.065) * (fract(uv * 6.) - .5), sdh, 0.2),
- noiseTime = iTime * 0.03, noise = snoise(vec3(puv, noiseTime));
-
- noise += snoise(vec3(puv * 1.1, noiseTime + 0.5)) + .1;
- noise += snoise(vec3(puv * 2., noiseTime + 0.8));
- noise = pow(noise, 2.);
-
- vec3 col1 = vec3(0.), col2 = vec3(0.), col3 = vec3(0.07898),
- col4 = vec3(0.089184),
- fcol = mix(mix(mix(col1, col3, smoothstep(0.0, 0.3, noise)), col2,
- smoothstep(0.0, 0.5, noise)),
- col4, smoothstep(0.0, 1.0, noise));
-
- fragColor = vec4(
- ghosttyCol.rgb +
- mix(col4, fcol, smoothstep(fw, -fw, d) * smoothstep(fw, -fw, d2)),
- ghosttyCol.a);
-}
diff --git a/ghostty/shaders/negative.glsl b/ghostty/shaders/negative.glsl
deleted file mode 100644
index 48101f6..0000000
--- a/ghostty/shaders/negative.glsl
+++ /dev/null
@@ -1,8 +0,0 @@
-
-void mainImage( out vec4 fragColor, in vec2 fragCoord )
-{
- vec2 uv = fragCoord/iResolution.xy;
- vec4 color = texture(iChannel0, uv);
- fragColor = vec4(1.0 - color.x, 1.0 - color.y, 1.0 - color.z, color.w);
-}
-
diff --git a/ghostty/shaders/retro-terminal.glsl b/ghostty/shaders/retro-terminal.glsl
deleted file mode 100644
index c5f315a..0000000
--- a/ghostty/shaders/retro-terminal.glsl
+++ /dev/null
@@ -1,34 +0,0 @@
-// Original shader collected from: https://www.shadertoy.com/view/WsVSzV
-// Licensed under Shadertoy's default since the original creator didn't provide any license. (CC BY NC SA 3.0)
-// Slight modifications were made to give a green-ish effect.
-
-float warp = 0.25; // simulate curvature of CRT monitor
-float scan = 0.50; // simulate darkness between scanlines
-
-void mainImage(out vec4 fragColor, in vec2 fragCoord)
-{
- // squared distance from center
- vec2 uv = fragCoord / iResolution.xy;
- vec2 dc = abs(0.5 - uv);
- dc *= dc;
-
- // warp the fragment coordinates
- uv.x -= 0.5; uv.x *= 1.0 + (dc.y * (0.3 * warp)); uv.x += 0.5;
- uv.y -= 0.5; uv.y *= 1.0 + (dc.x * (0.4 * warp)); uv.y += 0.5;
-
- // sample inside boundaries, otherwise set to black
- if (uv.y > 1.0 || uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0)
- fragColor = vec4(0.0, 0.0, 0.0, 1.0);
- else
- {
- // determine if we are drawing in a scanline
- float apply = abs(sin(fragCoord.y) * 0.5 * scan);
-
- // sample the texture and apply a teal tint
- vec3 color = texture(iChannel0, uv).rgb;
- vec3 tealTint = vec3(0.0, 0.8, 0.6); // teal color (slightly more green than blue)
-
- // mix the sampled color with the teal tint based on scanline intensity
- fragColor = vec4(mix(color * tealTint, vec3(0.0), apply), 1.0);
- }
-}
diff --git a/ghostty/shaders/sin-interference.glsl b/ghostty/shaders/sin-interference.glsl
deleted file mode 100644
index a1b9a40..0000000
--- a/ghostty/shaders/sin-interference.glsl
+++ /dev/null
@@ -1,28 +0,0 @@
-// Based on https://www.shadertoy.com/view/ms3cWn
-float map(float value, float min1, float max1, float min2, float max2) {
- return min2 + (value - min1) * (max2 - min2) / (max1 - min1);
-}
-
-void mainImage( out vec4 fragColor, in vec2 fragCoord )
-{
- vec2 uv = fragCoord / iResolution.xy;
- float d = length(uv - 0.5) * 2.0;
- float t = d * d * 25.0 - iTime * 2.0;
- vec3 col = 0.5 + 0.5 * cos(t / 20.0 + uv.xyx + vec3(0.0,2.0,4.0));
-
- vec2 center = iResolution.xy * 0.5;
- float distCentre = distance(fragCoord.xy, center);
- float dCSin = sin(distCentre * 0.05);
-
- vec2 anim = vec2(map(sin(iTime),-1.0,1.0,0.0,iResolution.x),map(sin(iTime*1.25),-1.0,1.0,0.0,iResolution.y));
- float distMouse = distance(fragCoord.xy, anim);
- float dMSin = sin(distMouse * 0.05);
-
- float greycol = (((dMSin * dCSin) + 1.0) * 0.5);
- greycol = greycol * map(d, 0.0, 1.4142135623730951, 0.5, 0.0);
-
- vec4 terminalColor = texture(iChannel0, uv);
- vec3 blendedColor = mix(terminalColor.rgb, vec3(greycol * col.x, greycol * col.y, greycol * col.z), 0.25);
-
- fragColor = vec4(blendedColor, terminalColor.a);
-}
diff --git a/ghostty/shaders/smoke-and-ghost.glsl b/ghostty/shaders/smoke-and-ghost.glsl
deleted file mode 100644
index a11f8dc..0000000
--- a/ghostty/shaders/smoke-and-ghost.glsl
+++ /dev/null
@@ -1,193 +0,0 @@
-// Settings for detection
-#define TARGET_COLOR vec3(0.0, 0.0, 0.0) // RGB target pixels to transform
-#define REPLACE_COLOR vec3(0.0, 0.0, 0.0) // Color to replace target pixels
-#define COLOR_TOLERANCE 0.001 // Color matching tolerance
-
-// Smoke effect settings
-#define SMOKE_COLOR vec3(1., 1., 1.0) // Base color of smoke
-#define SMOKE_RADIUS 0.011 // How far the smoke spreads
-#define SMOKE_SPEED 0.5 // Speed of smoke movement
-#define SMOKE_SCALE 25.0 // Scale of smoke detail
-#define SMOKE_INTENSITY 0.2 // Intensity of the smoke effect
-#define SMOKE_RISE_HEIGHT 0.14 // How high the smoke rises
-#define ALPHA_MAX 0.5 // Maximum opacity for smoke
-#define VERTICAL_BIAS 1.0
-
-// Ghost face settings
-#define FACE_COUNT 1 // Number of ghost faces
-#define FACE_SCALE vec2(0.03, 0.05) // Size of faces, can be wider/elongated
-#define FACE_DURATION 1.2 // How long faces last, can be wider/elongated
-#define FACE_TRANSITION 1.5 // Face fade in/out duration
-#define FACE_COLOR vec3(0.0, 0.0, 0.0)
-#define GHOST_BG_COLOR vec3(1.0, 1.0, 1.0)
-#define GHOST_BG_SCALE vec2(0.03, 0.06)
-
-float random(vec2 st) {
- return fract(sin(dot(st.xy, vec2(12.9898,78.233))) * 43758.5453123);
-}
-
-float random1(float n) {
- return fract(sin(n) * 43758.5453123);
-}
-
-vec2 random2(float n) {
- return vec2(
- random1(n),
- random1(n + 1234.5678)
- );
-}
-
-float noise(vec2 st) {
- vec2 i = floor(st);
- vec2 f = fract(st);
-
- float a = random(i);
- float b = random(i + vec2(1.0, 0.0));
- float c = random(i + vec2(0.0, 1.0));
- float d = random(i + vec2(1.0, 1.0));
-
- vec2 u = f * f * (3.0 - 2.0 * f);
- return mix(a, b, u.x) + (c - a)* u.y * (1.0 - u.x) + (d - b) * u.x * u.y;
-}
-
-// Modified elongated ellipse for more cartoon-like shapes
-float cartoonEllipse(vec2 uv, vec2 center, vec2 scale) {
- vec2 d = (uv - center) / scale;
- float len = length(d);
- // Add cartoon-like falloff
- return smoothstep(1.0, 0.8, len);
-}
-
-// Function to create ghost background shape
-float ghostBackground(vec2 uv, vec2 center) {
- vec2 d = (uv - center) / GHOST_BG_SCALE;
- float baseShape = length(d * vec2(1.0, 0.8)); // Slightly oval
-
- // Add wavy bottom
- float wave = sin(d.x * 6.28 + iTime) * 0.2;
- float bottomWave = smoothstep(0.0, -0.5, d.y + wave);
-
- return smoothstep(1.0, 0.8, baseShape) + bottomWave;
-}
-
-float ghostFace(vec2 uv, vec2 center, float time, float seed) {
- vec2 faceUV = (uv - center) / FACE_SCALE;
-
- float eyeSize = 0.25 + random1(seed) * 0.05;
- float eyeSpacing = 0.35;
- vec2 leftEyePos = vec2(-eyeSpacing, 0.2);
- vec2 rightEyePos = vec2(eyeSpacing, 0.2);
-
- float leftEye = cartoonEllipse(faceUV, leftEyePos, vec2(eyeSize));
- float rightEye = cartoonEllipse(faceUV, rightEyePos, vec2(eyeSize));
-
- // Add simple eye highlights
- float leftHighlight = cartoonEllipse(faceUV, leftEyePos + vec2(0.1, 0.1), vec2(eyeSize * 0.3));
- float rightHighlight = cartoonEllipse(faceUV, rightEyePos + vec2(0.1, 0.1), vec2(eyeSize * 0.3));
-
- vec2 mouthUV = faceUV - vec2(0.0, -0.9);
- float mouthWidth = 0.5 + random1(seed + 3.0) * 0.1;
- float mouthHeight = 0.8 + random1(seed + 7.0) * 0.1;
-
- float mouth = cartoonEllipse(mouthUV, vec2(0.0), vec2(mouthWidth, mouthHeight));
-
- // Combine features
- float face = max(max(leftEye, rightEye), mouth);
- face = max(face, max(leftHighlight, rightHighlight));
-
- // Add border falloff
- face *= smoothstep(1.2, 0.8, length(faceUV));
-
- return face;
-}
-
-float calculateSmoke(vec2 uv, vec2 sourcePos) {
- float verticalDisp = (uv.y - sourcePos.y) * VERTICAL_BIAS;
- vec2 smokeUV = uv * SMOKE_SCALE;
- smokeUV.y -= iTime * SMOKE_SPEED * (1.0 + verticalDisp);
- smokeUV.x += sin(iTime * 0.5 + uv.y * 4.0) * 0.1;
-
- float n = noise(smokeUV) * 0.5 + 0.5;
- n += noise(smokeUV * 2.0 + iTime * 0.1) * 0.25;
-
- float verticalFalloff = 1.0 - smoothstep(0.0, SMOKE_RISE_HEIGHT, verticalDisp);
- return n * verticalFalloff;
-}
-
-float isTargetPixel(vec2 uv) {
- vec4 color = texture(iChannel0, uv);
- return float(all(lessThan(abs(color.rgb - TARGET_COLOR), vec3(COLOR_TOLERANCE))));
-}
-
-void mainImage(out vec4 fragColor, in vec2 fragCoord) {
- vec2 uv = fragCoord/iResolution.xy;
- vec4 originalColor = texture(iChannel0, uv);
-
- // Calculate smoke effect
- float smokeAccum = 0.0;
- float targetInfluence = 0.0;
-
- float stepSize = SMOKE_RADIUS / 4.0;
- for (float x = -SMOKE_RADIUS; x <= SMOKE_RADIUS; x += stepSize) {
- for (float y = -SMOKE_RADIUS; y <= 0.0; y += stepSize) {
- vec2 offset = vec2(x, y);
- vec2 sampleUV = uv + offset;
-
- if (sampleUV.x >= 0.0 && sampleUV.x <= 1.0 &&
- sampleUV.y >= 0.0 && sampleUV.y <= 1.0) {
- float isTarget = isTargetPixel(sampleUV);
- if (isTarget > 0.0) {
- float dist = length(offset);
- float falloff = 1.0 - smoothstep(0.0, SMOKE_RADIUS, dist);
- float smoke = calculateSmoke(uv, sampleUV);
- smokeAccum += smoke * falloff;
- targetInfluence += falloff;
- }
- }
- }
- }
-
- smokeAccum /= max(targetInfluence, 1.0);
- targetInfluence = smoothstep(0.0, 1.0, targetInfluence);
- float smokePresence = smokeAccum * targetInfluence;
-
- // Calculate ghost faces with backgrounds
- float faceAccum = 0.0;
- float bgAccum = 0.0;
- float timeBlock = floor(iTime / FACE_DURATION);
-
- if (smokePresence > 0.2) {
- for (int i = 0; i < FACE_COUNT; i++) {
- vec2 facePos = random2(timeBlock + float(i) * 1234.5);
- facePos = facePos * 0.8 + 0.1;
-
- float faceTime = mod(iTime, FACE_DURATION);
- float fadeFactor = smoothstep(0.0, FACE_TRANSITION, faceTime) *
- (1.0 - smoothstep(FACE_DURATION - FACE_TRANSITION, FACE_DURATION, faceTime));
-
- // Add ghost background
- float ghostBg = ghostBackground(uv, facePos) * fadeFactor;
- bgAccum = max(bgAccum, ghostBg);
-
- // Add face features
- float face = ghostFace(uv, facePos, iTime, timeBlock + float(i) * 100.0) * fadeFactor;
- faceAccum = max(faceAccum, face);
- }
-
- bgAccum *= smoothstep(0.2, 0.4, smokePresence);
- faceAccum *= smoothstep(0.2, 0.4, smokePresence);
- }
-
- // Combine all elements
- bool isTarget = all(lessThan(abs(originalColor.rgb - TARGET_COLOR), vec3(COLOR_TOLERANCE)));
- vec3 baseColor = isTarget ? REPLACE_COLOR : originalColor.rgb;
-
- // Layer the effects: base -> smoke -> ghost background -> face features
- vec3 smokeEffect = mix(baseColor, SMOKE_COLOR, smokeAccum * SMOKE_INTENSITY * targetInfluence * (1.0 - faceAccum));
- vec3 withBackground = mix(smokeEffect, GHOST_BG_COLOR, bgAccum * 0.7);
- vec3 finalColor = mix(withBackground, FACE_COLOR, faceAccum);
-
- float alpha = mix(originalColor.a, ALPHA_MAX, max(smokePresence, max(bgAccum, faceAccum) * smokePresence));
-
- fragColor = vec4(finalColor, alpha);
-}
diff --git a/ghostty/shaders/sparks-from-fire.glsl b/ghostty/shaders/sparks-from-fire.glsl
deleted file mode 100644
index 4adb791..0000000
--- a/ghostty/shaders/sparks-from-fire.glsl
+++ /dev/null
@@ -1,242 +0,0 @@
-// adapted by Alex Sherwin for Ghstty from https://www.shadertoy.com/view/wl2Gzc
-
-//Shader License: CC BY 3.0
-//Author: Jan Mróz (jaszunio15)
-
-#define SMOKE_INTENSITY_MULTIPLIER 0.9
-#define PARTICLES_ALPHA_MOD 0.9
-#define SMOKE_ALPHA_MOD 0.5
-#define LAYERS_COUNT 8
-
-#define BLACK_BLEND_THRESHOLD .4
-
-#define VEC3_1 (vec3(1.0))
-
-#define PI 3.1415927
-#define TWO_PI 6.283185
-
-#define ANIMATION_SPEED 1.0
-#define MOVEMENT_SPEED .33
-#define MOVEMENT_DIRECTION vec2(0.7, 1.0)
-
-#define PARTICLE_SIZE 0.0025
-
-#define PARTICLE_SCALE (vec2(0.5, 1.6))
-#define PARTICLE_SCALE_VAR (vec2(0.25, 0.2))
-
-#define PARTICLE_BLOOM_SCALE (vec2(0.5, 0.8))
-#define PARTICLE_BLOOM_SCALE_VAR (vec2(0.3, 0.1))
-
-#define SPARK_COLOR vec3(1.0, 0.4, 0.05) * 1.5
-#define BLOOM_COLOR vec3(1.0, 0.4, 0.05) * 0.8
-#define SMOKE_COLOR vec3(1.0, 0.43, 0.1) * 0.8
-
-#define SIZE_MOD 1.05
-
-
-float hash1_2(in vec2 x)
-{
- return fract(sin(dot(x, vec2(52.127, 61.2871))) * 521.582);
-}
-
-vec2 hash2_2(in vec2 x)
-{
- return fract(sin(x * mat2x2(20.52, 24.1994, 70.291, 80.171)) * 492.194);
-}
-
-//Simple interpolated noise
-vec2 noise2_2(vec2 uv)
-{
- //vec2 f = fract(uv);
- vec2 f = smoothstep(0.0, 1.0, fract(uv));
-
- vec2 uv00 = floor(uv);
- vec2 uv01 = uv00 + vec2(0,1);
- vec2 uv10 = uv00 + vec2(1,0);
- vec2 uv11 = uv00 + 1.0;
- vec2 v00 = hash2_2(uv00);
- vec2 v01 = hash2_2(uv01);
- vec2 v10 = hash2_2(uv10);
- vec2 v11 = hash2_2(uv11);
-
- vec2 v0 = mix(v00, v01, f.y);
- vec2 v1 = mix(v10, v11, f.y);
- vec2 v = mix(v0, v1, f.x);
-
- return v;
-}
-
-//Simple interpolated noise
-float noise1_2(in vec2 uv)
-{
- // vec2 f = fract(uv);
- vec2 f = smoothstep(0.0, 1.0, fract(uv));
-
- vec2 uv00 = floor(uv);
- vec2 uv01 = uv00 + vec2(0,1);
- vec2 uv10 = uv00 + vec2(1,0);
- vec2 uv11 = uv00 + 1.0;
-
- float v00 = hash1_2(uv00);
- float v01 = hash1_2(uv01);
- float v10 = hash1_2(uv10);
- float v11 = hash1_2(uv11);
-
- float v0 = mix(v00, v01, f.y);
- float v1 = mix(v10, v11, f.y);
- float v = mix(v0, v1, f.x);
-
- return v;
-}
-
-
-float layeredNoise1_2(in vec2 uv, in float sizeMod, in float alphaMod, in int layers, in float animation)
-{
- float noise = 0.0;
- float alpha = 1.0;
- float size = 1.0;
- vec2 offset;
- for (int i = 0; i < layers; i++)
- {
- offset += hash2_2(vec2(alpha, size)) * 10.0;
-
- //Adding noise with movement
- noise += noise1_2(uv * size + iTime * animation * 8.0 * MOVEMENT_DIRECTION * MOVEMENT_SPEED + offset) * alpha;
- alpha *= alphaMod;
- size *= sizeMod;
- }
-
- noise *= (1.0 - alphaMod)/(1.0 - pow(alphaMod, float(layers)));
- return noise;
-}
-
-//Rotates point around 0,0
-vec2 rotate(in vec2 point, in float deg)
-{
- float s = sin(deg);
- float c = cos(deg);
- return mat2x2(s, c, -c, s) * point;
-}
-
-//Cell center from point on the grid
-vec2 voronoiPointFromRoot(in vec2 root, in float deg)
-{
- vec2 point = hash2_2(root) - 0.5;
- float s = sin(deg);
- float c = cos(deg);
- point = mat2x2(s, c, -c, s) * point * 0.66;
- point += root + 0.5;
- return point;
-}
-
-//Voronoi cell point rotation degrees
-float degFromRootUV(in vec2 uv)
-{
- return iTime * ANIMATION_SPEED * (hash1_2(uv) - 0.5) * 2.0;
-}
-
-vec2 randomAround2_2(in vec2 point, in vec2 range, in vec2 uv)
-{
- return point + (hash2_2(uv) - 0.5) * range;
-}
-
-
-vec3 fireParticles(in vec2 uv, in vec2 originalUV)
-{
- vec3 particles = vec3(0.0);
- vec2 rootUV = floor(uv);
- float deg = degFromRootUV(rootUV);
- vec2 pointUV = voronoiPointFromRoot(rootUV, deg);
- float dist = 2.0;
- float distBloom = 0.0;
-
- //UV manipulation for the faster particle movement
- vec2 tempUV = uv + (noise2_2(uv * 2.0) - 0.5) * 0.1;
- tempUV += -(noise2_2(uv * 3.0 + iTime) - 0.5) * 0.07;
-
- //Sparks sdf
- dist = length(rotate(tempUV - pointUV, 0.7) * randomAround2_2(PARTICLE_SCALE, PARTICLE_SCALE_VAR, rootUV));
-
- //Bloom sdf
- distBloom = length(rotate(tempUV - pointUV, 0.7) * randomAround2_2(PARTICLE_BLOOM_SCALE, PARTICLE_BLOOM_SCALE_VAR, rootUV));
-
- //Add sparks
- particles += (1.0 - smoothstep(PARTICLE_SIZE * 0.6, PARTICLE_SIZE * 3.0, dist)) * SPARK_COLOR;
-
- //Add bloom
- particles += pow((1.0 - smoothstep(0.0, PARTICLE_SIZE * 6.0, distBloom)) * 1.0, 3.0) * BLOOM_COLOR;
-
- //Upper disappear curve randomization
- float border = (hash1_2(rootUV) - 0.5) * 2.0;
- float disappear = 1.0 - smoothstep(border, border + 0.5, originalUV.y);
-
- //Lower appear curve randomization
- border = (hash1_2(rootUV + 0.214) - 1.8) * 0.7;
- float appear = smoothstep(border, border + 0.4, originalUV.y);
-
- return particles * disappear * appear;
-}
-
-
-//Layering particles to imitate 3D view
-vec3 layeredParticles(in vec2 uv, in float sizeMod, in float alphaMod, in int layers, in float smoke)
-{
- vec3 particles = vec3(0);
- float size = 1.0;
- // float alpha = 1.0;
- float alpha = 1.0;
- vec2 offset = vec2(0.0);
- vec2 noiseOffset;
- vec2 bokehUV;
-
- for (int i = 0; i < layers; i++)
- {
- //Particle noise movement
- noiseOffset = (noise2_2(uv * size * 2.0 + 0.5) - 0.5) * 0.15;
-
- //UV with applied movement
- bokehUV = (uv * size + iTime * MOVEMENT_DIRECTION * MOVEMENT_SPEED) + offset + noiseOffset;
-
- //Adding particles if there is more smoke, remove smaller particles
- particles += fireParticles(bokehUV, uv) * alpha * (1.0 - smoothstep(0.0, 1.0, smoke) * (float(i) / float(layers)));
-
- //Moving uv origin to avoid generating the same particles
- offset += hash2_2(vec2(alpha, alpha)) * 10.0;
-
- alpha *= alphaMod;
- size *= sizeMod;
- }
-
- return particles;
-}
-
-void mainImage(out vec4 fragColor, in vec2 fragCoord) {
- vec2 uv = (2.0 * fragCoord - iResolution.xy) / iResolution.x;
-
- // float vignette = 1.1 - smoothstep(0.4, 1.4, length(uv + vec2(0.0, 0.3)));
- float vignette = 1.3 - smoothstep(0.4, 1.4, length(uv + vec2(0.0, 0.3)));
-
- uv *= 2.5;
-
- float smokeIntensity = layeredNoise1_2(uv * 10.0 + iTime * 4.0 * MOVEMENT_DIRECTION * MOVEMENT_SPEED, 1.7, 0.7, 6, 0.2);
- smokeIntensity *= pow(smoothstep(-1.0, 1.6, uv.y), 2.0);
- vec3 smoke = smokeIntensity * SMOKE_COLOR * vignette * SMOKE_INTENSITY_MULTIPLIER * SMOKE_ALPHA_MOD;
-
- //Cutting holes in smoke
- smoke *= pow(layeredNoise1_2(uv * 4.0 + iTime * 0.5 * MOVEMENT_DIRECTION * MOVEMENT_SPEED, 1.8, 0.5, 3, 0.2), 2.0) * 1.5;
-
- vec3 particles = layeredParticles(uv, SIZE_MOD, PARTICLES_ALPHA_MOD, LAYERS_COUNT, smokeIntensity);
-
- vec3 col = particles + smoke + SMOKE_COLOR * 0.02;
- col *= vignette;
-
- col = smoothstep(-0.08, 1.0, col);
-
- vec2 termUV = fragCoord.xy / iResolution.xy;
- vec4 terminalColor = texture(iChannel0, termUV);
-
- float alpha = step(length(terminalColor.rgb), BLACK_BLEND_THRESHOLD);
- vec3 blendedColor = mix(terminalColor.rgb, col, alpha);
-
- fragColor = vec4(blendedColor, terminalColor.a);
-}
diff --git a/ghostty/shaders/spotlight.glsl b/ghostty/shaders/spotlight.glsl
deleted file mode 100644
index 19f457a..0000000
--- a/ghostty/shaders/spotlight.glsl
+++ /dev/null
@@ -1,42 +0,0 @@
-// Created by Paul Robello
-
-
-// Smooth oscillating function that varies over time
-float smoothOscillation(float t, float frequency, float phase) {
- return sin(t * frequency + phase);
-}
-
-void mainImage(out vec4 fragColor, in vec2 fragCoord) {
- // Resolution and UV coordinates
- vec2 uv = fragCoord.xy / iResolution.xy;
-
- // Used to fix distortion when calculating distance to circle center
- vec2 ratio = vec2(iResolution.x / iResolution.y, 1.0);
-
- // Get the texture from iChannel0
- vec4 texColor = texture(iChannel0, uv);
-
- // Spotlight center moving based on a smooth random pattern
- float time = iTime * 1.0; // Control speed of motion
- vec2 spotlightCenter = vec2(
- 0.5 + 0.4 * smoothOscillation(time, 1.0, 0.0), // Smooth X motion
- 0.5 + 0.4 * smoothOscillation(time, 1.3, 3.14159) // Smooth Y motion with different frequency and phase
- );
-
- // Distance from the spotlight center
- float distanceToCenter = distance(uv * ratio, spotlightCenter);
-
- // Spotlight intensity based on distance
- float spotlightRadius = 0.25; // Spotlight radius
- float softness = 20.0; // Spotlight edge softness. Higher values have sharper edge
- float spotlightIntensity = smoothstep(spotlightRadius, spotlightRadius - (1.0 / softness), distanceToCenter);
-
- // Ambient light level
- float ambientLight = 0.5; // Controls the minimum brightness across the texture
-
- // Combine the spotlight effect with the texture
- vec3 spotlightEffect = texColor.rgb * mix(vec3(ambientLight), vec3(1.0), spotlightIntensity);
-
- // Final color output
- fragColor = vec4(spotlightEffect, texColor.a);
-}
\ No newline at end of file
diff --git a/ghostty/shaders/starfield-colors.glsl b/ghostty/shaders/starfield-colors.glsl
deleted file mode 100644
index d4e0d14..0000000
--- a/ghostty/shaders/starfield-colors.glsl
+++ /dev/null
@@ -1,158 +0,0 @@
-// transparent background
-const bool transparent = false;
-
-// terminal contents luminance threshold to be considered background (0.0 to 1.0)
-const float threshold = 0.15;
-
-// divisions of grid
-const float repeats = 30.;
-
-// number of layers
-const float layers = 21.;
-
-// star colours
-const vec3 blue = vec3(51., 64., 195.) / 255.;
-const vec3 cyan = vec3(117., 250., 254.) / 255.;
-const vec3 white = vec3(255., 255., 255.) / 255.;
-const vec3 yellow = vec3(251., 245., 44.) / 255.;
-const vec3 red = vec3(247, 2., 20.) / 255.;
-
-float luminance(vec3 color) {
- return dot(color, vec3(0.2126, 0.7152, 0.0722));
-}
-
-// spectrum function
-vec3 spectrum(vec2 pos) {
- pos.x *= 4.;
- vec3 outCol = vec3(0);
- if (pos.x > 0.) {
- outCol = mix(blue, cyan, fract(pos.x));
- }
- if (pos.x > 1.) {
- outCol = mix(cyan, white, fract(pos.x));
- }
- if (pos.x > 2.) {
- outCol = mix(white, yellow, fract(pos.x));
- }
- if (pos.x > 3.) {
- outCol = mix(yellow, red, fract(pos.x));
- }
-
- return 1. - (pos.y * (1. - outCol));
-}
-
-float N21(vec2 p) {
- p = fract(p * vec2(233.34, 851.73));
- p += dot(p, p + 23.45);
- return fract(p.x * p.y);
-}
-
-vec2 N22(vec2 p) {
- float n = N21(p);
- return vec2(n, N21(p + n));
-}
-
-mat2 scale(vec2 _scale) {
- return mat2(_scale.x, 0.0,
- 0.0, _scale.y);
-}
-
-// 2D Noise based on Morgan McGuire
-float noise(in vec2 st) {
- vec2 i = floor(st);
- vec2 f = fract(st);
-
- // Four corners in 2D of a tile
- float a = N21(i);
- float b = N21(i + vec2(1.0, 0.0));
- float c = N21(i + vec2(0.0, 1.0));
- float d = N21(i + vec2(1.0, 1.0));
-
- // Smooth Interpolation
- vec2 u = f * f * (3.0 - 2.0 * f); // Cubic Hermite Curve
-
- // Mix 4 corners percentages
- return mix(a, b, u.x) +
- (c - a) * u.y * (1.0 - u.x) +
- (d - b) * u.x * u.y;
-}
-
-float perlin2(vec2 uv, int octaves, float pscale) {
- float col = 1.;
- float initScale = 4.;
- for (int l; l < octaves; l++) {
- float val = noise(uv * initScale);
- if (col <= 0.01) {
- col = 0.;
- break;
- }
- val -= 0.01;
- val *= 0.5;
- col *= val;
- initScale *= pscale;
- }
- return col;
-}
-
-vec3 stars(vec2 uv, float offset) {
- float timeScale = -(iTime + offset) / layers;
- float trans = fract(timeScale);
- float newRnd = floor(timeScale);
- vec3 col = vec3(0.);
-
- // Translate uv then scale for center
- uv -= vec2(0.5);
- uv = scale(vec2(trans)) * uv;
- uv += vec2(0.5);
-
- // Create square aspect ratio
- uv.x *= iResolution.x / iResolution.y;
-
- // Create boxes
- uv *= repeats;
-
- // Get position
- vec2 ipos = floor(uv);
-
- // Return uv as 0 to 1
- uv = fract(uv);
-
- // Calculate random xy and size
- vec2 rndXY = N22(newRnd + ipos * (offset + 1.)) * 0.9 + 0.05;
- float rndSize = N21(ipos) * 100. + 200.;
-
- vec2 j = (rndXY - uv) * rndSize;
- float sparkle = 1. / dot(j, j);
-
- // Set stars to be pure white
- col += spectrum(fract(rndXY * newRnd * ipos)) * vec3(sparkle);
-
- col *= smoothstep(1., 0.8, trans);
- return col; // Return pure white stars only
-}
-
-void mainImage(out vec4 fragColor, in vec2 fragCoord)
-{
- // Normalized pixel coordinates (from 0 to 1)
- vec2 uv = fragCoord / iResolution.xy;
-
- vec3 col = vec3(0.);
-
- for (float i = 0.; i < layers; i++) {
- col += stars(uv, i);
- }
-
- // Sample the terminal screen texture including alpha channel
- vec4 terminalColor = texture(iChannel0, uv);
-
- if (transparent) {
- col += terminalColor.rgb;
- }
-
- // Make a mask that is 1.0 where the terminal content is not black
- float mask = 1 - step(threshold, luminance(terminalColor.rgb));
- vec3 blendedColor = mix(terminalColor.rgb, col, mask);
-
- // Apply terminal's alpha to control overall opacity
- fragColor = vec4(blendedColor, terminalColor.a);
-}
diff --git a/ghostty/shaders/starfield.glsl b/ghostty/shaders/starfield.glsl
deleted file mode 100644
index f82b5d3..0000000
--- a/ghostty/shaders/starfield.glsl
+++ /dev/null
@@ -1,135 +0,0 @@
-// transparent background
-const bool transparent = false;
-
-// terminal contents luminance threshold to be considered background (0.0 to 1.0)
-const float threshold = 0.15;
-
-// divisions of grid
-const float repeats = 30.;
-
-// number of layers
-const float layers = 21.;
-
-// star colors
-const vec3 white = vec3(1.0); // Set star color to pure white
-
-float luminance(vec3 color) {
- return dot(color, vec3(0.2126, 0.7152, 0.0722));
-}
-
-float N21(vec2 p) {
- p = fract(p * vec2(233.34, 851.73));
- p += dot(p, p + 23.45);
- return fract(p.x * p.y);
-}
-
-vec2 N22(vec2 p) {
- float n = N21(p);
- return vec2(n, N21(p + n));
-}
-
-mat2 scale(vec2 _scale) {
- return mat2(_scale.x, 0.0,
- 0.0, _scale.y);
-}
-
-// 2D Noise based on Morgan McGuire
-float noise(in vec2 st) {
- vec2 i = floor(st);
- vec2 f = fract(st);
-
- // Four corners in 2D of a tile
- float a = N21(i);
- float b = N21(i + vec2(1.0, 0.0));
- float c = N21(i + vec2(0.0, 1.0));
- float d = N21(i + vec2(1.0, 1.0));
-
- // Smooth Interpolation
- vec2 u = f * f * (3.0 - 2.0 * f); // Cubic Hermite Curve
-
- // Mix 4 corners percentages
- return mix(a, b, u.x) +
- (c - a) * u.y * (1.0 - u.x) +
- (d - b) * u.x * u.y;
-}
-
-float perlin2(vec2 uv, int octaves, float pscale) {
- float col = 1.;
- float initScale = 4.;
- for (int l; l < octaves; l++) {
- float val = noise(uv * initScale);
- if (col <= 0.01) {
- col = 0.;
- break;
- }
- val -= 0.01;
- val *= 0.5;
- col *= val;
- initScale *= pscale;
- }
- return col;
-}
-
-vec3 stars(vec2 uv, float offset) {
- float timeScale = -(iTime + offset) / layers;
- float trans = fract(timeScale);
- float newRnd = floor(timeScale);
- vec3 col = vec3(0.);
-
- // Translate uv then scale for center
- uv -= vec2(0.5);
- uv = scale(vec2(trans)) * uv;
- uv += vec2(0.5);
-
- // Create square aspect ratio
- uv.x *= iResolution.x / iResolution.y;
-
- // Create boxes
- uv *= repeats;
-
- // Get position
- vec2 ipos = floor(uv);
-
- // Return uv as 0 to 1
- uv = fract(uv);
-
- // Calculate random xy and size
- vec2 rndXY = N22(newRnd + ipos * (offset + 1.)) * 0.9 + 0.05;
- float rndSize = N21(ipos) * 100. + 200.;
-
- vec2 j = (rndXY - uv) * rndSize;
- float sparkle = 1. / dot(j, j);
-
- // Set stars to be pure white
- col += white * sparkle;
-
- col *= smoothstep(1., 0.8, trans);
- return col; // Return pure white stars only
-}
-
-void mainImage(out vec4 fragColor, in vec2 fragCoord)
-{
- // Normalized pixel coordinates (from 0 to 1)
- vec2 uv = fragCoord / iResolution.xy;
-
- vec3 col = vec3(0.);
-
- for (float i = 0.; i < layers; i++) {
- col += stars(uv, i);
- }
-
- // Sample the terminal screen texture including alpha channel
- vec4 terminalColor = texture(iChannel0, uv);
-
- if (transparent) {
- col += terminalColor.rgb;
- }
-
- // Make a mask that is 1.0 where the terminal content is not black
- float mask = 1 - step(threshold, luminance(terminalColor.rgb));
-
- vec3 blendedColor = mix(terminalColor.rgb, col, mask);
-
- // Apply terminal's alpha to control overall opacity
- fragColor = vec4(blendedColor, terminalColor.a);
-}
diff --git a/ghostty/shaders/tft.glsl b/ghostty/shaders/tft.glsl
deleted file mode 100644
index 3d77443..0000000
--- a/ghostty/shaders/tft.glsl
+++ /dev/null
@@ -1,23 +0,0 @@
-/** Size of TFT "pixels" */
-float resolution = 4.0;
-
-/** Strength of effect */
-float strength = 0.5;
-
-void _scanline(inout vec3 color, vec2 uv)
-{
- float scanline = step(1.2, mod(uv.y * iResolution.y, resolution));
- float grille = step(1.2, mod(uv.x * iResolution.x, resolution));
- color *= max(1.0 - strength, scanline * grille);
-}
-
-void mainImage(out vec4 fragColor, in vec2 fragCoord)
-{
- vec2 uv = fragCoord.xy / iResolution.xy;
- vec3 color = texture(iChannel0, uv).rgb;
-
- _scanline(color, uv);
-
- fragColor.xyz = color;
- fragColor.w = 1.0;
-}
diff --git a/ghostty/shaders/underwater.glsl b/ghostty/shaders/underwater.glsl
deleted file mode 100644
index 8c2fb22..0000000
--- a/ghostty/shaders/underwater.glsl
+++ /dev/null
@@ -1,74 +0,0 @@
-// adapted by Alex Sherwin for Ghostty from https://www.shadertoy.com/view/lljGDt
-
-#define BLACK_BLEND_THRESHOLD .4
-
-float hash21(vec2 p) {
- p = fract(p * vec2(233.34, 851.73));
- p += dot(p, p + 23.45);
- return fract(p.x * p.y);
-}
-
-float rayStrength(vec2 raySource, vec2 rayRefDirection, vec2 coord, float seedA, float seedB, float speed)
-{
- vec2 sourceToCoord = coord - raySource;
- float cosAngle = dot(normalize(sourceToCoord), rayRefDirection);
-
- // Add subtle dithering based on screen coordinates
- float dither = hash21(coord) * 0.015 - 0.0075;
-
- float ray = clamp(
- (0.45 + 0.15 * sin(cosAngle * seedA + iTime * speed)) +
- (0.3 + 0.2 * cos(-cosAngle * seedB + iTime * speed)) + dither,
- 0.0, 1.0);
-
- // Smoothstep the distance falloff
- float distFade = smoothstep(0.0, iResolution.x, iResolution.x - length(sourceToCoord));
- return ray * mix(0.5, 1.0, distFade);
-}
-
-void mainImage( out vec4 fragColor, in vec2 fragCoord )
-{
- vec2 uv = fragCoord.xy / iResolution.xy;
-
- uv.y = 1.0 - uv.y;
- vec2 coord = vec2(fragCoord.x, iResolution.y - fragCoord.y);
-
- // Set the parameters of the sun rays
- vec2 rayPos1 = vec2(iResolution.x * 0.7, iResolution.y * 1.1);
- vec2 rayRefDir1 = normalize(vec2(1.0, 0.116));
- float raySeedA1 = 36.2214;
- float raySeedB1 = 21.11349;
- float raySpeed1 = 1.1;
-
- vec2 rayPos2 = vec2(iResolution.x * 0.8, iResolution.y * 1.2);
- vec2 rayRefDir2 = normalize(vec2(1.0, -0.241));
- const float raySeedA2 = 22.39910;
- const float raySeedB2 = 18.0234;
- const float raySpeed2 = 0.9;
-
- // Calculate the colour of the sun rays on the current fragment
- vec4 rays1 =
- vec4(1.0, 1.0, 1.0, 0.0) *
- rayStrength(rayPos1, rayRefDir1, coord, raySeedA1, raySeedB1, raySpeed1);
-
- vec4 rays2 =
- vec4(1.0, 1.0, 1.0, 0.0) *
- rayStrength(rayPos2, rayRefDir2, coord, raySeedA2, raySeedB2, raySpeed2);
-
- vec4 col = rays1 * 0.5 + rays2 * 0.4;
-
- // Attenuate brightness towards the bottom, simulating light-loss due to depth.
- // Give the whole thing a blue-green tinge as well.
- float brightness = 1.0 - (coord.y / iResolution.y);
- col.r *= 0.05 + (brightness * 0.8);
- col.g *= 0.15 + (brightness * 0.6);
- col.b *= 0.3 + (brightness * 0.5);
-
- vec2 termUV = fragCoord.xy / iResolution.xy;
- vec4 terminalColor = texture(iChannel0, termUV);
-
- float alpha = step(length(terminalColor.rgb), BLACK_BLEND_THRESHOLD);
- vec3 blendedColor = mix(terminalColor.rgb * 1.0, col.rgb * 0.3, alpha);
-
- fragColor = vec4(blendedColor, terminalColor.a);
-}
diff --git a/ghostty/shaders/water.glsl b/ghostty/shaders/water.glsl
deleted file mode 100644
index c240b58..0000000
--- a/ghostty/shaders/water.glsl
+++ /dev/null
@@ -1,35 +0,0 @@
-
-#define TAU 6.28318530718
-#define MAX_ITER 6
-
-void mainImage( out vec4 fragColor, in vec2 fragCoord )
-{
- vec3 water_color = vec3(1.0, 1.0, 1.0) * 0.5;
- float time = iTime * 0.5+23.0;
- vec2 uv = fragCoord.xy / iResolution.xy;
-
- vec2 p = mod(uv*TAU, TAU)-250.0;
- vec2 i = vec2(p);
- float c = 1.0;
- float inten = 0.005;
-
- for (int n = 0; n < MAX_ITER; n++)
- {
- float t = time * (1.0 - (3.5 / float(n+1)));
- i = p + vec2(cos(t - i.x) + sin(t + i.y), sin(t - i.y) + cos(t + i.x));
- c += 1.0/length(vec2(p.x / (sin(i.x+t)/inten),p.y / (cos(i.y+t)/inten)));
- }
- c /= float(MAX_ITER);
- c = 1.17-pow(c, 1.4);
- vec3 color = vec3(pow(abs(c), 15.0));
- color = clamp((color + water_color)*1.2, 0.0, 1.0);
-
- // perterb uv based on value of c from caustic calc above
- vec2 tc = vec2(cos(c)-0.75,sin(c)-0.75)*0.04;
- uv = clamp(uv + tc,0.0,1.0);
-
- fragColor = texture(iChannel0, uv);
- // give transparent pixels a color
- if ( fragColor.a == 0.0 ) fragColor=vec4(1.0,1.0,1.0,1.0);
- fragColor *= vec4(color, 1.0);
-}
\ No newline at end of file
diff --git a/hypr/.gitignore b/hypr/.gitignore
new file mode 100644
index 0000000..4039784
--- /dev/null
+++ b/hypr/.gitignore
@@ -0,0 +1 @@
+shaders
\ No newline at end of file
diff --git a/hypr/shaders/chromatic_abberation.frag b/hypr/shaders/chromatic_abberation.frag
deleted file mode 100755
index 5389241..0000000
--- a/hypr/shaders/chromatic_abberation.frag
+++ /dev/null
@@ -1,24 +0,0 @@
-// vim: set ft=glsl:
-
-precision highp float;
-varying highp vec2 v_texcoord;
-uniform highp sampler2D tex;
-
-#define STRENGTH 0.0027
-
-void main() {
- vec2 center = vec2(0.5, 0.5);
- vec2 offset = (v_texcoord - center) * STRENGTH;
-
- float rSquared = dot(offset, offset);
- float distortion = 1.0 + 1.0 * rSquared;
- vec2 distortedOffset = offset * distortion;
-
- vec2 redOffset = vec2(distortedOffset.x, distortedOffset.y);
- vec2 blueOffset = vec2(distortedOffset.x, distortedOffset.y);
-
- vec4 redColor = texture2D(tex, v_texcoord + redOffset);
- vec4 blueColor = texture2D(tex, v_texcoord + blueOffset);
-
- gl_FragColor = vec4(redColor.r, texture2D(tex, v_texcoord).g, blueColor.b, 1.0);
-}
diff --git a/hypr/shaders/crt.frag b/hypr/shaders/crt.frag
deleted file mode 100755
index a37ff9f..0000000
--- a/hypr/shaders/crt.frag
+++ /dev/null
@@ -1,511 +0,0 @@
-#version 100
-precision highp float;
-varying highp vec2 v_texcoord;
-varying highp vec3 v_pos;
-uniform highp sampler2D tex;
-uniform lowp float time;
-
-#define BORDER_COLOR vec4(vec3(0.0, 0.0, 0.0), 1.0) // black border
-#define BORDER_RADIUS 1.0 // larger vignette radius
-#define BORDER_SIZE 0.01 // small border size
-#define CHROMATIC_ABERRATION_STRENGTH 0.00
-#define DENOISE_INTENSITY 0.0001 //
-#define DISTORTION_AMOUNT 0.00 // moderate distortion amount
-#define HDR_BLOOM 0.75 // bloom intensity
-#define HDR_BRIGHTNESS 0.011 // brightness
-#define HDR_CONTRAST 0.011 // contrast
-#define HDR_SATURATION 1.0// saturation
-#define LENS_DISTORTION_AMOUNT 0.0
-#define NOISE_THRESHOLD 0.0001
-#define PHOSPHOR_BLUR_AMOUNT 0.77 // Amount of blur for phosphor glow
-#define PHOSPHOR_GLOW_AMOUNT 0.77 // Amount of phosphor glow
-#define SAMPLING_RADIUS 0.0001
-#define SCANLINE_FREQUENCY 540.0
-#define SCANLINE_THICKNESS 0.0507
-#define SCANLINE_TIME time * 471.24
-#define SHARPNESS 0.25
-#define SUPERSAMPLING_SAMPLES 16.0
-#define VIGNETTE_RADIUS 0.0 // larger vignette radius
-#define PI 3.14159265359
-#define TWOPI 6.28318530718
-
-vec2 applyBarrelDistortion(vec2 coord, float amt) {
- vec2 p = coord.xy / vec2(1.0);
- vec2 v = p * 2.0 - vec2(1.0);
- float r = dot(v, v);
- float k = 1.0 + pow(r, 2.0) * pow(amt, 2.0);
- vec2 result = v * k;
- return vec2(0.5, 0.5) + 0.5 * result.xy;
-}
-
-vec4 applyColorCorrection(vec4 color) {
- color.rgb *= vec3(1.0, 0.79, 0.89);
- return vec4(color.rgb, 1.0);
-}
-
-vec4 applyBorder(vec2 tc, vec4 color, float borderSize, vec4 borderColor) {
- float dist_x = min(tc.x, 1.0 - tc.x);
- float dist_y = min(tc.y, 1.0 - tc.y);
- float dist = min(dist_x, dist_y) * -1.0;
- float border = smoothstep(borderSize, 0.0, dist);
- border += smoothstep(borderSize, 0.0, dist);
- return mix(color, borderColor, border);
-}
-
-vec4 applyFakeHDR(vec4 color, float brightness, float contrast, float saturation, float bloom) {
- color.rgb = (color.rgb - vec3(0.5)) * exp2(brightness) + vec3(0.5);
- vec3 crtfactor = vec3(1.05, 0.92, 1.0);
- color.rgb = pow(color.rgb, crtfactor);
- // // NTSC
- // vec3 lumCoeff = vec3(0.2125, 0.7154, 0.0721);
-
- // // BT.709
- // vec3 lumCoeff = vec3(0.299, 0.587, 0.114);
-
- // BT.2020
- vec3 lumCoeff = vec3(0.2627, 0.6780, 0.0593);
-
- // // Warm NTSC
- // vec3 lumCoeff = vec3(0.2125, 0.7010, 0.0865);
-
- float luminance = dot(color.rgb, lumCoeff);
- luminance = pow(luminance, 2.2);
- color.rgb = mix(vec3(luminance), color.rgb, saturation);
- color.rgb = mix(color.rgb, vec3(1.0), pow(max(0.0, luminance - 1.0 + bloom), 4.0));
- return color;
-}
-
-vec4 applyVignette(vec4 color) {
- vec2 center = vec2(0.5, 0.5); // center of screen
- float radius = VIGNETTE_RADIUS; // radius of vignette effect
- float softness = 1.0; // softness of vignette effect
- float intensity = 0.7; // intensity of vignette effect
- vec2 offset = v_texcoord - center; // offset from center of screen
- float distance = length(offset); // distance from center of screen
- float alpha = smoothstep(radius, radius - radius * softness, distance) * intensity; // calculate alpha value for vignette effect
- return mix(vec4(0.0, 0.0, 0.0, alpha), color, alpha); // mix black with color using calculated alpha value
-}
-
-vec4 applyPhosphorGlow(vec2 tc, vec4 color, sampler2D tex) {
- // Calculate average color value of the texture
- vec4 texelColor = color;
- float averageColor = (texelColor.r + texelColor.g + texelColor.b) / 3.0;
-
- // Determine brightness-dependent color factor
- float factor = mix(
- mix(0.09,
- mix(0.005, 0.0075, (averageColor - 0.1) / 0.1),
- step(0.01, averageColor)), 0.0005,
- step(0.02, averageColor));
- // Apply phosphor glow effect
- vec4 sum = vec4(0.0);
- vec4 pixels[9];
- pixels[0] = texture2D(tex, tc - vec2(0.001, 0.001));
- pixels[1] = texture2D(tex, tc - vec2(0.001, 0.0));
- pixels[2] = texture2D(tex, tc - vec2(0.001, -0.001));
- pixels[3] = texture2D(tex, tc - vec2(0.0, 0.001));
- pixels[4] = texture2D(tex, tc);
- pixels[5] = texture2D(tex, tc + vec2(0.001, 0.001));
- pixels[6] = texture2D(tex, tc + vec2(0.001, 0.0));
- pixels[7] = texture2D(tex, tc + vec2(0.001, -0.001));
- pixels[8] = texture2D(tex, tc + vec2(0.0, 0.001));
-
-// Perform operations on input pixels in parallel
- sum = pixels[0]
- + pixels[1]
- + pixels[2]
- + pixels[3]
- + pixels[4]
- + pixels[5]
- + pixels[6]
- + pixels[7]
- + pixels[8];
- sum /= 9.0;
- sum += texture2D(tex, tc - vec2(0.01, 0.01)) * 0.001;
- sum += texture2D(tex, tc - vec2(0.0, 0.01)) * 0.001;
- sum += texture2D(tex, tc - vec2(-0.01, 0.01)) * 0.001;
- sum += texture2D(tex, tc - vec2(0.01, 0.0)) * 0.001;
- sum += color * PHOSPHOR_BLUR_AMOUNT;
- sum += texture2D(tex, tc - vec2(-0.01, 0.0)) * 0.001;
- sum += texture2D(tex, tc - vec2(0.01, -0.01)) * 0.001;
- sum += texture2D(tex, tc - vec2(0.0, -0.01)) * 0.001;
- sum += texture2D(tex, tc - vec2(-0.01, -0.01)) * 0.001;
- sum *= PHOSPHOR_GLOW_AMOUNT;
-
- // Initialize sum_sum_factor to zero
- vec4 sum_sum_factor = vec4(0.0);
- // Compute sum_j for i = -1
- vec4 sum_j = vec4(0.0);
- sum_j += texture2D(tex, tc + vec2(-1, -1) * 0.01);
- sum_j += texture2D(tex, tc + vec2(0, -1) * 0.01);
- sum_j += texture2D(tex, tc + vec2(1, -1) * 0.01);
- sum_j += texture2D(tex, tc + vec2(-1, 0) * 0.01);
- sum_j += texture2D(tex, tc + vec2(0, 0) * 0.01);
- sum_j += texture2D(tex, tc + vec2(1, 0) * 0.01);
- sum_j += texture2D(tex, tc + vec2(-1, 1) * 0.01);
- sum_j += texture2D(tex, tc + vec2(0, 1) * 0.01);
- sum_j += texture2D(tex, tc + vec2(1, 1) * 0.01);
- sum_sum_factor += sum_j * vec4(0.011);
-
- // Compute sum_j for i = 0
- sum_j = vec4(0.0);
- sum_j += texture2D(tex, tc + vec2(-1, 0) * 0.01);
- sum_j += texture2D(tex, tc + vec2(0, 0) * 0.01);
- sum_j += texture2D(tex, tc + vec2(1, 0) * 0.01);
- sum_j += texture2D(tex, tc + vec2(-1, 1) * 0.01);
- sum_j += texture2D(tex, tc + vec2(0, 1) * 0.01);
- sum_j += texture2D(tex, tc + vec2(1, 1) * 0.01);
- sum_sum_factor += sum_j * vec4(0.011);
-
- // Compute sum_j for i = 1
- sum_j = vec4(0.0);
- sum_j += texture2D(tex, tc + vec2(-1, 0) * 0.01);
- sum_j += texture2D(tex, tc + vec2(0, 1) * 0.01);
- sum_j += texture2D(tex, tc + vec2(1, 0) * 0.01);
- sum_j += texture2D(tex, tc + vec2(-1, 1) * 0.01);
- sum_j += texture2D(tex, tc + vec2(0, 1) * 0.01);
- sum_j += texture2D(tex, tc + vec2(1, 1) * 0.01);
- sum_sum_factor += sum_j * vec4(0.011);
- color += mix(sum_sum_factor * sum_sum_factor * vec4(factor), sum, 0.5);
- return color;
-}
-
-vec4 applyAdaptiveSharpen(vec2 tc, vec4 color, sampler2D tex) {
- vec4 color_tl = texture2D(tex, tc + vec2(-1.0, -1.0) * 0.5 / 2160.0);
- vec4 color_tr = texture2D(tex, tc + vec2(1.0, -1.0) * 0.5 / 2160.0);
- vec4 color_bl = texture2D(tex, tc + vec2(-1.0, 1.0) * 0.5 / 2160.0);
- vec4 color_br = texture2D(tex, tc + vec2(1.0, 1.0) * 0.5 / 2160.0);
- float sharpness = SHARPNESS;
- vec3 color_no_alpha = color.rgb;
- vec3 color_tl_no_alpha = color_tl.rgb;
- vec3 color_tr_no_alpha = color_tr.rgb;
- vec3 color_bl_no_alpha = color_bl.rgb;
- vec3 color_br_no_alpha = color_br.rgb;
- float delta = (dot(color_no_alpha, vec3(0.333333)) + dot(color_tl_no_alpha, vec3(0.333333)) + dot(color_tr_no_alpha, vec3(0.333333)) + dot(color_bl_no_alpha, vec3(0.333333)) + dot(color_br_no_alpha, vec3(0.333333))) * 0.2 - dot(color_no_alpha, vec3(0.333333));
- vec3 sharp_color_no_alpha = color_no_alpha + min(vec3(0.0), vec3(delta * sharpness));
- vec4 sharp_color = vec4(sharp_color_no_alpha, color.a);
- return sharp_color;
-}
-
-vec4 applyScanlines(vec2 tc, vec4 color) {
- float scanline = (cos(tc.y * SCANLINE_FREQUENCY + SCANLINE_TIME) *
- sin(tc.y * SCANLINE_FREQUENCY + SCANLINE_TIME)) * SCANLINE_THICKNESS;
- float alpha = clamp(1.0 - abs(scanline), 0.0, 1.0);
- return vec4(color.rgb * alpha, color.a);
-}
-
-vec4 applyChromaticAberration(vec2 uv, vec4 color) {
- vec2 center = vec2(0.5, 0.5); // center of the screen
- vec2 offset = (uv - center) * CHROMATIC_ABERRATION_STRENGTH; // calculate the offset from the center
-
- // apply lens distortion
- float rSquared = dot(offset, offset);
- float distortion = 1.0 + LENS_DISTORTION_AMOUNT * rSquared;
- vec2 distortedOffset = offset * distortion;
-
- // apply chromatic aberration
- vec2 redOffset = vec2(distortedOffset.x * 1.00, distortedOffset.y * 1.00);
- vec2 blueOffset = vec2(distortedOffset.x * 1.00, distortedOffset.y * 1.00);
-
- vec4 redColor = texture2D(tex, uv + redOffset);
- vec4 blueColor = texture2D(tex, uv + blueOffset);
-
- vec4 result = vec4(redColor.r, color.g, blueColor.b, color.a);
-
- return result;
-}
-
-vec4 reduceGlare(vec4 color) {
- // Calculate the intensity of the color by taking the average of the RGB components
- float intensity = (color.r + color.g + color.b) / 3.0;
- // Set the maximum intensity that can be considered for glare
- float maxIntensity = 0.98;
- // Use smoothstep to create a smooth transition from no glare to full glare
- // based on the intensity of the color and the maximum intensity
- float glareIntensity = smoothstep(maxIntensity - 0.02, maxIntensity, intensity);
- // Set the amount of glare to apply to the color
- float glareAmount = 0.02;
- // Mix the original color with the reduced color that has glare applied to it
- vec3 reducedColor = mix(color.rgb, vec3(glareIntensity), glareAmount);
- // Return the reduced color with the original alpha value
- return vec4(reducedColor, color.a);
-}
-
-// Apply a fake HDR effect to the input color.
-// Parameters:
-// - inputColor: the color to apply the effect to.
-// - brightness: the brightness of the image. Should be a value between 0 and 1.
-// - contrast: the contrast of the image. Should be a value between 0 and 1.
-// - saturation: the saturation of the image. Should be a value between 0 and 2.
-// - bloom: the intensity of the bloom effect. Should be a value between 0 and 1.
-vec4 applyFakeHDREffect(vec4 inputColor, float brightness, float contrast, float saturation, float bloom) {
- const float minBrightness = 0.0;
- const float maxBrightness = 1.0;
- const float minContrast = 0.0;
- const float maxContrast = 1.0;
- const float minSaturation = 0.0;
- const float maxSaturation = 2.0;
- const float minBloom = 0.0;
- const float maxBloom = 1.0;
-
- // Check input parameters for validity
- if (brightness < minBrightness || brightness > maxBrightness) {
- return vec4(0.0, 0.0, 0.0, 1.0); // Return black with alpha of 1.0 to indicate error
- }
- if (contrast < minContrast || contrast > maxContrast) {
- return vec4(0.0, 0.0, 0.0, 1.0);
- }
- if (saturation < minSaturation || saturation > maxSaturation) {
- return vec4(0.0, 0.0, 0.0, 1.0);
- }
- if (bloom < minBloom || bloom > maxBloom) {
- return vec4(0.0, 0.0, 0.0, 1.0);
- }
-
- // Apply brightness and contrast
- vec3 color = inputColor.rgb;
- color = (color - vec3(0.5)) * exp2(brightness * 10.0) + vec3(0.5);
- color = mix(vec3(0.5), color, pow(contrast * 4.0 + 1.0, 2.0));
-
- // // NTSC
- // vec3 lumCoeff = vec3(0.2125, 0.7154, 0.0721);
-
- // // BT.709
- // vec3 lumCoeff = vec3(0.299, 0.587, 0.114);
-
- // // BT.2020
- // vec3 lumCoeff = vec3(0.2627, 0.6780, 0.0593);
-
- // Warm NTSC
- vec3 lumCoeff = vec3(0.2125, 0.7010, 0.0865);
-
- // Apply saturation
- float luminance = dot(color, lumCoeff);
- vec3 grey = vec3(luminance);
- color = mix(grey, color, saturation);
-
- // Apply bloom effect
- float threshold = 1.0 - bloom;
- vec3 bloomColor = max(color - threshold, vec3(0.0));
- bloomColor = pow(bloomColor, vec3(2.0));
- bloomColor = mix(vec3(0.0), bloomColor, pow(min(luminance, threshold), 4.0));
- color += bloomColor;
-
- return vec4(color, inputColor.a);
-}
-
-vec4 bilateralFilter(sampler2D tex, vec2 uv, vec4 color, float sampleRadius, float noiseThreshold, float intensity) {
- vec4 filteredColor = vec4(0.0);
- float totalWeight = 0.0;
-
- // Top-left pixel
- vec4 sample = texture2D(tex, uv + vec2(-1.0, -1.0));
- float dist = length(vec2(-1.0, -1.0));
- float colorDist = length(sample - color);
- float weight = exp(-0.5 * (dist * dist + colorDist * colorDist * intensity) / (sampleRadius * sampleRadius));
- filteredColor += sample * weight;
- totalWeight += weight;
-
- // Top pixel
- sample = texture2D(tex, uv + vec2(0.0, -1.0));
- dist = length(vec2(0.0, -1.0));
- colorDist = length(sample - color);
- weight = exp(-0.5 * (dist * dist + colorDist * colorDist * intensity) / (sampleRadius * sampleRadius));
- filteredColor += sample * weight;
- totalWeight += weight;
-
- // Top-right pixel
- sample = texture2D(tex, uv + vec2(1.0, -1.0));
- dist = length(vec2(1.0, -1.0));
- colorDist = length(sample - color);
- weight = exp(-0.5 * (dist * dist + colorDist * colorDist * intensity) / (sampleRadius * sampleRadius));
- filteredColor += sample * weight;
- totalWeight += weight;
-
- // Left pixel
- sample = texture2D(tex, uv + vec2(-1.0, 0.0));
- dist = length(vec2(-1.0, 0.0));
- colorDist = length(sample - color);
- weight = exp(-0.5 * (dist * dist + colorDist * colorDist * intensity) / (sampleRadius * sampleRadius));
- filteredColor += sample * weight;
- totalWeight += weight;
-
- // Center pixel
- sample = texture2D(tex, uv);
- dist = 0.0;
- colorDist = length(sample - color);
- weight = exp(-0.5 * (dist * dist + colorDist * colorDist * intensity) / (sampleRadius * sampleRadius));
- filteredColor += sample * weight;
- totalWeight += weight;
-
- // Right pixel
- sample = texture2D(tex, uv + vec2(1.0, 0.0));
- dist = length(vec2(1.0, 0.0));
- colorDist = length(sample - color);
- weight = exp(-0.5 * (dist * dist + colorDist * colorDist * intensity) / (sampleRadius * sampleRadius));
- filteredColor += sample * weight;
- totalWeight += weight;
-
- // Bottom-left pixel
- sample = texture2D(tex, uv + vec2(-1.0, 1.0));
- dist = length(vec2(-1.0, 1.0));
- colorDist = length(sample - color);
- weight = exp(-0.5 * (dist * dist + colorDist * colorDist * intensity) / (sampleRadius * sampleRadius));
- filteredColor += sample * weight;
- totalWeight += weight;
-
-// Bottom pixel
- sample = texture2D(tex, uv + vec2(0.0, sampleRadius));
- dist = length(vec2(0.0, sampleRadius));
- colorDist = length(sample - color);
- weight = exp(-0.5 * (dist * dist + colorDist * colorDist * intensity) / (sampleRadius * sampleRadius));
- filteredColor += sample * weight;
- totalWeight += weight;
-
- filteredColor /= totalWeight;
- return mix(color, filteredColor, step(noiseThreshold, length(filteredColor - color)));
-}
-
-vec4 supersample(sampler2D tex, vec2 uv, float sampleRadius, float noiseThreshold, float intensity) {
- float radiusSq = sampleRadius * sampleRadius;
- vec2 poissonDisk;
- vec4 color = vec4(0.0);
-
- float r1_0 = sqrt(0.0 / 16.0);
- float r2_0 = fract(1.0 / 3.0);
- float theta_0 = TWOPI * r2_0;
- poissonDisk = vec2(r1_0 * cos(theta_0), r1_0 * sin(theta_0));
- color += texture2D(tex, uv + poissonDisk * sampleRadius);
-
- float r1_1 = sqrt(1.0 / 16.0);
- float r2_1 = fract(2.0 / 3.0);
- float theta_1 = TWOPI * r2_1;
- poissonDisk = vec2(r1_1 * cos(theta_1), r1_1 * sin(theta_1));
- color += texture2D(tex, uv + poissonDisk * sampleRadius);
-
- float r1_2 = sqrt(2.0 / 16.0);
- float r2_2 = fract(3.0 / 3.0);
- float theta_2 = TWOPI * r2_2;
- poissonDisk = vec2(r1_2 * cos(theta_2), r1_2 * sin(theta_2));
- color += texture2D(tex, uv + poissonDisk * sampleRadius);
-
- float r1_3 = sqrt(3.0 / 16.0);
- float r2_3 = fract(4.0 / 3.0);
- float theta_3 = TWOPI * r2_3;
- poissonDisk = vec2(r1_3 * cos(theta_3), r1_3 * sin(theta_3));
- color += texture2D(tex, uv + poissonDisk * sampleRadius);
-
- float r1_4 = sqrt(4.0 / 16.0);
- float r2_4 = fract(5.0 / 3.0);
- float theta_4 = TWOPI * r2_4;
- poissonDisk = vec2(r1_4 * cos(theta_4), r1_4 * sin(theta_4));
- color += texture2D(tex, uv + poissonDisk * sampleRadius);
-
- float r1_5 = sqrt(5.0 / 16.0);
- float r2_5 = fract(6.0 / 3.0);
- float theta_5 = TWOPI * r2_5;
- poissonDisk = vec2(r1_5 * cos(theta_5), r1_5 * sin(theta_5));
- color += texture2D(tex, uv + poissonDisk * sampleRadius);
-
- float r1_6 = sqrt(6.0 / 16.0);
- float r2_6 = fract(7.0 / 3.0);
- float theta_6 = TWOPI * r2_6;
- poissonDisk = vec2(r1_6 * cos(theta_6), r1_6 * sin(theta_6));
- color += texture2D(tex, uv + poissonDisk * sampleRadius);
-
- float r1_7 = sqrt(7.0 / 16.0);
- float r2_7 = fract(8.0 / 3.0);
- float theta_7 = TWOPI * r2_7;
- poissonDisk = vec2(r1_7 * cos(theta_7), r1_7 * sin(theta_7));
- color += texture2D(tex, uv + poissonDisk * sampleRadius);
-
- float r1_8 = sqrt(8.0 / 16.0);
- float r2_8 = fract(9.0 / 3.0);
- float theta_8 = TWOPI * r2_8;
- poissonDisk = vec2(r1_8 * cos(theta_8), r1_8 * sin(theta_8));
- color += texture2D(tex, uv + poissonDisk * sampleRadius);
-
- float r1_9 = sqrt(9.0 / 16.0);
- float r2_9 = fract(10.0 / 3.0);
- float theta_9 = TWOPI * r2_9;
- poissonDisk = vec2(r1_9 * cos(theta_9), r1_9 * sin(theta_9));
- color += texture2D(tex, uv + poissonDisk * sampleRadius);
-
- float r1_10 = sqrt(10.0 / 16.0);
- float r2_10 = fract(11.0 / 3.0);
- float theta_10 = TWOPI * r2_10;
- poissonDisk = vec2(r1_10 * cos(theta_10), r1_10 * sin(theta_10));
- color += texture2D(tex, uv + poissonDisk * sampleRadius);
-
- float r1_11 = sqrt(11.0 / 16.0);
- float r2_11 = fract(12.0 / 3.0);
- float theta_11 = TWOPI * r2_11;
- poissonDisk = vec2(r1_11 * cos(theta_11), r1_11 * sin(theta_11));
- color += texture2D(tex, uv + poissonDisk * sampleRadius);
-
- float r1_12 = sqrt(12.0 / 16.0);
- float r2_12 = fract(13.0 / 3.0);
- float theta_12 = TWOPI * r2_12;
- poissonDisk = vec2(r1_12 * cos(theta_12), r1_12 * sin(theta_12));
- color += texture2D(tex, uv + poissonDisk * sampleRadius);
-
- float r1_13 = sqrt(13.0 / 16.0);
- float r2_13 = fract(14.0 / 3.0);
- float theta_13 = TWOPI * r2_13;
- poissonDisk = vec2(r1_13 * cos(theta_13), r1_13 * sin(theta_13));
- color += texture2D(tex, uv + poissonDisk * sampleRadius);
-
- float r1_14 = sqrt(14.0 / 16.0);
- float r2_14 = fract(15.0 / 3.0);
- float theta_14 = TWOPI * r2_14;
- poissonDisk = vec2(r1_14 * cos(theta_14), r1_14 * sin(theta_14));
- color += texture2D(tex, uv + poissonDisk * sampleRadius);
-
- float r1_15 = sqrt(15.0 / 16.0);
- float r2_15 = fract(16.0 / 3.0);
- float theta_15 = TWOPI * r2_15;
- poissonDisk = vec2(r1_15 * cos(theta_15), r1_15 * sin(theta_15));
- color += texture2D(tex, uv + poissonDisk * sampleRadius);
-
- return bilateralFilter(tex, uv, color, sampleRadius, noiseThreshold, intensity);
-}
-void main() {
- vec2 tc_no_dist = v_texcoord;
-
- vec2 tc = applyBarrelDistortion(tc_no_dist, DISTORTION_AMOUNT);
-
- // [-1, 1]
- vec2 tc_no_dist_symmetric = tc_no_dist * 2.0 - 1.0;
-
- // [0,1]
- vec2 tc_no_dist_normalized = (tc_no_dist_symmetric + 1.0) / 2.0;
-
- // vec4 color = texture2D(tex, tc);
- vec4 color = supersample(tex, tc, SAMPLING_RADIUS, NOISE_THRESHOLD, DENOISE_INTENSITY);
-
- color = applyAdaptiveSharpen(tc, color, tex);
-
- color = applyPhosphorGlow(tc, color, tex);
-
- color = reduceGlare(color);
-
- color = mix(applyFakeHDREffect(color, HDR_BRIGHTNESS, HDR_CONTRAST, HDR_SATURATION, HDR_BLOOM), color, 0.5);
-
- color = applyColorCorrection(color);
-
- color /= SUPERSAMPLING_SAMPLES;
-
- color = mix(applyChromaticAberration(tc, color), color, 0.25);
-
- color = mix(color, applyVignette(color), 0.37);
-
- color = applyBorder(tc_no_dist_normalized, color, 1.0 - BORDER_SIZE * BORDER_RADIUS, BORDER_COLOR);
-
- color = mix(applyBorder(tc, color, BORDER_SIZE, BORDER_COLOR), color, 0.05);
-
- color = applyScanlines(tc, color);
-
- gl_FragColor = color;
- gl_FragColor.a = 1.0;
-}
-
diff --git a/hypr/shaders/drugs.frag b/hypr/shaders/drugs.frag
deleted file mode 100755
index 1190ed0..0000000
--- a/hypr/shaders/drugs.frag
+++ /dev/null
@@ -1,42 +0,0 @@
-
-precision highp float;
-varying vec2 v_texcoord;
-uniform sampler2D tex;
-uniform float time;
-
-void warpco(inout vec2 tc) {
- tc -= 0.5;
- tc *= length(tc) * 2.0;
- tc += 0.5;
-}
-
-float rand1d(float seed) {
- return sin(seed*1454.0);
-}
-
-float rand2d(vec2 co)
-{
- return fract(sin(dot(co.xy, vec2(12.9898,78.233))) * 43758.5453);
-}
-
-vec3 rgb(in vec2 tc, float freq, float amp, inout vec4 centre) {
- vec2 off = vec2(1.0/800.0, 0.0) * sin(tc.t * freq + time) * amp;
- vec2 off2 = vec2(1.0/800.0, 0.0) * sin(tc.t * freq - time * 1.5) * amp;
- centre = texture2D(tex, tc);
- return vec3(texture2D(tex, tc-off).r, centre.g, texture2D(tex, tc+off2).b);
-}
-
-void main() {
- // vec2 px = 1.0 / textureSize(tex, 0).st;
- vec2 tc = v_texcoord;
- warpco(tc);
- tc = mix(v_texcoord, tc, sin(time * 2.0)*0.07);
- tc.x += rand2d(floor(tc * 20.0 + floor(time * 2.5))) * 0.01;
- tc.x += rand1d(floor(tc.x * 40.0)) * 0.005 * rand1d(time * 0.001);
- tc.y += sin(tc.x + time) * 0.02;
- vec4 centre;
- vec3 bent = rgb(tc, 100.0, 5.0, centre);
- vec3 col = mix(centre.rgb, bent, sin(time));
- gl_FragColor = vec4(col, centre.a);
- // gl_FragColor = vec4(texture2D(tex, v_texcoord));
-}
\ No newline at end of file
diff --git a/hypr/shaders/extradark.frag b/hypr/shaders/extradark.frag
deleted file mode 100755
index 089ee81..0000000
--- a/hypr/shaders/extradark.frag
+++ /dev/null
@@ -1,21 +0,0 @@
-// vim: set ft=glsl:
-// blue light filter shader
-// values from https://reshade.me/forum/shader-discussion/3673-blue-light-filter-similar-to-f-lux
-
-precision mediump float;
-varying vec2 v_texcoord;
-uniform sampler2D tex;
-
-void main() {
-
- vec4 pixColor = texture2D(tex, v_texcoord);
-
- // red
- pixColor[0] *= 0.7;
- // green
- pixColor[1] *= 0.6;
- // blue
- pixColor[2] *= 0.5;
-
- gl_FragColor = pixColor;
-}
diff --git a/hypr/shaders/invert.frag b/hypr/shaders/invert.frag
deleted file mode 100755
index 864f718..0000000
--- a/hypr/shaders/invert.frag
+++ /dev/null
@@ -1,13 +0,0 @@
-// vim: set ft=glsl:
-// blue light filter shader
-// values from https://reshade.me/forum/shader-discussion/3673-blue-light-filter-similar-to-f-lux
-
-precision mediump float;
-varying vec2 v_texcoord;
-uniform sampler2D tex;
-
-void main() {
- vec4 pixColor = texture2D(tex, v_texcoord);
- pixColor.rgb = 1.0 - pixColor.rgb;
- gl_FragColor = pixColor;
-}
\ No newline at end of file
diff --git a/hypr/shaders/solarized.frag b/hypr/shaders/solarized.frag
deleted file mode 100755
index 1c37f2c..0000000
--- a/hypr/shaders/solarized.frag
+++ /dev/null
@@ -1,41 +0,0 @@
-// -*- mode:c -*-
-precision lowp float;
-varying vec2 v_texcoord;
-uniform sampler2D tex;
-
-float distanceSquared(vec3 pixColor, vec3 solarizedColor) {
- vec3 distanceVector = pixColor - solarizedColor;
- return dot(distanceVector, distanceVector);
-}
-
-void main() {
- vec3 solarized[16];
- solarized[0] = vec3(0.,0.169,0.212);
- solarized[1] = vec3(0.027,0.212,0.259);
- solarized[2] = vec3(0.345,0.431,0.459);
- solarized[3] = vec3(0.396,0.482,0.514);
- solarized[4] = vec3(0.514,0.58,0.588);
- solarized[5] = vec3(0.576,0.631,0.631);
- solarized[6] = vec3(0.933,0.91,0.835);
- solarized[7] = vec3(0.992,0.965,0.89);
- solarized[8] = vec3(0.71,0.537,0.);
- solarized[9] = vec3(0.796,0.294,0.086);
- solarized[10] = vec3(0.863,0.196,0.184);
- solarized[11] = vec3(0.827,0.212,0.51);
- solarized[12] = vec3(0.424,0.443,0.769);
- solarized[13] = vec3(0.149,0.545,0.824);
- solarized[14] = vec3(0.165,0.631,0.596);
- solarized[15] = vec3(0.522,0.6,0.);
-
- vec3 pixColor = vec3(texture2D(tex, v_texcoord));
- int closest = 0;
- float closestDistanceSquared = distanceSquared(pixColor, solarized[0]);
- for (int i = 1; i < 15; i++) {
- float newDistanceSquared = distanceSquared(pixColor, solarized[i]);
- if (newDistanceSquared < closestDistanceSquared) {
- closest = i;
- closestDistanceSquared = newDistanceSquared;
- }
- }
- gl_FragColor = vec4(solarized[closest], 1.);
-}
diff --git a/kitty/OneDark-Pro.conf b/kitty/OneDark-Pro.conf
deleted file mode 100644
index bb3cee1..0000000
--- a/kitty/OneDark-Pro.conf
+++ /dev/null
@@ -1,62 +0,0 @@
-# vim:ft=kitty
-
-## name: OneDark-Pro
-## author: VictorPL (https://github.com/VictorPLopes)
-## license: MIT
-## upstream: https://github.com/VictorPLopes/OneDark-Pro-Kitty-Terminal/blob/main/kitty-themes/OneDark-Pro.conf
-## blurb: Kitty theme inspired by Binaryify's One Dark Pro theme for Visual Studio Code.
-
-# Colors
-
-# The basic colors
-foreground #ABB2BF
-background #282C34
-selection_foreground #282C34
-selection_background #ABB2BF
-
-# Cursor colors
-cursor #ABB2BF
-cursor_text_color #282C34
-
-# URL underline color when hovering with mouse
-url_color #ABB2BF
-
-# Tab bar colors
-active_tab_foreground #3F4451
-active_tab_background #D7DAE0
-inactive_tab_foreground #ABB2BF
-inactive_tab_background #282C34
-
-# The 16 terminal colors
-
-# black
-color0 #3F4451
-color8 #4F5666
-
-# red
-color1 #E06C75
-color9 #BE5046
-
-# green
-color2 #98C379
-color10 #A5E075
-
-# yellow
-color3 #D19A66
-color11 #E5C07B
-
-# blue
-color4 #61AFEF
-color12 #4DC4FF
-
-# purple
-color5 #C678DD
-color13 #DE73FF
-
-# cyan
-color6 #56B6C2
-color14 #4CD1E0
-
-# white
-color7 #D7DAE0
-color15 #E6E6E6
\ No newline at end of file
diff --git a/kitty/OneTimeDark.conf b/kitty/OneTimeDark.conf
deleted file mode 100644
index dc0760b..0000000
--- a/kitty/OneTimeDark.conf
+++ /dev/null
@@ -1,62 +0,0 @@
-# vim:ft=kitty
-
-## name: OneDark-Pro
-## author: VictorPL (https://github.com/VictorPLopes)
-## license: MIT
-## upstream: https://github.com/VictorPLopes/OneDark-Pro-Kitty-Terminal/blob/main/kitty-themes/OneDark-Pro.conf
-## blurb: Kitty theme inspired by Binaryify's One Dark Pro theme for Visual Studio Code.
-
-# Colors
-
-# The basic colors
-foreground #ABB2BF
-background #282C34
-selection_foreground #282C34
-selection_background #ABB2BF
-
-# Cursor colors
-cursor #ABB2BF
-cursor_text_color #282C34
-
-# URL underline color when hovering with mouse
-url_color #ABB2BF
-
-# Tab bar colors
-active_tab_foreground #3F4451
-active_tab_background #D7DAE0
-inactive_tab_foreground #ABB2BF
-inactive_tab_background #282C34
-
-# The 16 terminal colors
-
-# black
-color0 #3F4451
-color8 #4F5666
-
-# red
-color1 #E06C75
-color9 #BE5046
-
-# green
-color2 #98C379
-color10 #A5E075
-
-# yellow
-color3 #D19A66
-color11 #E5C07B
-
-# blue
-color4 #61AFEF
-color12 #4DC4FF
-
-# purple
-color5 #C678DD
-color13 #DE73FF
-
-# cyan
-color6 #56B6C2
-color14 #4CD1E0
-
-# white
-color7 #D7DAE0
-color15 #E6E6E6
diff --git a/kitty/TokyoNight.conf b/kitty/TokyoNight.conf
deleted file mode 100644
index e309eee..0000000
--- a/kitty/TokyoNight.conf
+++ /dev/null
@@ -1,77 +0,0 @@
-# Tokyo Night color scheme for kitty terminal emulator
-# https://github.com/davidmathers/tokyo-night-kitty-theme
-#
-# Based on Tokyo Night color theme for Visual Studio Code
-# https://github.com/enkia/tokyo-night-vscode-theme
-
-foreground #a9b1d6
-background #1a1b26
-
-# Black
-color0 #414868
-color8 #414868
-
-# Red
-color1 #f7768e
-color9 #f7768e
-
-# Green
-color2 #73daca
-color10 #73daca
-
-# Yellow
-color3 #e0af68
-color11 #e0af68
-
-# Blue
-color4 #7aa2f7
-color12 #7aa2f7
-
-# Magenta
-color5 #bb9af7
-color13 #bb9af7
-
-# Cyan
-color6 #7dcfff
-color14 #7dcfff
-
-# White
-color7 #c0caf5
-color15 #c0caf5
-
-# Cursor
-cursor #c0caf5
-cursor_text_color #1a1b26
-
-# Selection highlight
-selection_foreground none
-selection_background #28344a
-
-# The color for highlighting URLs on mouse-over
-url_color #9ece6a
-
-# Window borders
-active_border_color #3d59a1
-inactive_border_color #101014
-bell_border_color #e0af68
-
-# Tab bar
-tab_bar_style fade
-tab_fade 1
-active_tab_foreground #3d59a1
-active_tab_background #16161e
-active_tab_font_style bold
-inactive_tab_foreground #787c99
-inactive_tab_background #16161e
-inactive_tab_font_style bold
-tab_bar_background #101014
-
-# Title bar
-macos_titlebar_color #16161e
-
-# Storm
-# background #24283b
-# cursor_text_color #24283b
-# active_tab_background #1f2335
-# inactive_tab_background #1f2335
-# macos_titlebar_color #1f2335
diff --git a/kitty/kitty.app.png b/kitty/kitty.app.png
deleted file mode 100644
index cbecb93..0000000
Binary files a/kitty/kitty.app.png and /dev/null differ