Skip to content

Plugin State Representation

The state of the plugin is represented by a JS Object with these components (described in more detail below):

interface Snapshot {
    // Snapshot of data state tree
    data?: State.Snapshot,
    // Snapshot of behavior state tree
    behaviour?: State.Snapshot,
    // Snapshot for current animation,
    animation?: PluginAnimationManager.Snapshot,
    // Saved camera positions
    cameraSnapshots?: CameraSnapshotManager.StateSnapshot,
    canvas3d?: {
        // Current camera position
        camera?: Camera.Snapshot,
        // Viewport properties such as background color
        viewport?: Canvas3DProps
    }
}

When defining the state object, all components are optional, i.e., it is possible to define just the data component.

Example state is available here. In the plugin, it is possible to create and load these objects using Download JSON and Open JSON buttons in the State Snapshots section.

State Tree

The data and behavior of the plugin is stored in a tree data structure implemented in the mol-state module. This data structure strictly separates the definition of the state with its actual instantiation, similar to the relation of HTML and DOM in web browsers.

The snapshot itself is a JS Object with these components

interface State.Snapshot {
    tree: StateTree.Serialized
}

interface StateTree.Serialized {
    // Transforms serialized in pre-order
    // The first transform must always be a special "root" node with ref: '-=root=-'
    transforms: [Transform.Serialized, StateObjectCell.State][]
}

interface Transform.Serialized {
    // id of the parent transform
    parent: string,
    // id of the corresponding transformer
    transformer: string,
    // parameters of the transform
    params: any,
    // Properties
    props: Transform.Props,
    // reference to this transform node (a unique string, can be UUID)
    ref: string,
    // version of the node (a unique string, can be UUID)
    version: string
}

interface Transform.Props {
    // tag used in state related operation
    tag?: string
    // is the node visible in the UI
    isGhost?: boolean,
    // is the node bound to its parent? (shown as a single node in the UI)
    isBinding?: boolean
}

"Built-in" data state transforms and description of their parameters are defined in mol-plugin/state/transforms. Behavior transforms are defined in mol-plugin/behavior.

Animation State

Defined by CameraSnapshotManager.StateSnapshot in mol-plugin/state/animation/manager.ts.

Canvas3D State

Defined by Canvas3DParams in mol-canvas3d/canvas3d.ts.

Camera Snapshots

The camera position (defined in mol-canvas3d/camera.ts) is a plain JS object with the type:

interface Camera.Snapshot {
    mode: Mode, // = 'perspective' | 'orthographic'

    position: Vec3, // array with [x, y, z]
    // Normalized camera direction
    direction: Vec3, // array with [x, y, z]
    up: Vec3, // array with [x, y, z]
    target: Vec3, // array with [x, y, z]

    near: number,
    far: number,
    fogNear: number,
    fogFar: number,

    fov: number,
    zoom: number
}

The cameraSnapshots component of the state are defined in mol-plugin/state/camera.ts

interface CameraSnapshotManager.StateSnapshot {
    entries: Entry[]
}

interface Entry {
    id: UUID, // or any string
    timestamp: string, // timestamp usually in UTC format
    name?: string, // optional name
    description?: string, // optional description
    snapshot: Camera.Snapshot
}