summaryrefslogtreecommitdiff
path: root/tools/sky/build-stars.py
diff options
context:
space:
mode:
authorskylar <me@casper>2026-11-01 05:43:24 -0800
committerskylar <me@casper>2026-11-01 05:43:24 -0800
commite69ad01e700e80fa959dfee08cd556ca0d777ffd (patch)
tree645fc9db2142e87a5ef302733a77ba2fec848d88 /tools/sky/build-stars.py
Yesod: self-hosted WebXR rooms
Start a room in a world and hang out in VR from the headset's browser: A-Frame + Networked-A-Frame over EasyRTC, with a coturn relay that can hide everyone's IP address. Ships with the Campfire, Temple, Cabin, Balcony and Test room worlds. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'tools/sky/build-stars.py')
-rw-r--r--tools/sky/build-stars.py38
1 files changed, 38 insertions, 0 deletions
diff --git a/tools/sky/build-stars.py b/tools/sky/build-stars.py
new file mode 100644
index 0000000..061cea8
--- /dev/null
+++ b/tools/sky/build-stars.py
@@ -0,0 +1,38 @@
+#!/usr/bin/env python3
+# Packs the Yale Bright Star Catalog (5th ed.) into public/assets/sky/stars.bin
+# for the sky component: four little-endian float32s per star, right ascension
+# and declination (J2000, radians), V magnitude and B-V colour index.
+#
+# curl -O http://tdc-www.harvard.edu/catalogs/bsc5.dat.gz
+# python3 tools/sky/build-stars.py bsc5.dat.gz public/assets/sky/stars.bin
+#
+# Byte columns follow the catalog's ReadMe (CDS V/50).
+import gzip
+import math
+import struct
+import sys
+
+
+def main(src, dst):
+ opener = gzip.open if src.endswith('.gz') else open
+ stars = []
+ with opener(src, 'rt', encoding='ascii', errors='replace') as f:
+ for line in f:
+ line = line.rstrip('\n').ljust(197)
+ if not line[75:77].strip() or not line[102:107].strip():
+ continue # the 14 entries that turned out not to be stars
+ ra = (int(line[75:77]) + int(line[77:79]) / 60 + float(line[79:83]) / 3600) * 15
+ dec = int(line[84:86]) + int(line[86:88]) / 60 + int(line[88:90]) / 3600
+ if line[83] == '-':
+ dec = -dec
+ vmag = float(line[102:107])
+ bv = float(line[109:114]) if line[109:114].strip() else 0.6
+ stars.append((math.radians(ra), math.radians(dec), vmag, bv))
+ with open(dst, 'wb') as out:
+ for s in stars:
+ out.write(struct.pack('<4f', *s))
+ print(f'{len(stars)} stars, {min(s[2] for s in stars):.2f} to {max(s[2] for s in stars):.2f} mag -> {dst}')
+
+
+if __name__ == '__main__':
+ main(sys.argv[1], sys.argv[2])