UNPKG

@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.

248 lines (245 loc) 8.44 kB
import { _ as _appendPointerHandlers } from './gltf-feature-animation-pointer-DbLO7iMT.esm.js'; import './index-By0tcgYN.esm.js'; import './visibility-BuRfFMHe.esm.js'; import './gltf-animation-CvJhPzAe.esm.js'; function iorToF0Factor(ior) { return ((ior - 1) / (ior + 1)) ** 2 / 0.04; } function bump(mat) { mat._uboVersion++; } const _extHandlers = [ // BJS 9.5 registers the glTF metallicFactor pointer twice, with the second // entry overwriting the first to animate PBRMaterial.roughness. Match that // behavior for parity; roughnessFactor itself is not registered by BJS. [ /^\/materials\/(\d+)\/pbrMetallicRoughness\/metallicFactor$/, (m, ctx) => { const mat = ctx.materials?.[+m[1]]; if (!mat) { return null; } return { arity: 1, writer: (out, off) => { mat.roughnessFactor = out[off]; mat._uboVersion++; } }; } ], // /materials/{m}/normalTexture/scale — scalar glTF normal-map strength. The // shader scale mod is provided by the lazy pbr-template-ext (loaded for materials // that already carry a UV transform / vertex colour / UV2), so this writer only // updates the existing `normalScale` UBO slot — no core shader path is added. [ /^\/materials\/(\d+)\/normalTexture\/scale$/, (m, ctx) => { const mat = ctx.materials?.[+m[1]]; if (!mat) { return null; } return { arity: 1, writer: (out, off) => { mat.normalTextureScale = out[off]; mat._uboVersion++; } }; } ], // /materials/{m}/extensions/KHR_materials_transmission/transmissionFactor [ /^\/materials\/(\d+)\/extensions\/KHR_materials_transmission\/transmissionFactor$/, (m, ctx) => { const mat = ctx.materials?.[+m[1]]; const refr = mat?.subsurface?.refraction; if (!mat || !refr) { return null; } return { arity: 1, writer: (out, off) => { mat.transmissive = true; refr.intensity = out[off]; bump(mat); } }; } ], // /materials/{m}/extensions/KHR_materials_ior/ior [ /^\/materials\/(\d+)\/extensions\/KHR_materials_ior\/ior$/, (m, ctx) => { const mat = ctx.materials?.[+m[1]]; if (!mat) { return null; } return { arity: 1, writer: (out, off) => { const ior = out[off]; if (mat.subsurface?.refraction) { mat.subsurface.refraction.indexOfRefraction = ior; } mat.metallicF0Factor = iorToF0Factor(ior); mat.specularWeight = 1; mat._hasReflExt = true; bump(mat); } }; } ], // /materials/{m}/extensions/KHR_materials_volume/{thicknessFactor|attenuationDistance|attenuationColor} [ /^\/materials\/(\d+)\/extensions\/KHR_materials_volume\/(thicknessFactor|attenuationDistance|attenuationColor)$/, (m, ctx) => { const mat = ctx.materials?.[+m[1]]; if (!mat?.subsurface) { return null; } return { arity: m[2] === "attenuationColor" ? 3 : 1, writer: (out, off) => { const ss = mat.subsurface; if (m[2] === "thicknessFactor") { ss.thickness ??= { min: 0, max: 0, useGlTFChannel: true }; ss.thickness.max = out[off]; if (ss.refraction) { ss.refraction.useThicknessAsDepth = true; } } else { ss.tint ??= { color: [1, 1, 1], atDistance: 1 }; if (m[2] === "attenuationDistance") { ss.tint.atDistance = out[off]; } else { ss.tint.color = [out[off], out[off + 1], out[off + 2]]; } } bump(mat); } }; } ], // /materials/{m}/extensions/KHR_materials_iridescence/{iridescenceFactor|iridescenceIor|iridescenceThicknessMaximum} [ /^\/materials\/(\d+)\/extensions\/KHR_materials_iridescence\/(iridescenceFactor|iridescenceIor|iridescenceThicknessMaximum)$/, (m, ctx) => { const mat = ctx.materials?.[+m[1]]; const iri = mat?.iridescence; if (!mat || !iri) { return null; } return { arity: 1, writer: (out, off) => { const v = out[off]; if (m[2] === "iridescenceFactor") { iri.intensity = v; } else if (m[2] === "iridescenceIor") { iri.indexOfRefraction = v; } else { iri.maximumThickness = v; } bump(mat); } }; } ], // /materials/{m}/occlusionTexture/strength — scalar ambient-occlusion strength. // The occlusion mix (mix(1, orm.r, strength)) is supplied by the lazy reflectance // ext, which the animation feature activates via `_hasReflExt`; this writer only // updates the `occlusionStrength` UBO slot that ext owns — zero core shader cost. [ /^\/materials\/(\d+)\/occlusionTexture\/strength$/, (m, ctx) => { const mat = ctx.materials?.[+m[1]]; if (!mat) { return null; } return { arity: 1, writer: (out, off) => { mat.occlusionStrength = out[off]; mat._uboVersion++; } }; } ] ]; _appendPointerHandlers(_extHandlers); function seedExtMaterials(json, map) { const occlusionStrengthAnimated = /* @__PURE__ */ new Set(); const transmissionAnimated = /* @__PURE__ */ new Set(); const iorAnimated = /* @__PURE__ */ new Set(); const volumeThicknessAnimated = /* @__PURE__ */ new Set(); const volumeTintAnimated = /* @__PURE__ */ new Set(); for (const anim of json.animations ?? []) { for (const ch of anim.channels ?? []) { const ptr = ch.target?.extensions?.KHR_animation_pointer?.pointer; const os = ptr && /^\/materials\/(\d+)\/occlusionTexture\/strength$/.exec(ptr); if (os) { occlusionStrengthAnimated.add(+os[1]); } const tr = ptr && /^\/materials\/(\d+)\/extensions\/KHR_materials_transmission\/transmissionFactor$/.exec(ptr); if (tr) { transmissionAnimated.add(+tr[1]); } const ior = ptr && /^\/materials\/(\d+)\/extensions\/KHR_materials_ior\/ior$/.exec(ptr); if (ior) { iorAnimated.add(+ior[1]); } const vt = ptr && /^\/materials\/(\d+)\/extensions\/KHR_materials_volume\/thicknessFactor$/.exec(ptr); if (vt) { volumeThicknessAnimated.add(+vt[1]); } const vc = ptr && /^\/materials\/(\d+)\/extensions\/KHR_materials_volume\/(attenuationColor|attenuationDistance)$/.exec(ptr); if (vc) { volumeTintAnimated.add(+vc[1]); } } } for (let matIdx = 0; matIdx < map.length; matIdx++) { const pm = map[matIdx]; if (!pm) { continue; } const def = json.materials?.[matIdx]; if (occlusionStrengthAnimated.has(matIdx)) { pm.occlusionStrength = def?.occlusionTexture?.strength ?? 1; pm._hasReflExt = true; pm._occlStrengthAnimated = true; } if (transmissionAnimated.has(matIdx)) { pm.transmissive = true; pm.subsurface ??= {}; pm.subsurface.refraction ??= { intensity: def?.extensions?.KHR_materials_transmission?.transmissionFactor ?? 0, indexOfRefraction: def?.extensions?.KHR_materials_ior?.ior ?? 1.5 }; } if (iorAnimated.has(matIdx)) { pm.subsurface ??= {}; pm.subsurface.refraction ??= { intensity: 0, indexOfRefraction: def?.extensions?.KHR_materials_ior?.ior ?? 1.5 }; const ior = def?.extensions?.KHR_materials_ior?.ior ?? 1.5; pm.metallicF0Factor = iorToF0Factor(ior); pm.specularWeight = 1; pm._hasReflExt = true; } if (volumeThicknessAnimated.has(matIdx) || volumeTintAnimated.has(matIdx)) { pm.subsurface ??= {}; const eVol = def?.extensions?.KHR_materials_volume; if (volumeThicknessAnimated.has(matIdx)) { pm.subsurface.thickness ??= { min: 0, max: eVol?.thicknessFactor ?? 0, useGlTFChannel: true }; if (pm.subsurface.refraction) { pm.subsurface.refraction.useThicknessAsDepth = true; } } if (volumeTintAnimated.has(matIdx)) { pm.subsurface.tint ??= { color: eVol?.attenuationColor ?? [1, 1, 1], atDistance: eVol?.attenuationDistance ?? 1 }; } } } } export { seedExtMaterials }; //# sourceMappingURL=animation-pointer-ext-DuDsEpH0.esm.js.map