|
@@ -12,6 +12,7 @@ import { Camera } from '../../mol-canvas3d/camera';
|
|
|
import { Loci } from '../../mol-model/loci';
|
|
|
import { BoundaryHelper } from '../../mol-math/geometry/boundary-helper';
|
|
|
import { GraphicsRenderObject } from '../../mol-gl/render-object';
|
|
|
+import { StructureElement } from '../../mol-model/structure';
|
|
|
|
|
|
// TODO: make this customizable somewhere?
|
|
|
const DefaultCameraFocusOptions = {
|
|
@@ -25,6 +26,15 @@ export type CameraFocusOptions = typeof DefaultCameraFocusOptions
|
|
|
export class CameraManager {
|
|
|
private boundaryHelper = new BoundaryHelper('98');
|
|
|
|
|
|
+ private transformedLoci(loci: Loci) {
|
|
|
+ if (StructureElement.Loci.is(loci)) {
|
|
|
+ // use decorated (including 3d transforms) parent structure
|
|
|
+ const parent = this.plugin.helpers.substructureParent.get(loci.structure)?.obj?.data;
|
|
|
+ if (parent) loci = StructureElement.Loci.remap(loci, parent);
|
|
|
+ }
|
|
|
+ return loci;
|
|
|
+ }
|
|
|
+
|
|
|
focusRenderObjects(objects?: ReadonlyArray<GraphicsRenderObject>, options?: Partial<CameraFocusOptions>) {
|
|
|
if (!objects) return;
|
|
|
const spheres: Sphere3D[] = [];
|
|
@@ -47,7 +57,7 @@ export class CameraManager {
|
|
|
if (Array.isArray(loci) && loci.length > 1) {
|
|
|
const spheres = [];
|
|
|
for (const l of loci) {
|
|
|
- const s = Loci.getBoundingSphere(l);
|
|
|
+ const s = Loci.getBoundingSphere(this.transformedLoci(l));
|
|
|
if (s) spheres.push(s);
|
|
|
}
|
|
|
|
|
@@ -64,9 +74,9 @@ export class CameraManager {
|
|
|
sphere = this.boundaryHelper.getSphere();
|
|
|
} else if (Array.isArray(loci)) {
|
|
|
if (loci.length === 0) return;
|
|
|
- sphere = Loci.getBoundingSphere(loci[0]);
|
|
|
+ sphere = Loci.getBoundingSphere(this.transformedLoci(loci[0]));
|
|
|
} else {
|
|
|
- sphere = Loci.getBoundingSphere(loci);
|
|
|
+ sphere = Loci.getBoundingSphere(this.transformedLoci(loci));
|
|
|
}
|
|
|
|
|
|
if (sphere) {
|