Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 31 additions & 2 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,12 @@ export default (canvas, opts) => {
const webgl2 = !!gl
if (!gl) gl = canvas.getContext('webgl', contextOpts)

if (!gl) return { destroy: () => {}, update: () => {} }
if (!gl) {
console.warn(
'COBE: WebGL is not supported in this browser or device. The globe will not be rendered.',
)
return { destroy: () => {}, update: () => {} }
}

const instExt = webgl2 ? null : gl.getExtension('ANGLE_instanced_arrays')

Expand Down Expand Up @@ -87,7 +92,12 @@ export default (canvas, opts) => {
const markerProgram = createProgram(gl, MARKER_VERT, MARKER_FRAG)
const arcProgram = createProgram(gl, ARC_VERT, ARC_FRAG)

if (!globeProgram) return { destroy: () => {}, update: () => {} }
if (!globeProgram) {
console.warn(
'COBE: Failed to compile WebGL shaders. The globe will not be rendered.',
)
return { destroy: () => {}, update: () => {} }
}

// Buffers
const quadBuffer = gl.createBuffer()
Expand Down Expand Up @@ -591,10 +601,29 @@ export default (canvas, opts) => {
// Initialize
update({ markers, arcs })

// Handle WebGL context loss
const onContextLost = (e) => {
e.preventDefault()
console.warn(
'COBE: WebGL context lost. The globe will stop rendering. This can happen due to GPU resource limits or device sleep.',
)
}
const onContextRestored = () => {
console.warn(
'COBE: WebGL context restored. Please re-create the globe instance to resume rendering.',
)
}
canvas.addEventListener('webglcontextlost', onContextLost)
canvas.addEventListener('webglcontextrestored', onContextRestored)

// Return public API
return {
update,
destroy: () => {
// Clean up event listeners
canvas.removeEventListener('webglcontextlost', onContextLost)
canvas.removeEventListener('webglcontextrestored', onContextRestored)

// Clean up WebGL resources
gl.deleteBuffer(quadBuffer)
gl.deleteBuffer(arcSegmentBuffer)
Expand Down