@itwin/core-frontend
Version:
iTwin.js frontend components
50 lines • 2.52 kB
JavaScript
/*---------------------------------------------------------------------------------------------
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
* See LICENSE.md in the project root for license terms and full copyright notice.
*--------------------------------------------------------------------------------------------*/
/** @packageDocumentation
* @module WebGL
*/
import { AttributeMap } from "../AttributeMap";
import { Matrix3 } from "../Matrix";
import { TextureUnit } from "../RenderFlags";
import { ProgramBuilder } from "../ShaderBuilder";
const computeBaseColor = `return vec4(0, 0, 0, 0);`;
const assignFragData = `FragColor = TEXTURE_CUBE(s_cube, v_texDir);`;
const computePosition = `vec3 pos = u_rot * vec3(rawPos.x, rawPos.z, -rawPos.y); return pos.xyzz;`; // rawPos swizzling accounts for iModel rotation.
const computeTexDir = `v_texDir = rawPosition.xyz;`;
const scratchRotMatrix = new Matrix3();
/** @internal */
export function createSkyBoxProgram(context) {
const prog = new ProgramBuilder(AttributeMap.findAttributeMap(undefined, false));
prog.frag.set(1 /* FragmentShaderComponent.ComputeBaseColor */, computeBaseColor);
prog.frag.set(18 /* FragmentShaderComponent.AssignFragData */, assignFragData);
prog.vert.set(10 /* VertexShaderComponent.ComputePosition */, computePosition);
prog.vert.addUniform("u_rot", 6 /* VariableType.Mat3 */, (prg) => {
prg.addGraphicUniform("u_rot", (uniform, params) => {
const rot = params.target.uniforms.frustum.viewMatrix.matrix;
const mat3 = scratchRotMatrix;
mat3.m00 = -rot.at(0, 0);
mat3.m01 = -rot.at(0, 1);
mat3.m02 = -rot.at(0, 2);
mat3.m10 = -rot.at(1, 0);
mat3.m11 = -rot.at(1, 1);
mat3.m12 = -rot.at(1, 2);
mat3.m20 = rot.at(2, 0);
mat3.m21 = rot.at(2, 1);
mat3.m22 = rot.at(2, 2);
uniform.setMatrix3(mat3);
});
});
prog.frag.addUniform("s_cube", 9 /* VariableType.SamplerCube */, (prg) => {
prg.addGraphicUniform("s_cube", (uniform, params) => {
const geom = params.geometry;
geom.cube.texture.bindSampler(uniform, TextureUnit.Zero);
});
});
prog.addInlineComputedVarying("v_texDir", 4 /* VariableType.Vec3 */, computeTexDir);
prog.vert.headerComment = "//!V! SkyBox";
prog.frag.headerComment = "//!F! SkyBox";
return prog.buildProgram(context);
}
//# sourceMappingURL=SkyBox.js.map