Skip to content

Latest commit

 

History

History
46 lines (45 loc) · 13.8 KB

File metadata and controls

46 lines (45 loc) · 13.8 KB

BUGFIXES

  • [✔️] BUG1 - Globe rendering appears flat/non-spherical instead of a proper globe projection.
  • [✔️] BUG1b - Glare-based shading looks artificial; remove glare and use smoother non-specular sphere shading.
  • [✔️] BUG2 - Inspect/callout widget is not aligned to the selected marker and does not anchor at the marker screen position.
  • [✔️] BUG3 - Compass HUD is missing even though compass visibility defaults should be enabled.
  • [✔️] BUG3b - Viewer UI editor controls do not react reliably on change events (cross-browser).
  • [✔️] BUG4 - Earth surface texture is not projected onto the sphere; it is drawn as a flat 2D overlay that does not rotate with the camera and has no occlusion (backface hiding).
  • [✔️] BUG5 - Compass HUD at bottom-right is not clickable; clicking should reset globe to initial position (north at top, lat=0, lon=0). Also, compass lacked pointer-events.
  • [✔️] BUG5b - Callout marker labels and leader lines always use hardcoded golden color (#f6b73c) instead of using each marker's assigned color.
  • [✔️] BUG6 - ISS orbit path has no segment between the last history sample (~10 min ago) and the current live ISS position, leaving a visible gap.
  • [✔️] BUG7 - Globe rotation formula incorrect: flyTo and search fly-to center on the wrong geographic location (~90° longitude offset, inverted latitude). Euler YXZ angles used (−centerLat, centerLon, 0) instead of correct (+centerLat, centerLon−90°, 0).
  • [✔️] BUG8 - Globe texture and all markers rendered mirrored (east/west flipped). The latLonToCartesian z-component sign did not match Three.js SphereGeometry UV convention; negated z and updated rotation formula from (centerLon−90°) to −(centerLon+90°).
  • [✔️] BUG8b - Horizontal grab-panning moves globe opposite to drag direction. Fixed by negating dx in panByScreenDelta.
  • [✔️] BUG8c - GeoLabel text (continent/ocean names) rendered mirrored on globe surface. Fixed UV mapping in buildCurvedStrip: changed uvs.push(t, ...) to uvs.push(1 - t, ...).
  • [✔️] BUG8d - Centering on a marker places it at the bottom of the screen instead of vertical center. Obliquity parent group adds extra X rotation; fixed by subtracting obliquityDeg from centerLat in globe group rotation.
  • [✔️] BUG9 - Earth texture in examples blocked by CORS: examples used an external NASA URL (eoimages.gsfc.nasa.gov) that lacks CORS headers, causing texture load failure. Fixed by removing the external URL and using the local bundled Earth texture.
  • [✔️] BUG10 - Earth geo-labels misplaced: OCEANIA label sat on Australia instead of the Pacific, ASIA too far north/east (Mongolia), EUROPE partly over sea. Fixed coordinates for all three and nudged AFRICA slightly north for better centering.
  • [✔️] BUG11 - Camera zooms through the planetary surface: at max zoom (4×) the camera was at z=0.75, inside the globe sphere (radius 1). Atmosphere extends to ~1.06. Fixed by deriving ZOOM_MAX from CAMERA_BASE_DISTANCE / SURFACE_MIN_DISTANCE so the camera always stays outside.
  • [✔️] BUG12 - Cluster badge ("4 markers") renders as unstyled plain text with no box/background. Fixed by adding inline styles (rounded pill with semi-transparent background).
  • [✔️] BUG12b - Clustered callout labels (large cluster members) become visible when front-facing despite being in a collapsed cluster. Fixed by checking cluster membership before the mode==='always' branch in updateVisibility.
  • [✔️] BUG13 - ISS example marker renders both a sphere dot (visualType 'dot') and the procedural 3D ISS model simultaneously; only the 3D model should be visible. Fixed by routing ISS current marker directly to createIssModel, skipping the sphere geometry.
  • [✔️] BUG14 - Loading any example takes 5-10 seconds because every example fetches the Natural Earth landmass GeoJSON from GitHub with no caching; repeated loads re-download the same data. Fixed by adding an in-memory cache for the landmass GeoJSON in loadLandmassRegions.
  • [✔️] BUG15 - Viewer UI toggle checkboxes don't hide/show controls in icon mode because the .icon-only CSS class overrides the hidden attribute. Also, the inspect button uses a magnifying-glass (search) icon instead of a proper inspect icon. Fixed by adding [hidden] { display: none !important } override and replacing the icon with a crosshair.
  • [✔️] BUG17 - Switching celestial bodies does not reload textures when switching back (e.g. Earth→Mars→Earth shows Mars texture on Earth). #loadTexture returns early on cache hit without assigning the cached texture to the new body mesh's uniform; the uniform assignment only runs in the first-load async callback. Fixed by always setting the uniform on the current body mesh material when returning from cache.
  • [✔️] BUG16 - Zooming in does not load higher-resolution textures. shouldUpgradeTexture() is imported in threeGlobeRenderer.js but never called; #updateTextures only loads 2K base textures and ignores surfaceHi/nightHi paths from resolveTexturePaths(). Fixed by adding #maybeUpgradeTextures() that checks zoom threshold and loads 8K day/night textures when zoomed in; triggered from both #updateTextures (initial scene) and #frame() (on zoom change).
  • [✔️] BUG20 - Country border GeoJSON fetch returns 404 when editor is served from /editor/ subdirectory. fetch('assets/ne_110m_countries.geojson') resolves relative to the page URL, producing /editor/assets/... instead of /assets/.... Fixed by using new URL('../../assets/...', import.meta.url) to resolve relative to the module file location.
  • [✔️] BUG19 - THREE.Color warns "Alpha component of rgba(...) will be ignored" when region capColor/sideColor uses rgba() format. MeshBasicMaterial receives the raw rgba string including alpha, but THREE.Color only supports rgb. Fixed by parsing rgba() colors to extract rgb for color and alpha for opacity.
  • [✔️] BUG21 - FlatMapRenderer.filterMarkers receives an array of IDs from GlobeController but stores it directly as #markerFilter and later tries to call it as a function, causing TypeError: this[#markerFilter] is not a function on zoom/pan. The 3D renderer (markerManager) correctly handles ID arrays; the flat map renderer must convert matchingIds to a predicate.
  • [✔️] BUG18 - Sun lighting mode (lightingMode: 'sun') does not produce correct day/night terminator. Three issues: (1) Shader computes dot(viewSpaceNormal, sunDirection) but sunDirection from getSunDirectionForBody is in body-fixed/object space — coordinate mismatch makes terminator shift as user pans. (2) #updateSunDirection is only called in renderScene(), not per-frame, so idle rotation and panning don't update the sun uniform. (3) Scene DirectionalLight stays at fixed position (-5, 3, 8) regardless of sun mode, adding wrong illumination cues. Fixed by adding vObjectNormal varying and sunLocked boolean uniform to all body/atmosphere shaders. When sunLocked=true (sun mode), NdotL uses object-space normals so the terminator stays geographically correct regardless of globe rotation. DirectionalLight now syncs to world-space sun direction per frame in sun mode.
  • [✔️] BUG22 - Grabbing cursor disappears immediately during drag. The mousemove hover handler reset the cursor on the canvas element while pointerdown also set it on the canvas. Fixed by setting cursor on the stage container instead, so grabbing persists throughout the drag.
  • [✔️] BUG22b - Editor inspect info popup renders behind the globe viewer's UI controls (compass, buttons). The .inspect-panel had no z-index, so it lost to the viewer's internal z-index: 10 controls. Fixed by adding z-index: 30 to the inspect panel.
  • [✔️] BUG23 - Planetary example scenes (Mars Landing Sites, Europa Water Features, Titan Methane Lakes) fail validation with "markers[N].lon must be within [-180, 180]". Coordinate data uses West longitude convention (0°–360°W) producing values like -225.74, -273.0, -310.0 etc. Fix: normalize all longitudes to [-180, 180] by adding 360 when lon < -180.
  • [✔️] BUG24 - FlatMapTextureProjector crashes with IndexSizeError: The source height is zero when createImageData is called with zero dimensions. Happens when the renderer is invoked before the canvas has non-zero width/height, making Math.ceil(0 / step) produce 0. Fixed by adding early return guard in project() when width or height is ≤ 0.
  • [✔️] BUG25 - Filter groups only hide markers and callouts but not arcs/paths. Toggling a movie filter in Indiana Jones example leaves flight arcs visible. Fixed by adding category field to arc/path schema normalization, adding filterArcs()/filterPaths() methods to FlatMapRenderer, ThreeGlobeRenderer (via ArcPathManager), and GlobeController, and extending globi-viewer #applyMarkerFilter to dispatch to all four entity types.
  • [✔️] BUG25b - Flat map renderer ignores arc/path strokeWidth and dashPattern from schema. Canvas drawing code read arc.width/path.dash instead of the schema-normalized arc.strokeWidth/path.dashPattern, defaulting thick lines to 2px. Also no altitude-based drop shadow. Fixed property names and added altitude-proportional drop shadow (shadowBlur, shadowOffsetY) plus lineCap: 'round' for smoother thick lines.
  • [✔️] BUG26 - Context menu actions (copy, export, drop marker, fly-to) do nothing when clicked — no clipboard content, no file download, no console error. The pointerdown close-on-outside-click handler on document used e.target which is retargeted to the <globi-viewer> shadow host in Shadow DOM, so menuEl.contains(e.target) always returned false, closing the menu before click handlers fired. Fixed by using e.composedPath() to see through Shadow DOM boundaries.
  • [✔️] BUG27 - Indiana Jones example crashes/becomes unresponsive when switching to flat map. FlatMapTextureProjector.project() allocates a full-size OffscreenCanvas + ImageData (~33MB on 2x DPI) for hi-res refinement on EVERY render frame. During arc animation (60fps), each call increments refineGeneration which cancels the previous refinement, but the allocation already happened. Result: ~4GB/s of allocation pressure causing GC thrashing and eventual tab crash. Fixed by tracking active refinement key (#activeRefineKey) and skipping redundant allocations when a refinement for the same view is already in progress.
  • [✔️] BUG28 - Country boundary vectors (GeoJSON) are fetched and rendered during init() for all planets, not just Earth. The async fetch in init() checks showBorders but never checks whether the planet is Earth, so Mars/Jupiter/etc. get country borders on first render until the next update() cycle hides them. Fixed by guarding the fetch with resolvedPlanet.id === 'earth' and adding a planet check in the fetch callback.
  • [✔️] BUG29 - Wireframe and grayscale themes render as photo mode. In renderScene(), #getPalette() was called before #currentTheme was updated, so the palette always reflected the previous theme. When switching from photo→wireframe, the photo palette (with useTextures: true) was passed to #rebuildForTheme, which skipped wireframe mode and built a textured mesh instead. Toggling themes produced mixed states (old palette colors with new theme mesh). Fixed by updating #currentTheme before calling #getPalette().
  • [✔️] BUG30 - Callout leader lines and labels render behind NATO marker sprites. Both marker sprites and callout leader lines use depthWrite: false, but without explicit renderOrder Three.js sorts by distance, causing markers (closer to surface) to draw over callout lines. Fixed by setting renderOrder: 1 on marker objects and renderOrder: 2 + depthTest: false on callout leader lines so they always draw on top.
  • [✔️] BUG31 - Blue rectangle (friendly) inline dots in Battle of Midway text did not show pinging animation when clicked. The ping code was placed after an early return that exits when the marker isn't found in the current step. Fixed by moving the ping code before the early return so it always fires, adding !important to .dot.pinging animation rules, and increasing the ping scale to 2.2× for better visibility.
  • [✔️] BUG32 - Community Create page globe preview not visible after JSON upload. GlobiViewer React wrapper called el.loadScene() which doesn't exist on the <globi-viewer> web component; the correct method is el.setScene(). The fallback setAttribute('scene', ...) also failed because scene is not in observedAttributes. Fixed by calling el.setScene(sceneJson) instead.
  • [✔️] BUG33 - Sponsor button hides after localization is soft-loaded. applyLanguage uses el.textContent = text which destroys any HTML child elements (SVGs, links) inside translated elements. FAQ cost answer mentions "GitHub Sponsors" as plain text without a clickable link. Nav sponsor <span> lacks data-i18n so it stays untranslated. llms.txt omits that Globi is free and sponsorable. Fixed by adding data-i18n-html attribute support to applyLanguage (uses innerHTML for opted-in elements), adding sponsor link to FAQ answer in all 7 languages, adding nav.sponsor translation key, and updating llms.txt with pricing/sponsor info.
  • [✔️] BUG34 - Accessibility descriptions and llms.txt report zero visible markers. The 3D renderer's projectPointToClient returns { clientX, clientY, visible } but ViewStateQuery.inViewport() reads .x/.y — since x is always undefined, no marker passes the viewport check. Also no back-face occlusion for globe markers. Fixed by normalizing property names in ViewStateQuery.project() and adding isPointOccluded() dot-product test to the 3D renderer.
  • [✔️] BUG34b - Marker description and calloutLabel fields never included in accessibility brief/detailed descriptions or dynamic llms.txt output. Only marker names were shown. Fixed by adding resolveDescription fallback chain (description → calloutLabel → name) to viewDescriber.js and llmsTxt.js.