playcanvas
Version:
Open-source WebGL/WebGPU 3D engine for the web
58 lines (57 loc) • 1.84 kB
JavaScript
var transform_default = `
uniform uScreenSize: vec4f;
uniform projectionFlipY: f32;
fn evalWorldPosition(vertexPosition: vec3f, modelMatrix: mat4x4f) -> vec4f {
var localPos: vec3f = getLocalPosition(vertexPosition);
var localPosXZ: vec2f = localPos.xz;
localPosXZ = localPosXZ * uniform.outerScale;
let positiveUnitOffset: vec2f = clamp(vertexPosition.xz, vec2f(0.0), vec2f(1.0));
let negativeUnitOffset: vec2f = clamp(-vertexPosition.xz, vec2f(0.0), vec2f(1.0));
localPosXZ = localPosXZ + (-positiveUnitOffset * uniform.innerOffset.xy + negativeUnitOffset * uniform.innerOffset.zw) * vertex_texCoord0.xy;
dTiledUvGlobal = (localPosXZ - uniform.outerScale + uniform.innerOffset.xy) * -0.5 + 1.0;
localPosXZ = localPosXZ * -0.5;
localPos = vec3f(localPosXZ.x, localPosXZ.y, localPos.y);
var posW: vec4f = modelMatrix * vec4f(localPos, 1.0);
posW = vec4f(posW.xy, 0.0, 1.0);
return posW;
}
fn getPosition() -> vec4f {
dModelMatrix = getModelMatrix();
let posW: vec4f = evalWorldPosition(vertex_position.xyz, dModelMatrix);
dPositionW = posW.xyz;
var screenPos: vec4f;
screenPos = vec4f(vertex_texCoord1.xy * 2.0 - 1.0, 0.5, 1.0);
screenPos.y *= -1.0;
screenPos = posW;
screenPos.y *= uniform.projectionFlipY;
screenPos = uniform.matrix_viewProjection * posW;
screenPos.xy = (screenPos.xy * 0.5) + 0.5;
screenPos.xy *= uniforms.uScreenSize.xy;
screenPos.xy = floor(screenPos.xy);
screenPos.xy *= uniforms.uScreenSize.zw;
screenPos.xy = (screenPos.xy * 2.0) - 1.0;
return screenPos;
}
fn getWorldPosition() -> vec3f {
return dPositionW;
}
`;
export {
transform_default as default
};