Browse Source

sphere3d extrema fixes

Alexander Rose 4 years ago
parent
commit
6f5bcdef90

+ 1 - 1
src/mol-math/geometry/boundary-helper.ts

@@ -93,7 +93,7 @@ export class BoundaryHelper {
     }
 
     getSphere(sphere?: Sphere3D) {
-        return Sphere3D.setExtrema(this.centroidHelper.getSphere(sphere), this.extrema);
+        return Sphere3D.setExtrema(this.centroidHelper.getSphere(sphere), [...this.extrema]);
     }
 
     getBox(box?: Box3D) {

+ 6 - 9
src/mol-math/geometry/primitives/sphere3d.ts

@@ -32,7 +32,7 @@ namespace Sphere3D {
 
     export function clone(a: Sphere3D): Sphere3D {
         const out = create(Vec3.clone(a.center), a.radius);
-        if (hasExtrema(a)) out.extrema = a.extrema;
+        if (hasExtrema(a)) out.extrema = a.extrema.map(e => Vec3.clone(e));
         return out;
     }
 
@@ -45,16 +45,17 @@ namespace Sphere3D {
     export function copy(out: Sphere3D, a: Sphere3D) {
         Vec3.copy(out.center, a.center);
         out.radius = a.radius;
-        if (hasExtrema(a)) setExtrema(out, a.extrema);
+        if (hasExtrema(a)) setExtrema(out, a.extrema.map(e => Vec3.clone(e)));
         return out;
     }
 
+    /** Note that `extrema` must not be reused elsewhere */
     export function setExtrema(out: Sphere3D, extrema: Vec3[]): Sphere3D {
         if (out.extrema !== undefined) {
             out.extrema.length = 0;
             out.extrema.push(...extrema);
         } else {
-            out.extrema = [...extrema];
+            out.extrema = extrema;
         }
         return out;
     }
@@ -93,9 +94,7 @@ namespace Sphere3D {
         Vec3.transformMat4(out.center, sphere.center, m);
         out.radius = sphere.radius * Mat4.getMaxScaleOnAxis(m);
         if (hasExtrema(sphere)) {
-            setExtrema(out, [
-                ...sphere.extrema.map(e => Vec3.transformMat4(Vec3(), e, m)),
-            ]);
+            setExtrema(out, sphere.extrema.map(e => Vec3.transformMat4(Vec3(), e, m)));
         }
         return out;
     }
@@ -104,9 +103,7 @@ namespace Sphere3D {
     export function translate(out: Sphere3D, sphere: Sphere3D, v: Vec3) {
         Vec3.add(out.center, sphere.center, v);
         if (hasExtrema(sphere)) {
-            setExtrema(out, [
-                ...sphere.extrema.map(e => Vec3.add(Vec3(), e, v)),
-            ]);
+            setExtrema(out, sphere.extrema.map(e => Vec3.add(Vec3(), e, v)));
         }
         return out;
     }