diff --git a/theme_3d_systems/static/src/js/three/three_core_loader.js b/theme_3d_systems/static/src/js/three/three_core_loader.js new file mode 100644 index 0000000..1ac3c70 --- /dev/null +++ b/theme_3d_systems/static/src/js/three/three_core_loader.js @@ -0,0 +1,42 @@ +/** @odoo-module **/ + +/** + * Three.js Dynamic Lazy Loader for Odoo 19 + * Loads Three.js on demand without blocking critical page rendering. + */ +let threePromise = null; + +export async function loadThree() { + if (window.THREE) { + return window.THREE; + } + if (threePromise) { + return threePromise; + } + + threePromise = new Promise((resolve, reject) => { + const script = document.createElement('script'); + script.src = 'https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js'; + script.crossOrigin = 'anonymous'; + script.onload = () => { + if (window.THREE) { + resolve(window.THREE); + } else { + reject(new Error('Three.js failed to load properly.')); + } + }; + script.onerror = () => reject(new Error('Network error loading Three.js')); + document.head.appendChild(script); + }); + + return threePromise; +} + +export function isWebGLSupported() { + try { + const canvas = document.createElement('canvas'); + return !!(window.WebGLRenderingContext && (canvas.getContext('webgl') || canvas.getContext('experimental-webgl'))); + } catch (e) { + return false; + } +}