UNPKG

@webviz/subsurface-viewer

Version:

3D visualization component for subsurface reservoir data

182 lines 8.13 kB
import { isEqual } from "lodash"; import { CompositeLayer } from "@deck.gl/core"; import { PrivatePolylinesLayer } from "../polylines/privatePolylinesLayer"; import { GpglValueMappedSurfaceLayer, } from "../gpglLayers/gpglValueMappedSurfaceLayer"; import { createPropertyData, computeBoundingBox } from "../utils/layerTools"; import { addPoints3D } from "../../utils"; const defaultCageProps = { widthUnits: "meters", lineWidth: 2, color: [255, 100, 0], visible: true, }; const defaultProps = { "@@type": "SeismicLayer", name: "SeismicLayer", id: "seismic-layer", cage: defaultCageProps, seismicFences: [], material: { ambient: 0.35, diffuse: 0.9, shininess: 32, specularColor: [38, 38, 38], }, smoothShading: false, pickable: true, visible: true, depthTest: true, ZIncreasingDownwards: true, }; export default class SeismicLayer extends CompositeLayer { initializeState() { const cageAttributes = this.rebuildCageAttributes(true); this.setState({ cageAttributes, }); } updateState({ props, oldProps }) { var _a, _b, _c, _d, _e, _f, _g, _h, _j; const needs_reload_cage = !isEqual((_a = props.cage) === null || _a === void 0 ? void 0 : _a.origin, (_b = oldProps.cage) === null || _b === void 0 ? void 0 : _b.origin) || !isEqual((_c = props.cage) === null || _c === void 0 ? void 0 : _c.edgeU, (_d = oldProps.cage) === null || _d === void 0 ? void 0 : _d.edgeU) || !isEqual((_e = props.cage) === null || _e === void 0 ? void 0 : _e.edgeV, (_f = oldProps.cage) === null || _f === void 0 ? void 0 : _f.edgeV) || !isEqual((_g = props.cage) === null || _g === void 0 ? void 0 : _g.edgeW, (_h = oldProps.cage) === null || _h === void 0 ? void 0 : _h.edgeW) || !isEqual(props.ZIncreasingDownwards, oldProps.ZIncreasingDownwards); if (needs_reload_cage) { const cageAttributes = this.rebuildCageAttributes(false); this.setState(Object.assign(Object.assign({}, this.state), { cageAttributes })); } const needs_reload_fences = !isEqual(props.seismicFences.length, (_j = oldProps.seismicFences) === null || _j === void 0 ? void 0 : _j.length) || props.seismicFences.some((fence, index) => { var _a; const oldFence = (_a = oldProps.seismicFences) === null || _a === void 0 ? void 0 : _a[index]; return ( // do not use isEqual for performance: it iterates on each element fence.topology !== (oldFence === null || oldFence === void 0 ? void 0 : oldFence.topology) || fence.vertices !== (oldFence === null || oldFence === void 0 ? void 0 : oldFence.vertices) || fence.normals !== (oldFence === null || oldFence === void 0 ? void 0 : oldFence.normals) || fence.texCoords !== (oldFence === null || oldFence === void 0 ? void 0 : oldFence.texCoords) || //fence.seismicData !== oldFence?.seismicData || fence.vertexIndices.value !== (oldFence === null || oldFence === void 0 ? void 0 : oldFence.vertexIndices.value) || fence.vertexIndices.size !== (oldFence === null || oldFence === void 0 ? void 0 : oldFence.vertexIndices.size)); }); if (needs_reload_fences) { const fences = this.rebuildFencesAttributes(); this.setState(Object.assign(Object.assign({}, this.state), { seismicFences: fences !== null && fences !== void 0 ? fences : [] })); } } rebuildCageAttributes(reportBoundingBox) { const cageDataArrays = this.loadCageData(); if (typeof this.props.reportBoundingBox === "function" && reportBoundingBox) { const boundingBox = computeBoundingBox(cageDataArrays.positions); this.props.reportBoundingBox({ layerBoundingBox: boundingBox }); } return { length: cageDataArrays.linesCount, startIndices: cageDataArrays.startIndices, attributes: { getPath: { value: cageDataArrays.positions, size: 3, }, }, }; } loadCageData() { // build the list of vertices to represent the cage const cage = this.props.cage; const pO = cage.origin; const pU = addPoints3D(cage.origin, cage.edgeU); const pV = addPoints3D(cage.origin, cage.edgeV); const pW = addPoints3D(cage.origin, cage.edgeW); const pUV = addPoints3D(pU, cage.edgeV); const pUW = addPoints3D(pU, cage.edgeW); const pVW = addPoints3D(pV, cage.edgeW); const pUVW = addPoints3D(pUV, cage.edgeW); const vertices = [ ...pO, // base side ...pU, ...pUV, ...pV, ...pO, ...pW, // front side ...pUW, ...pU, ...pUV, // right side ...pUVW, ...pUW, ...pW, // top side ...pVW, ...pUVW, ...pVW, // junction ...pV, // close back and left sides ]; return { positions: new Float32Array(vertices), linesCount: 1, startIndices: new Uint32Array([0, vertices.length / 3]), }; } rebuildFencesAttributes() { return this.props.seismicFences; } getPickingInfo({ info }) { var _a; if (!info.color) { return info; } const layer_properties = []; const zScale = this.props.modelMatrix ? this.props.modelMatrix[10] : 1; if (((_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 }); } renderLayers() { var _a, _b; const cage = this.state["cageAttributes"]; const cageLayer = new PrivatePolylinesLayer(this.getSubLayerProps({ id: "polylines-layer", widthUnits: this.props.cage.widthUnits, billboard: true, jointRounded: true, capRounded: true, data: cage, _pathType: "open", getColor: () => this.props.cage.color, getWidth: () => this.props.cage.lineWidth, updateTriggers: { getColor: [this.props.cage.color], getWidth: [this.props.cage.lineWidth], }, visible: (_a = this.props.cage.visible) !== null && _a !== void 0 ? _a : defaultCageProps.visible, pickable: this.props.pickable, depthTest: this.props.depthTest, ZIncreasingDownwards: this.props.ZIncreasingDownwards, })); const seismicFences = this.state["seismicFences"]; const seismicLayer = new GpglValueMappedSurfaceLayer(this.getSubLayerProps({ id: `seismic-fence-layer`, valueMappedTriangles: seismicFences, showMesh: this.props.showMesh, colormap: this.props.colormap, colormapSetup: this.props.colormapSetup, material: this.props.material === true ? defaultProps.material : this.props.material, smoothShading: (_b = this.props.smoothShading) !== null && _b !== void 0 ? _b : defaultProps.smoothShading, pickable: this.props.pickable, depthTest: this.props.depthTest, ZIncreasingDownwards: this.props.ZIncreasingDownwards, })); return [cageLayer, seismicLayer]; } } SeismicLayer.layerName = "SeismicLayer"; SeismicLayer.defaultProps = defaultProps; //# sourceMappingURL=seismicLayer.js.map