@deck.gl/core
Version:
deck.gl core library
82 lines (65 loc) • 2.45 kB
text/typescript
// deck.gl
// SPDX-License-Identifier: MIT
// Copyright (c) vis.gl contributors
import {deepEqual} from '../utils/deep-equal';
import type Layer from './layer';
import type CompositeLayer from './composite-layer';
import type {UpdateParameters} from './layer';
import type {LayerContext} from './layer-manager';
export default abstract class LayerExtension<OptionsT = unknown> {
static defaultProps = {};
static extensionName = 'LayerExtension';
static get componentName() {
return Object.prototype.hasOwnProperty.call(this, 'extensionName') ? this.extensionName : '';
}
opts!: OptionsT;
constructor(opts?: OptionsT) {
if (opts) {
this.opts = opts;
}
}
/** Returns true if two extensions are equivalent */
equals(extension: LayerExtension<OptionsT>): boolean {
if (this === extension) {
return true;
}
// Compare extensions shallowly
return this.constructor === extension.constructor && deepEqual(this.opts, extension.opts, 1);
}
/** Only called if attached to a primitive layer */
getShaders(this: Layer, extension: this): any {
return null;
}
/** Only called if attached to a CompositeLayer */
getSubLayerProps(this: CompositeLayer, extension: this): any {
const {defaultProps} = extension.constructor as typeof LayerExtension;
const newProps = {
updateTriggers: {}
};
/* eslint-disable max-depth */
for (const key in defaultProps) {
if (key in this.props) {
const propDef = defaultProps[key];
const propValue = this.props[key];
newProps[key] = propValue;
if (propDef && propDef.type === 'accessor') {
newProps.updateTriggers[key] = this.props.updateTriggers[key];
if (typeof propValue === 'function') {
newProps[key] = this.getSubLayerAccessor(propValue);
}
}
}
}
/* eslint-enable max-depth */
return newProps;
}
/* eslint-disable @typescript-eslint/no-empty-function */
initializeState(this: Layer, context: LayerContext, extension: this): void {}
updateState(this: Layer, params: UpdateParameters<Layer>, extension: this): void {}
onNeedsRedraw(this: Layer, extension: this): void {}
getNeedsPickingBuffer(this: Layer, extension: this): boolean {
return false;
}
draw(this: Layer, params: any, extension: this): void {}
finalizeState(this: Layer, context: LayerContext, extension: this): void {}
}