diff options
Diffstat (limited to 'assets')
70 files changed, 971 insertions, 0 deletions
diff --git a/assets/fonts/inter/Inter-Italic-VariableFont_opsz,wght.ttf b/assets/fonts/inter/Inter-Italic-VariableFont_opsz,wght.ttf Binary files differnew file mode 100644 index 0000000..43ed4f5 --- /dev/null +++ b/assets/fonts/inter/Inter-Italic-VariableFont_opsz,wght.ttf diff --git a/assets/fonts/inter/Inter-VariableFont_opsz,wght.ttf b/assets/fonts/inter/Inter-VariableFont_opsz,wght.ttf Binary files differnew file mode 100644 index 0000000..e31b51e --- /dev/null +++ b/assets/fonts/inter/Inter-VariableFont_opsz,wght.ttf diff --git a/assets/fonts/inter/OFL.txt b/assets/fonts/inter/OFL.txt new file mode 100644 index 0000000..63db4fa --- /dev/null +++ b/assets/fonts/inter/OFL.txt @@ -0,0 +1,93 @@ +Copyright 2020 The Inter Project Authors (https://github.com/rsms/inter) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/assets/fonts/inter/README.txt b/assets/fonts/inter/README.txt new file mode 100644 index 0000000..f7a47e8 --- /dev/null +++ b/assets/fonts/inter/README.txt @@ -0,0 +1,118 @@ +Inter Variable Font +=================== + +This download contains Inter as both variable fonts and static fonts. + +Inter is a variable font with these axes: + opsz + wght + +This means all the styles are contained in these files: + Inter-VariableFont_opsz,wght.ttf + Inter-Italic-VariableFont_opsz,wght.ttf + +If your app fully supports variable fonts, you can now pick intermediate styles +that aren’t available as static fonts. Not all apps support variable fonts, and +in those cases you can use the static font files for Inter: + static/Inter_18pt-Thin.ttf + static/Inter_18pt-ExtraLight.ttf + static/Inter_18pt-Light.ttf + static/Inter_18pt-Regular.ttf + static/Inter_18pt-Medium.ttf + static/Inter_18pt-SemiBold.ttf + static/Inter_18pt-Bold.ttf + static/Inter_18pt-ExtraBold.ttf + static/Inter_18pt-Black.ttf + static/Inter_24pt-Thin.ttf + static/Inter_24pt-ExtraLight.ttf + static/Inter_24pt-Light.ttf + static/Inter_24pt-Regular.ttf + static/Inter_24pt-Medium.ttf + static/Inter_24pt-SemiBold.ttf + static/Inter_24pt-Bold.ttf + static/Inter_24pt-ExtraBold.ttf + static/Inter_24pt-Black.ttf + static/Inter_28pt-Thin.ttf + static/Inter_28pt-ExtraLight.ttf + static/Inter_28pt-Light.ttf + static/Inter_28pt-Regular.ttf + static/Inter_28pt-Medium.ttf + static/Inter_28pt-SemiBold.ttf + static/Inter_28pt-Bold.ttf + static/Inter_28pt-ExtraBold.ttf + static/Inter_28pt-Black.ttf + static/Inter_18pt-ThinItalic.ttf + static/Inter_18pt-ExtraLightItalic.ttf + static/Inter_18pt-LightItalic.ttf + static/Inter_18pt-Italic.ttf + static/Inter_18pt-MediumItalic.ttf + static/Inter_18pt-SemiBoldItalic.ttf + static/Inter_18pt-BoldItalic.ttf + static/Inter_18pt-ExtraBoldItalic.ttf + static/Inter_18pt-BlackItalic.ttf + static/Inter_24pt-ThinItalic.ttf + static/Inter_24pt-ExtraLightItalic.ttf + static/Inter_24pt-LightItalic.ttf + static/Inter_24pt-Italic.ttf + static/Inter_24pt-MediumItalic.ttf + static/Inter_24pt-SemiBoldItalic.ttf + static/Inter_24pt-BoldItalic.ttf + static/Inter_24pt-ExtraBoldItalic.ttf + static/Inter_24pt-BlackItalic.ttf + static/Inter_28pt-ThinItalic.ttf + static/Inter_28pt-ExtraLightItalic.ttf + static/Inter_28pt-LightItalic.ttf + static/Inter_28pt-Italic.ttf + static/Inter_28pt-MediumItalic.ttf + static/Inter_28pt-SemiBoldItalic.ttf + static/Inter_28pt-BoldItalic.ttf + static/Inter_28pt-ExtraBoldItalic.ttf + static/Inter_28pt-BlackItalic.ttf + +Get started +----------- + +1. Install the font files you want to use + +2. Use your app's font picker to view the font family and all the +available styles + +Learn more about variable fonts +------------------------------- + + https://developers.google.com/web/fundamentals/design-and-ux/typography/variable-fonts + https://variablefonts.typenetwork.com + https://medium.com/variable-fonts + +In desktop apps + + https://theblog.adobe.com/can-variable-fonts-illustrator-cc + https://helpx.adobe.com/nz/photoshop/using/fonts.html#variable_fonts + +Online + + https://developers.google.com/fonts/docs/getting_started + https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Fonts/Variable_Fonts_Guide + https://developer.microsoft.com/en-us/microsoft-edge/testdrive/demos/variable-fonts + +Installing fonts + + MacOS: https://support.apple.com/en-us/HT201749 + Linux: https://www.google.com/search?q=how+to+install+a+font+on+gnu%2Blinux + Windows: https://support.microsoft.com/en-us/help/314960/how-to-install-or-remove-a-font-in-windows + +Android Apps + + https://developers.google.com/fonts/docs/android + https://developer.android.com/guide/topics/ui/look-and-feel/downloadable-fonts + +License +------- +Please read the full license text (OFL.txt) to understand the permissions, +restrictions and requirements for usage, redistribution, and modification. + +You can use them in your products & projects – print or digital, +commercial or otherwise. + +This isn't legal advice, please consider consulting a lawyer and see the full +license for all details. diff --git a/assets/fonts/inter/static/Inter_18pt-Black.ttf b/assets/fonts/inter/static/Inter_18pt-Black.ttf Binary files differnew file mode 100644 index 0000000..89673de --- /dev/null +++ b/assets/fonts/inter/static/Inter_18pt-Black.ttf diff --git a/assets/fonts/inter/static/Inter_18pt-BlackItalic.ttf b/assets/fonts/inter/static/Inter_18pt-BlackItalic.ttf Binary files differnew file mode 100644 index 0000000..b33602f --- /dev/null +++ b/assets/fonts/inter/static/Inter_18pt-BlackItalic.ttf diff --git a/assets/fonts/inter/static/Inter_18pt-Bold.ttf b/assets/fonts/inter/static/Inter_18pt-Bold.ttf Binary files differnew file mode 100644 index 0000000..cd13f60 --- /dev/null +++ b/assets/fonts/inter/static/Inter_18pt-Bold.ttf diff --git a/assets/fonts/inter/static/Inter_18pt-BoldItalic.ttf b/assets/fonts/inter/static/Inter_18pt-BoldItalic.ttf Binary files differnew file mode 100644 index 0000000..0d19c1a --- /dev/null +++ b/assets/fonts/inter/static/Inter_18pt-BoldItalic.ttf diff --git a/assets/fonts/inter/static/Inter_18pt-ExtraBold.ttf b/assets/fonts/inter/static/Inter_18pt-ExtraBold.ttf Binary files differnew file mode 100644 index 0000000..e71c601 --- /dev/null +++ b/assets/fonts/inter/static/Inter_18pt-ExtraBold.ttf diff --git a/assets/fonts/inter/static/Inter_18pt-ExtraBoldItalic.ttf b/assets/fonts/inter/static/Inter_18pt-ExtraBoldItalic.ttf Binary files differnew file mode 100644 index 0000000..df45062 --- /dev/null +++ b/assets/fonts/inter/static/Inter_18pt-ExtraBoldItalic.ttf diff --git a/assets/fonts/inter/static/Inter_18pt-ExtraLight.ttf b/assets/fonts/inter/static/Inter_18pt-ExtraLight.ttf Binary files differnew file mode 100644 index 0000000..f9c6cfc --- /dev/null +++ b/assets/fonts/inter/static/Inter_18pt-ExtraLight.ttf diff --git a/assets/fonts/inter/static/Inter_18pt-ExtraLightItalic.ttf b/assets/fonts/inter/static/Inter_18pt-ExtraLightItalic.ttf Binary files differnew file mode 100644 index 0000000..275f305 --- /dev/null +++ b/assets/fonts/inter/static/Inter_18pt-ExtraLightItalic.ttf diff --git a/assets/fonts/inter/static/Inter_18pt-Italic.ttf b/assets/fonts/inter/static/Inter_18pt-Italic.ttf Binary files differnew file mode 100644 index 0000000..14d3595 --- /dev/null +++ b/assets/fonts/inter/static/Inter_18pt-Italic.ttf diff --git a/assets/fonts/inter/static/Inter_18pt-Light.ttf b/assets/fonts/inter/static/Inter_18pt-Light.ttf Binary files differnew file mode 100644 index 0000000..acae361 --- /dev/null +++ b/assets/fonts/inter/static/Inter_18pt-Light.ttf diff --git a/assets/fonts/inter/static/Inter_18pt-LightItalic.ttf b/assets/fonts/inter/static/Inter_18pt-LightItalic.ttf Binary files differnew file mode 100644 index 0000000..f69e18b --- /dev/null +++ b/assets/fonts/inter/static/Inter_18pt-LightItalic.ttf diff --git a/assets/fonts/inter/static/Inter_18pt-Medium.ttf b/assets/fonts/inter/static/Inter_18pt-Medium.ttf Binary files differnew file mode 100644 index 0000000..71d9017 --- /dev/null +++ b/assets/fonts/inter/static/Inter_18pt-Medium.ttf diff --git a/assets/fonts/inter/static/Inter_18pt-MediumItalic.ttf b/assets/fonts/inter/static/Inter_18pt-MediumItalic.ttf Binary files differnew file mode 100644 index 0000000..5c8c8b1 --- /dev/null +++ b/assets/fonts/inter/static/Inter_18pt-MediumItalic.ttf diff --git a/assets/fonts/inter/static/Inter_18pt-Regular.ttf b/assets/fonts/inter/static/Inter_18pt-Regular.ttf Binary files differnew file mode 100644 index 0000000..ce097c8 --- /dev/null +++ b/assets/fonts/inter/static/Inter_18pt-Regular.ttf diff --git a/assets/fonts/inter/static/Inter_18pt-SemiBold.ttf b/assets/fonts/inter/static/Inter_18pt-SemiBold.ttf Binary files differnew file mode 100644 index 0000000..053185e --- /dev/null +++ b/assets/fonts/inter/static/Inter_18pt-SemiBold.ttf diff --git a/assets/fonts/inter/static/Inter_18pt-SemiBoldItalic.ttf b/assets/fonts/inter/static/Inter_18pt-SemiBoldItalic.ttf Binary files differnew file mode 100644 index 0000000..d9c9896 --- /dev/null +++ b/assets/fonts/inter/static/Inter_18pt-SemiBoldItalic.ttf diff --git a/assets/fonts/inter/static/Inter_18pt-Thin.ttf b/assets/fonts/inter/static/Inter_18pt-Thin.ttf Binary files differnew file mode 100644 index 0000000..e68ec47 --- /dev/null +++ b/assets/fonts/inter/static/Inter_18pt-Thin.ttf diff --git a/assets/fonts/inter/static/Inter_18pt-ThinItalic.ttf b/assets/fonts/inter/static/Inter_18pt-ThinItalic.ttf Binary files differnew file mode 100644 index 0000000..134e837 --- /dev/null +++ b/assets/fonts/inter/static/Inter_18pt-ThinItalic.ttf diff --git a/assets/fonts/inter/static/Inter_24pt-Black.ttf b/assets/fonts/inter/static/Inter_24pt-Black.ttf Binary files differnew file mode 100644 index 0000000..dbb1b3b --- /dev/null +++ b/assets/fonts/inter/static/Inter_24pt-Black.ttf diff --git a/assets/fonts/inter/static/Inter_24pt-BlackItalic.ttf b/assets/fonts/inter/static/Inter_24pt-BlackItalic.ttf Binary files differnew file mode 100644 index 0000000..b89d61c --- /dev/null +++ b/assets/fonts/inter/static/Inter_24pt-BlackItalic.ttf diff --git a/assets/fonts/inter/static/Inter_24pt-Bold.ttf b/assets/fonts/inter/static/Inter_24pt-Bold.ttf Binary files differnew file mode 100644 index 0000000..46b3583 --- /dev/null +++ b/assets/fonts/inter/static/Inter_24pt-Bold.ttf diff --git a/assets/fonts/inter/static/Inter_24pt-BoldItalic.ttf b/assets/fonts/inter/static/Inter_24pt-BoldItalic.ttf Binary files differnew file mode 100644 index 0000000..d1c0f53 --- /dev/null +++ b/assets/fonts/inter/static/Inter_24pt-BoldItalic.ttf diff --git a/assets/fonts/inter/static/Inter_24pt-ExtraBold.ttf b/assets/fonts/inter/static/Inter_24pt-ExtraBold.ttf Binary files differnew file mode 100644 index 0000000..b775c08 --- /dev/null +++ b/assets/fonts/inter/static/Inter_24pt-ExtraBold.ttf diff --git a/assets/fonts/inter/static/Inter_24pt-ExtraBoldItalic.ttf b/assets/fonts/inter/static/Inter_24pt-ExtraBoldItalic.ttf Binary files differnew file mode 100644 index 0000000..3461a92 --- /dev/null +++ b/assets/fonts/inter/static/Inter_24pt-ExtraBoldItalic.ttf diff --git a/assets/fonts/inter/static/Inter_24pt-ExtraLight.ttf b/assets/fonts/inter/static/Inter_24pt-ExtraLight.ttf Binary files differnew file mode 100644 index 0000000..2ec6ca3 --- /dev/null +++ b/assets/fonts/inter/static/Inter_24pt-ExtraLight.ttf diff --git a/assets/fonts/inter/static/Inter_24pt-ExtraLightItalic.ttf b/assets/fonts/inter/static/Inter_24pt-ExtraLightItalic.ttf Binary files differnew file mode 100644 index 0000000..c634a5d --- /dev/null +++ b/assets/fonts/inter/static/Inter_24pt-ExtraLightItalic.ttf diff --git a/assets/fonts/inter/static/Inter_24pt-Italic.ttf b/assets/fonts/inter/static/Inter_24pt-Italic.ttf Binary files differnew file mode 100644 index 0000000..1048b07 --- /dev/null +++ b/assets/fonts/inter/static/Inter_24pt-Italic.ttf diff --git a/assets/fonts/inter/static/Inter_24pt-Light.ttf b/assets/fonts/inter/static/Inter_24pt-Light.ttf Binary files differnew file mode 100644 index 0000000..1a2a6f2 --- /dev/null +++ b/assets/fonts/inter/static/Inter_24pt-Light.ttf diff --git a/assets/fonts/inter/static/Inter_24pt-LightItalic.ttf b/assets/fonts/inter/static/Inter_24pt-LightItalic.ttf Binary files differnew file mode 100644 index 0000000..ded5a75 --- /dev/null +++ b/assets/fonts/inter/static/Inter_24pt-LightItalic.ttf diff --git a/assets/fonts/inter/static/Inter_24pt-Medium.ttf b/assets/fonts/inter/static/Inter_24pt-Medium.ttf Binary files differnew file mode 100644 index 0000000..5c88739 --- /dev/null +++ b/assets/fonts/inter/static/Inter_24pt-Medium.ttf diff --git a/assets/fonts/inter/static/Inter_24pt-MediumItalic.ttf b/assets/fonts/inter/static/Inter_24pt-MediumItalic.ttf Binary files differnew file mode 100644 index 0000000..be091b1 --- /dev/null +++ b/assets/fonts/inter/static/Inter_24pt-MediumItalic.ttf diff --git a/assets/fonts/inter/static/Inter_24pt-Regular.ttf b/assets/fonts/inter/static/Inter_24pt-Regular.ttf Binary files differnew file mode 100644 index 0000000..6b088a7 --- /dev/null +++ b/assets/fonts/inter/static/Inter_24pt-Regular.ttf diff --git a/assets/fonts/inter/static/Inter_24pt-SemiBold.ttf b/assets/fonts/inter/static/Inter_24pt-SemiBold.ttf Binary files differnew file mode 100644 index 0000000..ceb8576 --- /dev/null +++ b/assets/fonts/inter/static/Inter_24pt-SemiBold.ttf diff --git a/assets/fonts/inter/static/Inter_24pt-SemiBoldItalic.ttf b/assets/fonts/inter/static/Inter_24pt-SemiBoldItalic.ttf Binary files differnew file mode 100644 index 0000000..6921df2 --- /dev/null +++ b/assets/fonts/inter/static/Inter_24pt-SemiBoldItalic.ttf diff --git a/assets/fonts/inter/static/Inter_24pt-Thin.ttf b/assets/fonts/inter/static/Inter_24pt-Thin.ttf Binary files differnew file mode 100644 index 0000000..3505b35 --- /dev/null +++ b/assets/fonts/inter/static/Inter_24pt-Thin.ttf diff --git a/assets/fonts/inter/static/Inter_24pt-ThinItalic.ttf b/assets/fonts/inter/static/Inter_24pt-ThinItalic.ttf Binary files differnew file mode 100644 index 0000000..a3e6feb --- /dev/null +++ b/assets/fonts/inter/static/Inter_24pt-ThinItalic.ttf diff --git a/assets/fonts/inter/static/Inter_28pt-Black.ttf b/assets/fonts/inter/static/Inter_28pt-Black.ttf Binary files differnew file mode 100644 index 0000000..66a252f --- /dev/null +++ b/assets/fonts/inter/static/Inter_28pt-Black.ttf diff --git a/assets/fonts/inter/static/Inter_28pt-BlackItalic.ttf b/assets/fonts/inter/static/Inter_28pt-BlackItalic.ttf Binary files differnew file mode 100644 index 0000000..3c8fdf9 --- /dev/null +++ b/assets/fonts/inter/static/Inter_28pt-BlackItalic.ttf diff --git a/assets/fonts/inter/static/Inter_28pt-Bold.ttf b/assets/fonts/inter/static/Inter_28pt-Bold.ttf Binary files differnew file mode 100644 index 0000000..d17828b --- /dev/null +++ b/assets/fonts/inter/static/Inter_28pt-Bold.ttf diff --git a/assets/fonts/inter/static/Inter_28pt-BoldItalic.ttf b/assets/fonts/inter/static/Inter_28pt-BoldItalic.ttf Binary files differnew file mode 100644 index 0000000..6fce50a --- /dev/null +++ b/assets/fonts/inter/static/Inter_28pt-BoldItalic.ttf diff --git a/assets/fonts/inter/static/Inter_28pt-ExtraBold.ttf b/assets/fonts/inter/static/Inter_28pt-ExtraBold.ttf Binary files differnew file mode 100644 index 0000000..6d87cae --- /dev/null +++ b/assets/fonts/inter/static/Inter_28pt-ExtraBold.ttf diff --git a/assets/fonts/inter/static/Inter_28pt-ExtraBoldItalic.ttf b/assets/fonts/inter/static/Inter_28pt-ExtraBoldItalic.ttf Binary files differnew file mode 100644 index 0000000..1a56735 --- /dev/null +++ b/assets/fonts/inter/static/Inter_28pt-ExtraBoldItalic.ttf diff --git a/assets/fonts/inter/static/Inter_28pt-ExtraLight.ttf b/assets/fonts/inter/static/Inter_28pt-ExtraLight.ttf Binary files differnew file mode 100644 index 0000000..d42b3f5 --- /dev/null +++ b/assets/fonts/inter/static/Inter_28pt-ExtraLight.ttf diff --git a/assets/fonts/inter/static/Inter_28pt-ExtraLightItalic.ttf b/assets/fonts/inter/static/Inter_28pt-ExtraLightItalic.ttf Binary files differnew file mode 100644 index 0000000..90e2f20 --- /dev/null +++ b/assets/fonts/inter/static/Inter_28pt-ExtraLightItalic.ttf diff --git a/assets/fonts/inter/static/Inter_28pt-Italic.ttf b/assets/fonts/inter/static/Inter_28pt-Italic.ttf Binary files differnew file mode 100644 index 0000000..c2a143a --- /dev/null +++ b/assets/fonts/inter/static/Inter_28pt-Italic.ttf diff --git a/assets/fonts/inter/static/Inter_28pt-Light.ttf b/assets/fonts/inter/static/Inter_28pt-Light.ttf Binary files differnew file mode 100644 index 0000000..5eeff3a --- /dev/null +++ b/assets/fonts/inter/static/Inter_28pt-Light.ttf diff --git a/assets/fonts/inter/static/Inter_28pt-LightItalic.ttf b/assets/fonts/inter/static/Inter_28pt-LightItalic.ttf Binary files differnew file mode 100644 index 0000000..6b90b76 --- /dev/null +++ b/assets/fonts/inter/static/Inter_28pt-LightItalic.ttf diff --git a/assets/fonts/inter/static/Inter_28pt-Medium.ttf b/assets/fonts/inter/static/Inter_28pt-Medium.ttf Binary files differnew file mode 100644 index 0000000..00120fe --- /dev/null +++ b/assets/fonts/inter/static/Inter_28pt-Medium.ttf diff --git a/assets/fonts/inter/static/Inter_28pt-MediumItalic.ttf b/assets/fonts/inter/static/Inter_28pt-MediumItalic.ttf Binary files differnew file mode 100644 index 0000000..7481e7b --- /dev/null +++ b/assets/fonts/inter/static/Inter_28pt-MediumItalic.ttf diff --git a/assets/fonts/inter/static/Inter_28pt-Regular.ttf b/assets/fonts/inter/static/Inter_28pt-Regular.ttf Binary files differnew file mode 100644 index 0000000..855b6f4 --- /dev/null +++ b/assets/fonts/inter/static/Inter_28pt-Regular.ttf diff --git a/assets/fonts/inter/static/Inter_28pt-SemiBold.ttf b/assets/fonts/inter/static/Inter_28pt-SemiBold.ttf Binary files differnew file mode 100644 index 0000000..8b84efc --- /dev/null +++ b/assets/fonts/inter/static/Inter_28pt-SemiBold.ttf diff --git a/assets/fonts/inter/static/Inter_28pt-SemiBoldItalic.ttf b/assets/fonts/inter/static/Inter_28pt-SemiBoldItalic.ttf Binary files differnew file mode 100644 index 0000000..2e22c5a --- /dev/null +++ b/assets/fonts/inter/static/Inter_28pt-SemiBoldItalic.ttf diff --git a/assets/fonts/inter/static/Inter_28pt-Thin.ttf b/assets/fonts/inter/static/Inter_28pt-Thin.ttf Binary files differnew file mode 100644 index 0000000..94e6108 --- /dev/null +++ b/assets/fonts/inter/static/Inter_28pt-Thin.ttf diff --git a/assets/fonts/inter/static/Inter_28pt-ThinItalic.ttf b/assets/fonts/inter/static/Inter_28pt-ThinItalic.ttf Binary files differnew file mode 100644 index 0000000..d3d44cd --- /dev/null +++ b/assets/fonts/inter/static/Inter_28pt-ThinItalic.ttf diff --git a/assets/hdri/HDR_blue_nebulae-1.hdr b/assets/hdri/HDR_blue_nebulae-1.hdr Binary files differnew file mode 100644 index 0000000..f34b25d --- /dev/null +++ b/assets/hdri/HDR_blue_nebulae-1.hdr diff --git a/assets/hdri/HDR_subdued_blue_nebulae.hdr b/assets/hdri/HDR_subdued_blue_nebulae.hdr Binary files differnew file mode 100644 index 0000000..ea34298 --- /dev/null +++ b/assets/hdri/HDR_subdued_blue_nebulae.hdr diff --git a/assets/hdri/HDR_subdued_multi_nebulae.hdr b/assets/hdri/HDR_subdued_multi_nebulae.hdr Binary files differnew file mode 100644 index 0000000..da88396 --- /dev/null +++ b/assets/hdri/HDR_subdued_multi_nebulae.hdr diff --git a/assets/hdri/night_sky.hdr b/assets/hdri/night_sky.hdr Binary files differnew file mode 100644 index 0000000..b473659 --- /dev/null +++ b/assets/hdri/night_sky.hdr diff --git a/assets/shaders/Blur.slang b/assets/shaders/Blur.slang new file mode 100644 index 0000000..17e4eae --- /dev/null +++ b/assets/shaders/Blur.slang @@ -0,0 +1,60 @@ +struct VSInput +{ + float2 position : POSITION; + float2 texCoord : TEXCOORD0; +}; + +struct VSOutput +{ + float4 position : SV_Position; + float2 texCoord : TEXCOORD0; +}; + +[shader("vertex")] +VSOutput vertexMain(VSInput input) +{ + VSOutput output; + output.position = float4(input.position, 0.0, 1.0); + output.texCoord = input.texCoord; + return output; +} + +Sampler2D u_ScreenTexture; +uniform float2 u_Resolution; +uniform float u_BlurStrength; +uniform float u_GlowIntensity; + +[shader("fragment")] +float4 fragmentMain(VSOutput input) : SV_Target +{ + float2 texelSize = 1.0 / u_Resolution; + float4 centerColor = u_ScreenTexture.Sample(input.texCoord); + + float brightness = (centerColor.r + centerColor.g + centerColor.b) / 3.0; + float glowMask = smoothstep(0.05, 0.3, brightness); + + float4 blurredColor = float4(0.0, 0.0, 0.0, 0.0); + float totalWeight = 0.0; + + for (int x = -8; x <= 8; x++) + { + for (int y = -8; y <= 8; y++) + { + float2 offset = float2(x, y) * texelSize * u_BlurStrength; + float4 sampleColor = u_ScreenTexture.Sample(input.texCoord + offset); + + float weight = exp(-float(x * x + y * y) / (2.0 * 8.0 * 8.0)); + blurredColor += sampleColor * weight; + totalWeight += weight; + } + } + + blurredColor /= totalWeight; + + float3 emissionColor = float3(1.0, 0.8, 0.6); + float3 glowColor = emissionColor * glowMask * u_GlowIntensity * 2.0; + float3 auraColor = blurredColor.rgb * glowMask * u_GlowIntensity * 0.8; + float3 finalColor = centerColor.rgb + glowColor + auraColor; + + return float4(finalColor, centerColor.a); +} diff --git a/assets/shaders/EquirectToCubemap.slang b/assets/shaders/EquirectToCubemap.slang new file mode 100644 index 0000000..9b2ea4b --- /dev/null +++ b/assets/shaders/EquirectToCubemap.slang @@ -0,0 +1,33 @@ +uniform float4x4 u_Projection; +uniform float4x4 u_View; + +struct VSInput { float3 position : POSITION; }; +struct VSOutput { float4 position : SV_Position; float3 worldPos : TEXCOORD0; }; + +[shader("vertex")] +VSOutput vertexMain(VSInput input) +{ + VSOutput output; + output.worldPos = input.position; + output.position = mul(u_Projection, mul(u_View, float4(input.position, 1.0))); + return output; +} + +Sampler2D u_EquirectangularMap; +static const float2 invAtan = float2(0.1591, 0.3183); + +float2 SampleSphericalMap(float3 v) +{ + float2 uv = float2(atan2(v.z, v.x), asin(v.y)); + uv *= invAtan; + uv += 0.5; + return uv; +} + +[shader("fragment")] +float4 fragmentMain(VSOutput input) : SV_Target +{ + float2 uv = SampleSphericalMap(normalize(input.worldPos)); + float3 color = u_EquirectangularMap.Sample(uv).rgb; + return float4(color, 1.0); +} diff --git a/assets/shaders/Geodesic.slang b/assets/shaders/Geodesic.slang new file mode 100644 index 0000000..9490f21 --- /dev/null +++ b/assets/shaders/Geodesic.slang @@ -0,0 +1,490 @@ +struct VSInput { float2 position : POSITION; float2 texCoord : TEXCOORD0; }; +struct VSOutput { float4 position : SV_Position; float2 texCoord : TEXCOORD0; }; + +[shader("vertex")] +VSOutput vertexMain(VSInput input) +{ + VSOutput output; + output.position = float4(input.position, 0.0, 1.0); + output.texCoord = input.texCoord; + return output; +} + +struct Camera +{ + float3 camPos; float _pad0; + float3 camRight; float _pad1; + float3 camUp; float _pad2; + float3 camForward; float _pad3; + float tanHalfFov; + float aspect; + bool moving; + int _pad4; +}; +ConstantBuffer<Camera> cam; + +struct Disk +{ + float disk_r1; + float disk_r2; + float disk_num; + float thickness; + float disk_density; +}; +ConstantBuffer<Disk> disk; + +struct Objects +{ + int numObjects; + float4 objPosRadius[16]; + float4 objColor[16]; + float mass[16]; +}; +ConstantBuffer<Objects> obj; + +struct Simulation +{ + int maxStepsMoving; + int maxStepsStatic; + float earlyExitDistance; + float time; +}; +ConstantBuffer<Simulation> sim; + +SamplerCube u_HDRIEnvironment; + +static const float SagA_rs = 1.269e10; +static const float D_LAMBDA = 1e7; +static const float ESCAPE_R = 1e30; + +static const int DEFAULT_MAX_STEPS_MOVING = 12000; +static const int DEFAULT_MAX_STEPS_STATIC = 8000; +static const float DEFAULT_EARLY_EXIT_DISTANCE = 2e12; + +static const float MIN_STEP_SIZE = 1e6; +static const float MAX_STEP_SIZE = 5e7; + +struct Hit +{ + float4 objectColor; + float3 hitCenter; + float hitRadius; +}; + +float3 SampleHDRI(float3 direction) +{ + return u_HDRIEnvironment.Sample(direction).rgb; +} + +float hash(float p) +{ + p = frac(p * 0.1031); + p *= p + 33.33; + p *= p + p; + return frac(p); +} + +float hash(float2 p) +{ + float3 p3 = frac(float3(p.xyx) * float3(0.1031, 0.1030, 0.0973)); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.x + p3.y) * p3.z); +} + +float hash(float3 p) +{ + p = frac(p * float3(0.1031, 0.1030, 0.0973)); + p += dot(p, p.yxz + 33.33); + return frac((p.x + p.y) * p.z); +} + +float noise(float3 x) +{ + float3 i = floor(x); + float3 fr = frac(x); + + float3 u = fr * fr * (3.0 - 2.0 * fr); + + float a = hash(i); + float b = hash(i + float3(1.0, 0.0, 0.0)); + float c = hash(i + float3(0.0, 1.0, 0.0)); + float d = hash(i + float3(1.0, 1.0, 0.0)); + float e = hash(i + float3(0.0, 0.0, 1.0)); + float f = hash(i + float3(1.0, 0.0, 1.0)); + float g = hash(i + float3(0.0, 1.0, 1.0)); + float h = hash(i + float3(1.0, 1.0, 1.0)); + + return lerp(lerp(lerp(a, b, u.x), lerp(c, d, u.x), u.y), + lerp(lerp(e, f, u.x), lerp(g, h, u.x), u.y), u.z); +} + +float fbm(float3 x, int octaves) +{ + float v = 0.0; + float a = 0.5; + float f = 1.0; + float3 shift = float3(100, 200, 300); + + for (int i = 0; i < octaves; ++i) + { + v += a * noise(x * f); + x = x * 2.0 + shift; + a *= 0.5; + f *= 2.0; + } + return v; +} + +float GetCloudDensity(float3 pos) +{ + float r_cyl = length(float2(pos.x, pos.z)); + float r_norm = (r_cyl - disk.disk_r1) / (disk.disk_r2 - disk.disk_r1); + + if (r_norm < 0.0 || r_norm > 1.0) + return 0.0; + + float h_norm = abs(pos.y) / disk.thickness; + float vertical_falloff = exp(-h_norm * h_norm * 3.0); + float radial_density = 1.0 - r_norm * 0.5; + + float keplerian_speed = 1.0 / sqrt(r_norm + 0.1); + + float rotation_angle = sim.time * keplerian_speed * 0.5; + float3 rotated_pos = float3( + pos.x * cos(rotation_angle) - pos.z * sin(rotation_angle), + pos.y, + pos.x * sin(rotation_angle) + pos.z * cos(rotation_angle) + ) * 1e-10; + + float large_turbulence = fbm(rotated_pos * 1.2, 5); + float medium_wisps = fbm(rotated_pos * 2.5, 4); + float small_detail = fbm(rotated_pos * 6.0, 3); + float fine_detail = fbm(rotated_pos * 10.0, 2); + + float noise_mask = large_turbulence * 0.4 + + medium_wisps * 0.3 + + small_detail * 0.2 + + fine_detail * 0.1; + + noise_mask = smoothstep(0.25, 0.75, noise_mask); + + float angle = atan2(pos.z, pos.x); + float rotated_angle = angle + sim.time * 0.5; + + float spiral_arms = sin(rotated_angle * 3.0 + r_norm * 15.0) * 0.15 + 0.85; + + float orbital_angle = angle + sim.time * keplerian_speed * 0.8; + float orbital_pattern = sin(orbital_angle * 2.0 + r_norm * 8.0) * 0.2 + 0.8; + + float density = vertical_falloff * radial_density * noise_mask * spiral_arms * orbital_pattern; + return density * disk.disk_density; +} + +struct Ray +{ + float x, y, z; + float r, theta, phi; + float dr, dtheta, dphi; + float E, L; +}; + +Ray InitRay(float3 pos, float3 dir) +{ + Ray ray; + ray.x = pos.x; + ray.y = pos.y; + ray.z = pos.z; + ray.r = length(pos); + ray.theta = acos(pos.z / ray.r); + ray.phi = atan2(pos.y, pos.x); + + float dx = dir.x; + float dy = dir.y; + float dz = dir.z; + + ray.dr = sin(ray.theta)*cos(ray.phi)*dx + + sin(ray.theta)*sin(ray.phi)*dy + + cos(ray.theta)*dz; + + ray.dtheta = (cos(ray.theta)*cos(ray.phi)*dx + + cos(ray.theta)*sin(ray.phi)*dy - + sin(ray.theta)*dz) / ray.r; + + ray.dphi = (-sin(ray.phi)*dx + cos(ray.phi)*dy) / + (ray.r * sin(ray.theta)); + + ray.L = ray.r * ray.r * sin(ray.theta) * ray.dphi; + float f = 1.0 - SagA_rs / ray.r; + float dt_dL = sqrt((ray.dr*ray.dr)/f + + ray.r*ray.r*(ray.dtheta*ray.dtheta + + sin(ray.theta)*sin(ray.theta)* + ray.dphi*ray.dphi)); + ray.E = f * dt_dL; + + return ray; +} + +bool Intercept(Ray ray, float rs) +{ + return ray.r <= rs; +} + +bool InterceptObject(Ray ray, inout Hit hit) +{ + float3 P = float3(ray.x, ray.y, ray.z); + + for (int i = 0; i < obj.numObjects; ++i) + { + float3 center = obj.objPosRadius[i].xyz; + float radius = obj.objPosRadius[i].w; + + float distSq = dot(P - center, P - center); + if (distSq > radius * radius * 4.0) + continue; + + if (distSq <= radius * radius) + { + hit.objectColor = obj.objColor[i]; + hit.hitCenter = center; + hit.hitRadius = radius; + return true; + } + } + + return false; +} + +void GeodesicRHS(Ray ray, out float3 d1, out float3 d2) +{ + float r = ray.r; + float theta = ray.theta; + float dr = ray.dr; + float dtheta = ray.dtheta; + float dphi = ray.dphi; + float f = 1.0 - SagA_rs / r; + float dt_dL = ray.E / f; + + d1 = float3(dr, dtheta, dphi); + d2.x = - (SagA_rs / (2.0 * r*r)) * f * dt_dL * dt_dL + + (SagA_rs / (2.0 * r*r * f)) * dr * dr + + r * (dtheta*dtheta + sin(theta)*sin(theta)*dphi*dphi); + d2.y = -2.0*dr*dtheta/r + sin(theta)*cos(theta)*dphi*dphi; + d2.z = -2.0*dr*dphi/r - 2.0*cos(theta)/(sin(theta)) * dtheta * dphi; +} + +void RK4Step(inout Ray ray, float dL) +{ + float3 k1a, k1b; + GeodesicRHS(ray, k1a, k1b); + + ray.r += dL * k1a.x; + ray.theta += dL * k1a.y; + ray.phi += dL * k1a.z; + ray.dr += dL * k1b.x; + ray.dtheta += dL * k1b.y; + ray.dphi += dL * k1b.z; + + ray.x = ray.r * sin(ray.theta) * cos(ray.phi); + ray.y = ray.r * sin(ray.theta) * sin(ray.phi); + ray.z = ray.r * cos(ray.theta); +} + +bool IsInDiskVolume(float3 pos) +{ + float r_cyl = length(float2(pos.x, pos.z)); + return (r_cyl >= disk.disk_r1 && r_cyl <= disk.disk_r2 && abs(pos.y) <= disk.thickness); +} + +float4 SampleDiskColor(float3 pos) +{ + float r_cyl = length(float2(pos.x, pos.z)); + float r_norm = (r_cyl - disk.disk_r1) / (disk.disk_r2 - disk.disk_r1); + + float3 innerColor = float3(1.0, 0.9, 0.5); + float3 midColor = float3(1.0, 0.6, 0.2); + float3 outerColor = float3(0.9, 0.3, 0.1); + + float3 baseColor; + if (r_norm < 0.5) + baseColor = lerp(innerColor, midColor, r_norm * 2.0); + else + baseColor = lerp(midColor, outerColor, (r_norm - 0.5) * 2.0); + + float r_norm_rot = (r_cyl - disk.disk_r1) / (disk.disk_r2 - disk.disk_r1); + float keplerian_speed = 1.0 / sqrt(r_norm_rot + 0.1); + + float color_rotation_angle = sim.time * keplerian_speed * 0.3; + float3 rotated_color_pos = float3( + pos.x * cos(color_rotation_angle) - pos.z * sin(color_rotation_angle), + pos.y, + pos.x * sin(color_rotation_angle) + pos.z * cos(color_rotation_angle) + ) * 1e-10; + + float large_color = fbm(rotated_color_pos * 1.8, 4); + float medium_color = fbm(rotated_color_pos * 4.0, 3); + float small_color = fbm(rotated_color_pos * 8.0, 2); + float colorVariation = (large_color * 0.5 + medium_color * 0.3 + small_color * 0.2) * 0.6; + baseColor = baseColor * (1.0 + colorVariation); + + float density = GetCloudDensity(pos); + + float brightness_rotation_angle = sim.time * keplerian_speed * 0.7; + float3 rotated_brightness_pos = float3( + pos.x * cos(brightness_rotation_angle) - pos.z * sin(brightness_rotation_angle), + pos.y, + pos.x * sin(brightness_rotation_angle) + pos.z * cos(brightness_rotation_angle) + ) * 1e-10; + + float brightness_large = fbm(rotated_brightness_pos * 3.0, 3); + float brightness_medium = fbm(rotated_brightness_pos * 5.0, 2); + float brightness_small = fbm(rotated_brightness_pos * 7.0, 2); + float brightness_noise = (brightness_large * 0.6 + brightness_medium * 0.3 + brightness_small * 0.1); + + float baseBrightness = 1.0 + density * 1.5; + float glowBrightness = brightness_noise * 0.8; + float brightness = baseBrightness + glowBrightness; + + return float4(baseColor * brightness, density); +} + +float CalculateAdaptiveStepSize(Ray ray, float baseStepSize) +{ + float r_factor = clamp(ray.r / (SagA_rs * 10.0), 0.1, 1.0); + float curvature = length(float3(ray.dr, ray.dtheta * ray.r, ray.dphi * ray.r * sin(ray.theta))); + float curvature_factor = clamp(1e12 / (curvature + 1e6), 0.1, 2.0); + + return clamp(baseStepSize * r_factor * curvature_factor, MIN_STEP_SIZE, MAX_STEP_SIZE); +} + +[shader("fragment")] +float4 fragmentMain(VSOutput input) : SV_Target +{ + float u = (2.0 * input.texCoord.x - 1.0) * cam.aspect * cam.tanHalfFov; + float v = (1.0 - 2.0 * input.texCoord.y) * cam.tanHalfFov; + float3 dir = normalize(u * cam.camRight - v * cam.camUp + cam.camForward); + Ray ray = InitRay(cam.camPos, dir); + + float4 color = float4(0.0, 0.0, 0.0, 0.0); + + bool hitBlackHole = false; + bool hitObject = false; + + Hit hit; + hit.objectColor = float4(0.0, 0.0, 0.0, 0.0); + hit.hitCenter = float3(0.0, 0.0, 0.0); + hit.hitRadius = 0.0; + + float4 accumulatedColor = float4(0.0, 0.0, 0.0, 0.0); + float transmittance = 1.0; + + int maxSteps = cam.moving ? sim.maxStepsMoving : sim.maxStepsStatic; + + if (maxSteps <= 0) + maxSteps = cam.moving ? DEFAULT_MAX_STEPS_MOVING : DEFAULT_MAX_STEPS_STATIC; + + float cameraDistance = length(cam.camPos); + if (cameraDistance > 2e12) + maxSteps = maxSteps / 2; + else if (cameraDistance > 1e12) + maxSteps = int(maxSteps * 0.75); + + float initialEscapeVelocity = sqrt(2.0 * SagA_rs / ray.r); + if (ray.dr > initialEscapeVelocity * 0.95 && + ray.r > SagA_rs * 200.0) + maxSteps = maxSteps / 2; + + float lambda = 0.0; + int objectCheckInterval = 5; + + for (int i = 0; i < maxSteps; ++i) + { + float exitDistance = sim.earlyExitDistance > 0.0 ? sim.earlyExitDistance : DEFAULT_EARLY_EXIT_DISTANCE; + if (ray.r > exitDistance) + break; + if (ray.r > ESCAPE_R) + break; + + if (Intercept(ray, SagA_rs)) + { + hitBlackHole = true; + break; + } + + float currentStepSize = CalculateAdaptiveStepSize(ray, D_LAMBDA); + + RK4Step(ray, currentStepSize); + lambda += currentStepSize; + + float3 newPos = float3(ray.x, ray.y, ray.z); + + if (IsInDiskVolume(newPos)) + { + float4 diskSample = SampleDiskColor(newPos); + float density = diskSample.a; + float3 diskColor = diskSample.rgb; + + float stepLength = currentStepSize * 1e-8; + + float absorption = density * stepLength * 0.8; + float scattering = density * stepLength * 1.5; + float extinction = absorption + scattering; + + float stepTransmittance = exp(-extinction); + + float3 emission = diskColor * density * stepLength * 4.0 * sqrt(disk.disk_density); + + float3 glowColor = lerp(diskColor, float3(1.0, 0.8, 0.6), 0.3); + float glowIntensity = density * stepLength * 2.0; + float3 atmosphericGlow = glowColor * glowIntensity * 0.8; + + float3 totalEmission = emission + atmosphericGlow; + accumulatedColor.rgb += totalEmission * transmittance; + + transmittance *= stepTransmittance; + + if (transmittance < 0.01) + { + accumulatedColor.a = 1.0 - transmittance; + break; + } + } + + if (i % objectCheckInterval == 0 && InterceptObject(ray, hit)) + { + hitObject = true; + break; + } + + if (ray.dr > 0.0 && ray.r > SagA_rs * 100.0 && lambda > 2e8) + break; + } + + accumulatedColor.a = 1.0 - transmittance; + + if (hitBlackHole) + { + color = float4(0.0, 0.0, 0.0, 1.0); + } + else if (hitObject) + { + float3 P = float3(ray.x, ray.y, ray.z); + float3 N = normalize(P - hit.hitCenter); + float3 V = normalize(cam.camPos - P); + + float ambient = 0.1; + float diff = max(dot(N, V), 0.0); + float intensity = ambient + (1.0 - ambient) * diff; + float3 shaded = hit.objectColor.rgb * intensity; + + color = float4(shaded, hit.objectColor.a); + color = lerp(accumulatedColor, color, color.a); + } + else + { + float3 rayDirection = normalize(float3(ray.x, ray.y, ray.z) - cam.camPos); + float3 hdriColor = SampleHDRI(rayDirection); + color = float4(lerp(accumulatedColor.rgb, hdriColor, 1.0 - accumulatedColor.a), 1.0); + } + + return color; +} diff --git a/assets/shaders/Grid.slang b/assets/shaders/Grid.slang new file mode 100644 index 0000000..ea7d263 --- /dev/null +++ b/assets/shaders/Grid.slang @@ -0,0 +1,34 @@ +uniform float4x4 u_ViewProjection; +uniform float4x4 u_Transform; +uniform float u_GridSize; + +struct VSInput { float3 position : POSITION; }; +struct VSOutput { float4 position : SV_Position; }; + +[shader("vertex")] +VSOutput vertexMain(VSInput input) +{ + VSOutput output; + float3 scaledPosition = input.position * (u_GridSize / 50.0); + output.position = mul(u_ViewProjection, mul(u_Transform, float4(scaledPosition, 1.0))); + return output; +} + +uniform float3 u_GridColor; +uniform float u_GridAlpha; +uniform float3 u_CameraPos; + +[shader("fragment")] +float4 fragmentMain(VSOutput input) : SV_Target +{ + float dist = length(u_CameraPos); + float fadeFactor = 1.0 - clamp(dist / 100.0, 0.0, 0.8); + + float3 color = u_GridColor; + float alpha = u_GridAlpha * fadeFactor; + + float gridFade = 1.0 - clamp(dist / 50.0, 0.0, 0.9); + alpha *= gridFade; + + return float4(color, alpha); +} diff --git a/assets/shaders/Skybox.slang b/assets/shaders/Skybox.slang new file mode 100644 index 0000000..6ba81bc --- /dev/null +++ b/assets/shaders/Skybox.slang @@ -0,0 +1,23 @@ +uniform float4x4 u_Projection; +uniform float4x4 u_View; + +struct VSInput { float3 position : POSITION; }; +struct VSOutput { float4 position : SV_Position; float3 texCoords : TEXCOORD0; }; + +[shader("vertex")] +VSOutput vertexMain(VSInput input) +{ + VSOutput output; + output.texCoords = input.position; + float4 pos = mul(u_Projection, mul(u_View, float4(input.position, 1.0))); + output.position = pos.xyww; // force depth = 1 so the skybox stays behind everything + return output; +} + +SamplerCube u_Skybox; + +[shader("fragment")] +float4 fragmentMain(VSOutput input) : SV_Target +{ + return u_Skybox.Sample(input.texCoords); +} diff --git a/assets/shaders/Sphere.slang b/assets/shaders/Sphere.slang new file mode 100644 index 0000000..0871438 --- /dev/null +++ b/assets/shaders/Sphere.slang @@ -0,0 +1,67 @@ +uniform float4x4 u_ViewProjection; +uniform float4x4 u_Transform; + +struct VSInput +{ + float3 position : POSITION; + float3 normal : NORMAL; +}; + +struct VSOutput +{ + float4 position : SV_Position; + float3 normal : TEXCOORD0; + float3 worldPos : TEXCOORD1; +}; + +[shader("vertex")] +VSOutput vertexMain(VSInput input) +{ + VSOutput output; + output.worldPos = mul(u_Transform, float4(input.position, 1.0)).xyz; + float3x3 normalMatrix = (float3x3)u_Transform; + output.normal = mul(normalMatrix, input.normal); + output.position = mul(u_ViewProjection, float4(output.worldPos, 1.0)); + return output; +} + +uniform float3 u_Color; +uniform float u_Specular; +uniform float u_Emission; +uniform float3 u_LightPos; +uniform float3 u_CameraPos; +uniform int u_IsSelected; +uniform float3 u_OutlineColor; +uniform float u_OutlineWidth; +SamplerCube u_HDRIEnvironment; + +[shader("fragment")] +float4 fragmentMain(VSOutput input) : SV_Target +{ + float3 normal = normalize(input.normal); + float3 lightDir = normalize(u_LightPos - input.worldPos); + float3 viewDir = normalize(u_CameraPos - input.worldPos); + float3 reflectDir = reflect(-lightDir, normal); + + float3 hdriLight = u_HDRIEnvironment.Sample(normal).rgb; + float hdriIntensity = 0.3; + + float diff = max(dot(normal, lightDir), 0.0); + float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32.0); + + float3 diffuse = u_Color * (diff + hdriIntensity * hdriLight); + float3 specular = float3(u_Specular, u_Specular, u_Specular) * spec; + float3 emission = u_Color * u_Emission; + + float3 result = diffuse + specular + emission; + + if (u_IsSelected > 0) + { + float ndotv = max(dot(normal, viewDir), 0.0); + float rim = 1.0 - ndotv; + float outlineMask = step(1.0 - u_OutlineWidth, rim); + result = lerp(result, u_OutlineColor, outlineMask); + } + + return float4(result, 1.0); +} diff --git a/assets/shaders/TexturedQuad.slang b/assets/shaders/TexturedQuad.slang new file mode 100644 index 0000000..52d46ed --- /dev/null +++ b/assets/shaders/TexturedQuad.slang @@ -0,0 +1,28 @@ +struct VSInput +{ + float2 position : POSITION; + float2 texCoord : TEXCOORD0; +}; + +struct VSOutput +{ + float4 position : SV_Position; + float2 texCoord : TEXCOORD0; +}; + +[shader("vertex")] +VSOutput vertexMain(VSInput input) +{ + VSOutput output; + output.position = float4(input.position, 0.0, 1.0); + output.texCoord = input.texCoord; + return output; +} + +Sampler2D u_ScreenTexture; + +[shader("fragment")] +float4 fragmentMain(VSOutput input) : SV_Target +{ + return u_ScreenTexture.Sample(input.texCoord); +} diff --git a/assets/shaders/VkPipelineTest.slang b/assets/shaders/VkPipelineTest.slang new file mode 100644 index 0000000..f4d1897 --- /dev/null +++ b/assets/shaders/VkPipelineTest.slang @@ -0,0 +1,25 @@ +// Minimal shader used only to verify the Vulkan graphics-pipeline path (SPIR-V +// module -> pipeline -> draw -> read-back). Draws a full-screen gradient +// triangle from the vertex id, so it needs no vertex buffer, UBO, or sampler. + +struct VSOutput +{ + float4 position : SV_Position; + float3 color : COLOR0; +}; + +[shader("vertex")] +VSOutput vertexMain(uint vid : SV_VertexID) +{ + float2 p = float2(float((vid << 1) & 2), float(vid & 2)); + VSOutput output; + output.position = float4(p * 2.0 - 1.0, 0.0, 1.0); + output.color = float3(p, 0.5); + return output; +} + +[shader("fragment")] +float4 fragmentMain(VSOutput input) : SV_Target +{ + return float4(input.color, 1.0); +} |
