@webviz/subsurface-viewer
Version:
3D visualization component for subsurface reservoir data
107 lines • 3.86 kB
JavaScript
import { CompositeLayer } from "@deck.gl/core";
import { isEqual } from "lodash";
import { createPropertyData, computeBoundingBox } from "../utils/layerTools";
import { PrivatePointsLayer } from "./privatePointsLayer";
const defaultProps = {
"@@type": "PointsLayer",
name: "PointsLayer",
id: "points-layer",
color: [125, 0, 0, 255],
radiusUnits: "pixels",
pointRadius: 5,
pickable: true,
visible: true,
ZIncreasingDownwards: true,
depthTest: true,
};
export default class PointsLayer extends CompositeLayer {
constructor(props) {
super(props);
}
renderLayers() {
const layer = new PrivatePointsLayer(this.getSubLayerProps({
pickable: this.props.pickable,
billboard: true,
data: this.state["dataAttributes"],
_pathType: "open",
getFillColor: () => this.props.color,
getRadius: () => this.props.pointRadius,
radiusUnits: this.props.radiusUnits,
updateTriggers: {
getFillColor: [this.props.color],
getRadius: [this.props.pointRadius],
},
depthTest: this.props.depthTest,
ZIncreasingDownwards: this.props.ZIncreasingDownwards,
}));
return [layer];
}
initializeState() {
const dataAttributes = this.rebuildDataAttributes(true);
this.setState({ dataAttributes });
}
updateState({ props, oldProps }) {
const needs_reload = !isEqual(props.pointsData, oldProps.pointsData);
if (needs_reload) {
const dataAttributes = this.rebuildDataAttributes(false);
this.setState({ dataAttributes });
}
if (props.ZIncreasingDownwards != oldProps.ZIncreasingDownwards) {
this.updateBoundingBox(true);
}
}
getPickingInfo({ info }) {
var _a;
if (!info.color) {
return info;
}
const layer_properties = [];
const zScale = this.props.modelMatrix ? this.props.modelMatrix[10] : 1;
if (typeof ((_a = info.coordinate) === null || _a === void 0 ? void 0 : _a[2]) !== "undefined") {
const depth = (this.props.ZIncreasingDownwards
? -info.coordinate[2]
: info.coordinate[2]) / Math.max(0.001, zScale);
layer_properties.push(createPropertyData("Depth", depth));
}
return Object.assign(Object.assign({}, info), { properties: layer_properties });
}
rebuildDataAttributes(reportBoundingBox) {
const dataArray = this.loadData();
if (!dataArray) {
return null;
}
this.updateBoundingBox(reportBoundingBox);
return {
length: dataArray.length / 3,
attributes: {
getPosition: {
value: dataArray,
size: 3,
},
},
};
}
loadData() {
if (Array.isArray(this.props.pointsData)) {
return new Float32Array(this.props.pointsData);
}
if (this.props.pointsData instanceof Float32Array) {
return this.props.pointsData;
}
console.warn("pointsData is not array");
return new Float32Array();
}
updateBoundingBox(reportBoundingBox) {
if (this.state["dataAttributes"] &&
typeof this.props.reportBoundingBox === "function" &&
reportBoundingBox) {
const boundingBox = computeBoundingBox(this.state["dataAttributes"],
// why not for polylines ?
this.props.ZIncreasingDownwards);
this.props.reportBoundingBox({ layerBoundingBox: boundingBox });
}
}
}
PointsLayer.layerName = "PointsLayer";
PointsLayer.defaultProps = defaultProps;
//# sourceMappingURL=pointsLayer.js.map