AstroViewer Version Archive
INFORMATION
Die nachfolgende Liste enthält Informationen zu allen älteren archivierten Versionen des AstroViewers.
VERSION HISTORY ARCHIVE
- Fix (Audio Lock): Wurde der Lock manuell deaktiviert während ein Track lief, lief der Track im Loop weiter und startete nach Ende immer wieder von vorne. Ursache:
el.loop wurde beim manuellen Lock-Aus nicht auf false gesetzt. Ab jetzt stoppt manuelles Lock-Aus den Loop und registriert einen ended-Handler, der nach Song-Ende den aktuellen Kontext (z.B. das inzwischen angeklickte Objekt B) neu triggert – oder nichts spielt, falls kein passender Track gefunden wird.
- Fix (Audio Track-Titel weg, V9.84):
onFocusCleared rief intern onSystemChanged auf, welches _currentContext ein zweites Mal überschrieb und bei fehlendem System-Track _stopAll() auslöste – dadurch wurde der Titel-Display geleert obwohl ein anderes Objekt fokussiert war. onFocusCleared führt die Track-Suche jetzt direkt durch ohne onSystemChanged zu delegieren.
- Fix (Audio Auto-Lock, V9.83):
_currentContext wurde in onSystemChanged, onObjectFocused und onFocusCleared erst nach dem Lock/Enabled-Check aktualisiert. Bei Kontext-Wechseln während ein Lock-Track lief blieb so der alte Kontext erhalten, sodass nach Song-Ende derselbe Song erneut startete statt dem zum neuen Kontext passenden Track. Alle drei Funktionen setzen _currentContext jetzt als erstes, unabhängig von Lock- oder Enabled-Zustand.
- Fix (Audio Auto-Lock): Nach Song-Ende wurde derselbe Song erneut gestartet statt dem nächsten passenden Track. Ursache war, dass
_audioEl und _currentURL noch gesetzt waren, sodass _switchTo die gleiche URL als "bereits laufend" erkannte. Beide werden jetzt vor dem Kontext-Aufruf genullt.
- Fix (Hover Name-Tag, V9.81):
getInfoTgt/2/3 wurde in init.js nicht an registerOverviewContext weitergeleitet, sodass overview.js immer null erhielt und der Tag trotzdem erschien. Jetzt korrekt durchgereicht.
- Fix (Hover Name-Tag): Tag erscheint nicht mehr wenn das gehoverte Objekt bereits in einem der drei Info-Panels angezeigt wird. Wird ein anderes Objekt gehovered, erscheint der Tag wie gewohnt.
- Fix (Hover Name-Tag, V9.79): Tag und Führungslinie liegen jetzt auf z-index 21 (über allen Labels und Panels). Hintergrundfarbe exakt wie die Info-Panels (
rgba(17,60,30,0.78)). Mindestbreite 120px damit der Tag auch bei kurzen Namen eine angemessene Größe hat.
- Fix/Redesign (Hover Name-Tag, V9.78): Tag ist jetzt ein HTML-div mit identischem Stil wie die Info-Panels (grüner Rand, dunkler Hintergrund, Blur). Führungslinie nutzt denselben Stil wie die anderen Leader-Linien (grün, 1.5px, gestrichelt, Punkt am Objekt) und dockt wie diese am nächsten Panel-Rand an statt an einer Ecke. Randbehandlung: Tag spiegelt nach links/unten wenn er über den Bildschirmrand gehen würde.
- Neu (Hover Name-Tag): Beim Hovern über ein Objekt in der Systemansicht erscheint oben-rechts ein halbtransparenter Name-Tag mit dem Objektnamen (fett) und dem Typ (z.B. Planet, Mond, Stern) in Grün. Eine gestrichelte Verbindungslinie mit Eckpunkt-Marker verbindet den Hover-Kreis mit dem Tag. Der Tag blendet sich mit dem Hover-Kreis ein und aus und ist vollständig lokalisiert (DE/EN).
- Refactor (Geschwindigkeits-Defaults, V9.75/76):
DEFAULT_SPEED_IDX, DEFAULT_MOON_IDX, DEFAULT_ROT_IDX und DEFAULT_CAM_IDX sind jetzt als exportierte Konstanten in state.js definiert — der einzigen Stelle im Projekt. recorder.js, controls.js und init.js importieren sie direkt; astroviewer.html erweitert seinen bestehenden state.js-Import. Alle Fallback-Zahlen in Context-Objekten sind damit eliminiert.
- Fix (Geschwindigkeits-Defaults, V9.75):
state.js initialisierte die Speed-Indizes weiterhin mit hardcodierten Zahlen. Da state.js keine Imports kennt, werden die Indizes dort jetzt als null deklariert und unmittelbar nach der Konstantendefinition in astroviewer.html auf die DEFAULT_*-Werte gesetzt — eine einzige definierte Stelle.
- Refactor (Geschwindigkeits-Defaults): Die Standardgeschwindigkeit für Orbital-, Mond- und Achsenrotation wurde von 1× auf 0,25× gesenkt; die Kamerageschwindigkeit bleibt bei 1×. Alle Default-Indizes sind jetzt als benannte Konstanten (
DEFAULT_SPEED_IDX, DEFAULT_MOON_IDX, DEFAULT_ROT_IDX, DEFAULT_CAM_IDX) in einer einzigen Stelle definiert und werden per Context-Getter an alle abhängigen Module (Recorder, Controls, Init) weitergereicht — hardcodierte Zahlenvergleiche im Code sind damit eliminiert.
- Erweiterung (Geschwindigkeitsskalen): Alle vier Geschwindigkeitsregler (Orbital, Mond, Achsenrotation, Kamera) haben jetzt 10 statt 8 Stufen. Am unteren Ende wurden zwei neue Langsamkeitstufen ergänzt (0,01× und 0,05× für Orbital/Mond/Achse; 0,02× und 0,05× für Kamera), sodass auch schnelle Monde und Rotationen angenehm beobachtbar sind. Der Hover-Slowmo schaltet ebenfalls auf die neue niedrigste Stufe (0,01×). Die Defaultgeschwindigkeit bleibt 1×, alle anderen Einstellungen bleiben unverändert. Achtung: bestehende Recorder-Scripts mit
set-speed/set-moonspeed/set-rotspeed/set-camspeed-Aktionen müssen die übergebenen Indizes um 2 erhöhen, um denselben Wert wie bisher zu erzielen.
- Fix (Achsenrotations-Slider, V9.72): Slider zeigte beim erneuten Öffnen immer 1× statt des zuletzt gesetzten Werts. Ursache:
init.js baut den Controls-Context und den Recorder-Context explizit zusammen — getRotSpeedIdx, setRotSpeedIdx und getRotSpeeds fehlten in beiden Übergaben, sodass der Slider immer den Fallback-Wert (Index 3) las.
- Neu (Achsenrotationsgeschwindigkeit): Eigener Geschwindigkeitsregler für die Eigenrotation aller Objekte (Sterne, Planeten, Monde, Zwerge). Neuer Button mit eigenem Icon (Kreis mit gestrichelter Rotationsachse und Pfeil) im Geschwindigkeiten-Panel, direkt neben den beiden bestehenden Speed-Slidern. Startet bei 1×, ist im Overview deaktiviert und wird während Playback mit gesperrt. Die Achsenrotation läuft jetzt vollständig unabhängig von Orbital- und Mondgeschwindigkeit.
- Recorder/Playback:
set-rotspeed-Aktion wird im State-Snapshot erfasst und bei Abweichung vom Default (Index 3 = 1×) ins Script geschrieben.
- Refactor (Datenstruktur, Binärsterne):
orbit.r enthält jetzt bei allen Sternen immer den echten astronomischen Wert in AU. Für Binärsterne mit visuell platzierten Orbits wurde das neue Feld orbit.visualR eingeführt, das die bisherige Szeneneinheit speichert — _noRescale entfällt damit ersatzlos. builder.js erkennt visualR automatisch und verwendet es als Renderer-Radius; orbit.r (AU) wird zusätzlich als orbit.visualAU gesichert. compare.js greift für die Distanzberechnung nun auf visualAU bzw. _rawR zu und ignoriert den visuellen Renderer-Radius.
- Daten (31 Binärstern-Einträge): Echte Halbachsen vom Baryzentrum (AU) aus Literatur/Kepler eingetragen für alle betroffenen Systeme: Alpha Centauri, Luhman 16, Sirius, Luyten 718 (BL/UV Ceti), EZ Aquarii, SCR 1845, Kruger 60, Ross 614, Wolf 424, GJ 1245, Gliese 412, Keid (40 Eridani), GJ 1116, 70 Ophiuchi.
- Fix (Overview, Text-Selektion): Texte in der Übersicht (Sternbezeichnungen, Distanz-Labels, Verbindungslinien-Beschriftungen) waren per Maus oder Strg+A markierbar. Behoben durch globales
user-select: none auf html/body in der CSS sowie explizites user-select: none auf allen dynamisch erzeugten Distanz-Labels im Overview.
- Revert (Overview + Vergleichsmodus, Stern-Halos): V9.68 hat die manuelle Billboard-Funktion mit
camera.up-basierter Basis-Matrix eingebaut — das erzeugte neue Artefakte (Sicheln, halbierte Helligkeit, verschwundene Strahlen). Vollständig zurückgerollt auf lookAt(camera.position) aus V9.65. Die leichte Schrägstellung der Halos bei Objekten weit außerhalb der Bildmitte bleibt vorerst bestehen — das ist ein subtiles perspektivisches Problem das einen anderen Ansatz erfordert.
- Fix (Overview + Vergleichsmodus, Stern-Halos gekippt): Die Glow-Planes wurden mit
lookAt(camera.position) zur Kamera ausgerichtet, was intern immer (0,1,0) als Up-Vektor verwendet. Bei einer gerollten Kamera (rollAngle ≠ 0 oder durch Benutzerrotation) weicht dieser fest kodierte Up-Vektor vom echten Camera-Up ab — die Planes kippen sichtbar zur Seite. Behoben durch eine manuelle Billboard-Funktion die camera.up als Referenz verwendet: Richtungsvektor Kamera→Plane, dann Cross-Produkt mit camera.up für Right, dann nochmals Cross für korrekte Up-Richtung, daraus eine Rotationsmatrix die als Quaternion auf die Plane angewendet wird. Keine GC-Druckerhöhung — alle Hilfsvektoren als Modul-Variablen vorallokiert.
- Revert (Overview + Vergleichsmodus, Stern-Halos): V9.66 hatte die Billboard-Ausrichtung auf
quaternion.copy(camera.quaternion) umgestellt, was die Sichel-Artefakte zurückbrachte. Zurück auf lookAt(camera.position) — das war die korrekte Lösung. Das beobachtete "Kippen" war kein separater Bug, sondern dieselbe Erscheinung unter anderen Blickwinkeln.
- Fix (Overview, Stern-Halos): Die Glow-Planes waren nach dem Billboard-Fix zur Sichel-Behebung mit
lookAt(camera.position) ausgerichtet — das richtet die Plane zwar zur Kamera, orientiert sie aber nach dem festen Up-Vektor (0,1,0). Bei rotierter Kamera kippt die Plane dadurch sichtbar zur Seite. Umgestellt auf quaternion.copy(camera.quaternion), das die Plane immer exakt parallel zur Kameraebene hält (identisch zum Crosshair-Update).
- Fix (Vergleichsmodus, Stern-Halos): Gleicher Fix für die Glow/Flare-Planes im Compare-Modus.
- Fix (Alle Modi): Titeltext und Vergleichsmodusüberschrift waren per Maus/Touch markierbar.
user-select: none jetzt auf #viewtitle in der CSS und auf den Compare-Titel-Elementen gesetzt.
- Fix (Vergleichsmodus, Sichel-Artefakte): Glow- und Flare-Sprites der Sterne verwendeten
THREE.Sprite, das intern die View-Matrix direkt als Billboard nutzt. Bei weit außerhalb der Bildmitte liegenden Objekten stimmt diese Ausrichtung nicht mit der Kameraperspektive überein und erzeugt Sichel-/Halbmond-Artefakte. Umgestellt auf PlaneGeometry + MeshBasicMaterial mit manuellem lookAt(_cmpCamera.position) pro Frame im Animate-Loop — identisch zur Lösung in builder.js/animate.js für den System-View. Alle Sprites (Inner/Mid/Outer-Glow, Surface-Glow auf Mobile, Starburst/Halo-Flares) werden jetzt direkt in der Szene (nicht im Pivot-Child) geführt.
- Fix (Vergleichsmodus, Streifen-Artefakte): Wenn die Objekte weit auseinandergezogen wurden, erschienen horizontale Lichtstreifen und dunkle Clipping-Ränder an den Stern-Glows. Ursache war
premultipliedAlpha: true (WebGL-Default) am Compare-Renderer in Kombination mit AdditiveBlending-Sprites die den Viewport-Rand kreuzten. Fix: premultipliedAlpha: false am Compare-Renderer gesetzt, identisch zur Lösung in scene.js; zusätzlich autoClear-Flags explizit gesetzt.
- Fix (Vergleichsmodus, Sichel-Artefakte): Die Glow-Sprites der Sterne (Inner/Mid/Outer-Glow, Surface-Glow auf Mobile) zeigten am Bildrand Sichel-Artefakte, identisch zum bereits behobenen Problem im System-View und Overview. Ursache: Die DataTexture für die Glow-Sprites hatte
premultiplyAlpha nicht explizit deaktiviert — der WebGL-Compositor premultiplizierte die Alphawerte ein zweites Mal. Fix: tex.premultiplyAlpha = false jetzt auch in makeGlowSprite() in compare.js gesetzt, konsistent mit der Lösung in builder.js.
- Fix (Vergleichsmodus, Distanz-Slider): Ohne aktiven Fokus sprangen Objekte beim Vergrößern des Abstands aus dem Bild. Ursache: Der Zoom blieb auf dem Initialwert, obwohl die Objekte weiter auseinander rückten. Behoben: der Zoom wird jetzt proportional zum Distanzfaktor per sanftem Lerp angepasst, sodass beide Objekte immer sichtbar bleiben.
- Fix (Vergleichsmodus, Mindestabstand): Der Faktor-basierte Mindestabstand konnte durch die diskrete Slider-Stufung bei nahezu gleich großen Objekten minimal unterschritten werden. Zweiter harter Clamp direkt in Weltkoordinaten eingebaut: der Abstand der Mittelpunkte wird nach der Faktor-Berechnung nochmals geprüft und kann nie kleiner als
(rSmall + rBig) × 1.08 werden.
- Fix (Vergleichsmodus, Distanz-Slider): War ein Objekt per Klick auf sein Label fokussiert und man veränderte danach den Abstand, verschwand das fokussierte Objekt aus dem Bild — die Kamera blieb auf der alten Position stehen. Behoben: beim Verschieben der Objekte wird
cmpTargetLookAt und cmpLookAt sofort mitgeführt.
- Fix (Vergleichsmodus, Mindestabstand): Der Überlappungsschutz (2% Puffer) war bei nahezu gleich großen Objekten (z.B. Jupiter + Saturn, Radienverhältnis ~0.83) zu knapp und ließ minimale Überlappungen zu. Puffer auf 8% erhöht.
- Bekannt (Vergleichsmodus): Beim allerersten Betreten des Vergleichsmodus können selten Textur-Artefakte (Pixelblöcke) auf einem Stern auftreten. Nicht reproduzierbar — vermutlich ein Timing-Problem beim ersten GPU-Textur-Upload. Wird weiter beobachtet.
- Fix (Vergleichsmodus, Distanz-Slider): Das Minimum des Abstands-Sliders war ein fixer Faktor (0.3×) und verhinderte nicht, dass Objekte ineinander geschoben wurden – bei sehr unterschiedlichen Größen (z.B. Erde in die Sonne) war das besonders deutlich sichtbar. Das Minimum wird jetzt dynamisch berechnet: es entspricht genau dem Abstand, bei dem sich die Oberflächen der beiden Objekte gerade berühren (Summe der Radien + 2% Puffer), und passt sich damit automatisch an jede Objektkombination an.
- Fix (Vergleichsmodus, Distanz-Button): Der neue Distanz-Button war im Compare-Modus deaktiviert, weil er nicht in der Allowlist der erlaubten Buttons stand. Behoben.
- Fix (Vergleichsmodus, Distanz-Button): Button fehlte die Klasse
slider-toggle-btn, wodurch openSlider ihn weder finden noch als aktiv markieren konnte. Behoben.
- Neu (Lokalisierung): Neue Texte für Distanz-Button-Tooltip und Slider-Label in DE und EN in
languages.json eingetragen.
- Neu (Vergleichsmodus, Bedienfeld): Im aktiven Vergleichsmodus wird der Compare-Button ausgeblendet und stattdessen ein neuer Distanz-Button (Doppelpfeil-Icon) eingeblendet.
- Neu (Vergleichsmodus, Distanz-Slider): Der Distanz-Button öffnet einen Slider, mit dem der visuelle Abstand zwischen den zwei verglichenen Objekten verkleinert oder vergrößert werden kann (Faktor 0.3× bis 2.0×, Standard 1.0×). Die Objekte werden dabei live verschoben, ohne die Szene neu aufzubauen.
- Neu (Script-Aktionen):
set-compare-distance (mit Parameter factor) sowie open-slider/hide-slider mit Typ compare-distance sind als Script-Befehle verfügbar. Alle drei tun nichts, wenn der Vergleichsmodus nicht aktiv ist.
- Fix (Vergleichsmodus, Objektliste): Die Objektliste wurde beim Betreten und Verlassen des Vergleichsmodus nicht neu aufgebaut. War sie bereits offen, zeigte sie beim Betreten weiterhin den vorherigen Inhalt (z.B. Overview-Sterne statt der zwei Vergleichsobjekte) und beim Verlassen den veralteten Compare-Inhalt. Behoben durch expliziten Refresh-Aufruf bei Modus-Wechsel in beide Richtungen.
- Fix (Vergleichsmodus, Labels): Die Namensschilder der zwei verglichenen Objekte wurden per CSS-Eigenschaften
left/top positioniert, was bei schnellen Kamerabewegungen einen Layout-Reflow auslöste und zu sichtbarem Lag/Springen führte. Umstellung auf transform: translate() mit numerischem Dirty-Check (analog zur übrigen Label-Logik) – die Panels werden jetzt GPU-composited verschoben und folgen der Kamera ohne Verzögerung.
- Fix (Vergleichsmodus, Bedienfeld): Der „Steuerungspanel ein/aus"-Schalter ließ sich zwar antippen, das Ergebnis war aber unsichtbar, da eine andere Bedienleisten-Anpassung die Positionsberechnung nicht neu ausgelöst hat. Behoben.
- Neu (Vergleichsmodus): Die Objektliste zeigt jetzt nur die beiden verglichenen Objekte zur Auswahl an; Doppelklick bzw. Doppel-Tap wählt das Objekt aus, genau wie ein Klick auf sein Namensschild.
- Fix (Vergleichsmodus, Sprachumschaltung): Die Namensschilder, das Distanz-Label und der Titel wurden bei einem Sprachwechsel nicht aktualisiert. Werden jetzt korrekt neu übersetzt.
- Neu (Vergleichsmodus): Der Schalter zum Ein-/Ausblenden des Bedienfelds funktioniert jetzt auch im Vergleichsmodus, inklusive des kleinen Wiederherstellen-Buttons oben, falls das Bedienfeld ausgeblendet wurde.
- Anpassung (Vergleichsmodus): Die Buttons oben (Bedienfeld wiederherstellen, Hilfe, Objektliste, Sprache) sind jetzt wie in den anderen Ansichten aktiv, sitzen aber etwas weiter unten, damit sie nicht mit dem zweizeiligen Vergleichs-Titel überlappen.
- Neu (Vergleichsmodus): Der Orbits-Schalter ist jetzt auch im Vergleichsmodus nutzbar und blendet dort die Distanz-Verbindungslinie ein/aus.
- Neu (Vergleichsmodus): Der Labels-Schalter ist jetzt auch im Vergleichsmodus nutzbar und blendet dort die beiden Namensschilder der Objekte ein/aus.
- Beide Schalter starten im Vergleichsmodus mit dem zuletzt gewählten globalen Zustand, genau wie in den anderen Ansichten.
- Fix (Vergleichsmodus, Screenshot): Die halbtransparenten Hintergrund-Rahmen hinter den Objekt- und Distanz-Beschriftungen fehlten auf dem Bild, sind jetzt mit dabei.
- Neu (Vergleichsmodus): Lautstärke-Regler und Titel-Sperre für die Musik sind jetzt auch im Vergleichsmodus nutzbar, ebenso wird die Songtitel-Anzeige jetzt korrekt angezeigt (vorher unsichtbar hinter der Vergleichsansicht).
- Fix (Vergleichsmodus, Screenshot): Die gestrichelte Distanz-Verbindungslinie zwischen den beiden Objekten fehlte auf dem Screenshot, ist jetzt mit dabei.
- Anpassung (Vergleichsmodus, Bedienfeld): Der neue Verlassen-Schalter ersetzt jetzt direkt den (im Vergleichsmodus ohnehin ausgeblendeten) „Zurück zur Übersicht"/„Zum System"-Schalter an dessen Platz, statt daneben zu stehen.
- Neu (Vergleichsmodus): Der Leuchtkraft-Regler ist jetzt auch im Vergleichsmodus nutzbar und hellt bzw. dunkelt verglichene Sterne (Glow, Licht, Oberfläche) genau wie in Übersicht und Systemansicht ab.
- Fix (Vergleichsmodus, Screenshot): Erkennung des Vergleichsmodus robuster gemacht, damit der Screenshot zuverlässig die Vergleichsansicht statt der vorherigen Ansicht abbildet.
- Fix (Vergleichsmodus, Info-Panel): Eine per Drag verschobene Position des Vergleichs-Infopanels ging beim Wechsel des fokussierten Objekts verloren, das Panel sprang dann immer wieder auf die Standardposition zurück. Position bleibt jetzt erhalten.
- Anpassung (Vergleichsmodus): Der kleine Zurück-Pfeil oben neben dem Titel wurde entfernt. Stattdessen gibt es jetzt im Bedienfeld, an derselben Stelle wie der reguläre „Zurück zur Übersicht"/„Zum System"-Schalter, einen Schalter zum Verlassen des Vergleichsmodus, der korrekt zur Herkunftsansicht (Übersicht oder Systemansicht) zurückkehrt.
- Fix (Vergleichsmodus, Screenshot): Der Screenshot-Button erzeugte bisher ein Bild der Ansicht, aus der man in den Vergleichsmodus gewechselt war, statt des Vergleichs selbst. Zeigt jetzt korrekt die Vergleichsszene inklusive Objekt-Beschriftungen.
- Fix (Vergleichsmodus, Zoom-Regler): Der Zoom-Regler im Bedienfeld öffnete sich zwar, lag aber unsichtbar hinter der Vergleichsansicht. Ist jetzt sichtbar und nutzbar.
- Anpassung (Vergleichsmodus): Das eigens gebaute Mini-Bedienfeld wurde wieder entfernt. Stattdessen wird jetzt das normale Bedienfeld angezeigt, darin aber bis auf Vollbild, Screenshot und Zoom alles deaktiviert, da die übrigen Funktionen im Vergleichsmodus keine Bedeutung haben.
- Anpassung (Vergleichsmodus, Objekt-Labels): Die beiden anklickbaren Objekt-Labels sitzen jetzt direkt unter dem jeweiligen Objekt statt an einer festen Position links/rechts unten – dadurch keine Überschneidung mehr mit dem Bedienfeld.
- Anpassung (Aufnahme/Wiedergabe): Der Zoom-Regler im Vergleichsmodus verwendet jetzt denselben Befehl wie die Systemansicht (mit einer Kennzeichnung, welche Ansicht gemeint ist), statt eines eigenen Sonderbefehls.
- Anpassung (Aufnahme/Wiedergabe): Während einer Wiedergabe werden jetzt auch im Vergleichsmodus fast alle Bedienelemente deaktiviert, wie es in der Systemansicht bereits der Fall ist.
- Neu (Vergleichsmodus): Kleines Bedienfeld unten in der Mitte mit Vollbild, Screenshot und einem eigenen Zoom-Regler für die Vergleichsansicht.
- Fix (Aufnahme/Wiedergabe, Vergleichsmodus): Kameraänderungen (Zoom, Drehen) wurden bei der Wiedergabe einer Aufnahme im Vergleichsmodus nicht reproduziert. Behoben.
- Fix (Vergleichsmodus, Distanz-Label): Der Distanz-Text auf der Verbindungslinie zwischen den beiden Objekten ließ sich versehentlich markieren. Text ist jetzt nicht mehr markierbar.
- Neu (Vergleichsmodus, Sterne): Sterne werden im Größenvergleich jetzt genauso dargestellt wie in der normalen Systemansicht – mit Leuchten/Glow, Sternenkranz und, sofern für den Stern erfasst, mit Plasmaeruptionen und Helligkeitsschwankungen.
- Fix (Bedienleiste, iOS/Touch): Tippen auf Buttons in der unteren Bedienleiste reagierte auf iOS teils erst nach mehreren Versuchen bzw. nur bei längerem Drauftippen. Ursache war eine Wisch-Erkennung für das seitliche Durchblättern der Bedienleiste, die einen leicht driftenden Finger beim normalen Antippen fälschlich als Wisch-Geste interpretierte und dadurch die Buttons unter dem Finger verschob. Tippen auf einen Button löst jetzt nie mehr eine Wisch-Geste aus.
- Neu (Sterndaten): Aktive Sterne mit bekannter Rotations- bzw. Eruptionsveränderlichkeit sind jetzt mit ihrem astronomischen Sterntyp (z.B. BY-Draconis- oder UV-Ceti-Typ) erfasst.
- Neu (Sterne, Infopanel): Diese Sterntyp-Kürzel werden jetzt als kleine Marken unterhalb der Sternklassenbezeichnung angezeigt, inklusive ausführlicher Erklärung als Tooltip.
- Neu (Sterne, Infopanel): Zwei neue Anzeigen im Spektralklassen-Panel: eine Bar für die Leuchtkraft-Variabilität (stabil bis variabel) und eine für die Eruptionsaktivität (ruhig bis stürmisch), jeweils anhand der erfassten Sterndaten berechnet.
- Fix (Zonen-Infopanel, Zoom): Zoomen per Mausrad direkt nach Systemwechsel schloss das Panel nicht zuverlässig. Schließt jetzt bei jeder Zoom-Interaktion.
- Fix (Zonen-Infopanel, Sprache): Panel aktualisierte seinen Text nicht bei Sprachumschaltung, wenn es bereits geöffnet war.
- Fix (Zonen-Infopanel, Editor/Compare): Nach bestimmten Abfolgen (Zone anklicken → anderes Objekt fokussieren → Editor oder Vergleichsmodus öffnen und schließen) blieb das Panel beim nächsten Klick auf eine Zone unsichtbar. Behoben.
- Fix (Zonen-Infopanel, Optik): Panel-Farbe an das grüne Design der übrigen Panels angeglichen.
- Fix (Zonen-Infopanel, Führungslinie): Panel schließt jetzt zuverlässig, wenn ein anderes Objekt fokussiert oder zwischen logarithmischer und linearer Distanzdarstellung gewechselt wird – vorher zeigte die Führungslinie in solchen Fällen ins Leere.
- Anpassung (Zonen-Infopanel): Beschriftung der Objektanzahl gekürzt.
- Neu (Zonen-Infopanel): Ein Klick auf das Label eines Bereichs (Asteroidengürtel, Habitable Zone, Trümmerscheibe usw.) öffnet jetzt ein eigenes Infopanel mit Typ, Ausdehnung und geschätzter Objektanzahl – inklusive Führungslinie, Verschieben per Drag und automatischem Ein-/Ausblenden wie bei den übrigen Panels.
- Fix (Lokalisierung): Ein fehlender Übersetzungseintrag für einen Trümmergürtel-Namen wurde ergänzt.
- Fix (Sterne, Vergleichsmodus): Das Sternalter fehlte im Vergleichsmodus, obwohl es im normalen Infopanel bereits angezeigt wurde. Wird dort jetzt ebenfalls mit angezeigt.
- Neu (Sterne, Infopanel): Das Alter des Sterns wird jetzt im Infopanel angezeigt, passend formatiert in Millionen bzw. Milliarden Jahren.
- Fix (Sonneneruptionen, Rotation): Eruptionen hingen bisher an einem Halterungspunkt, der sich nicht mit dem Stern dreht. Sie sind magnetisch an die Sternoberfläche gebunden und drehen sich jetzt korrekt mit der Sternrotation mit, statt ortsfest im Raum zu bleiben.
- Anpassung (Sonneneruptionen, Partikel): Partikelgröße variiert jetzt leicht zufällig statt einheitlich gleich groß zu sein.
- Fix (Sonneneruptionen, Größe): Ursache für die weiterhin zu große Darstellung gefunden – ein Rechenfehler hatte die vorherige Verkleinerung bei der Bogenbreite größtenteils wieder aufgehoben. Größenformel jetzt komplett neu und spürbar kompakter, besonders bei den aktivsten Sternen (z.B. EV Lacertae).
- Anpassung (Sonneneruptionen, Wachsen/Schrumpfen): Effekt war vorhanden, aber kaum sichtbar. Deutlich verstärkt und an die tatsächliche Größe jeder einzelnen Eruption gekoppelt, damit die Bewegung zuverlässig auffällt.
- Anpassung (Sonneneruptionen, Partikel): Partikel leuchten jetzt in derselben hellen Glutfarbe wie die Plasmaschlinge selbst statt in der oft sehr dunklen Sternfarbe, und sind spürbar größer – vorher bei vielen Sternen praktisch unsichtbar.
- Anpassung (Sonneneruptionen, mehr Dynamik): Größe der Eruptionen halbiert – wirkten bisher zu massiv im Vergleich zum Stern. Die Schlinge wächst jetzt während sie sichtbar ist kontinuierlich ein kleines Stück weiter und schrumpft beim Verschwinden sichtbar zusammen, statt bewegungslos stehenzubleiben. Zusätzlich schwirren jetzt einzelne leuchtende Partikel in der Farbe des jeweiligen Sterns locker um die Schlinge herum, für mehr Lebendigkeit.
- Anpassung (Sonneneruptionen, natürlicher wirken): Eruptionen wirkten zu regelmäßig und starr. Form jetzt unregelmäßig geknickt statt glatter Bogen, jede Eruption sieht anders aus. Die Schlinge wabert während sie sichtbar ist ständig leicht (nie starr stehend), mit unruhigem statt gleichmäßigem Flackern. Auslösezeitpunkte sind jetzt unregelmäßiger verteilt, mit gelegentlichen "Nachbeben" kurz nacheinander statt gleichmäßigem Takt. Zerfall verläuft jetzt realistischer: die Schlinge löst sich zuerst an der Spitze auf, danach fallen beide Enden Richtung Sternoberfläche zurück – statt dass der ganze Bogen gleichmäßig verblasst.
- Neu (Sonneneruptionen): Aktive Sterne zeigen jetzt zufällig auftretende Eruptionen (Protuberanzen/Plasmaschlingen), die aus der Oberfläche herausschießen, kurz stehen bleiben und wieder in sich zusammenfallen – ähnlich echten Sonnenprotuberanzen. Betroffen sind die Sonne (selten, mild) sowie alle bekannten "Flackersterne" (z.B. Proxima Centauri, AD Leonis, EV Lacertae), die in der Realität für ihre starken Flares bekannt sind – bei ihnen treten die Eruptionen häufiger und kräftiger auf. Vorerst nur in der Systemansicht sichtbar, nicht im Overview.
- Fix (Objektliste, Schwerpunkte): Zwergplaneten-Schwerpunkte (z.B. Pluto-Charon-Schwerpunkt) werden jetzt korrekt herausgefiltert. Bisher wurden nur Stern-Schwerpunkte erkannt (isBarycenter-Flag), die Pluto-Charon-Variante hatte ein anderes internes Flag-Muster.
- Fix (Objektliste, Drag): Der Titelbereich „Systeme / Objekte" ist jetzt außerhalb des Scroll-Containers und damit vollständig als Drag-Griff nutzbar. Vorher war der Titel im scrollbaren Inhaltsbereich und blockierte dort das Verschieben des Panels.
- Fix (Objektliste-Panel, 8 Bugs): Panel erscheint jetzt oben links statt halb außerhalb des Bildschirms. Verschobene Position bleibt gespeichert wenn man das Panel schließt und wieder öffnet. Mausrad scrollt nur noch die Liste, kein Durchfall zum Szenen-Zoom mehr. Schwerpunkte werden nicht mehr in der Liste angezeigt. Panel wird beim Öffnen des Script-Editors und beim Compare-Modus automatisch aus- und wieder eingeblendet. Im Surface-Modus ist Doppelklick/Doppeltap in der Liste deaktiviert, um unbeabsichtigtes Verlassen der Oberfläche zu verhindern. Drag-Konflikt mit der Scrollbar behoben: der Inhaltsbereich löst keinen Panel-Drag mehr aus.
- Neu (Objektliste-Panel): Neuer Button oben in der Titelleiste öffnet ein durchsuchbares Listen-Panel mit allen Objekten der aktuellen Ansicht – im Overview alle Systeme, im System eine baumartige Liste (Stern → Planet → Mond), dazu eigene Gruppen für Zwergplaneten und Asteroiden. Klick/Tap auf einen Eintrag markiert das Objekt (Hover-Ring im System, Zielkreuz im Overview), Doppelklick/Doppeltap fokussiert das Objekt bzw. navigiert im Overview direkt zum System. Das Panel ist frei verschiebbar, reagiert auf Sprachumschaltung und passt sich auf Mobilgeräten an. Öffnen, Schließen, Verschieben und Auswählen sind vollständig im Aufnahme-/Wiedergabe-System verankert.
- Fix (Klick-Priorität, Nachbarsterne): Ursache gefunden – das 120×120px starDot-Canvas hatte pointer-events:auto über die GESAMTE Fläche, obwohl nur ein kleiner Punkt (Radius ~5-8px) darauf gezeichnet wurde. Jeder Klick in diesem 120×120-Quadrat wurde abgefangen, auch auf transparenten Pixeln, noch bevor er das WebGL-Canvas und damit den Raycaster für Planeten/Sterne erreichte. starDot ist jetzt pointer-events:none (nur Anzeige), ein neues, präzise 16px großes starHit-Element übernimmt die Klick-Erkennung an exakt der sichtbaren Punktposition.
- Anpassung (Neighbour-Zoom-Tempo): Animation lief mit ca. 0.025/Frame in unter einer Sekunde komplett durch – das Wegdriften des aktuellen Systems war kaum wahrnehmbar bevor der Stern schon riesig wurde. Geschwindigkeit auf 0.012/Frame reduziert (ca. 1.4s Gesamtdauer) und Easing-Kurve verstärkt (t^2.2 statt Smoothstep) – das System driftet jetzt zuerst sichtbar langsam weg, bevor der Zoom zum Nachbarstern beschleunigt.
- Fix (Neighbour-Zoom, Scale): THREE.Mesh hat die Basis-Größe bereits in der PlaneGeometry gebacken (_zoomSpriteR*2). Der alte Code rief scale.set(_curR*2, _curR*2, 1) auf und multiplizierte damit auf die schon große Geometrie – der Mesh war von Anfang an um Faktor ~80 zu groß. Korrigiert auf relativen Faktor: scale = _curR / _baseR, sodass bei t=0 scale=1 (Basis-Größe) und bei t=1 scale=maxR/baseR≈43.
- Fix (Neighbour-Zoom, weißer Blitz): zoomSprite-Material hatte transparent:false – ohne transparent:true hat opacity bei MeshBasicMaterial keinen Effekt, der Mesh war von Frame 1 voll opak und verdeckte alles. Auf transparent:true umgestellt in overview.js und actions.js. Opacity-Kurve in animate.js: sanfter Fade-in von 0→1 in den ersten 30% der Animation statt sofort 1.0.
- Fix (Klick-Priorität, Nachbarsterne): starDot (Canvas-Element) hatte keine nb-clickable Klasse – der elementFromPoint-Check in _onNbClick ignorierte ihn deshalb als Nachbarstern-Element und ließ den Klick durch. nb-clickable jetzt auch auf starDot gesetzt.
- Fix (Neighbour-Zoom-Animation): Ursache des Flimmerns gefunden. Der zoomSprite wurde in overview.js von THREE.Sprite auf THREE.Mesh (PlaneGeometry) umgebaut (Sichel-Fix), aber animate.js behandelte ihn weiter wie einen Sprite (kein Frame-für-Frame lookAt). Ein Mesh dreht sich nicht automatisch zur Kamera – dadurch drehte er sich weg und produzierte das Flimmern. Fix: animate.js führt lookAt(camera.position) nur für Meshes aus (isMesh-Check), nicht für Sprites.
- Fix (Neighbour-Zoom, synthetischer Pfad): actions.js erstellte den synthetischen zoomSprite noch als THREE.Sprite (SpriteMaterial). Auf THREE.Mesh (MeshBasicMaterial + PlaneGeometry) umgestellt – identisch zu overview.js. Beide Pfade sind jetzt konsistent.
- Fix (animate.js): animate.js auf V9.06-Basis zurückgesetzt und ausschließlich die vier _px/_py-Zeilen (Screenshot-Fix) darübergepacht. Alle Flicker-Änderungen aus V9.16-V9.20 die die Neighbour-Zoom-Animation destabilisierten wurden damit entfernt.
- Fix (Neighbour-Zoom-Animation): Das zoomSprite ist ein THREE.Sprite – Sprites richten sich automatisch zur Kamera aus. Ein fälschlicherweise hinzugefügtes lookAt(camera.position) überschrieb die interne Quaternion-Berechnung von Three.js und korrumpierte die Orientierung, was den weißen Bildschirm-Blitz verursachte. Zeile entfernt, Animation verhält sich wieder wie vor V9.20.
- Fix (Klick-Priorität, Nachbarsterne): Nachbarstern-Labels und -Dots fangen Klicks auf DOM-Ebene ab bevor input.js den Raycaster ausführt. Der _onNbClick-Handler in overview.js prüft jetzt via elementFromPoint ob das oberste Element ein nb-clickable ist – liegt ein Planeten- oder Sternlabel darüber, wird der Nachbarstern-Klick ignoriert.
- Fix (builder.js): Doppelter background-Eintrag bei Sternlabels entfernt.
- Fix (Screenshot, Overview): Sternlabels im Overview fehlten im Screenshot, weil animate.js _px/_py nicht setzte wenn es transform direkt schrieb. Alle Overview-Label-Blöcke (normal, Zoom-Sequenz, Nachbarsterne) schreiben jetzt _px/_py mit – Screenshot liest diese zuverlässig auch im Overview.
- Fix (Klick-Priorität, Nachbarsterne): Zweiter Anlauf – Nachbarsterne dürfen keinen Klick fangen wenn ein vordergründiges Objekt davor liegt. Raycaster läuft jetzt zuerst nur auf Nicht-Neighbour-Meshes; Nachbarsterne (Pixel-Test + eigener Raycaster-Pass) kommen erst wenn kein Vordergrundobjekt getroffen wurde. Animations-Pfad bleibt vollständig über setFocus() – runAction('focus-neighbour') wird im Klick-Handler nicht mehr aufgerufen.
- Fix (Neighbour-Zoom-Animation): Vorherige Version hatte die Übergangsanimation gebrochen – Pixel-Hit-Pfad rief runAction('focus-neighbour') statt setFocus(), was die Zoom-Animation übersprang und direkt das System lud (weißer Blitz). Korrigiert: alle Neighbour-Klick-Pfade gehen durch setFocus().
- Fix (Labels, Sterne): Sternlabels waren vertikal leicht nach unten versetzt. Ursache: die transform-Umstellung (V8.93) hatte die vertikale Zentrierung (-50% Y) der Sternlabels überschrieben. Sternlabels erhalten jetzt ein _centeredY-Flag, das positionLabel() nutzt um die Y-Achse korrekt zu zentrieren.
- Fix (Screenshot): Labels wurden seit der transform-Umstellung (V8.93) nicht mehr in Screenshots gezeichnet – der Screenshot-Code las style.left/top (immer 0), statt die gecachten _px/_py Positionen. Screenshots zeigen jetzt wieder alle sichtbaren Labels.
- Fix (Klick-Priorität, Nachbarsterne): Nachbarsterne in Alpha Centauri und anderen Systemen konnten Klicks auf vordergründige Planeten oder Sterne abfangen. Raycaster-Treffer auf normale Objekte werden jetzt zuerst ausgewertet – Nachbarsterne werden nur angeklickt wenn kein Vordergrundobjekt getroffen wurde.
- Fix (Overview, Flicker): Stern-Mesh wurde fälschlicherweise mit dem Flicker-Faktor skaliert – Flackersterne wuchsen und schrumpften sichtbar. Im Flicker-Block werden nur Glow-Planes (Opacity + Scale) moduliert, nicht der Stern-Mesh selbst (identisch zur Systemansicht).
- Fix (Overview, Glow-Overflow): Zwei Bugs beim Sprite→Plane-Umbau: (1) Object3D.scale wurde mit _baseScale × Faktor gesetzt – _baseScale ist aber der echte Durchmesser in Szeneneinheiten, bereits in der PlaneGeometry gebacken. Die Scale sollte nur der relative Faktor sein (Flicker-Faktor bzw. Leuchtkraft-Faktor), nicht das Produkt mit dem Durchmesser. Das erzeugte Planes mit Scale 50–200× und flutete die Szene orange. (2) actions.js las _baseOpacity von sp.userData statt sp.material.userData – Opacity wurde nie zurückgesetzt. Beide Fehler in animate.js und actions.js behoben.
- Fix (Overview, Glow-Overflow + Sichel): Billboard-Methode korrigiert – quaternion.copy(camera.quaternion) und mesh.lookAt(camera.position) sind nicht äquivalent. quaternion.copy übernimmt die Kamera-Rotation, d.h. die Plane-Normale zeigt von der Kamera weg – mit DoubleSide wurden dann beide Seiten additiv gerendert (doppelter Overflow). lookAt(camera.position) richtet die Vorderseite korrekt zur Kamera aus (wie in der Systemansicht), DoubleSide ist damit unnötig. Identische Methode wie builder.js jetzt auch in overview.js und animate.js.
- Fix (Overview, Glow-Overflow): Glow-Planes hatten side: THREE.DoubleSide gesetzt – bei AdditiveBlending wurde jede Plane doppelt gerendert (Vorder- und Rückseite), was bei vielen Sternen zu einem vollständig weißen/orangen Überblendbild führte. Korrigiert auf FrontSide; das Billboard-Quaternion stellt sicher dass die Vorderseite immer zur Kamera zeigt.
- Fix (Overview, Glow-Sichel): Planes wurden erst ab dem zweiten Frame korrekt zur Kamera ausgerichtet – der erste Render zeigte deshalb Sichel-Artefakte. Alle Planes erhalten jetzt direkt beim Erstellen (noch in loadOverview) ihre initiale Kamera-Ausrichtung.
- Fix (Overview, Glow-Sichel): Billboard-Ausrichtung der Glow-Planes war an den Drift-Loop gekoppelt und wurde deshalb nur ausgeführt wenn der Stern seine Position wechselt. Jetzt werden alle Planes jeden Frame zur Kamera ausgerichtet – unabhängig von Drift. Damit verschwindet die Lichtsichel auch wenn die Kamera rotiert ohne dass sich Sterne bewegen.
- Neu (Overview, Flicker): Flackersterne zeigen im Overview jetzt denselben Flicker-Effekt wie in der Systemansicht – Stern-Mesh-Skalierung sowie Glow-Opacity und -Größe werden per 4-Wellen-Sinus animiert. Die Flicker-Parameter kommen aus den starsystems.json-Daten (flicker.min/max/speed).
- Fix (Overview, Glow-Sichel): Alle Glow-Elemente im Overview (innerer/äußerer Glow, Starburst, Basis-Glow, Zoom-Überblendung) wurden von THREE.Sprite auf Billboard-Planes (THREE.Mesh + PlaneGeometry) umgestellt – identische Lösung wie in der Systemansicht. Sprites verzerren sich bei extremen Kamerapositionen zu einer Lichtsichel; Billboard-Planes richten sich jeden Frame korrekt zur Kamera aus.
- Fix (Flackern, Leuchtkraft): getLightFactor fehlte im registerAnimateContext-Aufruf in astroviewer.html – der Flicker-Block in animate.js hat deshalb immer lf=1.0 verwendet statt den aktuellen Reglerwert. Der Leuchtkraftregler wirkt jetzt korrekt auch auf Flackersterne.
- Fix (Flackern, Leuchtkraft): set-light-intensity hat Flackersterne komplett übersprungen – der Leuchtkraftregler zeigte dadurch keinerlei Effekt. Neuer Ansatz: set-light-intensity setzt immer den Basiswert (_baseIntensity × lf), der Flicker-Block in animate.js moduliert pro Frame mit _fFac relativ dazu. Damit wirkt der Regler sofort sichtbar und das Flackern bleibt korrekt skaliert.
- Fix (Flackern, Amplitude): Scale der Glow-Planes wird jetzt direkt mit dem Flicker-Faktor moduliert – deutlich sichtbarerer Effekt. Amplituden in den Daten erhöht (z.B. EV Lacertae 0.40–2.20, Wolf 359 0.50–1.80).
- Fix (Flackern, Leuchtkraft): Surface-Glow-Shader berücksichtigte den Leuchtkraft-Faktor nicht. Flicker-Block kombiniert jetzt _lf × _fFac auf allen drei Elementen (PointLight, Glow-Planes, Surface-Glow-Shader). set-light-intensity aktualisiert Surface-Glow-Shader jetzt auch für nicht-Flackersterne.
- Fix (Flackern, Amplitude): Flicker-Effekt war kaum sichtbar weil Opacity und Scale durch sqrt/pow zu stark gedämpft wurden. Opacity wird jetzt direkt mit dem Flicker-Faktor moduliert, Scale mit der Wurzel daraus.
- Fix (Flackern, Leuchtkraft): set-light-intensity überschrieb bei Flackersternen die Glow-Werte und verhinderte so Flicker und korrekte Leuchtkraft-Einstellung. Flackersterne werden jetzt in set-light-intensity übersprungen.
- Fix (Flackern): Debug-Log entfernt. Ursache des fehlenden Flackerns war die nicht deployete starsystems.json aus V9.05 – flicker-Felder fehlten in den geladenen Daten.
- Fix (Flackern, Debug): Fehlende let-Deklaration für _flickerDebugDone in animate.js ergänzt – verhinderte ReferenceError beim System-Wechsel.
- Debug (Flackern): Einmaliger Console-Log beim System-Load gibt aus ob starData und flicker-Daten in den starObjects ankommen – zur Diagnose warum Flackern im System-View nicht sichtbar ist.
- Fix (Flackern, System-View): Surface-Glow-Shader-Intensität wurde im ersten Flicker-Frame als NaN berechnet (Basis-Wert noch nicht gecacht) und renderte schwarz – Flackern im System-View war dadurch unsichtbar. Basis-Intensität wird jetzt direkt beim Szenenaufbau in builder.js gesetzt.
- Feature (Sterne, Flackern): Bekannte Flackersterne flackern jetzt organisch in ihrer Helligkeit. Das Flackern basiert auf vier überlagerten Sinuswellen mit irrationalen Frequenzverhältnissen – das ergibt ein nie-periodisches, natürlich wirkendes Muster. Stärke und Geschwindigkeit sind pro Stern konfigurierbar (flicker.min/max/speed in den Daten). Betroffen: Proxima Centauri, Wolf 359, UV Ceti A+B, Groombridge 1618, Gliese 412 B, AD Leonis, 40 Eridani C, EV Lacertae, GJ 1116 A+B, GJ 1002. Der Flicker-Faktor wirkt multiplikativ auf die manuelle Helligkeitseinstellung.
- Daten: 9 neue Sternsysteme ergänzt (IDs 49–57): 2MASS 0255-4700 (nächster isolierter L-Zwerg), Groombridge 1618 (inkl. kaltem Trümmergürtel), Gliese 412 (Doppelroter Zwerg), AD Leonis (aktiver Flackerstern), Gliese 832 (inkl. Gasriese b), Gliese 682 (inkl. zwei Supererde-Kandidaten), Keid/40 Eridani (Dreifachsystem mit Weißem Zwerg + bekanntem Exoplaneten), EV Lacertae (extrem aktiver Flackerstern), GJ 1116 (enger Doppelroter Zwerg). Neue Sternbild-Lokalisierungen in languages.json ergänzt.
- Fix (Script-Editor): Mausrad-Scroll in Sidebar, Hilfe-Spalte und Textarea funktioniert jetzt – der globale Wheel-Blocker lässt Events in scrollbaren Editor-Bereichen durch.
- Fix (Script-Editor, Hilfe-Spalte): Paneltitel und PARAMETER-Label verwendeten fälschlich Blau statt dem Grün der restlichen Editor-UI. Fehlende Lokalisierungseinträge editor.help.header und editor.help.placeholder in languages.json ergänzt.
- Feature (Script-Editor): Neue Hilfe-Spalte (220px) zwischen Textarea und Befehlsliste – Einzelklick auf einen Befehl zeigt dort Beschreibung und alle Parameter mit Default-Wert und Hinweistext an. Doppelklick fügt den Befehl weiterhin in den Editor ein. Ausgewählter Befehl wird blau hinterlegt.
- Feature (Scripting, set-current): Indirekter Objekt-Lookup ergänzt –
set-current { key: "sol-system", type: "planet", index: 3 } wählt den 3. Planeten des Sol-Systems (= Erde). Unterstützte Typen: star, planet, moon, dwarf, asteroid. Index ist 1-basiert. System-Key wird mit und ohne "-system"-Suffix erkannt. Ist key kein System-Key, werden type und index ignoriert (direkter Modus). Kein Match → current wird auf null gesetzt.
- Feature (Scripting): Neuer Befehl
set-current { key: "objectkey" } – setzt ein beliebiges Objekt aus den Rohdaten als Referenz, auch wenn es sich nicht im aktuell geladenen System befindet. Danach sind alle Eigenschaften über [[current.name]], [[current.mass]], [[current.category.name]] usw. als Platzhalter verfügbar – identische Lokalisierungslogik wie bei [[focus.X]]. Der Befehl ist auch im Script-Editor verfügbar.
- Fix (Sterne, Lichtintensität): Helligkeitsregler verursachte gelbe Überbelichtung der gesamten Szene nach der Billboard-Umstellung in V8.98. Die Glow-Planes haben die Basisgröße bereits in der Geometrie eingebaut – der Intensitäts-Skalierungsfaktor wird jetzt korrekt nur als relativer Multiplikator (statt absoluter Größe) angewendet.
- Fix (Sterne, Glow): Glow- und Flare-Sprites auf PlaneGeometry-Billboards umgestellt – THREE.Sprite hat intern eine eigene Screenspace-Projektionsmatrix die bei extremen Kamerawinkeln zu einem Versatz zwischen Sternkörper und Glow führte (sichtbare Sichel). Die Planes richten sich nun per lookAt() zur Kamera aus und projizieren exakt vom gleichen Weltpunkt wie der Stern.
- Fix (Sterne, Surface-Glow): Der animierte Noise-Shader auf der Sternoberfläche verwendete einen fixen Kamerarichtungsvektor (0,0,1) für den Limb-Darkening-Term – bei extremen Kamerawinkeln entstand dadurch die sichtbare texturierte Sichel. Der Shader berechnet die Kamerarichtung jetzt korrekt pro Vertex aus dem Model-View-Raum.
- Fix (Sterne, Glow): frustumCulled=false auf allen Glow-Sprites und dem Surface-Glow-Mesh gesetzt – bei extremen Kamerawinkeln wurden die Sprites fälschlicherweise vom Frustum-Culling entfernt, während der Sternkörper noch sichtbar blieb, was die gelbe Sichel am Bildschirmrand verursachte.
- Fix (Sterne, Glow): Glow- und Flare-Sprites werden jetzt direkt in der Szene platziert statt als Kind des Stern-Pivots – dadurch projizieren Sternkugel und Glow-Effekte immer vom exakt gleichen Weltpunkt, was die sichtbare Sichel (gelber Versatz) bei extremen Kamerawinkeln eliminiert.
- Performance (Edge/Chrome): renderer.compile() nach dem initialen System-Build eingefügt – eliminiert den 1-3s Freeze beim ersten Frame durch vorheriges WebGL-Shader-Kompilieren.
- Kompatibilität (Safari): -webkit-backdrop-filter Prefix zu allen backdrop-filter Regeln in der CSS hinzugefügt. -webkit-user-select Prefix zu fehlenden user-select Deklarationen ergänzt.
- Fix (Labels): Label-Positionierung erfolgt jetzt vor dem Winkel-Inkrement – Labels zeigten bisher die Position des nächsten Frames an, was bei schnellen Monden (Phobos, Amalthea etc.) zu einem sichtbaren Vorauseilen des Labels führte.
- Fix (Slider): Slider-Drag bleibt nicht mehr hängen wenn die Maus während des Ziehens das Element verlässt. Umstellung auf setPointerCapture + document-pointerup als Sicherheitsnetz.
- Performance (Labels): CSS-Positionierung von left/top auf transform:translate() umgestellt – Labels laufen jetzt auf dem Compositor-Thread und lösen keinen Layout-Reflow mehr aus. Dirty-Check verhindert unnötige Style-Writes bei unveränderter Position.
- Performance (Labels): Occluder-Liste (Sterne, Planeten, Monde etc.) wird jetzt einmal pro Frame gecacht statt für jedes Label neu aufgebaut – eliminiert wiederholte Array-Allokationen und project()-Aufrufe im Hot-Path.
- Performance (Overview/Nachbar-Sterne): Alle Label- und Dot-Positionierungen in animate.js ebenfalls auf transform umgestellt, inkl. Dirty-Check.
- Fix (Hover-Slowmo, Mondspeed): Action-Name war set-moon-speed statt set-moonspeed – Mondgeschwindigkeit wurde nicht auf 0 gesetzt und Slider nicht aktualisiert.
- Fix (Hover-Slowmo, Recording): set-speed und set-moonspeed die durch Hover-Slowmo ausgelöst werden, werden jetzt nicht mehr ins Script aufgezeichnet.
- Feature (Hover-Slowmo): Beim Hovern über ein Objekt werden Simulations- und Mondgeschwindigkeit automatisch auf Minimum gesetzt – schnelle innere Monde (Amalthea, Phobos etc.) lassen sich so leichter anklicken. Beim Verlassen des Hovers oder Klick wird die vorherige Geschwindigkeit wiederhergestellt. Nicht aktiv während Script-Playback. Gilt nur Desktop (Mobile hat keinen Hover).
- Refactor (Auslagerung): registerActionsContext()-Mapping (~150 Zeilen) aus astroviewer.html in actions.js verschoben. Neue Funktion buildActionsContext(h) in actions.js baut den vollständigen Context aus einem flachen h-Objekt. HTML ruft nur noch registerActionsContext(buildActionsContext({...})) auf.
- Fix (Mondorbits, Highlight): Beim Neubauen elliptischer Orbitlinien nach spreadMoonOrbits() wurde die Referenz in clickTargets nicht aktualisiert – Highlight beim Anklicken zeigte auf die alte (entfernte) Linie. clickTargets-Eintrag wird jetzt nach dem Neubauen synchronisiert.
- Fix (Overview-Navigation): ovLeft/ovRight Event-Handler und go-system-btn-Handler wurden beim Refactor in V8.85 versehentlich mitrausgelöscht. Wiederhergestellt im HTML. runAction fehlte im registerOverviewContext-Call in init.js – ovNavStep konnte daher kein System laden.
- Fix (Mondorbits, Ellipsen): _updateMoonOrbitLine() hat elliptische Orbitlinien nach spreadMoonOrbits() nicht aktualisiert (Frühabbruch bei ecc > 0). Amalthea (ecc=0.0032), Despina/Galatea (ecc=0.0001) lagen deshalb auf falscher Bahn. Elliptische Orbits werden jetzt komplett neu gebaut (scene.remove + neu hinzufügen) statt die Geometrie in-place zu ersetzen.
- Fix: Doppelte let _lightFactor Deklaration (Relikt aus V8.85 Refactor) entfernt → SyntaxError behoben.
- Refactor (Auslagerung): updateHoverMarker(), setHoveredTarget(), ovNavStep(), ovUpdateSkipNavButtons(), ovSetNavBtnsDisabled(), ovSyncGoSysBtn() und isSingleStarSystem() aus astroviewer.html in overview.js verschoben (~180 Zeilen). actions.js importiert isSingleStarSystem() jetzt direkt aus overview.js.
- Refactor (Auslagerung): _resolvePlaceholders(), _applyScriptVars(), _scriptVars sowie getScriptVars/setScriptVar aus astroviewer.html in recorder.js verschoben (~125 Zeilen). actions.js importiert diese Funktionen jetzt direkt aus recorder.js statt sie über den Context zu bekommen. HTML-Context für recorder/actions entsprechend bereinigt.
- Cleanup (Sterne, sd.r): Veralteter Radius-Fallback sd.r für Sterne entfernt – kein Stern in den Systemdaten hat jemals r direkt gesetzt. Sternradius kommt jetzt ausschließlich aus scaleStarR().
- Fix (scaleFactorLin, Sterne): scaleStarR()-Aufrufe übergeben jetzt logScale – Sterngrößen reagieren beim log↔lin-Wechsel auf star.scaleFactorLin. Zusätzlich: Falls ein Stern einen hardcodierten Radius (sd.r) in den Systemdaten hat, wird scaleFactorLin trotzdem angewendet.
- Fix (scaleFactorLin, Planet): Redundanter scaleFactorLin auf Planet-Top-Level entfernt – Planet hat kein eigenes scaleKm, scaleR() greift immer auf die Subkategorie. Der Faktor sitzt jetzt ausschließlich bei terrestrial/gasgiant/icegiant.
- Fix (scaleFactorLin, Wirkungslos): Beim log↔lin-Umschalten wurde das System komplett neu geladen, aber scaleR()-Aufrufe in loadStarSystem() und _buildMoon() ignorierten logScale. Alle Build-Aufrufe übergeben jetzt logScale – Größenänderung durch scaleFactorLin greift ab sofort korrekt beim Umschalten.
- Feature (Skalierung, Sterne): Stern-Skalierungsfaktor (STAR_R_SCALE ≈ 0.04795) ist jetzt in categories.json unter star.scaleKm hinterlegt – einheitliche Datenhaltung wie alle anderen Objektkategorien. scaleStarR() liest diesen Wert aus CAT.star.
- Feature (Skalierung, Lin-Modus): Alle Objektkategorien (Sterne, Planeten, Monde, Asteroiden, Zwergplaneten) haben jetzt ein scaleFactorLin-Feld in categories.json (Standard: 1.0). Beim Umschalten log→lin wird scaleKm mit diesem Faktor multipliziert – ermöglicht gezieltes Tuning der Objektgrößen im linearen Distanzmodus ohne Codeänderungen.
- Feature (Skalierung, Live-Rescale): snapshotAndRescaleDistances() skaliert beim log/lin-Wechsel jetzt auch Planetengrößen, Mondgrößen, Asteroiden und Zwergplaneten neu (Mesh-Geometrie wird ersetzt). Mondorbits berücksichtigen den aktualisierten Planetenradius.
- Fix (Log→Lin, Mondorbits): Linearer Modus verwendet jetzt die gleiche LOG-Formel × 1.5 – alle Monde rücken gleichmäßig 50% weiter weg. Vorherige sqrt-Kalibrierung auf Callisto entfernt; kein hardgecodeter Fixpunkt mehr. Hintergrund: Ein physikalisch-linearer Mondmaßstab ist nicht darstellbar (irreguläre Monde wie Himalia oder Nereid würden auf tausende Szeneneinheiten explodieren), da Monde 2–4 Größenordnungen näher an ihren Planeten sind als Planeten an der Sonne.
- Fix (Mondorbits, Phobos): Erster Mond eines Planeten bekommt jetzt einen zusätzlichen Puffer von eigenem Mondradius×2 über dem Mindestabstand – Phobos klebt nicht mehr an der Marsoberfläche.
- Fix (Log→Lin, Kalibrierung): Skalierungsfaktor des linearen Modus von 0.37 auf 0.533 korrigiert – war auf falschen Referenzwert kalibriert. Im Lin-Modus bewegen sich Monde jetzt korrekt weiter nach außen (äußere Monde wie Titan/Callisto/Iapetus rücken weiter weg, innere Monde wie Enceladus/Tethys bleiben ähnlich). Callisto dient als Fixpunkt: gleiche visuelle Position in beiden Modi.
- Fix (Mondorbits, Floor): Mindestabstand vom Planeten auf 1.5× visuellen Planetenradius erhöht.
- Fix (Mondorbits, Spreading): Innere Monde die physikalisch sehr nah an ihrem Planeten sind (Phobos, Amalthea, Despina, Galatea, Larissa) lagen alle auf dem selben Mindestabstand und klebten an der Planetenoberfläche. Neuer Algorithmus: Monde werden nach physikalischem Abstand sortiert und automatisch gestaffelt – jeder Mond bekommt Mindestabstand zum vorherigen basierend auf seiner Größe. Mindestabstand vom Planeten auf 1.35× erhöht.
- Fix (Mondorbits, log→lin): Log/Lin-Umschaltung hat Spreading nicht angewendet und Orbitlinien ohne Neigung (inc/lan) neu gebaut. Beides korrigiert.
- Fix (Fokus, Positionssprung): Beim allerersten Klick auf einen Planeten nach dem Systemladen sprang das Objekt kurz auf eine andere Position. Ursache: Planetenpositionen wurden erst im ersten Animationsframe gesetzt; Klick-Handler hat vorher noch (0,0,0) gelesen. Planeten setzen ihre initiale Position jetzt sofort beim Aufbau.
- Feature (Mondorbits, algorithmische Skalierung): orbitR wurde aus allen Monddaten entfernt. Mondorbit-Radien werden jetzt algorithmisch aus orbitAU berechnet: orbitR = visR_planet × (K1 + K2 × ln(orbitAU / planet_rAU)) mit K1=-1.0, K2=1.9 (kalibriert auf Galileische Monde und Saturn-Monde, RMS ≈ 1.6 Szeneneinheiten). Funktion moonOrbitR() in utils.js. Minimum: 110% des visuellen Planetenradius.
- Feature (Mondorbits, log→lin): snapshotAndRescaleDistances() berechnet Mondorbits bei log/lin-Umschaltung neu – im linearen Modus sqrt-Kompression statt ln für sanfteren Übergang.
- Fix (Animation, Mondrotation): Prograde Monde drehten im Uhrzeigersinn statt gegen den Uhrzeigersinn. Fix: angle-Inkrement negiert (−=). Retrograde Monde (Triton, Sycorax) erscheinen automatisch im Uhrzeigersinn durch die geometrische Wirkung von orbitPos() mit inc > 90° – kein separates Vorzeichen nötig.
- Fix (Animation, Mondrotation): Vorzeichen nochmals korrigiert – orbitPos() mit positivem angle ergibt CCW (prograd korrekt). Retrograde Monde (inc > 90°, z.B. Triton, Sycorax) erhalten negatives Inkrement und laufen jetzt im Uhrzeigersinn.
- Fix (Daten, Amalthea orbitR): Von 14.2 auf 26 erhöht – Amalthea war im visuellen Jupiter-Volumen versteckt, da Jupiters dargestellter Radius den physikalisch korrekten Abstand übersteigt.
- Fix (Animation, Mondrotation): Alle Monde liefen im Uhrzeigersinn statt gegen den Uhrzeigersinn. Ursache: orbitPos() mit positivem angle-Inkrement ergibt in Three.js Y-up CW-Bewegung. Prograde Monde erhalten jetzt negatives Inkrement (CCW), retrograde (inc > 90°) positives (CW). Betrifft alle Monde, nicht nur die neuen.
- Fix (Daten, Mondorbits): orbitR-Werte der neuen Monde per planeten-konsistenter Log-Interpolation aus den Originalmond-Referenzwerten berechnet. Amalthea=14.2, Enceladus=18.1, Miranda=15.5, Galatea=24.4, Despina=22.0, Iapetus=80.4, Himalia=105, Sycorax=110.
- Fix (Daten, Mondorbits): orbitR der neuen Monde war falsch berechnet (AU×13000 statt visuell skaliert wie bestehende Monde). Korrigiert: Amalthea 15, Himalia 115, Enceladus 18, Iapetus 95, Miranda 21, Sycorax 120, Galatea 22, Despina 18.
- Fix (Animation, Mondrotation): Alle Monde kreisten in der gleichen Richtung. Retrograde Monde (inc > 90°, z.B. Triton, Sycorax, Nereid) umlaufen jetzt im Uhrzeigersinn, prograde gegen den Uhrzeigersinn.
- Daten (Monde): Iapetus zu Saturn hinzugefügt. Saturn hat jetzt 6 Monde: Titan, Rhea, Dione, Tethys, Enceladus, Iapetus. Iapetus ist der drittgrößte Saturnmond (r=736km), gebunden, stark geneigter Orbit (14.72°), bekannt für seine zweitonige Oberfläche (dunkle Cassini Regio / helle Roncevaux Terra) und den markanten Äquatorialrücken.
- Daten (Monde): Mondlimit von 4 auf 6 erhöht. Neue Monde hinzugefügt: Jupiter erhält Amalthea (innerer Mond, gebunden, röteste Oberfläche im Sonnensystem) und Himalia (irregulärer Asteroid-Mond, C/D-Klasse); Saturn erhält Enceladus (aktiver Kryo-Vulkanmond mit subsurface Ozean, höchste Albedo im Sonnensystem); Uranus erhält Miranda (kleinster großer Mond, extremste Topographie) und Sycorax (größter irregulärer Mond, retrograd); Neptun erhält Galatea (Schäfermond des Adams-Rings) und Despina (innerer Shepherd-Mond). Alle Einträge mit vollständigen Daten inkl. Atmosphäre und Materiezusammensetzung auf Basis von NASA/JPL Quellen.
- Fix (Belt-Rendering, Tiefensortierung): depthWrite:true + alphaTest:0.15 statt depthWrite:false – Belt-Partikel schreiben jetzt korrekt in den Z-Buffer. Löst sowohl das Kuiperbelt-vor-Hauptgürtel-Problem als auch Belt-Partikel-vor-Planeten (Jupiter-Bug). renderOrder-Hacks entfernt.
- Fix (Belt-Rendering, Schatten): Radialer Schatten wird jetzt direkt in die Instanzfarben eingerechnet (Innenseite des Gürtels heller, Außenseite dunkler, Faktor 0.42–1.0). Robuster als onBeforeCompile-Shader-Injection die in dieser Three.js-Version nicht korrekt griff.
- Fix (Belt-Rendering, Schatten): Radialer Schatten per onBeforeCompile-Shader eingebaut – Innenseite der Partikel (zur Sonne bei Ursprung) wird hell gerendert, Außenseite abgedunkelt (Faktor 0.38–1.0). Wirkt realistisch ohne echtes Lighting und ohne Mehraufwand durch Lambert-Berechnung.
- Fix (Belt-Rendering, Tiefensortierung): renderOrder-Logik war invertiert. Äußere Gürtel (Kuiper) erhalten jetzt negativeren renderOrder und werden früher gerendert, innere Gürtel (Hauptasteroidengürtel) später – damit erscheinen innere Objekte korrekt vor äußeren.
- Fix (Belt-Rendering, Schatten): Asteroidengürtel-Partikel verwendeten MeshLambertMaterial, was zu einem falschen Rundumschatten führte der nicht zur Lichtquelle passte. Umgestellt auf MeshBasicMaterial – Partikel werden jetzt unabhängig von der Beleuchtung in ihrer gesetzten Farbe dargestellt.
- Fix (Belt-Rendering, Tiefensortierung): Partikel weiter entfernter Gürtel (z.B. Kuipergürtel) wurden teilweise vor näheren Gürteln (Hauptasteroidengürtel) gerendert, weil depthWrite:false deaktiviert ist und Three.js InstancedMesh als ganzes Objekt sortiert. Gürtel erhalten jetzt einen renderOrder proportional zu ihrer mittleren Distanz – innere Gürtel werden zuerst gerendert.
- Feature (Infopanel 1, Planeten): Entdeckungsmethode wird im Planeten-Infopanel angezeigt, sofern die Eigenschaft detectionMethod im Datensatz vorhanden ist. Planeten ohne Eintrag (z.B. Sol-System) zeigen die Zeile nicht. Vollständig lokalisiert (DE/EN).
- Fix (Sprache, Script-Playback): Bei URL-Start mit ?script= konnte die aktive Sprache im Script-Player von der UI-Sprache abweichen. Ursache: registerContext() für languages.js wurde erst nach dem asynchronen JSON-Load aufgerufen, sodass initLang() den setLangProxy noch nicht kannte und _lang nicht synchronisieren konnte. setLangProxy wird jetzt direkt vor initLang() registriert.
- Fix (Surface-Modus, Kamera-Rotation): Nach mehreren scripted camera-rotate Aufrufen fror die horizontale Rotation ein. Ursache: _sfFwd degenerierte nach wiederholter Re-Orthogonalisierung zu einem Nullvektor (wenn _sfFwd fast parallel zu _sfNormal wurde), was zu NaN-Werten in allen nachfolgenden Frames führte. Degeneration wird jetzt abgefangen und auf einen sicheren Fallback-Vektor zurückgefallen.
- Fix (Scripting, camera-rotate): dx/dy wurden als Strings statt Numbers verarbeitet wenn sie aus Script-Variablen ([[ax]]) stammten. Ab dem zweiten Loop-Durchlauf korrumpierte das die Kamera-Velocity (String-Konkatenation statt Addition), wodurch horizontale Rotation ausblieb. dx/dy werden jetzt explizit mit parseFloat() konvertiert.
- Fix (Scripting, Surface-Modus): camera-rotate mit camMode:"surface" im Script-Player blockierte den gesamten Script-Ablauf dauerhaft (schwarzer Himmel, Renderer-Crash). Ursache: resolve() wurde nie aufgerufen – der Player wartete auf ein Signal das nie kam. Surface-Rotation wird jetzt sofort abgeschlossen.
- Fix (Script-Platzhalter, Lokalisierung): [[focus.category.name]], [[focus.type]], [[focus.subcat]] und [[focus.constellationname]] lieferten immer die deutsche Übersetzung, auch wenn die Oberfläche auf Englisch gestellt war. Ursache: die Übersetzungsfunktion t() nutzt einen internen Sprach-Snapshot der bei Sprachumschaltung nicht immer aktualisiert wird. Alle betroffenen Platzhalter lesen jetzt direkt aus dem Übersetzungsdatensatz der aktiven Sprache.
- Fix (Daten): moonCount bei allen Exoplaneten ohne bekannte Mondanzahl von 0 auf null (unbekannt) korrigiert. Merkur und Venus behalten moonCount=0. Betrifft 24 Einträge u.a. in Groombridge 34, Wolf 1061, Tau Ceti, YZ Ceti, GJ 1061.
- Fix (Daten): 4 Exoplaneten ohne key-Eintrag (Groombridge 34 Ab/Ac, Gliese 725 A b/B b) erhalten automatisch generierten Schlüssel aus dem Namen (slug).
- Fix (Prozedurale Texturen): Planeten ohne key-Eintrag (key=null) bekamen keine prozedurale Textur und blieben bei ihrer Grundfarbe. Die Textur-Engine wendet jetzt auch bei fehlendem key eine prozedurale Textur an.
- Fix (Overview Drift, tatsächlicher Root Cause): V8.58 hatte eine eigene Drift-Implementierung mit viel zu kleiner Amplitude (2.2 statt 6–20 Units) und nur einem Mesh pro Stern. Die korrekte Funktion aus overview.js (4 Sinus-Wellen pro Achse, sternradiusabhängige Amplitude, alle Glows mitbewegt) wurde nie importiert. Import ergänzt, Delegation auf die echte Implementierung.
- Fix (Overview, Sterne bewegen sich nicht): Die Drift-Funktion, die Sterne im Overview sanft schweben lässt, war nicht mehr im Animation-Loop registriert (Regression seit V8.42). Sterne bewegen sich jetzt wieder.
- Fix (Overview, Zoom-Ziel versetzt): Beim Klick auf einen Stern im Overview wurde die Kamera auf seine ursprüngliche statt seine aktuelle (gedriftete) Position gezoomt (Regression seit V8.45). Kamera trifft jetzt wieder den Stern präzise.
- Neu (Prozedurale Texturen, Typ "Gestein"): Neuer terrestrischer Oberflächentyp mit Grautönen im Stil von Mond/Merkur (dunkle Mare bis helle Hochländer). Verteilung jetzt auf 6 Typen: erdähnlich, Wüste, Eis, Lava, Ozean, Gestein.
- Neu (Prozedurale Texturen, Krater): Eis-, Lava- und Gestein-Welten erhalten prozedurale Impaktkrater mit Boden, Innenwand, hellem Rim und Ejecta-Aureole. Anzahl je nach Typ: Gestein 40, Eis 18, Lava 12. Gasriesen und Eisriesen bleiben kraterfrei.
- Tweak (Prozedurale Texturen, Eisriese): Eisriesen nutzen jetzt einen eigenen Renderer mit sehr schwacher Bandstruktur statt des terrestrischen Wolken-Musters. Zwei Varianten: Neptun-Typ (tiefblau) und Uranus-Typ (teal/türkis).
- Fix (Prozedurale Texturen, Gasriesen-Bänder): Gasriesen zeigten keine horizontalen Streifen sondern ein einfarbiges Muster. Ursache: die Bandformel erzeugte nur einen glatten Helligkeitsverlauf (Pol zu Äquator), keine echten alternierenden Bänder. Jetzt werden mehrere überlagerte Sinuswellen verschiedener Frequenz verwendet (grobe Hauptbänder + feinere Strukturen), die durch Turbulenz-Noise verwischt werden – vergleichbar der Bänderstruktur bei Jupiter.
- Fix (Prozedurale Texturen, terrestrischer Typ): Planeten desselben Systems hatten oft denselben Oberflächentyp (z.B. alle grün). Ursache: der Typ wurde per Zufallszahl gewählt, die durch Zufall für mehrere Keys im selben Bereich landete. Der Typ wird jetzt rein deterministisch aus dem Planetennamen berechnet, was eine gleichmäßige Verteilung garantiert (erdähnlich / Wüste / Eis / Lava / Ozean).
- Fix (Prozedurale Texturen, zu wenig Kontrast): Die generierten Oberflächen wirkten teilweise fast einfarbig (z.B. Eiswelten fast komplett weiß ohne Struktur). Ursache: das verwendete Rauschverfahren nutzte den möglichen Helligkeits-Wertebereich nur zu einem kleinen Teil aus. Die Engine ermittelt jetzt vorab den tatsächlich erreichten Bereich und streckt ihn auf die volle Bandbreite – Struktur und Farbvarianz sind dadurch deutlich sichtbarer.
- Tweak (Prozedurale Texturen, Detailtiefe): Alle Farbpaletten (Eiswelt, Wüste, Lava, Ozean, Gasriesen, Eisriesen, erdähnlich) haben jetzt mehr Farbstufen und eine größere Farbspannweite, zusätzlich eine feine Körnung für mehr Oberflächendetail – insgesamt deutlich näher an handgefertigten Texturen.
- Fix (Lock-Track bei Aufzeichnung): War der Track beim Aufzeichnungsstart nicht gesperrt, wurde das nicht ins Script übernommen – bei der Wiedergabe konnte dadurch ein Sperr-Zustand aus einer früheren Aktion stehen bleiben. Der Sperr-Zustand wird jetzt immer mit aufgezeichnet, auch "entsperrt".
- Fix (Lautstärke bei Wiedergabe, tatsächlicher Root Cause): Der V8.52-Fix war noch unvollständig. War Musik beim Aufzeichnen nie aktiviert worden, lieferte die interne Lautstärke-Variable trotzdem ihren Anzeige-Default (mittlere Position) statt "aus" zurück, und genau dieser Default wurde nun ins Script übernommen – der eigentliche Fehler blieb also bestehen. Die Aufzeichnung prüft jetzt zusätzlich, ob Musik wirklich eingeschaltet war, und schreibt nur dann einen Lautstärke-Wert ungleich null ins Script.
- Fix (Screenshot-Aufzeichnung): Klick auf den Screenshot-Button wurde beim Aufzeichnen nicht mehr ins Script übernommen, dadurch passierte bei der Wiedergabe an dieser Stelle nichts. Der Button ist jetzt wieder korrekt mit der Aufzeichnung verbunden, ohne dass der Download selbst darunter leidet.
- Fix (Lautstärke bei Wiedergabe): War beim Start einer Aufzeichnung die Musik ausgeschaltet, wurde das nicht mehr ins Script übernommen – bei der Wiedergabe sprang die Lautstärke dadurch auf einen mittleren Standardwert statt stumm zu bleiben. Der ausgeschaltete Zustand wird jetzt wieder zuverlässig mit aufgezeichnet.
- Fix (Screenshot, tatsächlicher Root Cause): Der globale "Script-Stop"-Klick-Handler (tippen auf die Script-Anzeige stoppt die Wiedergabe) prüfte nicht ob ein Klick echt vom Nutzer kam. Der programmatische Klick, der den Screenshot-Download auslöst, hat per Definition Koordinaten (0,0) – das fiel zufällig in den Erkennungsbereich des Stop-Handlers, der daraufhin den Download-Klick abfing und stattdessen den Play-Button auslöste. Ergebnis: Screenshot lief korrekt durch, aber der Download wurde im letzten Moment lautlos verhindert. Fix: Der Stop-Handler ignoriert jetzt nicht-echte (programmatisch erzeugte) Klicks.
- Fix (Screenshot, Root Cause): Screenshot-Button löste gar nichts aus weil er
doScreenshot() direkt aufrief statt über runAction('screenshot') – damit war die Aktion für den Recorder unsichtbar und der doScreenshot-Kontext aus actions.js wurde nicht korrekt durchgereicht. Fix: Button-Handler ruft jetzt runAction('screenshot') via _ctx; runAction in registerScreenshotContext (init.js) ergänzt. Fullscreen-Einstieg vor Capture entfernt (konnte WebGL-Kontext unterbrechen). Download bleibt bei toDataURL (synchron) statt toBlob – Letzteres feuert asynchron und der Browser blockiert dann den Download da der Klick außerhalb der ursprünglichen User-Geste landet.
- Neu (Prozedurale Planeten-Texturen): Exoplaneten und andere Objekte ohne eigene Textur-Datei erhalten jetzt automatisch eine prozedurale Textur statt einer grauen Kugel. Die Textur ist deterministisch pro Objekt (gleicher Planet sieht immer gleich aus) und variiert je nach Planetentyp: Gasriesen mit Bandstrukturen, Eisriesen in Blautönen, terrestrische Planeten in zufälligem Typ (erdähnlich, Wüste, Eiswelt, Lavawelt, Ozeanwelt). Technisch: Improved Perlin Noise mit 6 Oktaven fBM, separaten Seeds pro Layer, Smooth-Step Farbübergängen.
- Fix (Orbit-Highlight, Root Cause):
BRIGHT_ORBIT/BRIGHT_STAR_ORBIT/... sind lokale Variablen in astroviewer.html und nicht auf dem S-State-Objekt – alle Referenzen via _S.BRIGHT_* in actions.js waren daher immer undefined → setHex(undefined) = schwarz. Lösung: 6 neue Getter (getBRIGHT_*, getHALF_ORBIT) im registerActionsContext ergänzt; alle drei Highlight-Pfade (snapFocus, sway-lerp, restore-system) nutzen jetzt eine gemeinsame Hilfsfunktion _applyOrbitHighlight() via _ctx.
- Fix (Versionsnummer): Konstante
versionNumber auf aktuellen Stand gebracht.
- Fix (Orbitlinien schwarz):
DIM_ORBIT, DIM_MOON, DIM_AST, DIM_DWARF wurden aus orbitColorDim gelesen – ein Feld das planet/moon/asteroid/dwarf in categories.json nicht haben (dort orbitColorDimMobile/orbitColorDimDesktop). Resultat: undefined → setHex(undefined) → schwarz. Korrekte Felder werden jetzt gerätespezifisch gelesen.
- Fix (Orbit-Highlight bei Playback):
_snapFocus() (verwendet bei seq: none und seq: sway ohne aktiven Fokus) setzte keine Orbitfarben. Highlight-Logik analog zu allen anderen Fokus-Pfaden ergänzt.
- Neu (Script-Befehl
set-variable): Neuer optionaler Parameter languageCode – Variable wird nur gesetzt wenn die aktuelle Sprache übereinstimmt (z.B. DE, EN). Wert ALL oder Parameter weggelassen → immer setzen (bisheriges Verhalten bleibt erhalten).
- Fix (Overview Drift, Zoom-Ziel): Kamera zoomte auf statischen Fixpunkt statt auf den gedrifteten Stern –
getPos() im Overview-ClickTarget gibt jetzt mesh.position zurück. Zoom trifft jetzt immer präzise den Stern.
- Tweak (Sterngrößen):
STAR_R_SCALE in utils.js von 30 auf 40 Scene-Units erhöht – Sterne im System-View wirklichkeitstreu größer, ohne dass enge Mehrfachsysteme (z.B. EZ Aquarii) visuell kollidieren.
- Fix (Overview Drift, Zoom-Anim): Label-Projektion im
overview-zoom-Modus verwendete noch den statischen Fixpunkt statt der gedrifteten Mesh-Position → Label war während der Zoom-Animation versetzt. Behoben.
- Fix (Daten, Exoplaneten):
moonCount bei allen neu eingetragenen Planeten auf null (unbekannt) korrigiert – war fälschlicherweise 0.
- Fix (Daten, Konstellationen): 6 fehlende Einträge in
languages.json ergänzt: Altar (ara), Sextant (sex), Fliege (mus), Herkules (her), Südliches Dreieck (tra), Kiel des Schiffs (car) – je DE und EN.
- Fix (Screenshot-Aufzeichnung): Klick auf den Screenshot-Button wurde beim Aufzeichnen nicht mehr ins Script übernommen, dadurch passierte bei der Wiedergabe an dieser Stelle nichts. Der Button ist jetzt wieder korrekt mit der Aufzeichnung verbunden, ohne dass der Download selbst darunter leidet.
- Fix (Lautstärke bei Wiedergabe): War beim Start einer Aufzeichnung die Musik ausgeschaltet, wurde das nicht mehr ins Script übernommen – bei der Wiedergabe sprang die Lautstärke dadurch auf einen mittleren Standardwert statt stumm zu bleiben. Der ausgeschaltete Zustand wird jetzt wieder zuverlässig mit aufgezeichnet.
- Fix (Screenshot, tatsächlicher Root Cause): Der globale "Script-Stop"-Klick-Handler (tippen auf die Script-Anzeige stoppt die Wiedergabe) prüfte nicht ob ein Klick echt vom Nutzer kam. Der programmatische Klick, der den Screenshot-Download auslöst, hat per Definition Koordinaten (0,0) – das fiel zufällig in den Erkennungsbereich des Stop-Handlers, der daraufhin den Download-Klick abfing und stattdessen den Play-Button auslöste. Ergebnis: Screenshot lief korrekt durch, aber der Download wurde im letzten Moment lautlos verhindert. Fix: Der Stop-Handler ignoriert jetzt nicht-echte (programmatisch erzeugte) Klicks.
- Fix (Screenshot, Root Cause): Screenshot-Button löste gar nichts aus weil er
doScreenshot() direkt aufrief statt über runAction('screenshot') – damit war die Aktion für den Recorder unsichtbar und der doScreenshot-Kontext aus actions.js wurde nicht korrekt durchgereicht. Fix: Button-Handler ruft jetzt runAction('screenshot') via _ctx; runAction in registerScreenshotContext (init.js) ergänzt. Fullscreen-Einstieg vor Capture entfernt (konnte WebGL-Kontext unterbrechen). Download bleibt bei toDataURL (synchron) statt toBlob – Letzteres feuert asynchron und der Browser blockiert dann den Download da der Klick außerhalb der ursprünglichen User-Geste landet.
- Neu (Prozedurale Planeten-Texturen): Exoplaneten und andere Objekte ohne eigene Textur-Datei erhalten jetzt automatisch eine prozedurale Textur statt einer grauen Kugel. Die Textur ist deterministisch pro Objekt (gleicher Planet sieht immer gleich aus) und variiert je nach Planetentyp: Gasriesen mit Bandstrukturen, Eisriesen in Blautönen, terrestrische Planeten in zufälligem Typ (erdähnlich, Wüste, Eiswelt, Lavawelt, Ozeanwelt). Technisch: Improved Perlin Noise mit 6 Oktaven fBM, separaten Seeds pro Layer, Smooth-Step Farbübergängen.
- Fix (Orbit-Highlight, Root Cause):
BRIGHT_ORBIT/BRIGHT_STAR_ORBIT/... sind lokale Variablen in astroviewer.html und nicht auf dem S-State-Objekt – alle Referenzen via _S.BRIGHT_* in actions.js waren daher immer undefined → setHex(undefined) = schwarz. Lösung: 6 neue Getter (getBRIGHT_*, getHALF_ORBIT) im registerActionsContext ergänzt; alle drei Highlight-Pfade (snapFocus, sway-lerp, restore-system) nutzen jetzt eine gemeinsame Hilfsfunktion _applyOrbitHighlight() via _ctx.
- Fix (Versionsnummer): Konstante
versionNumber auf aktuellen Stand gebracht.
- Fix (Orbitlinien schwarz):
DIM_ORBIT, DIM_MOON, DIM_AST, DIM_DWARF wurden aus orbitColorDim gelesen – ein Feld das planet/moon/asteroid/dwarf in categories.json nicht haben (dort orbitColorDimMobile/orbitColorDimDesktop). Resultat: undefined → setHex(undefined) → schwarz. Korrekte Felder werden jetzt gerätespezifisch gelesen.
- Fix (Orbit-Highlight bei Playback):
_snapFocus() (verwendet bei seq: none und seq: sway ohne aktiven Fokus) setzte keine Orbitfarben. Highlight-Logik analog zu allen anderen Fokus-Pfaden ergänzt.
- Neu (Script-Befehl
set-variable): Neuer optionaler Parameter languageCode – Variable wird nur gesetzt wenn die aktuelle Sprache übereinstimmt (z.B. DE, EN). Wert ALL oder Parameter weggelassen → immer setzen (bisheriges Verhalten bleibt erhalten).
- Fix (Overview Drift, Zoom-Ziel): Kamera zoomte auf statischen Fixpunkt statt auf den gedrifteten Stern –
getPos() im Overview-ClickTarget gibt jetzt mesh.position zurück. Zoom trifft jetzt immer präzise den Stern.
- Tweak (Sterngrößen):
STAR_R_SCALE in utils.js von 30 auf 40 Scene-Units erhöht – Sterne im System-View wirklichkeitstreu größer, ohne dass enge Mehrfachsysteme (z.B. EZ Aquarii) visuell kollidieren.
- Fix (Overview Drift, Zoom-Anim): Label-Projektion im
overview-zoom-Modus verwendete noch den statischen Fixpunkt statt der gedrifteten Mesh-Position → Label war während der Zoom-Animation versetzt. Behoben.
- Fix (Daten, Exoplaneten):
moonCount bei allen neu eingetragenen Planeten auf null (unbekannt) korrigiert – war fälschlicherweise 0.
- Fix (Daten, Konstellationen): 6 fehlende Einträge in
languages.json ergänzt: Altar (ara), Sextant (sex), Fliege (mus), Herkules (her), Südliches Dreieck (tra), Kiel des Schiffs (car) – je DE und EN.
- Daten: 10 neue Sternsysteme hinzugefügt (IDs 39–48): Gliese 687 (2 Eisriesen), Gliese 674 (1 Eisriese), LHS 292, Gliese 440 (Weißer Zwerg), GJ 1245 (Dreifachsystem), WISE 1741+2553 (Brauner Zwerg T9), Gliese 876 (4 Planeten inkl. 2 Gasriesen), WISE 1639-6847 (Brauner Zwerg Y0), GJ 3618, GJ 1002 (2 erdähnliche Planeten in der habitablen Zone). Datenquellen: Wikipedia, NASA Exoplanet Archive.
- Fix (Overview Stern-Drift): Amplitude deutlich erhöht – Bewegung ist jetzt auch bei Normaldistanz klar wahrnehmbar.
- Fix (Overview Crosshair): Crosshair folgt jetzt der gedrifteten Sternposition – kein Versatz mehr nach längerem Schweben.
- Neu (Overview): Sterne in der Sternkarten-Übersicht schweben jetzt sanft im Raum – jeder Stern driftet leicht um seinen festen Standpunkt, mit organischen, fließenden Bewegungen ohne abrupte Richtungswechsel. Labels und Verbindungslinien folgen der Bewegung.
- Wake Lock (iOS): Zusätzlicher Acquire-Versuch beim Klick auf den Audio-Prompt-Button – dieser ist eine explizite Benutzeraktion die iOS Safari als gültigen Gesture-Context akzeptiert. Damit greift der Wake Lock zumindest wenn der User Musik für ein Script einschaltet.
- Fix (Help-Panel Positionen): Default-Positionierung nicht mehr abhängig von
#ui-Rect – war Ursache für linke-Ecke-Bug wenn UI ausgeblendet. Panel 1 erscheint jetzt links der Bildschirmmitte, Panel 2 rechts davon, beide vertikal zentriert.
- Fix (Info-Panels während Playback): Root Cause gefunden –
_blockDuringPlay in recorder.js hat mit capture:true alle touchstart und click Events blockiert, auch auf Info-Panels. Info-Panels 1–3 jetzt aus der Sperre ausgenommen → Drag (Mobile) und Close (PC+Mobile) funktionieren während Playback.
- Fix (UI/Controlpanel unsichtbar):
getUIVisible() hat DOM-State gelesen der beim ersten Load none ist → UI blieb nach Systemwechsel versteckt. Ersetzt durch explizites _uiVisible-Flag (initial true), das nur durch show-ui-Action geändert wird.
- Fix (Hilfe-Panels linke Ecke): Folgefehler des UI-Flag-Bugs –
_positionPanel berechnete Position aus unsichtbarem #ui → py=0. Mit korrektem Flag positionieren sie sich wieder korrekt.
- Fix (Wake Lock): Pre-Acquire beim ersten User-Gesture.
- Fix (Info-Panel Drag Mobile):
e.preventDefault() im touchstart-Handler ergänzt; touch-action:none auf allen .visible Info-Panels – verhindert Text-Selektion und Browser-Scroll-Übernahme beim Drag.
- Fix (Wake Lock): Beim ersten User-Gesture (Touch/Click) wird der Lock kurz angefordert und sofort released – dadurch hat der Browser-Kontext WakeLock "gesehen" und gewährt später auch Requests ohne direkten Gesture (z.B. automatischer Script-Start via URL).
- Fix (Default-Speed):
speedIdx in state.js auf 1 (0.25×) gesetzt.
- Fix (Info-Panel Schließen während Playback):
close-panel Action setzt jetzt S._focusObjectPanels.pN = false – nachfolgende focus-object-Script-Actions öffnen das manuell geschlossene Panel nicht mehr neu.
- Fix (x-Markierung Mobile):
user-select:none auf alle sichtbaren Info-Panels (.visible) ergänzt.
- Fix (Infopanels während Playback): Drag-Guard
getPlayActive() aus panels.js entfernt – Verschieben und Schließen der Info-Panels 1–3 ist jetzt auf PC und Mobile während Playback erlaubt. userSelect:none auf Info-Panels während Playback ebenfalls entfernt.
- Fix (Wake Lock): Video-Fallback entfernt. Wake Lock wird jetzt im User-Gesture-Kontext des Play-Button-Klicks angefordert (
_acquireWakeLockOnGesture) – das ist die einzige zuverlässige Methode auf iOS Safari. Lock wird beim Script-Ende released.
- Fix (Crash overview.js):
getElementById('focusLabel') war null (Element in V8.26 entfernt) – Guard if (_fl) ergänzt.
- Fix (UI während Scriptplay):
overview.js hat ui.style.display = '' direkt gesetzt ohne _setUI() zu respektieren – Controlpanel erschien beim Overview-Wechsel während show-ui {state:false} aktiv war. Fix analog zu builder.js. getUIVisible/setUI in registerOverviewContext ergänzt.
- Fix (Surface-Button während Playback):
updateSurfaceBtnState() hat Playback-Dimming überschrieben. Prüft jetzt getPlayActive() und gibt Button während Playback nicht frei.
- Fix (Wake Lock iOS): NoSleep-Fallback via stummes Loop-Video ergänzt – für iOS Safari und Browser ohne
navigator.wakeLock-API.
- Fix (Mobile Indikatoren Position):
top von 44px auf 50px korrigiert – vertikal zentriert auf Höhe der Top-Buttons. Inline-Positionierung für Mobile aus _setTrackIndicator entfernt, CSS übernimmt das jetzt ohne Override-Konflikte.
- Fix (Wake Lock):
visibilitychange released den Lock nicht mehr manuell – OS managed das selbst. Bei OS-seitigem Entzug wird der Lock nach 200ms neu angefordert. Verhindert Screen-Dimming während Script läuft.
- UI (Track-Anzeige Mobile): Statt abgeschnittenem Songtitel wird auf engen Screens (unter 500px Breite) "Track ##" angezeigt. Wechselt automatisch bei Orientierungsänderung.
- Fix (Script-Abbruch UI):
builder.js rief ui.style.display = '' direkt auf ohne _setUI() – dadurch erschien das Controlpanel beim Systemwechsel während show-ui {state:false} aktiv war, und Restore-Button und Panel waren gleichzeitig sichtbar. builder.js ruft jetzt window._setUI(true) auf wenn verfügbar.
- UI Mobile (track-indicator): Track-Timer auf Mobile ausgeblendet,
max-width auf 40vw reduziert – Songtitel überlappt Buttons nicht mehr.
- UI Mobile (play/track-indicator): Auf Touch-Geräten werden Script- und Songtitel-Indikator jetzt links bzw. rechts neben den Top-Buttons positioniert – auf Höhe der Button-Zeile, gültig für Portrait und Landscape. Löst Überlappungen mit Titeltext und show-message.
- Fix (Hilfe-Button):
.panel-button bekommt pointer-events:auto; cursor:pointer per CSS-Klasse statt nur per Inline-Style. #hud z-index 10 → 20.
- Fix (Wake Lock): Bei OS-seitigem Entzug des Wake Locks (Akku, Tab-Wechsel) wurde kein erneuter Erwerb versucht.
release-Event-Listener ergänzt – Lock wird automatisch neu angefordert wenn Script noch läuft.
- Fix (z-order):
#play-indicator und #track-indicator auf z-index:15 gesetzt – liegen jetzt unter Infopanels (z-index:20) und Hilfe-Panels (z-index:200).
- Fix (show-ui persistent):
builder.js hat beim System-Laden das UI bedingungslos eingeblendet – show-ui { state: false } im Script wurde dadurch überschrieben. builder.js liest jetzt via getUIVisible() ob das UI sichtbar sein soll und respektiert den gesetzten Zustand.
- UI (Mobile): Titelbereich umstrukturiert –
systemLabel alleine in Zeile 1, alle Buttons (UI-Restore, Hilfe, Sprache, Audio-Prompt) in neuer Zeile 2 (#hud-buttons) zentriert darunter. Löst Überlappungen im Hochformat.
- UI (Mobile):
focusLabel (Fokus-Objekt-Name im Topbereich) entfernt – das fokussierte Objekt wird im 3D-Label bereits gelb hervorgehoben. Reduziert Überlappungen im Hochformat. Alle JS/CSS-Referenzen bereinigt, overview.js abgesichert.
- Fix (Audio-Init Recording):
set-volume wird jetzt immer gescriptet – idx:0 wenn Audio aus, damit Playback Audio-Stille korrekt reproduziert.
- Fix (Screenshot): Doppel-Listener entfernt –
controls.js hat den Button zusätzlich zu initScreenshotBtnFn verdrahtet. initScreenshotBtnFn ruft jetzt direkt initScreenshotBtn() aus screenshot.js auf (pointerup → doScreenshot ohne Umweg über runAction).
- Fix (lock-track Recording):
lock-track scriptet jetzt immer den State (true/false) – Toggle-Zustand wird in runAction vor dem recRecord-Aufruf vorberechnet.
- Fix (lock-track Init):
lock-track wird im Recording-Init immer gescriptet (auch wenn false) – damit Playback den Lock-Zustand korrekt reproduziert.
- Fix (set-track Regex):
getCurrentTrack() in audio.js gab den Regex-Pattern aus tracks.json zurück statt des aufgelösten System-Keys – jetzt wird _currentContext.systemKey verwendet.
- Fix (Zurück zur Systemübersicht):
_S._zoomOutStart/_S._zoomOutEnd waren null – Zugriff jetzt über _ctx.getZoomOutStart()/_ctx.getZoomOutEnd(). Getter in registerActionsContext() ergänzt.
- Fix (Audio im Recording): Recording scripted jetzt Audio-Lautstärke nur wenn beim Aufzeichnen Audio tatsächlich aktiv war – verhindert ungewollten Musik-Start beim Playback.
- Fix (
_S.sys in actions.js): Alle Zugriffe auf _S.sys durch _ctx.getSys() ersetzt. getSys-Getter in registerActionsContext() ergänzt. getAudioEnabled in registerRecorderContext() ergänzt.
- Fix (Zurück zur Systemübersicht):
_zoomOutStart/_zoomOutEnd Getter ergänzt – vorläufiger Fix, in V8.23 weitergeführt.
- Fix (Log/Lin-Skala): Umschaltung zwischen logarithmischer und linearer Distanzskala über
_ctx synchronisiert – war nach actions.js-Refactor nicht mehr wirksam.
- Fix (Screenshot): Screenshot-Funktion in
actions.js stabilisiert nach Refactor-bedingten Zugriffsfehlern auf Renderer und Canvas.
- Fix (Surface-Modus Exit):
start-surface/end-surface lasen _S._surfaceMode aus state.js statt der lokalen Variable – jetzt über _ctx.getSurfaceMode().
- Fix (Hilfe-Button bleibt highlighted):
helpBtn2 wird jetzt auch aktualisiert wenn ein Panel direkt über den X-Button geschlossen wird.
- Fix (Screenshot): Screenshot-Button wird nach der Initialisierung auf
runAction('screenshot') umgeleitet – vermeidet den Fullscreen-Mechanismus der zu leeren Captures führte.
- Fix (actions.js Refactor Sync):
_overviewTargetSystemId durch S._overviewTargetSystemId ersetzt – war die Ursache des Stern-Klick-Fehlers. setSys/setStarSystemID schreiben jetzt auch in S. Lichtstärke-Slider: _lightFactor wird jetzt über _ctx gelesen/geschrieben statt direkt über _S. Log-Scale-Toggle ebenfalls über _ctx synchronisiert.
- Fix (actions.js Refactor): Lokale Arrays
clickTargets, starsystems, starObjects, overviewObjects, neighbourStarObjects, zoneObjects, atmoMeshes etc. in astroviewer.html durch S.xxx ersetzt – actions.js liest diese jetzt korrekt über _S. War die Ursache dass Stern-Klicks, System-Navigation und Lichtstärke-Slider nichts bewirkt haben.
- Refactor: ACTION_REGISTRY (~1590 Zeilen) aus
astroviewer.html in actions.js ausgelagert. Kommunikation über registerActionsContext() analog zu allen anderen Modulen. DEV_MODE wird jetzt konsistent in S.DEV_MODE geschrieben. skipSingleStars sowie Audio-State-Flags in state.js ergänzt. astroviewer.html reduziert von ~3700 auf ~2150 Zeilen.
- Fix (Hover-Ring verschoben bei Kamerabewegung):
camera.updateMatrixWorld() wird jetzt explizit vor der Projektion aufgerufen – Three.js aktualisiert matrixWorld sonst erst bei renderer.render(), was zu einem Frame Lag in der Ellipsen-Position führte.
- Faktor Sterne: 1.7 → 1.5. Planeten/Monde: 1.25 → 1.35 (etwas mehr Abstand bei kleinen/weit entfernten Objekten).
- Fix (Hover-Ring Größe): Basis ist jetzt
tgt.r (visueller Mesh-Radius), nicht Hit-Sphere. Faktor 1.25× für Planeten/Monde (Atmosphäre), 1.7× für Sterne (Glow-Kern). Kein oberes Cap. Ring skaliert damit korrekt bei beliebigem Zoom.
- Fix (Hover-Ring zu klein bei Nahzoom):
Math.min(200)-Cap entfernt – der Ring kann jetzt beliebig groß werden. Faktor auf 2.8× Hit-Sphere erhöht. Math.abs für Robustheit bei extremen Blickwinkeln.
- Fix (Hover-Ring Radius): Randpunkte werden mit 2.2× Hit-Sphere-Radius projiziert – kein fixer Pixel-Offset mehr, der Ring skaliert proportional auch bei starkem Nahzoom. Bitte im Browser-Tab prüfen ob der Titel „AstroViewer V8.13" zeigt (Cache!).
- Fix (Hover-Ring zu klein beim Ranzoomen): Radius wird jetzt durch direkte Projektion von 4 Randpunkten der Hit-Sphere auf den Screen berechnet – funktioniert korrekt bei beliebigem Zoom und berücksichtigt automatisch Perspektivverzerrung am Bildrand.
- Neu (Hover-Ring als Ellipse): Der Ring passt sich jetzt der perspektivischen Verformung des Objekts an – er wird oval wenn das Objekt am Bildrand steht, genau wie das Objekt selbst.
- Fix (Hover-Puls Asymmetrie): Durch die Ellipsen-Implementierung wächst der Ring jetzt konzentrisch von der Mitte – kein einseitiger Wachstumspunkt mehr.
- Fix (Hover-Ring zu klein): Basis ist jetzt Hit-Sphere-Screenradius × 1.3 + 8px – die Hit-Sphere ist bereits r × HIT_MULT und damit deutlich größer als der visuelle Mesh-Radius.
- Fix (Hover-Puls): Pulsieren wieder über Radiusgröße (±4px), Opazitätspuls entfernt.
- Fix (Hover-Lag beim Kamera-Schwenken): Beim Drag wird der Marker jetzt sofort ausgeblendet statt auf dem Objekt zu verbleiben.
- Fix (Screenshot schwarz/leer): Fullscreen-Schritt entfernt – er verursachte zuverlässig leere Captures (visibility events, Canvas-Reset, rAF-Throttling beim Tab-Wechsel). Der Renderer läuft bereits mit devicePixelRatio ≤ 2, was auf HiDPI-Screens ausreichend Auflösung liefert.
- Fix (Hover-Ring zu klein): Radius wird jetzt als Maximum aus zwei Methoden berechnet – Mesh-Radius×1.65 (deckt Glow/Sprite-Überhang ab) und Hit-Sphere-Radius+6px. Ring liegt damit auch bei nah gezoomten Sternen/Planeten immer außen.
- Fix (Hover-Puls asymmetrisch): Pulsieren läuft jetzt über Opazität statt Radiusgröße – kein einseitiges Wachsen mehr, kein Richtungsartefakt.
- Fix (Screenshot kaputt): Nach dem Fullscreen-Enter wird jetzt auf das
resize-Event gewartet (statt blindem 3×rAF), damit W()/H() die Fullscreen-Dimensionen liefern. Fallback nach 400 ms.
- Fix (Hover-Ring zu klein bei Nahzoom): Ringradius basiert jetzt auf dem tatsächlichen Raycasting-Radius der Hit-Sphere (inkl. HIT_MULT), nicht auf dem visuellen Mesh-Radius – der Ring liegt damit auch bei nah gezoomten Objekten immer außen. Rotation wieder durch gleichmäßiges Pulsieren ersetzt.
- Fix/Verbesserung (Hover-Marker): Farbe auf Interface-Grün (
#22dd66) geändert, Strich etwas dicker. Mindestradius des Rings ist jetzt immer der sichtbare Objektradius + 7 px – der Ring liegt so nie mehr im Objekt. Pulsieren ersetzt durch gleichmäßige Rotation des gestrichelten Rings (smootherer Effekt, keine einseitige Verzerrung).
- Neu (Hover-Effekt im System-View): Bewegt man die Maus über ein Objekt (Planet, Mond, Stern, Asteroid usw.), erscheint ein dezenter weißer gestrichelter Ring mit sanftem Pulsieren um das Objekt. Der Ring passt seine Größe automatisch an den visuellen Radius und die Kameradistanz an. Beim Anklicken (Fokussieren) blendet er sich aus. Nur auf Desktop aktiv.
- Fix (Distanzlinien erschienen ungewollt beim Systemwechsel): Beim Start der Zoom-Sequenz (
zoom-overview-to) wurde showOverviewConnections aufgerufen – ursprünglich als visuelles Feedback gedacht, jetzt aber störend. Beide Aufrufstellen entfernt.
- Fix (Crosshair riesig während Zoom-Sequenz):
ovUpdateCrosshair() wurde im Animate-Loop nur im normalen Overview-Modus aufgerufen, nicht während overview-zoom. Das Crosshair blieb dadurch auf der letzten manuell eingestellten Größe eingefroren. Jetzt wird es auch während der Einflug-Sequenz kontinuierlich mit der Kameradistanz mitresized.
- Fix (Overview Mobile): Tap in den freien Raum blendet Distanzlinien aus und stellt jetzt das Crosshair wieder ein, falls eines aktiv war (
deselect-overview).
- Fix/Neu (Overview Mobile): Buttons „vorheriges/nächstes System" blenden jetzt auf Mobile die Distanzlinien aus und das Crosshair wieder ein, bevor das neue Crosshair gesetzt wird. Der „Gehe zum System"-Button blendet ebenfalls die Distanzlinien aus und stellt das Crosshair wieder her, bevor der Systemwechsel startet. Auf Desktop bleibt das Verhalten unverändert.
- Fix (Crosshair verschwand beim Hovern nicht):
ovCrosshairSetVisible wurde zwar in astroviewer.html und input.js korrekt verdrahtet, fehlte aber im Context-Objekt das init.js an input.js übergibt – der eigentliche Kanal durch den alle Module ihren Context bekommen.
- Neu (Overview Crosshair Design): Ring in hellem Grün (
#22dd66, identisch mit Info-Panel-Rahmen) mit dunklem Glow-Halo dahinter. Ticks zweischichtig – heller Außenrand, dunkler Kern – passend zum Info-Panel-Farbschema.
- Neu (Overview Crosshair Sichtbarkeit): Beim Hovern über einen Stern (Desktop) wird das Crosshair ausgeblendet und beim Verlassen des Hover-Bereichs wieder eingeblendet. Auf Mobile: erster Tap blendet das Crosshair aus, zweiter Tap (Systemwechsel) blendet es kurz davor wieder ein. Der Index des Crosshair-Sterns geht dabei nicht verloren.
- Fix (Watchdog-Warnings bei normaler Script-Ausführung):
_visibleSleep.cancel() resolved die interne Promise mit false statt mit undefined – dadurch unterscheidet der Watchdog jetzt zwischen echtem Timeout (true) und vorzeitigem Abbruch weil die Action fertig war (false). Warnings erscheinen nur noch bei tatsächlichem Timeout. Zusätzlich: Race-Condition in _tick() behoben wenn der Tab zwischen Schedule und Tick-Aufruf unsichtbar wird.
- Fix (Script-Platzhalter Lokalisierung):
[[focus.constellationName]] gibt jetzt den lokalisierten Sternbildnamen zurück (via constellation.<key> i18n-Eintrag), analog zum Infopanel. Ebenso [[focus.subcat]] für den lokalisierten Subkategorienamen (z. B. „Gasriese", „Eisriese"). Fallback auf Rohdaten wenn kein i18n-Eintrag vorhanden.
- Erweiterung (
begin-if): Conditions unterstützen jetzt logische Verknüpfungen mit && (AND) und || (OR), wobei && stärker bindet. Zusätzlich: <> als Alias für !=, automatisches Entfernen von Anführungszeichen um Werte (einfach oder doppelt). Im DEV_MODE wird jede Condition mit aufgelöstem Ausdruck und Ergebnis ins Console-Log geschrieben.
- Neu (Script-Befehl
begin-if / end-if): Bedingte Ausführung von Script-Blöcken. Der Parameter condition wird ausgewertet – Platzhalter wie [[focus.category.key]] werden aufgelöst, danach wird verglichen. Unterstützte Operatoren: ==, !=, <, >, <=, >=. Zahlenvergleich wenn beide Seiten numerisch, sonst String-Vergleich. Ohne Operator gilt der aufgelöste Wert als truthy (nicht leer, nicht 0, nicht false). Verschachtelungen werden korrekt behandelt.
- Umbenennung (Script-Befehle):
loop-begin → begin-loop und loop-end → end-loop, entsprechend der Verb-Hauptwort-Konvention aller anderen Befehle. Betrifft commands.json, recorder.js und astroviewer.html.
- Neu (Script-Platzhalter):
[[focus.category.name]] gibt den lokalisierten Namen der Kategorie des fokussierten Objekts zurück (z. B. „Planet", „Mond", „Stern") – sprachabhängig wie die Info-Panels. Mit [[focus.category.key]] erhält man den Roh-Key (z. B. planet, moon, star). Weitere Felder des Kategorie-Objekts aus categories.json sind ebenfalls zugänglich, z. B. [[focus.category.labelColor]].
- Fix (Script lief im Hintergrund aus dem Takt): Wenn der Tab nicht sichtbar war, pausierte der Browser den Animations-Loop (
requestAnimationFrame), der Watchdog-Timer lief aber weiter – Kameraübergänge und andere Aktionen sprangen dadurch vorzeitig ab und der Script-State wurde inkonsistent. Lösung: Der Watchdog zählt jetzt nur sichtbare Zeit (_visibleSleep), d. h. er pausiert automatisch sobald der Tab in den Hintergrund wechselt und läuft erst weiter wenn er wieder sichtbar ist. Betrifft alle Script-Befehle gleichermassen (Systemübergänge, Focus, Wait, etc.).
- Fix (Simulations-Zeitsprung nach Tab-Wechsel): Beim Zurückkehren aus dem Hintergrund wird
lastTime jetzt zurückgesetzt, damit kein akkumulierter dt-Sprung die Orbits und Rotationen ruckeln lässt.
- Fix (
skip-track landete bei den ersten Aufrufen an falscher Position): loadedmetadata reicht nicht – ein currentTime-Sprung ist erst ab readyState >= 4 (HAVE_ENOUGH_DATA / canplaythrough) zuverlässig. Außerdem wird der Listener jetzt gegen Track-Wechsel abgesichert, sodass ein hängender Listener nicht versehentlich auf einem neuen Track feuert.
- Fix (
skip-track sprang beim zweiten Song an die falsche Position): duration des neuen Tracks war zum Zeitpunkt des Aufrufs noch nicht geladen. skipToEnd() wartet jetzt bei unbekannter Länge auf loadedmetadata bevor es springt.
- Fix (
lock-track state: auto spielte immer denselben Song): Ursache war el.loop = true – der Track endete nie, also feuerte das ended-Event nie und der Lock wurde nie geöffnet. Im Auto-Lock-Modus wird loop jetzt auf false gesetzt; ein ended-Listener öffnet den Lock und startet den nächsten passenden Track für den aktuellen Systemkontext.
- Neu (
skip-track): Test-Befehl der den laufenden Track auf die letzten 2 Sekunden spult. Damit lässt sich der Auto-Lock-Wechsel in Sekunden testen statt einen ganzen Song abwarten zu müssen.
- Neu (
lock-track): Neuer Modus state: auto. Solange ein Song spielt, ist der Track gesperrt (kein automatischer Wechsel durch Systemwechsel oder Fokus). Endet der Track oder wird er gestoppt, entsperrt sich der Lock automatisch – der nächste passende Track kann dann wieder starten und sperrt sich erneut. Nützlich beim Scripten, um Songs zu Ende zu spielen ohne Dauerschleife zu erzwingen. Ein explizites state: true oder state: false im Script hebt den Auto-Modus dauerhaft auf.
- Aufräumen: Alle hardgecodierten Inline-Styles aus dem HTML und aus
panels.js in die externe CSS-Datei ausgelagert. Betroffen: #play-indicator, #track-indicator und deren Kindelemente (.play-indicator-label, .play-indicator-pause-icon, .track-indicator-icon, #track-title-display, #track-timer-display), #help-panel, #help-panel2 sowie die Close-Buttons (.help-panel-close). Die dynamisch erzeugten Close-Buttons der Infopanels (panels.js) nutzen nun ebenfalls die CSS-Klasse statt style.cssText.
- Fix (Text in Infopanels während Playback markierbar): Während der Script-Wiedergabe wird auf den drei Infopanels nun
user-select:none gesetzt, sodass kein Text (auch nicht ausgehend vom deaktivierten ✕-Button) markiert werden kann. Nach dem Playback wird die Einstellung zurückgesetzt.
- Fix (Meldungen erscheinen während Playback leicht versetzt):
show-message berechnete die horizontale Zentrierposition einmalig zum Zeitpunkt des Aufrufs. Bei Systemwechseln konnte W() kurzzeitig einen abweichenden Wert haben. Ohne explizite X-Position wird die Meldung nun per left:50%; transform:translateX(-50%) zentriert – damit bleibt sie immer exakt mittig, unabhängig vom Zeitpunkt der Berechnung.
- Fix (Audio-Prompt-Button reagiert nicht auf Klick):
_blockDuringPlay() in recorder.js fängt während Script-Playback alle Klicks in der Capture-Phase ab. Der Audio-Prompt-Button wird nun explizit ausgenommen, analog zum Stop-Button. Button zurück in #viewtitle verschoben.
- Fix (Audio-Prompt-Button reagiert nicht auf Klick): Button aus
#viewtitle herausgelöst und als position:fixed direkt im Body platziert – applyLang() oder andere UI-Rebuilds können den Button nicht mehr aus dem DOM entfernen.
- Debug: Audio-Prompt-Button nutzt nun
addEventListener statt onclick mit expliziter Handler-Verwaltung; console.log beim Klick zur Diagnose ergänzt.
- Fix (Audio-Prompt-Button nicht klickbar):
_playStart() in recorder.js setzte beim Start pointer-events:none auf alle .panel-button-Elemente – der Button hatte zu diesem Zeitpunkt noch display:none, die Ausnahmeregel griff deshalb nicht. _showAudioPrompt() setzt nun pointer-events:auto und opacity explizit, um ein vorheriges Dimming zu überschreiben.
- Fix (Buttons im Controlpanel erscheinen während Script als aktiv nach Systemwechsel): Beim Script-Start werden alle Buttons abgedunkelt, aber Buttons die durch einen Systemwechsel neu ins DOM gebaut werden blieben hell. Neue Funktion
applyPlayDim() in recorder.js wird nach jedem loadStarSystem()-Aufruf erneut ausgeführt und dimmt nachträglich gebaute Buttons.
- Fix (Audio-Prompt-Button nicht klickbar während Script):
recorder.js setzte beim Start pointer-events:none auf alle .panel-button-Elemente inkl. des Audio-Prompt-Buttons. Er wird jetzt explizit ausgenommen.
- Fix (Autoplay-Block-Hinweis während Script): Der pulsierende Music-Button aus V7.81 wurde während Script-Playback nicht angezeigt, weil der UI verdeckt ist. Der Pulse wird nun zurückgestellt und erscheint erst sobald das Script beendet ist.
- Pulsierender Music-Button hinzugefügt.
- Standard-Simulationsgeschwindigkeit für Planeten und Monde von 1× auf 0,25× reduziert – die Bewegung beim Start ist nun deutlich ruhiger. Der verfügbare Geschwindigkeitsbereich (0,1× – 20×) bleibt unverändert.
- Performance: Animationsschleife belastet CPU/Lüfter deutlich weniger. Fünf Optimierungen: (1) Kein Rendering wenn der Browser-Tab nicht sichtbar ist. (2) Topologische Sortierung der Sterne und Key-Map werden nicht mehr jeden Frame neu berechnet, sondern beim Systemwechsel einmalig gecacht. (3) Planeten- und Zonen-Lookups nutzen die gecachte Map statt linearer Suche. (4) Mond-Positionen werden ohne temporäre Objekt-Allokationen berechnet. (5) Overview-Label-Positionierung wiederverwendet bestehende Vektoren statt neue zu erzeugen.
- Fix (Overview spielt beim ersten Aktivieren von Audio den falschen Track): Ursache endgültig identifiziert – beim Einschalten von Audio wurde zuerst korrekt
overview getriggert, dann aber sofort von onSystemChanged(sys.key) überschrieben, weil sys im Overview noch auf das zuletzt geladene System (sol-system) zeigt. Fix: isOverview wird vor sys geprüft, sodass im Overview-Zustand immer onSystemChanged('overview') aufgerufen wird.
- Fix (Overview spielt beim ersten Aktivieren von Audio den falschen Track): Konsolenlogs zeigten dass beim Aktivieren
onSystemChanged("sol-system") geflusht wurde – weil init.js beim Start zuerst ein Sonnensystem lädt und danach erst den Overview. Der zuletzt gemerkete Key war also "sol-system" statt "overview". Neuer Export setContext() in audio.js überschreibt den gemerketen Kontext auch wenn Audio noch aus ist. loadOverview ruft jetzt immer setContext('overview') auf, unabhängig vom Audio-Status.
- Fix (Audio-Fehler beim Stoppen / Titel verschwindet nach Reaktivierung):
_stopElement() setzte src = '' – der Browser interpretiert das als relative URL und versuchte die Hauptseite als Audiodatei zu laden, was einen Fehler auslöste und den internen Audio-State zerstörte. Folge: falscher Track beim ersten Overview-Besuch, fehlender Titel nach Reaktivierung. Fix: src = '' durch removeAttribute('src') ersetzt.
- Fix (Overview spielt beim ersten Aktivieren von Audio den falschen Track): Beim Einschalten von Audio im Overview-Zustand wurde kein Track gestartet, weil kein aktives System vorhanden ist. Ein kurz darauf folgender anderer Trigger spielte dann den Regex-Fallback statt dem Overview-Track. Fix in
astroviewer.html: beim Einschalten von Audio wird nun auch im Overview-Zustand (sys = null, isOverview = true) explizit onSystemChanged('overview') aufgerufen.
- Fix (Overview spielt beim ersten Betreten Asteroid Alley): Der initiale
onSystemChanged("overview")-Call kam an bevor Audio vom User aktiviert wurde – der gemerkete Call wurde nach dem Track-Laden geflusht, aber Audio war noch aus, wodurch er verpuffte. Später spielte ein anderer Trigger den Regex-Fallback. Fix: setAudioEnabled(true) flusht den gespeicherten Call nun ebenfalls, sodass nach dem ersten Aktivieren von Audio immer der korrekte Track des aktuellen Kontexts startet.
- Fix (Overview spielt beim ersten Betreten den falschen Track): Wenn der Overview aufgerufen wurde bevor
tracks.json fertig geladen war, fand die Track-Suche keinen Eintrag und spielte später einen Regex-Fallback statt dem expliziten Overview-Track. onSystemChanged merkt sich jetzt den Aufruf und holt ihn nach dem Laden der Tracks nach.
- Audio-Fallback: Track-Suche unterstützt jetzt Regex-Muster im
system-key Feld (Format: "/pattern/"). Damit lässt sich ein Track für eine ganze Gruppe von Systemen hinterlegen – z.B. alle Systeme die mit a–f beginnen. Greift nur wenn kein exakter Match gefunden wird. Ungültige Muster werden ignoriert (Konsolen-Warnung). Außerdem kann nun ein globaler Fallback-Track ohne system-key und object-key in tracks.json hinterlegt werden.
- Fix (Startfehler nach Refactoring):
animate.js startet jetzt problemlos, auch wenn der Animations-Loop vor der vollständigen Initialisierung aufgerufen wird. Fehlender Null-Guard führte zu einem Absturz beim ersten Frame.
- Refactoring: Doppelter und toter Code aus
astroviewer.html entfernt (~20 KB). animate(), alle _anim*-Vektoren und der Star-Cache wurden aus dem HTML-Script entfernt – sie leben vollständig in animate.js. Surface-Glow- und Starburst/Flare-Sichtbarkeitslogik nach animate.js migriert (inkl. neuem getCmpMode-Context-Getter). Drei tote Wrapper-Funktionen (visDist, raDecDistToXYZ, _doScreenshot) und die ungenutzte Konstante MOON_R_T/G entfernt. Keine funktionale Änderung.
- Fix (Mobile/iOS Cyan-Dots): Alle Glow-Sprites (System + Overview) von
CanvasTexture auf DataTexture umgestellt. Canvas-2D-API premultipliziert intern immer – auch premultiplyAlpha: false auf der Texture hilft nicht, weil die Pixel bereits premultipliziert aus dem Canvas kommen. DataTexture gibt direkte RGBA-Kontrolle ohne Premultiplizierung.
- Fix (Mobile Pinch → unbeabsichtigter Focus):
startX/Y aller aktiven Touches wird beim Übergang zu Pinch (2. Finger) auf die aktuelle Position geupdated. Vorher wurde vom initialen Touchdown-Punkt gemessen – lag der auf einem Objekt, feuerte Loslassen fast immer einen Click. Zusätzlich Touch-Click-Threshold von 10px auf 18px erhöht.
- Fix (Mobile/iOS Cyan-Dots): WebGL-Renderer mit
premultipliedAlpha: false auf Mobile initialisiert. Der iOS/Safari-Compositor multipliziert bei premultipliedAlpha: true (WebGL-Default) AdditiveBlending-Sprites nochmals mit Alpha beim Compositing auf den Bildschirm – das erzeugt deterministisch Cyan/Grün-Artefakte. Desktop unverändert (premultipliedAlpha: true).
- Fix (Mobile/iOS Cyan-Dots): Surface-Glow-Shader-Mesh auf Mobile komplett deaktiviert. Der noise-basierte GLSL-Shader erzeugt durch
fract(sin())-Hash-Berechnungen mit mediump-Präzision auf Apple-GPUs deterministisch Cyan-Dots die sich mit der Skalierung der Glow-Sprites verschieben. Auf Mobile wird stattdessen ein einfacher Glow-Sprite in Sternfarbe verwendet. Desktop-Darstellung unverändert.
- Fix (Mobile/iOS Cyan-Dots): Ursache gefunden – alle Glow/Starburst-
CanvasTexture-Objekte hatten premultiplyAlpha = true (Three.js-Default). Bei AdditiveBlending ist das falsch: die GPU multipliziert die RGB-Kanäle nochmals mit Alpha, was auf iOS-Geräten zu deterministischen Cyan/Grün-Artefakten an Farbübergängen führt. Fix: premultiplyAlpha = false auf allen Canvas-Texturen die mit AdditiveBlending verwendet werden (System + Overview).
- Fix (Mobile/iOS Cyan-Dots): Ursache endgültig identifiziert – der
spot-Term im Surface-Glow-Shader erzeugt deterministisch helle Speckles mit sehr hohem Alpha. Bei AdditiveBlending führt das zu einem Cyan-Shift weil der B-Kanal der Sternfarbe relativ zu den gesättigten R+G-Kanälen überbewertet wird. Auf Mobile wird der spot-Term deaktiviert. Desktop unverändert.
- Fix (Mobile/iOS Cyan-Artefakte): Eigentliche Ursache identifiziert –
alphaTest > 0 kombiniert mit AdditiveBlending auf Apple-TBDR-GPUs liest beim Fragment-Test aus uninitialisierten Tile-Memory-Farben, was Cyan/Grün-Pixel erzeugt. Fix: alphaTest: 0 auf allen Sprites und Materialien mit AdditiveBlending (System + Overview). Der Radial-Gradient sorgt bereits für Alpha=0 an den Rändern.
- Fix (Mobile/iOS):
alphaTest auf Surface-Glow-ShaderMaterial durch discard im Fragment-Shader ersetzt (nur Mobile). Starburst-Kern- und Spike-Farbe auf Mobile von Weiß auf Sternfarbe geändert (Channel-Overflow-Prävention).
- Fix (Mobile Pinch): Traf der erste Finger kurz vor dem zweiten auf, wurde ein Mini-Drag gestartet der nach dem Loslassen als Rotation oder versehentlicher Focus gewertet wurde. Sobald ein zweiter Finger erkannt wird, werden der laufende Drag und alle Akkumulatoren jetzt sofort zurückgesetzt. Zudem wird der Kamera-Rotate-Dispatch am Ende einer Geste komplett unterdrückt wenn 2+ Finger aktiv waren.
- Fix (Mobile Touch): Pinch-to-Zoom löste nach dem Loslassen fälschlicherweise einen Tap aus, was den Auto-Focus startete. Der Click wird jetzt nach jeder Geste mit 2+ Fingern unterdrückt.
- Fix (Mobile Buttons): Tap auf Control-Panel-Buttons reagierte verzögert (~150 ms). Ursache war ein globaler Double-Tap-Blocker auf dem gesamten UI. Dieser greift jetzt nur noch auf dem 3D-Canvas; Buttons nutzen stattdessen CSS
touch-action: manipulation direkt.
- Anpassung (Overview): Starburst-Strahlen und Glow deutlich abgeschwächt – Strahlenlänge auf weniger als die Hälfte reduziert, Intensität gesenkt. Glow-Kreise aller drei Ebenen transparenter, damit der Stern selbst wieder klar sichtbar ist.
- Fix (Ladevorgang): Textur-Requests ohne Server-Antwort blockierten Queue-Slots dauerhaft – der Ladebalken blieb bei 95–98% hängen. Jeder fetch()-Aufruf hat jetzt ein 12-Sekunden-Timeout; bei Ablauf wird automatisch die nächste Fallback-Textur probiert statt endlos zu warten.
- Fix: Screenshot-Dateiname enthielt UTC-Zeit statt lokaler Uhrzeit. Fix: Timestamp wird jetzt aus den lokalen Datums-/Zeitfeldern zusammengebaut statt aus
toISOString().
- Neu (Overview): Starburst-Sprite mit 8 Lichtstrahlen (4 lang + 4 kurz) zu allen Overview-Sternen hinzugefügt, identische Technik wie im Systemmodus. Intensität und Größe skalieren mit Leuchtkraft. Regler und Cleanup korrekt eingebunden.
- Anpassung (Overview): Basis-Glowstärke und -Größe aller drei Glow-Ebenen um ca. 25% reduziert – Opazitätsgrenzen und Radien entsprechend angepasst.
- Fix (Overview Regler): Glow-Gradient wurde mit gebackener Opazität in den Canvas gezeichnet –
material.opacity hatte dadurch kaum Wirkung. Fix: Gradient immer mit opacity=1.0 normalisiert, Helligkeit kommt nun ausschließlich über material.opacity (wie in builder.js). _baseOpacity und _baseScale werden jetzt korrekt ohne lf-Faktor gespeichert.
- Fix (Glow-Qualität Desktop):
alphaTest auf allen Glow-Sprites und dem Surface-Glow-Shader nur noch auf Mobile aktiv (isMobile ? 0.01 : 0). Auf Desktop entfällt das harte Pixel-Clipping – weiche Übergänge wie im System-Modus.
- Fix (Overview): Helligkeitsregler ließ die Glows beim Hoch- und Runterschalten kleiner werden statt größer. Ursache:
_baseOpacity enthielt den bereits mit dem lf-Faktor multiplizierten Wert, und _baseScale fehlte auf den neuen glowInner/glowOuter-Sprites komplett (→ NaN). Fix: Basiswerte ohne lf-Faktor gespeichert, _baseScale korrekt gesetzt.
- Fix (iOS): Surface-Glow-Shader-Mesh (
ShaderMaterial) hatte kein alphaTest – das war der Hauptverursacher der Cyan-Artefakte im System-Modus. Fix: alphaTest: 0.001 dem ShaderMaterial hinzugefügt.
- Fix (Overview): Helligkeitsregler aktualisierte nur den Basis-Glow-Sprite, nicht die zusätzlichen glowInner/glowOuter-Sprites. Fix: Handler in astroviewer.html erweitert; _baseOpacity/_baseScale werden jetzt auch auf glowInner/glowOuter gesetzt. Außerdem Glow-Opazität und -Radius weiter abgeflacht für gleichmäßigere Darstellung.
- Fix (Compare): Glow-Gradient weicher gestaltet (mehr Stops, flacher abfallend) – die sichtbaren Kanten/Ecken an den Glow-Ringen sind damit behoben.
- Fix (iOS): Cyanfarbene Artefakt-Punkte weiterhin reduziert – Ursache waren alle
AdditiveBlending-Sprites ohne alphaTest, nicht nur der Shader. Fix: alphaTest: 0.01 konsistent zu allen Glow-Sprites in builder.js, overview.js und compare.js hinzugefügt.
- Fix (Overview): Glow zu intensiv und asymmetrisch zwischen hellen/dunklen Sternen. Starburst-Sprites entfernt (Canvas-Linien funktionierten als Sprite-Textur nicht korrekt). Opazität und Radius gleichmäßig über Luminosität skaliert – kein starker Sprung mehr zwischen M-Zwergen und G-Sternen.
- Fix (Compare): Starburst- und Halo-Sprites entfernt. Im Nahbereich des Vergleichsmodus wirkten die Strahlen deplatziert; die drei Glow-Sprites reichen dort aus.
- Fix (iOS): Cyanfarbene Artefakt-Punkte um Sterne auf Apple-Geräten behoben. Ursache war fehlende Floating-Point-Präzision auf Apple-GPUs. Fix: Renderer auf
precision: 'highp' umgestellt (Haupt-Renderer und Compare-Renderer), sowie explizites precision highp float im Oberflächen-Glow-Shader.
- Neu (Overview): Sterne im Übersichtsmodus erhalten jetzt einen zweischichtigen Glow (innerer + äußerer Sprite) sowie bei leuchtkräftigen Sternen einen dezenten Starburst – optisch näher an der Darstellung im Systemmodus, rechenarm da Canvas-Sprites.
- Neu (Compare): Sterne im Vergleichsmodus erhalten Starburst- und Halo-Sprites analog zum Systemmodus, damit die Darstellung nicht mehr so abweicht.
- Fix: CSS-Warning "Regelsatz wegen ungültigem Selektor ignoriert" –
#sliderInput::-webkit-slider-thumb:hover ist in CSS nicht gültig (Pseudo-Element + Pseudo-Klasse kombiniert). Fix: auf #sliderInput:hover::-webkit-slider-thumb umgestellt.
- Fix: CSS-Warning "undefined" bei font-size / color – LCOLOR und LSIZE fehlten Fallback-Werte wenn ein labelType-Key nicht in den Kategoriedaten vorhanden war. Fix: Fallbacks (weiß / 11px) direkt beim Aufbau der Lookup-Tabellen und als Proxy-Guard auf den Gettern.
- Fix: Cursor-SVG wurde bei jeder Mausbewegung neu gesetzt auch wenn sich die Zone nicht änderte, was DevTools mit GET-Einträgen für die data:-URL überschwemmte. Fix: style.cursor wird nur noch geschrieben wenn sich der Wert tatsächlich ändert.
- Fix (grundlegend): Textur-Loading komplett auf fetch-basiertes Laden umgestellt. Problem war, dass Cloudflare Pages bei fehlenden Dateien manchmal eine HTML-Fehlerseite mit Status 200 statt 404 liefert – THREE.TextureLoader hat das als kaputtes Bild behandelt und sinnlose Retries ausgelöst. Neu: fetch prüft Content-Type (muss image/* sein), lädt den Blob vollständig herunter, und erst dann wird TextureLoader aufgerufen. Partieller Transfer und HTML-Fehlerseiten werden damit sauber erkannt und sofort als fehlend gecacht.
- Fix: Retry-Schleife entfernt. Bei Netzwerkfehlern half ein sofortiger Retry auf dieselbe URL nicht – das Bild kam wieder kaputt an. Stattdessen wird bei jedem Fehler sofort die nächste Fallback-URL probiert.
- Fix: Textur-Preload schickte alle Requests gleichzeitig los und verursachte NS_ERROR_NET_PARTIAL_TRANSFER / "Image corrupt"-Fehler auf Cloudflare Pages. Fix: Queue mit max. 16 parallelen Slots – sobald einer fertig ist, rückt der nächste nach.
- Fix: Retry-Logik hatte einen HEAD-Request VOR jedem Load, was die Zahl der Requests verdoppelte und NS_ABORTED auslöste. Neu: erst direkt laden, nur im Fehlerfall kurzer HEAD zur Unterscheidung 404 (→ gecacht, kein Retry) vs. Netzwerkfehler (→ bis zu 2 Retries).
- Fix: Bisherige Logik trug bei partial-transfer-Fehlern URLs in den permanenten Not-Found-Cache ein, sodass ein Reload nicht half. Nun werden nur echte 404er dauerhaft gecacht.
- Fix (Root-Cause): init.js registrierte getSurfaceFwd, getSurfaceRight und rotateSurfaceLookFwd nicht im Camera-Context. Dadurch nutzte camera.js immer unveraenderliche Default-Vektoren und Yaw (links/rechts schauen) war ein No-Op – komplett gelockt.
- Fix: Walk-Richtungen. Vorwaerts/Rueckwaerts rotiert jetzt um -/+_sfRight (statt +/-_sfRight), links/rechts rotiert um -/+_sfFwd (statt _sfNormal – Rotation um Normal verschiebt den Standpunkt am Pol gar nicht).
- Neu: Beim Betreten des Surface-Modes schaut die Kamera jetzt leicht nach unten (surfaceRotX = -0.25 rad, ca. 14 Grad) statt exakt horizontal – Oberflaechenstruktur ist sofort sichtbar.
- Fix: Surface-Walk Links/Rechts bewegte den Standpunkt auf einer Schrägachse statt seitwärts. Ursache: Rotationsachse war fälschlicherweise _sfFwd (Blickrichtung). Fix: Links/Rechts rotiert jetzt korrekt um _sfNormal (senkrecht nach oben), was den Standpunkt sauber seitwärts auf der Kugel versetzt.
- Fix: Horizont-Drift ohne Benutzereingabe. Ursache: surfaceRotX wurde ohne Limit akkumuliert; bei Überschreitung von ±80° wurde lookAt parallel zum Up-Vektor, was Three.js lookAt destabilisierte. Fix: surfaceRotX wird hart auf ±80° begrenzt, surfaceVelX bei Erreichen der Grenze auf 0 gesetzt.
- Fix: Kamera links/rechts schauen war instabil durch doppelte Yaw-Berechnung (prevRotY-Differenz). Fix: Yaw-Inkrement wird jetzt direkt aus surfaceVelY des laufenden Frames auf _sfFwd angewendet, ohne akkumulierende surfaceRotY-Variable.
- Fix: Surface-System komplett neu konzipiert mit klarer Trennung: Walk rotiert Standpunkt (_sfNormal/_sfFwd/_sfRight gemeinsam), Links/Rechts laufen rotiert um _sfFwd (nicht _sfNormal), Pitch bleibt als separater Winkel surfaceRotX in CAM und wird erst in _surfaceCameraTransform auf lookDir angewendet. Dadurch kein Horizont-Drift beim Walk und korrektes Schauverhalten.
- Fix: Pitch (oben/unten schauen) war falsch – addierte Normal-Vektor statt um Right-Vektor zu rotieren. Fix: Quaternion-Rotation um _sfRight. Limit bei ±80° Elevation.
- Fix: camera.up ist jetzt Normal projiziert auf Ebene senkrecht zu Fwd – kein Gimbal-Lock beim Blick nach oben/unten, kein rollender Horizont beim Walk.
- Fix: Surface-Kamera komplett auf orthonormalen 3-Vektor-Frame umgestellt (_sfNormal, _sfFwd, _sfRight). Kein Gimbal-Lock mehr: Up = Normal (vom Planeten weg), Fwd = Blickrichtung, Right = Rechts – alle drei werden immer gemeinsam rotiert. Camera-rotate (Yaw/Pitch) arbeitet direkt im Frame ohne Euler-Winkel. lookAt und camera.up werden direkt aus dem Frame gesetzt.
- Fix: camera.up auf world-Y zurückgesetzt (war fälschlicherweise auf Oberflächennormale gesetzt), was Kamera-Pitch und Links/Rechts-Schauen blockierte und den Horizont beim Walk rotieren ließ. surfaceRotX auf ±85° begrenzt um Three.js lookAt-Singularität zu vermeiden.
- Fix: Surface-Walk hatte Singularität an den Polen (Ruckler) und Winkel-Drift nach mehreren Schritten (Himmels-Sprünge). Fundamentale Überarbeitung: _surfaceLookFwd als eigener Vektor in der Tangentialebene, der gemeinsam mit _surfaceNormal rotiert wird. Walk-Richtungen und Kamera-Blickrichtung sind jetzt vollständig konsistent, auch nach beliebig vielen Schritten. Camera-Rotate dreht ebenfalls _surfaceLookFwd mit. Float-Drift wird durch Re-Orthogonalisierung nach jedem Schritt verhindert.
- Fix: Surface-Walk Links/Rechts bewegte den Standpunkt nicht – Rotationsachse war fälschlicherweise der Normalvektor selbst (= Drehung an Ort und Stelle). Fix: Rotationsachse ist jetzt walkFwd (die Vorwärts-Blickrichtung), sodass Links/Rechts den Standpunkt seitlich auf der Kugel versetzt.
- Fix: Surface-Walk war wirkungslos weil walkSurface nicht im Input-Context ankam. Ursache: init.js baut den Input-Context manuell und hatte walkSurface nicht weitergeleitet. Fix: init.js ergänzt.
- Debug: Console-Logs in Surface-Walk und Arrow-Key-Handler eingebaut zur Diagnose.
- Fix: Surface-Walk war wirkungslos. Ursache: Blickrichtung war als absoluter Weltvektor berechnet, nicht relativ zum Oberflächenstandpunkt. Fix: _surfaceCameraTransform() nutzt jetzt ein lokales Koordinatensystem auf der Planetenoberfläche (Tangentialebene). surfaceRotY ist nun der Azimut relativ zum lokalen Norden, surfaceRotX die Elevation – beide konsistent mit der Walk-Richtung.
- Fix: Walk-Richtung (top/bottom/left/right) jetzt korrekt in der Tangentialebene des aktuellen Standpunkts berechnet, mit Azimut-Korrektur bei Seitwärtsschritten.
- Fix: camera.up folgt jetzt dem Oberflächennormalvektor beim Walk (kein Horizontkippen).
- Fix: Surface-Walk (Randklick) war nicht aktiv wenn surface.js nicht aktualisiert wurde. Diagnosemeldung in Konsole wenn Kontext fehlt.
- Neu: Pfeiltasten (↑↓←→) funktionieren jetzt als Alternative zu Randklick – sowohl im Normal- als auch im Surface-Modus. Kein Autofire, gezielte Einzelschritte wie Klick.
- Neu: Zoom-Slider zeigt im Surface-Modus den FOV-Wert (8°–70°) statt des normalen Kamera-Zooms. Beim Verlassen wechselt der Slider automatisch zurück.
- Neu: Im Surface-Modus ist jetzt FOV-Zoom möglich (Mausrad oder Pinch). Die Kamera bleibt auf der Oberfläche – der Blickwinkel wird enger (Teleobjektiv) oder weiter (Weitwinkel). Bereich: 8°–70°, Standard 50°. Beim Verlassen wird der FOV automatisch zurückgesetzt.
- Neu: Im Surface-Modus ist jetzt Oberflächen-Walk möglich. Klick auf die Randzonen (oben/unten/links/rechts) verschiebt den Standpunkt auf der Planetenkugel. Wird vom Recorder aufgezeichnet und bei Playback korrekt wiedergegeben.
- Entfernt: Lensflare Ghost-Spots komplett entfernt. Starburst und Halo-Glow bleiben erhalten.
- Fix: Ghost-Spots lagen auf falscher Achse. Ursache: camRight/camUpFixed aus worldUp(0,1,0) stimmen nicht wenn die Kamera von oben schaut. Fix: Ghost-Weltposition direkt per unproject() aus NDC berechnet – keine Kameravektoren mehr nötig, korrekt für jeden Blickwinkel.
- Fix: Ghost-Spots erschienen zwischen Sternen in Mehrfachsystemen. Ursache: alle Sterne haben Ghosts, die sich überlagerten. Neu: Ghosts werden nur gezeichnet wenn der Stern mindestens 15% der halben Bildbreite von der Bildmitte entfernt ist – wenn der Stern zentriert ist, gibt es keine sinnvolle Flare-Achse.
- Fix: In Sol erschienen keine Ghosts weil die Sonne fast immer in der Bildmitte ist. Das ist korrekt – Lensflare-Ghosts entstehen nur wenn die Lichtquelle außermittig ist.
- Fix: Ghost-Spots erschienen wenn ein Nicht-Stern fokussiert war (weil das Objekt zufällig in der Bildmitte lag = Ghost-Achsenmitte). Ghosts werden jetzt nur gezeichnet wenn kein Fokus aktiv ist oder der Fokus auf einem Stern liegt.
- Fix: Ghost-Spots komplett neu als echte THREE.Sprite-Objekte direkt in der Scene. Einmalige Erstellung in loadStarSystem(), Positionierung per _updateStarGhosts() im animate-Loop vor dem render(). Weltfixes Up-Vektor statt camera.up. Cleanup in unloadCurrentSystem().
- Fix: Canvas-Overlay für Ghosts entfernt – war fehleranfällig und außerhalb des WebGL-Renders.
- Revert: Nativer Three.js Lensflare entfernt (erzeugte massive, unkontrollierbare Halo-Ringe). Zurück zum eigenen Starburst+Halo-Sprite-System.
- Fix: Ghost-Spots komplett neu als reines 2D-Canvas-Overlay nach renderer.render(). Achse: Sternpixelposition → Bildmitte → gespiegelt dahinter. Kein Bezug zu OrbitControls, Fokusobjekt oder camera.up – nur project(camera) für die Pixelposition, danach alles 2D.
- Neu: Lensflare komplett auf natives Three.js Lensflare.js (r128) umgestellt. Die korrekte Screen-Space-Logik ist direkt in Three.js eingebaut – Ghost-Spots folgen automatisch der richtigen Achse (Stern → Bildmitte → gespiegelt), unabhängig von OrbitControls oder Fokuszustand.
- Entfernt: Gesamter manueller Ghost-Positionierungs-Code im animate-Loop.
- Fix: Ghost-Spots folgten dem fokussierten Objekt statt einer fixen Kameraachse. Ursache: camera.up wird von OrbitControls auf das Fokusobjekt ausgerichtet – das verdrehte das Koordinatensystem für die Screen-Space-Berechnung. Fix: weltfixes Up-Vektor (0,1,0) statt camera.up.
- Fix: Ghost-Spots waren zu schwach sichtbar. Opacity erhöht.
- Fix: Lensflare-Ghost-Spots lagen auf der falschen Achse. Ursache: die Ghost-Positionen wurden von Sternposition Richtung Bildmitte interpoliert statt durch die Bildmitte hindurch gespiegelt. Korrekte Formel:
ghostNDC = sternNDC × (1 − t) mit t > 1 → Ghosts erscheinen auf der der Sonne gegenüberliegenden Bildschirmseite, wie bei echten Kamera-Lensflares.
- Fix: Halo-Ring war viel zu groß und opak (dominierte das Bild besonders bei hellen Sternen). Radius stark reduziert, Transparenz auf ~8% gesenkt – wirkt jetzt als subtiler Schimmer.
- Fix: Ghost-Spots (Lensflare-Kreise) waren nicht sichtbar, da sie entlang der 3D-Weltachse positioniert wurden und weit außerhalb des Sichtbereichs landeten. Neu: Screen-Space-Projektion – Ghosts werden entlang der 2D-Linie Sternposition→Bildmitte platziert, korrekt auf einer Tiefenebene vor der Kamera.
- Fix: Ghost-Sprite-Größe war an den Sternradius gekoppelt und skalierte falsch mit Zoom. Ghosts haben jetzt eine fixe Bildschirm-proportionale Größe.
- Fix: Lensflare-System komplett neu als echte Three.js-Sprites im 3D-Raum – taucht jetzt korrekt im Screenshot-Feature auf und skaliert proportional zur Kameradistanz.
- Fix: Lensflare-Halo und Glow waren im Übersichtsmodus sichtbar. Alle Flare-Sprites (Starburst, Halo, Ghosts) sowie der Surface-Glow-Shader werden jetzt beim Wechsel in den Überblick ausgeblendet.
- Fix: Ghost-Sprites wurden beim Systemwechsel nicht entfernt. Ghost-Sprites leben direkt in der Scene und werden in unloadCurrentSystem() explizit entfernt.
- Fix: Skalierungsfehler beim alten Canvas-Overlay – Ghost-Spots basierten auf Weltkoordinaten statt Pixeln. Neue Sprites verwenden Three.js-Weltkoordinaten und skalieren korrekt bei jedem Zoom-Level.
- Neu: Animiertes Oberflächenglühen für Sterne – ein Noise-Shader (fBm, 3 Oktaven) erzeugt ein lebendiges Plasma-Leuchten direkt auf der Sternoberfläche. Intensität und Farbe passen sich je Spektralklasse an (O/B/A heller, M/L/T gedämpft).
- Neu: Lensflare-Effekt für Sterne – ein 2D-Canvas-Overlay projiziert schichtweise Kamera-Artefakte auf die Sternposition: Kern-Glow, Starburst mit 8 Spikes, Halo-Ring und Ghost-Spots entlang der Flare-Achse. Blendet sanft ein/aus je nach Blickwinkel und Randabstand. Aktiv nur in der Systemansicht (nicht im Überblick).
- Fix: Gürtel-Partikel (Asteroiden, Kleinkörper, Trümmer) verschwanden nach Umschalten zwischen logarithmischer und linearer Skala. Ursache: Cache-Key enthielt kein Skalierungsflag. Fix: Cache unterscheidet jetzt log/lin.
- Fix: Partikel in großen Gürteln (Kuipergürtel, Trümmergürtel) waren im lin-Modus unsichtbar klein. Partikelgröße wird jetzt proportional zum Gürtelradius berechnet.
- Fix: Zonen-Ringe verschwanden nach mehrfachem log↔lin-Umschalten. Ursache war ein versehentlich gesetztes visible=false auf dem dustRing im Cache-Pfad.
- Neu: Asteroiden-, Kleinkörper- und Trümmergürtel als echte 3D-Objekte (InstancedMesh mit IcosahedronGeometry) mit Gauß-Verteilung, individueller Rotation/Skalierung, Farbvariation und optionaler Textur.
- Neu: Gürtel-Torus-Glow – ein weich gefadeter Ring als Custom-Geometrie mit Shader (sin³-Fade über Querschnitts-UV, AdditiveBlending) zeigt die Gürtelzone auch aus der Vogelperspektive.
- Fix: Nach log→lin-Umschaltung verschwanden alle Gürtel-Partikel. Ursache: snapshotAndRescaleDistances() verwendete für Zones kein toRawAU() – die Distanzen wurden mit bereits visuellen Werten in auFn() gejagt und landeten außerhalb der Szene. Fix analog zu Planeten.
- Fix: Gürtel-Partikel verschwanden nach log→lin-Umschaltung. Ursache: snapshotAndRescaleDistances() verwendete für Zones kein toRawAU() wie für Planeten – zone-Distanzen waren bereits visuelle Einheiten, wurden aber nochmals durch auFn() gejagt und landeten weit außerhalb der Szene. Fix: Zones nutzen jetzt dieselbe toRawAU()-Umkehrung wie Planeten/Asteroiden.
- Fix: Torus-Overlay komplett neu implementiert – korrekter sin³-Fade über UV-Querschnitt, niedrige Opazität (0.18), AdditiveBlending.
- Fix: Gürtel-Overlay ist jetzt ein echter Torus mit Höhe – als eigene BufferGeometry gebaut (Querschnittskreis aufgerollt um die Ringachse). Shader-Fade über UV des Querschnitts: 0 an allen Rändern, Maximum in der Mitte.
- Fix (Bug 2, erneut): visDist() wird korrekt auf Zone-Distanzen angewendet. auFn() liefert immer Log-Einheiten; visDist() wandelt in lin-Mode mit dem System-Faktor um – analog zu Planeten.
- Fix: Gürtel-Zonen zeigen jetzt einen weichen radialen Glow-Overlay – drei überlagerte RingGeometry-Schichten mit UV-basiertem Shader-Fade (sin²) und AdditiveBlending, ohne fehlerhafte 3D-Geometrie.
- Fix: Asteroiden-Partikel blieben nach log→lin-Wechsel unsichtbar. Ursache: visDist() wurde fälschlicherweise nochmals auf die bereits skalierten Gürteldistanzen angewendet. Zone-Distanzen kommen nach snapshotAndRescaleDistances() fertig skaliert an – der doppelte Aufruf wurde entfernt.
- Fix: Asteroiden-/Trümmergürtel zeigen jetzt einen echten 3D-Torus als Zonen-Overlay – TorusGeometry mit Shader-Fade (cos²), der zur Innen-, Außen- und Oberkante transparent ausläuft. AdditiveBlending für Leuchtwirkung analog zu Stern-Glow.
- Fix: Nach Umschalten auf lineare Distanzskala waren Gürtel-Partikel unsichtbar. Ursache: visDist() wurde beim Zone-Build nicht angewendet. Alle Gürteldistanzen laufen jetzt konsistent durch visDist() wie Planetenorbits.
- Fix: Asteroiden- und Trümmergürtel zeigen jetzt einen weichen Torus-Fade – ein Shader-Overlay lässt die Gürtel zur Innen- und Außenkante transparent auslaufen statt hart abzuschneiden.
- Fix: Nach Umschalten zwischen logarithmischer und linearer Distanzskala verschwanden die Gürtel-Partikel. Ursache war ein Cache-Treffer mit veralteten Radien. Der Cache-Key enthält jetzt das Skalierungs-Flag, sodass beim Wechsel immer neu generiert wird.
- Neu: Asteroiden-, Kleinkörper- und Trümmergürtel werden jetzt als echte 3D-Objekte dargestellt – kleine unregelmäßige Steine (IcosahedronGeometry) per InstancedMesh (1 Draw Call). Die Objekte sind gaußförmig im Gürtelquerschnitt verteilt, haben individuelle Rotation, Skalierung und leichte Farbvariation.
- Neu: Gürtelpartikel reagieren auf das Sternlicht (MeshLambertMaterial) und erhalten einen subtilen Beleuchtungseffekt. Optional: Textur subcategory-zone-asteroidbelt.jpg / debrisdisk / astroobjectbelt oder Fallback category-zone.jpg.
- Neu: Anzahl und Größe der Partikel pro Gürteltyp sind in categories.json konfigurierbar (beltCount, beltSizeMin, beltSizeMax). Mobile erhält automatisch 25% der Desktop-Anzahl.
- Neu: Gürtelgenerierung ist deterministisch gecacht (Mulberry32-PRNG) – das Muster bleibt beim Systemwechsel identisch. Cache wird bei Texturqualitätswechsel geleert.
- Habitable Zone und alle anderen Zonen sind unverändert (flache Ringe).
- Fix: Info-Panels blieben beim Playback-Start unsichtbar, obwohl sie beim Aufzeichnen offen waren. Ursache war set-zoom im Init-Script, das intern alle Panels schließt. Der Init-Script-Generator fügt nun ein show-panels nach den Kamera-Befehlen ein, das die Panels zuverlässig wiederherstellt.
- Fix: Während ein Script läuft, waren Buttons wie Pause, Speed oder Schatten nach dem Betreten eines Systems wieder aktiv – sie bleiben jetzt korrekt gesperrt bis das Script endet.
- Fix: Info-Panels (1–3) und Hilfe-Panels (1–2) konnten während der Script-Wiedergabe verschoben werden – Drag ist jetzt während Playback blockiert.
- Neu: set-variable unterstützt Kurzschreibweisen für Math-Funktionen ohne "Math."-Prefix: abs(), floor(), ceil(), round(), sqrt(), min(a;b), max(a;b). Semikolon statt Komma als Argument-Trenner umgeht den Script-Parser.
- Fix: |x| Absolutwert-Notation ist kein gültiges JavaScript – stattdessen abs(x) verwenden.
- Fix: Math.min/max direkt im Script war nicht möglich weil der Parser Kommas als Param-Trenner interpretiert. Gelöst durch Kurzschreibweise mit Semikolon: min([[a]];[[b]]).
- Sicherheit: Ausdrücke werden vor der Auswertung gegen eine Whitelist validiert – nur Zahlen, Operatoren, Klammern und bekannte Math-Funktionen sind erlaubt. Unbekannte Zeichen werden abgelehnt.
- Neu: set-variable unterstützt Arithmetik – Ausdrücke mit +, -, *, / werden ausgewertet, z.B. counter: "[[counter]]+1" oder price: "[[base]]*1.19".
- Neu: random als Wert oder Bestandteil eines Ausdrucks liefert eine Zufallszahl zwischen 0 und 1, z.B. roll: "random" oder myVar: "1+random*2" (ergibt 1–3).
- Fix: Noch nicht gesetzte Variablen ([[varname]]) werden in Ausdrücken als 0 aufgelöst statt als leeren String – verhindert unerwünschte String-Konkatenation bei Arithmetik.
- Fix: Alle Script-Variablen werden beim Start eines Scripts geleert – Werte aus vorherigen Läufen sind nicht mehr sichtbar.
- Fix: loop-begin { repeats: [[myvar]] } funktioniert jetzt korrekt – der Variablenwert wird vor der Auswertung der Wiederholungszahl substituiert. Bisher wurde [[myvar]] als NaN interpretiert und der Loop lief nur einmal.
- Neu: [[focus.property]] und [[system.property]] Platzhalter funktionieren jetzt in allen Befehlen (nicht mehr nur in show-message). Z.B. set-variable { myvar: "[[focus.name]]" } speichert den Namen des fokussierten Objekts.
- Intern: lokale _resolveMsgPlaceholders aus show-message zu globaler _resolvePlaceholders extrahiert, die auch _applyScriptVars nutzt. show-message verhält sich identisch wie zuvor.
- Fix (commands.json): set-variable Hint zeigt nun <name>: "value" als Beispielformat.
- Neu: Script-Befehl set-variable { name: value } – speichert eine benannte Variable. Wiederholtes Setzen überschreibt den Wert.
- Neu: Variablen-Substitution in beliebigen Befehlen via [[variablenname]] – der Platzhalter wird vor der Ausführung durch den gespeicherten Wert ersetzt. Unbekannte Variablen werden durch einen Leerstring ersetzt.
- Fix: rotate-camera funktioniert jetzt auch in der Systemübersicht korrekt – bisher wurde beim Playback sofort zum Endwinkel gesprungen statt einer sichtbaren Rotation. Ursache waren zwei Bugs: (1) der Overview-Kamera-Block in camera.js kehrte per return zurück bevor der angle-lerp-Block erreicht wurde; (2) die camera-rotate-Aktion löste im Overview-Modus immer sofort auf statt angle-lerp zu starten. Beides behoben: manuelle Eingabe bleibt instant, Playback startet angle-lerp.
- Neu: Button "Einzelsterne überspringen" / "Skip single stars" in Sektion 1 des Controlpanels (mit eigenem Icon).
- Neu: Aktion skip-single-stars { state: true/false } – steuert, ob Systeme mit nur einem Stern und ohne Planeten beim Navigieren übersprungen werden.
- Neu: Vorheriges/Nächstes System (sysLeft/sysRight) überspringen Einzelsternsysteme, wenn die Option aktiv ist.
- Neu: Crosshair-Navigation in der Systemübersicht (ovLeft/ovRight) überspringt Einzelsternsysteme, wenn die Option aktiv ist.
- Neu: Zufälliges System (load-system / zoom-overview-to mit system-key: "random") wählt nur aus Mehrsternsystemen, wenn die Option aktiv ist.
- Fix: Weiter/Zurück-Buttons werden korrekt deaktiviert, wenn in der aktuellen Richtung kein passendes System mehr folgt (z.B. letztes verfügbares System vor dem Ende der Liste).
- Fix: Umschalten der Option aktualisiert sofort den Aktivierungsstatus aller Navigationsschalter.
- Fix: Steuerungs-Panel wird nun oben-bündig neben Hilfe-Panel positioniert (Panel 1 öffnet zuerst, Panel 2 liest dann dessen korrekte Position).
- Fix: Steuerungs-Panel öffnet sich jetzt oben-bündig neben dem Hilfe-Panel (gleiche obere Kante).
- Fix: "Ecke ziehen: Rollen" (war fälschlicherweise "klicken").
- Fix: Steuerungs-Panel wird nach dem Schließen des Compare-Modus wieder eingeblendet.
- Fix: Steuerungs-Panel öffnet sich jetzt rechts neben dem Hilfe-Panel statt überlagert.
- Fix: Steuerungstext korrigiert – "Rand klicken: Bewegen" / "Ecke klicken: Rollen".
- Neu: Pan- und Roll-Cursor-Icons (wie im Viewfinder) als Icons im Steuerungs-Panel.
- Fix: Steuerungs-Panel aktualisiert sich beim Sprachwechsel korrekt.
- Fix: Steuerungs-Panel wird beim Compare-Modus und Script-Editor ausgeblendet und danach wiederhergestellt.
- Fix: ? Button im Titel öffnet/schließt jetzt beide Hilfe-Panels zusammen; Tooltip ist "Hilfe".
- Entfernt: ? Buttons aus dem Controlpanel (Sektion Navigation).
- Fix: Steuerungs-Panel zeigt jetzt korrekte Steuerung (Rand/Ecke für Schwenken/Rollen, keine falschen Zeilen mehr).
- Fix: Titel des Steuerungs-Panels ist "Steuerung" (DE) / "Controls" (EN), nicht beides gleichzeitig.
- Fix: Fokus-Icon im Steuerungs-Panel ist jetzt ein weisser Hand-Cursor statt Emoji.
- Neu: Language-Switch Button hat Tooltip ("Sprache wechseln" / "Switch language").
- Fix: Alle drei Buttons im Titelbereich (Restore, ?, Sprache) sind jetzt einheitlich 32px rund.
- Neu: Restore-Button hat ein Plus-Icon.
- Neu: Steuerungs-Panel im Titelbereich ("?"-Button) – zeigt Kamera-Eingaben übersichtlich an (Desktop und Mobile), draggbar wie das bestehende Hilfe-Panel.
- Entfernt: veralteter Tooltip-Text im Titelbereich ("Drag: Rotate · Scroll/Zoom...")
- Fix: Sprach-Button und Restore-Button im Titel haben jetzt einheitliches rundes Design und gleiche Größe.
- Intern: move-helppanel, show-help und hide-help unterstützen jetzt einen panel-Parameter (1 = Button-Panel, 2 = Steuerungs-Panel).
- Fix (starsystems.json): Lücke in der System-ID-Nummerierung behoben – UGPS J0722-0540 von ID 35 auf ID 33 verschoben, nachfolgende Systeme entsprechend angepasst. Die Lücke hatte das Weiterblättern zwischen Systemen verhindert.
- Fix (starsystems.json): Absolute Magnitude bei YZ Ceti (14.22), Teegardens Stern (17.15), SCR 1845-6357 B (26.01) und GJ 1061 (15.25) korrigiert – in allen Fällen war irrtümlich die scheinbare Helligkeit auch als absolute eingetragen worden.
- Daten (starsystems.json, languages.json): 6 neue Sternsysteme hinzugefügt (Nr. 35–40): UGPS J0722-0540 (T9-Subbauner Zwerg / Rogue Planet, 13,4 ly), Van Maanens Stern (nächster Einzelweißer Zwerg, DZ8, 14,1 ly), Gliese 1 (M2V, 14,2 ly), Wolf 424 (M5.5V + M7V, Barizentrum, 14,4 ly), TZ Arietis (M4.5V, 1 Exoplanet, 14,6 ly). Wolf 1061 als #36 korrekt eingeordnet. Neue Sternbilder psc/scl ergänzt. Quellen: NASA Exoplanet Archive, SIMBAD / Gaia DR3.
- Daten (starsystems.json, languages.json): 10 neue Sternsysteme hinzugefügt (Nr. 26–35): YZ Ceti (3 Planeten), Luytens Stern (2 Planeten), Teegardens Stern (3 Planeten), Kapteyns Stern (1 Planet), Lacaille 8760, SCR 1845-6357 (M8.5V + T6, Barizentrum), Kruger 60 (M3V + M4V, Barizentrum), DENIS 1048-3956, Ross 614 (M4.5V + M8V, Barizentrum), Wolf 1061 (3 Planeten). Neue Sternbilder ari/mic/pic/pav/cep/ant/mon ergänzt. Quellen: NASA Exoplanet Archive, SIMBAD / Gaia DR3.
- Fix (astroviewer.html, camera.js):
camera-rotate { dx, dy:0 } in einer Loop liess die Kamera nach wiederholter Ausführung nach oben driften. Drei Ursachen behoben: (1) mode === 'angle-lerp' fehlte in der inFocus-Prüfung beim Start eines neuen camera-rotate, sodass in einem Randfall rotX statt focusRotX als Ausgangswert gelesen wurde. (2) focusRotY wird jetzt vor jedem neuen Lerp auf 0..2π normalisiert, um Floating-Point-Drift bei großen akkumulierten Winkelwerten zu vermeiden. (3) Am Ende des Lerps werden focusRotX/Y exakt auf die Zielwerte gesnapped statt auf den letzten interpolierten Wert.
- Fix (panels.js): Infopanel 1 bewegte sich während
camera-rotate-Animationen, weil auch _positionInfoPanel die veraltete camera.matrixWorldInverse nutzte. camera.updateMatrixWorld() wird jetzt in allen drei Panel-Positionierungsfunktionen vor project() aufgerufen.
- Fix (panels.js): Führungslinien der Info-Panels drifteten während
camera-rotate-Animationen, weil camera.matrixWorldInverse bei der Projektion noch den Zustand des vorherigen Frames hatte. Die Panel-Positionierung läuft vor renderer.render(), das die Matrix erst aktualisiert. Fix: camera.updateMatrixWorld() wird jetzt direkt vor project() in _updateLeader aufgerufen.
- Fix (panels.js, init.js): Führungslinien der Info-Panels verschoben sich während
camera-rotate-Animationen, weil die Projektion des Objekts auf den Screen ohne den focusPanOffset berechnet wurde. Die Kamera schaut aber auf tgt.getPos() + panOffset – jetzt wird dieser Offset auch bei der Leader-Line-Projektion berücksichtigt, sodass der Linienpunkt stabil am Objekt bleibt.
- Fix (astroviewer.html):
focus-object { sequence: "all" } ohne vorherigen Focus-Mode snappte direkt zur Zielposition statt zu animieren. Jetzt wird in diesem Fall die normale Zoom-Lerp-Animation gestartet (wie sequence:"zoom"); nur sequence:"sway" snappt weiterhin wenn kein Ausgangsfokus vorhanden ist.
- Fix (panels.js): Führungslinien der Info-Panels sprangen während
camera-rotate-Animationen zwischen verschiedenen Ankerpunkten am Panel-Rand. Der Ankerpunkt wird jetzt einmalig beim Platzieren des Panels berechnet und gecacht; er wird nur neu ermittelt wenn das Panel durch den User oder das Script bewegt wird oder das fokussierte Objekt wechselt.
- Fix (camera.js): Während
angle-lerp (camera-rotate Animation) wurde focusZoom durch den Focus-Block verändert, weil angle-lerp in denselben Block durchfällt. focusZoom- und focusZoomVel-Update wird jetzt bei mode === "angle-lerp" übersprungen.
- Fix (camera.js, astroviewer.html):
zoom-overview-to lief nach go-overview { instant: true } rückwärts wenn die Kamera zuvor nah an einem Objekt war. Ursache: lerpStart enthielt die System-Kamera-Position, nicht die Overview-Position. Neue Funktion snapToOverviewCamera() wird nach jedem instant-Overview aufgerufen und setzt die Kamera sofort auf die korrekte Position.
- Feature (astroviewer.html): Vier Befehle unterstützen jetzt
"random" als Schlüssel. focus-object { key: "random" } wählt ein zufälliges Objekt im aktuellen System. load-system { system-key: "random" } lädt ein zufälliges anderes System. zoom-overview-to { system-key: "random" } zoomt in der Sternenkarte zu einem zufälligen System. focus-neighbour { key: "random" } wählt einen der verfügbaren Nachbarsterne zufällig aus. Das aktuelle System wird bei den Zufallsauswahlen jeweils ausgeschlossen.
- Feature (recorder.js, astroviewer.html, commands.json):
loop-next ersetzt durch loop-begin { repeats: N } und loop-end. Alles zwischen den beiden Befehlen wird N-mal wiederholt. Loops können beliebig tief verschachtelt werden – der Stack-basierte Mechanismus in der Playback-Engine behandelt jede Ebene korrekt ohne ID-Parameter. loop-end ohne passendes loop-begin wird mit Konsolenwarnung übersprungen.
- Improvement (astroviewer.html):
[[focus.*]]-Platzhalter in show-message jetzt vollständig generisch – jede flache Eigenschaft des fokussierten Objekts aus starsystems.json ist direkt verwendbar (z.B. [[focus.rKm]], [[focus.tempEq]], [[focus.spectralClass]], [[focus.massEarth]] usw.). Groß-/Kleinschreibung wird dabei toleriert. Ausnahmen mit Sonderbehandlung: name und type werden weiterhin lokalisiert, moons liefert die Anzahl unabhängig davon ob der Wert eine Zahl oder ein Array ist. Objekt- und Array-Felder (z.B. orbit, atmosphere) werden übersprungen.
- Feature (astroviewer.html):
show-message unterstützt jetzt Platzhalter der Form [[scope.feld]] im Text-Parameter. Zur Laufzeit werden diese durch Daten des aktuell fokussierten Objekts ([[focus.*]]) oder des aktuellen Sternensystems ([[system.*]]) ersetzt. Verfügbare Felder: focus.name (lokalisiert), focus.key, focus.rKm, focus.type (lokalisiert), focus.distAU, focus.orbitalPeriod, focus.moons, focus.mass sowie system.name, system.key, system.starCount, system.planetCount. Unbekannte Platzhalter bleiben unverändert. Die autoWait-Pausenberechnung verwendet den aufgelösten Text.
- Fix (surface.js): Triplanare Detail-Textur war nach V6.87 unsichtbar. Zwei Ursachen: (1) Varying-Deklarationen mussten außerhalb von
main() stehen; (2) Skalierung war objektgrößen-unabhängig. Behoben: Varyings werden vor void main() deklariert, befüllt mit transformed / objectNormal nach #include <project_vertex>. Skalierung jetzt radiusbasiert (detailTile / (2*r)).
- Fix (surface.js): Triplanare Detail-Textur rotierte mit dem Planeten mit und ließ die Oberfläche flimmern. Ursache: Weltkoordinaten (
modelMatrix * position) ändern sich mit jeder Planetenrotation. Behoben: Projektion läuft jetzt in lokalen Objektkoordinaten (position, normal) – rotationsinvariant.
- Fix (surface.js): Detail-Textur im Surface-Modus zeigte bei einigen Objekten (Venus, Ceres) eine Polverzerrung, weil die Kachelung auf den sphärischen UV-Koordinaten basierte, die am Pol zusammenlaufen. Umgestellt auf triplanare Projektion: die Textur wird aus drei orthogonalen Weltkoordinaten-Ebenen gemischt, gewichtet nach der Oberflächennormale. Vollständig polunabhängig und verzerrungsfrei.
- Fix (surface.js): Textur-Übergang beim ersten Betreten des Surface-Modus war trotz Fade sprunghaft (z.B. Titan). Ursache: der Detail-Shader wird von Three.js erst beim ersten Render-Frame kompiliert – startete der Fade vorher, sprang
detailActive in einen bereits hohen Wert rein. Fix: Fade startet jetzt erst nach 3 Render-Frames (Shader-Warmup). Zusätzlich wird der High-Res-Basistextur-Tausch erst ausgelöst wenn der Detail-Fade bei ≥ 0.5 ist, sodass das Detail-Overlay den Wechsel kaschiert. Beide Mechanismen greifen jetzt zuverlässig beim ersten wie bei jedem weiteren Besuch.
- Fix (surface.js): Beim zweiten Betreten des Surface-Modus (Texturen im Cache) wurden High-Res-Textur und Detail-Textur synchron im selben Frame gesetzt – der Fade griff nicht und der Wechsel war wieder sprunghaft. Beide Ladevorgänge werden jetzt grundsätzlich per
setTimeout verzögert (High-Res: 200 ms, Detail: 300 ms), sodass Cache-Hits immer async ankommen und der Fade gleichmässig funktioniert.
- Neu (surface.js): Detail-Textur im Surface-Modus blendet jetzt sanft ein (600 ms Fade) statt abrupt zu wechseln. Der Shader nutzt
detailActive als kontinuierlichen Blend-Faktor (0→1) statt als hartem Schwellwert.
- Fix (surface.js): Textur-Pol-Verzerrung im Surface-Modus trat bei Monden von Zwergplaneten (z.B. Mk2, Dysnomia) besonders stark auf. Ursache: Die Suche nach dem passenden Mesh-Objekt durchsuchte zwar Monde normaler Planeten, aber nicht die Mondliste von Zwergplaneten. Diese Lücke ist jetzt geschlossen – der Pivot-Kipp-Fix (20°) wird nun auf alle Objektarten angewendet.
- Fix (astroviewer.css): Script-Play-Indicator und Track-Anzeige überlagerten auf schmalen Hochformat-Screens den HUD-Titelbereich. Neuer CSS-Fallback (
@media (max-width:500px) and (orientation:portrait)): beide Indikatoren werden zentriert unter den HUD-Text verschoben (~90/118px von oben), direkt unterhalb des Tooltip-Textes. Im Querformat und auf größeren Screens bleibt die bisherige Positionierung erhalten.
- Fix (audio.js): Lock-Track verhält sich jetzt korrekt wenn kein Song spielt – statt alle Tracks zu blockieren, startet der erste passende Track normal; der Lock greift erst sobald ein Track aktiv ist und verhindert ab dann weitere automatische Wechsel.
- Fix (recorder.js / astroviewer.html): Aktiver Track und Lock-Zustand werden jetzt im INIT-STATE-Block mitaufgezeichnet (
set-track und lock-track). Playback reproduziert damit denselben Track wie beim Start der Aufnahme.
- Neu (recorder.js / astroviewer.html): Script-Playback stoppt beim Start immer den laufenden Track – das INIT-STATE setzt danach den korrekten Track neu.
- Fix (astroviewer.html): Track-Anzeige ist auf Desktop wieder oben rechts (
top:10px, right:12px). Mobile bleibt die Ausweichposition unterhalb des Script-Play-Indicators (oben links, top:36px).
- Neu (audio.js):
getCurrentTrack() und stopAudio() exportiert – werden vom Recorder-Kontext genutzt.
- Fix (astroviewer.html): Playback-Bug bei Fokus mit Track verschlimmbessert. Ursache: Flag
_snapFocusAudioDone wurde nach seq='none' nicht zurückgesetzt (da setFocus() dort nicht aufgerufen wird), sodass alle nachfolgenden setFocus()-Aufrufe stumm blieben. Behoben: Flag wird jetzt direkt nach _snapFocus() zurückgesetzt.
- Fix (astroviewer.html): Track-Anzeige von oben-rechts nach unterhalb des Play-Indicators (oben-links,
top:36px) verlegt – war auf Mobile durch HUD-Buttons verdeckt. Auf Mobile wird der Timer ausgeblendet (isMobile-Check), auf Desktop bleibt Titel + Countdown sichtbar.
- Fix (audio.js):
_findTrack() prüft jetzt beide Varianten des System-Keys ("sol" und "sol-system") – das -system-Suffix ist bei set-track und allen automatischen Wechseln optional. Betrifft alle 6 system-key-Parameter in commands.json (Hint aktualisiert).
- Fix (astroviewer.html):
registerAudioContext wurde in init.js nie aufgerufen – alle Audio-Callbacks (setTrackTitle etc.) blieben No-Ops. Damit war auch die Track-Anzeige oben rechts dauerhaft unsichtbar. Behoben: init.js ruft registerAudioContext jetzt korrekt auf.
- Fix (astroviewer.html): Nach log/lin-Umschalten startet der Track jetzt zuverlässig.
loadStarSystem-Hook wird per Flag _suppressAudioOnLoad unterdrückt; stattdessen löst set-logscale am Ende einmalig den passenden Track (Objekt oder System) aus.
- Fix (astroviewer.html): Im Playback-Modus stoppte Fokus auf Objekt ohne Track den aktuellen Track nicht. Ursache:
_snapFocus() in focus-object rief nicht setFocus() auf. Neuer Audio-Hook direkt in _snapFocus; Flag _snapFocusAudioDone verhindert Doppel-Trigger wenn danach auch setFocus() läuft.
- Fix (init.js):
registerAudioContext wird jetzt aufgerufen.
- Neu (recorder.js):
set-volume wird im INIT-STATE-Block aufgezeichnet wenn Musik aktiv ist – Playback startet Musik automatisch mit der gespeicherten Lautstärke.
- Fix (audio.js): Komplette Neuentwicklung auf Basis der Web Audio API (
AudioContext + GainNode). Fade-in/out läuft jetzt über GainNode statt setInterval auf dem Audio-Element – zuverlässig auf iOS/Safari. Verhindert auch mehrere überlagerte Tracks beim schnellen Objekt-Wechsel.
- Fix (astroviewer.html): Nach log/lin-Umschalten wird der Track des wiederhergestellten fokussierten Objekts korrekt weitergespielt.
- Neu (astroviewer.html / audio.js): Track-Anzeige oben rechts – zeigt Titel des aktuellen Tracks (grün, analog Script-Indicator links) und zählt die verbleibende Spielzeit herunter.
- Neu (astroviewer.html / controls.js / audio.js): Button "Track sperren" (Vorhängeschloss mit Musiknote) in der Audio-Gruppe. Aktion
lock-track { state } – sperrt automatischen Track-Wechsel bei Fokus/Systemwechsel bis manuell entsperrt.
- Neu (astroviewer.html / audio.js): Aktion
set-track { system-key, object-key } – ermöglicht explizite Track-Auswahl per Script (ignoriert Lock).
- Neu (commands.json): Befehle
set-volume, set-track und lock-track ergänzt.
- Neu: Maximale Lautstärke auf 40% erhöht.
- Fix (audio.js): Track-Wechsel auf Mobile (iOS/Safari) funktionierte nicht –
audio.pause() und src='' setzen den Media-State auf Safari nicht zuverlässig zurück. Neue interne Funktion _hardStop() ruft zusätzlich audio.load() auf. Außerdem wird das alte Audio-Element bei Track-Wechsel sofort aus dem internen State entfernt, bevor der Fade-out abläuft – verhindert doppelte Trigger auf dasselbe Objekt.
- Fix (astroviewer.html): Beim ersten Öffnen des Lautstärke-Sliders startete die Musik nicht, solange der User den Slider nicht bewegte. Die
open-slider-Action schaltet bei volume jetzt sofort mit dem aktuellen Defaultwert (5) ein.
- Neu (audio.js): Maximale Lautstärke von 22% auf 30% erhöht.
- Fix (astroviewer.html): Beim Wechsel zur Sternenübersicht wurde die Musik nicht gewechselt – der Audio-Hook fehlte im
loadOverview-Proxy und im instant-Pfad von go-overview. Beide Pfade rufen jetzt onSystemChanged('overview') auf.
- Neu (tracks.json / audio.js): Fallback-Key
"overview" für system-key unterstützt – wird beim Betreten der Sternenübersicht abgespielt. Beispieleintrag in tracks.json hinterlegt.
- Fix (audio.js): Konsolenfehler "Ungültige URI" wenn kein Track gefunden –
_stopAll() erzeugte ein new Audio('')-Objekt ohne gültige URL. Behoben durch Früh-Return wenn kein Audio läuft.
- Neu (controls.js / astroviewer.html / audio.js): Musik-Button öffnet jetzt einen Lautstärke-Slider (0–10). Stufe 0 = Ton aus, Stufen 1–10 steuern die Lautstärke (Ausgangswert: 5). Der Button zeigt wie andere Slider-Buttons seinen aktiven Zustand. Lautstärke wird in
audio.js auf das interne Maximum (22%) skaliert.
- Fix (icons.svg): Musik-Note im Button jetzt horizontal zentriert. Neues Icon
icon-audio-group (Lautsprecher mit Schallwellen) für das Gruppen-Label – unterscheidet sich vom Button-Icon.
- Neu (audio.js / astroviewer.html / controls.js): Hintergrundmusik-Feature. Neuer Toggle-Button "Musik" (Gruppe "Audio") in der Anzeige-Sektion. Neue Datei
data/tracks.json zur Pflege der Tracks (Felder: system-key, object-key, trackTitle, trackURL). Fallback-Hierarchie: Objekt-spezifischer Track → System-Track → Default-Track (beide Keys leer). Alle Übergänge werden mit Fade-in/Fade-out abgerundet. Lautstärke bewusst niedrig (max. 22%). Track-Wechsel bei Systemwechsel und bei Objekt-Fokus.
- Neu (icons.svg): Icon
icon-music (Musiknote) für den Musik-Button.
- Neu (languages.json): Keys
grp.audio und btn.music ergänzt (DE/EN).
- Fix (init.js):
getLightFactor wurde nicht an registerOverviewContext übergeben – overview.js verwendete immer den Standardwert 1.0. Behoben: Faktor wird jetzt korrekt durchgereicht.
- Neu (astroviewer.html / builder.js / overview.js): Glow-Radien der Sterne skalieren jetzt marginal mit der Lichtintensität (Faktor^0.18), sodass bei höherer Intensität die Lichtkegel sichtbar größer erscheinen. Gilt sowohl im Systemansicht als auch im Overview.
- Fix (builder.js): Referenzwert-Bug beim Lichtintensitäts-Slider behoben. Die Glow-Sprites wurden bisher mit eingebackener Opazität in der Canvas-Textur erstellt, während
mat.opacity auf 1.0 stand – dadurch war der tatsächliche Ausgangswert nicht über den Faktor erreichbar. Jetzt wird die Canvas-Textur normalisiert (volle Helligkeit), und die Opazität kommt ausschließlich über mat.opacity, das beim Erstellen korrekt gesetzt wird.
- Fix (overview.js): Lichtintensitäts-Faktor wird jetzt beim Aufbau der Overview-Sterne direkt auf deren Glow-Sprites angewendet, sodass der gewählte Faktor auch in der Übersichtsansicht sichtbar ist.
- Fix (astroviewer.html / builder.js): Lichtintensitäts-Referenzwert korrigiert. Glow-Sprite-Basis-Opazitäten werden jetzt einmalig unveränderlich in
material.userData._baseOpacity gespeichert und beim Anpassen des Faktors zuverlässig daraus gelesen – kein Drift mehr beim Hin- und Herschalten.
- Neu (astroviewer.html / overview.js): Lichtintensitäts-Slider wirkt jetzt auch auf die Glow-Sprites der Sterne in der Übersichtsansicht (Overview).
- Fix (languages.json): Fehlender i18n-Key
btn.lightintensity ergänzt (DE: "Lichtintensität einstellen", EN: "Adjust light intensity") – Button-Tooltip wurde vorher nicht angezeigt.
- Neu (UI / controls.js / builder.js): Neuer Button "Lichtintensität" in der Gruppe "Licht" mit eigenem SVG-Icon (Sonne mit Pegelbalken). Öffnet einen Slider (9 Stufen: 0.40× – 2.50×, Mitte = 1.00×) zur Anpassung der Lichtintensität aller Sterne im System. Die klassenabhängige Helligkeitsabstufung (O → M / Weiße Zwerge) bleibt vollständig erhalten – der Faktor wirkt multiplikativ. Glow-Sprites werden proportional mitgedimmt/aufgehellt. Der aktuelle Faktor wird beim Systembau berücksichtigt und bleibt beim Systemwechsel erhalten.
- Fix (recorder.js): Help-Panel wurde beim Schließen des Script-Editors nicht wiederhergestellt. Ursache:
help-panel fehlte in der _hideEls-ID-Liste in _scriptEditorBuildUI(). Behoben durch Ergänzung – das Panel wird jetzt wie alle anderen Overlays (hud, ui, astro-info, …) beim Öffnen ausgeblendet und beim Schließen (OK oder Abbrechen) korrekt wiederhergestellt. Redundanter Fallback-Listener aus V6.67 entfernt.
- Fix (astroviewer.html): Help-Panel blieb beim Öffnen des Script-Editors sichtbar und überlagerte ihn. Behoben durch zwei Maßnahmen: (1)
window._helpPanelOpen / window._helpPanelSetOpen werden jetzt korrekt als globale Hooks exponiert (analog zu compare.js); (2) zusätzlicher Fallback-Listener am Editor-Button der den Zustand des Help-Panels beim Öffnen/Schließen sichert und wiederherstellt.
- Fix (textures.js / astroviewer.html): Beim Umschalten der Texturqualität wurde das System komplett neu geladen, was einen 3–4 Sekunden Freeze und kurzzeitig texturlose (blaue) Objekte verursachte. Behoben: kein System-Rebuild mehr. Stattdessen werden alle Materialien in-place neu texturiert – die alte Textur bleibt sichtbar bis die neue fertig geladen ist. Beim zweiten Umschalten (Cache) kein Freeze mehr.
- Fix (controls.js): Texturqualitäts-Slider löste keinen sichtbaren Reload aus, da
setTexQuality vor der Action aufgerufen wurde und der Early-Exit-Guard greift. Behoben: apply() setzt die Qualität nicht mehr direkt, sondern delegiert komplett an die Action.
- UI: Reihenfolge korrigiert – Sektion "Bildschirm/Licht" ist wieder vor Sektion "Anzeige".
- UI: Alle
group-label-Icons im Control-Panel haben jetzt Tooltips (Navigation, Übersicht, Zoom, Werkzeuge, Geschwindigkeiten, Steuerung, Bildschirm, Licht, Anzeige, Sichtbarkeit × 2, Automatisierung, Programmierung).
- UI (icons.svg):
icon-texture-quality ersetzt durch verständlicheres Foto-Symbol mit aufsteigenden Qualitätsbalken rechts unten.
- Neu (UI): Neue Sektion "Anzeige" (Sektion 4) im Control-Panel; nachfolgende Sektionen korrekt auf 5–7 umnummeriert. Die Sektion enthält zwei Schalter: Texturqualität (Slider) und Log/Lin-Skala (von Sektion 5 hierher verschoben).
- Neu (textures.js): Texturqualität als Slider einstellbar – Niedrig / Mittel / Hoch auf allen Geräten. Mobile-Default: Niedrig, Desktop-Default: Mittel. Verzeichnisse:
lowres/, mediumres/ (bisheriges images/-Root), highres/. Fallback-Logik: für jede Identitätsebene (Objekt → Subkategorie → Kategorie) wird die gewählte Qualität zuerst gesucht und danach absteigend bis Niedrig – spezifische Texturen in niedrigerer Qualität haben immer Vorrang vor generischen Kategorie-Texturen.
- Neu (Action
set-texture-quality): Qualität per Script setzbar (quality: 0/1/2). Bei Änderung wird das aktuelle System ohne Verlust von Kamera/Focus neu geladen.
- Neu (icons.svg): Zwei neue Icons –
icon-display (Sektions-Label Bildschirm mit Qualitätsbalken) und icon-texture-quality (gestapelte Bildebenen mit Landschaft).
- Fix (input.js): Pan/Roll-Cursor oben links nun wirklich behoben.
_panZoneAt() und _rollZoneAt() geben im Bereich cx < 160 / cy < 50 direkt null zurück – der Bereich des play-indicators ist damit vollständig aus beiden Zonen ausgeschlossen.
- Fix (input.js): Pan/Roll-Cursor im Bereich der Script-Anzeige oben links behoben.
_updateCursor() überspringt den Override wenn der Mauszeiger über dem play-indicator liegt.
- Fix Version cursor Problem z index und observer.
- Fix Versuch cursor Problem grabbing.
- Fix Versuch cursor Problem mousemove.
- Neu (astroviewer.html): Script stoppen durch Klick/Tap auf die Script-Anzeige oben links. Stop-Handler läuft in der Capture-Phase auf document-Ebene mit manuellem Koordinaten-Check.
- Neu (astroviewer.html): Wake Lock verhindert Bildschirm-Standby während Script-Playback (iOS 17+/Android Chrome).
- Fix (overview.js): Canvas-Premultiplied-Alpha-Fix für Live-Pfad in
buildNeighbourStars. Canvas-Größe auf fest 512px reduziert.
- Fix (astroviewer.html): Cyan-grüne Punkte/Flecken beim Nachbarstern-Zoom auf Mobile behoben. Canvas schwarz vorbelegt, letzter Gradient-Stop auf
rgba(0,0,0,1), premultiplyAlpha = false.
- Fix (animate.js, scene.js): Starfield in eigene
THREE.Group ausgelagert, renderer.autoClear explizit gesetzt.
- UI (astroviewer.html, icons.svg): Buttons in Sektionen 3 und 4 neu geordnet. Sektion 3: Simulations-/Mondgeschwindigkeit + Pause/Kamerageschwindigkeit. Sektion 4: Vollbild/Screenshot (neues Monitor-Icon) + Schatten/Log-Skala.
- Perf (astroviewer.html, utils.js): Mehrere Allokations-Hotspots im Animations-Loop beseitigt.
topoSortStars() und Object.fromEntries() liefen bisher 60× pro Sekunde; beide werden jetzt einmalig gecacht und nur bei System-Wechsel neu gebaut. o.pos.clone().project() (Overview-Labels, 2×) und parentPos.clone().add(rel) (Mond-Positionen, Sternorbits, Planeten) ersetzte durch pre-allozierte Vektoren die jedes Frame wiederverwendet werden. Lineare starObjects.find()-Scans in Planet- und Zonen-Loop durch O(1)-Lookup im gecachten _starByKey-Map ersetzt. ellipticOrbitPos() erhält optionalen out-Parameter für allokationsfreien Aufruf.
- Fix (compare.js): Im Vergleichsmodus wurde bei Binärsternen (z.B. Alpha Centauri A/B) die Distanz als NaN angezeigt. Ursache: Begleitsterne teilen dieselbe
distanceToSol und nahezu identische ra/dec-Koordinaten – der Vektor-Ansatz lieferte numerisch 0 oder NaN. Fix: Sind beide Sterne im selben System, wird die Separation jetzt direkt aus den Orbit-Radien (Kosinussatz über den aktuellen Winkel vom Baryzentrum) berechnet. Die Distanz ist damit lageabhängig und korrekt.
- Fix (recorder.js, init.js): Script-Autoplay startete zu früh – noch während der Ladebildschirm sichtbar war und Texturen vorgeladen wurden. Das Playback wartet jetzt auf zwei unabhängige Gates: (1) Recorder initialisiert, (2) Preload abgeschlossen und
loadOverview() aufgerufen. Erst wenn beide offen sind, startet die Wiedergabe. Damit sind auch die fälschlicherweise in der Systemansicht angezeigten Overview-Labels behoben.
- Neu (recorder.js, init.js): Script-Autoplay per URL-Parameter
?script=key oder ?script=https://.... Bei Angabe eines einfachen Keys wird ./scripts/key.avps geladen; bei einer vollständigen URL wird diese direkt gefetcht. Das Script wird vor dem Abspielen gegen die bekannten Befehle (commands.json) validiert. Wenn ?script= gesetzt ist, wird ein vorhandener Deeplink (?go= bzw. /system/object-Pfad) ignoriert. Das Laden läuft parallel zum App-Init; die Wiedergabe startet automatisch sobald der Recorder bereit ist.
- Fix (surface.js): Detail-Textur fehlte beim zweiten Betreten des Surface-Mode für denselben Planeten. Ursache:
customProgramCacheKey lieferte beim zweiten Eintritt denselben String ('surface-detail-16'), sodass Three.js den gecachten Shader mit den alten Uniform-Referenzen wiederverwendete. Fix: Date.now() als eindeutiger Suffix pro Eintritt erzwingt Shader-Recompile mit frischen Uniform-Referenzen.
- Fix (surface.js): Revert V6.47-Polverzerrungsfix – Mesh-Y-Rotation war falsch, da die Kamera selbst auf World-Y sitzt und die Rotation daran nichts ändert. Originalansatz (Pivot-Z-Kippung) wiederhergestellt. Eigentliche Ursache des Venus-Problems war ein Einheitenfehler: die alte Bedingung
Math.abs(axisTilt) < 30 verglich Radiantwerte mit einem Gradwert. Korrigiert zu axisTiltAbs < 0.524 (30°) sowie |axisTiltAbs − π| < 0.524 für retrograde Planeten wie Venus.
- Fix (surface.js): Polverzerrung bei Venus und anderen Planeten unabhängig von axisTilt. Der bisherige Pivot-Kipp-Ansatz funktionierte nicht für Planeten mit großer Achsneigung. Ersetzt durch eine einfache Mesh-Y-Rotation (+20°) beim Surface-Enter, die den UV-Pol-Scheitel der SphereGeometry seitlich aus der Kamerarichtung schiebt. Beim Exit wird die Rotation wiederhergestellt.
POLE_TILT_DELTA-Konstante und axisTilt-Lesezugriff entfernt.
- Fix (surface.js): Kacheltextur wurde durch
detailTex.repeat.set() und den Shader-Uniform detailTile doppelt skaliert. repeat.set() entfernt – Kachelung läuft jetzt ausschließlich über den Shader-Uniform.
- Fix (surface.js): Crash beim Verlassen des Surface-Mode –
customProgramCacheKey wurde auf undefined gesetzt, aber Three.js r128 erwartet eine Funktion oder gar keinen Key. Beim Restore wird der Key jetzt korrekt per delete entfernt (bzw. auf eine neutrale Funktion zurückgesetzt wenn ein eigener onBeforeCompile vorlag).
- Fix (surface.js): Polverzerrung bei Venus und anderen retrograden Planeten (axisTilt ~177–180°). Die Bedingung für den Pol-Tilt-Workaround prüft jetzt
min(|axisTilt|, |180°−axisTilt|) < 30° statt nur |axisTilt| < 30°, sodass auch retrograde Pole korrekt aus World-Y herausgedreht werden.
- Perf (surface.js): Kachel-Basisfaktor der Detail-Textur von 8 auf 4 geändert (clamp 8–64), verdoppelt die Wiederholungen für bessere Detailauflösung bei 2K-Texturen.
- Fix (surface.js): Detail-Textur wurde nie geladen weil
loadSurfaceDetailTex über den Context-Weg registriert war – init.js reicht aber nur einen gefilterten Subset des Context-Blocks an registerSurfaceContext() weiter, sodass der Key nicht ankam. Fix: loadSurfaceDetailTexture wird jetzt direkt aus ./textures.js importiert (kein Context-Umweg). loadSurfaceDetailTex aus Context-Default und astroviewer.html-Context entfernt.
- UI (astroviewer.html, icons.svg): Buttons in Sektionen 3 und 4 neu geordnet. Sektion 3: Simulations-/Mondgeschwindigkeit + Pause/Kamerageschwindigkeit. Sektion 4: Vollbild/Screenshot (neues Monitor-Icon) + Schatten/Log-Skala.
- Perf (astroviewer.html, utils.js): Mehrere Allokations-Hotspots im Animations-Loop beseitigt.
topoSortStars() und Object.fromEntries() liefen bisher 60× pro Sekunde; beide werden jetzt einmalig gecacht und nur bei System-Wechsel neu gebaut. o.pos.clone().project() (Overview-Labels, 2×) und parentPos.clone().add(rel) (Mond-Positionen, Sternorbits, Planeten) ersetzte durch pre-allozierte Vektoren die jedes Frame wiederverwendet werden. Lineare starObjects.find()-Scans in Planet- und Zonen-Loop durch O(1)-Lookup im gecachten _starByKey-Map ersetzt. ellipticOrbitPos() erhält optionalen out-Parameter für allokationsfreien Aufruf.
- Fix (compare.js): Im Vergleichsmodus wurde bei Binärsternen (z.B. Alpha Centauri A/B) die Distanz als NaN angezeigt. Ursache: Begleitsterne teilen dieselbe
distanceToSol und nahezu identische ra/dec-Koordinaten – der Vektor-Ansatz lieferte numerisch 0 oder NaN. Fix: Sind beide Sterne im selben System, wird die Separation jetzt direkt aus den Orbit-Radien (Kosinussatz über den aktuellen Winkel vom Baryzentrum) berechnet. Die Distanz ist damit lageabhängig und korrekt.
- Fix (recorder.js, init.js): Script-Autoplay startete zu früh – noch während der Ladebildschirm sichtbar war und Texturen vorgeladen wurden. Das Playback wartet jetzt auf zwei unabhängige Gates: (1) Recorder initialisiert, (2) Preload abgeschlossen und
loadOverview() aufgerufen. Erst wenn beide offen sind, startet die Wiedergabe. Damit sind auch die fälschlicherweise in der Systemansicht angezeigten Overview-Labels behoben.
- Neu (recorder.js, init.js): Script-Autoplay per URL-Parameter
?script=key oder ?script=https://.... Bei Angabe eines einfachen Keys wird ./scripts/key.avps geladen; bei einer vollständigen URL wird diese direkt gefetcht. Das Script wird vor dem Abspielen gegen die bekannten Befehle (commands.json) validiert. Wenn ?script= gesetzt ist, wird ein vorhandener Deeplink (?go= bzw. /system/object-Pfad) ignoriert. Das Laden läuft parallel zum App-Init; die Wiedergabe startet automatisch sobald der Recorder bereit ist.
- Fix (surface.js): Detail-Textur fehlte beim zweiten Betreten des Surface-Mode für denselben Planeten. Ursache:
customProgramCacheKey lieferte beim zweiten Eintritt denselben String ('surface-detail-16'), sodass Three.js den gecachten Shader mit den alten Uniform-Referenzen wiederverwendete. Fix: Date.now() als eindeutiger Suffix pro Eintritt erzwingt Shader-Recompile mit frischen Uniform-Referenzen.
- Fix (surface.js): Revert V6.47-Polverzerrungsfix – Mesh-Y-Rotation war falsch, da die Kamera selbst auf World-Y sitzt und die Rotation daran nichts ändert. Originalansatz (Pivot-Z-Kippung) wiederhergestellt. Eigentliche Ursache des Venus-Problems war ein Einheitenfehler: die alte Bedingung
Math.abs(axisTilt) < 30 verglich Radiantwerte mit einem Gradwert. Korrigiert zu axisTiltAbs < 0.524 (30°) sowie |axisTiltAbs − π| < 0.524 für retrograde Planeten wie Venus.
- Fix (surface.js): Polverzerrung bei Venus und anderen Planeten unabhängig von axisTilt. Der bisherige Pivot-Kipp-Ansatz funktionierte nicht für Planeten mit großer Achsneigung. Ersetzt durch eine einfache Mesh-Y-Rotation (+20°) beim Surface-Enter, die den UV-Pol-Scheitel der SphereGeometry seitlich aus der Kamerarichtung schiebt. Beim Exit wird die Rotation wiederhergestellt.
POLE_TILT_DELTA-Konstante und axisTilt-Lesezugriff entfernt.
- Fix (surface.js): Kacheltextur wurde durch
detailTex.repeat.set() und den Shader-Uniform detailTile doppelt skaliert. repeat.set() entfernt – Kachelung läuft jetzt ausschließlich über den Shader-Uniform.
- Fix (surface.js): Crash beim Verlassen des Surface-Mode –
customProgramCacheKey wurde auf undefined gesetzt, aber Three.js r128 erwartet eine Funktion oder gar keinen Key. Beim Restore wird der Key jetzt korrekt per delete entfernt (bzw. auf eine neutrale Funktion zurückgesetzt wenn ein eigener onBeforeCompile vorlag).
- Fix (surface.js): Polverzerrung bei Venus und anderen retrograden Planeten (axisTilt ~177–180°). Die Bedingung für den Pol-Tilt-Workaround prüft jetzt
min(|axisTilt|, |180°−axisTilt|) < 30° statt nur |axisTilt| < 30°, sodass auch retrograde Pole korrekt aus World-Y herausgedreht werden.
- Perf (surface.js): Kachel-Basisfaktor der Detail-Textur von 8 auf 4 geändert (clamp 8–64), verdoppelt die Wiederholungen für bessere Detailauflösung bei 2K-Texturen.
- Fix (surface.js): Detail-Textur wurde nie geladen weil
loadSurfaceDetailTex über den Context-Weg registriert war – init.js reicht aber nur einen gefilterten Subset des Context-Blocks an registerSurfaceContext() weiter, sodass der Key nicht ankam. Fix: loadSurfaceDetailTexture wird jetzt direkt aus ./textures.js importiert (kein Context-Umweg). loadSurfaceDetailTex aus Context-Default und astroviewer.html-Context entfernt.
- Fix (surface.js):
scKey2 wurde in V6.43 versehentlich nicht deklariert → ReferenceError beim Surface-Mode-Eintritt → gesamter Detail-Textur-Block wurde nie erreicht. Debug-Log aus V6.43 wieder entfernt.
- Fix (astroviewer.html): Surface-Button war beim ersten System-Betreten noch aktiv, weil
loadStarSystem() keinen Button-State-Update auslöste. Wrapper-Funktion ruft jetzt nach dem Laden _updateSurfaceBtnState() per requestAnimationFrame auf.
- Fix (surface.js): Detail-Textur-Shader wurde nicht kompiliert.
mat.needsUpdate allein recompiliert in Three.js keinen Shader – dafür ist customProgramCacheKey nötig. Jetzt gesetzt; beim Surface-Exit wird er wieder entfernt. Zusätzlich vMapUv → vUv korrigiert (das korrekte Varying für UV in Three.js Phong-Shader).
- Debug (surface.js): temporäres
console.log zum Prüfen von key/cat/subcat beim Detail-Textur-Load hinzugefügt (wird in nächster Version entfernt).
- Fix (astroviewer.html): Surface-Button startete initial ohne
opacity:0.30, sodass er beim Betreten eines Systems aktiv wirkte obwohl nichts fokussiert war. Button ist jetzt per Inline-Style initial deaktiviert; updateSurfaceBtnState() schaltet ihn wie gehabt aktiv sobald ein geeignetes Objekt fokussiert ist.
- Fix (surface.js): Detail-Textur im Surface-Mode wurde nicht geladen und nicht angezeigt. Ursache:
onBeforeCompile wurde im async Callback gesetzt, also erst nach dem ersten Render – zu spät für Three.js. Fix: Shader-Patch wird jetzt synchron registriert (mit detailActive = 0.0 als Schalter), die Textur füllt den Uniform-Wert nach dem Laden ohne Shader-Recompile.
- Fix (surface.js): Surface-Button war auch aktiv wenn kein Objekt fokussiert war. Button ist nun nur aktiv wenn ein geeignetes Objekt fokussiert ist (kein Stern, kein Baryzentrum, Modus focus/lerping) oder der Surface-Mode bereits läuft.
- Feature (textures.js / surface.js): Im Surface-Mode wird jetzt zusätzlich zur Basistextur eine gekachelte Detail-Textur aus
images/surface/ per Shader multiplikativ überlagert, was die wahrgenommene Auflösung auf der Planetenoberfläche deutlich verbessert. Fallback-Chain wie gewohnt: Objekt → Subkategorie → Kategorie. Kachelfaktor wird automatisch aus dem Objektradius berechnet. Graceful Degradation wenn keine Detail-Textur vorhanden.
- Cleanup (astroviewer.html):
OV_CONNECT_RANGE_LOCAL war ein Alias auf OV_CONNECT_RANGE der nie genutzt wurde. Entfernt.
- Cleanup (astroviewer.html):
Object.defineProperty(window, '_cmpStateProxy', { get: getCmpState }) war ein Proxy der nie gelesen wurde. Entfernt.
- Cleanup (astroviewer.html): Kommentar erwähnte noch
startTexturePreload (seit V6.33 entfernt). Bereinigt.
- Cleanup (surface.js):
window._surfDbg = false in exitSurfaceMode() war ein Überbleibsel des Debug-Guards der in V6.32/V6.37 aus camera.js entfernt wurde. Entfernt.
- Cleanup (surface.js):
_surfaceNormal hatte doppelte Lazy-Init-Logik – einmal in registerSurfaceContext() und nochmals in getSurfaceNormal() und enterSurfaceMode(). getSurfaceNormal() gibt jetzt direkt zurück; enterSurfaceMode() ruft nur noch .set(0,1,0) (non-null nach Context-Registrierung). Eine Init-Stelle: registerSurfaceContext().
- Perf (scene.js):
renderer.setPixelRatio(devicePixelRatio) → Math.min(devicePixelRatio, 2). Auf 3×/4×-Retina-Displays (z.B. aktuelle iPhones, einige Android-Geräte) würde der Renderer sonst 9–16× so viele Pixel rendern wie bei 1×, ohne sichtbaren Qualitätsgewinn ab 2×. Cap reduziert Rechenlast und GPU-Speicherbedarf auf Hochdichte-Displays signifikant.
- Fix (textures.js): Regression aus V6.33 –
applyTex is not defined beim Surface-Mode-Eintritt. Im Cache-Hit-Pfad von loadHighResSurfaceTexture() (Z.236) wurde beim applyTex()→_applyTex()-Refactor ein Aufruf übersehen: applyTex(textureCache[url]) blieb ohne mat-Argument und altem Namen stehen. Korrigiert zu _applyTex(textureCache[url], mat).
- Fix (camera.js):
TypeError: can't access property "getPos" of null in _surfaceCameraTransform() wenn Shadow-Toggle vor Surface-Mode-Eintritt ausgeführt wurde. Ursache: Race-Condition – _surfaceMode wurde auf true gesetzt bevor _surfaceTgt im Camera-Context ankam, sodass updateCamera() in den Surface-Pfad lief und tgt.getPos() auf null aufrief. Fix: _surfaceCameraTransform() prüft tgt und normal auf null und gibt null zurück; updateCamera() kehrt sofort zurück wenn _surfaceCameraTransform() null liefert.
- Fix (camera.js): V6.32-Fixes (
window._* → CAM._* für alle Transition-State-Variablen, Debug-console.log entfernen) erneut angewendet, da die zwischenzeitlich hochgeladene camera.js die alte Version ohne diese Änderungen war.
- Fix (panels.js / astroviewer.html): Help-Panel-Position wurde nach V6.35 nicht mehr gespeichert. Ursache:
_helpPanelDragPos wurde in eine lokale HTML-Variable migriert, aber panels.js las _ctx.getHelpPanelDragPos() – der Context-Getter war in registerInitContext registriert, nie aber an registerPanelsContext weitergegeben. Revert: _helpPanelDragPos bleibt auf window._helpPanelDragPos in panels.js; helpPanelOpen/helpPanelSetOpen bleiben als saubere Exports bestehen.
- Fix (atmosphere.js): Variable-Shadowing im GLSL-Fragment-Shader:
float light wurde in main() deklariert und im else-Zweig identisch redefiniert. Die Redefinition entfernt; der else-Zweig nutzt jetzt das äußere light.
- Cleanup (atmosphere.js / panels.js / astroviewer.html): Exports
_buildAtmoArc und _buildMatterCompositionPie in buildAtmoArc / buildMatterCompositionPie umbenannt (_-Prefix impliziert Modul-Privatheit, die hier nicht zutrifft). Import-Stellen in astroviewer.html und panels.js angepasst.
- Perf (animate.js): 12+
new THREE.Vector3()-Allokationen pro Frame eliminiert. 10 modul-globale Reuse-Vektoren (_ZERO, _camDir, _wp, _rel, _ld, _camXZ, _labelPos, _pPos, _cPos, _nbProj, _vtmp) einmalig allokiert. Alle .clone()- und inline new THREE.Vector3()-Calls durch .copy()/.set() ersetzt.
- Fix (languages.js / overview.js): Distanz-Labels in der Nachbar-Sterne-Ansicht aktualisierten die Einheit bei Sprachwechsel nicht. Ursache des V6.34-Regressions:
languages.js ruft applyLang() intern auf (beim langBtn-Click über setLang()) – der HTML-Wrapper wurde nie aufgerufen. Fix: _i18nFn-Support direkt in applyLang() von languages.js eingebaut. Der HTML-Wrapper aus V6.34 wieder entfernt. distLel in overview.js registriert _i18nFn im labelRegistry-Eintrag.
- Fix (languages.js):
showInfo1/2/3 im _ctx-Default waren null → TypeError-Risiko. Auf () => {} geändert; && _ctx.showInfoN-Guards in applyLang() entfernt.
- Fix (panels.js):
tfs hatte den toten Zweig mobile ? '12px' : '12px'. Vereinfacht zu const tfs = '12px'; hfs nutzt weiterhin den Mobile-Zweig.
- Fix (panels.js):
window._carouselApply-Monkey-Patch konnte bei zweifachem initHelpPanel()-Aufruf doppelt gewrappt werden. _helpPanelPatched-Flag auf der Funktion verhindert das.
- Refactor (panels.js / astroviewer.html):
window._helpPanelOpen und window._helpPanelSetOpen durch exportierte Funktionen helpPanelOpen() / helpPanelSetOpen() ersetzt. window._helpPanelDragPos durch _ctx.getHelpPanelDragPos() / _ctx.setHelpPanelDragPos() ersetzt. window._helpPanelRefresh bleibt auf window (languages.js kann nicht über ES6-Import referenzieren).
- Cleanup (panels.js): Ungenutzten
getMode-Eintrag aus _ctx-Default entfernt.
- Cleanup (compare.js / init.js):
getLastTime/setLastTime aus compare.js-_ctx-Default und aus dem registerCompareContext-Block in init.js entfernt – compare.js liest diese Werte nie.
- Fix (astroviewer.html / overview.js): Distanz-Labels in der Nachbar-Sterne-Ansicht aktualisierten die Einheit nicht bei Sprachwechsel. Ursache:
_refreshDistLels() war an _ctx.applyLang() gebunden, aber languages.js ruft applyLang() intern direkt auf (beim langBtn-Click), nicht über den Context-Wrapper. Fix: applyLang-Import in astroviewer.html auf _applyLangImpl umbenannt; eine lokale applyLang()-Wrapper-Funktion ruft nach _applyLangImpl() alle _i18nFn-Callbacks in der labelRegistry auf. distLel in overview.js erhält nach Erstellung einen _i18nFn-Eintrag im labelRegistry-Objekt.
- Fix (init.js):
showInfo1/2/3 im _ctx-Default waren null. Ein direkter Aufruf ohne &&-Guard hätte einen TypeError ausgelöst. Auf () => {} (No-op) geändert.
- Fix (init.js):
getVersionNumber im _ctx-Default lieferte die fest eincodierte Versionsnummer 'V6.19' (veraltet). Durch den neutralen Platzhalter '?' ersetzt; der reale Wert kommt immer von registerInitContext.
- Perf (labels.js):
positionLabel() allokierte pro Aufruf 4–5 THREE.Vector3-Instanzen (plus eine pro Occluder im Loop) → GC-Druck bei 60 fps × N Labels. Fünf modul-globale Reuse-Vektoren (_vProj, _vOccProj, _vToObj, _vDir, _vToCenter) einmalig allokiert; alle .clone()- und new THREE.Vector3()-Aufrufe im Hot-Path durch .copy()/.set() ersetzt.
- Fix (labels.js):
getStarObjects, getPlanetObjects, getDwarfObjects, getAsteroidObjects fehlten im _ctx-Default trotz defensiver ?.getXxx()-Abfragen im Occlusion-Code. Leere-Array-Defaults ergänzt.
- Doku (init.js):
getCamSpeeds (consumer: controls.js) und getCAMSPEEDS (consumer: camera.js) sind bewusste Namens-Duplikate für dieselbe Variable CAM_SPEEDS. Kommentare ergänzt.
- Fix (textures.js / astroviewer.html):
startTexturePreload war ein leerer Export-Stub der nirgends aufgerufen wurde. Export aus textures.js und Import im HTML entfernt.
- Fix (state.js / textures.js):
S._isMobile wurde von textures.js gelesen, war aber nie in state.js deklariert. Undokumentierte implizite Erweiterung des S-Objekts durch init.js. Feld mit Initialwert false in state.js ergänzt; Header-Kommentar in textures.js aktualisiert.
- Refactor (textures.js):
applyTex() war identisch in loadTexture() und loadHighResSurfaceTexture() doppelt implementiert. In modul-lokale Funktion _applyTex(tex, mat) extrahiert; beide Stellen rufen sie auf.
- Fix (builder.js / astroviewer.html):
window._beltTexCache wurde in builder.js direkt als Global gelesen, parallel zu getBeltTexCache()/setBeltTexCache() im Context. Direktzugriff in builder.js auf _ctx.getBeltTexCache() umgestellt. Im HTML den window._beltTexCache-Backing-Store durch lokale Variable _beltTexCache ersetzt.
- Refactor (builder.js):
auFn/invAuFn im _ctx-Default hatten die Formel hardcodiert (Kopie von AU()/invAU()). Auf Delegates (v) => AU(v) / (d) => invAU(d) umgestellt – eine Quelle der Wahrheit. Hinweis: Der HTML-Context verdrahtet auFn/invAuFn bewusst auf die logScale-sensitive AU()-Funktion des HTML-Scopes (log/lin-Umschaltung); das ist kein Duplikat sondern funktionale Erweiterung.
- Fix (camera.js): Zwei Debug-
console.log-Aufrufe (angle-lerp-Block, sway-lerp-Block) und ein dritter im Surface-Mode mit window._*DbgFired-Guards entfernt. Guards und zugehörige Setter im HTML ebenfalls entfernt.
- Refactor (camera.js / astroviewer.html): 20+ Transition-State-Variablen (
window._angleLerpFromX/Y, window._angleLerpToX/Y, window._angleLerpInFocus, window._angleLerpSpeed, window._angleLerpEndKey, window._swayFixedCamPos, window._swayLookFrom/To, window._swayWithZoom, window._swayEndZoom, window._swayPhase2, window._swayP1/P2/P3, window._swayEndRotX/Y, window._swayIsLookat, window._swayZoomStart/End, window._surfaceRotateWaiting) aus dem globalen window-Scope in das CAM-Objekt migriert. Alle Setter im HTML und alle Leser in camera.js auf CAM._* umgestellt. Die Felder sind mit Initialwerten im CAM-Literal deklariert.
- Fix (overview.js):
distLel (Distanz-Label der Nachbar-Sterne) fehlte _distLy-Datenwert und I18N-Aktualisierung. Neuer Export refreshDistLels() liest _distLy vom Element und setzt textContent mit aktueller t('unit.ly')-Übersetzung neu. Wird in astroviewer.html nach jedem applyLang()-Aufruf aufgerufen.
- Fix (overview.js):
CanvasTexture- und Material-Objekte (Glow-Sprites in loadOverview, Zoom-Sprites in buildNeighbourStars) wurden nie dispose()d → GPU-Speicherleck bei wiederholtem Overview-Auf-/Abbau. unloadOverview() und der Clear-Block von buildNeighbourStars() rufen jetzt geometry.dispose(), material.dispose() und material.map.dispose() für alle betroffenen Objekte auf.
- Fix (overview.js): Lokale Konstante
const _DEG = Math.PI / 180 in _raDecDistToXYZ() durch import { DEG } from './utils.js' ersetzt.
- Cleanup (overview.js): Iterationsvariable
sys2 im loadOverview-forEach-Block in sysData umbenannt.
- Fix (controls.js):
getLogScale und setShowLabels / setLogScale fehlten im _ctx-Default → TypeError bei LogScale/Labels-Toggle ohne registrierten Context.
- Fix (controls.js):
_initFullscreenBtn nutzte endAction als globale Variable (Esc-Handling). Ersetzt durch _ctx.runAction('set-fullscreen', { state: false, _fromEsc: true }) – kein globaler Scope-Zugriff mehr. Die Action prüft isFs live und ist idempotent.
- Fix (screenshot.js): Fullscreen-Button-Handler aus
initScreenshotBtn() entfernt – war doppelt zu _initFullscreenBtn() in controls.js. fullscreenBtn hatte dadurch zwei click-Listener und zwei fullscreenchange-Handler.
- Fix (screenshot.js / init.js / astroviewer.html): Renderer-Größe nach Screenshot nicht wiederhergestellt.
doCapture() ruft jetzt _ctx.onResize() nach dem Capture auf. onResize als Getter in _ctx-Default (init.js), registerScreenshotContext-Block und registerInitContext-Aufruf (astroviewer.html) ergänzt.
- Fix (init.js / astroviewer.html):
getDevMode fehlte im _ctx-Default von init.js und im registerInitContext()-Aufruf im HTML → TypeError: _ctx.getDevMode is not a function beim Öffnen des Script-Tabs am Ende einer Aufnahme. Beide ergänzt.
- Fix (recorder.js): TDZ-Risiko behoben –
let _scriptEditorActive von Z. 518 zu den anderen State-Variablen (Z. 75ff.) verschoben; getScriptEditorActive() referenzierte die Variable vor ihrer Deklaration.
- Fix (recorder.js): Header-Kommentar bereinigt –
doScreenshot ist kein exportierter Export mehr (nur intern), getScriptEditorActive und setRecActive als Exports ergänzt.
- Review (recorder.js):
getScene/Camera/Renderer im Context sind kein toter Code – sie werden in doScreenshot() und _scriptEditorBuildUI() tatsächlich genutzt. Befund revidiert.
- Fix (init.js):
registerRecorderContext()-Block fehlten getPanelDragPos, executePan, carouselGetFirst, carouselSetFirst → TypeError: _ctx.getPanelDragPos is not a function beim Rec/Editor-Start. Alle vier Getter ergänzt, sowohl im _ctx-Default als auch im Context-Block. Entsprechende Getter in registerInitContext() in astroviewer.html ergänzt.
- Refactor (recorder.js / astroviewer.html):
recorder.js vollständig in den Modul-Import integriert. Import-Block (registerRecorderContext, initRecorder, getRecActive, getPlayActive, setRecActive, getScriptEditorActive, recSerialize, recRecord) ergänzt. Lokale State-Variablen (_recActive, _playActive, _recLines, _recScript, _recLastActionTime u.a.), alle Rec/Play/Editor-Funktionen (_recStart, _recStop, _playStart, _playStop, _recSerialize, _recBuildInitScript, _recParseLine, _scriptEditorBuildUI, _scriptEditorOpen) und die IIFE-Playback-Input-Sperre aus dem HTML entfernt. Alle 15 Lesezugriffe auf _recActive/_playActive/_scriptEditorActive auf Getter umgestellt (getRecActive(), getPlayActive(), getScriptEditorActive()). runAction-Recording-Hook delegiert jetzt an recRecord(). init.js erhält neuen registerRecorderContext()-Block mit vollständigem Context und ruft initRecorderFn() auf.
- Fix (commands.json):
camera-rotate-Eintrag enthielt veralteten Parameter sequence: "rotate" der bereits entfernt wurde → wird im Script-Editor nicht mehr als Vorschlag angezeigt. (commands.json separat aktualisieren)
- Fix (astroviewer.html): Doppeltes
class-Attribut auf #sliderPlus zusammengeführt zu class="slider-panel-plus panel-button slider-button"; zweites Attribut überschrieb das erste, sodass slider-panel-plus-CSS nicht angewendet wurde.
- Fix (astroviewer.html):
window._swayEndZoom = endZoom im sway-lerp-Block doppelt zugewiesen (Z. 523 und Z. 532). Zweite redundante Zuweisung entfernt.
- Perf (astroviewer.html):
new THREE.Vector3() im Animations-Loop eliminiert. Neun wiederverwendbare Modul-Vektoren (_animCamDir, _animParentPos, _animOrigin, _animRel, _animBaryP, _animBaryC, _animCamXZ, _animLabelPos, _animVtmp) einmalig vor animate() allokiert; in der Loop per .set() / .copy() wiederverwendet → kein GC-Druck bei 60 fps.
- Refactor (compare.js): Compare-Mode-Logik (
_startComparison, _endComparison, _cmpSetState, _cmpGetRadius, _cmpEnrichOverviewTgt, _cmpRegisterClick, initCompareBtn) nach js/compare.js ausgelagert. Exportiert: registerCompareContext(), startComparison(), endComparison(), cmpSetState(), cmpRegisterClick(), cmpGetRadius(), cmpEnrichOverviewTgt(), initCompareBtn(), Getter getCmpState/Mode/Obj1/2/SysId1/2/CamProxy(). Kamera-Save/Restore über saveCamState()/restoreCamState()-Callbacks im Context. init.js erhält neuen registerCompareContext()-Block.
- Fix (languages.js / builder.js): Barycenter-Label ("Schwerpunkt"/"Barycenter") wurde beim Sprachenwechsel nicht aktualisiert. Ursache:
makeLabel('b', t('val.barycenter')) ohne _objKey → applyLang() ignorierte das Element. Fix: makeLabel erhält jetzt 'bary-label' als _objKey; tName() in languages.js mappt bary-*-Keys analog zu hz-* auf t('val.barycenter').
- Fix (surface.js): Surface-Mode-Pol-Tilt funktionierte nicht für Bary-Companions (Charon). Ursache:
_surfaceBoostMesh() suchte nur in moonObjs[], aber Charon steckt als companionMesh/companionPivot im Dwarf-Objekt. Fix: neuer Suchzweig für isBary-Einträge über companionLbl._objKey.
- Fix (astroviewer.html): Deep Link
/sol-system/jupiter blockierte alle JS-Modul-Imports (MIME-type-Fehler). Ursache: Relativer ./js/-Pfad wurde zu /sol-system/js/ aufgelöst. Fix: <base href="/"> im <head>.
- Fix (overview.js / focus-neighbour):
_systemXYZ() war in overview.js nur privat definiert. Beim Playback von focus-neighbour-Actions im HTML-Scope führte das zu ReferenceError: _systemXYZ is not defined. Fix: _systemXYZ wird nun aus overview.js exportiert und im HTML-Modul importiert. Betrifft auch _cmpRealDistText() im Compare-Mode, wo dieselbe Funktion für Cross-System-Distanzen genutzt wird.
- Refactor (init.js): Bootstrap-Logik (
_initFromData) nach js/init.js ausgelagert. Exportiert: registerInitContext(), initFromData(). Enthält: alle registerXxxContext()-Aufrufe für languages, labels, atmosphere, camera, input, overview, controls, builder, surface, panels, screenshot. _initFromData() im HTML-Scope delegiert als schlanker Wrapper: befüllt Globals, baut CAT/LCOLOR/LSIZE/HIT_MULT-Lookups, übergibt alle Getter/Setter per registerInitContext(), ruft dann _initFromDataImpl() auf. Deep-Link-Logik und initPreload()-Aufruf bleiben in init.js.
- Fix (Recorder / Panel-Visibility): Panels waren nach Script-Playback nicht sichtbar obwohl
focus-object { panel1: true, panel2: true, panel3: true } im Init-Script stand. Ursache: show-panels-Action prüft if (!focusTgt) return – bei sequence:'none' wird focusTgt in _snapFocus() gesetzt, aber die Panels wurden dort nicht korrekt geöffnet. Fix: Snapshot emittiert jetzt nach focus-object ein explizites show-panels { panel1, panel2, panel3 } wenn mindestens ein Panel sichtbar ist.
- Refactor (screenshot.js): Screenshot-Logik (
_doScreenshot) nach js/screenshot.js ausgelagert. Exportiert: registerScreenshotContext(), doScreenshot(filename, cropRect, onDone, skipFullscreen). Enthält: Canvas-Capture, Label-Overlay, optionales Crop-Rect, Fullscreen-Enter vor Capture, Dateiname-Generierung. _doScreenshot() im HTML-Scope delegiert als Proxy.
- Refactor (panels.js): Info-Panels (showAstroObjectInfo 1/2/3), Draggable-Logic und Help-Panel nach
js/panels.js ausgelagert. Exportiert: registerPanelsContext(), showAstroObjectInfo[1-3](), hideAstroObjectInfo[1-3](), hideAllAstroObjectInfo(), positionInfoPanels(), initPanels(), initHelpPanel(), getPanelDragPos(). Fix: fehlende let COMPONENTS = {}-Deklaration wiederhergestellt (war beim Block-Ersetzen verloren gegangen).
- Feature (Surface / High-Res-Texturen): Im Surface-Modus wird auf Desktop automatisch eine hochauflösende Textur aus
images/highres/ geladen (nur wenn vorhanden). Neue Funktion loadHighResSurfaceTexture() in textures.js: baut dieselbe Fallback-Chain wie loadTexture() (key → subcategory → category), nutzt aber images/highres/ als Basis, kein Tracking-Counter, kein Mobile. _surfaceBoostMesh() in surface.js ruft sie async auf; die Original-Textur wird im Backup gespeichert und von _surfaceRestoreMesh() beim Exit wiederhergestellt.
- Fix (Surface / Pol-Verzerrung Asteroiden):
_surfaceBoostMesh() suchte nur in planetObjects und dwarfObjects. Asteroiden (z.B. Pallas, Vesta) wurden nicht gefunden → kein Geometry-Boost, kein Pivot-Tilt. Fix: Suche auf asteroidObjects erweitert. Da Asteroiden keinen Pivot haben (kein applyAxisTilt), wird der Tilt direkt auf mesh.rotation.z angewandt. Context bekommt neuen Getter getAsteroidObjects.
- Fix (Surface / Neighbour-Star-Labels): Der Occlusion-Check im HTML-
animate()-Loop projiziert das Planetenzentrum auf den Screen – im Surface-Mode liegt es hinter der Kamera (v.z ≥ 1), wodurch der Check immer durchfällt. Fix: Am Anfang des Neighbour-Star-Loops Strahl-Kugel-Test (proj/perp2/tEntry) direkt im HTML-Scope mit _surfaceTgt.
- Fix (Surface / Pol-Verzerrung): Alle bisherigen Ansätze (tex.offset, rotation.y, rotateX, surfaceRotX) hatten Seiteneffekte oder keine Wirkung. Neuer Ansatz:
pivot.rotation.z += 20° beim Enter. Der Pivot trägt die gesamte Achsenneigung – durch Kippen dreht sich die Rotationsachse des Planeten inkl. Textur seitlich, sodass der Pol-Scheitelpunkt der SphereGeometry nicht mehr bei World-Y liegt. Beim Exit: pivot.rotation.z -= 20°. Nur bei axisTilt < 30°.
- Fix (Surface / Labels): Strahl-Kugel-Test war fehlerhaft weil die Kamera direkt auf der Kugeloberfläche steht (t≈0, schlägt Threshold). Neuer Ansatz: kürzester Abstand des Strahls vom Planetenzentrum (perp²). Objekt wird ausgeblendet wenn: Zentrum in Strahlrichtung liegt (proj > 0), Abstand < r (Strahl durchschneidet Kugel), und vordere Schnittstelle (tEntry) vor dem Objekt liegt.
- Fix (Surface / Pol-Verzerrung): Alle bisherigen Textur/Geometrie-Ansätze hatten Seiteneffekte. Pragmatischer Fix: Kamera startet beim Eintritt in den Surface-Modus mit
surfaceRotX = -0.15 rad (≈ −9° Pitch). Der Pol-Scheitelpunkt liegt damit leicht über dem Horizont; beim normalen Horizont-Blick ist das Artefakt nicht sichtbar.
- Fix (Surface / Labels): Horizont-Culling war ungenau (Bildschirm-Halbierung). Ersetzt durch präzisen Strahl-Kugel-Schnitt-Test: Label wird ausgeblendet wenn der Strahl Kamera→Objekt die Planetenkugel trifft (Schnittpunkt
t > 0.5 und vor dem Zielobjekt). Keine Fehlalarme mehr für Objekte am Horizont.
- Fix (Surface / Textur):
tex.offset-Ansatz griff nicht zuverlässig (asynchrones Textur-Loading, Caching). Neuer Ansatz: planetObj.mesh.rotation.y += Math.PI/4 beim Enter. Die Textur-UVs sind in der Geometrie eingebettet und drehen sich mit. Beim Exit wird der Delta-Wert subtrahiert (nicht absoluter Wert, da applyRotation die Y-Rotation kontinuierlich weitertreibt).
- Fix (Surface / Labels): Labels von Objekten unterhalb des Horizonts wurden trotzdem angezeigt. Ursache V6.09: Prüfung mit Welt-Normal
(0,1,0) war inkorrekt da Planetenzentrum nicht im Ursprung liegt. Fix: positionLabel() berechnet jetzt den Nadir-Vektor (Kamera→Planetenzentrum via getSurfaceTgt()) und blendet Labels aus wenn toObj·nadir > 0.05. Context bekommt neuen Getter getSurfaceTgt.
- Fix (Surface / Animate): Neighbour-Star-Dots und Labels wurden im Surface-Mode trotzdem angezeigt (der Screen-Space-Occluder-Check in
animate.js griff nicht zuverlässig für weit entfernte Sterne). Fix: Neighbour-Star-Loop überspringt Rendering komplett wenn getSurfaceMode() aktiv.
- Fix (Surface / Textur): Textur-Offset von 10° war zu gering um die equirectangulare Naht/Pol-Verzerrung sichtbar zu verschieben. Auf 45° horizontal + 45° vertikal erhöht. Backup speichert jetzt auch
wrapS/wrapT und stellt sie beim Exit exakt wieder her.
- Fix (Surface): Neighbour-Stars konnten im Surface-Modus angeklickt werden und den Modus verlassen. Ursache:
overview.js las _surfaceMode einmalig beim Aufbau (buildNeighbourStars()), nicht live. Fix: _onNbClick() ruft jetzt _ctx.getSurfaceMode() ab (live-Getter).
- Fix (Surface): Labels von Objekten unterhalb des Horizonts wurden trotz Planetenoberfläche als Occluder angezeigt. Fix:
positionLabel() in labels.js prüft im Surface-Mode ob der Richtungsvektor Kamera→Objekt negatives Skalarprodukt mit der Surface-Normal hat; ist das der Fall wird das Label ausgeblendet. registerLabelsContext() bekommt neuen Getter getSurfaceNormal.
- Fix (Surface): Equirectangulare Textur-Pole-Verzerrung direkt unter der Kamera. Fix:
_surfaceBoostMesh() in surface.js setzt UV-Offset (+10°/360 horizontal, −10°/180 vertikal) wenn axisTilt < 30°; _surfaceRestoreMesh() setzt den Original-Offset zurück.
- Refactor: Surface-View nach
js/surface.js ausgelagert. Exportiert: enterSurfaceMode(), exitSurfaceMode(), applySurfaceVelDelta(), updateSurfaceBtnState(), getSurfaceMode(), getSurfaceTgt(), getSurfaceNormal(), registerSurfaceContext(), SURFACE_HEIGHT_FACTOR. Interne Helfer: _surfaceBoostMesh(), _surfaceRestoreMesh(). HTML-Scope hält Proxy-Variablen (_surfaceMode, _surfaceTgt, _surfaceNormal), die per onEnter/onExit-Hook synchronisiert werden.
- Fix: Log/Lin-Toggle skalierte Orbits nicht mehr. Ursache:
builder.js hatte eine eigene immer-logarithmische AU()-Funktion. snapshotAndRescaleDistances() und die HZ-Berechnung in loadStarSystem() riefen diese auf, statt der logScale-sensitiven AU() aus dem HTML-Scope. Fix: Context bekommt auFn und invAuFn als Getter, builder.js ruft ausschließlich _ctx.auFn()/_ctx.invAuFn() auf.
- Fix:
SyntaxError: redeclaration of const AU – builder.js-Import versuchte AU/invAU als Funktionen zu re-deklarieren, die im HTML-Scope bereits als const existieren (logScale-sensitive Version). Import-Aliase _AU/_invAU und die Wrapper-Funktionen entfernt; builder.js nutzt intern seine eigene immer-logarithmische AU()-Funktion.
- Refactor: System-Builder nach
js/builder.js ausgelagert. Exportiert: loadStarSystem(), unloadCurrentSystem(), visDist(), AU(), invAU(), makeNeighbourGlowTex(), snapshotAndRescaleDistances(), registerBuilderContext(). Interne Helfer: buildMoon(), buildRing(), _cachedAngle(), _saveAnglesToCache(), _linMinPlanetDist(), _getLinDistFactor(). Abgedeckte Objekte: Sterne (inkl. Barycenter, Glow-Sprites, Auto-HZ), Planeten, Monde, Asteroiden, Zwerge (inkl. Barycenter-Paare), Zonen (inkl. Scatter-Texturen). registerBuilderContext() wird in _initFromData() registriert.
- Fix:
camera-rotate free/focus Mode: aufgezeichnete dx/dy waren akkumulierte Velocity-Impulse (≈ 1/5.556 des tatsächlichen Winkels). input.js multipliziert jetzt mit _DRAG_ANGLE_SCALE = 1/(1−CAM_DAMPING) ≈ 5.556 beim Serialisieren. Surface-Mode ausgenommen (Velocity-Impuls-Playback bleibt).
- Fix:
camera-rotate { camMode:"surface" } Playback: Delta-direkt-Addition erzeugte Sprung. Jetzt Velocity-Impuls + Settle-Wait via window._surfaceRotateWaiting.
- Cleanup:
sequence-Parameter aus camera-rotate-Serialisierung entfernt (camMode genügt). sequence:"impulse" bleibt legacy-kompatibel.
- Fix:
camera-lookat serialisierte sequence:"none". Default jetzt "rotate".
- Fix:
camera-rotate Surface/Overview Bugs (siehe V6.02 Original-Eintrag).
- Refactor:
animate() nach js/animate.js ausgelagert.
- Tweak: Playback-Watchdog-Timeout von 12 000 ms auf 15 000 ms erhöht.
- Tweak:
camera-lookat { sequence: "rotate" } Basisgeschwindigkeit verdoppelt (0.008 → 0.016) – läuft jetzt gleich schnell wie sway.
- Fix:
angle-lerp hat Winkel korrekt interpoliert, aber die Kameraposition nie aktualisiert – die Kamera stand still. Der Block hat jetzt kein return mehr für den Focus-Modus sondern fällt in den focus-Block durch, der die eigentliche camera.position-Berechnung macht. Free-Cam wird inline abgehandelt.
- Fix:
focus-Block akzeptiert jetzt auch mode === 'angle-lerp' als Eintrittsbedingung.
- Fix:
camera-lookat { sequence: "rotate" } – Animation war in ~600ms fertig und wirkte wie ein harter Schnitt. angle-lerp-Geschwindigkeit ist jetzt per Action konfigurierbar (window._angleLerpSpeed): camera-rotate nutzt weiterhin 0.028 (~0.6s), camera-lookat nutzt 0.008 (~2.5s).
- Tweak: Aufwärts-Tilt von
0.25 auf 0.35 × fov erhöht – Zielobjekt landet etwas weiter oben im Bild.
- Debug:
camera-lookat { sequence: "rotate" } loggt jetzt fromX/Y und toX/Y um zu prüfen ob die Zielwinkel korrekt berechnet werden.
- Fix: Vorzeichen beim Aufwärts-Tilt korrigiert – Zielobjekt erscheint jetzt oberhalb statt unterhalb des Fokusobjekts.
- Debug:
angle-lerp-Block in camera.js loggt jetzt alle vier Winkel beim Eintritt.
- Fix:
camera-lookat { sequence: "rotate" } hat korrekt angle-lerp gestartet, aber die Zielwinkel waren falsch berechnet (Kamera→Objekt statt Orbital-Winkel). Jetzt wird die Richtung vom fokussierten Objekt zum Zielobjekt in focusRotX/Y-Orbitalwinkel umgerechnet – mit leichtem Aufwärts-Tilt so dass das Zielobjekt bei ca. H/4 erscheint. Kürzester Rotationsweg via Winkel-Wrapping.
- Fix:
camera-lookat { sequence: "rotate" } wurde als sway-lerp ausgeführt, weil der Handler nur "sway" und "none" kannte. "rotate" startet jetzt einen angle-lerp: Winkel werden von aktueller Kameraposition zu den Winkeln Richtung Zielobjekt smooth interpoliert.
- Fix:
angle-lerp-Abschluss nutzt jetzt window._angleLerpEndKey statt hartkodiertem "camera-rotate", damit sowohl camera-rotate als auch camera-lookat korrekt resolven.
- Fix: Timestamp im DEV-Log verwendete UTC-Zeit – jetzt lokale Systemzeit.
- Fix:
hide-slider fehlte als eigener Eintrag in der ACTION_REGISTRY – Playback konnte den Slider nicht schließen. Jetzt als separater Eintrag vorhanden. open-slider bereinigt (kein close-Parameter mehr).
- Debug: Einmalige Console-Logs in
angle-lerp- und sway-lerp-Block von camera.js eingebaut, sowie in camera-rotate und camera-lookat beim Setzen des Mode. Damit ist im F12-Panel sichtbar welcher Block tatsächlich ausgeführt wird – hilft beim Isolieren des angle-lerp-Bugs.
- Fix:
angle-lerp Modus in camera.js eingebaut (fehlte bisher komplett). Interpoliert focusRotX/Y direkt von Startwinkeln zu Zielwinkeln per Smoothstep – kein World-Space, kein Fokuswechsel.
- Fix:
camera-rotate { sequence: "rotate" } setzt beim Playback-Start angleLerpFrom = aktuelle Winkel und angleLerpTo = from + dy/dx und startet angle-lerp – reproduziert exakt dieselbe Rotation die der User gemacht hat.
- Fix:
camera-lookat { sequence: "sway" } startet sway-lerp mit _swayIsLookat=true – schwenkt die Kamera per World-Space-Interpolation zum Zielobjekt ohne Fokuswechsel.
- Fix:
camera-rotate und camera-lookat sind ohne _playActive No-Ops – kein ungewollter Kamerasprung beim Aufzeichnen.
- Fix:
camera-rotate { sequence: "rotate" } und camera-lookat { sequence: "sway" } machten dasselbe, weil angle-lerp nie in camera.js eingebaut wurde. Jetzt korrekt implementiert: angle-lerp interpoliert focusRotX/Y direkt von Startwinkeln zu Zielwinkeln (Start + aufgezeichneter Delta) per Smoothstep – keine World-Space-Logik, kein Fokuswechsel. sway-lerp interpoliert weiterhin den World-Space lookAt-Punkt.
- Fix:
camera-rotate und camera-lookat prüfen jetzt _playActive – ohne aktives Playback sind beide No-Ops.
- Fix:
camera-rotate { sequence: "rotate" } Playback korrigiert. Berechnet jetzt beim Start der Aktion: fromX/Y = aktuelle Winkel, toX/Y = from + dy/dx und interpoliert sanft dazwischen (Smoothstep). Das Ergebnis ist exakt dieselbe Rotation die der User gemacht hat – das Zielobjekt landet am Ende wieder bei (W/2, H/4).
- Neuer
angle-lerp Modus in camera.js: reine Winkel-Interpolation ohne world-space Logik, kein Fokuswechsel, kein Panel-Update.
- Fix:
camera-lookat Action wurde auch ohne Playback ausgeführt und schnappte die Kamera ungewollt. Action prüft jetzt _playActive – ohne Playback ist sie ein No-Op.
- Fix:
camera-rotate { sequence: "rotate" } interpolierte fälschlicherweise zu einem absoluten Winkelziel statt die Bewegung nachzufahren. Neuer angle-lerp-Modus in camera.js verteilt dx/dy als Velocity-Impulse über Zeit gewichtet nach der Smoothstep-Ableitung 6t(1-t) – die Kamera macht exakt dieselbe Rotation wie der ursprüngliche Drag, nur sanft verteilt.
- Fix:
_findLookatTarget() prüft jetzt _ctx.getRecActive() – Lookat-Erkennung läuft nur während Aufnahme, hat keinen Einfluss auf normales Navigieren.
- Fix:
hide-slider ACTION_REGISTRY Eintrag fehlte – Playback schloss Slider nicht. Jetzt implementiert. closeSlider() ruft automatisch runAction('hide-slider') auf (rekursionssicher).
- Fix:
open-slider close-Parameter aus commands.json und ACTION_REGISTRY entfernt.
- Fix:
set-zoom inFocus-Parameter in commands.json ergänzt.
- Fix: Touch-Drag (Mobile) wurde nicht aufgezeichnet –
_camDragAccX/Y werden jetzt in touchmove akkumuliert, touchstart setzt sie zurück, touchend zeichnet auf.
- Feature:
camera-rotate unterstützt sequence: "rotate" – Playback interpoliert die Kamerawinkel sanft statt als Impuls. Wird automatisch so aufgezeichnet.
- Feature:
camera-lookat Heuristik nutzt Y=¼ der Bildschirmhöhe als Referenzpunkt (statt Mitte) – passt besser zum typischen Anwendungsfall (fokussiertes Objekt im Zentrum, Zielobjekt dahinter/darüber).
- Feature:
camera-lookat { sequence: "sway" } – sanfter Kameraschwenk auf Zielobjekt ohne Fokuswechsel.
- Fix:
camera-lookat Heuristik greift jetzt nur noch im Focus-Modus – im Free-Modus ist die Sonne immer nahe der Mitte und camera-rotate würde sonst nie aufgezeichnet.
- Fix: Das aktuell fokussierte Objekt wird aus der Lookat-Heuristik ausgeschlossen – es ist immer nahe der Bildschirmmitte und wäre sonst immer das Ziel.
- Feature:
camera-lookat unterstützt jetzt sequence: "none" | "sway" | "all". Bei sway/all schwenkt die Kamera sanft auf das Zielobjekt (gleiche Logik wie focus-object, aber fokussiertes Objekt und Info-Panels bleiben unverändert). Automatisch aufgezeichnet wird weiterhin sequence: "none".
- Fix:
hide-slider fehlte in der ACTION_REGISTRY – Playback schloss den Slider nicht. Aktion ist jetzt implementiert und ruft _closeSlider() auf.
- Fix:
closeSlider() löst jetzt runAction('hide-slider') aus und zeichnet das Schließen automatisch auf. Rekursionsschutz via _activeSlider = null vor dem Aufruf.
- Fix:
open-slider { close: true } entfernt – dafür gibt es hide-slider. commands.json und ACTION_REGISTRY bereinigt.
- Fix:
set-zoom im Script-Editor zeigte inFocus nicht als Template-Parameter. In commands.json ergänzt.
- Feature: Neuer Befehl
camera-lookat { key: "..." } – richtet die Kamera im Playback deterministisch auf ein Objekt aus, unabhängig von dessen aktueller Orbitalposition. Löst das Problem dass camera-rotate im Focus-Modus bei sich veränderten Objektpositionen (z.B. Eris) in falsche Richtungen zeigte.
- Feature:
camera-lookat wird automatisch statt camera-rotate aufgezeichnet, wenn beim Loslassen der Maus/des Touch-Gestures ein Objekt innerhalb von 5% der Viewport-Größe um die Bildschirmmitte liegt – z.B. dreht man auf die Sonne und die Sonne ist nahe der Mitte, wird camera-lookat { key: "sun" } ins Script geschrieben.
- Funktioniert sowohl im Free- als auch im Focus-Modus, auf Desktop (mouseup) und Mobile (touchend).
- Fix: Slider-Schließen wurde nicht im Aktionscript aufgezeichnet. Neuer Befehl
hide-slider wird automatisch aufgezeichnet wenn der Slider per Klick außerhalb, per Toggle-Button oder per Outside-Click geschlossen wird. Im Playback schließt hide-slider den Slider korrekt.
- Refactor:
open-slider { close: true } entfernt – dafür gibt es jetzt hide-slider.
- commands.json:
hide-slider hinzugefügt, open-slider close-Parameter entfernt, set-zoom inFocus-Parameter ergänzt.
- Refactor: Record/Play-System, Script-Editor und Screenshot nach
js/recorder.js ausgelagert (ES6-Modul). Exports: initRecorder(), registerRecorderContext(), getRecActive(), getPlayActive(), setRecActive(), getScriptEditorActive(), recSerialize(), recRecord(), doScreenshot(). Der Recording-Hook in runAction() sowie alle _playActive/_recActive-Checks in der ACTION_REGISTRY wurden auf die Modul-Exports umgestellt.
- Fix: Kamera-Dreh-Gesten (Drag) auf Mobilgeräten wurden nicht im Aktionscript aufgezeichnet. Ursache: Der Touch-Pfad akkumulierte die Drag-Deltas nicht in den Recording-Variablen und löste beim Loslassen kein
camera-rotate-Event aus. Akkumulatoren werden jetzt auch in touchmove befüllt und beim touchend korrekt aufgezeichnet.
- Fix: Im Focus-Modus zeigte der Zoom-Slider 0,1× als Minimum, obwohl die Kamera nicht näher als ~0,35× an das Objekt heranzoomen kann (Oberflächen-Guard). Slider-Minimum entspricht jetzt dem tatsächlichen
_fzMin-Wert des fokussierten Objekts.
- Fix: Zoom-Playback-Regression aus V5.81 behoben – Legacy-
factor-Format wurde im Playback nicht mehr korrekt angewendet.
- Fix: Zoom-Slider aktualisierte sich nicht wenn mit dem Mausrad gezoomt wurde während er offen war. Slider wird jetzt bei jedem aufgezeichneten Zoom-Event aktualisiert.
- Fix: Zoom-Slider Minus-Button blieb bei 0,14× stecken obwohl 0,1× erreichbar war. Ursache:
set-zoom speicherte den gerundeten Label-Text (parseFloat("0,14×")) statt den exakten berechneten Zielwert, und überschrieb so jeden Klick mit dem gleichen gerundeten Wert zurück. cfg.apply() gibt jetzt den exakten Wert zurück, der direkt für set-zoom verwendet wird.
- Fix: Zoom-Slider +/- Buttons wurden fälschlicherweise deaktiviert (z.B. Plus bei 1.4× obwohl Maximum 8×). Ursache:
_updateSliderMinusPlus las _sliderInput.value aus dem DOM, das zum Prüfzeitpunkt einen veralteten oder durch den Browser geclampt Wert enthalten konnte. Fix: der aktuelle Index wird jetzt direkt von jedem Aufrufer übergeben.
- Info: Zoom-Faktor 0–8× (Free) und 0–25× (Focus) sind unterschiedliche Koordinatensysteme und kein Bug – im Focus-Modus steuert
focusZoom den Orbital-Abstand zum Objekt, im Free-Modus den globalen Kamerazoom.
- Fix: Zoom-Playback stimmte nicht mit der Aufzeichnung überein. Neue Methode: statt eines relativen Velocity-Faktors wird der analytisch berechnete End-Zoom-Wert aufgezeichnet (
zoom_settled = zoom_now × acc^(1/(1−ZOOM_DAMPING))). Beim Playback wird CAM.zoom direkt gesetzt ohne Inertia-Physik – reproduziert den Zielwert exakt und ohne Frame-Flicker. Ältere Recordings mit factor-Format werden weiterhin abgespielt (rückwärtskompatibel).
- Fix: Mobile Pinch-Zoom wird jetzt aufgezeichnet. Da Pinch
CAM.zoom direkt setzt, wird der aktuelle Wert am Ende der Geste als absoluter Zoom gespeichert.
- Fix: Zoom-Recording und -Slider waren durch V5.77-Änderungen defekt. Zoom-Recording auf die Original-Methode (
factor-Format) zurückgesetzt. Playback setzt zoomVel jetzt vor jedem Burst auf 1 zurück, damit akkumulierte Restdämpfung aus vorherigen Zoom-Aktionen den nächsten Burst nicht verfälscht.
- Fix: Auf Mobile wurden Pinch-Zoom-Gesten nicht aufgezeichnet. Am Ende einer Pinch-Geste wird jetzt der Velocity-Faktor als
camera-zoom-Action ins Script geschrieben (gleiches Format wie Desktop-Wheel).
- Fix: Zoom-Aufzeichnung speicherte immer den Wert 1, weil
CAM.zoom zum Zeitpunkt des Wheel-Events noch nicht durch den Animate-Loop aktualisiert war. Fix: aufgezeichnet wird jetzt CAM.zoom × akkumulierter Faktor – der korrekte Zielwert nach allen Wheel-Ticks im 150ms-Fenster.
- Fix: Auf Mobile wurden Pinch-Zoom-Gesten nicht aufgezeichnet. Am Ende einer Pinch-Geste wird jetzt der absolute Zoom-Wert als
camera-zoom-Action ins Script geschrieben.
- Fix (Bug 2):
focus-object nach einem focus-neighbour löste einen Watchdog aus und blockierte den Playback. Ursache: set-camera-state bricht seit V5.75 laufende Lerp-Animationen ab (mode='focus'), rief aber nicht endAction('focus-object') auf – der wartende Promise blieb ungelöst. set-camera-state feuert jetzt explizit endAction('focus-object') wenn es eine laufende Lerp abbricht.
- Fix (Bug 4): Zoom-Playback weicht von der Aufzeichnung ab. Ursache: bisher wurde ein relativer Velocity-Faktor aufgezeichnet, der durch den Inertia-Dämpfungsunterschied zwischen Recording und Playback nie identisch reproduzierbar war. Ab jetzt wird der absolute Zoom-Wert (
CAM.zoom / CAM.focusZoom) aufgezeichnet und beim Playback direkt gesetzt – keine Velocity-Physik mehr für Zoom-Schritte. Ältere Recordings mit factor-Einträgen werden weiterhin per Velocity abgespielt (rückwärtskompatibel).
- Fix (Bug 1): Aufzeichnung erfasste keine Wartezeit vor der ersten Aktion. Ursache:
_recActive wurde vor _recBuildInitScript() auf true gesetzt, was potenzielle Seiteneffekte erlaubte. Init-Snapshot wird jetzt gebaut bevor die Aufzeichnung aktiviert wird; der Zeitstempel wird danach sofort gesetzt.
- Fix (Bug 2):
focus-neighbour-Animation feuerte mehrfach. Ursache: onNeighbourZoomDone konnte erneut aufgerufen werden bevor mode zurückgesetzt war. Guard eingebaut: onNeighbourZoomDone prüft jetzt ob mode === 'neighbour-zoom' und setzt ihn sofort auf 'free' bevor das System geladen wird.
- Fix (Bug 3): Kamera-Drehungen beim Playback wichen von der Aufzeichnung ab.
set-camera-state bricht jetzt laufende Lerp/Sway-Animationen sofort ab (lerpT=1, mode='focus'), damit aufgezeichnete Winkel nicht nachträglich überschrieben werden.
- Fix (Bug 4): Zoom-Playback produzierte abweichende Beträge. Ursache: aufgezeichnet wurde der rohe akkumulierte Wheel-Faktor (
_wheelAcc), der nicht dem durch Inertia-Dämpfung bereits reduzierten zoomVel-Wert entspricht. Es wird jetzt der tatsächliche zoomVel-Wert zum Aufzeichnungszeitpunkt gespeichert und beim Playback direkt gesetzt.
- Fix (Bug 1): Klick auf Stern in der Übersicht (PC) bzw. zweiter Tap (Mobile) startete Zoom-Animation direkt ohne
runAction('zoom-overview-to') – Aktion wurde nicht ins Script aufgezeichnet. Beide Pfade in setFocus() routen jetzt über runAction.
- Fix (Bug 2): Buttons wie Speed/MoonSpeed blieben nach Übersicht→System-Wechsel gedimmt.
applyOverviewButtonStates(false) restaurierte fälschlicherweise den gespeicherten Opacity-Wert (_ovOpacity), der bei bestimmten Aufrufreihenfolgen bereits '0.30' war. Fix: beim Deaktivieren wird Opacity jetzt immer direkt auf '' gesetzt. Außerdem ruft _playStop() nach dem Restore applyOverviewButtonStates(isOverview) auf, damit nach Playback der korrekte Dimming-State gilt.
- Fix (Bug 3): Zoom-Playback produzierte andere Zoom-Beträge als aufgezeichnet. Ursache:
camera-zoom nutzte CAM.zoomVel *= f, aber beim Live-Recording hat der Inertia-Abbau zoomVel zwischen Wheel-Events bereits teilweise gedämpft. Beim Playback ist zoomVel dagegen immer im Neutralzustand. Fix: Playback setzt zoomVel = f statt *= f. Außerdem wird jetzt params.mode aus dem Recording verwendet statt der Live-mode-Variable.
- Fix (Bug 4): Watchdog-Timer wurde nicht gecancelt – instant-Actions feuerten nach 12 s eine Warning obwohl sie längst abgeschlossen waren. Timer wird jetzt per
clearTimeout beendet sobald die Action resolved. Zusätzlich: wait-Timeout auf ms + 2000 erhöht für aufgezeichnete Pausen >12 s.
- Fix (Bug 1): Init-Script speicherte Zoom mit
set-zoom bevor focus-object lief, weshalb mode noch 'free' war und der Zoom in den falschen Bucket (CAM.zoom statt CAM.focusZoom) geschrieben wurde. set-zoom bekommt jetzt ein explizites inFocus-Flag im Params-Objekt und ignoriert den aktuellen mode.
- Fix (Bug 2):
focus-object mit sequence:'none' rief _snapFocus() auf, das focusRotX/Y aus der aktuellen Kameraposition neu berechnete und so den danach folgenden set-camera-state überschrieb – Kamera zeigte 180° falsch. Reihenfolge im Init-Script geändert: focus-object läuft jetzt vor set-zoom und set-camera-state, sodass set-camera-state die berechneten Winkel korrekt überschreiben kann.
- Fix: Screenshot-Dateiname in der Systemübersicht zeigte den Namen des zuletzt besuchten Systems –
sys ist beim Übersichts-Screenshot noch befüllt. Dateiname ist jetzt AstroViewer_Overview_[timestamp].png wenn isOverview aktiv ist.
- Fix (Bug 1 aus V5.70):
_doScreenshot() war beim Auslagern des Controls-Blocks versehentlich mitgelöscht worden – Screenshot-Button machte nichts mehr. Funktion wieder ins HTML-Scope zurückgeführt (direkter Zugriff auf renderer, camera, scene, labelRegistry etc. nötig).
- Fix (Bug 2 aus V5.70):
go-system-btn war nach dem Zurückkehren aus einem System aktiv, obwohl kein Crosshair gesetzt war – _ovSetNavBtnsDisabled(false) aktivierte ihn pauschal. Jetzt wird go-system-btn separat verwaltet: aktiv nur wenn _ovCrosshairIdx ≥ 0. Crosshair-Set/-Remove synchronisieren den Button automatisch via setOvCrosshairIdx-Setter.
- Modularisierung: UI-Controls nach
js/controls.js ausgelagert – initControls(), registerControlsContext(), openSlider(), closeSlider(), refreshSliderUI(), updateSysNavButtons(), applyOverviewButtonStates(), setSpeedDisplay(), setMoonSpeedDisplay().
- Enthält: Slider-Panel (Zoom/Speed/MoonSpeed/CamSpeed), alle Toggle-Buttons (Orbits, HZ, Labels, Shadow, Pause, Autozoom), System-Navigation (sysLeft/sysRight/back-btn), Surface-Button, Screenshot-Button, Fullscreen-Button, UI-Toggle (hide/restore) sowie Overview-Button-Dimming.
- State-Variablen (
running, lastTime, speedIdx, moonSpeedIdx, camSpeedIdx, showOrbits, showHZ, shadowEnabled, autoZoom) bleiben als lokale let im HTML-Scope; controls.js liest sie per registerControlsContext()-Getter live.
- Fix:
zoom-overview-to wurde beim direkten Klick auf einen Stern in der Übersicht (PC) und beim zweiten Tap (Mobile) nicht gescriptet – setFocus() startete die Zoom-Animation direkt ohne runAction. Beide Pfade rufen jetzt runAction('zoom-overview-to', { 'system-key': ... }) auf.
- Fix (Bug 2):
zoom-overview-to fehlt im aufgezeichneten Script – go-system-btn-Handler robuster gemacht: Guard _ovCrosshairIdx < 0 entfernt, stattdessen Fallback-Suche via Crosshair-Mesh-Position falls overviewObjects[_ovCrosshairIdx] stale ist (z.B. nach Log-Scale-Toggle).
- Fix (Bug 2b): Init-Script emittiert jetzt
set-crosshair { instant: true } wenn beim Recording-Start ein Crosshair aktiv ist – damit ist Crosshair-State bei Playback-Wiederholung korrekt wiederhergestellt.
- Fix (Bug 3):
set-camera-state löscht jetzt auch _ovCamTargetX/Y (Overview-Sway-Targets) – verhindert dass ein abgebrochener Sway beim nächsten Playback-Durchlauf noch nachwirkt.
- Fix (Bug 3b):
set-crosshair { instant: true } snappt die Kamera direkt auf die Sway-Zielwinkel (setzt CAM.rotX/rotY sofort und löscht die Targets) – eliminiert den frame-rate-abhängigen Sway-Shift bei wiederholtem Playback.
- Fix (Bug 1): Übersichts-Nav-Buttons (vorheriges/nächstes System, „Gehe zu System") blieben nach dem Zurückkehren aus einem System deaktiviert –
loadOverview() ruft jetzt explizit ovSetNavBtnsDisabled(false) auf.
- Fix (Bug 2): Aufzeichnung im Overview erzeugte
go-overview {} ohne instant: true – der Playback blieb in der asynchronen Zoom-Out-Animation hängen und führte die nachfolgenden Aktionen nie aus. Init-Script emittiert jetzt go-overview { instant: true }.
- Fix (Bug 3): Kamera-State wurde im Init-Script nur für Systemansicht gespeichert, nicht für die Übersicht – bei wiederholtem Playback akkumulierten sich Kamera-Velocities. Jetzt wird
set-camera-state immer emittiert (auch im Overview-Modus), und set-camera-state setzt beim Ausführen alle Inertia-Velocities (camVelX/Y, focusVelX/Y, zoomVel, rollVel, surfaceVelX/Y) auf Null.
- Modularisierung: Übersichts-Szene nach
js/overview.js ausgelagert – loadOverview(), unloadOverview(), showOverviewConnections(), hideOverviewConnections(), updateOverviewConnections(), ovCrosshairSet(), ovCrosshairRemove(), ovUpdateCrosshair(), buildNeighbourStars(), registerOverviewContext().
- Konstanten
OV_SCALE (60 ly→units) und OV_CONNECT_RANGE (10 ly) nach overview.js verschoben; HTML importiert sie per ES6-Export.
- Crosshair-State (
_ovCrosshairIdx/Mesh/Pos) und Camera-Sway-Ziele (_ovCamTargetX/Y) bleiben als lokale let-Variablen im HTML-Scope; overview.js schreibt sie über registrierte Setter-Getter (analoges Pattern wie alle anderen Module).
- Nachbar-Stern-Aufbau (
buildNeighbourStars) vollständig in overview.js – inklusive Hit-Sphere, Zoom-Sprite, Glow-Canvas-Dot, Labels und Click-Handler über runAction.
- Modularisierung: Kamera-Physik nach
js/camera.js ausgelagert – zentrales CAM-State-Objekt (direkt mutierbar), updateCamera() mit allen Modi (free, focus, lerping, sway-lerp, surface, system-zoomout, neighbour-zoom, overview-zoom), focusOrbitalPos(), _applyRoll(), _surfaceCameraTransform(), _updateZoomLimits(), registerCameraContext().
- Modularisierung: Input-Handling nach
js/input.js ausgelagert – Mouse/Touch/Wheel-Events, Raycaster, Roll/Pan-Zonen-Logik, Cursor-Verwaltung, Drag-Akkumulatoren für Recording, initInput(), registerInputContext(), handleClick(), _executePan(), _rollZoneAt(), _panZoneAt().
- Pattern:
CAM-Objekt als gemeinsamer mutierbarer State ersetzt ~83 einzelne let-Variablen – direkte Zuweisung (CAM.rotX = ...) ohne Setter-Boilerplate.
- Modularisierung: Szenen-Grundgerüst nach
js/scene.js ausgelagert – scene, camera, renderer, W(), H(), CAM_BASE_DIST, initScene(), onResize().
- Modularisierung: Prozeduraler Sternen-Hintergrund (10 000 Partikel, 3 Helligkeits-Layer) in
_buildStarfield() innerhalb scene.js gekapselt – wird automatisch von initScene() aufgerufen.
initScene() schreibt S.scene, S.camera, S.renderer zurück in den zentralen Shared-State.
- Modularisierung: Label-Helpers nach
js/labels.js ausgelagert – makeLabel(), makeHitSphere(), setLabelFocused(), clearAllFocus(), positionLabel().
- Modularisierung: Atmosphären-Logik nach
js/atmosphere.js ausgelagert – 3D-Shader (addAtmoSphere()), Farb-Definitionen (ATMO_COLORS) sowie die SVG-Diagramm-Builder für Atmosphären-Anzeige (_buildAtmoArc()) und Materie-Zusammensetzung (_buildMatterCompositionPie()).
- Fix: Sprachumschaltung aktualisiert jetzt wieder alle Objekt-Labels, Info-Panels und den System-Titel korrekt –
languages.js liest die Laufzeit-Variablen nun über registrierte Getter statt über den einmalig kopierten State.
- Fix: Absturz beim Klick auf Exoplaneten ohne Materiezusammensetzung behoben (
pd.matter wird jetzt auf Existenz geprüft bevor auf .composition zugegriffen wird).
- Modularisierung: Zentraler Shared-State nach
js/state.js ausgelagert – alle globalen Variablen an einem Ort, kein Circular-Import möglich.
- Modularisierung: Sprachverwaltung (I18N) nach
js/languages.js ausgelagert – Übersetzungs-Funktionen t(), tName(), applyLang(), setLang() und initLang().
- Modularisierung: Textur-Loading und Material-Builder nach
js/textures.js ausgelagert – loadTexture(), makeMaterial() und startTexturePreload().
- Fix: Tooltip des Hilfe-Buttons war in beiden Sprachen gleich – jetzt korrekt „Hilfe" (DE) und „Help" (EN) aus
languages.json.
- Fix: Position beim ersten Erscheinen des Hilfe-Panels wird in die
show-help-Aktion eingebettet (als px/py), sodass Playback die identische Position reproduziert.
- Fix: Hilfe-Button in
backgroup (System-Ansicht) und als helpBtnOv in gogroup (Übersicht) eingebettet statt in eigener separater Gruppe – Button erscheint jetzt in beiden Ansichten korrekt neben dem jeweiligen Navigationsbutton.
- Fix: Text im Hilfe-Panel ist nicht mehr markierbar (
user-select: none).
- Fix:
_injectHelpI18N-Fallback und zugehöriger Aufruf vollständig entfernt – btn.help und help.title kommen ausschließlich aus languages.json.
- Fix: Hilfe-Button-Klicks (öffnen, schließen, X-Button) sowie Panel-Drag laufen jetzt über
runAction – werden korrekt aufgezeichnet und per Playback abgespielt.
- Fix: Beim Verlassen des Vergleichsmodus wird das Hilfe-Panel wieder eingeblendet, wenn es vor dem Wechsel sichtbar war (beide Rückkehrpfade: System-Ansicht und Übersicht).
- Fix: Hilfe-Button in eigene Gruppe ausgelagert (
ui-sec-1-helpgroup) – war in backgroup die in der Übersicht versteckt wird; jetzt immer sichtbar wenn Sektion 1 aktiv ist.
- Fix: Text im Hilfe-Panel auf Mobile von 10 px auf 12 px vergrößert für bessere Lesbarkeit.
- Hilfe-Panel:
btn.help und help.title aus hargecodiertem Fallback in languages.json übernommen.
- Hilfe-Panel: Neue Skript-Aktionen
show-help, hide-help und move-helppanel in commands.json registriert und implementiert (analog zu show-panels, close-panel, move-panel).
- Hilfe-Panel: Wird beim Wechsel in den Vergleichsmodus automatisch ausgeblendet.
- Hilfe-Panel: Kontextsensitive Navigation – die ersten drei Buttons (vorheriges/nächstes System, Zurück) erscheinen nur, wenn die zugehörige Gruppe in Sektion 1 tatsächlich sichtbar ist (System-Ansicht vs. Übersicht). Szene-Wechsel aktualisiert den Inhalt automatisch.
- Hilfe-Panel: Mobile-Optimierung – Panel schrumpft auf 210 px Breite, kleinere Schrift und reduzierte Ränder (analog zu Infopanel 1); reagiert auf Resize-Events.
- Fix: Hilfe-Panel war als DOM-Child des Control-Panels eingebettet statt als eigenständiges Body-Element – Panel wird jetzt korrekt auf Szenenebene gerendert.
- Fix: Hilfe-Panel zeigte nur „●"-Punkte statt Icons – SVG-Grafiken werden jetzt direkt als inline-SVG (18×18) in die Tabelle übernommen.
- Fix: Texte im Hilfe-Panel reagierten nicht auf Sprachänderung –
applyLang ruft jetzt direkt _helpPanelRefresh auf.
- Fix: Screenshot-Button zurück in Sektion 4 neben Kamera-Speed verschoben (war versehentlich in Sektion 1); „?"-Button belegt nun die frei gewordene Stelle in Sektion 1.
- Feature: Neuer „?"-Button in Sektion 1 des Control-Panels (Tooltip: „Hilfe / Help"). Öffnet ein verschiebbares Info-Panel (gleicher Stil wie die anderen Panels, kein Leader, weit im Vordergrund) mit einer Liste aller aktuell sichtbaren Buttons: Symbol und Tooltip-Text in der gewählten Sprache.
- Das Hilfe-Panel aktualisiert seinen Inhalt automatisch bei Carousel-Navigation (Pfeil-Buttons und Swipe) und zeigt stets die Buttons der gerade sichtbaren Sektionen.
- Toggle-Verhalten: Der Button schaltet das Panel ein/aus. Das Panel schließt auch per X-Button und setzt den Toggle-Zustand zurück. Sprachchange aktualisiert den Inhalt sofort.
- Fix: Eigendrehung des Planeten im Surface Mode wurde nicht gedrosselt – der Planet drehte sich mit voller Simulationsgeschwindigkeit unter der Kamera weg. Beim Aufruf von
applyRotation für den Hauptplaneten fehlte die Übergabe des Surface-Mode-Flags (bei Monden und Doppelsternen war es korrekt).
- Fix: Beim Zoom auf einen Nachbarstern erschienen kurzzeitig farbige Kreisartefakte auf dem Bildschirm. Ursache: Alle Zoom-Sprites aller Nachbarsterne waren gleichzeitig in der 3D-Szene, auch wenn sie unsichtbar sein sollten. Beim Zoom wird jetzt nur noch der Sprite des Ziel-Sterns in die Szene geladen; alle anderen werden vorher entfernt.
- Fix: Zoom-Sprite-Textur auf hochauflösenden Mobile-Displays (hoher DPI) zeigte Gradient-Banding. Canvas-Auflösung passt sich jetzt dem Device Pixel Ratio an, und der Gradient hat mehr Übergangsstufen für weicheres Ausblenden.
- Fix: Im Surface Mode war es möglich, durch Klick auf einen Nachbarstern (Dot, Name-Label oder Distanz-Label) den Surface Mode zu verlassen – alle drei Handler prüfen jetzt
_surfaceMode.
- Fix: Gleiches Problem auf Mobile: Tap auf ein beliebiges Objekt-Label hat den Surface Mode verlassen –
makeLabel-Handler blockt jetzt in Surface Mode.
- Fix: Nachbarstern-Zoom-Effekt auf Mobile zeigte kurzen weißen Lichtblitz – Sprite-Größe auf Mobile halbiert und Fade-in verlangsamt.
- Code-Modularisierung: Transversale Utility-Funktionen in separate Datei
js/utils.js ausgelagert (ES6-Module). Betrifft Orbit-Geometrie, Sternradius-Berechnung, Koordinatenumrechnung, Spektralfarben und weitere allgemeine Hilfsfunktionen.
- Fix: Sprachauswahlbutton funktioniert nicht mehr wegen Modularisierung
- Surface View: Änderung Labels im Modus eingeblendet zu lassen ist verloren gegangen, wieder eingebaut
- Nachbarstern-Labels/-Dots werden jetzt korrekt verdeckt, wenn ein näher gelegenes Objekt (Planet, Stern, Mond etc.) vor ihnen liegt – Occlusion-Prüfung im Animate-Loop ergänzt.
- Surface View: Atmosphären-Skalierung robuster – nutzt Bounding Sphere als Fallback wenn geometry.parameters nicht verfügbar.
- Surface View: Beim Verlassen wird Blickrichtung korrekt übernommen (kein 180°-Flip mehr).
- Surface View: Atmosphären- und Wolkenmeshes werden nicht mehr ausgeblendet, sondern auf r×1.01 verkleinert – Wolken sind als Bodenbelag sichtbar, Kamera bei r×1.03 schaut darüber hinweg.
- Surface View: Glow-Meshes (BackSide) werden versteckt – behebt Loch-Artefakt bei Merkur.
- Surface View: Kamera-Höhenfaktor auf 1.03 gesetzt (dicht über der Oberfläche).
- Surface View: FOV von 75° auf 50° reduziert – reduziert die Verzerrung des Horizontbogens an den Seiten.
- Surface View: Beim Verlassen wird die Blickrichtung korrekt beibehalten (kein 180°-Flip mehr).
- Surface View: Atmosphären-/Glow-Meshes werden im gesamten Pivot-Subtree versteckt (behebt Loch-Artefakt bei Merkur).
- Surface View: Kamera steht jetzt oben auf dem Planeten (Welt-Y-Achse als Standfläche), schaut in die horizontale Blickrichtung der ursprünglichen Kamera. Planetenoberfläche unten, Weltall oben.
- Surface View: Kamera-Abstand vom Planeten auf 2× Radius gesetzt (statt 1.05×) – der Planet war vorher so nah dass er das gesamte Sichtfeld ausfüllte. Jetzt sieht man die Planetenkrümmung als Horizont unten und das Weltall oben.
- Surface View: Blickrichtung endlich korrekt – Kamera schaut vom Planeten weg ins Weltall (Sonne/Sterne sichtbar), Planetenoberfläche erscheint als Boden unten im Bild. Kamera steht auf der dem Betrachter zugewandten Seite des Planeten.
- Surface View komplett neu: Kamera-Up ist fix (0,1,0) — kein Roll, keine Schräglage. Blickrichtung in reinen Weltkoordinaten (identisch zur Free-Cam). Beim Eintritt schaut man direkt vom Planeten weg, horizontal.
- Surface View Orientierung: Yaw/Pitch jetzt in Weltkoordinaten statt Tangentialrahmen — Orbits bleiben horizontal, keine Schräglage. Eintritt übernimmt
focusRotY direkt als horizontale Blickrichtung, Pitch startet bei 0° (Horizont).
- Surface View Orientierung: Up-Vektor ist jetzt die Oberflächennormale senkrecht zur Blickrichtung — Horizont bleibt stabil, kein Kamera-Roll beim Drehen. Eintrittsrichtung wird aus der aktuellen Kamera-Blickrichtung (negiert) korrekt auf Yaw/Pitch projiziert.
- FOV auf 75° im Surface-Modus (natürlicheres Sichtfeld), Near-Clip bleibt 0.01; beides wird beim Verlassen wiederhergestellt.
- Mesh-Segmente auf 256×256 erhöht für glatteren Horizont bei kleinen Objekten.
- Rotations-Cap direkt auf Delta (max ~1°/s) statt auf Speed — funktioniert unabhängig von Simulationsgeschwindigkeit und Rotationsperiode.
- Surface View: Kamera-Orientierung komplett neu — standard First-Person-Ansatz mit Weltvertikale als Oben-Referenz; Horizont ist jetzt stabil waagerecht.
- Near-Clip-Plane wird beim Eintritt auf 0.01 reduziert (statt 0.1) damit die Planetenoberfläche nicht weggeschnitten wird; wird beim Verlassen wiederhergestellt.
- Eigendrehung des Planeten im Surface-Modus auf ein sehr langsames Minimum gedrosselt.
- Surface View: Horizont-Ausrichtung korrigiert – Kamera-Up ist jetzt immer die Oberflächennormale (lokaler Zenit), der Horizont bleibt unabhängig vom Blickwinkel waagrecht.
- Mesh-Qualität: Objekt-Lookup jetzt über
_name statt Positions-Vergleich; Planet-Mesh wird zuverlässig auf 128×128 Segmente hochgesetzt.
- Surface View: Button korrekt deaktiviert wenn kein Objekt fokussiert ist (auch beim Systemladen).
- Startorientierung vereinfacht: Horizont direkt vor dem Benutzer, stabile Ausrichtung unabhängig von Kameraposition.
- Planet-Mesh wird bei Eintritt auf 128×128 Segmente hochgesetzt und Atmosphäre ausgeblendet – bei Verlassen wird beides wiederhergestellt.
- Drag-Steuerung korrigiert: nach unten ziehen schaut jetzt korrekt nach unten (war invertiert).
- Surface View Bugfixes: Tooltip korrigiert (war i18n-Key statt Text); Button ist nur aktiv wenn ein Planet/Mond fokussiert ist.
- Startorientierung wird jetzt aus der aktuellen Kamerarichtung abgeleitet statt immer in dieselbe Richtung zu zeigen; Roll ist im Surface-Modus aktiviert.
- Kamerahöhe erhöht (1.12×) damit Polygon-Kanten kleiner Objekte nicht am Horizont sichtbar sind; Pitch-Clamp auf strikt ≥0° (kein Blick unter die Oberfläche).
- Neuer Surface View Modus: Ein neuer Button (Horizont-Icon) versetzt die Kamera direkt auf die Planetenoberfläche. Man schaut vom Planeten aus ins Universum. Kamerabewegungen drehen nur die Blickrichtung, Zoom ist deaktiviert. Erneuter Klick kehrt zur normalen Fokus-Ansicht zurück.
- Screenshot-Button in Sektion 1 (neben dem Zurück-Button) verschoben; Surface-Button belegt die ursprüngliche Screenshot-Position in Sektion 2.
- Drei weitere SVG-Icons aus dem HTML in die externe icons.svg ausgelagert: neues
icon-stop (Stopp-Quadrat) hinzugefügt; Record-, Play- und Fullscreen-Button tauschen ihre Icons jetzt sauber per use href-Attribut statt per innerHTML-Zuweisung.
- Konsolidierung: Doppeltes
display:none im Script-Play-Indikator entfernt; doppeltes class-Attribut am Slider-Button korrigiert (fehlende CSS-Klasse wiederhergestellt); falschen HTML-Kommentar berichtigt.
- Redundante Variable
_synSKY_R in der Nachbarstern-Zoom-Logik entfernt (war identisch mit SKY_R).
- Toter Code entfernt:
_recActionStart-Tracking wurde befüllt aber nie gelesen; doppelter Aufruf von showAstroObjectInfo im Sway-Branch von focus-object.
- Shadowing des globalen
sys in _linMinPlanetDist und _getLinDistFactor behoben (lokale Variable in curSys umbenannt); Shadow der globalen Funktion W() im Carousel-IIFE behoben (_secWidths).
- Ungenutzte Variablen
inactiveStyle und activeStyle im Vergleichsmodus entfernt.
let seq → const seq; vergessener harter Zoom-Floor in setFocus (AutoZoom-Pfad) nachgezogen (war in V5.28 an anderen Stellen bereits korrigiert).
- Zoom-Minimum beim Fokussieren von kleinen Objekten (Monde, Asteroiden) korrigiert: Der harte Zoom-Floor von 0.1 griff bei kleinen Objekten zu früh und verhinderte das Heranzoomen an die Oberfläche. Der Minimalzoom skaliert jetzt proportional zur Objektgröße, sodass man bei allen Objekten gleich nah heranzoomen kann.
- Neuer Script-Befehl
set-timer { seconds }: Startet einen grünen Countdown (mm:ss) neben der Script-Anzeige links oben. Wird im Script erneut aufgerufen, springt der Timer auf den neuen Wert. Nach Ende des Playbacks verschwindet er automatisch.
- Neuer Script-Befehl
hide-timer: Blendet den Countdown-Timer sofort aus.
- Bugfix Compare aus Systemübersicht: Angezeigter Name war der Systemname (z.B. „Sirius-System") statt des Sternnamens –
_cmpEnrichOverviewTgt setzt jetzt name korrekt auf den primären Sternnamen.
- Crosshair-Schwenk: Zielwinkel wird jetzt mit echtem Three.js-Projektion (
Vector3.project(camera)) per Binärsuche gelöst statt einer selbst berechneten Näherung – jeder Stern landet konsistent im oberen Bildviertel.
- Crosshair-Schwenk: Zielposition wird jetzt per Binärsuche auf einen fixen NDC-Y-Wert (+0.25, oberes Viertel) gelöst – jeder Stern landet exakt an derselben relativen Bildschirmposition, unabhängig von Elevation, Entfernung oder Zoom.
- Crosshair-Schwenk: Offset wird jetzt nach dem Winkel-Clamp angewendet – bei südlichen Sternen (wie Alpha Centauri) greift der Clamp nicht mehr das Offset weg, alle Sterne landen konsistent im oberen Bilddrittel.
- Crosshair-Kameraschwenk: Zielpunkt liegt jetzt leicht unterhalb der Bildmitte, sodass der markierte Stern nicht exakt hinter Sol zu liegen kommt.
- Crosshair-Kameraschwenk vertikal korrigiert: Zielwinkel wird jetzt über
asin(sp.y / |sp|) berechnet, was der tatsächlichen Kameraformel entspricht – Sterne werden nun auch vertikal exakt zentriert.
- Compare-Playback aus der Systemübersicht repariert:
compare-select sucht bei fehlendem planetData jetzt zusätzlich in overviewObjects und reichert den Treffer über _cmpEnrichOverviewTgt an.
- Crosshair-Kameraschwenk: vertikaler Zielwinkel wird jetzt exakt auf den Stern ausgerichtet (kein Dämpfungsfaktor mehr) – Sterne ober- oder unterhalb des Horizonts werden korrekt ins Bild gedreht.
- Neuer Befehl
hide-crosshair: entfernt das Crosshair und deaktiviert den „Zum System"-Button. Wird automatisch ausgeführt wenn der Größenvergleich in der Systemübersicht gestartet wird.
- Crosshair: Größe passt sich jetzt dynamisch der Kameradistanz an (konstante Bildschirmgröße beim Zoomen). Kamera-Schwenk-Zielwinkel wird auf sichtbaren Bereich geclampt, sodass der Stern immer im Bild bleibt.
- Auto-Zoom-Schalter aus der Systemübersicht entfernt (Button deaktiviert); Einflug-Animation läuft immer.
- Compare-Modus in der Systemübersicht repariert: Klick auf einen Stern löst jetzt korrekt die Objektauswahl aus statt sofort den Systemzoom zu starten.
- Bugfix:
const d fehlte nach dem neu eingefügten Kamera-Lerp-Block in animate() – führte zu ReferenceError: d is not defined und verhinderte das Laden der Systemübersicht.
- Crosshair-Navigation: Kamera schwenkt jetzt sanft zum ausgewählten Stern (kein harter Sprung mehr).
- Crosshair-Auswahl wird in der Action-Aufzeichnung erfasst (
set-crosshair { system-key }); „Zum System"-Button nutzt ebenfalls zoom-overview-to für konsistentes Recording.
- Auto-Zoom-Schalter funktioniert jetzt auch im Overview: deaktiviert → System wird direkt geladen, keine Einflug-Animation (gilt für Stern-Klick, Crosshair-Navigation und
zoom-overview-to-Action).
- Compare: Bugfix für Übersichtsmodus – Sterne können jetzt korrekt ausgewählt werden; nach dem Schließen kehrt die Ansicht zur Systemübersicht zurück.
- log/lin-Schalter ist in der Systemübersicht deaktiviert (Sternpositionen sind immer linear nach echten Lichtjahrwerten platziert).
- Label-Schalter funktioniert jetzt korrekt in der Übersicht – der Animate-Loop respektiert
showLabels statt es jedes Frame zu überschreiben.
- Crosshair in der Systemübersicht: Farbe auf AstroViewer-Grün geändert, Ring etwas größer, vier Tick-Linien oben/unten/links/rechts ergänzen den Ring zum echten Crosshair-Look.
- „Zum System"-Button zeigt jetzt einen nach rechts zeigenden Pfeil (spiegelverkehrt zum Zurück-Button).
- Bugfix: Fehlende schließende Klammer in
animate() nach dem Einbau des Crosshair-Billboard-Hooks (V5.13) führte zu einem Syntax-Fehler beim Laden.
- Pause, Schattenseite, Habitable Zone, Planeten- und Mondgeschwindigkeit sind in der Systemübersicht deaktiviert (wie während der Script-Wiedergabe).
- Orbit-Linien-Schalter steuert in der Übersicht, ob Distanz-Verbindungslinien beim Hovern/Auswählen angezeigt werden.
- Label-Schalter blendet in der Übersicht die Sternbezeichnungen ein oder aus.
- Controlpanel ist jetzt auch in der Systemübersicht sichtbar (standardmäßig eingeblendet, kann wie gewohnt ausgeblendet und per Restore-Button zurückgeholt werden).
- Sektion 1 zeigt in der Systemübersicht neue Navigations-Buttons: Mit ‹ und › wird ein Crosshair-Ring (3D-Torus) von Stern zu Stern gesetzt, die Kamera schwenkt dabei sanft zur Auswahl. Der „Zum System"-Button lädt das markierte System – mit Zoom-Animation oder direkt, je nach Auto-Zoom-Einstellung.
- Auto-Zoom-Schalter steuert jetzt auch in der Systemübersicht, ob die Einflug-Animation abgespielt wird oder das System direkt geladen wird.
- Größenvergleich funktioniert jetzt auch in der Systemübersicht: Zwei Sterne anklicken startet den Vergleich, nach dem Schließen kehrt die Ansicht zur Übersicht zurück.
- Verdeckungsprüfung für Labels überarbeitet: Statt eines geometrischen Strahltests im 3D-Raum (der bei nah platzierten oder großen Körpern unzuverlässig war) wird nun ein Screenspace-Vergleich verwendet – das Label wird ausgeblendet, sobald es innerhalb des projizierten Bildschirmradius eines näheren Körpers liegt. Die Prüfung gilt jetzt für alle soliden Objekte (Sterne, Planeten, Monde, Zwergplaneten, Asteroiden), nicht mehr nur für Sterne.
- Labels von Objekten die sich hinter einem Stern befinden werden jetzt ausgeblendet. Der Check läuft per Frame in
positionLabel() gegen alle Stern-Meshes des aktuellen Systems (geometrische Strahltest, kein Raycaster-Overhead). Der Stern selbst und Objekte die näher als der Stern sind bleiben davon unberührt.
- Bugfix Linearansicht: Die Habitable Zone wurde nicht mit demselben Streckfaktor wie Planetenorbits skaliert – beim Umschalten log/lin lagen deshalb andere Planeten optisch in der HZ als tatsächlich. HZ-Radien werden jetzt über
visDist() berechnet und sind damit konsistent mit den Planetenorbits.
- Bugfix Linearansicht: Proportionaler Streckfaktor nutzte fälschlicherweise den bereits skalierten Anzeigewert statt der Roh-AU-Distanz – Planeten lagen dadurch wieder im Stern. Berechnung basiert jetzt korrekt auf
_rawDistAU; Cache wird zusätzlich bei Log/Lin-Umschaltung invalidiert.
commands.json: Fehlende Parameter x, y, width, height beim screenshot-Befehl ergänzt – werden jetzt im Script-Editor vorgeschlagen.
- Bugfix Linearansicht: Planeten enger beieinander liegender Systeme (z.B. Barnard's Stern) landen nicht mehr alle auf demselben Orbit – alle Abstände werden jetzt proportional gestreckt, sodass der innerste Planet knapp außerhalb des Sterns bleibt und die relativen Abstände erhalten bleiben.
- Bugfix Playback: Ein Watchdog erkennt hängende Aktionen (Promises die nie abgeschlossen werden) und setzt das Playback nach 12 Sekunden automatisch fort.
screenshot: Neue Parameter x, y, width, height (alle optional, Standard: gesamte Ansicht) – damit kann ein beliebiger Ausschnitt des Bildschirms gespeichert werden.
- Bugfix Linearansicht: Planeten um große M-Sterne (Barnard, Wolf 359, Lacaille 9352) lagen teilweise innerhalb des Sterns – der Mindestorbitabstand passt sich jetzt dynamisch der Sterngröße an.
- Bugfix EZ Aquarii: Sterne A und C waren zur Hälfte ineinander – hardcodierte Orbitradien an neue Sterngröße angepasst (A: 5→14, C: 7→28).
- Bugfix
screenshot Playback: Der Playback-Input-Block hat fälschlicherweise auch den programmatischen Download-Click des Screenshot-Links abgefangen und verhindert. Download-Anchors werden jetzt explizit vom Block ausgenommen.
- Bugfix
screenshot Playback: Screenshots werden jetzt zuverlässig gespeichert – der Vollbild-Schritt wird während der Wiedergabe übersprungen, da er einen Benutzer-Klick voraussetzt und das Playback sonst einfriert.
commands.json: Fehlende Befehle ergänzt: navigate-system, open-slider, screenshot, set-fullscreen, show-ui; Parameter languageCode und autoWait bei show-message nachgetragen.
commands.json: Parameternamen auf korrekte camelCase-Schreibweise korrigiert (camMode, inFocus, focusPanX/Y) – Folgefehler aus V4.99.
- Bugfix Playback: Parameter-Keys in Script-Befehlen werden beim Parsen nicht mehr auf Lowercase umgewandelt – nur Command-Keys (z.B.
camera-roll) sind case-insensitiv, nicht aber Parameternamen wie camMode oder inFocus. Behebt fehlerhafte Kameraposition/-rotation bei Wiedergabe im Fokus-Modus.
- Bugfix Playback: Kamera-Drag (Drehen, Rollen, Schwenken) während der Wiedergabe funktioniert wieder korrekt – der globale Eingabe-Block hatte fälschlicherweise auch Mausklick-Start-Events abgefangen und damit alle aufgezeichneten Drag-Aktionen verhindert.
- Verlorengegangene Features aus vorherigen Version wieder hinzugefügt.
- Materiazusammensetzung von Charon (New Horizons), Dysnomia (ALMA/GAIA Dichtemessungen), Na'maka und Hi'iaka (Keck-Observatorium) hinzugefügt
- Bugfix
camera-zoom Playback: Zoom-Faktor wird jetzt als Velocity-Impuls angewendet (wie beim echten Mausrad), sodass die gedämpfte Animation identisch zur Aufzeichnung abläuft – vorher waren Start- und Endzoom beim Playback falsch
- Bugfix
focus-neighbour Playback: endAction feuert jetzt erst nachdem load-system vollständig abgeschlossen ist – verhindert das sporadische Steckenbleiben bei zwei aufeinanderfolgenden focus-neighbour-Aktionen; gleiches Fix für zoom-overview-to
neighbour-zoom: Animation komplett überarbeitet – Three.js-Sprite mit perspektivischer Größenzunahme statt 2D-Canvas-Dot
- Script-Playback: Hover-Distanzlinien in der Übersicht, Mausrad-Zoom und Objekt-Klicks während eines laufenden Scripts deaktiviert
- Script-Befehle und Parameter sind jetzt case-insensitiv:
Show-Message, autoWait, autowait etc. werden gleich behandelt
- GUI-Icons aus der HTML-Datei in
icons.svg ausgelagert: Play-Indicator, Automation-Gruppe, Record, Play, Script-Gruppe, Script-Editor
show-message: Standard-Y 82 px, neuer Parameter languageCode und autoWait
focus-object sequence:sway/all: komplett neu konzipiert – die Kamera bleibt während des Schwenks an ihrer Position und dreht nur die Blickrichtung (lookAt-Interpolation) vom alten zum neuen Ziel; bei all folgt danach Phase 2 mit Zoom zur Zieldistanz; kein Orbit-Koordinatensystem während der Schwenkanimation
- Bugfix
focus-object sequence:sway/all: swayStart liest jetzt direkt camera.position (nicht neu berechnet), sodass kein Frame-Timing-Sprung entsteht; Zielposition wird über focusOrbitalPos korrekt berechnet; focusRotX/Y werden während der Animation interpoliert (kürzester Weg); all interpoliert Zoom gleichzeitig zur Zieldistanz
focus-object sequence:sway/all: komplett neu implementiert als eigener Kamera-Mode sway-lerp – die Kamera bewegt sich jetzt in Weltkoordinaten von der aktuellen Position zur Orbit-Position um das neue Ziel (smoothstep, CAM_SPEED-abhängig); bei all wird der Zoom dabei gleichzeitig zur Zieldistanz interpoliert; zuvor war der Impuls-Ansatz nicht funktionsfähig weil focusRotX/Y objektrelative Winkel sind, kein globales Koordinatensystem
- Bugfix
focus-object sequence:sway/all: grundlegend überarbeitet – Impuls wird jetzt korrekt aus der Focus-Orbit-Position berechnet (nicht camera.position), und skaliert mit delta × (1 − CAM_DAMPING) sodass die gedämpfte Gesamtdrehung genau dem Winkelunterschied entspricht; sequence:all ruft nicht mehr setFocus() auf (das löschte den Impuls), sondern setzt Zoom und Orbit-Farben direkt
- Bugfix
focus-object sequence:sway/all: Kamerawinkel werden jetzt vor dem Fokuswechsel gesichert und nach der Impulsbrechnung explizit wiederhergestellt – Schwenk war zuvor unsichtbar weil Delta ≈ 0
- Playback-Indikator: kleines Play-Symbol mit "Script"-Label erscheint links oben während ein Script läuft, auf allen Screens sichtbar
- Belt-Texturen (Asteroidengürtel, Kleinkörpergürtel, Trümmergürtel) werden jetzt mit deterministischem Seeded-RNG erzeugt und pro System/Zone gecacht – kein sichtbares Flimmern mehr beim Replay
- Bugfix
focus-object sequence:sway/all: Sway-Impuls wird jetzt aus der tatsächlichen Kameraposition zur neuen Zielposition berechnet – funktioniert zuverlässig unabhängig vom vorherigen Fokus-Objekt
show-message: Standard-Y-Position etwas tiefer gesetzt für besseres Spacing unter der Titelleiste
- Init-Script speichert jetzt die Panel-Positionen auch dann, wenn die Panels nicht manuell verschoben wurden – damit werden
move-panel-Bewegungen im Playback korrekt von der tatsächlichen Startposition aus reproduziert
- Script-Editor: Befehlsliste aktualisiert sich sofort nach Verwendung eines Befehls per Doppelklick (zuletzt verwendete Befehle erscheinen direkt oben)
- Carousel: aktive Sektion wird beim Start des Playbacks gespeichert und nach Ende oder Abbruch wiederhergestellt
- Bugfix
focus-object sequence:sway/all: Sway-Impuls verwendete fälschlicherweise camera.position statt focusRotX/Y zur Winkelberechnung; Ergebnis war zufällig und abhängig vom letzten gerenderten Frame; Berechnung nutzt jetzt die Fokus-Winkel direkt
go-overview { instant: true }: überspringt die Zoom-Out-Animation und lädt die Übersicht sofort – ideal als erste Zeile eines gescripteten Ablaufs
- Bugfix
move-panel auf Mobile: _panelDragPos wird jetzt vor dem Setzen von style.left/top gesetzt, sodass nachfolgende _positionInfoPanel()-Aufrufe die gescriptete Position korrekt beibehalten
- Script Editor Mobile: Befehlsliste ausgeblendet (kein Doppelklick möglich), Schriftgröße des Scriptcodes auf 10px verkleinert, iOS-Auto-Zoom beim Fokus verhindert
- Script Editor Desktop: Befehlsliste auf 280px verbreitert; zuletzt verwendete Befehle erscheinen oben in der Liste (grün hervorgehoben), getrennt durch eine Linie; Reihenfolge wird in
localStorage gespeichert
show-message: sinnvolle responsive Standardwerte – ohne explizite Position/Größe erscheint das Label zentriert unterhalb der Titelleiste in der Breite des Control-Panels (min(600px, vw-48px)); Schriftgröße skaliert mit clamp für Mobile; Mindesthöhe für ~3 Zeilen
focus-object: Parameter noZoom ersetzt durch sequence mit vier Modi: zoom (Standard, bisheriges Verhalten mit Lerp-Animation), none (sofort ohne Animation, für Init-Scripts), sway (Kamera rotiert mit Impuls auf das Zielobjekt hin, kein Zoom – Stärke folgt der eingestellten Kamerageschwindigkeit), all (Sway-Impuls + anschließende Zoom-Animation); noZoom:true wird als Fallback weiterhin als sequence:none interpretiert
focus-object: Defaults für panel2 und panel3 auf true korrigiert (waren fälschlicherweise false in der Dokumentation)
- System-Key-Fallback:
load-system, zoom-overview-to und focus-neighbour akzeptieren jetzt sowohl sol als auch sol-system – fehlende oder überzählige -system-Suffix werden automatisch ergänzt bzw. gestripped
- Neuer Befehl
show-panels { panel1, panel2, panel3 }: blendet Infopanels für das aktuell fokussierte Objekt ein; ist kein Objekt fokussiert, passiert nichts
- Bugfix
camera-zoom: Faktor wurde bisher als Velocity-Impuls interpretiert, was durch die Dämpfung zu unkontrollierbaren Zoom-Weiten führte; wird jetzt direkt als Multiplikator auf focusZoom angewendet – factor: 2.0 verdoppelt den Abstand, factor: 0.5 halbiert ihn
- Neuer Script-Befehl
loop-next { repeats, commands }: wiederholt die nächsten commands Zeilen repeats-mal; Playback-Engine nutzt jetzt einen Index-Pointer statt for…of, sodass Rücksprünge möglich sind; Schleifen können verschachtelt werden
- Neuer Script-Befehl
show-message { id, text, x, y, width, height }: blendet ein transparentes Textlabel an beliebiger Position ein (Untertitel-Funktion); Fade-In über 0,55 s; mehrere Labels mit unterschiedlichen IDs gleichzeitig möglich
- Neuer Script-Befehl
hide-message { id }: blendet ein per ID referenziertes Label mit Fade-Out aus; beim Stopp des Playbacks werden alle offenen Labels automatisch entfernt
- Script Editor: Titelschrift korrigiert – verwendet jetzt explizit Arial wie der Rest der App, nicht Monospace
- Script Editor: Render-Loop wird jetzt wirklich gestoppt –
animate() kehrt direkt zurück solange der Editor offen ist; kein unnötiges Rechnen im Hintergrund mehr
- Script Editor: Befehlsliste vervollständigt (
camera-pan, camera-roll, camera-rotate, show-connections, zoom-overview-to ergänzt) und alphabetisch sortiert
- Script Editor: alle UI-Texte lokalisiert über
languages.json
- Neue Datei
commands.json (/data/commands.json): alle Befehle mit Beschreibung (de/en), Parameternamen, Standardwerten und Hinweisen; wird beim ersten Öffnen des Editors geladen und gecacht
- Bugfix:
focus-object im Init-Script löste Auto-Zoom-Animation aus – neuer Parameter noZoom: true setzt Kamera direkt ohne Lerp; wird im Init-Script automatisch gesetzt
- Bugfix: Infopanels verschwinden beim Kameraschwenk nicht im Playback – das automatische Ausblenden wird jetzt als
hide-panels-Aktion ins Script geschrieben und im Playback korrekt wiedergegeben
- Script Editor: Titel im selben Stil wie „Systemübersicht" (Großbuchstaben, light weight)
- Script Editor: Buttons breiter und korrekt layoutet, kein Textüberlauf mehr
- Script Editor: Render-Loop wird während der Editor offen ist gestoppt (statisches Sternenbild), kein Zoom mit dem Mausrad möglich
- Script Editor: Block-Bezeichnung im Leerscript heißt jetzt
// -- SCRIPT -- statt // -- RECORDING --
- Script Editor: rechte Sidebar mit allen unterstützten Befehlen; Doppelklick fügt eine Template-Zeile mit allen Parametern und Standardwerten an der Cursorposition ein
- Script Editor: komplett neues Layout – öffnet sich als eigene Vollbild-Szene mit Sternenhintergrund; Titel zeigt „Astro Script Editor"; Simulation wird pausiert; Textfeld füllt den gesamten vertikalen Raum; Abbrechen/OK-Leiste am unteren Rand im Controlpanel-Stil
- Bugfix Script Editor: beim Öffnen ohne vorhandenes Recording erschien
// -- RECORDING -- doppelt im Scripttext
- Bugfix: Record-Button blieb nach Playback-Ende ausgegraut – er wurde fälschlicherweise vom selben Dimm/Restore-Loop erfasst wie alle anderen Buttons; er wird jetzt wie der Stop-Button separat behandelt
- Neuer Button „Script Editor": öffnet ein Textfeld mit dem letzten Recording (oder dem aktuellen Init-Zustand falls kein Recording vorhanden); Änderungen können übernommen oder verworfen werden; Button ist während Playback deaktiviert
- Playback-Sperre: Während ein Script abgespielt wird können keine Buttons oder UI-Elemente vom Benutzer ausgelöst werden – alle Panel-Buttons werden gedimmt und Klicks/Touches werden in der Capture-Phase geblockt; nur der Stop-Button bleibt aktiv; Script-Aktionen laufen weiter ungestört
- Bugfix:
compare-show-panel – Label-Klick im Compare-Overlay hat nichts bewirkt weil Panel-Click-Handler erst runAction (→ Proxy → setCmpFocus) aufrief und dann sofort nochmal direkt setCmpFocus mit dem bereits geänderten cmpFocusTgt – was den ersten Aufruf sofort wieder rückgängig machte; doppelte direkte Aufrufe entfernt
- Bugfix: Objekt-Labels haben jetzt
pointer-events:auto und eigene Click/Touch-Handler – Klicks auf Labels funktionieren jetzt direkt (auch im Compare-Auswahlmodus), statt nur über das dahinterliegende 3D-Mesh
- Bugfix:
focus-neighbour Playback – im Playback war der Zielstern unsichtbar weil kein Mesh/Canvas-Dot existierte; es wird jetzt ein temporärer Canvas-Dot mit korrekter Spektralfarbe erstellt der während der Zoom-Animation sichtbar wächst
- Bugfix:
focus-neighbour – Zoom-Animation fliegt jetzt 97% des Weges zum Stern, sodass er sichtbar größer wird; funktioniert für echte Nachbarsterne und Playback-Positionen gleichermaßen
- Bugfix:
compare-objects – Label-Klick im Compare-Auswahlmodus funktioniert wieder; Klicks werden jetzt direkt an setFocus weitergeleitet statt über focus-object
- Bugfix:
focus-object – key wird jetzt immer ins Script geschrieben; _tgt war ein interner Parameter der beim Serialisieren übersprungen wurde, sodass im Playback kein Objekt fokussiert wurde
- Bugfix:
wait – wird nicht mehr automatisch ins Script geschrieben; Playback wartet bereits durch await runAction(...) auf den Promise jeder Aktion; wait { ms } bleibt für manuell gescriptete Pausen verfügbar
- Deeplink: Fallback eingebaut –
/alpha-centauri findet jetzt auch Systeme mit dem Schlüssel alpha-centauri-system
- Bugfix:
set-pause – Semantik korrigiert: state: true = Pause an, state: false = Simulation läuft; alle Call-Sites (Button, Compare-Start/Ende, Init-Script) angepasst
- Bugfix:
focus-neighbour – Playback spielt die Zoom-Animation jetzt immer ab (auch aus Systemansicht heraus); synthetische Himmelsposition wird korrekt berechnet; System wird erst nach Abschluss der Animation geladen; interne load-system-Aufrufe verwenden durchgehend system-key statt numerischer ID
- Bugfix:
compare-show-panel – Parameter geändert von target: "small"|"big" zu obj: "<object-key>", konsistent mit anderen Compare-Aktionen; Playback löst Key intern auf Small/Big-Slot auf
- Bugfix:
set-pause – Log-Eintrag war invertiert (state=false beim Pausieren, state=true beim Fortsetzen); Verhalten war korrekt, nur Logging und Script-Ausgabe falsch
- Bugfix:
focus-neighbour – Playback spielt jetzt die Zoom-Animation vollständig ab, bevor das Zielsystem geladen wird; bei Playback aus einer Systemansicht wird direkt geladen (keine Übersicht verfügbar)
- Neu:
close-compare-panel – wird beim Schließen des Info-Panels im Vergleichsmodus ausgelöst und ist scriptbar
- Neu:
move-compare-panel { px, py } – wird beim Verschieben des Info-Panels im Vergleichsmodus aufgezeichnet
- Bugfix: Init-Script snapshottete Panels immer mit
panel1/2/3: true; es werden jetzt nur tatsächlich sichtbare Panels in der aufgezeichneten Init-Sequenz berücksichtigt, inklusive gespeicherter Panel-Positionen
- Bugfix:
set-pause repariert – state ist jetzt der gewünschte neue running-Wert: true = läuft, false = pausiert; keine Invertierung mehr
- Bugfix:
focus-neighbour – alle Aufrufpfade (starDot, distLabel, handleClick, _nbTgt) korrigiert; Variable-Shadowing-Bug im forEach behoben; system-key wird jetzt immer korrekt aufgelöst
- Bugfix: Zoom im Compare-Modus beeinflusst nicht mehr den Systemzoom – window wheel-Listener prüft jetzt
_cmpMode
- Bugfix:
compare-select zeigt keine Info-Panels mehr beim Playback der Objektauswahl
- Bugfix:
set-pause repariert – state: true pausiert, state: false resumiert; Button übergibt den aktuellen running-Zustand als Zielrichtung
- Screenshot: keine internen
runAction-Aufrufe mehr in _doScreenshot; neuer Parameter filename für benutzerdefinierte Dateinamen im Script
- Bugfix:
focus-neighbour löst jetzt den echten System-Key auf (nicht die numerische ID) – Scripting und Playback funktionieren korrekt
- Compare: Kamera-Impulse aus dem Playback werden über globale Proxy-Funktionen (
_cmpCamProxy) an die lokalen Compare-Kamera-Variablen weitergegeben
- Neue Aktion
compare-show-panel: wird beim Klick auf ein Objekt-Label im Vergleichsmodus aufgezeichnet (target: "small" | "big" | null)
- Bugfix:
set-pause loggt jetzt den korrekten Zielzustand (war bisher invertiert)
- Screenshot: interne State-Änderungen (Pause, UI ausblenden/einblenden) laufen jetzt über
runAction und erscheinen im Log; werden aber nicht ins Script geschrieben (Screenshot ist die aufzuzeichnende Aktion)
- Bugfix:
focus-neighbour schreibt system-key jetzt korrekt ins Script; beim Playback ohne internen Zielobjekt wird das System über den Key geladen
- Bugfix:
navigate-system übergibt system-key jetzt bereits vor runAction damit er korrekt geloggt und gescriptet wird – keine numerischen IDs mehr im Script
- Compare: Kamera-Aktionen im Vergleichsmodus werden separat aufgezeichnet (eigene Akkumulatoren auf dem Compare-Canvas) und beim Playback korrekt auf die Compare-Kamera angewendet
- Neue Aktion
compare-close: wird beim Schließen der Vergleichsansicht (Zurück-Button) ausgelöst und ist scriptbar
- Aktionssystem: Alle Toggle-Aktionen schreiben jetzt immer explizit
state: true/false ins Script statt eines blindem Toggle – Playback ist damit zustandsunabhängig
- Aktionsnamen vereinheitlicht nach verb-subject:
show-orbits, show-hz, show-labels, show-shadow, show-ui, show-connections, set-autozoom, set-pause, set-logscale, set-fullscreen, compare-objects, open-slider, focus-neighbour, deselect-overview, zoom-overview-to, close-panel, move-panel
- Alle systembezogenen Aktionen verwenden jetzt einheitlich
system-key (String) statt numerischer systemId
- Bugfix:
compare-objects loggt start und abort jetzt korrekt; Objekt-Auswahl wird als eigenständige compare-select { obj, slot } Aktion geschrieben – Compare-Replay funktioniert damit vollständig
- Recording: zwischen allen Aktionen wird automatisch ein
wait { ms } mit der echten Wartezeit des Benutzers geschrieben – Playback läuft jetzt im originalen Tempo
- Bugfix:
overview-zoom-to ruft load-system nicht mehr vor dem Zoom auf – Reihenfolge ist wieder korrekt: zuerst Zoom-Animation, dann System einblenden
overview-connections wird wieder aufgezeichnet (Show und Hide) – mit den inter-action waits funktioniert das wie eine Geisterhand die hoverd
compare-toggle: Steps heißen jetzt start, continue, show, abort – klarer und konsistenter
- Bugfix: Slider-UI (Position, Wert, Label) wird jetzt bei
set-speed, set-moonspeed, set-camspeed und set-zoom aktualisiert wenn der Slider gerade offen ist
- Bugfix:
load-system ist jetzt async (wartet einen Frame) – mehrfaches Laden in einem Script funktioniert jetzt korrekt hintereinander
- Bugfix:
navigate-system, focus-neighbour-star und overview-zoom-to unterdrücken den internen load-system-Aufruf im Recording – keine doppelten Einträge mehr
- Init-Script: Kamerawinkel (
rotX/Y, roll, Pan-Offsets) werden jetzt als set-camera-state mitgespeichert
overview-zoom-to löst jetzt korrekt load-system intern aus (war bisher ohne Aktion)
overview-connections wird nicht mehr aufgezeichnet (flüchtiger Hover-Zustand)
- Neues Konzept: Async-Aktionen schreiben beim Abschluss automatisch
wait { ms } ins Script – Playback pausiert so lange wie die Originalanimation gedauert hat
- Bugfix:
compare-toggle repariert – pick-2nd und show sind jetzt reine Log-Schritte ohne State-Seiteneffekte; Vergleichsmodus funktioniert wieder vollständig
- Kamera-Rotate und Roll: werden jetzt als eine zusammengefasste Aktion pro Drag-Geste aufgezeichnet (statt Dutzende Einzelframes); Zoom-Events auf max. 1 pro 150 ms gedrosselt
- Neue Aktion
panel-close: wird beim Klick auf ✕ eines Info-Panels aufgezeichnet
- Neue Aktion
panel-move: wird beim Drag-Ende eines Info-Panels mit Zielposition aufgezeichnet
- Aktionssystem:
focus-object loggt jetzt korrekt die Panel-Parameter (panel1/2/3) auch wenn alle auf Standard (true) stehen
- Neue Aktion
load-system: lädt ein System direkt per ID oder Key – wird intern von navigate-system und focus-neighbour-star ausgelöst und ist damit eigenständig scriptbar
- Record: Aufnahme beginnt jetzt mit einem Initialisierungs-Block (System, Toggles, Speeds, Zoom, Fokus) – Playback startet so immer vom gleichen Zustand
- Overview: Klick auf einen Stern löst jetzt
overview-zoom-to aus statt focus-object
overview-connections: Hover-Ende wird als { hide: true, trigger: "hover-end" } geloggt; im Recording wird nur der letzte aktive Hover gespeichert, das Beenden ist implizit
compare-toggle enthält jetzt immer einen step-Parameter: pick-1st, pick-2nd, show oder abort
- Kamera-Aktionen (
camera-zoom, camera-rotate, camera-roll, camera-pan) werden jetzt aufgezeichnet und beim Playback als Physik-Impulse wiedergegeben
- Bugfix: Slider-Panel schließt jetzt korrekt bei Klick auf andere Panel-Buttons (z.B. Compare → Zoom-Button funktioniert wieder)
- Bugfix: Kamera-State (Zoom, Rotation, Position) wird beim Öffnen von Compare gespeichert und beim Schließen exakt wiederhergestellt – Zoom-Änderungen im Vergleichsmodus wirken sich nicht mehr auf die Systemansicht aus
- Bugfix: Neighbour-Star-Klick über direkten Dot-Handler wird jetzt ebenfalls als Aktion geloggt (bisher wurde
setFocus direkt aufgerufen)
- Aktions-Log:
focus-object zeigt jetzt immer explizit panel1/panel2/panel3
- Neue Sektion im Steuerungspanel: Automatisierung (Symbol: A im Rechteck) mit Record- und Play-Button
- Record-Button (roter Punkt → Stopp-Quadrat): zeichnet alle Aktionen im Format
actionKey { param: "value" } auf; Kamera-Gesten werden nicht aufgezeichnet. Bei Stopp wird das Script in einem neuen Tab angezeigt
- Play-Button (Dreieck → Stopp-Quadrat): führt das zuletzt aufgezeichnete Script Zeile für Zeile aus, wartet auf async Aktionen; kann jederzeit gestoppt werden
- Record und Play schließen sich gegenseitig aus (jeweils anderer Button deaktiviert)
- Bugfix: Compare abbrechen und dann anderen Panel-Button klicken löste fälschlich Compare aus – Klick auf anderen Panel-Button bricht jetzt ausstehenden Compare-Vorgang sauber ab
- Bugfix: Fullscreen extern beenden (z.B. Esc) wird jetzt als
endAction('toggle-fullscreen') protokolliert
- Alle Kamera-Aktionen (
camera-zoom, camera-rotate, camera-roll, camera-pan) enthalten jetzt einen screen-Parameter (system / overview / compare)
- Distanzlinien in der Systemübersicht werden jetzt als
overview-connections geloggt – bei Hover (Desktop) mit trigger:"hover", bei erstem Tap (Mobile) mit trigger:"tap"
focus-object akzeptiert jetzt panel1, panel2, panel3 als Booleans – steuert welche Infopanels nach dem Fokussieren sichtbar sind (Standard: alle true)
focus-neighbour-star übergibt jetzt key (System-ID) als Parameter statt des internen Objekts
- Aktions-Log bereinigt: Objekte werden nur noch als Key-String geloggt, nicht mehr als ganzes Datenobjekt
- Bugfix: Klick auf Zoomfaktor-Button löste fälschlich Compare aus – Slider-Close-Listener prüft jetzt alle Panel-Buttons, nicht nur Slider-Buttons
- Bugfix: Fullscreen-Button löst jetzt Aktion aus (
toggle-fullscreen)
- Bugfix: Speed- und Moon-Speed-Slider crashten mit null-Fehler –
speedDisplay/moonSpeedDisplay sind jetzt null-safe
- Neue Aktionen:
focus-neighbour-star, overview-deselect, overview-connections, overview-zoom-to, toggle-fullscreen
- Neue Aktionen:
set-speed, set-moonspeed, set-camspeed, set-zoom, slider-open
- Beobachtungsaktionen für alle Mausgesten:
camera-zoom, camera-rotate, camera-roll, camera-pan – werden geloggt, Physik bleibt unverändert
- Slider-Input und Pan-Gesten feuern jetzt semantische Aktionen für späteres Recording
- Aktionssystem: alle Controlpanel-Buttons vollständig auf
runAction migriert – Orbits, HZ, Labels, Shadow, Log/Lin, Pause, UI-Panel, System-Navigation, Übersicht-Zurück, Screenshot, Compare
- Aktionssystem: Dev-Logging eingebaut – jedes
runAction und endAction gibt Timestamp, Key und Parameter einzeilig in die Konsole aus (Flag _ACTION_LOG)
- Screenshot-Logik in eigene Funktion
_doScreenshot ausgelagert; Compare-Button respektiert Zustandsautomat (Start / Abbruch) unverändert
- Neues Feature (PoC): Aktionssystem – zentrale Funktionen
runAction(key, params) und endAction(key) eingeführt; GUI-Aktionen laufen künftig über diese Schnittstelle statt direkte Methodenaufrufe
- Auto-Zoom-Toggle und Kamera-Fokus als erste Aktionen migriert (
toggle-autozoom, focus-object); Fokus-Aktion liefert ein Promise, das nach Abschluss der Kamerabewegung resolved wird
- BugFix: Caching von Texturen verbessert und Ladeverzögerungen bei Textur-Fallbacks behoben
- Materiezusammensetzung: Änderung der Datenstruktur; eigener Materieknonten (matter)
- Materiezusammensetzung: Gasriesen eingeschlossen; Anzeige Unterschiede Oberfläche ("Atmosphäre") und Gesamtmasse
- Materiezusammensetzung: Daten der Gasriesen und Eisriesen hinzugefügt
- Sterngrößen werden jetzt physikalisch skaliert statt fixer Pixelgröße pro Spektralklasse – Potenzfunktion (√rKm) kalibriert auf Sonne = 28 Einheiten, gilt in System-, Übersichts- und Vergleichsansicht
- Rote Zwerge und Braune Zwerge zeigen damit mehr Variabilität je nach tatsächlicher Masse
- Hilfsfunktionen
starRkmFromData und scaleStarR eingeführt; doppelte Radius-Logik in der Vergleichsansicht entfernt
- Bugfix: doppeltes
class-Attribut auf allen Slider-Buttons bereinigt – Zoom-Button zeigte falschem Tooltip und aktivierte den falschen Button
- Bugfix: Vergleichsmodus mit Nachbarstern-Klick zeigte immer Radius 500 km – Nachbarstern-Objekte haben jetzt korrekte Sterndaten, sodass Masse und Radius richtig berechnet werden
- Neuer Regler: Kamerageschwindigkeit – steuert die Geschwindigkeit aller Kamerabewegungen (Auto-Focus, System-Zoom, Übersicht-Zoom). Skala 0.1× bis 2.0×, Standardwert 1.0×, mit mehr Stufen im langsameren Bereich
- Kamera-Icon (
icon-camspeed) in icons.svg ergänzt
- Screenshot-Icon in icons.svg ausgelagert (neues Symbol
icon-screenshot) – inline SVG im HTML entfernt
- Doppeltes
icon-compare-Symbol in icons.svg bereinigt
- Screenshot: Labels werden nun scharf gezeichnet – Skalierungsfaktor wird direkt aus dem tatsächlichen Canvas-/Viewport-Verhältnis abgeleitet statt aus devicePixelRatio
- Screenshot: Auflösung ist jetzt konsistent – der Renderer wird unmittelbar vor der Aufnahme auf die aktuelle Viewport-Größe normiert, damit keine zwischenzeitlichen Resize-Events (z.B. Browser-UI) zu abweichenden Bildgrößen führen
- Screenshot: Controlpanel wird vor der Aufnahme automatisch ausgeblendet und danach wieder eingeblendet
- Screenshot: Objektbezeichnungs-Labels werden (sofern eingeblendet) direkt auf den Screenshot gezeichnet – so ist nachvollziehbar, was was ist
- Screenshot-Funktion: Neuer Kamera-Button neben dem Vergleichstool – pausiert die Simulation, wechselt in den Vollbild-Modus, nimmt einen Screenshot auf und stellt danach den ursprünglichen Zustand wieder her
- Vergleichsmodus: Textmarkierung per Maus auf den Objektnamen-Labels und im Comparepanel unterbunden
- Sternbilder: Schlüssel der Sternbilder hinzugefügt (z.B. cen, uma, cma)
- Lokalisierung vervollständigt: Spektralfarben (gelb/yellow, orange usw.), Leuchtkraftklassen (Unterriese/Subgiant, Unterzwerg/Subdwarf, Hyperriese/Hypergiant)
- Sternbild-Namen lokalisiert (z.B. Zentaur → Centaurus, Schlangenträger → Ophiuchus)
- Zwergplaneten-Unterkategorien (z.B. Hauptgürtelobjekt → Main Belt Object) und Asteroiden-Typen (C-Typ → C-type, basaltisch → basaltic) lokalisiert
- Vergleichsansicht: Spaltenüberschriften zeigen jetzt lokalisierte Objektnamen
- Internationalisierung: Neue Hilfsfunktion
tName(key) für lokalisierte Objektnamen – Sprachumschaltung aktualisiert jetzt alle Labels, Infopanels, Focus-Label und Systemtitel live
- Objektnamen in
languages.json ergänzt: Deutsch und Englisch für alle Systemnamen, Planeten (Sonne/Sun, Erde/Earth, Merkur/Mercury usw.), Monde, Zonen und Schwerpunkt-Einträge
- Prokyon → Procyon (englische Bezeichnung), Barnard's Stern → Barnard's Star, Kuiper-Gürtel → Kuiper Belt usw.
- Hardcoded Texte lokalisiert: "Habitable Zone" und "Schwerpunkt" (bei Zwergplaneten-Baryzentren) nun über i18n
- Vergleichsansicht zeigt lokalisierte Objektnamen
- Diverse kleinere Korrekturen im HTML, CSS und JS code
- Bugfix: Kamera konnte bei aktivem Auto-Focus in große Objekte (Sonne, Jupiter, Saturn) hineingezoomt werden – Minimalabstand zum Objekt wird jetzt strikt eingehalten
- Icons: Überarbeitung und Auslagerung aller Roll- und Pan-Cursor und einiger anderer SVGs
- Kamera-Pan: Klick/Tap auf den zentralen Bereich jeder Bildschirmseite (oben/unten/links/rechts) verschiebt die Kameraposition einen Schritt in die jeweilige Richtung – angezeigt durch einen Pfeil-Cursor
- Kollisionsschutz: Kamera kann nicht in Objekte hineingeschoben werden
- Roll-Zonen bleiben an den äußeren Randbereichen aktiv; Pan- und Roll-Zonen überlappen sich nicht
- Bugfix: Fehlende Deklaration von
_infoTgt behoben – verhinderte hundertfache Konsolenfehler ("ReferenceError: _infoTgt is not defined") in der Animationsschleife
- Korrekturen an der Materiezusammensetzung diverser Objekte (Venus, Erde, Phobos, Deimos, Asteroiden Ceres, Pallas, Hygiea und äußere Zwergplaneten Haumea, Makemake, Eris, Pluto)
- Ladebildschirm: Versionsnummer wechselt bei 100% Ladefortschritt zur App-typischen Gold-Hervorhebung (Farbe, Fettschrift, Leuchteffekt)
- Infopanel 3 (Materiezusammensetzung): Label umformattiert, bessere Kollisionsprüfung, Führungslinien schwarz
- Infopanel 3 (Materiezusammensetzung): Korrektur drag Grenzen auf Mobile Geräten
- Daten: Korrektur "Gelber Zwerg" in Lokalisierungsdaten
- Infopanel 3 (Materiezusammensetzung): Label-Spalten komplett neu berechnet – feste Breite pro Spalte garantiert dass alle Labels innerhalb des Panels bleiben; Panel auf 320px verbreitert; Segmentzuweisung links/rechts nach echtem Winkel (nächste Seite)
- Infopanel 3 (Materiezusammensetzung): Startposition rechts unten statt zentriert oben
- Pie-Chart Labels: komplett neu – alle Labels außen mit zweispaltiger Anordnung (links/rechts vom Diagramm), Kollisionsvermeidung durch vertikales Stacking, korrekte Ausrichtung der Label-Hintergrundboxen, keine überlappenden oder außerhalb des Panels ragenden Texte mehr
- Daten: Zusammensetzung für alle Monde ergänzt (Io, Europa, Ganymed, Callisto, Titan, Rhea, Dione, Tethys, Titania, Oberon, Umbriel, Ariel, Triton u.a.)
- Infopanel 3 (Materiezusammensetzung): Bugfix – Panel erschien nicht beim Fokussieren mit aktivem Auto-Fokus (Standard), da der Aufruf im Lerp-Abschluss fehlte
- Neues Infopanel 3: Materiezusammensetzung als Pie-Chart – zeigt die wichtigsten Bestandteile (max. 5) mit Prozentangaben für Sterne (nach Spektralklasse), Planeten, Monde, Zwergplaneten und Asteroiden; Gasriesen ausgenommen
- Neue Datei components.json: zentrale Verwaltung aller Stoffe mit Farbe und lokalisierten Namen (DE/EN); ATMO_COLORS refactored und wiederverwendet
- starsystems.json: Zusammensetzungsdaten für alle relevanten Objekte im Sol-System und alle Sterne in Nachbarsystemen ergänzt
- Zoom, Planetengeschwindigkeit und Mondgeschwindigkeit: Korrekturen an Slider, Tooltips und Icons
- Zoom, Planetengeschwindigkeit und Mondgeschwindigkeit: +/- Buttons durch einzelnen Toggle-Button ersetzt; ein Klick öffnet ein Slider-Panel oberhalb des Controlpanels mit Symbol, −, Slider, + und aktuellem Wert – gleiches Layout für alle drei Regler
- Proxima Centauri: Orbit vergrößert und Ellipse stärker ausgeprägt (realistischere Darstellung der weiten, exzentrischen Umlaufbahn um das Alpha-Centauri-AB-Baryzentrumit)
- UI-Icons in eine zentrale Sprite-Datei ausgelagert (images/icons.svg) – die HTML-Datei wird dadurch schlanker und Icons sind an einem Ort pflegbar
- Pfade für CSS und Datendateien auf root-relative Pfade umgestellt (kein führendes „.")
- Deeplinks funktionieren wieder: Auswertung der URL wird jetzt erst nach dem Laden der Systemdaten durchgeführt, nicht mehr beim Script-Start wenn die Daten noch fehlen
- Monde werden jetzt mit derselben Skalierungslogik wie alle anderen Objekte berechnet (scaleR mit rKm × scaleKm, Minimum 1.0) – kleine Monde wie Phobos und Deimos erscheinen jetzt deutlich kleiner als große Monde wie unser Mond oder Titan
- Auto-Focus: Kamera-Stopposition skaliert jetzt mit der Objektgröße – Planeten, Monde und kleine Objekte werden deutlich näher herangezoomt, die Sonne entsprechend weiter weg; alle Objekte erscheinen jetzt ähnlich groß im Bild
- Vergleichsansicht: Planetenringe (Saturn, Uranus usw.) werden jetzt korrekt dargestellt
- Vergleichsansicht Mobile: Absturz nach Label-Klick behoben – das Infopanel blockierte alle Touches wenn es sichtbar war; Touch-Drag des Panels läuft jetzt lokal statt über einen globalen window-Handler
- Vergleichsansicht Mobile: Infopanel blockiert keine Touches mehr wenn es ausgeblendet ist (pointer-events deaktiviert)
- Vergleichsansicht: Zoom stockt beim Wechsel zwischen Labels weniger – Kamera-Animation etwas beschleunigt
- Vergleichsansicht Mobile: Touch-Eingabe komplett neu implementiert – alle Touches laufen direkt über den Canvas, Labels/Panels verwenden Tap-Erkennung per Positions-Abgleich; Zoom und Drehen funktionieren jetzt zuverlässig
- Vergleichsansicht: Zoom stockt nicht mehr nach dem Anklicken eines Labels – Zoom-Velocity wird beim Fokus-Wechsel und am Ende der Kamera-Animation zurückgesetzt
- Vergleichsansicht Mobile: Drehen und Zoomen (Pinch) funktionieren jetzt korrekt – Touch-Events werden vollständig abgefangen und nicht mehr vom Haupt-Canvas-Handler überschrieben
- Vergleichsansicht: Zoom stockt nicht mehr wenn das Minimum erreicht wird – Zoom-Geschwindigkeit wird beim Erreichen der Grenze sofort zurückgesetzt
- Vergleichsansicht: Mindest-Zoom jetzt objekt-abhängig – beim Fokus auf das kleinere Objekt kann man wieder nah heranzoomen, beim größeren bleibt der Schutz vor dem Hineinfliegen erhalten
- Vergleichs-Infopanel: Schließen-Button blendet nur das Panel aus, ohne Kamera oder Fokus zurückzusetzen
- Vergleichs-Infopanel: Breite wieder auf Originalwert (kein Textumbruch mehr)
- Vergleichsfunktion auf Mobile: Abbruch-Button (Klick auf „1" oder „2") funktioniert jetzt korrekt – der Button kehrt zum Ausgangszustand zurück und Zoom/Klick bleiben danach vollständig nutzbar
- Vergleichsansicht: Kamera kann nicht mehr in Objekte hineinzoomen – bei stark unterschiedlichen Größen (z.B. Sonne vs. Asteroid) bleibt ein sinnvoller Mindestabstand erhalten
- Vergleichs-Infopanel auf Mobile jetzt genauso transparent und kompakt wie die übrigen Infopanels
- Türkisfärbung aller Objekte in Sol- und Alpha-Centauri-System behoben: die Lichtfarbe der Sonne (Klasse G) war auf einen falschen Wert gesetzt worden (0xFFF4 statt 0xFFF4E0), was alle beleuchteten Objekte türkis erscheinen ließ
- Groombridge 34 A Orbit korrigiert: AU-Werte ≥ 80 wurden fälschlich als visuelle Einheiten interpretiert – Stern-Orbits werden jetzt immer direkt als AU-Rohwerte behandelt
- Epsilon Indi Orbit-Proportionen korrigiert (gleiche Ursache)
- CSS neu organisiert
- Stern-Orbits in Mehrsternsystemen vollständig korrigiert: Systeme mit Schwerpunkten (EZ Aquarii, 61 Cygni, Prokyon, Gliese 725, Groombridge 34, Epsilon Indi) haben jetzt wieder die richtigen Abstände – AU-basierte Orbits werden korrekt skaliert, visuelle Fixwerte bleiben unverändert
- Trümmergürtel/Zonen-Darstellung korrigiert: Gürtel in Epsilon Eridani und Tau Ceti wurden verzerrt, da Außenradien ≥ 80 AU fälschlich als visuelle Einheiten interpretiert wurden
- Restliche Farbfehler behoben: Uranus und 2 Eisriesen-Exoplaneten hatten leicht abweichenden Farbton
- Stern-Orbit-Abstände in Mehrsternsystemen korrigiert: Toliman/Rigil Centaurus und andere Sternpaare lagen viel zu weit auseinander, da ihre Abstände fälschlich als AU-Werte interpretiert wurden
- Farbdarstellung aller Objekte korrigiert: weitere fehlerhafte Farbwerte (Eisriesen in mehreren Systemen) behoben
- Ladebildschirm-Fehler behoben: Ladebalken bewegte sich nicht und der Startbildschirm verschwand nicht, nachdem Sternsystem-Daten in externe JSON-Dateien ausgelagert wurden
- Sternsystem-Daten, Kategorien und Sprachdateien in externe JSON-Dateien ausgelagert (data/starsystems.json, data/categories.json, data/languages.json) – HTML deutlich kleiner, Daten separat pflegbar
- Loader mit Fehleranzeige eingebaut falls Dateien nicht gefunden werden
- Version im Dokumenttitel dynamisch; iMessage URL image
- Texturen hinzugefügt für einige Jupiter- und Saturnmonde, sowie für viele Exoplaneten
- Alle hardcodierten deutschen/englischen Strings im UI-Code in das i18n-System überführt (Größenvergleich-Spalten, Objektkategorien, Rotations- und Umlaufzeitwerte, Atmosphäre, Heimsystem u.v.m.)
- Neue i18n-Keys: planet.terrestrial, val.locked, val.retro, val.unknown_bare, val.home_system, val.none, cmp.title, cmp.dist_planet, cmp.stefan_boltzmann, cmp.col.* (alle Tabellenspalten)
- Deutsche Code-Kommentare ins Englische übersetzt
- Größenvergleich: System-Zugehörigkeit wird jetzt beim Auswählen des Objekts gespeichert – Vergleiche zwischen Objekten aus verschiedenen Systemen (z.B. Jupiter + Proxima Centauri b) zeigen jetzt korrekt den Abstand zwischen den Zentralsternen in Lichtjahren
- Größenvergleich: Nachbarstars können jetzt als Vergleichsobjekt ausgewählt werden (vorher wurde ein Klick darauf ignoriert und stattdessen das System gewechselt)
- Größenvergleich: Stern↔Stern Distanz nutzt jetzt die echten 3D-Koordinaten (RA/Dek/Distanz) – Sol↔Toliman, Proxima↔Toliman etc. zeigen korrekte Lichtjahre
- Größenvergleich: Objekt in fremdem System zeigt jetzt korrekt den Abstand zwischen den Zentralsternen an
- Größenvergleich: Distanzberechnung komplett neu – Mond↔eigener Planet (km via OrbitAU), Mond↔Mond gleicher Planet (km via Orbitwinkel), Mond↔Mond verschiedene Planeten (Vektorberechnung), Mond↔Planet/Stern (Vektoraddition), verschiedene Systeme (Lichtjahre zwischen Zentralsternen)
- Infopanel 1: Monde zeigen jetzt die Distanz zum Planeten in km an
- Infopanel 2: Sterne zeigen jetzt die Leuchtkraft als Tag unterhalb der Farbe an, mit eigener Führungslinie zum selben Mittelpunkt der Sternkugel
- 3D-Kugeln: Polygonanzahl für Monde, Zwergplaneten, Asteroiden und Begleiter deutlich erhöht – weniger sichtbare Kanten beim Ranzoomen
- Größenvergleich: Gewähltes Objekt im Info-Panel wird gelb hervorgehoben (Spaltenname und Werte); beim Umschalten bleibt die Panel-Position erhalten
- Größenvergleich: Sternradius wird jetzt über Stefan-Boltzmann aus Leuchtkraft und Oberflächentemperatur berechnet (gekennzeichnet mit *)
- Größenvergleich: Temperatur zeigt bei Sternen die Oberflächentemperatur in Kelvin
- Größenvergleich: Zeile „Distanz" zeigt bei Sternen Entfernung zu Sol, bei Planeten Abstand zum Zentralstern
- Größenvergleich: Zeile „Satelliten" zeigt bei Sternen Planetenanzahl, bei Planeten Mondanzahl
- Größenvergleich: Info-Panel zeigt jetzt beide Objekte nebeneinander in einer übersichtlichen Tabelle; fehlende Werte werden als „–" angezeigt
- Größenvergleich: Info-Panel ist jetzt per Drag & Drop frei verschiebbar und hat ein X zum Schließen
- Größenvergleich: Kamerafokus auf Objekt funktioniert jetzt korrekt – Look-At-Punkt bewegt sich sanft zum Objekt, Initialisierungsfehler behoben
- Größenvergleich: Distanzlinie/Label hinkt nicht mehr nach
- Größenvergleich: Distanzberechnung nochmals überarbeitet (Mond↔Mond, Mond↔fremdes Objekt, Stern↔Stern)
- Größenvergleich: Klick auf Objekt-Panel funktioniert korrekt; Kamerafokus mit sanftem Lerp
- Größenvergleich: Distanzberechnung und Anzeige vollständig überarbeitet
- Größenvergleich: Objekte sind anklickbar – Kamera zoomt auf das jeweilige Objekt
- Größenvergleich: Distanzberechnung komplett überarbeitet – basiert jetzt ausschließlich auf echten astronomischen Daten (AU-Orbitradien, Lichtjahre aus RA/Deklination), keine Szenen-Koordinaten mehr; Stern↔Planet zeigt Orbitradius, Planet↔Planet nutzt Kosinussatz mit aktueller Winkelposition, Mond↔Elternkörper zeigt echten Orbitabstand, Systeme→ Lichtjahre
- Alle Mondorbits mit echtem AU-Wert ergänzt (Rohdaten)
- Größenvergleich: Name und Radius jetzt in einem gemeinsamen Panel pro Objekt (gerundetes Rechteck, Name groß, Radius klein darunter)
- Größenvergleich: Distanzanzeige zeigt jetzt den realen astronomischen Abstand – bei Objekten im gleichen System deren aktuelle Orbitdistanz in AU, bei Objekten aus verschiedenen Systemen den Sternabstand in Lichtjahren
- Größenvergleich: Name/Radius-Labels jetzt als gerundetes Panel (wie Steuerungsleiste) – Darstellung war trotz vorangegangener Ankündigung noch nicht umgesetzt
- Größenvergleich: Max-Zoom begrenzt, Kamera kann nicht mehr hinter den Sternenhintergrund zoomen
- Größenvergleich: Distanzanzeige korrigiert – zeigt nun den tatsächlichen Abstand zwischen den Objektmittelpunkten (statt Summe der Radien)
- Größenvergleich: Führungslinie 2 wird beim Betreten und Verlassen dieser Ansicht korrekt ausgeblendet
- Version und Versionhistory korrigiert
- Größenvergleich: Radius-Labels fehlerhafte Anzeigeposition behoben
- Größenvergleich: Name/Radius-Labels jetzt als gerundetes Panel (wie Steuerungsleiste)
- Größenvergleich: Sternenhintergrund in der Vergleichsszene
- Größenvergleich: Gestrichelte grüne Linie zwischen den Objekten mit Distanz-Label (in AU oder Lj)
- Bugfix: Führungslinie 2 blieb beim Wechsel in den Vergleichsmodus sichtbar
- Größenvergleich: Objekte werden jetzt exakt auf 1/4 und 3/4 der Bildschirmbreite positioniert; Kamera zoomt automatisch weit genug heraus damit beide Objekte sichtbar sind
- Größenvergleich: Objekte werden jetzt mit Texturen, Atmosphäre/Wolken und Sternleuchten dargestellt wie im normalen Modus
- Neues Feature: Größenvergleich zweier Objekte – Button in Sektion 2, schrittweise Auswahl von zwei Objekten, eigene Vergleichsszene mit realistischem Größenverhältnis, Kamerasteuerung und Zurück-Button
- Nachbarsterne (andere Systeme im Hintergrund) sind jetzt direkt anklickbar: fehlender Raycaster-Check ergänzt und Klickzone im linearen Modus korrigiert (war dort viel zu klein)
- Redundante deutsche Tooltip-Texte (title-Attribute) entfernt – werden ohnehin vom Sprachsystem gesetzt
- Kamerasensitivität angepasst: Roll deutlich reduziert, Rotation und Zoom leicht reduziert
- Loading Screen Titel Formattierung korrigiert
- Proxima Centauri Startposition verbessert
- Infopanel2 Anzeigefehler behoben
- Alpha Centauri-System: Orbit von Proxima Centauri deutlich elliptischer und größer dargestellt (Halbachse 300→700, Exzentrizität 0.60→0.85), sodass die Planetenbahnen klar innerhalb der Sternbahn liegen
- Code-Aufräumung: doppelte CSS-Regel (#systemLabel), doppelte HTML-ID (loading-info), unbenutzte CSS-Klasse (.sep), tote Variablen (_origLoadOverview, _origOnTexDone, _deepLinkDone, labels, totalSvgH), redundante Felder (nDots_mob) und leerer Kommentar entfernt
- Screenshot-Funktion und -Button entfernt
- Screenshot-Funktion komplett überarbeitet: Infopanels werden nun pixel-genau 1:1 wie auf dem Bildschirm dargestellt (via html2canvas), keine Darstellungsfehler mehr bei Labels, Farben oder Transparenzen
- Screenshot-Bugfix: Infopanel 2 (Atmosphärenzusammensetzung und Spektralklassendarstellung) wird nun korrekt im Screenshot abgebildet
- Cursor for Kamera kippen verbessert
- Code Kommentare und Sektionennummerierung korrigiert
- Screenshot-Button (Kamera-Symbol) in Sektion 2: pausiert die Simulation, blendet das Steuerungspanel aus, wechselt in den Vollbildmodus und speichert einen Screenshot – danach wird alles auf den vorherigen Zustand zurückgestellt
- Tooltips für alle Buttons im Steuerungspanel ergänzt (DE/EN): System-Navigation, Zoom, Pause, Auto-Fokus, Geschwindigkeit, Mondgeschwindigkeit, log/lin-Schalter
- Positionen aller Objekte auf ihren Orbits werden beim ersten Betreten eines Systems einmalig zufällig gesetzt und danach gespeichert – beim Zurückkehren oder beim Umschalten zwischen log/lin stehen alle Objekte wieder genau dort, wo sie zuletzt waren
- Änderungen diverser Versionen zusammengeführt
- Zoom-Konvertierungsfaktor beim log/lin-Umschalten ist jetzt systemspezifisch: beim Laden eines Systems wird der Faktor aus dem weitesten Planeten berechnet (Verhältnis lin/log bei dieser AU-Distanz)
- Systeme ohne Planeten über 1 AU (z.B. Barnard) behalten den Zoom unverändert beim Umschalten
- Zoom-Konvertierung vereinfacht (proportionales Verhältnis ×27); Nachbarsterne im lin-Modus sichtbar; Proxima c wiederhergestellt; Orbit-Highlights nach Toggle wiederhergestellt
- Focus und Infopanels bleiben beim Umschalten erhalten; hardcodierte Pixelabstände durch AU()-Aufrufe ersetzt; Focus-Zoom-Maximum dynamisch; Sternen-Hintergrund vergrößert
- Zoom proportional konvertiert; Zoom-Max 42×; visDist-Floor reduziert; Sirius B / Proxima orbit-Skalierung korrigiert
- log/lin-Button an Sektion 1b; Zoom-Chaos behoben; Mindestabstand für enge Planeten; Focus-Max erhöht
- Hardcodierte visuelle Positionen beim Umschalten nicht mehr verzerrt; Datenfehler Proxima c behoben
- Neuer Toggle-Button "log/lin": schaltet alle Distanzen zwischen logarithmischer (Standard) und linearer Darstellung um
- Kamera-Rollen in Randbereichen; Halbkreis-Cursor; auf Mobile deaktiviert
- Zoom-Inertia für Mausrad, Pinch und Buttons (alle Modi)
- Kamera-Rotation in Systemübersicht repariert; Deeplink-Distanzlinien korrekt
- Korrekturen zu lokalisierten Texten
- Korrekturen zur angezeigten Versionsnummer im Ladebildschirm
- Mehrsprachigkeit eingeführt (Deutsch / Englisch): alle UI-Texte, Button-Tooltips, Info-Panel-Labels, Einheiten und Sternklassen übersetzt
- Sprachschalter (DE/EN) im HUD oben rechts neben dem Systemtitel; Einstellung wird gespeichert
- Zahlenformatierung (Komma vs. Punkt) passt sich automatisch der gewählten Sprache an
- Ladebildschirm: auf kleinen Screens (unter 600px) automatisch verkleinert – Schrift, Logo und Breite passen sich an
- Mobile: Texturen werden aus
images/lowres/ geladen wenn vorhanden, danach normaler Fallback – verhindert Abstürze durch zu großen Speicherbedarf auf Mobilgeräten
- Kamera-Inertia: vertikaler Grenzwert von 85.9° auf 74.5° reduziert (kein Gimbal-Lock mehr), Velocity wird beim Erreichen der Grenze sofort gestoppt statt aufzustauen
- URL-Deeplink: Distanzlinien zu Nachbarsystemen werden beim automatischen Zoom jetzt angezeigt (wie bei Hover)
- Kamera-Inertia: Blickwinkeländerungen laufen jetzt sanft aus statt abrupt zu stoppen (Dämpfungsfaktor 0.82)
- Ladebildschirm neu gestaltet: Titel „AstroViewer" mit Farbverlauf und Glüheffekt, Untertitel „3D Star System Explorer", Logo-Bild (images/logo.png, nur wenn vorhanden), Versionsnummer und blauer Fortschrittsbalken
- Schatten-Toggle grundlegend überarbeitet: kein Flutlicht mehr in der Szene – stattdessen wird die Mindesthelligkeit direkt im Shader jedes Objekts angehoben. Objekte auf der Vorderseite des Sterns werden nicht mehr doppelt beleuchtet
- Schatten-Toggle neu implementiert: bestehende Beleuchtung bleibt unverändert, zusätzliche Flutlichter aus allen Richtungen werden zugeschaltet – Rückseite der Objekte wird aufgehellt ohne die Vorderseite zu überstrahlen
- „Zurück zur Übersicht"-Schalter: alle inline-Styles entfernt, Pfeil als SVG – Button ist jetzt identisch groß wie alle anderen
- Schatten-Toggle erneut korrigiert: Sternlichter (PointLights) und Füll-Licht werden auf 0 gesetzt, Ambient-Licht auf Vorderseiten-Niveau angehoben – keine weißen/leuchtenden Objekte mehr
- „Zurück zur Übersicht"-Schalter: einheitliche Größe durch globale Button-CSS-Korrektur (padding entfernt, height fix 32px)
- Schatten-Toggle erneut überarbeitet: alle Lichtquellen (Sternlicht, Füll-Licht) werden deaktiviert und Planeten-Emissive angehoben – Schattenseite erscheint jetzt gleich hell wie die Vorderseite ohne Überbelichtung
- Neuer Vollbild-Schalter neben dem Pause-Button (Symbol: diagonale Pfeile); wechselt das Symbol beim Aktivieren auf Verkleinern-Pfeile
- „Zurück zur Übersicht"-Schalter jetzt gleich groß wie alle anderen, Pfeil vertikal zentriert
- Symbol vor dem Pause-Schalter korrigiert (drei Schieberegler wiederhergestellt)
- Schatten-Toggle überarbeitet: Schattenseite wird auf Vorderseiten-Helligkeit angehoben, kein Überleuchten mehr
- Distanzlabel der Nachbarsterne wird beim Zoom in ein Nachbarsystem nun korrekt ausgeblendet
- Steuerungspanel: neue Sektion mit Pause-Schalter und neuem Schatten-Schalter (blendet die Schattenseite von Planeten aus – beide Seiten gleich hell)
- Auto-Focus Schalter nun unter dem Zoom-Minus, mit passendem Fadenkreuz-Symbol
- „Zurück zur Übersicht"-Schalter hat jetzt die gleiche Größe wie alle anderen Schalter, Pfeil vertikal zentriert
- Haumea: Monde Hi'iaka (160 km, 49.5 Tage) und Namaka (85 km, 18.3 Tage) hinzugefügt
- Makemake: Mond MK2 (87 km, 12.4 Tage) hinzugefügt
- Steuerungspanel hat jetzt Priorität über Nachbarstern-Labels – Schalter immer klickbar
- Entfernungslabel der Nachbarsterne wird beim Smooth Zoom ausgeblendet
- Wolken/Atmosphäre: Opazität erhöht – Wolkenmuster nun deutlich sichtbar (terrestrische Planeten 0.32→0.65, Gas-/Eisriesen 0.32→0.55)
- Basisgeschwindigkeit halbiert – 1× ist jetzt halb so schnell wie zuvor
- URL Deep Links: Pfad
/sol-system startet automatisch mit Zoom auf das Sonnensystem; /sol-system/titan zoomt zusätzlich direkt auf das Objekt – nur beim ersten Aufruf, danach alles wie gewohnt
- Unterstützt alle System-Keys (z.B.
alpha-centauri-system) und Objekt-Keys (z.B. titan, pluto, moon)
- Nachbarsterne: SKY_R auf 5000 reduziert – Zoom endet jetzt mit gleicher scheinbarer Sterngrösse wie in der Systemübersicht
- Namenslabel 2px höher positioniert
- Nachbarsterne: WebGL-Canvas z-index fix – Labels und Sterne-Dots jetzt klickbar (lagen vorher unter dem Canvas)
- Zoom-Effekt: Identische Logik wie Systemübersicht – sauberer Anflug, kein aufblitzender Stern
- Label-Abstände: Namenslabel näher am Stern, Distanzlabel etwas tiefer
- Nachbarsterne: Canvas und Labels jetzt korrekt klickbar (pointer-events Fix im #labels Container)
- Smooth Zoom: Echter Stern-Mesh mit Textur und Glow wird beim Klick an der Himmelsposition eingeblendet und dann genauso angezoomt wie andere Sterne
- Label-Abstände feinjustiert
- Nachbarsterne: Canvas-Größe auf 120×120px erhöht, transparenter Hintergrund, korrekter radialer Farbverlauf
- Smooth Zoom: Kein Quadrat mehr, Stern wächst sauber während Anflug, Label und Distanz bleiben sichtbar
- Label etwas höher, Distanz etwas tiefer positioniert
- Nachbarsterne: Umstellung auf DOM-Canvas-Element statt Three.js Sprite – kein Versatz, kein Quadrat, immer sichtbar am richtigen Ort
- Stern wächst beim Anflug organisch von klein (5px) auf groß (60px Glühen)
- Label und Distanz exakt über dem Stern positioniert
- Nachbarsterne: Umstellung von Points auf Sprite – frustumCulled deaktiviert, Sterne jetzt immer sichtbar am Himmel
- Smooth Zoom: Stern wächst über Sprite-Skalierung organisch auf volle Größe an
- Nachbarsterne: depthTest deaktiviert – Sterne jetzt immer sichtbar vor dem Hintergrundhimmel
- Smooth Zoom: Ziel-Stern wächst während des Anflugs von klein auf volle Anzeigegröße an
- Nachbarsterne: Sterne jetzt als sichtbare Pixel-Sprites (sizeAttenuation off) – immer mehrere Pixel groß, unabhängig von der Distanz
- Nachbarsterne: Klick auf Name- oder Entfernungs-Label löst ebenfalls den Smooth-Zoom/Systemwechsel aus
- Nachbarsterne: In jedem System werden die 3 nächsten Sterne/Systeme als kleine Sterne im Hintergrundhimmel angezeigt – mit Systemname und Entfernung in Lichtjahren
- Position der Nachbarsterne am Himmel wird aus echten RA/Dec-Koordinaten relativ zum aktuellen System berechnet
- Klick auf einen Nachbarstern löst einen Smooth-Zoom-Übergang aus und wechselt direkt in das entsprechende System
- Nachbarsterne werden beim Systemwechsel aktualisiert und korrekt aus der Szene entfernt
- Ring-Typ "sparse": zeigt jetzt fix 6 Ringe (statt 3) mit hoher Varianz in Breite und Helligkeit
- Neuer Ring-Typ "basic": einfacher, gleichmäßiger Ring mit weichen Rändern – für Objekte mit schmalen Einzelringen
- Haumea: Ring-Typ von "sparse" auf neues "basic" umgestellt – wird jetzt korrekt angezeigt
- Haumea: Ring hinzugefügt (2017 entdeckt, sehr schmal, Typ "sparse")
- Ring-Typ "sparse": Bänder jetzt unregelmäßig – zufällig platziert, unterschiedliche Breiten (0.015–0.085) und Helligkeit; 4–7 Bänder pro Ring
- Planetenringe: Ringtyp als Datenfeld (type:"saturn" / type:"sparse" / default) statt hardgecodeter Objektnamen-Ausnahmen
- Typ "sparse" (Uranus, Neptun): schmale helle Bänder mit breiten dunklen Lücken und deutlich höherer Opazität – Varianz nun sichtbar
- Opazität von Uranus- und Neptunringen erhöht damit die prozeduralen Strukturen sichtbar sind
- Planetenringe: prozedural generierte Canvas-Textur statt Flatfarbe – radiale Bänder, Helligkeitsvariationen, feines Rauschen
- Saturn: spezifische Ringstruktur mit C-Ring (innen, dunkel), B-Ring (hell, dicht), Cassini-Division (Lücke), A-Ring mit Encke-Bereich
- Uranus/Neptun: subtile Ringe mit niedrigerer Deckkraft
- Bugfix: Führungslinie von Infopanel 2 auf Mobile/Touch zeigte auf falsche Position wenn Panel gedraggt wurde – JS-Skalierungserkennung nutzt jetzt exakt dieselbe Bedingung wie die CSS Media Query (max-width:500px / pointer:coarse) statt eines abweichenden Breitenvergleichs
- URLs auf relative Pfade umgestellt: Textur-Basis-URL (/images/) und Versionhistory-Link (versionhistory.html) – vorbereitet für Deployment auf astroviewer.pages.dev
- Panel-Toggle: Restore-Button Ausrichtung korrigiert
- Neuer Toggle-Button im Panel (Sektion 3, Row 1): blendet das gesamte Steuerungspanel aus. Symbol: abgerundetes Rechteck mit 3 Punkten (Panel-Icon)
- Wenn Panel ausgeblendet: kleiner Restore-Button erscheint im HUD neben dem Systemnamen mit gleichem Symbol – bei Klick/Touch wird Panel wieder eingeblendet
- Infopanel 1+2: Schließen-Button ✕ jetzt dauerhaft sichtbar (überlebt innerHTML-Updates)
- Infopanel 1+2: Position-Gedächtnis korrigiert – Panel bleibt nach Drag an seiner Position auch beim Wechsel zu anderen Objekten
- Infopanel 2: skaliert jetzt auch bei schmalem PC-Fenster (<600px) auf 75%, nicht nur auf Mobile-Geräten
- Infopanel 2: gleiche transparente Mobile-Optik wie Infopanel 1 (via media query)
- Infopanel 1+2: per Drag frei verschiebbar (Mouse + Touch); Drag fängt Events ab bevor die Szene sie verarbeitet
- Infopanel 1+2: Schließen-Button (✕) rechts oben
- Infopanel 1+2: Führungslinie zeigt auf nächste Panel-Kante zum Objekt
- Infopanel 1+2: Position wird pro Panel gespeichert; erste Anzeige eines neuen Objekts berechnet Position automatisch, danach bleibt die zuletzt gezogene Position
- Infopanel 2: auf Mobile 25% kleiner via scale(0.75) – skaliert auch SVG-Grafiken
- Infopanel 2: Leader-Linie zeigt jetzt auf die dem Objekt nächste Panel-Ecke statt immer oben-rechts
- Sektion 0: Reihenfolge invertiert – Systemnavigation oben, Zurück-Button unten; Pfeil etwas größer
- Sektion 3: Auge-Symbol mit Wimpern (4 kurze Linien am oberen Bogen) in beiden Rows
- Neuer Toggle-Button "abc" in Sektion 3: blendet alle Name-Labels aus (Sterne, Planeten, Monde, Zwerge, Asteroiden, Zonen) sowie Tooltip und Focus-Label – für textfreie 3D-Renders
- Sektion 3: HZ-Toggle-Button hinzugefügt – blendet Habitable Zone (Ring + Label) ein/aus, Einstellung bleibt beim Systemwechsel erhalten
- Orbit-Toggle-Symbol: äußere Ellipse diagonal und größer
- Neue Sektion 3 im Control Panel: Auge-Symbol + Orbit-Toggle-Button (3 gekurvte Linien). Bei Deaktivierung werden alle Orbitlinien ausgeblendet
- Control Panel umorganisiert: Sektion 0 (nur im System sichtbar) enthält jetzt Übersicht-Button + System-Navigation; Sektion 1 enthält Zoom + Pause/Autofokus; Sektion 2 unverändert
- Alle Buttons auf einheitliche Größe 32×32px normiert
- Carousel Control Panel: vollständig überarbeitet und stabilisiert. Korrekte Breitenberechnung via window.innerWidth; alle Sektionen werden angezeigt wenn Platz vorhanden; Navigation als Sliding Window (Rechts: nächste Sektion + rückwärts auffüllen; Links: vorherige Sektion + vorwärts auffüllen)
- Mobile: Pfeil-Buttons reagieren jetzt korrekt auf Touch (touchend + preventDefault, touch-action:manipulation, -webkit-user-select:none)
- Carousel: Navigation korrigiert – Rechts/Links navigiert jetzt als echtes Sliding Window; die neue Zielsektion wird immer angezeigt plus so viele daneben wie Platz haben (unabhängig von Sektionsbreiten)
- Control-Panel als Carousel redesigned: auf kleinen Bildschirmen werden nur so viele Sektionen angezeigt wie Platz haben, Pfeil-Buttons (‹ ›) links/rechts zeigen an dass weitere Sektionen vorhanden sind
- Touch-Swipe zum Wechseln zwischen Sektionen unterstützt
- Auf großen Bildschirmen werden alle Sektionen gleichzeitig angezeigt wie bisher
- Bugfix: Wolken-Mesh hatte depthTest:false und renderOrder:999 – dadurch wurden Wolken durch andere Objekte hindurch gerendert (Geister-Effekt). Beides entfernt; da die Wolkenschicht etwas größer als der Planet ist (r×1.06) rendert sie korrekt vor dem Planeten ohne den Z-Buffer zu ignorieren
- Infopanel 2 für Sterne: neues Layout mit Titel "Spektral- und Leuchtkraftklasse", Leuchtkraftklasse links, Spektralklasse als Tag auf der Sternkugel, Farbe als Tag rechts mit gestrichelter grüner Verbindungslinie
- Infopanel 1 für Sterne: Leuchtkraftklasse, Spektralklasse und Farbe entfernt (jetzt ausschließlich in Panel 2)
- Sterne zeigen jetzt auch Infopanel 2 mit Oberflächentemperatur in K und einem farbigen Stern-Glow-Swatch in der Spektralfarbe des Sterns
- Oberflächentemperatur aus Infopanel 1 der Sterne entfernt (jetzt ausschließlich in Panel 2)
- Toten Code entfernt: normaliseOrbit() (war triviale Einzeiler-Wrapper), Legacy-Barycentre-Marker-Block (alle Systeme haben jetzt explizite Barycentren), parentStar-Fallback in planetParent()
- subcat-Werte vereinheitlicht: alle 25 Kurzformen ('t','g','i','gasgiant','terrestrial') durch exakte CAT-Keys ersetzt ('terrestrial', 'gasgiant', 'icegiant'); Alias-Logik aus Engine entfernt
- Internes Feld parentStar auf parentKey umbenannt (Zonenobjekte, HZ-Zonen, Planet-Update-Loop) – konsistent mit orbit.parent
- parentStar auf orbit.parent vereinheitlicht: alle 29 Planeten-Einträge nutzen jetzt orbit:{parent:'key'} statt parentStar:'key'
- Neue Hilfsfunktion planetParent(pd) liest orbit.parent oder legacy parentStar – vollständige Rückwärtskompatibilität
- Info-Panel: Sternname fällt bei Einzelsternsystemen korrekt auf den ersten echten Stern zurück (nicht mehr stars[0] der ein Barizentrum sein könnte)
- Datenmigration: alle 9 Mehrsternsysteme auf neue orbit{}-Hierarchie umgestellt (Alpha Centauri, Luhman 16, Sirius, Luyten 726-8, EZ Aquarii, 61 Cygni, Prokyon, Gliese 725, Groombridge 34)
- EZ Aquarii: erstmals physikalisch korrekt mit zwei expliziten Barycentren (ez-aquarii-bary-abc, ez-aquarii-bary-ac) – A+C umkreisen ihren gemeinsamen Schwerpunkt, dieser umkreist mit B den Gesamtschwerpunkt
- Epsilon Indi: Ba und Bb sind jetzt echte Sterne (T1/T6 Braune Zwerge) mit korrekter hierarchischer Darstellung – Schwerpunkt Ba/Bb (epsilon-indi-bary-babb) kreist um A, Ba und Bb kreisen umeinander
- Alle Barycentren haben konsistente Schlüssel: system-bary-komponenten (z.B. epsilon-indi-bary-babb)
- Engine-Redesign: neue orbit{}-Eigenschaft für Sterne mit parent, r, period, phase, inc, lan, ecc – ersetzt bary{}/baryElliptic{}
- Vollständige Parent-Hierarchie: jedes Sternobjekt kennt sein Elternobjekt und wird relativ dazu positioniert
- Neuer Objekttyp type:'barycenter' in stars[]: Schwerpunkte sind echte Objekte mit eigener Umlaufbahn und eigenem Schlüssel (z.B. epsilon-indi-bary-babb)
- Bugfix: jeder Stern hat jetzt seinen eigenen Winkel (_angle) statt eines systemweit geteilten _baryAngle – unterschiedliche Perioden im selben System werden korrekt berechnet
- Topologische Sortierung stellt sicher, dass Elternobjekte immer vor Kindern positioniert werden
- Vollständige Rückwärtskompatibilität: bestehende bary{}/baryElliptic{}-Daten werden automatisch auf orbit{} umgewandelt
- Epsilon Indi Ba/Bb: Implementierung vereinfacht und korrigiert – Ba und Bb werden jetzt wie Pluto/Charon als Dwarfs mit bary-Mechanik modelliert (kein neues Engine-Feature nötig)
- bary2-Feature wieder entfernt (war unnötig und verursachte liegenbleibende Orbitlinien beim Systemwechsel)
- Ba und Bb zeigen jetzt korrekt ihren gemeinsamen Schwerpunkt, der als Ganzes um Epsilon Indi A kreist
- Epsilon Indi Ba/Bb: hierarchischer Doppelkreisel korrekt implementiert – Ba und Bb umkreisen ihren gemeinsamen Schwerpunkt (2.1 AU, 11 Jahre), der wiederum um Epsilon Indi A kreist (1460 AU, ~460.000 Jahre)
- Neue Engine-Funktion: bary2-Eigenschaft für Sterne ermöglicht hierarchische Mehrkörpersysteme (innere Umlaufbahn zusätzlich zur äußeren); innere Orbitlinie folgt dem äußeren Schwerpunkt
- 4 neue Sternensysteme hinzugefügt: DX Cancri (#21), Epsilon Indi (#22+23), Tau Ceti (#24) und GJ 1061 (#25)
- Epsilon Indi: K-Stern mit direkt abgebildetem Super-Jupiter (JWST 2024, kältester bekannter Exoplanet) und Braunem Zwerg-Paar (Ba/Bb) in 1460 AU Abstand
- Tau Ceti: Sonnenähnlicher G-Stern mit 4 Super-Erden (darunter 2 in/nahe der habitablen Zone) sowie massiver Trümmerscheibe (10–90 AU)
- GJ 1061: Ruhiger Roter Zwerg mit 3 felsigen Super-Erden, 2 davon in der habitablen Zone
- Wolken rotieren mit Planet (cloudMesh per applyRotation); Beleuchtung der Wolken (lightDir Uniform, Nachtseite dunkel); vWorldNormal für korrekte Lichtberechnung
- Gasriesen-Wolken: drift=t*6 auf alle fbm-Samples; Threshold 0.38–0.60 (mehr Bedeckung)
- Gasriesen: sparse fbm-Flecken statt durchgehender Bänder (threshold 0.52–0.70); terrestrische Wolken: schnellerer Drift (t*8)
- Gasriesen: horizontale Bänder mit Turbulenz statt Wolkenflecken; terrestrische Wolken: einheitliche Driftrichtung (sichtbare Bewegung); Farbe stärker getönt
- Wolken: triplanare Projektion (keine Naht mehr), Bedeckung reduziert (smoothstep 0.42–0.62, opacity 0.35), Atmosphärenfarbe eingemischt
- Wolken: renderOrder:999 + depthTest:false explizit auf Material gesetzt; Schwellwert weiter gesenkt, Opacity erhöht
- Cloud-Shader: vLocalPos statt vWorldPos (zuverlässiger in Child-Mesh-Hierarchie), Opacity 0.70
- Atmosphäre zwei Passes: BackSide-Kugel für Limb-Glow + separate FrontSide-Kugel mit depthTest:false für Wolken sichtbar über Planetoberfläche
- Atmosphären-Shader: side:BackSide statt FrontSide — Innenseite der Kugel rendert um den Planeten herum statt davor; Normalen-Fix für korrekte Rim-Berechnung
- Wolken-Shader: Schwellwert von 0.45 auf 0.32 gesenkt (deckt ~40% der Oberfläche), Kontrast erhöht
- Wolken auf Atmosphärenkugeln: prozedurales fBm-Noise im Fragment-Shader (3 Oktaven, smoothstep); langsame Rotation über time-Uniform; kein CPU-Overhead
- Atmosphärenkugeln: Custom GLSL Shader mit Limb-Glow-Effekt — Zentrum transparent, Rand leuchtend (pow(rim, 2.8) * 0.55)
- Atmosphärenkugel: Radius r+20 → r*1.12 (12% größer als Objekt statt absoluter Offset)
- Bugfix: lel in Asteroiden- und Zwergplaneten-Builder wiederhergestellt; vollständiges Audit — Syntax OK, alle Variablen deklariert
- Bugfix: mHit in buildMoon wiederhergestellt; vollständiges Audit aller Deklarationen — keine weiteren fehlenden Variablen
- Bugfix: let ring = null ebenfalls wiederhergestellt
- Bugfix V3.14: hitMesh-Deklarationen für Planeten, Asteroiden und Zwerge versehentlich entfernt → wiederhergestellt
- 3D-Atmosphärenkugel für Objekte mit echter Atmosphäre (pressure > 1e-10 bar): transparente Kugel +20px Radius, Farbe = dominantes Gas, opacity 0.13; Planeten, Monde, Zwerge, Asteroiden
- Exoplaneten ohne Atmosphäredaten: Titel "Atmosphäre unbekannt", Bogen wie Exosphäre, Druckzeiger zeigt "??? bar"
- Atmosphärendaten für Zwergplaneten: Pluto (1×10⁻⁵ bar, N₂ 99.5%, CH₄ 0.5% – New Horizons 2015); Ceres/Haumea/Makemake/Eris: Exosphäre; Asteroiden Vesta/Pallas/Hygiea: Exosphäre
- Erdmond: atmosphere korrekt eingefügt (Python-Script hatte es fälschlich in CAT-Definition geschrieben); CAT-Korruption bereinigt
- Bugfix: hasComp vor erster Verwendung deklariert (TDZ-Fehler)
- Titel "Exosphäre" statt "Atmosphäre" wenn keine Zusammensetzung erfasst; Atmosphärendaten für alle 21 Monde (Titan, Triton, Io, Europa, Ganymede, Callisto, Rhea, Dione, Titania mit Zusammensetzung; Rest als Exosphäre)
- "bar" Formatierung zurückgesetzt; Pfeilkopf breiter (40px) und flacher (14px); Labels nach allen Bogensegmenten gerendert (kein Verdecken mehr)
- Drucklabel 3px nach oben; "bar" kleiner (9px) neben der Zahl (12.5px)
- Zeiger 4px kürzer; Label tiefer im Schaft; Merkur-Druck "≈ 0 bar" statt unleserlichem Exponentialwert
- Zeiger/Wellenlinien: untere Kante auf Bogenkante ausgerichtet (cy); Zeiger nochmals breiter (34px Kopf, 18px Schaft)
- Druckzeiger und Wellenlinien in der freien Fläche des Halbkreises; Zeiger größer (44px), Label im oberen Schaftdrittel; Wellenlinien mit Quadratic Bezier (kein Bug am rechten Ende)
- Druckanzeige im Atmosphären-Panel: Pfeil nach unten mit Druckwert-Label für feste Planeten; Wellenlinien für Gasriesen (kein Oberflächendruck)
- Labels größer (12.5px); mehr Abstand zwischen Titel "Atmosphäre" und Bogenkante
- Doppelter "Atmosphäre"-Titel entfernt; Labels größer (10.5px); Gase alphabetisch sortiert; überlappende Labels radial versetzt
- Atmosphären-Labels auf dem Segment platziert (mid-ring), Pill-Style (dunkler Hintergrund, weißer Text) wie Sternlabels; Titel "Atmosphäre" über dem Bogen; alle Labels immer sichtbar
- Panel2 auf 320px verbreitert; SVG-Höhe mit Puffer für Labels über dem Bogen; Bogen-Geometrie mit korrekten Sweep-Flags
- Atmosphärendiagramm: Sweep-Flags korrigiert (äußerer Bogen sweep=1, innerer sweep=0) → korrekte ∩-Form
- Atmosphärendiagramm: Geometrie korrigiert (∩-Form, Bogen nach oben), Labels außerhalb des Rings in schwarz, korrekte Segmentverteilung
- Infopanel2: Atmosphären-Halbkreis-Diagramm mit farbigen Segmenten je Komponente; Ringdicke proportional zum Atmosphärendruck (logarithmisch); Labels auf Segmenten
- ATMO_COLORS Farbpalette für alle Komponenten (N₂, O₂, CO₂, Ar, H₂, He, CH₄ etc.)
- Atmosphärendaten für alle 8 Planeten: atmosphere.pressure (bar, NASA) und atmosphere.composition (Gase ≥1%, Quelle: NASA NSSDC)
- Merkur: 5×10⁻¹⁵ bar (quasi keine Atmosphäre); Gasriesen: pressure null (kein fester Boden)
- Konsolidierung: moons:[] bei 4 Exoplaneten ergänzt; Feldanordnung bei Gliese 725 und Groombridge 34 Planeten vereinheitlicht; vollständiger Integritäts-Check bestanden
- Temperaturpanel Exoplaneten: Gleichgewichtstemperatur (Teq, A=0.3) zentral groß, berechnete Min/Max-Werte seitlich kleiner; tempEq für alle 21 Exoplaneten eingetragen
- Kelvin/Celsius-Check: alle Werte korrekt; Lacaille 9352 e korrigiert (falsche Leuchtkraft in Berechnung → Tagseite war +14°C statt +300°C)
- Dysnomia: tempMin/tempMax ergänzt; alle Exoplaneten-Temperaturen auf Basis der Gleichgewichtstemperatur (Teq) aus ESPRESSO/NASA-Papers korrigiert
- Gebundene Planeten: Min = Nachtseite (~−230°C), Max = Tagseite (Teq×1.2)
- Temperaturpanel: gestrichelte Verbindungslinie ergänzt; fehlende tempMin/tempMax für Mond, Deimos, Callisto, Tethys, Ariel, Nereid nachgetragen
- Temperaturpanel (#astro-info2) für alle Nicht-Stern-Objekte: zeigt Min/Max °C links unter dem Objekt
- Temperaturdaten (tempMin/tempMax) für alle 52 Objekte eingetragen – Planeten, Monde, Zwerge, Asteroiden, Exoplaneten
- Oberflächentemperatur (K) für alle 30 Sterne eingetragen und im Infopanel angezeigt
- Mobile Systemübersicht: 1. Tap zeigt Distanzlinien, 2. Tap auf denselben Stern wechselt ins System; Tap auf leere Fläche schließt Linien
- "Gebunden (synchron)" → "gebunden" (konsistent mit Mondanzeige)
- Neue Anzeige "Gebunden (synchron)" für tidally locked Exoplaneten; 15 Planeten entsprechend markiert (Proxima b/d, Barnard d/b/c/e, Wolf 359 c, Lalande b, Ross 128 b, Lacaille e/b/c, Gliese 725 A+B b, Groombridge Ab)
- Rotationsperioden der neuen terrestrischen Exoplaneten auf null (unbekannt) gesetzt – Anzeige zeigt korrekt "–" statt falscher Werte
- Prokyon B: Spektralklasse DQZ (Weißer Zwerg), Infopanel zeigt jetzt "Weißer Zwerg" korrekt an; D-Klasse in lumClass-Logik ergänzt
- Planetenbahnen: inc/lan waren in Grad statt Radians — alle neuen Planeten korrigiert
- Alle neuen Planeten haben rotationPeriod; 61 Cygni und Prokyon Schwerpunktsradien angepasst
- Systeme #16–19 hinzugefügt: 61 Cygni (K5+K7, 659-J-Binär), Prokyon (F5-Subgiant + Weißer Zwerg), Gliese 725/Struve 2398 (2×Roter Zwerg, je 1 Planet), Groombridge 34 (2×Roter Zwerg, 2 Planeten um A)
- Code-Bereinigung: 2 stray </div> Tags entfernt, tote Funktionen (_countSystemTextures, _preloadUrl, _preloadKey) und Felder (baryAngle) entfernt
- CAM_BASE_DIST Konstante eingeführt (war hardcoded 900), halfFovTan aus dem forEach-Loop herausgezogen
- Verbindungslinien zeigen nicht mehr in falsche Richtung – Sterne hinter der Kamera werden sauber ausgeblendet statt NDC-Wraparound zu produzieren
- Verbindungslinien immer gezeichnet, unabhängig von Kameraposition – Linien verschwinden nicht mehr beim Ranzoomen
- Linien verschwinden nicht mehr beim Ranzoomen – Dot-Product statt NDC-Z für Kamerarückseiten-Check
- Hover-Linien werden während Autozoom blockiert
- Verbindungslinien verschwinden nicht mehr beim Ranzoomen
- Linien und Hover während Autozoom deaktiviert
- Label-Abstand perspektivisch korrekt berechnet – Labels nicht mehr im Stern
- Übersicht bereinigt: kaputtes HTML-Tag war seit V2.69 Ursache aller Positions-Probleme; alle unnötigen Matrix-Fixes entfernt; Linien verschwinden nicht mehr beim Zoomen
- Verbindungslinien und Labels auf exakten Sternpositionen – matrixWorldInverse nach render() explizit invertiert, Screenkoordinaten von mesh.getWorldPosition() statt project()
- Label-Offset mit direkter Perspektivformel berechnet statt project() – korrekte Skalierung bei Zoom
- _worldToScreen invertiert matrixWorldInverse vor project() explizit
- Labels, Verbindungslinien und Hover korrekt auf Sternen – camera.matrixWorldInverse wird nach updateMatrixWorld() manuell invertiert (Three.js r128 tut dies nicht automatisch)
- Labels in Systemübersicht korrekt über Sternen – Pixel-Offset wird aus projiziertem Sternradius berechnet statt fixer 3D-Unit-Offset
- Verbindungslinien und Labels korrekt auf Sternen positioniert – Label- und Linienberechnung erfolgt nach Kamera-Update
- Verbindungslinien und Hover-Erkennung ohne vertikales Offset – Kamera-Matrix wird vor Projektion und Raycasting aktualisiert
- Systemübersicht: Hover auf Stern zeigt gestrichelte Verbindungslinien zu Nachbarsystemen (max. 10 Lj) mit Distanzangabe
- Panel-Icons: Mond rechts oben vom Planeten positioniert, Zoom als Fadenkreuz, Control als Schieberegler-Symbol
- Lichtintensität der Sterne reduziert – Texturen werden nicht mehr überblendet
- Shininess der Planeten verringert für weicheres Lichtverhalten
- Planeten- und Mond-Labels durch SVG-Icons ersetzt – Panel auf Mobile kompakter
- Sterne in der Systemübersicht zeigen dieselben Texturen wie in der Systemansicht
- Zoom-In auf Sol: Endpunkt weiter vom Stern entfernt – kein Aufblitzen des Glows mehr
- System wird immer mit Standardzoom geladen, unabhängig vom Zoom in der Systemübersicht
- Zurück zur Systemübersicht mit smoothem Zoom-Out-Übergang
- Ladevorgang lädt direkt alle Texturen ohne Sol-System zu bauen – Übersicht erscheint sauber ohne Zwischenschritt
- Bugfix: Klick auf Übersichtsstern funktioniert (tgt.pos → tgt.getPos())
- Gestaffelter Hintergrund-Preload entfernt (nicht mehr nötig)
- Bugfix: Smooth-Zoom-Übergang funktioniert jetzt korrekt (isOverview-Early-Return blockierte den overview-zoom-Modus)
- Zurück-Button schließt Infopanel und setzt Kamera-Modus zurück
- Veraltetes CSS für back-btn entfernt
- Ladebildschirm → direkt Systemübersicht (Sol-System während Ladevorgang unsichtbar)
- Zurück-Button ins Panel integriert (← links, eigener Abschnitt), "Planeten" → "Pl." für Kompaktheit
- Smooth-Zoom-Übergang von Übersicht zu System beim Klick auf einen Stern
- Systemübersicht: neue Startszene nach dem Ladevorgang mit allen Sternen korrekt positioniert (RA/Dec/Distanz)
- Klick auf Stern lädt das zugehörige System, "← Systemübersicht"-Button kehrt zurück
- Toter Code entfernt: hzRing-Referenz im Animate-Loop
- Code-Konsolidierung: ungenutztes baryAngle-Feld entfernt, doppeltes rKm bei Charon bereinigt
- Wolf 359 b/c, Lalande b/c, Ross 128 b: hardcoded dist durch korrekte AU()-Werte ersetzt, subcat und color vereinheitlicht
- Massenkonstanten (MJ_IN_EARTH, SOL_IN_EARTH, ML_PER_EARTH) als globale Konstanten definiert, alle Wiederholungen im Code ersetzt
- _countSolTextures zu _countSystemTextures(sys) verallgemeinert
- Rektaszension und Deklination (J2000.0) für alle 30 Sterne in den Daten erfasst
- Infopanel zeigt RA/Dec im klassischen Format (h m s / ° ′ ″)
- Epsilon Eridani: innerer Asteroidengürtel auf 2–3 AU korrigiert – Epsilon Eridani b (3.5 AU) liegt jetzt korrekt knapp außerhalb
- Epsilon Eridani: 3 bestätigte Gürtel eingetragen – innerer Asteroidengürtel (2–4 AU), äußerer Asteroidengürtel (17–22 AU), Trümmergürtel (35–90 AU)
- Alle anderen eingetragenen Systeme ohne bestätigte Gürtel (Wolf 359, Ross 128, Lacaille 9352 u.a. – kein Infrarot-Überschuss detektiert)
- Kuiper-Gürtel (30–50 AU) im Sonnensystem als Kleinkörpergürtel eingezeichnet
- Neue Zonentypen: Kleinkörpergürtel (grau) und Trümmergürtel (bläulich)
- Scatter-Textur parametrisiert – Kleinkörpergürtel und Trümmergürtel sind klumpiger und spärlicher als der Asteroidengürtel
- Doppeltap-Zoom auf deaktivierten Buttons behoben – Sperre gilt jetzt immer für gesamtes UI-Panel
- Doppeltap-Sperre nur noch auf WebGL-Canvas und UI-Hintergrund – Buttons wieder tappbar
- Hintergrund-Preload gestaffelt (ein System alle 1.2s, Start nach 2s) – kein Ruckeln mehr nach dem Ladevorgang
- iPad-Crash behoben: Canvas-Textur auf Mobile halbiert (512×128), Punktzahl reduziert, Zeichenoperationen gebündelt
- RingGeometry-Segmente auf Mobile reduziert (128 statt 256)
- Doppeltap-Zoom auf iPad blockiert (gesamtes Dokument, inkl. moderne iPad-Erkennung)
- Habitable Zone an Elternstern gebunden – folgt korrekt Proxima Centauri bzw. dem jeweiligen Stern
- Habitable Zone in Zonen-System integriert – wird automatisch pro Stern berechnet und als Zone gerendert
- Label "Habitable Zone" in grün, Label "Hauptasteroidengürtel" in braun
- Label Hauptasteroidengürtel exakt zentriert (vertikal + horizontal)
- Textur in Polarkoordinaten gerendert – keine radialen Streifen mehr, Partikel verlaufen ringförmig
- Punktdichte auf 22.000 erhöht, 80 Helligkeits-Cluster
- Asteroidengürtel umbenannt auf "Hauptasteroidengürtel"
- Label in Ringmitte positioniert (in Kamerarichtung)
- Asteroidengürtel mit prozeduraler Noise-Textur (Punkte/Cluster) für organischeres Aussehen
- Neuer Objekttyp "Bereich" (Zone) mit Unterkategorie "Asteroidengürtel"
- Hauptasteroidengürtel (2.06–3.27 AU) im Sonnensystem als halbtransparenter Ring eingezeichnet
- Lacaille 9352: Planetenabstände auf korrekte AU()-Werte gesetzt – Planet d jetzt sichtbar in der habitablen Zone
- EZ Aquarii: Struktur korrigiert – A+C enges Paar (3.786 d), B in großer äußerer Bahn um AC (2.25 J, ~1.22 AU)
- Lacaille 9352: Spektralklasse auf M0.5V korrigiert, Planeten d und e ergänzt (4 bestätigt, Hartogh 2026) – Planet d in habitabler Zone
- EZ Aquarii: hierarchische Struktur korrigiert – A und C als enges inneres Binär (3.79 d), B in großer äußerer Bahn um AC (2.25 J)
- 5 neue Systeme #11–#15: Ross 248, Epsilon Eridani, Lacaille 9352, Ross 128, EZ Aquarii
- Exoplaneten: Epsilon Eridani b (0.98 MJ), Lacaille 9352 b+c (4.2/7.6 M⊕), Ross 128 b (1.40 M⊕)
- EZ Aquarii als Dreifachsystem (A/B/C) implementiert
- Masse der Asteroiden im Infopanel ergänzt
- Asteroiden-Typen eingeführt: C-, S-, M-, B-, V-Typ
- Vesta (V-Typ), Pallas (B-Typ), Hygiea (C-Typ) zugewiesen
- Infopanel für Asteroiden aktiviert (Typ, Radius, Distanz, Umlaufzeit)
- Larissa als viertgrößter Neptunmond hinzugefügt (rKm 97, Periode 0.55 d)
- Masse aller Monde im Infopanel ergänzt
- Versionsanzeige ist nun ein Link zur Versionshistorie
- Texturen beim Systemwechsel ohne Verzögerung: GPU-Upload direkt beim Laden erzwungen
- Ladetext geändert auf "Ladevorgang"
- Texturen anderer Systeme werden sofort (ohne Verzögerung) im Hintergrund geladen
- Ladebildschirm beim Start: Texturen werden vollständig geladen bevor das Sonnensystem erscheint
- Fortschrittsbalken zeigt Ladestand, sanftes Einblenden danach
- Texturen der anderen Systeme werden im Hintergrund vorgeladen
- Infopanel für Charon (Pluto-Begleiter) repariert
- Proxima Centauri startet näher an Alpha Centauri A/B (bessere Darstellung auf kleinen Bildschirmen)
- Weitere Fehlerkorrekturen Rotation für tidally locked Monde
- Fehlerkorrekturen für Umlaufzeit von Monden
- Fehler Radius Erdmond behoben
- Fehler Rotation für tidally locked Monde behoben
- Fehler behoben für Umlaufzeit und Radius von Monden
- Infopanel für Monde eingebaut
- distanceToSol für alle 15 Sterne erfasst (Lichtjahre)
- Infopanel zeigt Entfernung für Sterne (Sonne zeigt –)
- Infopanel Leader Line: Ankerpunkt wechselt automatisch (links/mitte → unten/mitte bei wenig Platz)
- Schwellenwert: horizGap kleiner 60% Panelbreite (mobil Portrait)
- Infopanel Mobile-Anpassungen (pointer:coarse, max-width:500px)
- Breite 260px→195px, Padding reduziert, Hintergrund transparenter (0.78→0.55)
- #hud width: max-content (Systemlabel bricht nicht mehr um)
- #systemLabel white-space: nowrap
- Glow-Schalen: Canvas-Radialgradienten-Sprites statt harter Kugeln
- Additives Blending, weicher Abfall (4 Stops: 0%/35%/65%/100%)
- Ambient/Fill auf Originalwerte zurückgesetzt (Planeten beide Seiten sichtbar)
- Drei Glow-Schalen mit luminositätsabhängiger Größe/Opazität
- PointLight.intensity logarithmisch aus Luminosität
- Ambient 0.18→0.06, Fill 0.6→0.25 (stärkere Schatten)
- Leuchtkraftklasse differenziert: M+V=Roter Zwerg, K+V=Oranger Zwerg, G+V=Gelber Zwerg
- Planetenzählung nach parentStar gefiltert (Proxima:3, α Cen A/B:0)
- Spektralklassen korrigiert (Sirius B: DA2VII, Luhman: L7/T0.5, WISE: Y2)
- Sternmassen hinzugefügt (M☉/MJ)
- Leuchtkraftklasse aus Suffix abgeleitet (V=Hauptreihe, VII=Weißer Zwerg, kein Suffix=Brauner Zwerg)
- Rotationsdauer Exoplaneten (Wolf 359/Lalande: gebunden/–)
- Stern-Infopanel: Spektralklasse, Farbe (colorName), Sternbild, Planetenzahl, absolute/scheinbare Helligkeit
- 15 Sterne mit constellationName, absoluteMagnitude, relativeMagnitude erfasst
- Massenanzeige-Leiter: <0.01 M⊕→M☽, 0.01–317.8 M⊕→M⊕, >317.8 M⊕→MJ, >333000 M⊕→M☉
- Jupiter selbst in Erdmassen (317.8 M⊕)
- Ceres: Asteroid→Zwergplanet (rotationPeriod, massEarth, moonCount)
- Zwergplaneten-Subkategorien: Hauptgürtelobjekt (Ceres), Plutino (Pluto), Cubewano (Haumea/Makemake), SDO (Eris)
- Massenanzeige mit M☽ für kleine Objekte
- Infopanel für Zwergplaneten aktiviert
- Alle 5 Zwergplaneten mit vollständigen Daten (radius, massEarth, moonCount)
- Infopanel Breite 210px→260px
- moonCount: null für Exoplaneten → Anzeige "(unbekannt)"
- Eisriese-Subcategory (icegiant) für Uranus/Neptun/Proxima c/Lalande c
- 6 neue Sternensysteme #5–#10 (WISE 0855, Wolf 359, Lalande 21185, Sirius, Luyten 726-8, Ross 154)
- Spektralklasse D (Weißer Zwerg) für Sirius B
- Luhman 16-System (L7.5/T0.5 Braune Zwerge)
- Neue Spektralklassen L/T/Y mit Farben/Radius/Luminosität
- Binärsystem mit 25-Jahre-Periode
- touch-action: manipulation auf #ui/Buttons (iOS 300ms Tap-Verzögerung entfernt)
- iOS Double-Tap-Zoom-Bug fix: visualViewport API, resize-Listener, Panel-Taps blockiert
- Planetenabstände korrigiert (AU-Formel für Proxima/Barnard-Planeten)
- HZ-Berechnung war korrekt, Planeten standen an falschen Positionen
- HZ-Ring sichtbarer: opacity 0.07→0.13, zwei grüne Randlinien (opacity 0.55)
- Sternspezifische Luminositäten (Proxima: 0.00155, Barnard: 0.00346)
- Proxima b jetzt korrekt in HZ, Barnard-Planeten zu nah (zu heiß)
- HZ-Ringe nur für Sterne mit Planeten (filter nach parentStar)
- HZ-Ringe nur für Sterne mit Planeten vorbereitet
- Habitable Zone implementiert (Kopparapu-Formel, grün transparenter Ring)
- Luminosität pro Spektralklasse, AU-Umrechnung
- Barnard's Stern-System (M4V) mit 4 Exoplaneten (b/c/d/e, 2024–2025 bestätigt)
- Keys bestehender Systeme: -system Suffix
- Mobile BRIGHT-Farben deutlich stärker (Planet: 0xaaaaff, Mond: 0x8888ff, Asteroid: 0xffaa44, Dwarf: 0x66ccff)
- Mobile Orbit-Farben heller (2×)
- Rigel/Toliman Orbitlinien hinzugefügt
- Proxima Orbitlinie beim Fokus hervorhebbar
- Schwerpunkt zwischen α Cen A/B grau eingezeichnet
- subcategory-Planet-Textur-Bug fix (terrestrial/gasgiant)
- Fallback-Kette: key.jpg → subcategory-planet-.jpg → category-planet.jpg
- Proxima startM=π/2 (halbwegs zwischen Periapsis/Apoapsis)
- Proxima startM=π (Apoapsis, fernster Punkt)
- Proxima-Bahn neu kalibriert (a=300, ecc=0.60 → Periapsis 120, Apoapsis 480)
- Proxima-Bahn elliptischer (ecc 0.30→0.75), startM=0 (Periapsis)
- M-Klasse Radius 16→8 (realistischer), Proxima dist 14→18
- Proxima Exoplaneten (b/c/d) mit parentStar-Mechanismus
- Proxima c als Kandidat (?) markiert
- Stern-Labels: weißer Text auf halbtransparentem schwarzen Pill (lesbar auf jedem Hintergrund)
- Proxima-Bahn: inc 107.6°→20°, lan 126°→45°, ecc 0.5→0.3 (flacher)
- Proxima Centauri (M5V) als dritter Stern im Alpha Centauri-System
- Elliptische Bahn (a=450, ecc=0.5, inc=107.6°, lan=126°), Periode 550.000 Jahre
- Binärsystem: sys._baryAngle geteilt, Stern A+B immer gegenüberliegend (phaseOffset π)
- Korrektur visueller Kompromiss
- Alpha Centauri A/B Separation 120 Units (visueller Kompromiss)
- A: orbitR=54, B: orbitR=66 (Massenverhältnis 1.10:0.90)
- Alpha Centauri Binärsystem (barycenter-Mechanismus wie Pluto-Charon)
- Rigel Centaurus (A): orbitR=18, Toliman (B): orbitR=22, Periode 79.91 Jahre
- Proxima Centauri → Alpha Centauri-System umbenannt
- Rigel Centaurus (G2V) + Toliman (K1V) hinzugefügt
- Sonne: spectralClass 'G2V'
- Spektralklassen-Parsing: nur erstes Zeichen als Subkategorie-Key
- Texture-Fallback: key.jpg → subcategory--.jpg → category-.jpg
- Medium-Sterne 3px→5px (Sprite-Gradient sichtbar ab ~4–5px)
- Sehr helle Sterne 12px→7px, Opacity 0.90→0.85
- Medium 6px→3px / 0.80→0.64, sehr hell 12px→5px / 0.90→0.72
- Runde Glow-Sprites via Canvas-Textur (radialer Gradient)
- Faint-Opacity 0.35→0.5, Sprite-Größen: faint 1px, medium 3.5px, sehr hell 6px
- Drei Helligkeitsebenen: Faint (88%, 1px, 0.35), Medium (9%, 2.5px, 0.75), Sehr hell (3%, 4px, 0.95)
- sizeAttenuation: true aktiviert
- Hintergrundstern-Farben entsättigt (natürlicherer Himmel)
- Größenvariation verstärkt (faint 92%→88%, helle Ausreißer bis 7.5px)
- Verbesserter Sternenhintergrund: sphärische Verteilung (Marsaglia)
- Farbvariation nach Spektralklassen, Größenvariation (92%/7%/1%), 10.000 Sterne
- Stern-Label-Fokus-Farbe: wenn Basisfarbe schwarz → nur font-weight:bold, keine Farbänderung
- Stern-Label positioniert über positionLabel auf projizierte Weltposition (0,0,0) + translate(-50%,-50%)
- Stern-Label zentriert (star-label CSS, position:fixed, left:50%, top:50%)
- Fokus-Farbe bei Sternen: nur font-weight:bold (schwarz auf gelb unleserlich)
- Spektralklassen O→M (blau→rot, groß→klein) mit Farbe/Radius/Licht
- Licht/Glow-Mesh an Pivot gebunden (für Multi-Stern-Systeme)
- Stern-Labels schwarz (rgba(0,0,0,0.9))
- Glow-Leak fix: Glow-Mesh als glowMesh im Star-Objekt gespeichert, beim Unload entfernt
- Geschwindigkeitswerte .val 13px→11px Arial
- Kompletter Neuaufbau von Grund auf (Scoping-Fehler behoben)
- Struktur komplett Überarbeitet mit Scene Setup, Kamera, Focus, Input, Animation
- positionLabel/makeLabel/buildMoon aus loadStarSystem herausgezogen (globale Ebene)
- Licht-Akkumulation fix: Snapshot der Arrays, sofortiges Leeren, dann Mesh-Entfernung
- Race condition fix: Arrays zuerst leeren, dann DOM-Entfernung
- positionLabel: el.isConnected Check vor style-Zugriff
- clearAllFocus() in unloadCurrentSystem durch Inline-Code ersetzt
- mode/focusTgt vor unloadCurrentSystem deklariert
- labelRegistry vor unloadCurrentSystem deklariert
- loadStarSystem(id) Architektur: unloadCurrentSystem() + loadStarSystem(id)
- Nav-Buttons rufen loadStarSystem() auf
- Proxima Centauri als zweites System (ID=2, key='proxima')
- ›-Button aktiv
- .val user-select:none
- Zoom/Speed-Buttons an Grenzen deaktiviert (min/max)
- Deaktivierte Buttons: dunkles Grau, schwacher Rahmen, blasser Text, kein Hover
- starSystemID Variable (default 1)
- „Pause" → „Control"
- ‹/› Buttons für System-Navigation (deaktiviert bei first/last)
- .group-label user-select:none
- Systemtitel #systemLabel zentral oben (18px, sys.name)
- name: 'Sol-System', key: 'sol'
- Saubere starsystems-Hierarchie (keine _sol*-Variablen mehr)
- const sys = starsystems[0]
- starsystems-Hierarchie eingeführt (starsystems[0] mit stars/planets/asteroids/dwarfs)
- Aliase starsData/planetsData/etc. bleiben für Code-Kompatibilität
- gas_giant → gasgiant (ohne Unterstrich)
- TERR_SC/GAS_SC/AST_SC/DWARF_SC entfernt
- categoryData.scaleKm/minR pro Kategorie
- Planet-Subcategories: terrestrial (0.000625, min 2.5), gasgiant (0.0002125, min 8)
- scaleR()-Funktion für einheitliche Radiusberechnung
- Code-Bereinigung: sunMesh/sunHit/CAT_BY_LT entfernt
- Kommentare aktualisiert (rotationPeriod, axisTilt)
- Euler-Reihenfolge ZYX (Neigung Z vor Rotation Y)
- Uranus-Textur mit horizontalen Linien zeigt jetzt korrekte „Roll"-Bewegung
- getPos()-Bug fix: alle Lambdas zeigen auf pivot.position statt mesh.position
- Achsenneigung mit realen Daten (axisTilt in Grad)
- Pivot-Object3D für jedes Mesh, rotation.z = Neigung, rotation.y = Eigenrotation
- HIT_MULT.sun Alias entfernt, direkt HIT_MULT.star im Code
- HIT_MULT.sun undefined Bug fix (Array nur mit star/planet/moon/asteroid/dwarf)
- sd.r undefined = NaN → Geometrie-Fehler
- Defensive Guards in makeOrbitLine/makeEllipticOrbitLine (NaN/undefined-Checks)
- categoryData zentralisiert (labelColor, labelSize, orbitColor, orbitColorDim, hitMult)
- Alte Konstanten (LCOLOR, LSIZE, HIT_MULT, DIM_, BRIGHT_) daraus abgeleitet
- categoryData ganz oben vor jeder Verwendung
- BASE_SPEED 0.05→0.025 halbiert
- Defaults zurück auf 1× für Planeten und Monde
- Eigenrotation mit realen Perioden (rotationPeriod in Tagen)
- Negative Werte = retrograd (Venus, Uranus)
- Monde tidally locked (Rotationsperiode = Umlaufzeit)
- applyRotation() skaliert mit Planeten-Speedregler
- categoryData mit Kategorie-Fallback für Texturen
- Ladereihenfolge: key.jpg → category-.jpg → Fallbackfarbe
- category-moon.jpg auf alle Monde anwendbar
- TEXTURE_BASE_URL auf https://astroviewer.x-core.workers.dev/images/ aktualisiert
- Alle Himmelskörper haben key (fehlende: Rhea, Dione, Tethys, Titania, Oberon, Umbriel, Ariel, Proteus, Nereid, Ceres, Vesta, Pallas, Hygiea, Dysnomia)
- Textur-System mit key-Property (automatische URL-Zusammensetzung)
- TEXTURE_BASE_URL zentral anpassbar
- Canvas-Ansatz für Cross-Origin-Texturen versucht (Image→Canvas→CanvasTexture)
- crossOrigin='anonymous' gesetzt, Fehler-Callback hinzugefügt
- Textur-Loading fix: Fallback-color sofort sichtbar, Textur im Callback angewendet, color auf 0xffffff
- Textur-Support eingeführt (makeMaterial(color, textureUrl, opts))
- texture-Property optional bei allen Objekttypen
- Sonne: texture:'https://astroviewer.netlify.app/images/sun.jpg'
- SUN_R entfernt (toter Code)
- starsData eingeführt (alle Sonneneigenschaften als Daten)
- starObjects iteriert über starsData[0]
- SUN_R aus starsData[0].r abgeleitet
- Startgeschwindigkeiten: Planeten 0.5×, Monde 0.1×
- Uranus-Ringe: dunkelblaugrau, 18% Deckkraft
- Neptun-Ringe: neu, sehr dunkel (10% Deckkraft)
- Ring-Logik: opacity als optionales Datenfeld
- Uranusringe hinzugefügt (Neigung 97.77°, blaugrau)
- Mondgeschwindigkeit fix: updateMoon() verwendet direkt BASE_SPEED × SPEEDS × MOON_SPEEDS
- Pluto-Charon konsistent mit Planeten/Monden-Reglern
- Vollständiges Refactoring: Alle Sonderfälle datatengesteuert
- Ringe → ring:{inner, outer, tilt, color} in planetsData
- Elliptische Monde (Nereid) → ecc in moon-Daten, generischer buildMoon()-Handler
- Dwarf-Monde (Dysnomia) → moons:[...] direkt in dwarfData
- Binärsysteme (Pluto-Charon) → bary:{primaryR, companion:{...}} in dwarfData
- Generische updateMoon()-Funktion (circular/elliptic automatisch)
- Nereid (Neptunmond) mit echter elliptischer Bahn (ecc=0.7512)
- Keplersche Gleichung iterativ gelöst
- Neue Funktionen: makeEllipticOrbitLine(), ellipticOrbitPos()
- Ausrichtung: beide Labels (Zoom/Pause) min-width:36px
- II zentriert: display:flex mit align-items + justify-content:center
- Pause-Icon: II/▶ als einfache Textzeichen (kein iOS-Emoji)
- Alle Buttons feste Breite 32px
- Pause-Button feste Breite 36px (kein Größenwechsel beim Klick)
- Auto-Zoom zeigt nur 🔍 (kein Text "Auto")
- Schwerpunkt-Label grau, kleiner (9px, 60% Deckkraft)
- UI-Redesign: Pause in Zoom-Sektion, Buttons schmaler (7px 10px), Faktoren 15px (gleiche Größe wie Rest)
- Dysnomia (Eris-Mond): Periode 15.786 Tage,
- Umbenennung des Artifacts in "astroviewer.html"
- Download-Dateiname bleibt trotz Umbenennung "solar-system.html" (Browser-Limitierung)
- Versionsanzeige auf V1.20 aktualisiert
- Versionsanzeige auf V1.18 korrigiert (manuelle Anpassung)
- Versionsanzeige auf V1.16 korrigiert (DOM-Struktur-Fix)
- Versionslabel "V1.16" dezent unten rechts eingefügt
- Fehler: `labelsEl is null` durch falsche HTML-Reihenfolge behoben
- Tap-Problem auf Mobilgeräten behoben (Raycaster-Sortierung nach Distanz)
- `isTouchClick`-Flag zur Unterscheidung von Touch/Mouse-Events
- Tap-Fokus auf Sonne auf Mobilgeräten behoben (Raycaster-Logik angepasst)
- Mobilgeräte-Tap-Logik verbessert (entfernungsbasierte Tap-Erkennung)
- Titel im Browser-Tab auf "AstroViewer" umbenannt
- Auto-Zoom-Button-Höhe an andere Schalter angepasst (Padding-Fix)
- Auto-Zoom-Button exakt unter Zoom-Buttons ausgerichtet (Flex-Layout-Fix)
- Auto-Zoom-Button unter Zoom-Buttons platziert (CSS-Grid-Anpassung)
- Steuerungspanel optimiert: Pause-Button nur noch Symbol, Auto-Zoom mit Lupensymbol
- Orbit-Linien-Helligkeit mobilgerätespezifisch angepasst (Media Query `pointer:coarse`)
- Orbit-Linien auf Mobilgeräten heller (2x Helligkeit)
- Touch-Steuerung für Mobilgeräte implementiert (1-Finger-Drehung, 2-Finger-Pinch)
- Orbit-Linien allgemein heller (mobile Sichtbarkeit)
- Tap-Problem auf Mobilgeräten behoben (Raycaster-Koordinaten-Fix)
- Tap-Logik für Mobilgeräte überarbeitet (distanzbasierte Erkennung)
- Klick auf Labels funktioniert jetzt (Pointer-Events-Fix via `document.elementFromPoint`)
- Labels anklickbar gemacht (Pointer-Events-Konflikt behoben)
- Basisversion mit allen Planeten, Monden, Asteroiden und Zwergplaneten
- Kamerafokus-System, Orbit-Highlighting, Geschwindigkeitsregler
- Reale Orbitalparameter (Inklination, Knoten) für alle Objekte
- Pointer-Events-Konflikt zwischen Canvas und Labels behoben
- Klick-Erkennung auf Labels via `document.elementFromPoint` implementiert
- Labels mit höherem z-index als Canvas versehen
- Labels direkt an document.body angehängt (umgehender Container-Konflikt)
- Klick-Handler auf Labels zentralisiert (e.stopPropagation)
- Pointer-Events-Konflikt behoben (#labels pointer-events:none, Labels pointer-events:auto)
- Klick-Handler in makeLabel integriert
- Separate Event-Listener auf Objekten entfernt
- Pointer-Events-Konflikt zwischen Container und Labels analysiert
- Klick auf Labels getestet (funktioniert nicht)
- Klick-Handler auf Labels mit e.stopPropagation()
- Pointer-Events-Konflikt identifiziert (#labels blockiert Events)
- Klick auf Labels soll Fokus setzen (noch nicht funktionierend)
- Labels mit pointer-events:auto und cursor:pointer versehen
- Klick auf Labels getestet (funktioniert nicht)
- Label-Positionierung bei größerem Zoom getestet
- Klick auf Labels soll Fokus setzen (Feature-Anfrage)
- Label-System komplett neu geschrieben (keine CSS-Klassen mehr für Farben)
- Vollständiger Rewrite des Label-Systems (labelRegistry, positionLabel)
- display:none Initialisierung für Labels hinzugefügt
- Highlight via Inline-Style direkt gesetzt (setFocus)
- clearHighlight setzt originalen Inline-Color zurück
- makeLabel verwendet einzelne Klasse plus Inline-Farbe
- Label-Highlighting komplett über Inline-Styles (CSS-Klassen umgangen)
- e.preventDefault() auf mousedown, isDragging-Guard auf mouseup
- setFocus wird möglicherweise doppelt aufgerufen (Guard hinzugefügt)
- Inline-Styles in setFocus zurückgesetzt
- Debug-Console-Logs hinzugefügt
- Label-Findung via textContent-Matching (um labelEl-Referenzen zu umgehen)
- labelEl-Referenz in clickTargets direkt aus allLabelEls Index
- clearHighlight nur von Zoom-Button aufgerufen (setFocus macht eigenes Reset)
- clearHighlight und setFocus-Interferenz analysiert
- allLabelEls-Array statt querySelectorAll (direkte Iteration)
- querySelectorAll Scope-Problem identifiziert
- makeLabel-Funktion zentralisiert
- makeLabel-Call in Asteroiden-Build
- makeLabel-Call in Zwergplanet-Build
- makeLabel-Call in Planet-Build
- makeLabel-Call in Mond-Build
- makeLabel-Funktion eingeführt
- querySelectorAll Scope auf labelsEl begrenzt
- CSS konsolidiert + !important für .focused
- Kuiper-Gürtel hinzugefügt (Pluto, Haumea, Makemake, Eris)
- Dwarf animation im Render-Loop
- .dlabel CSS, clearHighlight und setFocus aktualisiert
- Dwarf planet Build-Loop hinzugefügt
- Dwarf planet Build-Loop vorbereitet
- Zwergplanet-Kategorie vorbereitet
- Kuiper-Gürtel-Feature angefragt
- Vollständiger Rewrite mit sauberer Label-Struktur
- Asteroiden-Labels via cssText fixiert
- Asteroiden-Radius erhöht (Mindestradius 3)
- asteroidsData Deklarations-Reihenfolge fixiert
- asteroidsData Referenzierungs-Fehler analysiert
- Asteroiden hinzugefügt (Ceres, Vesta, Pallas, Hygiea)
- Asteroid animation im Render-Loop
- clearHighlight für Asteroiden-Orbit-Farben aktualisiert
- Asteroid Build-Loop und clearHighlight aktualisiert
- Asteroiden-Daten und separater Build-Loop eingefügt
- Asteroiden-Feature vorbereitet
- Asteroiden-Feature vorbereitet
- Asteroiden-Feature vorbereitet
- Reale Orbitalparameter implementiert (Inklination, Aufsteigender Knoten)
- Orbit-Alignment-Fix (orbitTilt in makeOrbitLine übergeben)
- Orbit-Alignment-Fix vorbereitet
- Orbit-Alignment-Fix vorbereitet
- Orbit-Alignment-Fix vorbereitet
- Orbit-Alignment-Fix vorbereitet
- Orbit-Alignment-Fix vorbereitet
- Orbit-Alignment-Fix vorbereitet
- Orbit-Alignment-Fix vorbereitet
- Orbit-Alignment-Fix (orbitTilt in makeOrbitLine übergeben)
- Orbit-Helligkeit (Mondorbit voll, Planetenorbit halb)
- UI-Layout (zweispaltig, keine Umbrüche)
- Zoom-Problem (FOCUS_BASE_DIST = 120)
- Auto-Zoom Toggle hinzugefügt
- Zoom-Problem analysiert (maximale Zoom-Distanz)
- Fokus-Highlight für Orbit-Linien
- Fokus-Highlight für Orbit-Linien vorbereitet
- Fokus-Highlight für Orbit-Linien vorbereitet
- Orbit-Linien dunkler gestaltet
- Kamera-Modi komplett neu gebaut (free, lerping, focus)
- postFocusLookAt-Logik implementiert
- postFocusLookAt-Logik vorbereitet
- postFocusLookAt-Logik vorbereitet
- postFocusLookAt-Logik vorbereitet
- syncOrbitFromCamera-Fix (kein Sprung zur Sonne)
- syncOrbitFromCamera-Fix vorbereitet
- syncOrbitFromCamera-Fix vorbereitet
- Klick-Fokus: Monde anklickbar, Label-Überlappung behoben
- Klick-Fokus: BASE_SPEED von 0.5 auf 0.25 reduziert
- Klick-Fokus: Kamera zoomt sanft auf Objekt
- Zoom-Steuerung (+/- Buttons) hinzugefügt
- Mond-Geschwindigkeitsregler hinzugefügt
- Monde hinzugefügt (Erde, Mars, Jupiter, Saturn, Uranus, Neptun)
- Planetenbeleuchtung (Nachtseiten sichtbar)
- Sonne (fester Radius 28), Labels (fester Offset), Geschwindigkeitsregler
- Sonne sichtbar (MeshBasicMaterial), Labels (HTML-div), Hintergrund (schwarz), Planetengrößen halbiert
- Basisdarstellung Sonnensystem (Sonne, 8 Planeten, Orbits, Pause-Button)