diff --git a/src/mol-canvas3d/canvas3d.ts b/src/mol-canvas3d/canvas3d.ts index 60b32ca19a5f47b6722835559ebc74ec69a4e151..156219dead421927c46c3de787dc0a2740423850 100644 --- a/src/mol-canvas3d/canvas3d.ts +++ b/src/mol-canvas3d/canvas3d.ts @@ -9,9 +9,8 @@ import { now } from 'mol-util/now'; import { Vec3 } from 'mol-math/linear-algebra' import InputObserver from 'mol-util/input/input-observer' -import { SetUtils } from 'mol-util/set' import Renderer, { RendererStats } from 'mol-gl/renderer' -import { RenderObject } from 'mol-gl/render-object' +import { GraphicsRenderObject } from 'mol-gl/render-object' import { TrackballControls, TrackballControlsParams } from './controls/trackball' import { Viewport } from './camera/util' @@ -29,6 +28,7 @@ import { Camera } from './camera'; import { ParamDefinition as PD } from 'mol-util/param-definition'; import { BoundingSphereHelper, DebugHelperParams } from './helper/bounding-sphere-helper'; import { decodeFloatRGB } from 'mol-util/float-packing'; +import { SetUtils } from 'mol-util/set'; export const Canvas3DParams = { // TODO: FPS cap? @@ -83,7 +83,7 @@ namespace Canvas3D { export function create(canvas: HTMLCanvasElement, container: Element, props: Partial<Canvas3DProps> = {}): Canvas3D { const p = { ...PD.getDefaultValues(Canvas3DParams), ...props } - const reprRenderObjects = new Map<Representation.Any, Set<RenderObject>>() + const reprRenderObjects = new Map<Representation.Any, Set<GraphicsRenderObject>>() const reprUpdatedSubscriptions = new Map<Representation.Any, Subscription>() const reprCount = new BehaviorSubject(0) @@ -300,11 +300,13 @@ namespace Canvas3D { function add(repr: Representation.Any) { isUpdating = true const oldRO = reprRenderObjects.get(repr) - const newRO = new Set<RenderObject>() + const newRO = new Set<GraphicsRenderObject>() repr.renderObjects.forEach(o => newRO.add(o)) if (oldRO) { - SetUtils.difference(newRO, oldRO).forEach(o => scene.add(o)) - SetUtils.difference(oldRO, newRO).forEach(o => scene.remove(o)) + if (!SetUtils.areEqual(newRO, oldRO)) { + for (const o of Array.from(newRO)) { if (!oldRO.has(o)) scene.add(o) } + for (const o of Array.from(oldRO)) { if (!newRO.has(o)) scene.remove(o) } + } } else { repr.renderObjects.forEach(o => scene.add(o)) }