From 6929a02804f0a6f071e1048e005da20a04809a06 Mon Sep 17 00:00:00 2001 From: archmoj Date: Tue, 4 Feb 2020 13:39:14 -0500 Subject: [PATCH 1/3] correct config for device in the second create 3-D scene try --- src/plots/gl3d/scene.js | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/src/plots/gl3d/scene.js b/src/plots/gl3d/scene.js index e26157ace03..9813b961aca 100644 --- a/src/plots/gl3d/scene.js +++ b/src/plots/gl3d/scene.js @@ -91,8 +91,9 @@ function Scene(options, fullLayout) { var proto = Scene.prototype; -proto.tryCreatePlot = function() { +proto.prepareOptions = function() { var scene = this; + var opts = { canvas: scene.canvas, gl: scene.gl, @@ -132,20 +133,37 @@ proto.tryCreatePlot = function() { opts.canvas = STATIC_CANVAS; } - var failed = 0; + return opts; +}; + +proto.tryCreatePlot = function() { + var scene = this; + + var opts = scene.prepareOptions(); + + var success = true; try { scene.glplot = createPlot(opts); } catch(e) { - failed++; - try { // try second time to fix issue with Chrome 77 https://github.com/plotly/plotly.js/issues/4233 - scene.glplot = createPlot(opts); - } catch(e) { - failed++; + if(scene.staticMode) { + success = false; + } else { // try second time + // make fresh object for options + opts = scene.prepareOptions(); + + try { + // invert preserveDrawingBuffer setup which could be resulted from is-mobile not detecting the right device + opts.glOptions.preserveDrawingBuffer = !opts.glOptions.preserveDrawingBuffer; + + scene.glplot = createPlot(opts); + } catch(e) { + success = false; + } } } - return failed < 2; + return success; }; proto.initializeGLCamera = function() { From 0a2513b80cb0183f77a89bae2b39cad221fddcdb Mon Sep 17 00:00:00 2001 From: archmoj Date: Tue, 4 Feb 2020 14:46:21 -0500 Subject: [PATCH 2/3] sync isMobile value with preserveDrawingBuffer - no need to rebuild options to avoid webgl context loss on multi-scene layouts --- src/plots/gl3d/scene.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/plots/gl3d/scene.js b/src/plots/gl3d/scene.js index 9813b961aca..0bafba64983 100644 --- a/src/plots/gl3d/scene.js +++ b/src/plots/gl3d/scene.js @@ -149,12 +149,9 @@ proto.tryCreatePlot = function() { if(scene.staticMode) { success = false; } else { // try second time - // make fresh object for options - opts = scene.prepareOptions(); - try { // invert preserveDrawingBuffer setup which could be resulted from is-mobile not detecting the right device - opts.glOptions.preserveDrawingBuffer = !opts.glOptions.preserveDrawingBuffer; + isMobile = opts.glOptions.preserveDrawingBuffer = !opts.glOptions.preserveDrawingBuffer; scene.glplot = createPlot(opts); } catch(e) { From a26e5e2262437a96cad71da9cc4b2177064b1334 Mon Sep 17 00:00:00 2001 From: archmoj Date: Wed, 12 Feb 2020 11:47:03 -0500 Subject: [PATCH 3/3] warn in case first gl3d scene failed --- src/plots/gl3d/scene.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/plots/gl3d/scene.js b/src/plots/gl3d/scene.js index 0bafba64983..f4071c4b63b 100644 --- a/src/plots/gl3d/scene.js +++ b/src/plots/gl3d/scene.js @@ -151,6 +151,13 @@ proto.tryCreatePlot = function() { } else { // try second time try { // invert preserveDrawingBuffer setup which could be resulted from is-mobile not detecting the right device + Lib.warn([ + 'webgl setup failed possibly due to', + isMobile ? 'disabling' : 'enabling', + 'preserveDrawingBuffer config.', + 'The device may not be supported by isMobile module!', + 'Inverting preserveDrawingBuffer option in second attempt to create webgl scene.' + ].join(' ')); isMobile = opts.glOptions.preserveDrawingBuffer = !opts.glOptions.preserveDrawingBuffer; scene.glplot = createPlot(opts);