diff --git a/dashboard/js/app.js b/dashboard/js/app.js index 69beed8..8315900 100644 --- a/dashboard/js/app.js +++ b/dashboard/js/app.js @@ -2286,13 +2286,7 @@ // Fallback without Layers module var btn = document.getElementById('fresnel-toggle-btn'); var isActive = btn && btn.classList.contains('active'); - if (isActive) { - Viz3D.toggleFresnelZones(false); - if (btn) btn.classList.remove('active'); - } else { - Viz3D.toggleFresnelZones(true); - if (btn) btn.classList.add('active'); - } + toggleFresnelDebugOverlay(!isActive); } }; @@ -2307,11 +2301,6 @@ window.toggleFresnelDebugOverlay = function(visible) { state.fresnelDebugVisible = visible; - // Sync Viz3D Fresnel zones with debug overlay state - if (window.Viz3D && Viz3D.toggleFresnelZones) { - Viz3D.toggleFresnelZones(visible); - } - // Sync toolbar button var btn = document.getElementById('fresnel-toggle-btn'); if (btn) { diff --git a/dashboard/js/fresnel.js b/dashboard/js/fresnel.js index bfe17e7..f1f8fe5 100644 --- a/dashboard/js/fresnel.js +++ b/dashboard/js/fresnel.js @@ -233,22 +233,16 @@ function removeFresnelEllipsoid(ellipsoid) { if (!ellipsoid) return; - if (ellipsoid.wireframe && _scene) { - _scene.remove(ellipsoid.wireframe); - ellipsoid.wireframe.geometry.dispose(); - if (ellipsoid.wireframe.material) { - ellipsoid.wireframe.material.dispose(); - } + if (ellipsoid.wireframe) { + if (_scene) _scene.remove(ellipsoid.wireframe); + if (ellipsoid.wireframe.geometry) ellipsoid.wireframe.geometry.dispose(); + if (ellipsoid.wireframe.material) ellipsoid.wireframe.material.dispose(); } - if (ellipsoid.fill && _scene) { - _scene.remove(ellipsoid.fill); - if (ellipsoid.fill.geometry) { - ellipsoid.fill.geometry.dispose(); - } - if (ellipsoid.fill.material) { - ellipsoid.fill.material.dispose(); - } + if (ellipsoid.fill) { + if (_scene) _scene.remove(ellipsoid.fill); + if (ellipsoid.fill.geometry) ellipsoid.fill.geometry.dispose(); + if (ellipsoid.fill.material) ellipsoid.fill.material.dispose(); } } diff --git a/dashboard/js/fresnel.test.js b/dashboard/js/fresnel.test.js index 43ce1e3..7ceeefa 100644 --- a/dashboard/js/fresnel.test.js +++ b/dashboard/js/fresnel.test.js @@ -30,6 +30,8 @@ describe('Fresnel Module', function() { this.position = { copy: function() {} }; this.quaternion = { copy: function() {} }; this.userData = {}; + this.geometry = { dispose: function() {} }; + this.material = { dispose: function() {} }; }, MeshBasicMaterial: function() {}, Mesh: function() { @@ -37,6 +39,8 @@ describe('Fresnel Module', function() { this.position = { copy: function() {} }; this.quaternion = { copy: function() {} }; this.userData = {}; + this.geometry = { dispose: function() {} }; + this.material = { dispose: function() {} }; }, DoubleSide: 2 }; diff --git a/dashboard/js/viz3d.js b/dashboard/js/viz3d.js index d1ebae1..3ad6cb5 100644 --- a/dashboard/js/viz3d.js +++ b/dashboard/js/viz3d.js @@ -2914,9 +2914,9 @@ const Viz3D = (function () { // Ellipsoid semi-axes calculation // For a prolate spheroid with foci at tx and rx: // Semi-major axis (a) = (d + deltaL) / 2 - // Semi-minor axis (b) = sqrt(deltaL * (d + deltaL)) / 2 + // Semi-minor axis (b) = sqrt(deltaL * (2*d + deltaL)) / 2 const a = (d + deltaL) / 2; - const b = Math.sqrt(deltaL * (d + deltaL)) / 2; + const b = Math.sqrt(Math.max(0, deltaL * (2 * d + deltaL))) / 2; // Center of ellipsoid (midpoint between TX and RX) const center = new THREE.Vector3().addVectors(tx, rx).multiplyScalar(0.5);