aboutsummaryrefslogtreecommitdiff
path: root/assets
diff options
context:
space:
mode:
Diffstat (limited to 'assets')
-rw-r--r--assets/fonts/inter/Inter-Italic-VariableFont_opsz,wght.ttfbin0 -> 904532 bytes
-rw-r--r--assets/fonts/inter/Inter-VariableFont_opsz,wght.ttfbin0 -> 874708 bytes
-rw-r--r--assets/fonts/inter/OFL.txt93
-rw-r--r--assets/fonts/inter/README.txt118
-rw-r--r--assets/fonts/inter/static/Inter_18pt-Black.ttfbin0 -> 344820 bytes
-rw-r--r--assets/fonts/inter/static/Inter_18pt-BlackItalic.ttfbin0 -> 348712 bytes
-rw-r--r--assets/fonts/inter/static/Inter_18pt-Bold.ttfbin0 -> 344152 bytes
-rw-r--r--assets/fonts/inter/static/Inter_18pt-BoldItalic.ttfbin0 -> 348180 bytes
-rw-r--r--assets/fonts/inter/static/Inter_18pt-ExtraBold.ttfbin0 -> 345008 bytes
-rw-r--r--assets/fonts/inter/static/Inter_18pt-ExtraBoldItalic.ttfbin0 -> 349064 bytes
-rw-r--r--assets/fonts/inter/static/Inter_18pt-ExtraLight.ttfbin0 -> 343532 bytes
-rw-r--r--assets/fonts/inter/static/Inter_18pt-ExtraLightItalic.ttfbin0 -> 347452 bytes
-rw-r--r--assets/fonts/inter/static/Inter_18pt-Italic.ttfbin0 -> 346480 bytes
-rw-r--r--assets/fonts/inter/static/Inter_18pt-Light.ttfbin0 -> 343704 bytes
-rw-r--r--assets/fonts/inter/static/Inter_18pt-LightItalic.ttfbin0 -> 347316 bytes
-rw-r--r--assets/fonts/inter/static/Inter_18pt-Medium.ttfbin0 -> 343200 bytes
-rw-r--r--assets/fonts/inter/static/Inter_18pt-MediumItalic.ttfbin0 -> 346884 bytes
-rw-r--r--assets/fonts/inter/static/Inter_18pt-Regular.ttfbin0 -> 342680 bytes
-rw-r--r--assets/fonts/inter/static/Inter_18pt-SemiBold.ttfbin0 -> 343828 bytes
-rw-r--r--assets/fonts/inter/static/Inter_18pt-SemiBoldItalic.ttfbin0 -> 347760 bytes
-rw-r--r--assets/fonts/inter/static/Inter_18pt-Thin.ttfbin0 -> 343088 bytes
-rw-r--r--assets/fonts/inter/static/Inter_18pt-ThinItalic.ttfbin0 -> 346916 bytes
-rw-r--r--assets/fonts/inter/static/Inter_24pt-Black.ttfbin0 -> 344764 bytes
-rw-r--r--assets/fonts/inter/static/Inter_24pt-BlackItalic.ttfbin0 -> 348612 bytes
-rw-r--r--assets/fonts/inter/static/Inter_24pt-Bold.ttfbin0 -> 344028 bytes
-rw-r--r--assets/fonts/inter/static/Inter_24pt-BoldItalic.ttfbin0 -> 347948 bytes
-rw-r--r--assets/fonts/inter/static/Inter_24pt-ExtraBold.ttfbin0 -> 344800 bytes
-rw-r--r--assets/fonts/inter/static/Inter_24pt-ExtraBoldItalic.ttfbin0 -> 348896 bytes
-rw-r--r--assets/fonts/inter/static/Inter_24pt-ExtraLight.ttfbin0 -> 343516 bytes
-rw-r--r--assets/fonts/inter/static/Inter_24pt-ExtraLightItalic.ttfbin0 -> 347352 bytes
-rw-r--r--assets/fonts/inter/static/Inter_24pt-Italic.ttfbin0 -> 346580 bytes
-rw-r--r--assets/fonts/inter/static/Inter_24pt-Light.ttfbin0 -> 343440 bytes
-rw-r--r--assets/fonts/inter/static/Inter_24pt-LightItalic.ttfbin0 -> 347300 bytes
-rw-r--r--assets/fonts/inter/static/Inter_24pt-Medium.ttfbin0 -> 342936 bytes
-rw-r--r--assets/fonts/inter/static/Inter_24pt-MediumItalic.ttfbin0 -> 347000 bytes
-rw-r--r--assets/fonts/inter/static/Inter_24pt-Regular.ttfbin0 -> 342732 bytes
-rw-r--r--assets/fonts/inter/static/Inter_24pt-SemiBold.ttfbin0 -> 343640 bytes
-rw-r--r--assets/fonts/inter/static/Inter_24pt-SemiBoldItalic.ttfbin0 -> 347616 bytes
-rw-r--r--assets/fonts/inter/static/Inter_24pt-Thin.ttfbin0 -> 342944 bytes
-rw-r--r--assets/fonts/inter/static/Inter_24pt-ThinItalic.ttfbin0 -> 346976 bytes
-rw-r--r--assets/fonts/inter/static/Inter_28pt-Black.ttfbin0 -> 344676 bytes
-rw-r--r--assets/fonts/inter/static/Inter_28pt-BlackItalic.ttfbin0 -> 348608 bytes
-rw-r--r--assets/fonts/inter/static/Inter_28pt-Bold.ttfbin0 -> 343972 bytes
-rw-r--r--assets/fonts/inter/static/Inter_28pt-BoldItalic.ttfbin0 -> 348084 bytes
-rw-r--r--assets/fonts/inter/static/Inter_28pt-ExtraBold.ttfbin0 -> 344692 bytes
-rw-r--r--assets/fonts/inter/static/Inter_28pt-ExtraBoldItalic.ttfbin0 -> 348944 bytes
-rw-r--r--assets/fonts/inter/static/Inter_28pt-ExtraLight.ttfbin0 -> 343184 bytes
-rw-r--r--assets/fonts/inter/static/Inter_28pt-ExtraLightItalic.ttfbin0 -> 347268 bytes
-rw-r--r--assets/fonts/inter/static/Inter_28pt-Italic.ttfbin0 -> 346528 bytes
-rw-r--r--assets/fonts/inter/static/Inter_28pt-Light.ttfbin0 -> 343092 bytes
-rw-r--r--assets/fonts/inter/static/Inter_28pt-LightItalic.ttfbin0 -> 347092 bytes
-rw-r--r--assets/fonts/inter/static/Inter_28pt-Medium.ttfbin0 -> 342808 bytes
-rw-r--r--assets/fonts/inter/static/Inter_28pt-MediumItalic.ttfbin0 -> 346900 bytes
-rw-r--r--assets/fonts/inter/static/Inter_28pt-Regular.ttfbin0 -> 342484 bytes
-rw-r--r--assets/fonts/inter/static/Inter_28pt-SemiBold.ttfbin0 -> 343244 bytes
-rw-r--r--assets/fonts/inter/static/Inter_28pt-SemiBoldItalic.ttfbin0 -> 347380 bytes
-rw-r--r--assets/fonts/inter/static/Inter_28pt-Thin.ttfbin0 -> 342904 bytes
-rw-r--r--assets/fonts/inter/static/Inter_28pt-ThinItalic.ttfbin0 -> 346980 bytes
-rw-r--r--assets/hdri/HDR_blue_nebulae-1.hdrbin0 -> 62208386 bytes
-rw-r--r--assets/hdri/HDR_subdued_blue_nebulae.hdrbin0 -> 62041084 bytes
-rw-r--r--assets/hdri/HDR_subdued_multi_nebulae.hdrbin0 -> 64541302 bytes
-rw-r--r--assets/hdri/night_sky.hdrbin0 -> 51708063 bytes
-rw-r--r--assets/shaders/Blur.slang60
-rw-r--r--assets/shaders/EquirectToCubemap.slang33
-rw-r--r--assets/shaders/Geodesic.slang490
-rw-r--r--assets/shaders/Grid.slang34
-rw-r--r--assets/shaders/Skybox.slang23
-rw-r--r--assets/shaders/Sphere.slang67
-rw-r--r--assets/shaders/TexturedQuad.slang28
-rw-r--r--assets/shaders/VkPipelineTest.slang25
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
new file mode 100644
index 0000000..43ed4f5
--- /dev/null
+++ b/assets/fonts/inter/Inter-Italic-VariableFont_opsz,wght.ttf
Binary files differ
diff --git a/assets/fonts/inter/Inter-VariableFont_opsz,wght.ttf b/assets/fonts/inter/Inter-VariableFont_opsz,wght.ttf
new file mode 100644
index 0000000..e31b51e
--- /dev/null
+++ b/assets/fonts/inter/Inter-VariableFont_opsz,wght.ttf
Binary files differ
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
new file mode 100644
index 0000000..89673de
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_18pt-Black.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_18pt-BlackItalic.ttf b/assets/fonts/inter/static/Inter_18pt-BlackItalic.ttf
new file mode 100644
index 0000000..b33602f
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_18pt-BlackItalic.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_18pt-Bold.ttf b/assets/fonts/inter/static/Inter_18pt-Bold.ttf
new file mode 100644
index 0000000..cd13f60
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_18pt-Bold.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_18pt-BoldItalic.ttf b/assets/fonts/inter/static/Inter_18pt-BoldItalic.ttf
new file mode 100644
index 0000000..0d19c1a
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_18pt-BoldItalic.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_18pt-ExtraBold.ttf b/assets/fonts/inter/static/Inter_18pt-ExtraBold.ttf
new file mode 100644
index 0000000..e71c601
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_18pt-ExtraBold.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_18pt-ExtraBoldItalic.ttf b/assets/fonts/inter/static/Inter_18pt-ExtraBoldItalic.ttf
new file mode 100644
index 0000000..df45062
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_18pt-ExtraBoldItalic.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_18pt-ExtraLight.ttf b/assets/fonts/inter/static/Inter_18pt-ExtraLight.ttf
new file mode 100644
index 0000000..f9c6cfc
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_18pt-ExtraLight.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_18pt-ExtraLightItalic.ttf b/assets/fonts/inter/static/Inter_18pt-ExtraLightItalic.ttf
new file mode 100644
index 0000000..275f305
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_18pt-ExtraLightItalic.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_18pt-Italic.ttf b/assets/fonts/inter/static/Inter_18pt-Italic.ttf
new file mode 100644
index 0000000..14d3595
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_18pt-Italic.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_18pt-Light.ttf b/assets/fonts/inter/static/Inter_18pt-Light.ttf
new file mode 100644
index 0000000..acae361
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_18pt-Light.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_18pt-LightItalic.ttf b/assets/fonts/inter/static/Inter_18pt-LightItalic.ttf
new file mode 100644
index 0000000..f69e18b
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_18pt-LightItalic.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_18pt-Medium.ttf b/assets/fonts/inter/static/Inter_18pt-Medium.ttf
new file mode 100644
index 0000000..71d9017
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_18pt-Medium.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_18pt-MediumItalic.ttf b/assets/fonts/inter/static/Inter_18pt-MediumItalic.ttf
new file mode 100644
index 0000000..5c8c8b1
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_18pt-MediumItalic.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_18pt-Regular.ttf b/assets/fonts/inter/static/Inter_18pt-Regular.ttf
new file mode 100644
index 0000000..ce097c8
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_18pt-Regular.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_18pt-SemiBold.ttf b/assets/fonts/inter/static/Inter_18pt-SemiBold.ttf
new file mode 100644
index 0000000..053185e
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_18pt-SemiBold.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_18pt-SemiBoldItalic.ttf b/assets/fonts/inter/static/Inter_18pt-SemiBoldItalic.ttf
new file mode 100644
index 0000000..d9c9896
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_18pt-SemiBoldItalic.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_18pt-Thin.ttf b/assets/fonts/inter/static/Inter_18pt-Thin.ttf
new file mode 100644
index 0000000..e68ec47
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_18pt-Thin.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_18pt-ThinItalic.ttf b/assets/fonts/inter/static/Inter_18pt-ThinItalic.ttf
new file mode 100644
index 0000000..134e837
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_18pt-ThinItalic.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_24pt-Black.ttf b/assets/fonts/inter/static/Inter_24pt-Black.ttf
new file mode 100644
index 0000000..dbb1b3b
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_24pt-Black.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_24pt-BlackItalic.ttf b/assets/fonts/inter/static/Inter_24pt-BlackItalic.ttf
new file mode 100644
index 0000000..b89d61c
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_24pt-BlackItalic.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_24pt-Bold.ttf b/assets/fonts/inter/static/Inter_24pt-Bold.ttf
new file mode 100644
index 0000000..46b3583
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_24pt-Bold.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_24pt-BoldItalic.ttf b/assets/fonts/inter/static/Inter_24pt-BoldItalic.ttf
new file mode 100644
index 0000000..d1c0f53
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_24pt-BoldItalic.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_24pt-ExtraBold.ttf b/assets/fonts/inter/static/Inter_24pt-ExtraBold.ttf
new file mode 100644
index 0000000..b775c08
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_24pt-ExtraBold.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_24pt-ExtraBoldItalic.ttf b/assets/fonts/inter/static/Inter_24pt-ExtraBoldItalic.ttf
new file mode 100644
index 0000000..3461a92
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_24pt-ExtraBoldItalic.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_24pt-ExtraLight.ttf b/assets/fonts/inter/static/Inter_24pt-ExtraLight.ttf
new file mode 100644
index 0000000..2ec6ca3
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_24pt-ExtraLight.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_24pt-ExtraLightItalic.ttf b/assets/fonts/inter/static/Inter_24pt-ExtraLightItalic.ttf
new file mode 100644
index 0000000..c634a5d
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_24pt-ExtraLightItalic.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_24pt-Italic.ttf b/assets/fonts/inter/static/Inter_24pt-Italic.ttf
new file mode 100644
index 0000000..1048b07
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_24pt-Italic.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_24pt-Light.ttf b/assets/fonts/inter/static/Inter_24pt-Light.ttf
new file mode 100644
index 0000000..1a2a6f2
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_24pt-Light.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_24pt-LightItalic.ttf b/assets/fonts/inter/static/Inter_24pt-LightItalic.ttf
new file mode 100644
index 0000000..ded5a75
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_24pt-LightItalic.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_24pt-Medium.ttf b/assets/fonts/inter/static/Inter_24pt-Medium.ttf
new file mode 100644
index 0000000..5c88739
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_24pt-Medium.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_24pt-MediumItalic.ttf b/assets/fonts/inter/static/Inter_24pt-MediumItalic.ttf
new file mode 100644
index 0000000..be091b1
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_24pt-MediumItalic.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_24pt-Regular.ttf b/assets/fonts/inter/static/Inter_24pt-Regular.ttf
new file mode 100644
index 0000000..6b088a7
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_24pt-Regular.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_24pt-SemiBold.ttf b/assets/fonts/inter/static/Inter_24pt-SemiBold.ttf
new file mode 100644
index 0000000..ceb8576
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_24pt-SemiBold.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_24pt-SemiBoldItalic.ttf b/assets/fonts/inter/static/Inter_24pt-SemiBoldItalic.ttf
new file mode 100644
index 0000000..6921df2
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_24pt-SemiBoldItalic.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_24pt-Thin.ttf b/assets/fonts/inter/static/Inter_24pt-Thin.ttf
new file mode 100644
index 0000000..3505b35
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_24pt-Thin.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_24pt-ThinItalic.ttf b/assets/fonts/inter/static/Inter_24pt-ThinItalic.ttf
new file mode 100644
index 0000000..a3e6feb
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_24pt-ThinItalic.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_28pt-Black.ttf b/assets/fonts/inter/static/Inter_28pt-Black.ttf
new file mode 100644
index 0000000..66a252f
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_28pt-Black.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_28pt-BlackItalic.ttf b/assets/fonts/inter/static/Inter_28pt-BlackItalic.ttf
new file mode 100644
index 0000000..3c8fdf9
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_28pt-BlackItalic.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_28pt-Bold.ttf b/assets/fonts/inter/static/Inter_28pt-Bold.ttf
new file mode 100644
index 0000000..d17828b
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_28pt-Bold.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_28pt-BoldItalic.ttf b/assets/fonts/inter/static/Inter_28pt-BoldItalic.ttf
new file mode 100644
index 0000000..6fce50a
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_28pt-BoldItalic.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_28pt-ExtraBold.ttf b/assets/fonts/inter/static/Inter_28pt-ExtraBold.ttf
new file mode 100644
index 0000000..6d87cae
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_28pt-ExtraBold.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_28pt-ExtraBoldItalic.ttf b/assets/fonts/inter/static/Inter_28pt-ExtraBoldItalic.ttf
new file mode 100644
index 0000000..1a56735
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_28pt-ExtraBoldItalic.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_28pt-ExtraLight.ttf b/assets/fonts/inter/static/Inter_28pt-ExtraLight.ttf
new file mode 100644
index 0000000..d42b3f5
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_28pt-ExtraLight.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_28pt-ExtraLightItalic.ttf b/assets/fonts/inter/static/Inter_28pt-ExtraLightItalic.ttf
new file mode 100644
index 0000000..90e2f20
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_28pt-ExtraLightItalic.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_28pt-Italic.ttf b/assets/fonts/inter/static/Inter_28pt-Italic.ttf
new file mode 100644
index 0000000..c2a143a
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_28pt-Italic.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_28pt-Light.ttf b/assets/fonts/inter/static/Inter_28pt-Light.ttf
new file mode 100644
index 0000000..5eeff3a
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_28pt-Light.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_28pt-LightItalic.ttf b/assets/fonts/inter/static/Inter_28pt-LightItalic.ttf
new file mode 100644
index 0000000..6b90b76
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_28pt-LightItalic.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_28pt-Medium.ttf b/assets/fonts/inter/static/Inter_28pt-Medium.ttf
new file mode 100644
index 0000000..00120fe
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_28pt-Medium.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_28pt-MediumItalic.ttf b/assets/fonts/inter/static/Inter_28pt-MediumItalic.ttf
new file mode 100644
index 0000000..7481e7b
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_28pt-MediumItalic.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_28pt-Regular.ttf b/assets/fonts/inter/static/Inter_28pt-Regular.ttf
new file mode 100644
index 0000000..855b6f4
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_28pt-Regular.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_28pt-SemiBold.ttf b/assets/fonts/inter/static/Inter_28pt-SemiBold.ttf
new file mode 100644
index 0000000..8b84efc
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_28pt-SemiBold.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_28pt-SemiBoldItalic.ttf b/assets/fonts/inter/static/Inter_28pt-SemiBoldItalic.ttf
new file mode 100644
index 0000000..2e22c5a
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_28pt-SemiBoldItalic.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_28pt-Thin.ttf b/assets/fonts/inter/static/Inter_28pt-Thin.ttf
new file mode 100644
index 0000000..94e6108
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_28pt-Thin.ttf
Binary files differ
diff --git a/assets/fonts/inter/static/Inter_28pt-ThinItalic.ttf b/assets/fonts/inter/static/Inter_28pt-ThinItalic.ttf
new file mode 100644
index 0000000..d3d44cd
--- /dev/null
+++ b/assets/fonts/inter/static/Inter_28pt-ThinItalic.ttf
Binary files differ
diff --git a/assets/hdri/HDR_blue_nebulae-1.hdr b/assets/hdri/HDR_blue_nebulae-1.hdr
new file mode 100644
index 0000000..f34b25d
--- /dev/null
+++ b/assets/hdri/HDR_blue_nebulae-1.hdr
Binary files differ
diff --git a/assets/hdri/HDR_subdued_blue_nebulae.hdr b/assets/hdri/HDR_subdued_blue_nebulae.hdr
new file mode 100644
index 0000000..ea34298
--- /dev/null
+++ b/assets/hdri/HDR_subdued_blue_nebulae.hdr
Binary files differ
diff --git a/assets/hdri/HDR_subdued_multi_nebulae.hdr b/assets/hdri/HDR_subdued_multi_nebulae.hdr
new file mode 100644
index 0000000..da88396
--- /dev/null
+++ b/assets/hdri/HDR_subdued_multi_nebulae.hdr
Binary files differ
diff --git a/assets/hdri/night_sky.hdr b/assets/hdri/night_sky.hdr
new file mode 100644
index 0000000..b473659
--- /dev/null
+++ b/assets/hdri/night_sky.hdr
Binary files differ
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);
+}