@babylonjs/viewer
Version:
The Babylon Viewer aims to simplify a specific but common Babylon.js use case: loading, viewing, and interacting with a 3D model.
98 lines (96 loc) • 4.17 kB
JavaScript
const STAGE_FRAGMENT = 2;
function createPbrTemplateExt(flags) {
const { _hasUvTransform, _hasVertexColor, _hasUv2, _hasAnyNormal, _hasEmissiveTexture, _hasSpecGloss } = flags;
const uv2Mask = _hasUv2 ? flags._uv2Mask : 0;
const baseUvFor = (bit) => uv2Mask & bit ? "input.uv2" : "input.uv";
const _hasOcclusionUv2 = !!(uv2Mask & 32);
const PBR2_OCCL_UV_SPLIT = 1 << 28;
const _hasOcclusionSplit = ((flags._features2 ?? 0) & PBR2_OCCL_UV_SPLIT) !== 0;
const uvTransformUboFields = (name) => [
{ _name: `${name}UVm`, _type: "vec4<f32>" },
{ _name: `${name}UVt`, _type: "vec4<f32>" }
];
const uvVarName = (name, bit) => _hasUvTransform ? `${name}UV` : baseUvFor(bit);
const uvTransformDecl = (name, bit) => _hasUvTransform ? `let ${name}UV = txfUV(${baseUvFor(bit)}, material.${name}UVm, material.${name}UVt.xy);
` : "";
const UV_TRANSFORM_HELPER_WGSL = _hasUvTransform ? `fn txfUV(uv: vec2<f32>, m: vec4<f32>, t: vec2<f32>) -> vec2<f32> {
return vec2<f32>(dot(m.xy, uv), dot(m.zw, uv)) + t;
}
` : "";
const extraVertexAttributes = [];
if (_hasUv2) {
extraVertexAttributes.push({ _name: "uv2", _type: "vec2<f32>", _gpuFormat: "float32x2", _arrayStride: 8 });
}
if (_hasVertexColor) {
extraVertexAttributes.push({ _name: "color", _type: "vec4<f32>", _gpuFormat: "float32x4", _arrayStride: 16 });
}
const extraVaryings = [];
if (_hasUv2) {
extraVaryings.push({ _name: "uv2", _type: "vec2<f32>" });
}
if (_hasVertexColor) {
extraVaryings.push({ _name: "vColor", _type: "vec4<f32>" });
}
const extraMaterialUboFields = [];
if (_hasUvTransform) {
extraMaterialUboFields.push(...uvTransformUboFields("baseColor"));
if (_hasAnyNormal) {
extraMaterialUboFields.push(...uvTransformUboFields("normal"));
}
extraMaterialUboFields.push(...uvTransformUboFields("orm"));
if (_hasOcclusionSplit) {
extraMaterialUboFields.push(...uvTransformUboFields("occl"));
}
if (_hasEmissiveTexture) {
extraMaterialUboFields.push(...uvTransformUboFields("emissive"));
}
if (_hasSpecGloss) {
extraMaterialUboFields.push(...uvTransformUboFields("specGloss"));
}
}
const extraBindings = [];
if (_hasOcclusionUv2) {
extraBindings.push(
{ _name: "occlusionTexture", _type: { _kind: "texture", _textureType: "texture_2d<f32>" }, _visibility: STAGE_FRAGMENT },
{ _name: "occlusionSampler_", _type: { _kind: "sampler", _samplerType: "sampler" }, _visibility: STAGE_FRAGMENT }
);
}
let vertexBodyExtra = "";
if (_hasUv2) {
vertexBodyExtra += "out.uv2 = uv2;\n";
}
if (_hasVertexColor) {
vertexBodyExtra += "out.vColor = color;\n";
}
const fragmentHelpers = UV_TRANSFORM_HELPER_WGSL;
const fragmentPrelude = _hasUvTransform ? uvTransformDecl("baseColor", 1) + (_hasAnyNormal ? uvTransformDecl("normal", 4) : "") + uvTransformDecl("orm", 2) + (_hasOcclusionSplit ? uvTransformDecl("occl", 0) : "") + (_hasEmissiveTexture ? uvTransformDecl("emissive", 8) : "") + (_hasSpecGloss ? uvTransformDecl("specGloss", 16) : "") : "";
const uvForBaseColor = uvVarName("baseColor", 1);
const uvForNormal = uvVarName("normal", 4);
const uvForOrm = uvVarName("orm", 2);
const uvForEmissive = uvVarName("emissive", 8);
const uvForSpecGloss = uvVarName("specGloss", 16);
const baseColorMod = _hasVertexColor ? `
baseColor *= input.vColor.rgb;
alpha *= input.vColor.a;` : "";
const normalScaleMod = "let scaledNormal = vec3<f32>(normalMapRaw.xy * material.normalScale, normalMapRaw.z);\n";
const occlusionOverride = _hasOcclusionUv2 ? "let occlusion = textureSample(occlusionTexture, occlusionSampler_, input.uv2).r;" : _hasOcclusionSplit ? "let occlusion = textureSample(ormTexture, ormSampler, occlUV).r;" : null;
return {
extraVertexAttributes,
extraVaryings,
extraMaterialUboFields,
extraBindings,
vertexBodyExtra,
fragmentHelpers,
fragmentPrelude,
uvForBaseColor,
uvForNormal,
uvForOrm,
uvForEmissive,
uvForSpecGloss,
baseColorMod,
normalScaleMod,
occlusionOverride
};
}
export { createPbrTemplateExt };
//# sourceMappingURL=pbr-template-ext-DDHxtIkt.esm.js.map