UNPKG

@deck.gl/extensions

Version:

Plug-and-play functionalities for deck.gl layers

70 lines (61 loc) 2.15 kB
// deck.gl // SPDX-License-Identifier: MIT // Copyright (c) vis.gl contributors /* eslint-disable camelcase */ import {fp64} from '@luma.gl/shadertools'; import type {ShaderModule} from '@luma.gl/shadertools'; const {fp64ify, fp64ifyMatrix4} = fp64; import {project, _memoize as memoize} from '@deck.gl/core'; import type {Viewport} from '@deck.gl/core'; import project64Shader from './project64.glsl'; type Project64ModuleProps = { viewport: Viewport; }; export default { name: 'project64', dependencies: [project, fp64], vs: project64Shader, getUniforms, uniformTypes: { scale: 'vec2<f32>', // Cannot pass as vec2[16], so instead split into 2 mat4x4 viewProjectionMatrix: 'mat4x4<f32>', viewProjectionMatrix64Low: 'mat4x4<f32>' } } as ShaderModule<Project64ModuleProps>; // TODO - this module should calculate the 64 bit uniforms // It is currently done by project to minimize duplicated work const getMemoizedUniforms = memoize(calculateUniforms); function getUniforms(opts?: Project64ModuleProps | {}): Record<string, any> { if (opts && 'viewport' in opts) { const {viewProjectionMatrix, scale} = opts.viewport; // We only need to update fp64 uniforms if fp32 projection is being updated return getMemoizedUniforms({viewProjectionMatrix, scale}); } return {}; } function calculateUniforms({ viewProjectionMatrix, scale }: { viewProjectionMatrix: number[]; scale: number; }) { const glViewProjectionMatrixFP64 = fp64ifyMatrix4(viewProjectionMatrix); const viewProjectionMatrix64High = new Float32Array(16); const viewProjectionMatrix64Low = new Float32Array(16); for (let i = 0; i < 4; i++) { for (let j = 0; j < 4; j++) { // Match order used in project.viewProjectionMatrix const from = 4 * i + j; const to = 4 * j + i; viewProjectionMatrix64High[to] = glViewProjectionMatrixFP64[2 * from]; viewProjectionMatrix64Low[to] = glViewProjectionMatrixFP64[2 * from + 1]; } } return { scale: fp64ify(scale), viewProjectionMatrix: [...viewProjectionMatrix64High], viewProjectionMatrix64Low: [...viewProjectionMatrix64Low] }; }