@luma.gl/engine
Version:
3D Engine Components for luma.gl
77 lines (73 loc) • 2.44 kB
JavaScript
// luma.gl
// SPDX-License-Identifier: MIT
// Copyright (c) vis.gl contributors
import { Model } from "../model/model.js";
import { Geometry } from "../geometry/geometry.js";
import { uid } from "../utils/uid.js";
const CLIPSPACE_VERTEX_SHADER_WGSL = /* wgsl */ `\
struct VertexInputs {
clipSpacePositions: vec2<f32>,
texCoords: vec2<f32>,
coordinates: vec2<f32>
}
struct FragmentInputs {
Position : vec4<f32>,
position : vec2<f32>,
coordinate : vec2<f32>,
uv : vec2<f32>
};
fn vertexMain(inputs: VertexInputs) -> FragmentInputs {
var outputs: FragmentInputs;
outputs.Position = vec4(inputs.clipSpacePositions, 0., 1.);
outputs.position = inputs.clipSpacePositions;
outputs.coordinate = inputs.coordinates;
outputs.uv = inputs.texCoords;
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];
/**
* A flat geometry that covers the "visible area" that the GPU renders.
*/
export class ClipSpace extends Model {
constructor(device, props) {
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) }
}
})
});
}
}
//# sourceMappingURL=clip-space.js.map