AstroViewer Version Archive
INFORMATION
Die nachfolgende Liste enthält Informationen zu allen älteren archivierten Versionen des AstroViewers.
VERSION HISTORY ARCHIVE
- Bugfix Konstellationen-Toggle (V12.71/72-Regression): astroviewer.html registrierte einen zweiten Click-Listener auf denselben Button — controls.js macht das bereits. Jeder Klick löste die Action doppelt aus (toggle → toggle), sodass der Zustand unverändert blieb und nichts passierte. Doppelter Listener entfernt.
- Bugfix Konstellations-Labels nach Wiedereinschalten: showConstellations() blendete die Sternbild- und Sternlabels nach einem hide/show-Zyklus nicht wieder ein. Labels erhalten jetzt beim Einschalten explizit display:'' zurück und werden im nächsten Frame durch updateConstellationLabels korrekt positioniert.
- Bugfix Konstellationen-Toggle: toggleConstellations() und getConstellationsVisible() fehlten in buildActionsContext – der Button schaltete die Sternbilder nicht um, sondern setzte nur den Button-State. Beide Getter jetzt korrekt eingebunden.
- commands.json: toggle-constellations als fehlende Aktion ergänzt (war im Recorder-Script-Editor nicht verfügbar).
- V12.71-Fixes für getFocusLabelEl und focusLabel rückgängig gemacht – das DOM-Element #focusLabel existiert nicht mehr (wurde früher entfernt), die Änderungen waren daher wirkungslos.
- Code-Review-Fixes: Fehlende Hilfsfunktion px() in screenshot.js ergänzt (focusLabel erschien nie im Screenshot). Drei fehlende Getter (getCamera, getZoomOutStart, getZoomOutEnd) im actions.js-Default-Context ergänzt – verhindert potenzielle Runtime-Fehler beim initialen Laden vor der vollständigen Context-Registrierung.
- SVG-Marker (#dot) in alle Leader-SVGs kopiert: jeder der sechs Leader-SVGs hat jetzt seine eigene Marker-Definition statt einer Cross-Document-Referenz – behebt fehlenden Dot-Marker an Führungslinien in Firefox und Safari.
- getFocusLabelEl in registerInitContext und buildActionsContext ergänzt: das focusLabel-Element wurde bisher nie von den Actions (focus-object, show-labels, set-logscale) gefunden und daher nie aktualisiert.
- Konstellations-Toggle-Button wird jetzt über runAction('toggle-constellations') geroutet – Klicks werden damit vom Recorder aufgezeichnet und können in Scripts abgespielt werden.
- Neue Asteroiden: Eros (S-Typ, Amor-Gruppe, a=1.46 AU) und Chariklo (D-Typ Centaur, a=15.75 AU) im Sol-System ergänzt. Daten aus NASA NSSDC, JPL Small-Body Database und Braga-Ribas et al. 2014 (Nature).
- Chariklo-Ringe: Als erster Asteroid im Modell hat Chariklo zwei Ringe (C1R bei 391 km, C2R bei 405 km vom Körpermittelpunkt). Neuer Ring-Typ "twin" in builder.js: rendert zwei schmale konzentrische Ringe mit Lücke dazwischen, analog zu den realen Beobachtungsdaten. C1R ist breiter (~7 km) und dichter (τ≈0.4), C2R schmäler (~3 km) und schwächer (τ≈0.06). Ringe enthalten Wassereis (bläuliche Farbe). Ring-Support für Asteroiden allgemein aktiviert.
- Asteroid-Skalierung: minR für Asteroiden von 4 auf 1.2 reduziert. Kleine NEAs wie Eros (8 km) erscheinen jetzt deutlich kleiner als Planeten, statt künstlich gleich groß. Die HitSphere-Vergrößerung (mobile ×5) bleibt erhalten für gute Klickbarkeit.
- Prozedurale Textur-Generierung für Asteroiden: Wenn keine Bilddatei vorhanden ist, wird jetzt automatisch eine realistische Oberfläche berechnet – analog zum bestehenden Fallback für Exoplaneten. Ergebnis: felsiges Regolith mit dichter Kraterüberdeckung und feiner Körnung (Staubschicht-Effekt), deterministisch aus dem Objektnamen generiert.
- Vier Asteroid-Farbtypen je nach Spektralklasse: C-Typ (dunkelgrau/kohlig, z.B. Hygiea, Ryugu), S-Typ (bräunlich/silikatisch, z.B. Vesta, Itokawa), M-Typ (neutralgrau/metallisch, z.B. Psyche) und D-Typ (rötlich-dunkel, z.B. TNOs). Die Klasse wird automatisch aus dem Subkategorie-Key gelesen; bei unbekannter Klasse wählt ein Hash einen Typ.
- Bugfix Sternname-Diskrepanz (Rigel vs. Rigil): Labels zeigten den Roh-Namen aus starsystems.json statt den priorisierten Alias-Namen, weil applyNamePriority() nicht beim System-Laden aufgerufen wird. Fix: tName() schaut jetzt für alle Objekt-Keys zusätzlich in S.aliases und gibt den besten Katalognamen nach Priorität zurück – unabhängig davon ob applyNamePriority() je aufgerufen wurde. Labels erhalten so von Anfang an den korrekten priorisierten Namen.
- Schreibfehler in starsystems.json korrigiert: alpha-centauri-a hatte name="Rigel Centaurus" statt "Rigil Kentaurus".
- Bugfix Systemname-Lokalisierung: deriveSystemName() verwendete den Alias-String des hellsten Sterns direkt (z.B. immer "Sonne"), ohne die I18N-Lokalisierung anzuwenden. Fix: der Sternname wird jetzt per tName() lokalisiert bevor der System-Suffix angehängt wird – "Sonne-System" auf DE, "Sun System" auf EN.
- Alias-Label im Systemtitel: _buildSystemAliases() hatte denselben Fehler – primaryName und alternative Namen wurden ohne I18N berechnet, was zu Fehlvergleichen und falschen Einträgen führte. Fix: tName() wird auch hier für jeden Alias-Basisnamen angewendet.
- Bugfix CatalogPriorityPanel Sprache (echter Fix): window._catalogPanelLangRefresh wurde zwar in catalogpriority.js registriert, aber nie in applyLang() aufgerufen. Fix: applyLang() in languages.js ruft den Callback jetzt auf.
- Alias-Label im Systemtitel neu konzipiert: zeigt jetzt alle alternativen Systemnamen an, die sich aus den anderen Katalognamen der hellsten Systemkomponente ergeben würden (gleicher Algorithmus wie der Hauptname, aber mit den nicht-priorisierten Aliases). Ersetzt die bisherige Logik die System-Aliases aus aliases.json las (die dort nicht mehr vorhanden sind).
- Bugfix CatalogPriorityPanel Sprache: Katalognamen in der Liste blieben nach Sprachumschaltung in der alten Sprache. Fix: refreshCatalogPanelLang() ruft jetzt _renderList() auf wenn das Panel geöffnet ist.
- Konzeptänderung Systemname: Systemnamen werden nicht mehr manuell in aliases.json oder languages.json verwaltet, sondern algorithmisch abgeleitet. Algorithmus (namepriority.js: deriveSystemName): Name der hellsten Systemkomponente nach Katalogpriorität, Komponentenbuchstabe entfernen, Sprachsuffix anhängen ("-System" DE / " System" EN). Systemnamen bleiben bei Sprachumschaltung automatisch korrekt.
- aliases.json bereinigt: alle 217 System-Aliases entfernt. Fehlende Stern-Aliases ergänzt (Alpha Centauri A/B Bayer, Luyten 726-8 A/B LPM, Wolf 1055 A/B). IAU-Schreibfehler korrigiert (Rigel → Rigil Kentaurus). Unicode-Minuszeichen in WISE-Namen vereinheitlicht.
- languages.json: alle 86 Systemname-Einträge (DE + EN) entfernt, da jetzt algorithmisch generiert. tName() in languages.js nutzt für -system Keys direkt deriveSystemName() aus namepriority.js.
- Bugfix Scrollrad im CatalogPriorityPanel: Scrollen in der Katalogliste löste gleichzeitig den 3D-Kamerazoom aus. Fix: wheel-Events werden im Panel abgefangen und nicht weitergeleitet.
- Katalognamen in languages.json überführt (Key-Schema catalog.name.catalogKey): alle 27 Kataloge haben jetzt deutsche und englische Bezeichnungen und werden im Panel entsprechend der App-Sprache angezeigt.
- Zahnrad-Icon (icon-settings) in icons.svg komplett neu gezeichnet: klare 8-Zahn-Form mit Material-Design-Pfad, passt zuverlässig in den 18×18px-Button. C2PA-Metadaten-Block aus icons.svg entfernt.
- Bugfix applyNamePriority (namepriority.js): Namensänderungen wurden nur im aliasLabel sichtbar, alle anderen Labels zeigten weiterhin den alten Namen. Ursache: el._objNameFallback (der tName()-Fallback) sowie clickTargets.name, planetData.name und die internen Felder aller Szenen-Objekte (starObjects, planetObjects, moonObjs, dwarfObjects, asteroidObjects, cometObjects) wurden nicht aktualisiert. Fix: applyNamePriority baut jetzt eine vollständige key→name-Map und schreibt alle betroffenen Laufzeit-Strukturen konsistent durch.
- Neuer Einstellungen-Button in der Topbar (Zahnrad-Icon, neben dem Sprachumschalter) öffnet das neue CatalogPriorityPanel. Icon in icons.svg hinzugefügt, Tooltips in languages.json auf DE/EN lokalisiert.
- Neues Modul catalogpriority.js mit dem CatalogPriorityPanel: listet alle Kataloge in ihrer aktuellen Prioritätsreihenfolge auf. Jeder Eintrag zeigt Katalogname und -kürzel. Das Panel kann per Maus oder Finger gezogen und geschlossen werden wie die anderen grünen Panels.
- Drag & Drop-Reordering der Katalogliste: auf Desktop per Mausklick-and-Drag, auf Mobile per Long-Press (180 ms) und dann Ziehen mit haptischem Feedback. Ein Ghost-Klon folgt dem Finger/Cursor, eine grüne Linie zeigt die Einfügeposition. Nach dem Drop werden die priority-Felder in S.catalogs neu vergeben und applyNamePriority() aufgerufen.
- Panel-Texte werden bei Sprachumschaltung automatisch aktualisiert (window._catalogPanelLangRefresh).
- Property nameSourceCatalogKey in starsystems.json direkt nach name verschoben (Systeme und Sterne) für bessere Lesbarkeit.
- Katalog-Korrekturen in aliases.json: BD−09°697 und CD-36°15693 wurden fälschlich als IAU eingetragen (sind BD_CoD_CPD), LP-Einträge waren als WD klassifiziert (korrekt: LHS_LTT), GL 268 war als IAU eingetragen (korrekt: GL). 6 Einträge bereinigt.
- Neues Modul namepriority.js mit der Funktion applyNamePriority(): liest die Prioritätsreihenfolge der Kataloge (S.catalogs) und setzt für jedes System und jeden Stern automatisch den Aliasnamen mit der höchsten verfügbaren Priorität als Anzeigenamen (name + nameSourceCatalogKey). Danach werden Labels, Info-Panels, System-Label, Alias-Label, Listen- und Vergleichsansicht neu geladen. Wird später nach einer Prioritätsänderung aufgerufen.
- Bugfix Alias-Label (languages.js, astroviewer.html): Beim Betreten eines Systems wurden keine Aliasnamen angezeigt – erst nach dem Umschalten der Sprache. Ursache war, dass das Alias-Label nur in applyLang() befüllt wurde, nicht beim System-Wechsel selbst. Fix: updateAliasLabel() als eigene Funktion ausgelagert, wird nun direkt nach _loadStarSystemImpl() aufgerufen.
- Neue Datei aliases.json eingeführt: enthält alle bekannten Katalognamen und Eigennamen für Systeme und Sterne, jeweils mit Angabe des Quellkatalogs (catalogKey aus catalogs.json). Jeder Eintrag zeigt klar, ob ein Name zum System oder zu einem bestimmten Stern gehört. IAU-Eigennamen werden laut Konvention sowohl für das System als auch für die hellste Komponente eingetragen.
- catalogs.json wird nun ebenfalls beim App-Start geladen und ist unter S.catalogs verfügbar.
- aliases.json wird beim App-Start geladen und ist unter S.aliases verfügbar (beide graceful fallback bei fehlender Datei).
- Jedes System und jeder Stern in starsystems.json hat jetzt ein neues Feld nameSourceCatalogKey, das angibt aus welchem Katalog der aktuell angezeigte Name stammt.
- Das Alias-Label unter dem Systemtitel bezieht seine Einträge nun aus aliases.json statt aus dem (entfernten) aliasNames-Array in starsystems.json.
- aliasNames-Arrays aus starsystems.json entfernt (alle Daten sind vollständig in aliases.json).
- Drei NEA-Repräsentanten eingetragen (starsystems.json): Aten (2062), Apollo (1862) und Amor (1221) als Namensgeber und Platzhalter ihrer jeweiligen Asteroidengruppen. Orbitale Elemente (Halbachse, Inklination, LAN, Umlaufzeit) nach JPL/NASA-Daten; Zusammensetzung für alle drei als S-Typ (silikatisch-steinig). starsystems.json Zeilenumbrüche aus V12.58 ebenfalls wiederhergestellt.
- Retrograde Monde korrigiert (starsystems.json): Carme, Sinope, Caliban, Halimede und Psamathe kreisen jetzt korrekt retrograd um ihre Planeten. Ursache war ein negatives Vorzeichen bei der Umlaufzeit, das die Drehrichtung umkehrte – obwohl die Bahnneigung (inc) bereits retrograd war.
- Hale-Bopp Cap vereinfacht (animate.js, builder.js, starsystems.json): Cap gilt ausschließlich im Lin-Modus (maxLinDistAU=40 AU). Log-Modus bleibt vollständig unverändert — phase auf Original-Wert (2.8947) zurückgesetzt, maxLogDistAU entfernt.
- Hale-Bopp Positions-Cap für beide Modi (animate.js, builder.js, starsystems.json): Cap gilt jetzt für Log- und Lin-Modus getrennt über maxLogDistAU (Hale-Bopp: 10 AU) und maxLinDistAU (40 AU). Im Log-Modus sitzt der Komet damit nahe Perihel-Seite (~10 AU), im Lin-Modus bei ~40 AU. builder.js überträgt beide Felder auf das Komet-Objekt; animate.js wählt pro Frame den passenden Cap-Wert.
- Bugfix Hale-Bopp Position (animate.js, starsystems.json): Zwei Fehler behoben. (1) phase war als wahre Anomalie ν gesetzt, ellipticOrbitPos erwartet aber die mittlere Anomalie M — Komet landete bei ~351 AU statt 50.5 AU. phase korrigiert auf M=0.07690 (entspricht 50.5 AU). (2) Cap-Code rechnete mit cos(ν) statt der korrekten Kepler-Formel r=a*(1−e·cos(E)). Fix: Kepler-Iteration M→E pro Frame, Bisection (48 Schritte) findet M_cap bei dem r==maxLinDistAU — Komet sitzt exakt auf seiner Orbitlinie.
- Bugfix Hale-Bopp Lin-Modus Cap (animate.js): Statt einer künstlichen Positionsverschiebung wird jetzt c.angle direkt angepasst – wenn die Distanz in AU den maxLinDistAU-Wert überschreitet, wird der Winkel auf den Wert gesetzt bei dem r == maxLinDistAU. Der Komet bewegt sich damit immer exakt auf seiner echten Orbitlinie.
- Bugfix Hale-Bopp Lin-Modus Cap (animate.js): V12.52 subtrahierte fälschlich _sunPos vom Positionsvektor – ellipticOrbitPos() gibt Koordinaten bereits relativ zum Sonnenfokus (Ursprung 0,0,0) aus, kein Offset nötig. Fix: position.length() direkt als Abstandsmaß, multiplyScalar() für den Cap auf der korrekten Orbitlinie.
- Bugfix Hale-Bopp Lin-Modus Cap (animate.js): V12.51 maß den Abstand vom Weltkoordinatenursprung (0,0,0) statt von der Sonnenposition (Fokus der Ellipse) – der Komet landete dadurch abseits seiner Orbitlinie. Fix: Abstandsmessung und Richtungsvektor relativ zu _sunPos (Primärstern-Position).
- Bugfix Hale-Bopp Lin-Modus Cap (animate.js, builder.js): V12.50 cappte nur die initiale Startposition im Konstruktor, nicht die laufende Animation. Der Cap greift jetzt in animate.js pro Frame: nach ellipticOrbitPos() wird die Weltposition im Lin-Modus auf visDist(AU(maxLinDistAU)) begrenzt (Richtungsvektor bleibt erhalten). builder.js überträgt _maxLinDistAU aus den JSON-Daten auf das Komet-Objekt. Im Log-Modus keine Wirkung.
- Hale-Bopp im Lin-Modus sichtbar (builder.js, starsystems.json): Im linearen Modus wird die Startposition von Kometen auf maxLinDistAU begrenzt (Hale-Bopp: 40 AU), sodass der Komet beim Laden im sichtbaren Bereich bleibt. Die echte Orbitphase (50.5 AU, 165.85°) und der vollständige Orbit werden nicht verändert — nur die initiale Darstellungsposition ist gecappt. Im Log-Modus bleibt alles unverändert. Das Feld maxLinDistAU ist für beliebige Kometen nutzbar; fehlt es, greift ein automatischer Fallback auf min(aphelionAU, 50 AU).
- Hale-Bopp Startposition fixiert (starsystems.json, builder.js): Komet startet jetzt an seiner tatsächlichen Position im September 2026 (~50.5 AU, wahre Anomalie 165.85°), statt an einem zufälligen Punkt auf dem Orbit. Damit bleibt er beim Laden im sichtbaren Bereich, ohne den wissenschaftlich korrekten Orbit zu verändern. builder.js: Kometen-Startwinkel nutzt cd.phase wenn vorhanden, sonst weiterhin zufällig (bisheriges Verhalten für Halley u.a.).
- Daten: Komet Hale-Bopp (C/1995 O1) im Sol-System hinzugefügt (starsystems.json). Orbitaldaten nach JPL/MPC (Epoch 2022-Sep-15): Exzentrizität 0.99498, Inklination 89.288°, Perihel 0.914 AU, Aphel 354 AU, Umlaufzeit 2399 Jahre (barycentrisch, nach Jupiter-Encounter 1996). Physik: Radius 30 km (NASA HST, Weaver et al. 1997), Masse 1.9×10¹⁴ kg, Rotation 11.35 h. Zusammensetzung nach Bockelée-Morvan et al. 2000 (A&A) und Biver et al. 1997 (Science): H₂O 75%, CO 12%, CO₂ 6%, CH₄ 1.5%, NH₃ 0.7%, C 3%, Andere 1.8%. Subkategorie: longperiod.
- Bugfix Musik wechselt beim Betreten des PlanetView (planetview.js): loadStarSystem() rief beim Enter ebenfalls immer audioOnSystemChanged() auf und überschrieb den laufenden Planet-Track mit der System-Musik. Fix: loadStarSystem(PV_SYNTH_ID) wird jetzt ebenfalls mit suppressAudioOnLoad geklammert; im nachfolgenden requestAnimationFrame wird der Objekt-Track explizit per audioOnObjectFocused() mit dem originalen System-Key gesetzt.
- Bugfix Musik wechselt beim Verlassen des PlanetView (planetview.js / astroviewer.html): loadStarSystem() rief beim Exit immer audioOnSystemChanged() auf und überschrieb so den Planet-Track mit der System-Musik, obwohl der Planet weiterhin fokussiert blieb. Fix: loadStarSystem() wird beim PlanetView-Exit mit suppressAudioOnLoad aufgerufen; danach wird der korrekte Objekt-Track explizit per audioOnObjectFocused() wiederhergestellt.
- Bugfix Label springt im Compare-Modus (compare.js): wenn ein Objekt hinter der Kamera liegt (NDC z > 1), kehren sich die projizierten Koordinaten um – das Panel erschien an einer gespiegelten, falschen Position. Fix: panelSmall/panelBig werden versteckt wenn das Objekt nicht im Sichtfeld ist (vCmp.z > 1).
- Bugfix Distanzregler trennt GLTF-Modell vom Schweif (compare.js): GLTF-Objekte (Halley, Asteroiden) wurden direkt zur Szene hinzugefügt statt als Kind von pivot. Der Distanzregler bewegte nur pivot (und damit die Schweife/Atmosphären), nicht das GLTF-Mesh. Fix: gPivot.position=(0,0,0) und pivot.add(gPivot) – pivot trägt den x-Offset, alles bewegt sich gemeinsam.
- Compare: MAX_VISUAL_R auf 1200 erhöht (compare.js): 100:1 Darstellungsverhältnis möglich, camDist ≈ 7600 – stabil auch mit Sirius A als größtem Objekt.
- Bugfix Vertikale Linie auf Stern im Compare (compare.js): Plasma-Oberflächenshader verwendete UV-Koordinaten der SphereGeometry – diese haben eine Naht bei u=0/1 (Längengrad 0°/360°). Fix: 3D-Noise auf normalisierter Vertex-Position (nahtlos, keine Diskontinuität möglich). Shader von 2D-fbm auf 3D-fbm umgestellt.
- Compare-Modus: MAX_VISUAL_R=800 Cap auf das große Objekt (compare.js): rBig wird auf max. 800 Szeneneinheiten begrenzt. Halley (6km) vs. Sonne (696.000km) hatte bisher rBig=1.392.000 und camDist=8.8 Millionen – damit war der Focus-Klick außerhalb jeder Szenengrenze. Jetzt camDist ≈ 5000, Zoom=8 reicht um Halley zu erreichen. Alle dynamischen Zoom/Lerp-Experimente aus V12.38–41 entfernt, alles zurück auf Original-Logik.
- Bugfix Compare-Focus-Zoom (compare.js): lineares Lerp auf Zoom-Werte von 4000+ addierte 320+ Einheiten pro Frame → Kamera teleportierte ins Leere. Zoom-Interpolation jetzt logarithmisch (exp/log): von Zoom 1 auf 4000 läuft der Schritt von 1→1.085→1.177→... statt 1→321→961. Sanfte, stabile Animation auch bei extremen Größenunterschieden.
- Bugfix Compare-Focus-Zoom (compare.js): CMP_FOCUS_ZOOM_SMALL=CMP_ZOOM_MAX aus V12.39 konnte 800+ sein – der Lerp addierte im ersten Frame ~80 Zoom-Einheiten, die Kamera schoss durch alles durch. Fix: CMP_FOCUS_ZOOM_SMALL berechnet aus der Distanz bei der das kleine Objekt ~40px groß erscheint, begrenzt auf CMP_ZOOM_MAX. Lerp-Speed auf sanftes 0.08 zurückgesetzt.
- Focus auf kleines Objekt im Compare-Modus (compare.js): Klick auf das Panel des kleinen Objekts zoomt jetzt auf CMP_ZOOM_MAX (statt fest 3×), sodass Pallas, Halley und Co. direkt auf maximale Auflösung gezoomt werden. Lerp-Speed adaptiv: bei großem Zoom-Unterschied (>50) wird schneller interpoliert damit der Zoom nicht gefühlt ewig dauert.
- Dynamischer Max-Zoom im Compare-Modus (compare.js): bei extremen Größenunterschieden (z.B. Pallas 256km vs. Sonne) war Max-Zoom=8 viel zu wenig – das kleine Objekt war <1px groß und unsichtbar. CMP_ZOOM_MAX wird jetzt so berechnet dass das kleine Objekt bei maximaler Annäherung mindestens 30px Bildschirmgröße hat. Gilt für Mausrad, Pinch-Zoom und Zoom-Regler.
- Bugfix Stern-Artefakte im Compare-Modus (compare.js): logarithmicDepthBuffer:true im Compare-Renderer aktiviert. Verteilt Depth-Buffer-Präzision logarithmisch statt linear – die einzig robuste Lösung bei extremen Größenunterschieden wie Halley (6km) vs. Sonne (696.000km), wo near/far-Verhältnis und Float-Präzision zwangsläufig Z-Fighting erzeugen.
- Bugfix Halley weiße Kugel im Compare (compare.js): Schweif-Partikel hatten bei rBig=1.4Mio eine berechnete Größe von ~9600 Einheiten und überdeckten den Kometen komplett. Partikelgröße jetzt auf max. r×2.0 (Ion) / r×1.4 (Staub) begrenzt, relativ zum visuellen Radius des Kometen.
- Bugfix Stern-Artefakte im Compare-Modus, richtiger Fix (compare.js): depthTest:false auf dem Plasma-Oberflächenshader gesetzt. Der Shader ist ein additiver transparenter Overlay – er braucht keinen Depth-Test, muss also nie gegen den Basis-Mesh prüfen. polygonOffset-Ansatz aus V12.35 rückgängig gemacht, da unwirksam gegen dieses Muster.
- Bugfix Stern-Artefakte im Compare-Modus, 3. Versuch (compare.js): near/far auf Original (1/1e9) zurückgesetzt – near=0.001 aus V12.34 brach Objekte im Nahbereich (Halley nur weißer Punkt, Stern transparent). Lösung jetzt rein über Render-Reihenfolge: polygonOffset auf Stern-Basis-Mesh + renderOrder=1 auf Plasma-Shader-Mesh, sodass der Shader garantiert nach dem Basis-Mesh gezeichnet wird und kein Z-Fighting entsteht.
- Bugfix Stern-Artefakte im Compare-Modus, 2. Versuch (compare.js): dynamisches near/far aus V12.33 rückgängig gemacht (verschlechterte das Problem). Stattdessen near=0.001/far=1e6 (Verhältnis 1:10⁹ → 1:10⁶, deutlich besser für 24-bit Depth-Buffer) und polygonOffset auf dem Stern-Basis-Mesh (Factor/Units=2), damit der Plasma-Shader nie Z-Fighting mit der darunterliegenden Kugel verursacht.
- Bugfix Stern-Oberflächen-Artefakte im Compare-Modus (compare.js): Bei Vergleich Stern vs. sehr kleines Objekt (Komet, kleiner Mond) entstand Z-Fighting auf der Sternoberfläche. Ursache: fixed near=1 / far=1e9 ergibt ein Verhältnis von 1 Milliarde – bei 24-bit Depth-Buffer ist die Tiefenauflösung nahe dem Stern nahezu null. Fix: near und far werden jetzt dynamisch aus den Objektradien und der aktuellen Kameradistanz berechnet (initial und pro Frame beim Zoom).
- Schweif-Partikelgröße korrigiert (animate.js, builder.js, compare.js): Faktoren in V12.31 waren um Faktor ~10 zu groß, Schweife erschienen als riesige weiße Blob-Wolken. Basisgröße auf 2.5 (Ion) / 1.8 (Staub), distCam-Faktor auf 0.006 / 0.004 reduziert. Compare-Modus verwendet dieselbe Formel mit der dortigen Kameradistanz (einmalig beim Aufbau), sizeAttenuation:true in beiden Modi.
- Schweif-Partikelgröße kameraadaptiv (animate.js, builder.js): sizeAttenuation:true zurück, aber size wird pro Frame dynamisch geclampft: max(Basis, Kameradistanz × Faktor). Damit bleiben Partikel nah dran nicht riesig und weit weg nicht winzig. Ion-Schweif größer/diffuser als Staubschweif (Plasma-Gas erscheint wolkiger).
- Bugfix Schweif-Größe log/lin (animate.js): lenFactor wurde aus der visuellen Szenen-Distanz berechnet – im Lin-Modus ist Halley 20× weiter weg, die Schweif-Fläche schrumpfte auf nahezu null. Jetzt physikalische AU-Distanz per Keplerformel (aus _periAU + ecc + angle) – modusunabhängig korrekt in log und lin.
- Bugfix Schweif unsichtbar im Compare-Modus (compare.js): Partikel wurden mit lokalem Offset (0,0,0) zur Szene hinzugefügt, der x-Versatz des Objekts fehlte. Schweife werden jetzt als Kinder des pivot erstellt und erben automatisch die korrekte Position.
- Bugfix Schweif-Rechtecke im Lin-Modus (builder.js): sizeAttenuation auf false gesetzt – Partikelgröße ist jetzt eine feste Pixelgröße (4px Ion, 5px Staub) unabhängig von Kameradistanz und Modus. Im Lin-Modus war Halley zu weit entfernt, sodass Partikel auf unter 1px schrumpften und als GPU-Quads gerendert wurden.
- Bugfix Schweif unsichtbar im Compare-Modus (compare.js): selbes Problem – sizeAttenuation false + absolute Pixelgröße (4px/5px) statt relativer Größe r*0.5/r*0.65, die bei Compare-Kameradistanz zu klein wurde.
- Bugfix Staubschweif dreht beim Hover (animate.js): _tailTangent wird nur bei merklicher Bewegung (moved > 0.001) aktualisiert. Bei Hover/Slowmo bleibt die zuletzt gültige Flugrichtung erhalten statt eines Fallback-Kreuzprodukts, das bei Halleys retrograder Bahn (inc ~162°) in die entgegengesetzte Richtung zeigt.
- Bugfix Schweif Lin-Modus leuchtende Kugel (animate.js, builder.js): Dynamisches size-Skalieren entfernt – sizeAttenuation:true kompensiert Kameradistanz bereits korrekt. Feste Partikelgröße auf 3.5/4.5 erhöht damit keine Subpixel-Quadrate entstehen.
- Bugfix Schweif Compare-Modus unsichtbar (compare.js): Schweif-Block lag im else-Zweig (kein GLTF) – bei Halley mit GLTF-Modell wurde er nie ausgeführt. Block außerhalb if/else verschoben, greift jetzt für alle Kometen unabhängig vom Mesh-Typ.
- Bugfix Schweif-Quadrate im Lin-Modus (animate.js): Im Lin-Modus ist distToSun ~20× größer, sizeAttenuation:true schrumpft Partikel auf Subpixel → GPU rendert 1×1-Quads. Fix: size pro Frame dynamisch skaliert mit sqrt(distToSun/TAIL_FULL_DIST).
- Komet-Schweife im Compare-Modus (compare.js): Ion- und Staubschweif werden statisch beim Szenenaufbau erzeugt. Richtung klassisch schräg (keine echte Sonne vorhanden), Länge proportional zum visuellen Radius. Analog zu Atmosphären und Sternglows.
- Bugfix Schweif verschwindet beim Zoom (builder.js, animate.js): frustumCulled=false auf beiden Schweif-Objekten; BoundingSphere/BoundingBox werden pro Frame invalidiert. Three.js berechnete die Bounding-Volumes beim Origin (0,0,0) und schnitt den Schweif per Frustum-Culling weg sobald der Komet weit entfernt war.
- Staubschweif-Biegung korrigiert (animate.js): Krümmungs-Richtung war symmetrisch (beide Seiten). Fix: Tangente zeigt in Flugrichtung, Staubschweif biegt sich konsequent entgegen (negierter Tangenten-Faktor). t²-Gewichtung damit Schweif nah am Kern noch gerade ist.
- Schweif-Länge reduziert (animate.js): ION_MAX_LEN 320→55, DUST_MAX_LEN 220→38, TAIL_FULL_DIST 120→100. War im log-Modus viel zu lang (quer durchs Sonnensystem).
- Startbreite am Kern (animate.js): Partikel beginnen nicht mehr am Punkt, sondern fächern vom Kometenkern (proportional zu c.r) auf.
- .clone() im Partikel-Loop durch addScaledVector() ersetzt (animate.js): kein GC-Druck mehr durch temporäre Vektoren pro Partikel.
- Kometen-Schweife (builder.js, animate.js): Ion- und Staubschweif als THREE.Points-Systeme implementiert. Ion-Schweif (bläulich, schmal, gerade) zeigt exakt von der Sonne weg; Staubschweif (beige, breiter) krümmt sich leicht entlang der Orbitaltangente. Länge skaliert mit sqrt(Perihelion/Distanz) – nahe der Sonne lang, weit draußen kaum sichtbar. Partikel-Positionen werden pro Frame deterministisch neu berechnet (kein GC-Druck). Schweife werden beim Unload sauber entfernt.
- Chaotische Rotation für Kometen (builder.js, animate.js, halley_part.json): chaoticRotation-Flag analog zu Hyperion/Monde für Kometen implementiert. Im Komet-Loop in animate.js wird bei gesetztem Flag applyChaoticRotation() statt applyRotation() aufgerufen. Halley hat "chaoticRotation": true erhalten – seine taumelnde Präzession war schon 1986 durch Giotto-Messungen belegt.
- Bugfix Custom Model für Kometen im SystemView (builder.js): tryLoadModel-Aufruf fehlte im Komet-Builder-Block komplett. Ergänzt analog zum Planeten-Block: GLTF wird asynchron nachgeladen, Sphere-Mesh ersetzt, obj.mesh/pivot aktualisiert, ct.getPos auf newPivot umgebogen, Occluder-Cache invalidiert.
- Bugfix auFn not defined (builder.js): auFn war nur in snapshotAndRescaleDistances als lokale Variable definiert, nicht in loadStarSystem. Dort ergänzt.
- Bugfix Komet-Orbit log↔lin (builder.js): AU() in builder.js ist immer die Log-Formel – beim Orbit-Neubau in snapshotAndRescaleDistances und im initialen Aufbau wurde AU() statt des mode-sensitiven _ctx.auFn()/auFn() Delegates verwendet. Orbit blieb deshalb im Lin-Modus unverändert.
- PlanetView-Guard für Kometen (planetview.js): isComet und _isComet in isEligible-Check von updatePlanetViewBtnState() ergänzt; enterPlanetView() gibt früh zurück wenn Ziel ein Komet ist. Redundante Absicherung in astroviewer.html entfernt.
- Textur-Preload für Kometen (textures.js): comets-Block in initPreload() ergänzt analog zu dwarfs/asteroids. Kommentar in loadTexture() präzisiert: Kometen erhalten kein prozedurales Fallback, sondern behalten ihre Grundfarbe.
- Bugfix Komet-Label nie sichtbar (labels.js): Der log-komprimierte Sternradius (~40 Einheiten) erzeugte beim Occluder-Check für nahe Kometen (Halley am Perihel) einen Screen-Radius von mehreren Hundert Pixeln und versteckte das Label dauerhaft. Fix: Sternradius im Occluder-Cache auf 20 Einheiten gekappt – reicht für Stern-hinter-Stern-Occlusion, verhindert aber das Verstecken von Labels naher Objekte.
- Bugfix Komet-Orbit bei log↔lin-Umschaltung (builder.js): Der elliptische Orbit wurde nicht neu gebaut weil periVis/apheVis sich mit dem lin-Faktor ändern. Fix: Orbit-Neubau analog zu Mond-Orbits in snapshotAndRescaleDistances; Roh-AU-Werte (_periAU, _apheAU) werden im obj gespeichert.
- Bugfix PlanetView für Kometen (astroviewer.html): _enterPlanetView hatte keinen Guard für isComet – Halley konnte den PlanetView starten und wurde doppelt gerendert (einmal als weißes Objekt, einmal mit generierter Textur). Fix: früher Return wenn tgt.isComet; PlanetView-Button wird bei fokussiertem Kometen deaktiviert.
- Bugfix Komet-Orbit Leak ins Overview (init.js): getCometObjects/setCometObjects fehlten im registerBuilderContext-Block – unloadCurrentSystem() bekam immer ein leeres Array zurück und konnte den Orbit nie aus der Szene entfernen. Fix: beide Getter/Setter analog zu getAsteroidObjects/setAsteroidObjects ergänzt.
- Bugfix getDIM_COMET not a function (builder.js, init.js): getDIM_COMET fehlte im _ctx-Default von builder.js und wurde in init.js weder deklariert noch an den Builder-Context weitergereicht. Ergänzt analog zu getDIM_AST / getDIM_DWARF.
- Bugfix Komet-Position (builder.js): periAU/apheAU sind echte AU-Werte und müssen zuerst durch AU() in Log-Szeneneinheiten konvertiert werden – visDist(periAU) war falsch (visDist erwartet bereits konvertierte Einheiten). Fix: visDist(AU(periAU)) / visDist(AU(apheAU)). Damit liegt der Orbit korrekt im Raum statt in der Sonne.
- Bugfix Komet startet in der Sonne (builder.js): Keine initiale Positionssetzung nach Objekt-Erstellung – Pivot und HitMesh standen bei (0,0,0). Fix: ellipticOrbitPos() mit dem gecachten Startwinkel aufrufen, analog zur Planeten-Initialisierung.
- Aufräumen hardcodierte Fallbacks (builder.js): CAT.comet-Fallback-Objekte ({ scaleKm, minR, scaleFactorLin }), HIT_MULT.comet-Fallback (|| 5) und DIM_COMET-Fallback entfernt. Werte kommen ausschließlich aus categories.json, wie bei allen anderen Kategorien.
- Fundamentaler Komet-Refactor (builder.js, animate.js, labels.js): Komet-Aufbau und -Loop vollständig auf identisches Pattern wie einfacher Dwarf umgestellt. applyAxisTilt() für Pivot, scene.add(pivot) und scene.add(ol) wie alle anderen Objekte, _applyNewRadius in snapshotAndRescaleDistances ergänzt. Alle Sonderwege (eigener _auFn-Closure, manuelle pivot-Group, initiale Positionssetzung, _skipOcclude-Flag) entfernt. Label-Loop wie Dwarf: positionLabel vor angle-update, damit Frame-N-1-Position verwendet wird – exakt dasselbe wie alle anderen Objekte.
- Bugfix Orbit-Leak (builder.js): scene.remove() schlug lautlos fehl wenn das zu entfernende Objekt nicht direktes Kind der Scene war. Fix: Robustes Entfernen via m.parent.remove(m) statt scene.remove(m) in snap.forEach und moonObjs – entfernt das Objekt immer aus seinem tatsächlichen Parent.
- Bugfix Komet-Label (builder.js, labels.js): Occluder-Check in positionLabel() blendete Komet-Labels aus weil die visuell übergroßen Stern-Radien (log-komprimiert) einen zu großen Screen-Radius ergaben. Lösung: _skipOcclude-Flag auf Komet-Label-Elementen; allgemeiner Occluder-Bypass-Mechanismus in positionLabel() für zukünftige Nutzung.
- Fundamentaler Refactor Komet-Struktur (builder.js, animate.js, labels.js, constellations.js): Kometen hatten pivot:null – Mesh und Orbit-Linie wurden direkt zur Szene hinzugefügt ohne gemeinsamen Pivot. scene.remove() für die Orbit-Linie schlug unter bestimmten Bedingungen lautlos fehl, was zu persistenten Orbit-Leaks über Systemwechsel, Overview und PlanetView führte. Fix: Komet-Mesh wird jetzt in eine Pivot-Group eingebettet (wie Planeten/Dwarfs). animate.js, labels.js und constellations.js auf pivot.position umgestellt.
- Bugfix Komet-Winkel (builder.js): _saveAnglesToCache() speicherte Kometen-Winkel nicht – nach log/lin-Wechsel startete Halley immer bei angle=0. Komet-Block analog zu Asteroiden ergänzt.
- Bugfix isComet in actions.js (actions.js): _applyOrbitHighlight() und getBRIGHT_COMET-Getter wurden durch Upload überschrieben und wiederhergestellt.
- Bugfix Komet-Label sichtbar (labels.js): Kometen fehlten im Occluder-Cache von labels.js – der Cache wurde aufgebaut ohne getCometObjects, sodass Kometen selbst nie als Occluder eingetragen wurden und positionLabel die Mesh-Position nicht korrekt bewerten konnte. Komet-Block analog zu Asteroiden ergänzt.
- Bugfix Occlusion Konstellationen bei Kometen (labels.js): Selbe Ursache wie oben – Kometen-Mesh verdeckt nun korrekt Konstellations- und Stern-Labels.
- Bugfix Konstellations-Labels im Surface-Mode (constellations.js, astroviewer.html): Labels unter dem Planetenhorizont wurden nicht ausgeblendet. getSurfaceMode/getSurfaceNormal in _ctx-Defaults und registerConstellationsContext ergänzt; Horizont-Check in _pos() eingefügt (worldPos·surfaceNormal < 0 → ausblenden).
- Bugfix Komet-Label fehlt (animate.js): positionLabel() wurde vor ellipticOrbitPos() aufgerufen – das Label wurde an Position (0,0,0) bewertet und vom Occluder der Sonne verborgen. Fix: Reihenfolge getauscht, Label erst nach Positions-Update gesetzt.
- Bugfix Occlusion Konstellation/Sterne (constellations.js): Kometen fehlten im Occluder-Cache – sie konnten Konstellations- und Stern-Labels nicht verdecken. Komet-Objekte in _buildOccCache() ergänzt.
- Bugfix Komet-Orbit blau bei Fokus nach log/lin-Umschaltung (actions.js, astroviewer.html): _applyOrbitHighlight() hatte keinen isComet-Zweig und nutzte BRIGHT_ORBIT (blau). BRIGHT_COMET eingeführt, in Deklaration, Initialisierung (_initFromData), Fokus-Block (setFocus) und buildActionsContext registriert.
- Bugfix fehlerhafter Orbit-Rebuild aus V12.12 (builder.js): snapshotAndRescaleDistances() enthielt Komet-Orbit-Neubau-Code der Orbit-Leaks und den Halley-im-PlanetView-Bug verursachte. Code entfernt – der Orbit wird korrekt durch unloadCurrentSystem()+loadStarSystem() neu gebaut.
- Bugfix Halley im PlanetView (planetview.js): comets:[] explizit im synthetischen System deklariert.
- Bugfix Komet-Textur im Compare-Modus (compare.js): _cmpCategory fehlte _isComet-Zweig – Kometen wurden als 'planet' behandelt und erhielten eine generierte Exoplaneten-Textur. Fix: Kategorie 'comet' korrekt weitergegeben; makeMaterial nutzt pd.color statt Textur-Lookup.
- Bugfix Komet-Label fehlt (init.js): getCometObjects fehlte im registerLabelsContext-Aufruf – der Occluder-Cache wurde ohne Kometen aufgebaut, Labels wurden daher nie korrekt positioniert und blieben verborgen.
- Bugfix Komet-Orbit bei log/lin-Umschaltung (builder.js): snapshotAndRescaleDistances baute den elliptischen Orbit nicht neu – der alte Orbit blieb sichtbar und ein zweiter wurde hinzugefügt. Fix: Kometen-Orbitlinien werden bei Distanzneuskalierung aus der Szene entfernt und mit korrekten periVis/apheVis-Werten neu erzeugt.
- Bugfix Compare-Panel Komet (compare.js): _cmpFmtCategory zeigte „Planet" statt „Komet"; _cmpFmtType zeigte englischen Rohdaten-Key statt lokalisierter Subkategorie. Beide Funktionen um _isComet-Zweig mit val.comet bzw. comet.subcat.*-I18N-Lookup ergänzt.
- Bugfix Halley im Sonnenzentrum (builder.js): Mesh und HitSphere werden jetzt direkt nach dem Aufbau via ellipticOrbitPos() an die korrekte Orbital-Position gesetzt – vorher stand das Mesh bis zum ersten animate()-Frame bei (0,0,0). ellipticOrbitPos zu den builder.js-Imports hinzugefügt.
- Bugfix Listpanel Doppeleintrag (listpanel.js): Kometen wurden in der Planetenliste angezeigt, weil der Planeten-Filter !t.isComet nicht enthielt. Fix: !t.isComet in den Planeten-Filter aufgenommen.
- Bugfix Orbit-Farbe (builder.js): DIM_COMET innerhalb des Comet-Map-Blocks entfernt – korrekte Variable aus dem loadStarSystem-Scope wird jetzt verwendet.
- Robustheit: defensive Checks für undefined/NaN in periVis/apheVis; inc/lan mit || 0 abgesichert.
- Versionsnummer in astroviewer.html auf V12.09 nachgezogen (war seit V12.05 nicht mehr aktualisiert worden).
- Komet-Orbitfarben überarbeitet (categories.json): Blautöne durch dezentes Rotbraun ersetzt (orbitColor 0x9B4E2A, DimMobile 0x5C2A14, DimDesktop 0x2E1509) – passend zum zurückhaltenden Farbschema der übrigen Objekte.
- Bugfix Orbit durch Sonne (builder.js): Die logarithmische Skala komprimiert Distanzen nicht-linear – eine direkte Nutzung von visDist(a)×ecc liefert einen visuell falschen Perihel-Abstand (zu nahe/innerhalb der Sonne). Fix: Perihel und Aphel werden separat via visDist() transformiert, daraus wird eine visuelle Semimajore a_vis und Exzentrizität ecc_vis berechnet. Halley: a_vis≈338, ecc_vis≈0.505, Perihel bei ~167 vis.u. (klar außerhalb der Sonne).
- Bugfix Halley-Mesh schwarz/unsichtbar (builder.js, starsystems.json): Farbe auf helles Blaugrau (0xA0A8B0) angehoben; minLight-Uniform auf 0.25 gesetzt damit der Kern ohne eigenes PointLight sichtbar bleibt.
- DIM_COMET korrekt im loadStarSystem-Scope aus Context gelesen (builder.js). snapshotAndRescaleDistances sichert _rawPeriAU/_rawApheAU für Kometen.
- Bugfix: Halley war unsichtbar, weil snapshotAndRescaleDistances() das comets-Array nicht verarbeitete. Alle dist-Werte blieben in rohen AU statt in visuelle Szeneneinheiten (AU_LOG) umgerechnet zu werden – der Orbit hatte damit ca. 1/20 der korrekten Größe und lag unsichtbar im Inneren der Sonne. Fix: comets-Schleife analog zu planets/asteroids/dwarfs ergänzt.
- Listenpanel (listpanel.js): Kometen werden jetzt in einer eigenen Gruppe „Kometen" aufgelistet (mit ☄-Icon) und können per Doppelklick fokussiert werden wie alle anderen Objekte.
- Orbit-Dimming und -Highlight (astroviewer.html): isComet in resetOrbitColors() und im Fokus-Block ergänzt. DIM_COMET und BRIGHT_COMET korrekt aus categories.json initialisiert. Variable DIM_COMET deklariert und getDIM_COMET() im Builder-Context registriert.
- I18N: Schlüssel list.comets (DE: „Kometen", EN: „Comets") in languages.json ergänzt.
- Bugfix: „S is not defined" beim Betreten des Sol-Systems (builder.js): Im Komet-Build-Block wurde fälschlicherweise S._isMobile verwendet – S ist in builder.js nicht importiert. Ersetzt durch HIT_MULT.comet analog zu allen anderen Objekttypen.
- Bugfix: HIT_MULT-Aufbau in astroviewer.html um 'comet' erweitert; vorher fehlte der Key, was zu HIT_MULT.comet = undefined führte. Defensive Absicherung für den Fall dass eine Kategorie keinen hitMult-Eintrag hat.
- Bugfix: Komet-Animations-Loop (animate.js) liest period nun direkt aus dem Laufzeit-Objekt c.period statt aus sys.comets[i].period – verhindert Crash in Systemen ohne comets-Array.
- Fix: starsystems.json wieder mit Einrückung (indent 2) geschrieben – war durch vorherigen Schreibvorgang auf eine Zeile komprimiert worden.
- Komet Halley im Sol-System ergänzt (starsystems.json): erster Komet in der App, basierend auf NASA/JPL-Daten (Semimajore Achse 17,834 AU, Exzentrizität 0,96714, Inklination 162,26°, Umlaufzeit 75,32 Jahre, Kernradius ~5,5 km, Perihelion 0,586 AU / Aphel 35,08 AU, retrograder Orbit). Darstellung als Platzhalter-Geosphäre mit eisblauem Label, elliptischem Orbit und Namenslabel. Infopanel1 zeigt kometenspezifische Felder (Typ, Exzentrizität, Perihel, Aphel, Entdeckungsjahr); Panel 2/3 (Materie, Atmosphäre) unverändert übernommen.
- Neue Infrastruktur für Kometen: cometObjects-Array in state.js, Komet-Build-Block in builder.js (makeEllipticOrbitLine, _isComet-Flag), Komet-Animations-Loop in animate.js (ellipticOrbitPos für korrekte Kepler-Ellipse), Komet-Panel1-Block in panels.js, neue I18N-Keys in languages.json (val.comet, comet.subcat.*, info.eccentricity, info.perihelion, info.aphelion, info.discovered). Context-Registrierungen in astroviewer.html für Builder, Animate und Occlusion-Check erweitert.
- Neue Objektkategorie „Komet" in categories.json ergänzt (Key: comet, LabelType: c, eisblau). Drei Unterkategorien: Kurzperiodisch (Umlaufzeit < 200 Jahre, z. B. Halley), Langperiodisch (> 200 Jahre, z. B. Hale-Bopp) und Nicht-periodisch (hyperbolische/parabolische Bahnen, z. B. Borisov). Grundlage für künftige Komet-Darstellung in der App.
- Konstellations-Lokalisierung bereinigt (constellations.json, languages.json): Die lokalisierten Namen (name.de / name.en) wurden aus allen 88 Einträgen in constellations.json entfernt – sie waren redundant, da der Code sie nicht liest und alle Namen bereits vollständig in languages.json als constellation.<key> erfasst sind. Zusätzlich wurden 8 EN-Keys in languages.json entfernt, deren Wert identisch mit dem deutschen Begriff ist (Andromeda, Ara/Altar, Eridanus, Indus, Orion, Pegasus, Perseus, Sextant) – laut Lokalisierungskonzept werden EN-Keys nur erfasst wenn sie vom deutschen Fallback abweichen.
- Hyperion Taumeln-Neuimplementierung (utils.js): Quaternion-Akkumulator komplett entfernt. Dieser war die Ursache aller verbliebenen Probleme: Textur-Sprünge bei Pause, Flimmern an den Rändern und gelegentliches "Auseinanderscheren" entstanden durch den Euler↔Quaternion-Sync-Konflikt in Three.js. Neuer Ansatz: drei Euler-Winkel (rx, ry, rz) werden pro Frame direkt inkrementell aufaddiert – identisch zu applyRotation, nur auf alle drei Achsen. Die Winkelgeschwindigkeit jeder Achse ist eine Überlagerung irrational-frequenter Sinus-Wellen (nie periodisch), multipliziert mit baseRate. Damit wirkt der Achsenrotations-Regler linear und direkt.
- Hyperion Taumeln-Fix: Geschwindigkeitsregler und Gleichmäßigkeit (utils.js): Die ω-Vektoren wurden als Geschwindigkeit × Richtung genutzt, wodurch unkontrollierter Drift entstand und der Regler kaum Wirkung hatte. Neuer Ansatz: ω wird nur noch als Richtungsvektor benutzt (normiert auf Länge 1). Die tatsächliche Drehgeschwindigkeit kommt ausschließlich aus baseRate (identisch zu applyRotation) – der Achsenrotations-Regler wirkt damit direkt und korrekt. Die Achse selbst wandert weiterhin kontinuierlich per überlagerter Sinus-Wellen, bleibt aber durch sanfte Dämpfung stabil.
- Hyperion Taumeln-Überarbeitung (utils.js): Der bisherige Achsenwechsel-Ansatz erzeugte abrupte Richtungsumkehrungen, weil bei jeder vollen Umdrehung eine neue Achse gesetzt und der Winkel auf 0 zurückgesetzt wurde. Komplett neu implementiert: drei unabhängige Winkelgeschwindigkeiten (ωx, ωy, ωz) die sich pro Frame durch überlagerte Sinus-Wellen mit irrationalen Frequenzen kontinuierlich und sanft ändern (nie periodisch). Ein Tiefpassfilter verhindert unbegrenzten Drift. Die Rotation wird als kumulatives Quaternion-Produkt aufgebaut – kein Achsenwechsel, keine Richtungsumkehr, flüssiges organisches Taumeln.
- Hyperion Verformungs-Fix 3 (utils.js, animate.js): Hyperion hat kein eigenes GLB-Modell, sondern eine normale Sphere. Die chaotische Rotation wurde fälschlicherweise auf den Pivot angewandt, der durch die Orbitposition und die axisTilt-Rotation bereits eine eigene Transformation trägt – das erzeugte bei bestimmten Kamerawinkeln den Quetsch-/Streck-Effekt. Fix: Rotation läuft wieder auf dem Mesh selbst. Der axisTilt (mesh.rotation.z) wird dabei als separate Quaternion-Multiplikation eingerechnet, damit er nicht verloren geht. Zusätzlich wird das Quaternion nach jeder Anwendung normalisiert um numerischen Drift zu verhindern.
- Hyperion Verformungs-Fix 2 (models.js): Der Quetsch-Effekt bestand weiterhin. Eigentliche Ursache: die GLTF-Zentrierung verschob die innere Modell-Group per position-Offset vom Ursprung weg. Beim Rotieren des Pivots drehte sich diese versetzte Group um einen falschen Mittelpunkt → sichtbare Taumel- und Größenänderungsartefakte. Fix: der Zentrierungs-Offset wird jetzt direkt in die Geometrie eingebacken (geometry.translate()), sodass die Group-Origin exakt im geometrischen Schwerpunkt liegt und der Pivot sauber um seinen eigenen Nullpunkt rotiert.
- Hyperion Verformungs-Fix (utils.js, animate.js, builder.js): Hyperion quetschte sich beim Taumeln zu einer elliptischen Form zusammen. Ursache: die chaotische Rotation wurde auf der inneren GLTF-Gruppe angewandt, die bereits eine BoundingBox-Skalierung trägt – Quaternion-Rotation auf einer skalierten Gruppe mit verschobener Origin erzeugt Verformungsartefakte. Fix: Rotation wird jetzt auf dem Pivot ausgeführt (wie axisTilt), nicht auf der inneren Mesh. Zusätzlich: Seed-Kopier-Bug beim GLTF-Austausch behoben (Seed wurde von bereits überschriebenem mo.mesh gelesen und war daher immer 0).
- Hyperion Achsenwechsel-Limit (utils.js): Die neue Rotationsachse nach jeder vollen Umdrehung wird jetzt auf maximal 120° Abweichung von der aktuellen Achse begrenzt. Vorher war ein Wechsel in fast genau entgegengesetzte Richtung möglich, was unnatürlich abrupt wirkte. Technisch: Gram-Schmidt-Kegel-Sampling – gleichverteilte Zufallsachse innerhalb eines 120°-Kegels um die aktuelle Achse.
- Hyperion Taumeln-Fix 2 (utils.js, animate.js): Vorige Implementierung war zu leise weil die Zeitbasis nicht an rotationPeriod gekoppelt war. Neuer Ansatz: Hyperion dreht sich normal um eine aktuelle Achse (identische Geschwindigkeitsformel wie alle anderen Monde, skaliert korrekt mit dem Achsenrotations-Regler). Nach jeder vollständigen Umdrehung wird die Rotationsachse per deterministischer Pseudozufallsfolge (Mulberry32) neu gesetzt – jede Umdrehung hat damit eine andere Orientierung. Rotation wird via Quaternion aufgebracht statt Euler-Winkeln, was Gimbal-Lock vermeidet.
- Phoebe/Pasiphae retrograder Orbit-Fix (starsystems.json): Beide Monde haben bereits inc>90° (Phoebe 175°, Pasiphae 156°) – der retrograde Orbit ist damit wie bei Triton über die Inklination kodiert. Das zusätzliche negative period war redundant und erzeugte durch doppelte Vorzeichenumkehr einen progradgradn Orbit. period jetzt positiv, Retrograd kommt allein durch die Inklination.
- Hyperion Taumeln-Fix (utils.js): Bisherige Implementierung setzte absolute Winkelwerte (sin-Wellen) – das erzeugte nur sanftes Schwingen (max ±140°), kein echtes Taumeln. Neue Implementierung: inkrementelle Winkelgeschwindigkeiten (ωx/ωy/ωz) aus überlagerten, irrational-frequenten Sinus-Wellen werden pro Frame aufaddiert → kumulative, nie-periodische Gesamtrotation auf allen drei Achsen. Skaliert korrekt mit dem Achsenrotations-Regler.
- Phoebe retrograder Orbit-Fix (animate.js): Monde mit negativer Umlaufzeit (period<0) liefen bisher prograd statt retrograd – durch doppelte Vorzeichenumkehr in der Winkelformel. Phoebe umkreist Saturn jetzt korrekt entgegen allen anderen Monden. Triton nutzt weiterhin hohe Inklination (inc≈π) für retrograden Orbit, was unverändert bleibt.
- Phoebe Panel (panels.js): "(retrograd)"-Label bei der Umlaufzeit entfernt – der retrograde Orbit ist durch das Verhalten sichtbar; ein Label dort wäre irreführend da es mit der Eigenrotation verwechselt werden könnte.
- Hyperion Taumeln-Fix (animate.js, utils.js): Chaotische Rotation war kaum sichtbar weil die Zeitbasis in Orbital-Jahren akkumuliert wurde. Neue _chaoticTime akkumuliert rotSpeed×Echtzeit-Sekunden – Taumeln ist jetzt bei allen Rotationsgeschwindigkeiten deutlich sichtbar und skaliert korrekt mit dem Achsenrotations-Regler.
- starsystems.json-Format wiederhergestellt: Datei war durch json.dump() auf eine Zeile komprimiert worden. Wird jetzt per exakter String-Ersetzung im Original-Text gepatcht – Einrückung, Zeilenumbrüche und e-Notation bleiben identisch zum Original.
- Phoebe Umlaufzeit-Anzeige (panels.js): Negative Umlaufzeiten (retrograder Orbit) werden nun korrekt als absoluter Wert mit dem Zusatz "(retrograd)" angezeigt – Phoebe zeigt z.B. "550.76 h (retrograd)" statt "-550.76 h". Die Eigenrotation von Phoebe ist davon unabhängig und bleibt positiv.
- Hyperion: chaotisches Taumeln (animate.js, utils.js, builder.js, starsystems.json): Neues Flag
chaoticRotation: true in den Daten. Statt einer gleichmäßigen Achsenrotation taumelt Hyperion nun auf allen drei Achsen über überlagerte, irrational-frequente Sinuswellen – kein periodischer Wiederholungszyklus im darstellbaren Zeitrahmen. Exzentrizität auf astronomisch korrekte 0.123 korrigiert. Im Infopanel erscheint "chaotisch taumelnd" / "chaotic tumbling" als Rotationswert.
- Surface-Mode Rotationsdämpfung (animate.js, utils.js): Bisher wurde beim Betreten des Surface-Mode die Rotation aller Objekte gedämpft. Nun wird ausschließlich das Objekt gebremst, auf dessen Oberfläche man steht – alle anderen Körper (Haumea, andere Monde etc.) drehen weiter mit ihrer normalen Geschwindigkeit.
- Dunklere Konstellationslinien (constellations.js): Linienfarbe von 0x22cc66 auf 0x18954a und Opacity von 0.50 auf 0.38 reduziert – dezenter im Hintergrund.
- Verzerrungshinweis im Konstellationsnamen (constellations.js, languages.json): Wenn ein Stern einer Konstellation von der aktuellen Beobachterposition aus um mehr als 5° von seiner Sol-Richtung abweicht, erscheint hinter dem Konstellationsnamen "(verzerrt)" bzw. "(distorted)". Schwellwert berechnet aus _maxDistortionDeg() über alle Sterne der Konstellation. Lokalisiert in DE/EN, wird bei Sprachwechsel sofort aktualisiert.
- Fade-Dashed-Linien für verzerrte Segmente (constellations.js): Liniensegmente deren Endpunkt um mehr als 3° verschoben ist, werden mit LineDashedMaterial in 3 Opacity-Stufen dargestellt (voll → halb gestrichelt → stark gestrichelt). Jede verzerrte Linie wird in 12 Segmente aufgeteilt und auf drei Buckets (opacity 0.28 / 0.15 / 0.06) verteilt, was einen visuellen Fade zur verschobenen Seite hin erzeugt.
- Crash-Fix (constellations.js): Occluder-Cache-Variablen (_occCache, _occFrameToken) und _buildOccCache() wurden beim Patch V11.91 versehentlich entfernt – Referenzfehler beim ersten Frame. Deklarationen wiederhergestellt.
- Rigil-Kentaurus-Label-Fix (constellations.js, astroviewer.html): Alpha-Stern-Labels wurden bisher nur für Neighbour-Stars unterdrückt, nicht für Sterne des aktuell aktiven Systems selbst. Neuer Getter getCurrentSystemStarRaDecs() liefert die RA/Dec aller Sterne des gerade geladenen Systems – damit erscheint z.B. das Rigil-Kentaurus-Label der Centaurus-Konstellation nicht mehr wenn man sich im Alpha-Centauri-System befindet.
- Echte 3D-Parallax für Sternbilder (constellations.js, constellations.json): Die neue constellations.json enthält Distanzangaben in Lichtjahren (distanceLy aus Hipparcos) für alle 848 Konstellationssterne. Die bisherige Näherungslösung (Skalierung auf Skydome-Radius) wurde durch exakte 3D-Vektorarithmetik ersetzt: Jeder Stern erhält seine wahre 3D-Position (RA/Dec/Dist von Sol), der Beobachter-Offset (aktuelles System in Lj) wird subtrahiert, und der Richtungsvektor wird auf den Skydome normiert. Ergebnis: Von Alpha Centauri aus ist Sirius um ~27° verschoben, nahe Sterne weichen deutlich ab, weit entfernte Sterne (<1°) bleiben praktisch stabil. Sterne am Beobachterort (z.B. Rigil Kentaurus bei Alpha Cen) werden aus Linien und Labels ausgeblendet.
- Konstellations-Toggle-Button-Fix 2 (astroviewer.html): Button hatte keinen Click-Handler – Verdrahtung direkt im HTML nachgetragen (toggleConstellations + classList.toggle). Button schaltet Konstellationen jetzt zuverlässig ein/aus und zeigt korrekt Highlight-Zustand.
- Occlusion-Check für Konstellations-Labels (constellations.js, astroviewer.html): Sternbild- und Alpha-Stern-Labels verschwinden nun hinter Planeten, Sternen und anderen Szene-Objekten. Analog zum bestehenden Occluder-System in labels.js: Occluder-Cache wird einmal pro Frame aufgebaut, Screen-Radien werden per FOV-Projektion berechnet. Konstellations-Labels haben leicht vergrößerten Screen-Radius (×1.2), da sie immer hinter allen Szene-Objekten liegen.
- Konstellations-Toggle-Button-Fix (astroviewer.html, actions.js, controls.js): Button in die erste Sichtbarkeits-Gruppe verschoben (Reihe mit Orbits/HZ), Default toggle-button-on (Konstellationen starten sichtbar). Action vereinfacht – direkter Funktionsaufruf statt doppeltem Getter-Indirekt-Aufruf der den Toggle blockierte.
- Doppel-Label-Unterdrückung für Alpha-Sterne (constellations.js, astroviewer.html): Alpha-/Hellsterne von Konstellationen (Rigil Kentaurus, Sirius, Procyon, Altair) die gleichzeitig Neighbour-Stars des aktuellen Systems sind, erhalten kein eigenes Konstellations-Stern-Label mehr. Der Neighbour-Star hat bereits seinen Namen – ein zweites Label an derselben Position wäre redundant. Die Liste der aktuellen Neighbour-RA/Dec wird per Context-Getter dynamisch zur Laufzeit abgefragt.
- Konstellations-Toggle-Button (astroviewer.html, controls.js, actions.js, languages.json): Neuer Button im Sichtbarkeits-Panel zum Ein-/Ausblenden der Sternbilder, nutzt das bestehende icon-constellation SVG. Lokalisiert als btn.constellations (DE/EN).
- Koordinaten-Fix (constellations.js): Die RA/Dec→XYZ-Formel war inkonsistent mit overview.js (_raDecDistToXYZ). Vorher: x=-cos(dec)·sin(ra), z=-cos(dec)·cos(ra) plus manueller Group-Rotation Y=+90°. Jetzt: x=cos(dec)·cos(ra), z=-cos(dec)·sin(ra) – identisch zu overview.js, keine Group-Rotation nötig. Damit liegen Konstellationssterne und Neighbour-Stars für dasselbe Objekt (z.B. Rigel Kentaurus) exakt auf derselben Sichtlinie.
- Parallax-Korrektur (constellations.js, astroviewer.html): Bei System-Wechsel wird setConstellationObserver(xyzLj) aufgerufen. Die Konstellationsgeometrie wird für den neuen Beobachterstandort neu berechnet (dir_apparent ≈ dir_sol·R − xyz_observer, normiert auf Skydome-Radius). Für Sterne ≥100 Lj ist der Versatz <1°; nahe Sterne wie Sirius (~8.6 Lj) verschieben sich von Alpha Centauri aus sichtbar (~27°), was physikalisch korrekt ist. Das Alpha-Centauri-System zeigt damit einen leicht modifizierten Sternenhimmel.
- Konstellations-Labels (constellations.js, animate.js, astroviewer.html): Jede Konstellation erhält ein dezentes Label im Schwerpunkt ihrer Sterne (grünlich, Kapitälchenoptik). Zusätzlich trägt der Alpha-Stern (bzw. der hellste Stern) jeder Konstellation seinen Eigennamen als kleines bläuliches Label. Beide Label-Typen reagieren auf den Labels-Ein/Aus-Button und verschwinden automatisch wenn Konstellationen ausgeblendet werden. Konstellationsnamen sind vollständig lokalisiert (DE/EN); die fehlenden 35 Einträge wurden in languages.json ergänzt. Sprachwechsel aktualisiert die Labels sofort via refreshConstellationLabelLang() / _cstLangRefresh.
- Sternbild-Rotation korrigiert (constellations.js): Z=-90° aus V11.85 entfernt – diese Rotation kippte die Deklinationsachse in die X-Achse (Nordpol landete bei +X statt +Y), was alle Dec-Positionen verfälschte. Korrekte Lösung: ausschließlich Y=+90° (dreht RA=0h nach hinten, RA=6h/Orion vorne zur Kamera), Nordpol bleibt auf +Y, Südpol auf -Y. galacticTilt weiterhin nur auf Skydome, nicht auf Sternbilder.
- Sternbild-Orientierung 2 (constellations.js): Euler-Reihenfolge YZX, Y=+90° (Kamera-Ausrichtung), Z=-90° (90° Uhrzeigersinn auf Screen, Orion links-unten/Gemini links-oben). galacticTilt bewusst nicht auf Sternbilder angewendet – sie sind equatorial ausgerichtet, der Tilt gehört nur zum Panoramabild.
- Sternbild-Orientierung korrigiert (constellations.js): RA-Offset aus den Koordinaten entfernt; stattdessen Group-Rotation Y=+90° mit Euler-Reihenfolge YXZ – erst Y-Rotation (Kameraausrichtung: RA=6h/Orion vorne), dann X-Rotation (galacticTilt). So interagieren Kameraausrichtung und galaktische Neigung korrekt ohne gegenseitige Störung.
- Sternbild-Fixes 2 (constellations.js): (1) RA-Offset -90° korrigiert – Sternbilder sind jetzt korrekt orientiert (Orion links-unten, Gemini rechts-oben wie in NASA Eyes). Die Kamera startet bei RA≈6h (Orion-Richtung), daher wird der Frühlingspunkt RA=0h um -90° verschoben. (2) depthTest:true statt false – Planeten, Sonne und alle Szene-Objekte liegen via Z-Buffer automatisch vor den Linien (Radius 69500 >> Szene-Objekte). (3) Sternbild-Sterne weiß und 4px statt grün/3px, besser sichtbar vor dem Hintergrund.
- Sternbild-Fixes (constellations.js, scene.js, astroviewer.html): (1) Startup-Flash behoben – Skydome und Sternbilder starten unsichtbar und werden erst beim ersten System-Load smooth eingeblendet. (2) Sternbild-Linien und -Punkte liegen jetzt korrekt hinter allen Szene-Objekten (depthTest:false, renderOrder:-1, Radius 69500 statt 68000). (3) Ost-West-Spiegelung korrigiert: X-Koordinate negiert (x = -cos(dec)·sin(ra)), Projektion jetzt astronomisch korrekt. (4) Sternbild-Sterne als kleine grüne Leuchtpunkte (3 px, Glow-Sprite) hinzugefügt.
- Sternbild-Linien auf Skydome (constellations.js, astroviewer.html): alle 88 IAU-Konstellationen werden als grüne Verbindungslinien auf den Milchstraßen-Skydome projiziert (equatoriale RA/Dec-Koordinaten → Kugeloberfläche, 1 Draw-Call mit ~1726 Vertices). Rotation synchron mit galacticTilt des Systems – die Sternbilder drehen sich korrekt mit dem Hintergrundbild. Im Overview ausgeblendet, beim System-Wechsel wieder eingeblendet. Ladevorgang graceful: fehlt constellations.json, bleiben die Linien einfach aus.
- Vordergrundsterne sichtbarer (scene.js): Medium-Layer (ehem. 88–97 %% der Partikel) von 5 auf 6 px und Opacity von 0,64 auf 0,75 erhöht; Bright-Layer von 8 auf 10 px und Opacity von 0,85 auf 0,95. Erzeugt stärkere visuelle Trennung zwischen prozeduralen Vordergrundsternen und Milchstraßen-Skydome. Nachbarsterne pro System von 3 auf 5 erhöht (overview.js) für mehr Tiefenwirkung im Hintergrund.
- Galaktische Neigung aller Systeme (starsystems.json): galacticTilt für alle 101 Systeme astronomisch korrekt berechnet – aus den equatorialen Koordinaten (RA/Dec) jedes Hauptsterns über die IAU-Transformationsmatrix Äquatorial→Galaktisch. Basiswert 60,2° (Ekliptik-Neigung des Sonnensystems zur galaktischen Ebene) plus galaktischer Breite des jeweiligen Systems. Systeme nahe dem galaktischen Südpol (z.B. Luyten 726-8, b=−75,7°) auf 0° geclamptet.
- Milchstraßen-Hintergrund Tuning (scene.js, astroviewer.html, starsystems.json): Helligkeit läuft jetzt über opacity statt color-Multiplikation – das erhält den natürlichen Kontrast der Textur und verhindert den Schlieren-Effekt bei niedrigen Werten (Ziel-Opacity: 0.44). Neu: galaktische Neigung des Skydomes pro System via galacticTilt-Property in starsystems.json (Sol: 60,2°, Alpha Centauri: 56°). Im System-/Planet-/SurfaceView wird der Skydome entsprechend gedreht; im Overview und beim System-Wechsel ohne galacticTilt bleibt er flach (0°). PlanetView erbt die Neigung des Elternsystems.
- Milchstraßen-Hintergrund (scene.js): equirektanguläre ESA-Panoramatextur wird asynchron als Skydome auf die Innenseite einer riesigen Kugel geladen und smooth eingeblendet (1,8 s Fade). Mobile lädt images/lowres/background.jpg, Desktop images/mediumres/background.jpg (images/highres/ optional). Helligkeit auf 55 % gedimmt für stimmungsvollen Look. Die prozeduralen Vordergrundsterne bleiben erhalten. Fehlt die Datei (fileExists-Check), bleibt der schwarze Hintergrund ohne Fehlermeldung.
- Bugfix Objektliste SystemView (listpanel.js): Monde von Zwergplaneten (z.B. Dysnomia/Eris, Weywot/Quaoar) wurden im SystemView nicht in der Liste angezeigt. Ursache: der Filter für Dwarf-Monde prüfte fälschlicherweise auf das isDwarf-Flag, das aber nur am Elternobjekt gesetzt ist, nicht am Mond selbst. Fix: Dwarf-Keys werden vorab als Set ermittelt; Monde werden korrekt zugeordnet wenn ihr _parentKey auf einen Zwergplaneten zeigt. Charon (via Bary, hat isDwarf) funktioniert weiterhin korrekt.
- Co-Orbital-Monde (utils.js): Monde mit nahezu identischer Umlaufbahn (Abweichung < 2 %) werden jetzt im selben visuellen Orbit dargestellt statt künstlich auseinandergeschoben zu werden. Betrifft physikalisch korrekt Janus & Epimetheus (Saturn, exakt gleiche Bahn – tauschen alle ~4 Jahre), Helene & Dione (Saturn, Helene ist L4-Trojaner von Dione) sowie Lysithea & Elara (Jupiter, Himalia-Gruppe).
- Neue Neptun-Monde (starsystems.json): 6 weitere Monde erfasst – Naiad (innerster Mond, synchron, inc=4.75° ungewöhnlich hoch, 73:69-Resonanz mit Thalassa) und Thalassa (synchron, inc=0.21°), beide innere Neptun-Monde nach Voyager-2-Daten (Brozović 2019). Halimede (retrograd, inc=119.6°, ecc=0.521) und Psamathe (retrograd, inc=127.8°, ecc=0.413, weiteste Bahn 0.318 AU) aus der Neso-/Halimede-Gruppe. Sao (prograd, inc=53.5°, ecc=0.137) und Laomedeia (prograd, inc=37.9°, ecc=0.397) aus der Sao-Gruppe. Alle irregulären Monde mit inc zur Ekliptik (wie Nereid).
- Neue Uranus-Monde (starsystems.json): 6 weitere Monde erfasst – Cordelia, Cressida, Juliet, Portia (innere Portia-Gruppe, synchron, extrem dunkle Oberfläche Albedo 0.06–0.08, ~65 K), Puck (größter innerer Mond nach Miranda, synchron, Albedo 0.11) und Caliban (retrograder irregulärer Mond, rötlich, Albedo 0.22, Rotation 9.948h, eingefangener Körper). Alle Orbital- und Physikdaten nach Wikipedia/Jacobson 1998 (Voyager-2-Epochen): Halbachse, Umlaufzeit (Caliban negativ=retrograd), Bahnneigung zur Uranus-Äquatorebene bzw. Ekliptik (Caliban), Exzentrizität, Radius, Masse.
- PlanetView Mondlimit-Fix (astroviewer.html): Im PlanetView wurden neue Monde (7–12) nicht angezeigt, weil _planetViewMode beim Aufruf von loadStarSystem() noch false war – das SystemView-Limit von 6 Monden griff also auch im PlanetView. Fix: _planetViewMode wird jetzt in _enterPlanetView() explizit auf true gesetzt, bevor _enterPlanetViewImpl() (und damit loadStarSystem()) aufgerufen wird.
- Neue Saturn-Monde (starsystems.json): 6 weitere Monde erfasst – Mimas (synchron, Eis, Albedo 0.96, Herschel-Krater), Hyperion (chaotische Rotation ~13d, poröse schwammartige Oberfläche, Albedo 0.3), Phoebe (retrograd, eingefangener Kuipergürtel-Körper, dunkle Oberfläche, Albedo 0.086, Rotation 9.27h), Janus und Epimetheus (co-orbital, synchron, helles Eis, Albedo ~0.71–0.73), Helene (L4-Trojaner von Dione, synchron, E-Ring-Eisbelag). Alle Orbital- und Physikdaten nach Wikipedia/NASA Cassini: Halbachse, Umlaufzeit (Phoebe negativ=retrograd), Bahnneigung, Exzentrizität, Radius, Masse. Keine languages.json- oder components.json-Änderung erforderlich.
- Neue Jupiter-Monde (starsystems.json, languages.json): 6 weitere Monde erfasst – Thebe (innerer Mond, synchrone Rotation, rötlich-dunkel), Elara und Lysithea (Himalia-Gruppe, prograde irreguläre Monde), Carme, Pasiphae und Sinope (rückläufige irreguläre Monde der Carme- bzw. Pasiphae-Gruppe). Alle Orbital- und Physikdaten nach NASA/NSSDCA und Wikipedia (Epochen-Elemente): Halbachse, Umlaufzeit (negativ = retrograd), Bahnneigung in Radiant, Exzentrizität, Radius, Masse. Rotationsperioden wo bekannt (Carme, Lysithea, Sinope nach Luu 1991). Namen in DE/EN in languages.json ergänzt.
- PlanetView-Fixes (astroviewer.html, init.js, builder.js): Surface- und PlanetView-Button: setMode() im Kamera-Context ruft bei Übergang in 'focus' sofort beide Button-Updates aus – damit sind die Buttons nach Ende der Zoom-Animation korrekt aktiv, nicht erst beim nächsten Klick. Leuchtkraftregler im PV: controls.js-Context hatte kein getPlanetViewMode und kein getLightFactor (init.js), weshalb der Regler im PlanetView nicht wirkte und der Slider-Display den aktuellen Wert nicht korrekt zeigte. Nachbarsterne im PV: buildNeighbourStars() wird beim Laden des synthetischen PV-Systems übersprungen – das System hat keine Raumkoordinaten und soll keinen Systemwechsel ermöglichen.
- PlanetView Button-States (actions.js, astroviewer.html): Surface- und PlanetView-Button wurden nicht aktiviert wenn ein Objekt per _snapFocus() gesetzt wurde (sequence:'none' oder zoom-im-focus-mode), da dieser Pfad nicht durch setFocus() läuft. Fix: neuer updateFocusBtnStates-Callback am Ende von _snapFocus() – damit sind beide Buttons konsistent nach jedem Focus-Snap aktiv, auch beim PV-Enter und PV-Exit.
- PlanetView Licht (astroviewer.html): Fill-Lights (blau, verfärben Planeten) werden beim PV-Enter deaktiviert und beim Exit wiederhergestellt. Sonnen-DL auf 0.85 reduziert, Ambient auf 0.22 – verhindert Überbelichtung. Leuchtkraftregler wirkt jetzt korrekt (updatePvLights und updateFocusBtnStates fehlten im buildActionsContext-Mapping in actions.js).
- PlanetView-Fixes (animate.js, planetview.js, astroviewer.html): Schwarze Wolken: lightDir-Fallback wenn Planet bei dist=0 sitzt (wp≈0 → Nullvektor-Bug); feste Lichtrichtung schräg von vorne wird verwendet. Licht: statt fill-lights zu boosten wird ein echtes DirectionalLight (warm-weiß, "Sonne") hinzugefügt und beim Exit wieder entfernt; Ambient auf ausgewogenen Wert für Schattenseite; Leuchtkraftregler steuert beide Lichter korrekt. Zoom beim PV-Enter: CompareMode wird jetzt vor focus-object abgebrochen (verhindert dass der Zoom von _cmpRegisterClick abgefangen wird). PlanetView-Button nach Exit: updatePvBtnState wird explizit nach dem focus-object-.then() aufgerufen da sequence:'none' nicht durch setFocus() läuft.
- PlanetView-Fixes (planetview.js, astroviewer.html, actions.js): Licht: kein neues DirectionalLight mehr (verursachte schwarze Wolken durch Shader-Konflikt) – stattdessen werden die bestehenden Fill-Lichter und AmbientLight temporär hochgedreht und beim Exit wieder auf Ursprungswerte zurückgesetzt. Licht-Regler: set-light-intensity aktualisiert im PV die Fill-Lichter direkt (updatePvLights-Callback). Exit-Focus: Panel-State (welche Infopanels offen waren) wird beim PV-Enter gesichert und beim Exit über focus-object wiederhergestellt.
- PlanetView-Fix (planetview.js, astroviewer.html): Blickwinkel, Licht und Zoom-Exit funktionierten nicht weil planetview.js S.rotX statt CAM.rotX setzte und THREE direkt verwendete. Komplett neu: Kamerawinkel über CAM-Objekt (direkt aus camera.js), Lichter über addPvLights/removePvLights-Callbacks aus astroviewer.html (kein THREE im Modul), getCAM() im Context. Zoom-Exit: CAM.focusZoom nach Promise.then() überschrieben.
- PlanetView-Fixes (planetview.js, controls.js, compare.js, astroviewer.html): Zoom-Exit: focusZoom via Promise.then() nach focus-object-Resolve gesetzt (verhindert Überschreiben durch setFocus). Licht: AmbientLight + weiches DirectionalLight statt hartem DL – keine schwarzen Wolken mehr auf der Lichtseite; Lichtintensität berücksichtigt _lightFactor. Blickwinkel: Kamera startet bei PV-Enter mit rotX=0.52 (~30° von oben) – Ringe sind gut sichtbar. CompareMode: applyCompareButtonStates blendet pvBackBtn korrekt aus wenn Compare aktiv; PV-Exit ruft cmpAbort() auf (bricht auch halbfertigen State mit _cmpState=1 ab). compare.js: starsystems.find mit undefined-Slot-Guard.
- PlanetView-Fixes (planetview.js, controls.js, astroviewer.html): Kamera-Exit-Zoom: focusRotX/Y/Zoom wird jetzt nach dem focus-object-Call überschrieben statt vorher (verhindert dass PV-Zoom den SystemView-Zoom korrumpiert). Licht: starkes DirectionalLight (Sonnenlicht-Simulation, warm-weiß, Intensität 2.8) wird beim PV-Enter zur Szene hinzugefügt und beim Exit wieder entfernt. CompareMode: im PlanetView nicht mehr deaktiviert; beim PV-Exit wird ein laufender CompareMode automatisch beendet (verhindert Absturz durch nicht mehr existierende Objekte). getCmpMode und getScene in PV-Kontext registriert.
- PlanetView-Fixes (panels.js, actions.js, listpanel.js, controls.js, planetview.js, astroviewer.html): Infopanel Planet: period=undefined und dist=0 in panels.js abgesichert (kein crash mehr). Label-Reset: select-listitem ruft clearAllFocus() vor setHoveredTarget auf. Doppelklick-Zoom aus Objektliste auch im PlanetView aktiv (sequence:zoom). Doppelpfeil im SurfaceMode: applySurfaceButtonStates() komplett neu strukturiert – pvBack und surfBack werden jetzt in allen Zuständen (PV, Surface, beide) korrekt ein-/ausgeblendet. Audio: setFocus() in astroviewer.html nutzt ebenfalls den originalen System-Key statt PV-Synth-Key. Kamerastate: Vor PV-Enter wird Mode/Zoom/Rotation gespeichert, nach PV-Exit wird auf das ursprüngliche Objekt zurückgefocused.
- PlanetView-Fixes (actions.js, listpanel.js, controls.js, planetview.js, astroviewer.html): (1) Infopanels beim Planet-Klick: _pvTargets-Logik entfernt, focus-object sucht direkt in clickTargets ohne künstliche sequence-Einschränkung. (2) Objektliste: PlanetView-Fall mit flacher Liste (Planet + Monde) separat gerendert, da kein Stern im synthetischen System vorhanden. (5) SurfaceMode aus PlanetView: pvBackBtn wird korrekt ausgeblendet wenn SurfaceMode aktiv; planetViewBtn im SurfaceMode deaktiviert. (9) log/lin-Schalter im PlanetView nicht mehr deaktiviert. (10) Audio: Original-System-Key (z.B. sol-system) statt PV-Synth-Key (jupiter-pv) für Track-Lookup verwendet; getPlanetViewOrigSysKey() exportiert. (11) HZ-Button im PlanetView deaktiviert.
- PlanetView-Fixes (animate.js, builder.js, planetview.js): Schwarzer Bildschirm und CSS-Fehler behoben. builder.js: kein Orbit-Ring bei dist=0 (zentraler Planet im PV). animate.js: period=null/undefined und orbitLine=null abgesichert – kein Division-durch-null mehr, kein Crash bei fehlendem Orbit-Ring. planetview.js: period auf undefined gesetzt statt null (Panel zeigt korrekt "–").
- PlanetView-Fixes (planetview.js, builder.js, controls.js): Button-ID korrigiert (planetViewBtn statt planetview-btn) und Aktivierungslogik auf opacity/pointerEvents umgestellt (wie alle anderen Buttons). Synthetisches System neu designt: Planet steht bei dist=0 im Zentrum (kein Orbit-Ring), stars:[] (kein Stern, kein Glow/PointLight/Starburst) – builder.js beleuchtet die Szene über bestehende Fill-Lichter. Monde kommen direkt aus pd.moons (kein Limit im PlanetView). builder.js: sys.stars mit Fallback auf [] abgesichert. controls.js: hasSuitable() überspringt undefined-Slots im sparse Array und das synthetische PV-System.
- PlanetView-Neuansatz (planetview.js, builder.js, actions.js, init.js, panels.js, input.js, screenshot.js, listpanel.js, astroviewer.html): Eigene Szene, Kamera und Render-Loop komplett entfernt. PlanetView läuft jetzt über denselben Pfad wie der SystemView – Enter baut ein synthetisches System-Objekt (Planet als Stern, Monde als Planeten) und ruft loadStarSystem() auf. Alle Features (Klick, Panels, Labels, Recorder, Screenshot, Sprache, Kamera) funktionieren dadurch automatisch identisch zum SystemView. SystemView zeigt maximal 6 Monde pro Planet; im PlanetView werden alle Monde aus den Daten geladen (Feld _pvOnly für reine PV-Monde vorbereitet). load-system erkennt Planet-Keys und leitet auf start-planetview um (Recorder-kompatibel).
- PlanetView-Fixes (planetview.js, panels.js, actions.js, screenshot.js, init.js): Führungslinien folgen bewegenden Monden (positionInfoPanels() wird im PV-Loop aufgerufen). Titel-Lokalisierung: Suffix (-System/ System) wird aus sys.name extrahiert, nicht hardcoded. Screenshot erfasst jetzt PV-Szene (PV-Kamera + PV-Szene statt Hauptszene). Zoom-Slider wirkt auf PV-Kamera (set-zoom Action im PV leitet auf zoomPvAbsolute). Auto-Zoom auf Mond: Kamera schwenkt und zoomt auf angeklicktes Objekt. Mond-Texturen: traverse() statt _isGltf-Guard (GLTF wird async geladen, traverse findet Textur in beiden Fällen).
- PlanetView-Fixes (planetview.js, panels.js, actions.js, init.js): Infopanels erscheinen jetzt neben dem angeklickten Objekt – panels.js nutzt PV-Kamera zur Positionierung (_activeCamera()). Auto-Zoom: zoomPvToTarget() richtet PV-Kamera auf das angeklickte Objekt aus. Custom-Modelle (GLTF) für Monde: Material wird per traverse() aus dem ersten Sub-Mesh extrahiert. Titel-Lokalisierung: _setPvTitle() liest sys.name (enthält bereits "-System" bzw. " System" je nach i18n-Eintrag). Bug 2 (Wolken-Gegendrehung): Atmosphäre ist Kind von planetMesh, Shader-Eigenbewegung ist bewusst leicht abweichend von Planetenrotation – kein Bug.
- PlanetView-Fix (planetview.js): Reihenfolge-Fehler behoben – moonHolder wurde vor seiner Deklaration referenziert (ReferenceError), PlanetView ließ sich nicht mehr öffnen.
- PlanetView-Fixes (planetview.js, listpanel.js, input.js, languages.js, init.js): Mondklick zuverlässig durch unsichtbare HitSphere (3× Mondradius, direkt am moonHolder). Label-Highlight (gelb/fett) korrekt nach Klick. Atmosphäre/Wolken drehen jetzt mit dem Planeten mit (an planetMesh gehängt statt planetPivot). Objektliste: Crash-Fix (starNodes undefined) durch eigene _buildPvHtml()-Funktion; Klick öffnet alle drei Infopanels. Sprachumschaltung: pvRestoreTitle() jetzt direkt in applyLang() von languages.js aufgerufen (nicht mehr nur über window._applyLang), dadurch wird der PV-Titel auch bei setLang() korrekt wiederhergestellt.
- PlanetView-Fixes (planetview.js, input.js, actions.js, init.js, listpanel.js): Klicks auf Planet und Monde laufen jetzt über denselben focus-object/runAction-Pfad wie im SystemView – kein eigener Raycast mehr in planetview.js. input.js leitet Klicks im PV auf PV-Kamera und PV-clickTargets um (zuverlässiger Treffer auch bei kleinen Monden). actions.js: Im PV werden nur Info-Panels geöffnet, kein Kamera-/Mode-State in der Hauptszene gesetzt (Fix: kein Auto-Zoom nach Rückkehr, kein falsches Infopanel). Atmosphäre/Wolken korrekt animiert (atmoMeshes werden nach addAtmoSphere() in PV-eigene Liste verschoben). Objektliste zeigt Planet und Monde, Klick öffnet alle drei Infopanels. Language-Switch berechnet PV-Titel mit neuer Sprache neu. labels pointer-events:none (kein Klick-Blockieren mehr durch Label-DOM).
- PlanetView-Fixes (planetview.js, astroviewer.html, init.js): Mondklick öffnet jetzt alle drei Infopanels korrekt (wie im Systemview). Planetklick öffnet ebenfalls alle drei Panels. Atmosphäre/Cloudmesh wird aus der Hauptszene geklont und angezeigt. Lichtintensität angepasst (identisch zum Systemview – kein Überbelichten mehr). Achsneigung korrekt via ZYX-Rotation (identisch zu applyAxisTilt()). Language-Switch im PlanetView stellt Titel wieder auf Planet-System zurück. System-Wechsel beendet PlanetView sauber und deaktiviert PV-Button. PV-Button im Overview immer deaktiviert. Moonspeed- und Rotspeed-Regler wirken jetzt im PlanetView. showAstroObjectInfo2/3 in PV-Context eingetragen.
- PlanetView-Fixes (planetview.js): Licht-Setup korrigiert (zweites DirectionalLight war fehlerhaft). Animations-Geschwindigkeit synchronisiert mit S.speedIdx (gleiche Formel wie Hauptloop). Mondorbits und Planeten-Eigenrotation nun physikalisch korrekt skaliert (period in Jahren bzw. Tagen). Eigener dt-Timer im PV-Render-Loop (kein hardcoded 1/60). S.running (Pause) wird korrekt respektiert ohne den Pause-Zustand beim Eintritt zu ändern. Label-Offset über Objekt verfeinert.
- PlanetView-Fixes (planetview.js, listpanel.js): Mondorbits korrigiert – Mond sitzt in einer geneigten Orbit-Ebene (orbitPlane.rotation.x = inc), bewegt sich korrekt auf der Orbitlinie. Pause (S.running) wird im Tick respektiert. Raycast auf Meshes ermöglicht Klick auf Planet/Monde direkt in der Szene. Infopanels schließen bei Kamera- oder Zoomänderung. Objektliste-Klick öffnet Infopanel für Planet.
- PlanetView-Integration (animate.js, input.js, init.js, listpanel.js, planetview.js): Hauptloop pausiert jetzt synchron via setPlanetViewActive()-Flag (kein Frame-Delay mehr, Hauptszene überschreibt PV-Szene nicht mehr). Kamera/Zoom (Maus, Wheel, Pinch) werden im PlanetView auf rotatePvCamera()/zoomPvCamera() umgeleitet. Objektliste zeigt im PlanetView nur Planet und Monde. Hauptszenen-Labels werden beim Enter vollständig ausgeblendet, beim Exit wiederhergestellt.
- PlanetView-Szene (planetview.js): Komplett neu implementiert mit echten Datenstrukturen. Planet-Mesh wird aus dem Material des Hauptszenen-Objekts gebaut (gleiche Textur, kein Reload). Monde werden aus planetObj.moonObjs gelesen und mit moonOrbitR() korrekt skaliert. Eigener Sternenhimmel (6000 Partikel). Hauptszenen-Labels werden beim Eintritt ausgeblendet und beim Verlassen wiederhergestellt. Titel zeigt "Jupiter-System" etc. Rückkehr setzt Titel via applyLang() zurück. init.js: PlanetView-Context um getPlanetObjects, getDwarfObjects, getLogScale erweitert.
- PlanetView-Fixes (init.js, planetview.js, languages.json): Hauptursache für Button-Inaktivität und leere Szene behoben – registerPlanetViewContext() wurde nie von init.js aufgerufen, der Context blieb leer. PlanetView-Button jetzt auch für Zwergplaneten aktiv (isDwarf nicht mehr ausgeschlossen). Zurück-Button heißt jetzt "Zurück zum System" statt "Planetenansicht verlassen". S.running nach PlanetView-Exit wird explizit auf true gesetzt damit Sterne und Objekte wieder erscheinen.
- PlanetView-Fixes (astroviewer.html, planetview.js, controls.js, icons.svg): Button aktiviert sich jetzt korrekt wenn ein echter Planet fokussiert ist – in setFocus() fehlte der Aufruf von _updatePlanetViewBtnState(). Button-Bedingung präzisiert: nur echte Planeten (kein Stern, kein Mond, kein Zwerg, kein Asteroid). Neues Icon icon-planetview (Planet mit Mond auf Kreisbahn) in icons.svg eingetragen. Control-Panel umgebaut: Section 2 jetzt Zoom + Steuerung, Section 3 jetzt Geschwindigkeiten + Werkzeuge (mit PlanetView-Button) – entspricht der gewünschten Reihenfolge.
- PlanetView-Modus (Grundgerüst): Neuer Modus zur Detailansicht eines Planeten mit seinen Monden. Eigene Three.js-Szene, planet-zentrierte Kamera, eigener Render-Loop (Hauptloop pausiert währenddessen). Planet wird auf eine einheitliche visuelle Größe skaliert, Monde relativ dazu. Orbits, Labels und Mond-Animation bereits funktional. Einstieg über neuen Button im Control-Panel (Werkzeuge-Gruppe), Rückkehr über Zurück-Button analog zu Surface/Compare-Modus. Actions start-planetview / end-planetview scriptbar und recordbar. Control-Panel: Werkzeuge- und Zoom-Gruppe getauscht (Werkzeuge nun erste Gruppe in Section 2).
- Haumea-Workaround entfernt (models.js): Der in V11.43 eingebaute Sphärizitäts-Test (_isSuitableForSphericalUV) und alle zugehörigen Workarounds wurden vollständig entfernt. Das eigentliche Problem war eine unsortierte Vertex-Reihenfolge im NASA-Modell, die nach toNonIndexed() wilde Dreieckssprünge erzeugte – behoben durch Vertex-Umsortierung in Blender. models.js ist wieder generisch ohne modellspezifische Sonderfälle.
- Haumea-Fix (models.js): Sphärischer UV-Rebuild wird jetzt nur noch auf geeignete Geometrien angewendet. Haumea's Modell verwendet eine Kegel-Fächer-Struktur (42% der Vertices liegen nahe dem Zentrum) die bei sphärischer UV-Projektion Stacheln erzeugt. Neuer Sphärizitäts-Test (_isSuitableForSphericalUV): wenn mehr als 20% der Vertices innerhalb von 25% des BBox-Radius liegen, wird der UV-Rebuild übersprungen – das Modell wird ohne Textur-Neuzuweisung gerendert. BoundingBox-Zentrum als Projektionspunkt wiederhergestellt (V11.42-Änderung rückgängig – Vertex-Schwerpunkt war für diesen Fall schlechter). NaN-Guard behalten.
- UV-Projektion Fix für elongierte Objekte (models.js): Haumea wurde als "Stachel-Explosion" dargestellt. Ursache: _generateSphericalUVs() verwendete das BoundingBox-Zentrum als Projektionspunkt – bei stark abgeflachten Ellipsoiden (Haumea hat ein 3:2:1-Achsverhältnis) liegt dieses weit vom geometrischen Massenpunkt entfernt, was nach sub().normalize() instabile Richtungsvektoren erzeugt. Fix: Vertex-Schwerpunkt (Durchschnitt aller Positionen) statt BoundingBox-Zentrum. Zusätzlich NaN-Guard für Vertices die exakt auf dem Zentrum liegen. Alle anderen Modelle unverändert.
- Textur-Preload-Optimierung (textures.js): Doppelte Requests für Subkategorie-Texturen behoben – Texturen mit identischer primärer Lade-URL (z.B. subcat-star-D.jpg für alle Sterne der Spektralklasse D) wurden bisher mehrfach geladen. Deduplizierung jetzt nach tatsächlicher URL statt nach Objekt-Key. Zusätzlich: fileExists()-Check direkt in tryNext() eingebaut, damit nicht vorhandene URLs sofort im textureNotFoundCache landen und parallele Preload-Slots nicht denselben fehlenden Pfad nochmals versuchen.
- File-Registry (fileregistry.js): Neues Modul lädt data/files.json beim App-Start und stellt fileExists() als O(1)-Set-Lookup bereit. Modelle und Texturen prüfen vor jedem Request ob die Datei tatsächlich existiert – kein Request bei fehlender Datei, keine NS_BINDING_ABORTED-Fehler mehr in der Konsole. Löst das Problem des Cloudflare-Webspaces der für nicht vorhandene Dateien fälschlicherweise HTTP 200 zurückliefert.
- UV-Naht-Fix (2. Anlauf): Naht-Reparatur-Algorithmus auf "Mehrheitsentscheid" umgestellt – der alte Mittelpunkt-Ansatz versagte bei Dreiecken wo alle drei Vertices nahe der Naht lagen. Zusätzlich wird jetzt RepeatWrapping auf der externen Textur gesetzt, damit u-Werte außerhalb [0,1] korrekt wrappen statt am Rand geclamppt zu werden (ClampToEdge ist Three.js-Default und war der zweite Naht-Auslöser).
- UV-Naht-Fix (models.js): Sphärische UVs werden jetzt immer neu generiert wenn eine externe Textur geladen wird – GLTF-eigene UVs (die für interne Texturen ausgelegt sind) wurden bisher fälschlicherweise übernommen und verursachten die Zickzack-Naht bei allen Objekten mit vorhandenen GLTF-UVs (Vesta, Pallas u.a.).
- Warning-Fix (builder.js): Asteroidengürtel-Meshes verwenden jetzt MeshPhongMaterial statt MeshLambertMaterial – Lambert unterstützt kein flatShading in Three.js r128.
- Bugfix (builder.js): Monde von einfachen Zwergplaneten (ohne Barycenter-Struktur) wurden nicht gebaut. Dysnomia (Mond von Eris), Weywot (Mond von Quaoar) und weitere Monde tauchen jetzt wieder auf.
- UV-Naht-Fix für 3D-Modelle (GLB/GLTF): sphärische UV-Projektion verwendet jetzt konsequent non-indexed Geometry, bevor UVs berechnet werden. Dadurch hat jedes Dreieck exklusive Vertices und der Naht-Reparatur-Algorithmus kann u-Werte pro Dreieck unabhängig korrigieren – die sichtbare Textur-Naht an nicht-sphärischen Objekten (z.B. Pallas) entfällt.
- Plasma-Oberflächenanimation (V11.25–35) vollständig entfernt. Das Feature konnte trotz zahlreicher Ansätze (onBeforeCompile-Injection, separates ShaderMaterial-Overlay, Pivot-Kind-Mesh) nicht stabil zum Laufen gebracht werden – Three.js r128 unterstützt keine zuverlässige Uniform-Aktualisierung über onBeforeCompile, und alle alternativen Ansätze hatten Rendering-Artefakte. Zurück auf stabilen Stand V11.24-Shader.
- Plasma-Shader: transparentes Overlay-Konzept verworfen (ohne Basis unsichtbar). Neuer Ansatz: sun.plasma rendert vollständig opak mit Textur+Noise, sun.mesh wird ausgeblendet. Lokale Normalkoordinaten (rotieren mit dem Stern) statt Weltkoordinaten für das Noise. Textur wird asynchron aus Cache eingehängt.
- Plasma-Shader Fix: Overlay war opak (alpha=1.0) und verdeckte den Stern komplett. UV-basierte Koordinaten erzeugten Naht-Artefakte. Neu: Weltkoordinaten via vWorldNorm (kein UV, keine Naht), transparentes NormalBlending-Overlay (alpha 0–0.65), helle Zellen aufhellen / dunkle abdunkeln ohne die Sternoberfläche zu verdecken.
- Plasma-Shader: onBeforeCompile-Ansatz endgültig verworfen – Uniforms sind in Three.js r128 nach der Kompilierung nicht persistent aktualisierbar. Neuer Ansatz: ShaderMaterial-Mesh (
key.plasma) als Kind des Stern-Pivots – rotiert automatisch mit dem Stern mit, Uniforms leben direkt am Material und werden zuverlässig pro Frame aktualisiert. Textur wird aus Cache übernommen (mit Retry nach 1.5s/4s). Debug-Logs entfernt.
- Plasma-Oberflächenanimation (neuer Ansatz):
onBeforeCompile injiziert UV-basiertes fBm-Noise direkt in map_fragment des Stern-MeshBasicMaterials. UV-Koordinaten rotieren mit dem Stern-Mesh mit → Plasma dreht sich mit der Sternrotation. time wird über material.userData._plasmaTime gespeichert – kein Shader-Cache-Problem da userData am Material-Objekt lebt. Debug-Overlay entfernt.
- Bugfix Plasma-Animation:
time-Uniform wurde nie aktualisiert weil isMobile = true (durch pointer:coarse auf Touchscreen-fähigen Desktops/Surface-Geräten) den Shader-Pfad blockierte und statt ShaderMaterial einen einfachen Sprite ohne Uniforms erstellte. Fix: neuer _isRealMobile-Check nur per UserAgent (iOS/Android) – pointer:coarse allein erzwingt keinen Sprite mehr.
- Plasma-Oberflächenanimation: separates Overlay-Mesh-Konzept (V11.25–29) verworfen – value-noise-Artefakte, Farb-Override und Alpha-Probleme. Stattdessen bestehenden
_surfGlowMesh-Shader erweitert: stärkere Granulation (zweite fBm-Schicht schneller), dunklere Zellgrenzen (konvexe Funktion peaks an Zellrändern), Intensität erhöht (0.12+0.62×logL statt 0.08+0.48×logL). Plasma/Granulation damit vollständig im bereits funktionierenden additiven Glow-Shader integriert.
- Bugfix Plasma-Shader: Alpha-Berechnung im Fragment-Shader war variabel und nahe 0 → Overlay kaum sichtbar, Bewegung nicht erkennbar. Vereinfacht auf festes Alpha (0.82), Farbe wird direkt mit Plasma-Noise moduliert. Variablenname-Kollision (
a/f in Noise-Loop vs. GLSL-Builtins) behoben.
- Bugfix Plasma-Shader (V11.27): Animation weiterhin nicht sichtbar. Ursache:
onBeforeCompile auf MeshBasicMaterial verliert die Uniform-Referenz nach der Kompilierung – time-Updates in animate.js hatten keinen Effekt. Lösung: Plasma als separates ShaderMaterial-Overlay-Mesh direkt über der Sternkugel (r×1.002), analog zu _surfGlowMesh. Uniforms leben direkt am Material → Three.js aktualisiert sie zuverlässig pro Frame.
- Bugfix Plasma-Shader (V11.25/26): Animation war nicht sichtbar. Ursache: Three.js cached kompilierte WebGL-Shader – Sterne gleicher Spektralklasse teilten dasselbe Shader-Programm, das
plasmaTime-Uniform des zweiten Sterns hatte daher keine Verbindung zum aktiven WebGL-Programm. Fix: customProgramCacheKey pro Stern-Key sorgt dafür dass jeder Stern seinen eigenen kompilierten Shader erhält.
- Bugfix V11.25: Syntax-Fehler (unescapte Zeilenumbrüche in String-Literals) behoben – App startete nicht mehr. Plasma-Shader-Strings auf Array-Join umgestellt.
- Plasma-Stärke aus
categories.json: Neue Eigenschaft plasmaStrength in den Stern-Subkategorien (O–D). Werte jetzt über die JSON-Datei konfigurierbar, kein Hardcode mehr im Code. T/Y/D-Klassen (Braune Zwerge, Weiße Zwerge) haben Stärke 0 – kein Plasma.
- Plasma-Oberflächenanimation für Sterne: Animiertes fBm-Noise direkt in die Sternoberfläche eingemischt – helle Granulations-Zellen (aufsteigendes heißes Plasma) und dunklere Zwischenräume erzeugen eine lebendige Konvektionsbewegung. Zwei überlagerte Noise-Schichten (großskalige Strömung + feine Granulation) mit unterschiedlichen Driftgeschwindigkeiten. Intensität nach Spektralklasse: O/B-Sterne subtil (0.06–0.08), G/K/M-Sterne stärker (0.14–0.22). Nur auf Desktop (Mobile: mediump-Präzisionsprobleme).
- Bugfix Binärsterne im Lin-Modus (endgültig):
visualR gilt wieder in beiden Modi als fixer visueller Abstand – echter Realdistanz-Ansatz (V11.23) verworfen, da er sehr weit entfernte Begleitsterne (z.B. Proxima, 13.000 AU) aus der Szene verschwinden ließ und sehr enge Paare (z.B. EZ Aquarii A+C, 0.03 AU) trotzdem noch überlagert hätte. Stattdessen: Mindestabstand-Clamp – orbit.r wird auf mindestens 1.15 × Sternradius angehoben, sodass auch bei sehr kleinem visualR keine Überlappung entstehen kann.
- Zwischenversion (verworfen): visualR im Lin-Modus durch echte AU-Distanzen ersetzt – führte zu neuen Problemen (entfernte Begleitsterne nicht mehr sichtbar, sehr enge Paare weiterhin überlagert).
- Zwischenversion (unvollständig): Sternorbit-Abstände im Lin-Modus nicht mit visDist multipliziert – eigentliche Ursache noch nicht identifiziert.
- Surface-Mode Terrain: Bergdichte reduziert – Exponent auf 3.0–3.2 erhöht und Noise-Boost auf 1.4 gesenkt. Frequenz bleibt hoch (kompakte Bergformen), aber weniger Peaks kommen durch die Power-Schwelle.
- Surface-Mode Terrain: Frequenz deutlich erhöht (1.2–1.5 → 2.8–3.2) für schmalere, abruptere Bergformen statt breiter Wellen. Noise-Boost auf 1.8 angehoben damit Bergspitzen trotz höherer Frequenz klar herausstechen.
- Surface-Mode Terrain: Exponent der Power-Kurve von 3.5 auf 2.0–2.2 reduziert und Noise-Boost (×1.5, geclampt) vor dem Potenzieren eingeführt. Bei Exponent 3.5 lagen zu viele fBm-Werte unter der Wahrnehmungsschwelle – Berge waren faktisch unsichtbar. Jetzt sichtbare Erhebungen am Horizont, Basis bleibt weiterhin überwiegend flach.
- Surface-Mode Terrain: Noise-Formel auf Power-Kurve umgestellt. Der Großteil der Oberfläche bleibt jetzt nahezu perfekt sphärisch (flacher Horizont), nur punktuell entstehen Berge und Täler an den Extremwerten des Noise-Signals. Formel: pow(|noise|, exponent) × sign(noise) × amplitude – Exponent 3–3.5 quetscht ~90% der Werte nahe Null. Niedrigere Frequenz (breitere Bergmassive statt Wellenlinie), höhere Amplitude um den Effekt trotz Potenzierung sichtbar zu halten.
- Surface-Mode: Terrain-Displacement via seeded fBm-Simplex-Noise. Beim Betreten des Surface-Mode wird die hochauflösende Oberflächen-Geometrie (256×256 Segmente) mit sanften Hügeln, Tälern und Erhebungen versehen – deterministisch aus dem Objekt-Key, also auf jeder Maschine identisch. Amplitude ist bewusst sehr gering gehalten (terrestrisch 1%, Monde 1.4%, Zwerge 1.8%, Asteroiden 2.2%), sodass die Oberfläche realistisch topographisch wirkt ohne übertrieben zu sein. Gasriesen, Eisriesen und Sterne bleiben perfekte Kugeln. Im normalen Systemview sind die Objekte weiterhin unveränderte Kugeln.
- Noise-Sphere Feature vollständig entfernt (V11.13–V11.15 rückgebaut). Vertex-Displacement auf SphereGeometry erzeugt bei allen Segmentzahlen sichtbare Facetten-Rasterlinien und eignet sich nicht für texturierte Planeten/Monde. Alle Kugel-Objekte sind wieder perfekte Spheres. _simplex3 bleibt für den Gürtel-Asteroid-Geometrie-Pool erhalten.
- Noise-Sphere Feinjustierung: Terrestrische Planeten deutlich sphärischer (Amplitude 0.06 → 0.018, feinere Frequenz) – keine kantigen Brocken mehr. Monde moderater (0.10 → 0.045). Eisriesen erhalten keinen Noise mehr (sind wie Gasriesen physikalisch nahezu perfekte Kugeln). Dwarfs und einzelne Asteroiden leicht zurückgenommen.
- Bugfix: Scharfe Texturkante (UV-Naht) an Meridian und Polen bei noise-displacetem Objekten behoben – Geometrie wird vor dem Vertex-Displacement per toNonIndexed() aufgetrennt, sodass kein Vertex mehr UV-Koordinaten mit einem Nachbar teilt.
- Bugfix: ReferenceError beim Betreten eines Systems – _makePRNG, _snP, _simplex3 und _buildNoiseSphere wurden im Funktions-Scope zu spät initialisiert (Temporal Dead Zone). Alle vier in den Modul-Scope verschoben, Duplikat-Deklarationen entfernt.
- Neu: Alle Kugel-Objekte (terrestrische Planeten, Eisriesen, Monde, Zwerge, einzelne Asteroiden) erhalten jetzt zufällig wirkende, aber deterministisch generierte Oberflächenformen – Hügel, Berge, Täler und Klippen per fraktionalem Simplex-Noise (fBm). Derselbe Objekt-Key produziert auf jeder Maschine immer exakt dieselbe Form. Gasriesen und Sterne bleiben perfekte Kugeln. Noise-Parameter (Amplitude, Frequenz, Oktaven) sind in categories.json pro Kategorie/Subkategorie konfigurierbar; einzelne Objekte können via noiseEnabled: false in starsystems.json ausgenommen werden.
- Bugfix: „Zurück zum Overview"-Übergang hat im linearen Distanzmodus ins System hineingezoomt statt hinaus. Ursache: Das Zoom-Ziel war fix auf CAM_BASE_DIST×6 gesetzt – im Lin-Modus stand die Kamera bereits weiter entfernt, sodass die Animation in die falsche Richtung lief. Fix: Das Ziel wird jetzt dynamisch auf das Doppelte der aktuellen Kameradistanz gesetzt (mindestens aber CAM_BASE_DIST×6), sodass der Übergang in beiden Modi korrekt nach außen zoomt.
- Bugfix: SyntaxError „redeclaration of const vertSpread/sizeMin/sizeMax" in builder.js behoben – veraltete Duplikat-Deklarationen aus vorherigen Refactoring-Schritten entfernt.
- Gürtelpartikel: beltCount in categories.json durch beltDensity (Partikel pro log-visueller Fläche) ersetzt. Gilt systemübergreifend korrekt – große Gürtel in anderen Systemen bekommen automatisch mehr Partikel, kleine Gürtel weniger, ohne Hardcoding einer Sol-Referenz. Override per beltCount in starsystems.json weiterhin möglich. Neuer optionaler Parameter beltLinBoostMax steuert den Größenboost im linearen Modus (Default 6×).
- Partikelgröße: beltSizeMin/Max aus categories.json werden jetzt direkt als Szeneneinheiten verwendet – kein beltMidLog-Multiplikator mehr, der Kuipergürtel-Partikel ~2× zu groß machte.
- Radialverteilung: 70% gleichverteilt + 30% leicht zur Gürtelmitte gewichtet. Kein Gauß-Mittenaufhäufung mehr, keine Kantenspitzen.
- Gürtelpartikelzahl: V11.08-Autocount-Logik war toter Code, weil zsc.beltCount aus categories.json nie null ist und daher immer direkt verwendet wurde. Korrektur: categories.json-beltCount dient jetzt als kalibrierter Referenzwert für HAB-Gürtelfläche im Log-Modus. Für jeden Gürtel wird dieser Wert mit dem Verhältnis seiner log-visuellen Ringfläche zu HAB multipliziert – HAB bleibt unverändert (ratio=1.0), der Kuipergürtel (astroobjectbelt) skaliert von 600 auf ~1430 Partikel.
- Partikelgröße (beltSizeMin/Max) und Partikelfarbe (color) werden weiterhin korrekt aus categories.json-Subkategorien gelesen.
- Gürtelpartikel: Kantenhaufen-Problem behoben. Partikel häuften sich sichtbar an der Innen- und Außenkante, weil ein zu breiter Gaußverteiler auf die Gürtelgrenzen geclampt wurde (~5% der Partikel). Fix: Rejection-Sampling – liegt ein Zufallswert außerhalb des Gürtels, wird stattdessen ein gleichverteilter Radius neu gezogen.
- Kuipergürtel-Dichte: Partikelzahl wird jetzt automatisch nach der log-visuellen Ringfläche relativ zum Hauptasteroidengürtel skaliert (kein hartkodierter Default von 1000 mehr). Der Kuipergürtel hat im Log-Modus ~2,4× mehr Fläche → ~2400 Partikel automatisch; auf Mobile ~600. Sieht damit deutlich dichter aus ohne den Hauptgürtel zu verändern.
- Gürtelpartikel (Haupt- und Kuipergürtel): Skalierungsfehler im linearen Distanzmodus behoben. Partikelgröße und vertikale Streuung wurden bisher relativ zur visuellen beltMid berechnet – im Lin-Modus ist diese ~27× größer als im Log-Modus, was zu absurd großen Partikeln führte. Fix: Größe und Streuung werden jetzt immer auf Basis der log-komprimierten beltMid (AU-Funktion) berechnet, unabhängig vom gewählten Modus.
- Gebundene Rotation: Formel korrigiert – V11.05 zeigte bei Monden die falsche Seite zum Planeten (180° Drehfehler). Korrekte Formel: pivot.rotation.y = PI − Orbit-Winkel, hergeleitet aus der orbitPos-Geometrie (+X des Meshes muss zur Planetenseite zeigen).
- Gebundene Rotation auf Planeten ausgeweitet: Exoplaneten mit rotationPeriod "locked" (z.B. Proxima Centauri b) zeigen jetzt dauerhaft dieselbe Seite zum Zentralstern.
- Gebundene Rotation (tidally locked) für Monde implementiert: Objekte mit rotationPeriod null oder "locked" zeigen jetzt korrekt immer dieselbe Seite zum Parentobjekt (synchrone Rotation). Umsetzung über pivot.rotation.y = –Orbit-Winkel in _updateMoon(). Gilt für alle Planetenmonde und Zwergplanetenmonde (Kugel und GLTF), inkl. elliptischer Bahnen.
- Asteroiden (Vesta, Pallas, Hygiea) rotieren jetzt um ihre eigene Achse: Rotationsperiode und Achsenneigung aus realen Daten ergänzt (Vesta 5.3 h / 29°, Pallas 7.8 h / 84°, Hygiea 13.4 h / 39°). Achsenneigung wird sowohl auf die Kugel als auch auf das GLTF-Modell angewendet.
- Infopanel der Asteroiden zeigt jetzt die Rotationsperiode an (analog zu Planeten und Monden).
- Gürtelpartikel oben/unten Helligkeitsunterschied: zweites schwaches DirectionalLight von oben-rechts (0x334455, Intensität 0.35) hinzugefügt. Beleuchtet die untere Gürtelhälfte die vom ersten Fill-Light nicht erreicht wird. emissive auf #222222 zurückgesetzt damit die Textur nicht überstrahlt.
- Gürtelpartikel oben/unten Helligkeitsunterschied: emissiveIntensity auf 0.55 erhöht damit die Schattenseite (untere Gürtelhälfte im Fill-Light-Schatten) deutlich heller wird.
- Textur auf Partikeln sichtbar: emissiveMap auf dieselbe Textur wie map gesetzt – emissive leuchtet jetzt texturfarben statt einer grauen Einheitsfarbe, Texturdetail wird sichtbar.
- Gürtelpartikel: BoxGeometry verworfen (eckige Plattenform). Neuer Ansatz: IcosahedronGeometry(1,2) mit Simplex-3D-Noise-Jitter statt Math.random(). Zwei Noise-Oktaven (grob + fein) erzeugen organische, hügelige Oberflächen ohne Stacheln. Jeder der 8 Pool-Slots hat eigenen Noise-Offset und zufällige Achsasymmetrie → kein Asteroid sieht gleich aus. flatShading:true + emissive-Mindesthelligkeit bleiben.
- Gürtelpartikel: toNonIndexed() rückgängig gemacht (erzeugte Lücken und zersplitterte Flächen). Stattdessen flatShading:true im MeshLambertMaterial – gibt Flat-Shading-Look ohne Geometrie-Trennung, Mesh bleibt geschlossen. emissive:#222222 als Mindesthelligkeit damit Schattenseiten nicht pechschwarz werden.
- Gürtelpartikel Flat-Shading: MeshBasicMaterial → MeshLambertMaterial + toNonIndexed(). Basic zeigt keine Tiefe (alle Faces gleich hell) → Kanten wirken als Lücken. Mit Lambert + Flat-Normals bekommt jede Face eine eigene Helligkeit je nach Lichtwinkel → sichtbare Kanten, massiver Stein-Look. Der frühere Helligkeitssprung kam von der asynchronen Textur (in V10.98 gelöst), nicht von Lambert.
- Gürtelpartikel Scherben: SphereGeometry durch BoxGeometry(1,1,1,3,3,3) ersetzt – Box hat keine Pol-Singularitäten (Sphere reißt an den Polen auf). 54 gleichmäßig verteilte Faces, nach Jitter kantige organische Steinform.
- Helligkeitssprung: Zone-Texturen werden jetzt beim initialen Ladescreen vorgeladen (initPreload in textures.js). _getBeltTex liest zuerst aus dem Preload-Cache – beim Systembetreten ist die Textur bereits synchron verfügbar, kein nachträgliches Einblenden mehr. URL-Konventionen zwischen Preload und Belt-Loader vereinheitlicht.
- Gürtelpartikel Scherben: Ursache war IcosahedronGeometry – zu wenige, ungleichmäßig verteilte Vertices die beim Jitter Lücken reißen. Ersetzt durch SphereGeometry(1,8,6) mit gleichmäßiger Vertex-Verteilung und etwas mehr Jitter (0.32) → organische Klumpenform ohne Lücken.
- Helligkeitssprung: Textur wurde asynchron nachgeladen und änderte die Helligkeit nachträglich. Neuer synchroner Belt-Textur-Cache (_getBeltTex): beim zweiten Betreten desselben Systems ist die Textur bereits im Cache und wird synchron eingesetzt – kein heller Zwischenzustand mehr. Beim ersten Betreten lädt sie asynchron nach, aber da die instanceColor die Gürtelfarbe trägt bleibt der Sprung minimal.
- Gürtelpartikel Scherbenproblem und Helligkeitssprung: eigentliche Ursache war dieselbe – Material-Farbe war die Gürtelfarbe (dunkel), Textur ebenfalls dunkel → color × texture = zu dunkel, sichtbarer Sprung beim Textur-Load, und durch den Multiplikationseffekt wirkten Dreiecke farblich getrennt. Fix: Material-Farbe auf weiß (color × texture = texture, kein Artefakt), Gürtelfarbe + radiale Variation steckt ausschließlich in instanceColor – stabil von Frame 1 an, unabhängig vom Textur-Ladestand.
- Gürtelpartikel Bugfix: toNonIndexed() entfernt – Dreiecke waren getrennt und wirkten im Gegenlicht wie Scherbenhaufen statt massive Körper. Jetzt indexed Geometrie mit smooth normals (computeVertexNormals nach dem Jitter) → zusammenhängende, organische Steinform.
- Helligkeitssprung beim Systemladen behoben: MeshLambertMaterial zurück auf MeshBasicMaterial – Lambert reagiert auf Szenen-Licht das erst nach dem ersten Frame greift und erzeugt so den sichtbaren Hell-Dunkel-Sprung. Basic bleibt stabil, Tiefenwirkung kommt wie bisher von der radialen Farbvariation der Instanzen.
- Gürtelpartikel neu: Sprite-Ansatz verworfen (wirkte flach und viereckig). Neue Methode: Pool aus 8 individuell vorverzerrten Icosahedra (Vertex-Jitter ±28% entlang Normalen, toNonIndexed für Flat-Shading-Look). Jede Instanz greift auf eine andere Geometrie-Variante zu – kein Asteroid sieht wie ein anderer aus. MeshLambertMaterial reagiert auf Szenen-Licht (Schattenseiten dunkler). Starke Achsasymmetrie in der Skalierung verhindert kugelige Erscheinung.
- Asteroiden-/Trümmergürtel Aufflackern beim Systemwechsel behoben: Belt-Material startet jetzt mit der korrekten Gürtelfarbe statt weiß – das helle 1-2-Sekunden-Aufblitzen vor dem Textur-Load ist damit weg.
- Visuelle Qualität der Gürtelpartikel deutlich verbessert: Zwei-Schicht-Ansatz – 80% Billboard-Sprites mit prozedural generierter Asteroid-Textur (runde Silhouette, Krater, Beleuchtungsgradient, organischer Rand) für natürliches Aussehen aus der Ferne; 20% Icosahedra (detail=1) als volumetrische Nahdetail-Schicht die bei Heranzoom Tiefe geben. Mobile: nur Sprite-Schicht.
- Textur-Fix im Compare-Modus: GLTF-Modelle (z.B. Hygiea, Pallas) zeigten im Größenvergleich keine Textur. Compare-Modus zieht jetzt dieselbe Textur-Fallback-Logik nach wie der Hauptviewer – inklusive getCachedTexture-Callback beim Laden und _applyFallbackTexture für Modelle ohne eigene Diffus-Map.
- GLTF ohne UV-Map: Analyse der Ceres-GLTF-Datei zeigte dass das Mesh nur
POSITION und NORMAL enthält – keine TEXCOORD_0. Ohne UVs kann keine Textur gemappt werden. Fix: applyGltfLighting() prüft jetzt ob ein Mesh UV-Koordinaten hat; fehlen sie, wird automatisch eine sphärische Equirectangular-Projektion aus den Normalen berechnet. Passend zu unseren Planetentexturen (äquidistante Zylinderprojektion). Debug-Logging entfernt.
- Bugfix GLTF-Textur-Fallback (7): Farb-Test zeigte dass weder Farbe noch Textur auf dem Mesh ankamen – trotz korrekter Material-UUID. Ursache:
onBeforeCompile auf einem MeshPhongMaterial in Three.js r128 verhindert dass needsUpdate einen Shader-Recompile triggert wenn map nachträglich gesetzt wird. Fix: onBeforeCompile komplett entfernt. Der minLight-Effekt (Schattenaufhellung) wird jetzt über emissive + emissiveIntensity simuliert – 100% r128-kompatibel, kein Custom-Shader nötig.
- Debug V2: Farb-Test in
_applyFallbackTexture – GLTF-Objekte ohne eigene Textur werden kurz Rot gefärbt um zu prüfen ob mat.color überhaupt auf das Mesh wirkt. Hilft den Unterschied zwischen UV-Problem und Shader-Problem einzukreisen.
- Debug-Logging für GLTF-Textur-Fallback: Console-Outputs in
applyGltfLighting, _applyFallbackTexture und _applyTex – nur für GLTF-Objekte, nicht für normale Planeten/Monde.
- Bugfix GLTF-Textur-Fallback (6): Die Modelle hatten doch eine
orig.map – aber mit RGBEFormat (HDR, z.B. eine Occlusion-Map die der GLTFLoader auf .map legt), was als Farbtextur weiß/falsch rendert. hasOwnTexture erkannte sie fälschlich als nutzbare Diffus-Map. Fix: sowohl in applyGltfLighting als auch in der hasOwnTexture-Erkennung werden nur Texturen mit normalem RGBFormat oder RGBAFormat als Diffus-Map akzeptiert – HDR/RGBE-Maps lösen den Fallback-Mechanismus aus.
- Bugfix GLTF-Textur-Fallback (5): Three.js DevTools zeigten
RGBEFormat auf dem Mesh – das ist ein HDR-Format das vom GLTF-Material via emissiveMap übernommen wurde, aber nicht als normale Farbtextur renderbar ist. Fix: aus GLTF-Materialien wird jetzt ausschließlich orig.map (= glTF baseColorTexture) als Diffus-Map übernommen; emissiveMap, bumpMap und normalMap werden ignoriert. Gleiches gilt für die hasOwnTexture-Erkennung.
- Bugfix GLTF-Textur-Fallback (4): Three.js DevTools bestätigten dass die Textur gesetzt war, aber nicht sichtbar – der Shader kannte
USE_MAP nicht. Ursache: Three.js r128 recompiliert einen Shader nicht automatisch wenn nachträglich mat.map gesetzt wird. Fix: _applyTex() ruft jetzt renderer.properties.remove(mat) auf wenn das Material bisher ohne echte Textur kompiliert wurde (Stub oder kein Map). Das löscht den gecachten Shader-Eintrag und erzwingt beim nächsten Render einen vollständigen Recompile mit USE_MAP.
- Debug-Namen: Alle Three.js-Objekte in der Szene haben jetzt aussagekräftige
.name-Properties. Schema: key.typ, z.B. earth.mesh, earth.pivot, earth.orbit, earth.hitsphere, earth.gltf-pivot, earth.gltf-mesh. Sterne, Planeten, Monde, Asteroiden, Zwergplaneten, Ringe, Barycenter, Lichter und der Sternen-Hintergrund sind abgedeckt. Erleichtert das Debugging in der Three.js DevTools Browser-Extension erheblich.
- Bugfix GLTF-Textur-Fallback (3): Textur wurde zwar geladen (sichtbar im Netzwerk-Log), aber nicht angezeigt. Ursache:
loadTexture() schrieb die Textur nachträglich auf mat.map – aber der Shader war zu diesem Zeitpunkt noch nicht kompiliert, sodass Three.js beim ersten Render ohne USE_MAP kompilierte und den späteren Map-Eintrag ignorierte. Fix: tryLoadModel() akzeptiert jetzt einen getFallbackMap-Callback, der synchron beim Material-Erstellen aufgerufen wird – so landet die Textur direkt im new MeshPhongMaterial({ map: ... })-Konstruktor. Als Fallback wenn die Textur noch nicht gecacht ist bleibt die Stub-Textur, und loadTexture() ersetzt sie nachträglich (Shader-Pfad ist dann schon korrekt kompiliert).
- Bugfix GLTF-Textur-Fallback (2): Eigentliche Ursache war ein Three.js Shader-Kompilierungsproblem – wenn ein Material initial ohne
map erstellt wird, kompiliert Three.js den Shader ohne USE_MAP-Pfad, und ein späteres Setzen von mat.map bleibt wirkungslos. Fix: GLTF-Materialien ohne eigene Textur bekommen jetzt sofort eine neutrale 1×1-Grau-Stub-Textur als Platzhalter, damit der Shader-Pfad von Anfang an kompiliert wird. Die Fallback-Textur ersetzt die Stub-Textur dann sauber. Außerdem werden Fallback-Materialien nun ins Textur-Registry eingetragen, sodass Qualitätswechsel auch auf GLTF-Objekten wirkt.
- Bugfix GLTF-Textur-Fallback: Modelle mit eigener Textur wurden fälschlicherweise als texturlos erkannt und mit der Fallback-Textur überschrieben. Ursache: die Textur-Prüfung lief am bereits konvertierten Klon statt am Original. Fix:
hasOwnTexture wird jetzt einmalig beim ersten Laden am Originalmodell geprüft und gecacht – Cache-Hits liefern denselben stabilen Wert.
- GLTF-Modelle ohne eigene Textur: Enthält ein geladenes 3D-Modell keine eingebettete Textur, wird jetzt automatisch dieselbe Textur-Fallback-Kette angewendet wie bei normalen Kugeln (key → subcategory → category → prozedural). Betrifft Planeten, Monde, Asteroiden und Zwergplaneten.
- Draco-Komprimierung: GLTF/GLB-Modelle können jetzt Draco-komprimiert sein. Der DRACOLoader wird einmalig initialisiert und am GLTFLoader registriert – dieser erkennt automatisch ob ein Modell komprimiert ist und nutzt den Decoder nur bei Bedarf. Nicht-komprimierte Modelle sind davon unberührt.
- GLTF-Ladezeit: Lazy-Loading eingebaut. Systemaufbau (Kugeln, Orbits, Labels) passiert jetzt sofort synchron. GLTF-Modelle werden im Hintergrund per
.then() nachgeladen und ersetzen die Kugel sobald sie fertig sind – ohne den Viewer zu blockieren. Planeten, Monde, Asteroiden und Zwergplaneten alle umgestellt.
- GLTF-Ladezeit: Probe-Request komplett eliminiert. Statt zwei Requests (Probe + Load) gibt es jetzt nur noch einen:
fetch() startet den Download, nach Empfang der Response-Headers wird content-type geprüft – ist es text/html (Cloudflare-Fehlerseite), wird der Body sofort per AbortController abgebrochen. Bei einer echten Modelldatei wird der ArrayBuffer gelesen und per Blob-URL an den GLTFLoader übergeben (kein zweiter Netzwerk-Request).
- Middleware (
_middleware.js): Requests auf /models/ und statische Assets werden vor dem HTMLRewriter direkt durchgeleitet – kein og:image-Overhead für diese Requests.
- GLTF-Ladezeit: Probe-Strategie auf Header-only-Fetch umgestellt. Der Request wird sofort nach Empfang der Response-Headers per
AbortController abgebrochen – bevor Cloudflare die 110 kB HTML-Fehlerseite überträgt. Datei gilt als vorhanden wenn Status 2xx und content-type nicht text/html. Für existierende Modelle wird der Body in einem separaten Fetch geladen (kein Doppel-Download via Blob-URL-Technik).
- SurfaceMode + GLTF: Detail-Textur und High-Res-Textur werden jetzt auch auf GLTF-Objekten (Phobos, Deimos) angewendet. Bisher griff der Material-Zugriff auf
planetObj.mesh.material zu – bei GLTF ist das die inner group ohne Material. Fix: erstes echtes GLTF-Mesh (userData._isGltfMesh) wird für den Shader-Patch und Textur-Restore verwendet.
- Bugfix SurfaceMode + GLTF: Beim Betreten des SurfaceModes auf GLTF-Objekten (Phobos, Deimos) wurden die Modell-Meshes irrtümlich als Atmosphären-Meshes erkannt und auf einen Bruchteil ihrer Größe skaliert – die Kamera stand dadurch weit über einem winzigen Objekt. Ursache: der Traverse-Block prüft alle Kinder des Pivots auf Atmosphärenradius und rief auf GLTF-Meshes
computeBoundingSphere() auf (lokaler, unskalierter Radius), woraus ein falscher Scale-Faktor resultierte. Fix: GLTF-Meshes (userData._isGltfMesh) werden im Traverse-Block übersprungen.
- GLTF-Modelle: Ladezeit-Fix 2. HEAD-Request-Strategie durch Range-Fetch ersetzt: statt HEAD wird ein
GET bytes=0-0 mit 2-Sekunden-AbortController-Timeout gesendet. Cloudflare Pages gibt für existierende Dateien 206 zurück, für fehlende eine HTML-Fehlerseite – beides wird korrekt unterschieden. Systeme ohne Modelle bauen sich damit wieder verzögerungsfrei auf.
- Bugfix: Rotationsgeschwindigkeit-Slider hat
TypeError: _ctx.setRotSpeedDisplay is not a function geworfen. setRotSpeedDisplay fehlte im Default-Context und in buildActionsContext() von actions.js; beide Stellen ergänzt.
- GLTF-Modelle: Ladezeit-Fix für Hosts ohne echten 404 (z.B. Cloudflare Pages). Vor dem GLTFLoader wird jetzt ein HEAD-Request gemacht; liefert dieser
text/html (= Fehlerseite statt Modelldatei), wird der Ladeversuch sofort übersprungen. Verhindert Timeouts beim Systemwechsel wenn keine Modelle vorhanden sind.
- GLTF-Modelle: Beleuchtungsfix. Materialien aus GLB-Dateien kannten den
minLight-Uniform nicht und blieben auf der Schattenseite zu dunkel. Nach dem Laden werden alle Mesh-Materialien in MeshPhongMaterial mit eingebautem minLight-Shader konvertiert; die Diffus-Textur aus dem Original wird dabei übernommen.
- GLTF-Modelle: SurfaceMode reaktiviert. Der Spacewalk funktioniert auf GLTF-Objekten korrekt, da die Kamera auf einer virtuellen Kugel mit Radius
r positioniert wird. Der Geometrie-Tausch auf hochauflösende SphereGeometry wird für GLTF-Objekte übersprungen (nicht nötig), der Rest des SurfaceModes läuft normal.
- GLTF-Modelle: Compare-Mode zeigt jetzt ebenfalls die 3D-Modelle wenn ein Modell für das verglichene Objekt vorhanden ist (nutzt den Cache des Hauptviewers, kein erneuter Download).
- GLTF/GLB-Modell-Support: Für Planeten, Monde, Asteroiden und Zwergplaneten können nun optionale 3D-Modelle hinterlegt werden. Liegt im Verzeichnis
/models/ eine Datei mit dem Objekt-Key (z.B. phobos.glb oder bennu.gltf), wird diese automatisch geladen und anstelle der bisherigen Kugel dargestellt. Skalierung erfolgt automatisch per BoundingBox-Normalisierung auf den bestehenden Radius; ein optionaler modelScale-Faktor im Datensatz erlaubt manuelle Feinkorrektur. Ohne Modelldatei verhält sich alles wie bisher. Neues Modul models.js übernimmt Laden, Caching und Dispose. SurfaceMode ist für GLTF-Objekte vorerst deaktiviert.
- Bugfix:
track-indicator (Song-Label oben rechts) und play-indicator (Script-Label oben links) waren in Systemen mit Alias-Namen vertikal versetzt. Ursache: _setTrackIndicator() setzte style.top = '10px' als Inline-Style, der den CSS-Override body.has-alias #track-indicator { top: 26px } überschrieb. Der play-indicator hat keinen JS-Top-Override und reagierte korrekt auf has-alias. Fix: Inline-top beim track-indicator nicht mehr per JS gesetzt – CSS-Kaskade entscheidet nun für beide Labels gleichermaßen.
- Bugfix: beim Zurückkehren in die Systemübersicht (per Script oder manuell) blieb das Alias-Label des zuletzt besuchten Systems weiterhin sichtbar – der Inhalt wurde nie geleert. Außerdem blieb die CSS-Klasse
body.has-alias aktiv, was den play-indicator via top: 26px-Override auf eine andere Höhe schob als den track-indicator (der per JS top: 10px bekommt). Fix: loadOverview() leert jetzt beim Einstieg direkt aliasLabel und entfernt has-alias vom Body.
- Overview: Screen-Space-Occlusion für Labels eingebaut. Der Label-Positionierungsblock wurde in drei Phasen aufgeteilt: (1) Screenposition + Kameradistanz + Bildschirmradius für alle Objekte berechnen, (2) Occlusion-Test – ein Label wird unterdrückt wenn sein Screenpunkt innerhalb des projizierten Kreises eines näheren Sterns liegt (mit kleinem Toleranzpuffer), (3) Label-Sichtbarkeit + Transform setzen. Labels von Sternen die hinter einem größeren Vordergrundstern liegen verschwinden damit korrekt.
- Daten: drei Systeme auf GCVS-Priorität (Variable-Star-Bezeichnung) umgestellt. Gliese 268 → QY Aurigae-System (Sterne A/B, Baryzentrum-Key, alle internen Referenzen aktualisiert; Aliases: Gliese 268, GJ 268, GL 268). Gliese 555 → HN Librae-System (Stern + Planet b; Aliases: Gliese 555, GJ 555, Wolf 1481). Gliese 581 → HO Librae-System (Stern + Planeten b/c/e; Aliases: Gliese 581, GJ 581, Wolf 562, BD-07°4003).
- Objektliste (Overview-Modus): Wiederholung des Worts „System" reduziert. Panel-Haupttitel von „Systeme" auf „Übersicht" (EN: „Overview") geändert; Gruppenuntertitel von „Systeme" auf „Sternsysteme" (EN: „Star Systems") – damit ist der Untertitel aussagekräftiger und der Titel redundanzfrei.
- Compare-Modus: Distanzberechnung zwischen Sternen im selben Mehrfach-System korrigiert. Bisheriger Fehler: Sterne wie Eps Indi Ba/Bb kreisen nicht direkt um den primären Stern, sondern um ein Baryzentrum – der alte Code las nur den Orbit-Radius zum direkten Elternobjekt (
orbit._rawR) und kombinierte ihn mit dem Winkel relativ zum Systemursprung. Dadurch wurden z.B. Ba→Bb als 0,54 AU (statt 2,10 AU) und A→Ba als 0,78 AU (statt ~1461 AU) ausgegeben. Fix: neue Funktion _starWorldPos2D traversiert die komplette Orbit-Kette (Stern → Baryzentrum → primärer Stern) und akkumuliert Position in AU. Euklidischer Abstand der beiden 2D-Positionen liefert die korrekte Separation.
- Bugfix: Label-Klick auf ein Objekt schrieb
focus-object ohne Panel- und Sequenz-Parameter ins Recording – beim Playback wurden daher keine Info-Panels geöffnet und kein Zoom ausgeführt. Fix: labels.js übergibt jetzt explizit panel1/2/3: true und sequence: "zoom" an runAction, damit recSerialize diese Werte korrekt ins Script schreibt.
- Bugfix: Verbindungslinie zwischen Constellation-Panel und Info-Panel blieb nach bestimmten Aktionen (Panel aus-/einblenden, System-Wechsel) dauerhaft unsichtbar. Ursache:
constellationPanelHideTemp setzte opacity: 0 als Inline-Style; wenn ShowTemp nicht korrekt gegengrift, überschrieb dieser Inline-Style die CSS-Klasse .visible { opacity: 1 }. Fix: showConstellationPanel und constellationPanelShowTemp entfernen den Inline-Opacity-Style jetzt via removeProperty statt ihn auf "" zu setzen.
- Konstellations-Panel (
_buildCstSVG in panels.js): Polarsternbilder (RA-Span > 150° und mittlere |Dec| > 65°, z.B. UMi, Oct) werden jetzt mit azimutaler äquidistanter Projektion (AEP) gerendert statt linearer RA/Dec-Projektion – der Kleine Wagen erscheint damit als korrektes Rechteck statt als Raute.
- Konstellations-Daten (
constellations.json): 13 Sternbilder (ANT, ARA, CAE, FOR, LUP, ORI, SCO, SCL, SER, SEX, UMa, UMi, VIR) auf Stellarium western_SnT als Linienbasis umgestellt; UMi behält Linien aus western_hlad (Rechteck-Kasten). Koordinatenquelle für neue Sterne: d3-celestial stars.8.json (id = HIP-Nummer).
- Recorder INIT Panel-Positionen:
move-panel wird jetzt immer geschrieben wenn eine Drag-Position vorhanden ist – unabhängig davon ob das Panel beim Recording-Start sichtbar ist. Quelle ist _panelDragPos (gespeicherte Drag-Pos), Fallback: style.left/top für sichtbare Panels.
- Reihenfolge im INIT korrigiert:
move-panel kommt jetzt vor show-panels – damit ist _panelDragPos bereits gesetzt wenn showAstroObjectInfo das Panel positioniert, und das Panel erscheint sofort an der richtigen Stelle.
resetAllPanelDragPos beim Playback-Start entfernt – nicht mehr nötig, da die korrekte Reihenfolge das Überschreibungsproblem löst und der Reset die gespeicherten Drag-Positionen für nachfolgende Recordings zerstörte.
- Diagnose-Logging in
_recBuildInitScript: zeigt beim Record-Start im F12 exakt welche Panel-Sichtbarkeiten und Positionen gelesen werden.
- Recorder INIT Panel-Positionen:
_getPanelPos liest jetzt immer direkt style.left/top vom DOM-Element statt aus _panelDragPos – da _panelDragPos beim Playback-Start zurückgesetzt wird und beim nächsten Recording-Start leer sein kann, ist der DOM die verlässliche Quelle. Damit werden Panel-Positionen auch nach einem Playback korrekt im INIT aufgezeichnet.
- Playback Panel-Positionen: beim Start des Playbacks werden alle
_panelDragPos-Einträge (Panel 1/2/3, Zone, Constellation) auf null zurückgesetzt – damit starten Panels auf Auto-Position und die move-panel-Befehle im INIT setzen die aufgezeichneten Positionen sauber ohne Überschreibung durch Laufzeit-Drag-Positionen.
- Recorder INIT:
getCstData jetzt korrekt im Recorder-Context verfügbar – Constellation-Panel-State (offen + Position) wird damit zuverlässig in den INIT-Block geschrieben.
resetAllPanelDragPos in allen relevanten Context-Ketten eingetragen (panels.js, astroviewer.html, actions.js, init.js, recorder.js).
- Recorder: Constellation-Panel-State (offen + Position) wird jetzt im INIT-Block aufgezeichnet – analog zu Infopanels 1/2/3. Beim Playback-Start wird das Panel an exakt der aufgezeichneten Position geöffnet, nicht an seiner letzten Laufzeit-Position.
- Root Cause für
move-panel und show-panel constellation gefunden: buildActionsContext() hat die Properties setPanelDragPos1/2/3/Zone, getFocusTgt, showConstellationPanel und Verwandte nicht aus dem h-Parameter in den finalen Actions-Context durchgeleitet – sie existierten nur im h-Objekt, wurden aber nie gemappt. Alle fehlenden Properties ergänzt. Damit sind move-panel 1/2/3, show-panel constellation und move-panel constellation im Playback funktional.
- Alle Diagnose-Logs entfernt.
- Playback
show-panel constellation: Root Cause gefunden – getFocusTgt im Actions-Context las eine lokale Closure-Variable (focusTgt) statt S.focusTgt. Behoben.
- Diagnose
move-panel: Erweitertes Logging – prüft ob _positionInfoPanel die gesetzte Position in den nächsten 5 Sekunden überschreibt (AUTO-OVERRIDE Warning im F12).
- Playback
move-panel 1/2/3: Gezieltes Diagnose-Logging in move-panel, show-panel constellation und showConstellationPanel eingebaut – gibt im F12 exakt aus was ankommt und was passiert.
cst_verify.html: IAU-Bild-URLs auf korrekte GIF-Pfade korrigiert (/static/public/constellations/gif/AND.gif mit Großbuchstaben-Kürzel statt Kleinbuchstaben-JPG).
- Playback
move-panel 1/2/3 behoben: move-panel schrieb die Position in S._panelDragPos (state.js), aber showAstroObjectInfo liest das interne _panelDragPos in panels.js – zwei verschiedene Objekte. Neue Export-Funktionen setPanelDragPos1/2/3/Zone schreiben direkt ins panels.js-interne Objekt. Gleiches Fix für move-zoneinfo.
- Sternbild-SVG Labels: Score-basiertes Placement statt erstem kollisionsfreiem Kandidaten. Jede Kandidatenposition bekommt einen Score basierend auf: Label-Überlappungen (+100), verdeckte Sterne (+30), durchquerte Linien (+8). Die Position mit dem niedrigsten Score gewinnt – Rigil Kentaurus/Hadar werden damit unter/neben den Sternen platziert wo keine Linien verlaufen.
- Playback Constellation-Panel:
show-panel constellation ruft jetzt showConstellationPanel() direkt mit Key und Koordinaten aus dem Focusobjekt auf – kein Umweg mehr über _infoTgt. Damit entfällt jede Timing-Abhängigkeit zwischen Playback-Steps.
- Sternbild-SVG: Label-Kollisionsprüfung eingebaut – 8 Kandidatenpositionen pro Stern (rechts, links, diagonal, oben, unten), erste kollisionsfreie wird gewählt. Hellere Sterne haben Vorrang. Überlappungen wie Rigil Kentaurus/Hadar werden damit vermieden.
cst_verify.html: Kollisionsprüfung ebenfalls eingebaut.
- Playback-Bug Constellation-Panel behoben:
showAstroObjectInfo schloss das Panel nicht mehr wenn das Sternbild gleich bleibt, und das rAF für den Badge-Handler öffnet das Panel im Playback nicht neu (verhindert Race-Condition mit show-panel constellation). Zwei rAFs sichern korrekte Timing-Reihenfolge beim Öffnen ohne sichtbares Panel 1.
- Badge-Status im Playback: Badge zeigt nach dem rAF den korrekten Aktiv-Zustand wenn das Panel bereits via Playback geöffnet wurde.
- Constellation-Panel: Breite von 260px auf 300px erhöht, SVG-Fläche von 260×160 auf 268×240px (annähernd quadratisch) – Sternbilder werden weniger gestaucht dargestellt.
- Debug-Logs aus panels.js und actions.js entfernt.
- Neues Tool
cst_verify.html: Zeigt alle Sternbilder als SVG nebeneinander mit IAU-Referenzbild – ermöglicht schnellen Vergleich ohne das Hauptprogramm.
- Sternbild-Daten: Pro Sternbild wird jetzt die Quelle mit mehr Linien gewählt (Stellarium western oder d3-celestial). AND: 16 Linien aus d3-celestial (war auf 5 reduziert), OPH: 17 Linien, PUP: 11 Linien u.a.
- AND: Mirach auf HIP 5447 (RA=17.4°, Dec=+35.6°) korrigiert – HYG-Datenbank hatte HIP-Nummern für Mirach/μ And vertauscht.
- ERI: Extra-Linie oben links (HIP 23972/21594, Stellarium-Artefakt nicht im IAU-Bild) entfernt.
- show-panel constellation: weiteres Debug-Logging in openConstellationFromCurrentPanel.
- Sternbild-Daten: Hybrider Ansatz – Linienfiguren aus Stellarium western (korrekter als d3-celestial für LEO, CEN, PUP u.a.), Koordinaten aus d3-celestial/Hipparcos. LEO hat jetzt 10 korrekte Linien (Sichel + Körper), CEN 16 Linien mit Rigil Kentaurus, PUP 7 Linien.
- AND: Almach-Label korrigiert auf HIP 9640 (RA=31°, Dec=+42°) – der tatsächliche γ Andromedae.
- show-panel constellation: weiteres Debug-Logging eingebaut (CSS-Zustand nach classList.add + 100ms-Check).
- Sternbild-Daten: Alle 53 Sternbilder jetzt aus d3-celestial (statt Stellarium western) – d3-celestial enthält die detaillierteren IAU-Linienfiguren (AND 16 Linien, OPH 17, SGR 29 usw.).
- SVG-Projektion: RA wrap-around Fix für Sternbilder die die 0°/360°-Grenze überspannen (Pegasus, Fische, Bildhauer u.a.) – werden jetzt korrekt und nicht mehr auf einen Punkt gequetscht dargestellt.
- Sternbenennungen: LIB Zubeneschamali/Zubenelgenubi korrigiert (HYG-Datenbank hat HIP-Nummern dieser zwei Sterne vertauscht). OPH Rasalhague/Cebalrai koordinatenbasiert neu zugewiesen.
- CET Tau Ceti (HIP 10826): Koordinaten von Dec=+55° (Perseus!) auf korrekte Dec=-15.9° korrigiert.
- show-panel constellation: Debug-Logging in F12 für Playback-Diagnose eingebaut.
- Sternbild-Datenbank erweitert: alle 53 im Projekt vorhandenen Sternbilder mit offiziellen Liniendaten aus Stellarium (western/constellationship.fab, v0.21.3) und Koordinaten aus d3-celestial/Hipparcos-Katalog. Fehlende Sterne (HIP 10826 η Per, HIP 33165 Aludra) aus Yale Bright Star Catalog ergänzt.
- Constellation-Panel Playback: Neue Funktion
openConstellationFromCurrentPanel() in panels.js – liest _infoTgt direkt (kein constellationKey-Lookup über actions.js, kein Playback-Guard, kein rAF-Timing-Problem mit Badge-Click). actions.js ruft diese Funktion auf statt badge.click().
- Sternbild-Daten komplett neu: ERI (26 Linien), LIB (6 Linien), OPH (17 Linien) aus offiziellen Stellarium- und d3-celestial-Quellen (HIP-Nummern + RA/Dec aus Hipparcos-Katalog). Keine geratenen Daten mehr.
- Constellation-Panel Playback: Öffnet Panel 1 automatisch und wartet auf dessen rAF-Delay (Badge-Init), bevor das Constellation-Panel angezeigt wird.
- Constellation-Badge: Klick während Playback korrekt gesperrt.
- Constellation-Panel Playback:
show-panel constellation liest das Focusobjekt jetzt direkt aus _S.focusTgt (statt Context-Getter mit veraltetem Closure-Wert). Falls Panel 1 noch nicht sichtbar ist, wird es automatisch geöffnet. Bug damit endgültig behoben.
- Constellation-Badge im InfoPanel1: klicken während Playback jetzt korrekt gesperrt.
- Sternbild-Daten LIB: fehlende Linien β–γ und γ–α ergänzt – die Waage zeigt jetzt korrekt das Dreieck (β–γ–α) plus zwei Stützen (γ–θ–υ, α–σ), 6 Linien gesamt.
- Sternbild-Daten OPH: fehlender Stern ι Oph (HIP 83895) ergänzt; östlicher Arm jetzt α–ι–ζ; Mittellinie α–θ–η; Südast η–ν sowie Boden ζ–ε–δ – 11 Linien, Figur entspricht IAU-Atlas.
- Constellation-Panel Playback:
show-panel constellation leitet alle Daten vom aktuellen Focusobjekt ab – keine cstKey/highlightRA/highlightDec-Parameter mehr. Ist Panel 1 nicht sichtbar oder kein Focusobjekt vorhanden, wird der Befehl ignoriert. getFocusTgt im Actions-Context ergänzt.
- Sternbild-SVG: RA-Achse korrigiert – RA steigt jetzt nach links (Standard-Sternatlanten, Blick von der Erde zur Himmelskugel). Waage (LIB) und Schlangenträger (OPH) werden jetzt korrekt dargestellt.
- Playback Constellation-Panel: Root Cause gefunden –
show-panels im Snapshot überschrieb das danach gescriptete show-panel constellation. Fix: Recorder erfasst jetzt den Constellation-Panel-State direkt im Snapshot (nach den Infopanels), sodass er korrekt re-played wird. Neuer Getter getCstData im Recorder-Context.
- Sternbild-SVG: RA-Projektionsrichtung korrigiert – RA steigt jetzt nach rechts (IAU/Atlas-Konvention, Blick von außen/Südblick). Sternbilder entsprechen damit Standard-Sternatlanten.
- Sternbild-SVG: Sternnamen-Labels wieder direkt neben dem Stern (rechts oder links je nach Platz), 10px, schwarzer Hintergrund – keine Führungslinien.
- Playback:
showConstellationPanel() gibt jetzt ein Promise zurück und resolved erst nach DB-Load + rAF. show-panel constellation wartet darauf bevor der Playback-Step weiterläuft.
- Sternbild-Daten LIB: letzte Linie korrigiert – sigma hängt jetzt an alpha (Zubenelgenubi) statt an beta (Zubeneschamali).
- Sternbild-Panel SVG: Label-Positionierung komplett neu – echte Rand-Projektion (Strahl von Sternmittelpunkt bis SVG-Rand), Führungslinie vom Stern zum Rand-Label, schwarzer Hintergrund.
- Sternbild-Panel Playback:
show-panel constellation speichert jetzt cstKey/RA/Dec mit – das Panel öffnet sich beim Playback auch ohne vorher fokussierten Stern korrekt.
- Sternbild-Daten OPH: Linienfehler korrigiert – die 18 falschen/überzähligen Verbindungen wurden durch die 11 offiziellen IAU-Linien (Stellarium western) ersetzt.
- Sternbild-Daten LIB: Rückwärtsverbindung (Dreieck) entfernt; korrekter linearer Stick (5 Linien nach IAU).
- Sternbild-Panel SVG: cos(Dec)-Verzerrung entfernt (hat Form verschlechtert). Sternnamen jetzt als Rand-Annotations mit gestrichelter Führungslinie und schwarzem Hintergrund – lesbar auch bei engem Platz.
- Sternbild-Panel SVG: Highlight-Marker als Crosshair – grüner Ring (#4eff9a) mit 4 kurzen Linien außen (oben/unten/links/rechts), innerer Punkt in Spektralfarbe des Sterns.
- Sternbild-Panel: Öffnen via Badge-Symbol wird jetzt als
show-panel constellation gescriptet und ist damit im Recorder/Playback steuerbar.
- Sternbild-Panel: Beim Language-Switch bleibt das Panel jetzt offen (vorher wurde es automatisch ausgeblendet).
- Sternbild-Panel SVG: Korrekte sphärische Projektion mit cos(Dec)-Korrektur – Sternbilder werden jetzt in ihren echten Proportionen dargestellt.
- Sternbild-Panel SVG: SVG-Canvas auf 260×160px vergrößert, Sternnamen-Labels 2pt größer (9px statt 7px).
- Sternbild-Panel SVG: Highlight-Marker überarbeitet – heller grüner Ring (#4eff9a wie Titel), innerer Punkt in Spektralfarbe des Sterns, kurzer dicker Pfeilzeiger aus Nordwest-Richtung.
- Sternbild-Panel: Default-Position verbessert – erscheint jetzt rechts von Panel 1 wenn Platz vorhanden, sonst links (statt immer links).
- Sternbild-Panel merkt sich die letzte Position nach dem Drag; beim erneuten Öffnen wird diese Position wiederhergestellt. Nur ein explizites Schließen via ✕ setzt die Position zurück.
- Drag des Sternbild-Panels wird jetzt im Recorder erfasst (
move-panel constellation).
move-panel unterstützt jetzt zusätzlich zu 1/2/3 auch die Werte help, help2, list und constellation – ersetzt damit move-helppanel und move-listpanel.
- Neue Befehle
show-panel und hide-panel mit denselben Panel-Werten – vereinheitlichen die bisherigen show/hide-Befehle für Help, List und Constellation.
- Overview Sternfarben: Root Cause gefunden – die Glow-Planes nutzten
spectralColor() (entsättigte Farbe), während builder.js sc.glowColor aus den categoryData nutzt (deutlich gesättigter, z.B. tiefes Orange für Sol, kräftiges Blau für A-Sterne). Overview nutzt jetzt primaryStar.glowColor || sc.glowColor identisch zu builder.js.
- Overview: Halo-Sprite entfernt – war für System-View-Skalierung ausgelegt und erschien als falscher Ring im All. Starburst-Größe auf bewährte Overview-Proportionen zurückgesetzt.
- Overview Stern-Rendering: Starburst und Halo nutzen jetzt dieselbe Sprite-Fabrik (
makeStarSpriteTex() in utils.js) wie der System-View – gleiche Canvas-Logik, gleiche Intensitätsformel (0.25 + 0.65 × logL), gleiche Sprite-Größen. Zusätzlich wird jetzt auch ein Halo-Sprite erzeugt (vorher fehlte dieser im Overview komplett). Beide Sprites verwenden AdditiveBlending identisch zum System-Renderer.
- Gürtel-Schatten: Minimum-Helligkeit wieder auf ursprünglichen Wert 0.42 zurückgesetzt – der schwache radiale Gradient war mit höherem Minimum kaum noch sichtbar.
- Overview Sternfarben:
_glowWhiteMix-Überblendung entfernt (war redundant, da spectralColor() bereits die korrekte weißliche A-Stern-Farbe liefert). Glow-Planes nutzen jetzt direkt r8/g8/b8 aus spectralColor().
- Overview Sternfarben: nutzen jetzt
spectralColor() aus utils.js statt sc.color aus den categoryData – dieselbe Farb-Logik wie im System-Renderer, damit A-Sterne (z.B. Altair) korrekt weißlich statt gelblich erscheinen.
- Gürtel-Schatten: Minimum-Helligkeit der äußeren Asteroiden von 0.42 auf 0.60 angehoben – bei steil geneigten oder nahegelegenen Gürteln (Altair) wirkten äußere Objekte fast schwarz.
- Gürtel-Schatten: fehlerhafter GLSL-Shader-Radialschatten entfernt –
dot(normalize(-worldPos), normalize(worldPos)) ergibt immer −1 und erzeugte zufällig helle/dunkle Hälften statt echtem radialen Schatten. Die CPU-seitige innerFraction-Schattierung in den instanced Color-Daten ist korrekt und wird nun ungestört genutzt.
- Overview Sternfarben: Glow-Planes, Starburst und Spikes mischen die Spektralfarbe jetzt luminositätsabhängig Richtung Weiß (bis 55% bei sehr hellen Sternen), sodass heiße Sterne wie Altair im Overview weißer statt rein blau erscheinen – näher am beleuchteten Systemansicht-Rendering.
- Overview Zoom-In Restore: beim Einzoomen in ein gedimmtes Einzelstern-System werden jetzt Glow, Halo-Scale und Mesh-Opacity im
overview-zoom-Block pro Frame aktualisiert – der normale Overview-Loop lief dort nicht (er bricht mit return ab), daher blieb der Stern visuell gedimmt während der Kamera-Einflug-Animation.
- Overview Dim-State: Stern-Mesh-Verdunklung repariert – Farb-Änderung via
material.color hatte keinen Effekt da die Farbe in die Textur gebacken ist. Stattdessen wird jetzt material.opacity des Stern-Meshes pro Frame auf 25% gedimmt (Transparenz per Flag aktiviert).
- Reaktivieren repariert: der Frame-Loop übersprang Objekte mit
_dT=1.0 via continue und stellte Mesh-Opacity und Halo-Scale nie zurück. Jetzt werden alle SingleStar-Objekte immer aktualisiert, unabhängig vom aktuellen _dT-Wert.
- Overview Dim-State Sofort-Wirkung: Architektur-Wechsel – Glow-Opacity, Halo-Scale und Label-Farbe werden jetzt direkt im Frame-Loop pro Frame aus dem
skipSingleStars-Flag berechnet statt einmalig von ovApplyDimState gesetzt. Damit ist kein Frame-Überschreiben mehr möglich und der Effekt tritt sofort beim Klick ein.
- Halo-Größe: Scale im Dim-Zustand auf 55% reduziert (vorher 30% – zu klein; vorher 100% – zu groß).
- Zoom-Animation:
_dimT zählt beim Einzoomen in ein gedimmtes System graduell 0→1; Mesh-Farbe, Glow und Label kehren flüssig zum Original zurück.
- Overview Dim-State: Sofortige Wirkung vollständig repariert – drei Ursachen behoben: (1) Nicht-flickernde Objekte bekamen nie einen Frame-Update; (2)
clearAllFocus() in labels.js hat Label-Farben bei jedem Klick auf die Originalfarbe zurückgesetzt; (3) Glow-Scale wurde ohne _dimT-Faktor gesetzt.
- Dim-Optik: Label-Farbe wird jetzt rein über RGB-Interpolation auf lesbareres Grau (160,160,160) gebracht, keine zusätzliche Opacity-Reduktion mehr. Halo-Größe wird auf 30% skaliert (vorher ungekürzt). Leuchtkraft-Änderungen über den Regler brechen den Dim-Zustand nicht mehr auf.
- Overview Einzelstern-Dimming: Ausgrauen wird jetzt sofort beim Klick der Option angewandt – der Flicker-Loop hat pro Frame die Glow-Opacity überschrieben und den Dim-Effekt rückgängig gemacht; er berücksichtigt nun
_dimT.
- Dimm-Optik verbessert: Stern-Mesh-Grauton dunkler (RGB 45/45/52 statt 80/80/90), Label-Mindest-Opacity von 0.25 auf 0.45 angehoben (besser lesbar).
- Objektliste Overview: Ausgrauen von Einzelstern-Systemen bei aktiver „Skip Single Stars"-Option funktioniert jetzt korrekt –
isSingleStarSystem fehlte im Init-Context und wurde nie an listpanel.js weitergegeben.
- show-message: Standard-Y-Position berücksichtigt nun dynamisch die Höhe des Alias-Labels – ist ein Systemalias sichtbar, wird die Nachricht entsprechend weiter nach unten versetzt.
- Objektauswahlliste: Während Playback sind alle Interaktionen im Panel (Klick, Doppelklick, Touch-Auswahl, Doppeltap) deaktiviert, sodass kein Fokus-Sprung ausgelöst werden kann.
- aliasNames bereinigt: In 16 Systemen waren Komponenten-Aliase wie „Sirius A/B", „Gliese 752 B", „HR 7703 A/B" usw. eingetragen – aliasNames sind Systemaliase, keine Sternnamen. Einzelne Komponenten-Suffixe entfernt; wo sinnvoll den Basis-Systemnamen als Alias ergänzt (z.B. „Luyten 789-6", „Gliese 845", „FL Virginis", „GJ 702", „ADS 14636").
- EGGR 372: „(G 240-72)" aus Sternnamen entfernt, G 240-72 und GJ 1221 als aliasNames eingetragen. Spektralklasse DA → DQ9P.
- 82 G. Eridani: Alias HD 20794 ergänzt.
- Gliese 229: Orbit-Radien des Braun-Zwerg-Paars B korrigiert – A kreist in 3.82 AU und B in 40.18 AU Abstand vom Schwerpunkt (Masse-gewichtetes Baryzentrum, Gesamtseparation ~44 AU). Visuelle Radien angepasst, sodass A fast im Schwerpunkt liegt und B weit draußen erscheint.
- Wolf 1055 / EQ Pegasi: Beide Sterne hatten identische Orbit-Radien. Korrekte massenskalierte Abstände eingetragen: Wolf 1055 A=64.3 AU / B=369.7 AU, EQ Pegasi A=9.33 AU / B=24.67 AU.
- WISE-Systemnahmen: Alle verbleibenden WISE-Einträge in languages.json ohne J korrigiert (wise-0855, wise-1506, wise-2209-2711, wise-1741, wise-1639).
- Gliese 784 b: Planetenmasse 10.75 → 9.4 M⊕ (korrekte Literaturwerte für GJ 784 b).
- Luyten 718 → Luyten 726-8: Systemname, Stern-Keys (luyten-718-bary-ab, luyten-718-a) und Lokalisierungseinträge in languages.json überall korrigiert. Luyten 718 als Alias eingetragen. Klammern (A) und (B) aus Sternnamen BL Ceti und UV Ceti entfernt.
- Planeten-Orbit-Zentrum: Gliese 229 A b/c, Wolf 1055 (Gliese 752 A b) und EQ Pegasi (GJ 896 A b) kreisten visuell fälschlich um den Schwerpunkt – Ursache war ein falsches Datenfeld (parentKey statt orbit.parent). Alle drei korrekt auf orbit.parent des jeweiligen Sterns A gesetzt.
- WISE- und 2MASS-Namen: In allen 16 betroffenen Systemen fehlte das J im System- und/oder Sternnamen (z.B. „WISE 0855-0714" → „WISE J0855-0714"). Alle System- und Sternnamen sowie die entsprechenden languages.json-Einträge korrigiert.
- ID-Reihenfolge: WISE J1541-2250 (ID 88) und 2MASS J0937+2931 (ID 95) waren vertauscht – Systeme und IDs korrigiert.
- Gliese 784: Alias LHS 3531 ergänzt, Spektralklasse M0.0V → M0V, Planetenmasse Gliese 784 b korrigiert (5.4 → 10.75 M⊕).
- languages.json Bereinigung: 106 überflüssige names-Einträge entfernt, bei denen DE und EN identisch waren und kein sprachlicher Mehrwert bestand (tName() gibt in diesen Fällen korrekt den Fallback-Namen zurück). Klammer-Einträge wie „(Brauner Zwerg)", „(Brown Dwarf)", „(Sigma Draconis)", „(η Cassiopeiae A)", „(LHS 397)", „(Wolf 1055)", „(VB 10)" etc. aus Sternnamen entfernt.
- starsystems.json / languages.json: Ross 882 → YZ Canis Minoris (Hauptname), keys und Lokalisierungseinträge angepasst. Gliese 908 → BR Piscium-System, Einträge konsistent. 2MASS 0937+2931 Systemname mit J korrigiert. Achird aliasNames bereinigt (Achird A/B waren fälschlich als System-Aliase eingetragen). Falscher aliases-Knoten (statt aliasNames) aus 6 Systemen entfernt, fehlende aliasNames korrekt ergänzt.
- Gliese 229 A b und A c: parentKey auf Stern A gesetzt (kreisen korrekt um Stern A, nicht Baryzentrum). Wolf 1055: Gliese 752 A b kreist ebenfalls korrekt um Stern A.
- Datenkorrekturen (15 Punkte): Stein 2051 B Spektralklasse DC → DC5. Gliese 251 c ergänzt (Super-Erde, 3.88 Me, 0.196 AU, 53.6 d, in der HZ, entdeckt 2025). Gliese 229 A b ergänzt (Super-Neptun, 14.94 Me, 1.086 AU, entdeckt 2014). Gliese 229: HZ korrekt um Stern A (nicht B). Alsafi: „Sigma Draconis" / „σ Draconis" als Alias eingetragen, nicht im Namen. Gliese 570 D: „(Brauner Zwerg)" aus dem Namen entfernt. Gliese 908 umbenannt zu BR Piscium (Hauptname), Gliese 908 als Alias. Gliese 588: „(LHS 397)" aus dem Namen entfernt, LHS 397 als Alias. Achird-System: Alias „Eta Cassiopeiae" / „η Cassiopeiae" ergänzt; Stern A heißt nur noch „Achird"; Stern B Spektralklasse K7V → K7Ve mit Flare-Eigenschaften (UV). 36 Ophiuchi A und B hatten identische Werte: A ist jetzt K2Ve (5103 K, 0.326 L☉, 0.75 M☉), B ist K1Ve (5171 K, 0.32 L☉, 0.76 M☉). Ross 882 umbenannt zu YZ Canis Minoris (Hauptname), Ross 882 als Alias. 2MASS 0937+2931: Name auf „2MASS J0937+2931" korrigiert (J fehlte). Wolf 1055: Planet Gliese 752 b kreist jetzt korrekt um das Baryzentrum des Systems.
- HZ-Quelle „gemessen" wurde für Systeme mit expliziten Literaturdaten (z.B. Proxima Centauri) trotzdem als „berechnet" angezeigt: Das _fromData-Flag wurde beim Aufbau der Zonen-Objekte nicht weitergegeben und war im Panel immer false.
- Führungslinien zum Zonen-Panel (Habitable Zone, Asteroidengürtel, Trümmergürtel etc.) und zum Sternbild-Panel wurden nicht mehr angezeigt: Das inline-style display:none der SVG-Elemente hatte Vorrang vor der CSS-Klasse .visible und verhinderte das Einblenden.
- Weiße vertikale Linie oben links behoben: Leader-SVGs erhalten jetzt display:none als Default statt als Block-Elemente im Dokumentfluss zu liegen.
- Variabilitäts-Bars (Flackern/Eruptionen) im Sternpanel haben jetzt immer gleiche Länge – linke und rechte Labels bekommen fixe Breite, unabhängig vom übersetzten Text.
- Fehlende Lokalisierung ergänzt: star.characteristic.ACYG (Alpha-Cygni-Typ, DE+EN), constellation.peg (Pegasus, DE+EN).
- Aliasnamen im Systemtitel werden jetzt alphabetisch sortiert angezeigt.
- Schwerpunkte (Barycenters) zeigen beim Hovern kein Namenslabel mehr.
- Textfarbe des Typs im Hover-Label angepasst – entspricht nun dem Grün der Infopanels.
- Sternbild-Panel (Schritt 2 – Inhalt): Das Constellation-Panel zeigt jetzt eine 2D-Sternkarte des Sternbilds. Sterne werden als Punkte dargestellt (Größe nach sichtbarer Helligkeit, Farbe nach Spektralklasse), verbunden durch die IAU-Verbindungslinien. Der angeklickte Stern ist mit einem goldenen Marker hervorgehoben. Benannte Hauptsterne (Alpha/Beta) erhalten ein kleines Label. Neue Datei: data/constellations.json mit Daten für Eridanus, Waage und Schlangenträger (die 3 häufigsten Sternbilder in unseren Systemen), basierend auf IAU-Stick-Figuren (dcf21/constellation-stick-figures, Hipparcos-Katalog).
- Sternbild-Panel (Schritt 1): Im Infopanel eines Sterns erscheint in der Sternbild-Zeile rechts ein kleines klickbares Badge mit Sternsymbolen. Ein Klick öffnet ein neues Constellation-Unterpanel mit Führungslinie zum Badge. Das Panel schließt sich automatisch wenn Infopanel 1 geschlossen wird, ist draggable, und wird in Compare-, Surface- und Script-Editor-Modus korrekt aus- und wieder eingeblendet. Lokalisierung (DE/EN) wird berücksichtigt.
- Daten: Drei doppelt erfasste Systeme bereinigt – Gliese 693 (ID 80), Gliese 754 (ID 81) und Gliese 908 (ID 82) enthielten teils grob falsche Werte (RA, Spektralklasse, Masse, Temperatur). Alle drei mit verifizierten Wikipedia/SIMBAD-Daten korrigiert, Aliase vervollständigt. Duplikate IDs 1001–1003 entfernt.
- Daten: Drei fehlende Braune-Zwerg-Systeme ergänzt – 2MASS 0937+2931 (T6p, ID 88), WISE 1541-2250 (Y0.5, ID 95) und WISE 2209+2711 (Y0, ID 97).
- Habitable Zone: Explizite HZ-Grenzen aus Literaturdaten haben jetzt Vorrang vor der automatischen Berechnung aus der Sternleuchtkraft – pro Stern gibt es nie zwei HZ-Ringe. Das HZ-Infopanel zeigt neu an, ob die Grenzen gemessen (Literaturdaten) oder berechnet wurden, und das Objekte-Label heißt bei der HZ „Planeten in HZ".
- Daten: Wissenschaftlich belegte HZ-Grenzen für 6 Systeme mit bekannten HZ-Planeten eingetragen (Proxima Centauri, Tau Ceti, Luytens Stern, Teegardens Stern, Gliese 876, GJ 1002).
- Daten: 3 fehlende Systeme aus der Liste der nächsten extrasolaren Systeme ergänzt – Gliese 555 (HN Librae, mit Exoplanet in der habitablen Zone), EQ Pegasi (GJ 896, Doppelsternsystem mit Superriesen-Planet per Astrometrie entdeckt) und Gliese 581 (HO Librae, mit 3 bestätigten Planeten). Gesamtzahl der Systeme: 101.
- Datenstruktur-Korrektur: Alias-Namen in starsystems.json werden nicht mehr als sprachgetrenntes Objekt (de/en) gespeichert, sondern als einfaches Array – konsistent mit dem bestehenden Lokalisierungskonzept (astronomische Katalognamen sind sprachunabhängig; lokalisierte Anzeigenamen laufen über languages.json). Builder und Sprachwechsel-Logik wurden entsprechend angepasst.
- Systemübersicht: Einzelstern-Systeme werden visuell gedimmt, wenn die „Einzelsterne überspringen"-Option aktiv ist – Stern, Glow, Starburst und Halo wechseln zu einem gedämpften Grauton, auch das Label wird dezenter. Beim Umschalten aktualisiert sich die Darstellung sofort. Bonus: Zoomt man direkt auf ein solches System, kehren Farbe und Leuchtkraft des Sterns graduell in seinen Originalzustand zurück.
- Objektliste im Overview: Einzelstern-Systeme werden ausgegraut dargestellt, wenn die „Einzelsterne überspringen"-Option aktiv ist – als visuelle Orientierungshilfe. Doppelklick bleibt weiterhin möglich. Die Liste aktualisiert sich beim Umschalten der Option sofort.
- Bugfix: Der Listen-Button (Objektliste) in der Topbar war während eines Script-Playbacks weiterhin aktiv und klickbar – er wird jetzt korrekt zusammen mit den anderen Topbar-Buttons deaktiviert.
- Alias-Namen der Systeme werden jetzt direkt unter dem Systemtitel angezeigt (z.B. „Rigil Kentaurus / HD 128620"), falls vorhanden – in kleiner, dezenter Schrift. Systeme ohne Aliases haben keine Lücke. Das Layout der Indikatoren (Script-Play, Songtitel) passt sich dynamisch an.
- Daten (Qualität):
aliasNames aller 98 Systeme direkt und vollständig aus dem Wikipedia-Quellentext extrahiert (Klammernamen aus der Tabelle). Systematischer Abgleich bestätigt: alle Wiki-Systeme sind erfasst. Die 13 Systeme die nicht im Wiki-Hauptnamen-Mapping erscheinen sind entweder koordinatenbasierte Einträge ohne Klammernamen (scr-1845, denis-1048, wise-1741, wise-1639, wise-1506, 2mass-0939, 2mass-1114, wise-0350, 2mass-0415, br-piscium, gj-1005) oder korrekt mit ihrem Hauptnamen erfasst: Gliese 693 (Alias: LHS 454) und Gliese 754 (Alias: L 347-14).
- Daten (Qualität):
aliasNames-Arrays aller 98 Systeme korrigiert und vervollständigt – Aliases diesmal direkt aus dem Wikipedia-Quellentext extrahiert statt aus dem Gedächtnis. Enthält alle in der Referenzliste genannten Klammernamen (Gliese-, Wolf-, LHS-, HIP-, HD-, Flamsteed-, Variablenstern-Bezeichnungen usw.), je System in DE und EN lokalisiert.
- Daten (Qualität): Alle 98 Systeme mit
aliasNames-Array versehen (DE/EN lokalisiert), der alle bekannten Alternativbezeichnungen enthält (Gliese-Nummern, Wolf-Nummern, Flamsteed-Bezeichnungen, LHS/LTT-Katalognummern, HD-Nummern, Eigennamen usw.). Erleichtert die Zuordnung zu Referenzlisten. IDs 1–98 geprüft: fortlaufend, keine verwaisten Felder in Sternen/Planeten/Zonen.
- Daten (Korrekturen): Reihenfolge-Fix rückgängig aus V10.03 und korrekt nach Wiki neu gesetzt: GJ 1116 (id=57) steht jetzt korrekt vor 70 Ophiuchi (id=58) und Altair (id=59), entsprechend dem ersten Auftreten in der Referenzliste. Zwei fehlende Systeme nachgetragen: BR Piscium (id=85, M2.5V, Fische, ~19.35 ly) und GJ 1005 A+B (id=86, M4V+M7V Doppelsystem, Walfisch, ~19.6 ly). Gesamtzahl: 98 Systeme.
- Daten (Korrekturen & Lücken): Mehrere Fehler aus den vorherigen Erfassungsrunden behoben und fehlende Systeme nachgetragen. (1) Reihenfolge-Fix: GJ 1116 (id=59) korrekt nach Altair (id=58) platziert – war fälschlicherweise vor 70 Ophiuchi. (2) Reihenfolge-Fix: Gliese 693 (id=79) vor Wolf 1055 (id=80) und GJ 570 (id=81) einsortiert gemäß RECONS-Entfernungen (19.06 ly, 19.07 ly, 19.10 ly). (3) Duplikat entfernt: LHS 3531 und Gliese 784 waren derselbe Stern (LHS 3531 = GJ 784) – lhs-3531-system gelöscht, gliese-784-system behalten. (4) Identitätsfehler korrigiert: lhs-397-system wurde zu gliese-588-system umgebaut – LHS 397 ist ein Synonym für GJ 588 (M2.5V, 19.34 ly, Wolf), nicht ein eigenständiges System. (5) Zwei fehlende Systeme ergänzt: LHS 454 (M5.0V, 19.47 ly, Wolf, id=86) und L 347-14 (M5.0V, 19.51 ly, Zentaur, id=87). Gesamtzahl: 96 Systeme.
- Daten (Sternsysteme): 5 fehlende Systeme nachgetragen und korrekt in die Referenzliste einsortiert (Nr. 82–94 neu nummeriert): Gliese 908 (M1V, alter metallarmer Roter Zwerg, ~10 Mrd. Jahre), LHS 397 (M4.5V, Zentaur), 2MASS J0136+0933 (T2.5 Brauner Zwerg, sehr jung ~150 Mio. Jahre, Carina-Near Moving Group), LHS 3531 (M4.5V, Wolf), EGGR 372/G 240-72 (DA Weißer Zwerg, Drache). IDs 82–95 entsprechend neu nummeriert.
- Daten (Sternsysteme): 10 neue Systeme erfasst (Nr. 81–90): Gliese 754 (M4.0V, ruhiger alter Roter Zwerg), Wolf 1055/Gliese 752 (M2.5V+M8Ve-Doppelsystem mit 434 AU Trennung, 1 Exoplanet), Achird/η Cassiopeiae (G0V+K7V, 70 AU, 472-jährige Umlaufbahn), 36 Ophiuchi/GJ 663 (Dreifachsystem K1V+K1V+K5V, AB-Paar bei 82 AU, C bei 4400 AU, junges System), Ross 882/YZ CMi (M4.5Ve, extrem aktiver Flackerstern, 2.78d Rotation), 82 G. Eridani/HD 20794 (G6V, 4 Exoplaneten b–e inkl. HZ-Kandidat d, Trümmergürtel ~24 AU), Gliese 268/QY Aur (enges M4V+M4.5V Spektroskopisches Doppelsystem, 10.4-Tage-Orbit, Flackersterne), Delta Pavonis/GJ 780 (G8IV Unterriese, metallreich), HR 7703/GJ 783 (K3V+K7V, 18.5 AU), Gliese 784 (M0.0V, 1 Exoplanet b). Neue Sternbild-Schlüssel und Lokalisierungen (DE/EN) in languages.json ergänzt.
- Daten (Sternsysteme): 22 neue Systeme erfasst (Nr. 59–80): Altair, WISE 1506+7027, GJ 3379, 2MASS J0817-6155, Gliese 445, 2MASS J1540-5101, 2MASS J0939-2448, GJ 3323, Gliese 526, Stein 2051, 2MASS J1114-2618, Gliese 251, LP 816-60, WISE J0350-5658, 2MASS J1835+3259, Gliese 205, 2MASS J0415-0935, Gliese 229, Alsafi, Ross 47, Gliese 570, Gliese 693. Mehrfachsysteme: Stein 2051 (M-Zwerg + Weißer Zwerg), Gliese 229 (M-Zwerg + T7-Brauner Zwerg, Exoplanet), Gliese 570 (K+M+M+T7.5, hierarchisches Dreifachsystem). Bekannte Exoplaneten eingetragen: GJ 3323 b/c, Gliese 251 b, Gliese 229 A c. Trümmergürtel bei Altair erfasst. Flackersterne und Eruptionsdaten für aktive M-Zwerge (GJ 3379, GJ 3323, LP 816-60, 2MASS J1835+3259, Ross 47, Gliese 693 u.a.) gesetzt. Habitable Zonen berechnet für alle sonnenähnlichen und hellen M-Zwerg-Systeme. Neue Sternbild-Schlüssel und Lokalisierungen (DE/EN) in languages.json ergänzt.
- Code-Konsolidierung (state.js): Ungenutzten State-Ballast entfernt. Felder für Compare-Modus (
_cmpState/Obj1/2/SysId1/2/Scene/Renderer/Camera/AnimId/Mode/_cmpCamProxy), Recorder (_recActive/_playActive/_recLines/_recScript/_playAbort/_recLastActionTime) und Surface-Modus (_surfaceMode/_surfaceTgt/surfaceRotX/Y/surfaceVelX/Y/_surfaceNormal/_surfaceMeshBackup) wurden nie aus S gelesen oder geschrieben – alle drei Module halten ihren internen State korrekt als Modul-lokale Variablen und exponieren ihn via Getter. Kommentare dokumentieren das Muster.
- Code-Konsolidierung: Toter Code, unbenutzte Imports und Header-Unvollständigkeiten bereinigt. Entfernt: leerer
pointermove-Handler in controls.js; verwaiste window._helpPanel2Open/SetOpen-Globals in astroviewer.html (nirgendwo gelesen); unbenutzte Imports DEG, STAR_R_SCALE (aus utils.js), _applyRoll (aus camera.js), getCmpSysId1/2 (aus compare.js), _resolvePlaceholders und _applyScriptVars (aus recorder.js, werden direkt in actions.js importiert). Trailing Backslash im Kommentar entfernt. Header-Kommentar in controls.js um fehlende Exports ergänzt.
- Fix (Compare-Modus, V9.96): Surface-Button nach Compare-Exit weiterhin aktiv. Eigentliche Ursache nun gefunden:
updatePanelButtons war nicht im Context-Objekt von registerControlsContext() registriert – der Aufruf in applyCompareButtonStates(false) lief daher auf einen leeren Stub. In astroviewer.html nachgetragen.
- Fix (Compare-Modus, V9.95): Surface-Button nach Compare-Exit weiterhin fälschlicherweise aktiv. Eigentliche Ursache:
applyCompareButtonStates(false) restauriert alle Button-Opacities auf den vor-Compare-Zustand (inkl. surfaceBtn auf aktiv), ruft aber danach kein updateSurfaceBtnState() auf. Fix direkt in applyCompareButtonStates() – nach dem Restore wird updatePanelButtons() aufgerufen, das den Surface-Button-State auf Basis des tatsächlichen focusTgt neu setzt.
- Fix (Compare-Modus, V9.94): Nach dem Verlassen des Compare-Modus war der Surface-Modus-Button fälschlicherweise aktiv. Ursache:
saveCamState() speicherte focusTgt nicht mit – nach dem Restore zeigte focusTgt noch auf das vor dem Compare-Start fokussierte Objekt (z.B. einen Planeten), obwohl die Kamera zurück auf das Root-Objekt (Stern/Schwerpunkt) zeigt. focusTgt wird jetzt in saveCamState/restoreCamState mitgeführt und nach dem Restore der Surface-Button-State neu berechnet.
- Fix (Compare-Modus): Nach dem Verlassen des Compare-Modus war der Surface-Modus-Button aktiv, obwohl das fokussierte Objekt ein Stern ist. Ursache:
endComparison() rief nach dem Button-Restore kein updateSurfaceBtnState() auf. Wird jetzt via updatePanelButtons() nachgeholt.
- Fix (Stern-Shader): Sichtbare vertikale Bruchlinie auf Sternen (System-View und Compare-Modus) durch UV-Seam-Artefakt im Surface-Glow-Shader. Der Noise-Algorithmus basierte auf den 2D-UV-Koordinaten der SphereGeometry, die bei U=0/1 eine harte Naht haben. Umgestellt auf 3D-Noise basierend auf dem Normalvektor – dieser ist nahtlos über die gesamte Kugeloberfläche kontinuierlich.
- Neu (Surface-Modus): Im Surface-Modus ersetzt ein neuer „Oberfläche verlassen"-Button den „Zurück zur Systemübersicht"-Button (analog zum „Vergleich verlassen"-Button im Compare-Modus). Ein Klick beendet den Surface-Modus und kehrt zur Systemansicht zurück. Der Original-Zurück-Button wird beim Betreten des Surface-Modus ausgeblendet und beim Verlassen wiederhergestellt.
- Fix (Help-Panel, V9.89): Aktivierungsstatus der „Vorheriges/Nächstes System"-Buttons wurde im Help-Panel nicht korrekt angezeigt. Ursache:
updateSysNavButtons() deaktiviert diese Buttons per HTML-disabled-Attribut, das Help-Panel prüfte aber nur opacity/pointer-events. Beides wird jetzt berücksichtigt. Außerdem löst updateSysNavButtons() nun selbst einen Help-Panel-Refresh aus.
- Fix (Surface-Modus): Im Surface-Modus waren „Vorheriges/Nächstes System", „Compare"-Button und „log/lin"-Button weiterhin aktiv, obwohl sie dort keinen Sinn ergeben. Neue Funktion
applySurfaceButtonStates() dimmmt diese vier Buttons beim Eintreten in den Surface-Modus und gibt sie beim Verlassen wieder frei.
- Fix (Help-Panel, V9.90): Help-Panels wurden beim Betreten des Compare-Modus geschlossen.
compare.js schloss sie explizit beim Start und restaurierte sie beim Exit – beides entfernt. Die Panels bleiben jetzt beim Compare-Modus-Wechsel in ihrem aktuellen Zustand.
- Fix (Help-Panel, V9.89): Surface-Mode Button änderte seinen Grau/Grün-Status im Help-Panel nicht beim Fokussieren/Defokussieren eines Objekts. Ursache:
_updateSurfaceBtnState() löste keinen Help-Panel-Refresh aus. Wrapper in astroviewer.html erweitert.
- Fix (Help-Panel, V9.89): Beim Betreten des Compare-Modus wurden die Help-Panels ausgeblendet, aber der
?-Button blieb aktiv (grün). Ursache: compare.js ruft window._helpPanelSetOpen direkt auf statt den astroviewer-Wrapper der den Button-State synct. Der Monkey-Patch in panels.js synchronisiert jetzt helpBtn2 selbst.
- Neu (Help-Panel): Deaktivierte Funktionen werden im Help-Panel jetzt grau dargestellt (Icon + Text auf
rgba(160,160,160,0.45)), aktive Funktionen bleiben grün. Die Erkennung basiert auf dem bestehenden Disable-Mechanismus (opacity: 0.30 / pointer-events: none). Das Panel wird automatisch aktualisiert bei Wechsel in/aus Overview, Compare-Modus und Playback (Start und Stop).
- Neu (Audio Track-Zuweisung): System-Tracks in
tracks.json unterstützen jetzt neben Regex auch Hash-basierte Zuweisung im Format hash:M:B (M = Modulo, B = Bucket 0..M-1). Der djb2-Hash des System-Keys wird modulo M berechnet – trifft er auf Bucket B, wird der Track gespielt. Dadurch gleichmäßige Verteilung auf alle Systeme unabhängig vom Anfangsbuchstaben (Gliese-Cluster kein Problem mehr). Die 8 System-Tracks wurden von Buchstaben-Regex auf hash:8:0 bis hash:8:7 umgestellt.
- Fix (Audio Playback): Beim Scriptstart wurde sofort der Systemsong getriggert, obwohl Audio im Script erst via
set-volume 0 deaktiviert war. Ursache: navigate-system und focus-object riefen audioOnSystemChanged/audioOnObjectFocused auf bevor set-volume ausgeführt wurde – Audio war zu diesem Zeitpunkt noch enabled. Fix: stopAudio() setzt jetzt einen internen Suppress-Flag, der alle automatischen Track-Starts blockiert bis set-volume Audio explizit wieder einschaltet.
- 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)