@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.
3 lines (2 loc) • 3.82 kB
JavaScript
import{bd as n,be as t,bf as e,aC as o,F as s,a$ as i,aq as r,bg as a,bh as c,bi as u,bj as f,bk as d,bl as l,bm as h,bn as p}from"./index-B8IgtevW.esm.min.js";let m=null;function g(n){m=n}let b=null;function x(n){b=n}function v(n,t,e){return b?b(n,t,e):new s(n.buffer,n.byteOffset,t)}function M(n,t,e){const o=e.joints.length;if(void 0!==e.inverseBindMatrices){const i=r(n,t,e.inverseBindMatrices);return new s(i._data.buffer,i._data.byteOffset,16*o)}const i=new s(16*o);for(let n=0;n<o;n++){const t=16*n;i[t]=i[t+5]=i[t+10]=i[t+15]=1}return i}function w(n,t,e,o,s,r){const a=n.skins[e],c=a.joints,u=M(n,t,a),f=c.map(t=>i(n,t,s,r));return{jointNodes:c,inverseBindMatrices:u,jointWorldMatrices:f,meshWorldMatrix:o}}function I(i){const r=i.jointNodes.length,a=new s(16*r),c=n(i.meshWorldMatrix)??t(),u=e();for(let n=0;n<r;n++)o(u,0,c,0,i.jointWorldMatrices[n],0),o(a,16*n,u,0,i.inverseBindMatrices,16*n);return a}const j={LINEAR:u,STEP:c,CUBICSPLINE:a},k={translation:h,rotation:l,scale:d,weights:f};function _(e,o,s,a,c,f,g){if(!e.animations||0===e.animations.length)return null;let b=0;const x=[];for(const n of e.animations){const t=[];for(const s of n.samplers){const n=r(e,o,s.input),i=r(e,o,s.output),a=!0===e.accessors[s.input]?.normalized,c=!0===e.accessors[s.output]?.normalized;t.push({input:v(n._data,n._count,a),output:v(i._data,i._count*i._componentCount,c),interpolation:j[s.interpolation??"LINEAR"]??u})}const i=[];for(const t of n.channels){const n=t.target?.extensions?.KHR_animation_pointer?.pointer;if(n){if(!m)continue;const o=m(n,t,f,e,s);o&&(i.push(o),b++);continue}if(void 0===t.target.node)continue;const o=k[t.target.path];void 0!==o&&i.push({samplerIdx:t.sampler,nodeIdx:t.target.node,path:o})}let a=0;for(const n of t)if(n.input.length>0){const t=n.input[n.input.length-1];t>a&&(a=t)}x.push({name:n.name??"",channels:i,samplers:t,duration:a})}const w=e.nodes?.length??0,I=[];for(let n=0;n<w;n++){const t=e.nodes[n],o=t.translation??[0,0,0],s=t.rotation??[0,0,0,1],i=t.scale??[1,1,1];I.push({parentIdx:p(a,n),_matrix:t.matrix,tx:o[0],ty:o[1],tz:o[2],rx:s[0],ry:s[1],rz:s[2],rw:s[3],sx:i[0],sy:i[1],sz:i[2]})}const _=new Map;let B=0;for(let n=0;n<w;n++){const t=e.nodes[n];if(void 0===t.mesh)continue;const o=e.meshes[t.mesh],s=[];for(let n=0;n<o.primitives.length;n++)s.push(B++);_.set(n,s)}const N=[];for(let r=0;r<w;r++){const u=e.nodes[r];if(void 0===u.skin||!e.skins)continue;const f=_.get(r);if(!f)continue;const d=e.skins[u.skin],l=d.joints,h=M(e,o,d),p=i(e,r,a,c),m=n(p)??t();for(const n of f){const t=s[n],e=t?.skeleton;e&&N.push({jointNodes:l,inverseBindMatrices:h,invMeshWorld:m,boneTexture:e.boneTexture,boneCount:l.length,boneMatrices:e.boneMatrices,runtimeSkeleton:e})}}const C=[];for(let n=0;n<w;n++){const t=e.nodes[n];if(void 0===t.mesh)continue;const o=e.meshes[t.mesh];if(!o.primitives?.[0]?.targets?.length)continue;const i=_.get(n);if(i)for(const t of i){const e=s[t],o=e?.morphTargets;o&&C.push({nodeIdx:n,weightsBuffer:o.weightsBuffer,weights:o.weights,targetCount:o.count,runtimeMorphTargets:o})}}const T=f??[],y=new Set;for(const n of e.skins??[])for(const t of n.joints??[])y.add(t);for(let n=0;n<w;n++){if(void 0===e.nodes[n]?.skin)continue;let t=n;for(;t>=0&&!y.has(t);)y.add(t),t=p(a,t)}if(0===x.length||0===N.length&&0===C.length&&0===b&&!function(n,t,e){for(const o of n)for(const n of o.channels)if((n.path===h||n.path===l||n.path===d)&&n.nodeIdx>=0&&!e.has(n.nodeIdx)&&t[n.nodeIdx])return!0;return!1}(x,T,y))return null;return{clips:x,nodes:I,skeletons:N,morphBindings:C,nodeTargets:T,excludedNodeIndices:y,nodeNames:(e.nodes??[]).map(n=>n?.name),boneOverrides:g}}export{g as _installPointerHandlers,x as _installSamplerConverter,I as computeBoneTextureData,w as extractSkin,_ as parseAnimationData};
//# sourceMappingURL=gltf-animation-5rtffpPK.esm.min.js.map