UNPKG

@luma.gl/engine

Version:

3D Engine Components for luma.gl

89 lines (76 loc) 2.44 kB
// luma.gl // SPDX-License-Identifier: MIT // Copyright (c) vis.gl contributors // ClipSpace import {Device} from '@luma.gl/core'; import {Model, ModelProps} from '../model/model'; import {Geometry} from '../geometry/geometry'; import {uid} from '../utils/uid'; const CLIPSPACE_VERTEX_SHADER_WGSL = /* wgsl */ `\ struct VertexInputs { @location(0) clipSpacePosition: vec2<f32>, @location(1) texCoord: vec2<f32>, @location(2) coordinate: vec2<f32> } struct FragmentInputs { @builtin(position) Position : vec4<f32>, @location(0) position : vec2<f32>, @location(1) coordinate : vec2<f32>, @location(2) uv : vec2<f32> }; @vertex fn vertexMain(inputs: VertexInputs) -> FragmentInputs { var outputs: FragmentInputs; outputs.Position = vec4(inputs.clipSpacePosition, 0., 1.); outputs.position = inputs.clipSpacePosition; outputs.coordinate = inputs.coordinate; outputs.uv = inputs.texCoord; return outputs; } `; const CLIPSPACE_VERTEX_SHADER = /* glsl */ `\ #version 300 es in vec2 clipSpacePositions; in vec2 texCoords; in vec2 coordinates; out vec2 position; out vec2 coordinate; out vec2 uv; void main(void) { gl_Position = vec4(clipSpacePositions, 0., 1.); position = clipSpacePositions; coordinate = coordinates; uv = texCoords; } `; /* eslint-disable indent, no-multi-spaces */ const POSITIONS = [-1, -1, 1, -1, -1, 1, 1, 1]; /** Props for ClipSpace */ export type ClipSpaceProps = Omit<ModelProps, 'vs' | 'vertexCount' | 'geometry'>; /** * A flat geometry that covers the "visible area" that the GPU renders. */ export class ClipSpace extends Model { constructor(device: Device, props: ClipSpaceProps) { const TEX_COORDS = POSITIONS.map(coord => (coord === -1 ? 0 : coord)); // For WGSL we need to append the supplied fragment shader to the default vertex shader source if (props.source) { props = {...props, source: `${CLIPSPACE_VERTEX_SHADER_WGSL}\n${props.source}`}; } super(device, { id: props.id || uid('clip-space'), ...props, vs: CLIPSPACE_VERTEX_SHADER, vertexCount: 4, geometry: new Geometry({ topology: 'triangle-strip', vertexCount: 4, attributes: { clipSpacePositions: {size: 2, value: new Float32Array(POSITIONS)}, texCoords: {size: 2, value: new Float32Array(TEX_COORDS)}, coordinates: {size: 2, value: new Float32Array(TEX_COORDS)} } }) }); } }