Sfoglia il codice sorgente

fix unitTransforms visual state updating

David Sehnal 5 anni fa
parent
commit
42037074cb

+ 5 - 1
src/mol-model/structure/structure/util/unit-transforms.ts

@@ -18,8 +18,10 @@ export class StructureUnitTransforms {
     private unitOffsetMap = IntMap.Mutable<number>();
     private groupIndexMap = IntMap.Mutable<number>();
     private size: number;
-
+    
     private _isIdentity: boolean | undefined = undefined;
+    
+    version = 0;
 
     constructor(readonly structure: Structure) {
         this.unitTransforms = new Float32Array(structure.units.length * 16)
@@ -39,6 +41,7 @@ export class StructureUnitTransforms {
     }
 
     reset() {
+        this.version = 0;
         fillIdentityTransform(this.unitTransforms, this.size);
         this._isIdentity = true
     }
@@ -58,6 +61,7 @@ export class StructureUnitTransforms {
     }
 
     setTransform(matrix: Mat4, unit: Unit) {
+        this.version = (this.version + 1) % 0x7fffffff;
         Mat4.toArray(matrix, this.unitTransforms, this.unitOffsetMap.get(unit.id))
         this._isIdentity = undefined
     }

+ 4 - 2
src/mol-repr/structure/representation.ts

@@ -19,13 +19,15 @@ import { TextureMesh } from '../../mol-geo/geometry/texture-mesh/texture-mesh';
 import { Text } from '../../mol-geo/geometry/text/text';
 
 export interface StructureRepresentationState extends Representation.State {
-    unitTransforms: StructureUnitTransforms | null
+    unitTransforms: StructureUnitTransforms | null,
+    unitTransformsVersion: number
 }
 export const StructureRepresentationStateBuilder: Representation.StateBuilder<StructureRepresentationState> = {
     create: () => {
         return {
             ...Representation.createState(),
-            unitTransforms: null
+            unitTransforms: null,
+            unitTransformsVersion: -1
         }
     },
     update: (state: StructureRepresentationState, update: Partial<StructureRepresentationState>) => {

+ 6 - 2
src/mol-repr/structure/units-representation.ts

@@ -231,9 +231,13 @@ export function UnitsRepresentation<P extends UnitsParams>(label: string, ctx: R
         if (transparency !== undefined && !Transparency.areEqual(transparency, _state.transparency)) {
             newState.transparency = transparency
         }
-        if (transform !== undefined && !Mat4.areEqual(transform, _state.transform, EPSILON)) { newState.transform = transform
+        if (transform !== undefined && !Mat4.areEqual(transform, _state.transform, EPSILON)) {
+            newState.transform = transform
+        }
+        if (unitTransforms !== _state.unitTransforms || unitTransforms?.version !== state.unitTransformsVersion) {
+            newState.unitTransforms = unitTransforms
+            _state.unitTransformsVersion = unitTransforms ? unitTransforms?.version : -1
         }
-        if (unitTransforms !== _state.unitTransforms) newState.unitTransforms = unitTransforms
         if (syncManually !== _state.syncManually) newState.syncManually = syncManually
         if (markerActions !== _state.markerActions) newState.markerActions = markerActions