diff --git a/src/mol-gl/scene.ts b/src/mol-gl/scene.ts index b8a8252b941c13baff32c3951cd8b1193c1f664f..e2c384baaeb41eff21a83fbedefc37d3d2ffbba9 100644 --- a/src/mol-gl/scene.ts +++ b/src/mol-gl/scene.ts @@ -1,5 +1,5 @@ /** - * Copyright (c) 2018-2022 mol* contributors, licensed under MIT, See LICENSE file for more info. + * Copyright (c) 2018-2023 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Alexander Rose <alexander.rose@weirdbyte.de> * @author David Sehnal <david.sehnal@gmail.com> @@ -105,6 +105,10 @@ namespace Scene { let boundingSphereDirty = true; let boundingSphereVisibleDirty = true; + let markerAverageDirty = true; + let opacityAverageDirty = true; + let hasOpaqueDirty = true; + let markerAverage = 0; let opacityAverage = 0; let hasOpaque = false; @@ -165,9 +169,9 @@ namespace Scene { } renderables.sort(renderableSort); - markerAverage = calculateMarkerAverage(); - opacityAverage = calculateOpacityAverage(); - hasOpaque = calculateHasOpaque(); + markerAverageDirty = true; + opacityAverageDirty = true; + hasOpaqueDirty = true; return true; } @@ -189,9 +193,9 @@ namespace Scene { const newVisibleHash = computeVisibleHash(); if (newVisibleHash !== visibleHash) { boundingSphereVisibleDirty = true; - markerAverage = calculateMarkerAverage(); - opacityAverage = calculateOpacityAverage(); - hasOpaque = calculateHasOpaque(); + markerAverageDirty = true; + opacityAverageDirty = true; + hasOpaqueDirty = true; visibleHash = newVisibleHash; return true; } else { @@ -268,9 +272,9 @@ namespace Scene { } else { syncVisibility(); } - markerAverage = calculateMarkerAverage(); - opacityAverage = calculateOpacityAverage(); - hasOpaque = calculateHasOpaque(); + markerAverageDirty = true; + opacityAverageDirty = true; + hasOpaqueDirty = true; }, add: (o: GraphicsRenderObject) => commitQueue.add(o), remove: (o: GraphicsRenderObject) => commitQueue.remove(o), @@ -311,12 +315,24 @@ namespace Scene { return boundingSphereVisible; }, get markerAverage() { + if (markerAverageDirty) { + markerAverage = calculateMarkerAverage(); + markerAverageDirty = true; + } return markerAverage; }, get opacityAverage() { + if (opacityAverageDirty) { + opacityAverage = calculateOpacityAverage(); + opacityAverageDirty = true; + } return opacityAverage; }, get hasOpaque() { + if (hasOpaqueDirty) { + hasOpaque = calculateHasOpaque(); + hasOpaqueDirty = true; + } return hasOpaque; }, };