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.

3 lines (2 loc) 3.5 kB
import{n,aD as e,m as t}from"./index-B8IgtevW.esm.min.js";function i(n){const e=n?._vertexProjection??null;return`\n\nstruct SceneUniforms {\nviewProjection: mat4x4f,\nfragmentCoord: vec2f,\n};\n@group(0) @binding(0) var<uniform> scene: SceneUniforms;\n\nstruct MeshUniforms {\nworld: mat4x4f,\npickId: u32,\n};\n@group(1) @binding(0) var<uniform> mesh: MeshUniforms;\n\nstruct PickDiscardInput {\nworldPos: vec3f,\nfragmentCoord: vec2f,\npickId: u32,\nthinInstanceIndex: u32,\nhasThinInstance: u32,\ninstanceExtras: vec4f,\n};\n\n${function(n){const e=n?.storage;return e?.length?e.map((n,e)=>`@group(2) @binding(${e}) var<storage, read> ${n.name}: ${n.type};`).join("\n"):""}(n)}\n${n?.discardWgsl??"\nfn shouldDiscardPick(input: PickDiscardInput) -> bool {\nreturn false;\n}\n"}\n${e?.regularDeclarations??""}\n\nstruct VsOut {\n@builtin(position) p: vec4f,\n@location(0) @interpolate(flat) pickId: u32,\n@location(1) worldPos: vec3f,\n@location(2) @interpolate(flat) thinInstanceIndex: u32,\n@location(3) @interpolate(flat) hasThinInstance: u32,\n@location(4) @interpolate(flat) instanceExtras: vec4f,\n};\nstruct FsOut { @location(0) color: vec4f, @location(1) depth: f32 };\n@fragment fn fs(input: VsOut) -> FsOut {\nif (shouldDiscardPick(PickDiscardInput(input.worldPos, scene.fragmentCoord, input.pickId, input.thinInstanceIndex, input.hasThinInstance, input.instanceExtras))) { discard; }\nlet id = input.pickId;\nlet r = f32((id >> 16u) & 0xFFu) / 255.0;\nlet g = f32((id >> 8u) & 0xFFu) / 255.0;\nlet b = f32(id & 0xFFu) / 255.0;\nreturn FsOut(vec4f(r, g, b, 1.0), input.p.z);\n}\n\n@vertex fn vs(@location(0) position: vec3f${e?.regularInputs??""}) -> VsOut {\nvar out: VsOut;\n${e?`${e.regularBody}\nlet wp = projectedWorld;`:"let wp = (mesh.world * vec4f(position, 1.0)).xyz;"}\nout.p = scene.viewProjection * vec4f(wp, 1.0);\nout.pickId = mesh.pickId;\nout.worldPos = wp;\nout.thinInstanceIndex = 0xffffffffu;\nout.hasThinInstance = 0u;\nout.instanceExtras = vec4f(0.0);\nreturn out;\n}\n`}let r=null,o=null,a=null;function s(n){r!==n._device&&(r=n._device,o=null,a=null)}const u={arrayStride:12,attributes:[{shaderLocation:0,offset:0,format:"float32x3"}]};function c(r,a,c,l,d){const f=r._device,p=f.createShaderModule({label:`${l}-shader`,code:i({discardWgsl:a?.wgsl,storage:a?.storage,_vertexProjection:d?.shader})}),g=function(e){return s(e),o??=t(e,"picking-mesh-bgl",n.VERTEX|n.FRAGMENT)}(r),m=c?[e(r),g,c]:[e(r),g],h=f.createPipelineLayout({label:`${l}-pipeline-layout`,bindGroupLayouts:d?._layouts?.(r,m)??m});return f.createRenderPipeline({label:`${l}-pipeline`,layout:h,vertex:{module:p,entryPoint:"vs",buffers:d?._buffers??[u]},fragment:{module:p,entryPoint:"fs",targets:[{format:"rgba8unorm"},{format:"r32float"}]},depthStencil:{format:"depth24plus",depthCompare:"greater",depthWriteEnabled:!0},primitive:{topology:"triangle-list",cullMode:"none"},multisample:{count:1}})}function l(e,t,i=null){s(e);const r=`${t?`discard:${t.key}`:"default"}:${i?.key??"affine"}`,o=a??=new Map,u=o.get(r);if(u)return u;const l=t??null,d=l?.storage?.length?function(e,t){return e._device.createBindGroupLayout({label:`picking-discard-${t.key}-bgl`,entries:(t.storage??[]).map((e,t)=>({binding:t,visibility:n.FRAGMENT,buffer:{type:"read-only-storage"}}))})}(e,l):null,f=c(e,l,d,l?`picking-${l.key}`:"picking",i),p={regularPipeline:f,thinInstancePipeline:f,discardBGL:d};return o.set(r,p),p}export{l as getPickingPipelineSet}; //# sourceMappingURL=picking-pipeline-BG_xXFV2.esm.min.js.map