minerva-design 1.6.0 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/charts/engine/data.cjs +1 -1
  3. package/dist/charts/engine/data.cjs.map +1 -1
  4. package/dist/charts/engine/data.d.cts +2 -0
  5. package/dist/charts/engine/data.d.ts +2 -0
  6. package/dist/charts/engine/data.js +6 -4
  7. package/dist/charts/engine/data.js.map +1 -1
  8. package/dist/charts/engine/defaults.cjs +1 -1
  9. package/dist/charts/engine/defaults.cjs.map +1 -1
  10. package/dist/charts/engine/defaults.js +22 -18
  11. package/dist/charts/engine/defaults.js.map +1 -1
  12. package/dist/charts/engine/graph/chart.cjs +1 -1
  13. package/dist/charts/engine/graph/chart.cjs.map +1 -1
  14. package/dist/charts/engine/graph/chart.js +532 -493
  15. package/dist/charts/engine/graph/chart.js.map +1 -1
  16. package/dist/charts/engine/graph/geometry.cjs +1 -1
  17. package/dist/charts/engine/graph/geometry.cjs.map +1 -1
  18. package/dist/charts/engine/graph/geometry.d.cts +12 -2
  19. package/dist/charts/engine/graph/geometry.d.ts +12 -2
  20. package/dist/charts/engine/graph/geometry.js +35 -31
  21. package/dist/charts/engine/graph/geometry.js.map +1 -1
  22. package/dist/charts/engine/model.cjs +1 -1
  23. package/dist/charts/engine/model.cjs.map +1 -1
  24. package/dist/charts/engine/model.js +95 -74
  25. package/dist/charts/engine/model.js.map +1 -1
  26. package/dist/charts/engine/orderbook/field.cjs +1 -1
  27. package/dist/charts/engine/orderbook/field.cjs.map +1 -1
  28. package/dist/charts/engine/orderbook/field.d.cts +15 -2
  29. package/dist/charts/engine/orderbook/field.d.ts +15 -2
  30. package/dist/charts/engine/orderbook/field.js +21 -9
  31. package/dist/charts/engine/orderbook/field.js.map +1 -1
  32. package/dist/charts/engine/orderbook/heatmap.cjs +1 -1
  33. package/dist/charts/engine/orderbook/heatmap.cjs.map +1 -1
  34. package/dist/charts/engine/orderbook/heatmap.d.cts +29 -0
  35. package/dist/charts/engine/orderbook/heatmap.d.ts +29 -0
  36. package/dist/charts/engine/orderbook/heatmap.js +576 -453
  37. package/dist/charts/engine/orderbook/heatmap.js.map +1 -1
  38. package/dist/charts/engine/orderbook/types.d.cts +36 -11
  39. package/dist/charts/engine/orderbook/types.d.ts +36 -11
  40. package/dist/charts/engine/presets.cjs +1 -1
  41. package/dist/charts/engine/presets.cjs.map +1 -1
  42. package/dist/charts/engine/presets.d.cts +16 -3
  43. package/dist/charts/engine/presets.d.ts +16 -3
  44. package/dist/charts/engine/presets.js +42 -32
  45. package/dist/charts/engine/presets.js.map +1 -1
  46. package/dist/charts/engine/scene.cjs +1 -1
  47. package/dist/charts/engine/scene.cjs.map +1 -1
  48. package/dist/charts/engine/scene.d.cts +4 -2
  49. package/dist/charts/engine/scene.d.ts +4 -2
  50. package/dist/charts/engine/scene.js +185 -107
  51. package/dist/charts/engine/scene.js.map +1 -1
  52. package/dist/charts/engine/three-d/oit.cjs +119 -34
  53. package/dist/charts/engine/three-d/oit.cjs.map +1 -1
  54. package/dist/charts/engine/three-d/oit.d.cts +65 -10
  55. package/dist/charts/engine/three-d/oit.d.ts +65 -10
  56. package/dist/charts/engine/three-d/oit.js +119 -34
  57. package/dist/charts/engine/three-d/oit.js.map +1 -1
  58. package/dist/charts/engine/three-d/render-types.cjs.map +1 -1
  59. package/dist/charts/engine/three-d/render-types.d.cts +19 -0
  60. package/dist/charts/engine/three-d/render-types.d.ts +19 -0
  61. package/dist/charts/engine/three-d/render-types.js.map +1 -1
  62. package/dist/charts/engine/three-d/shaders.cjs +14 -6
  63. package/dist/charts/engine/three-d/shaders.cjs.map +1 -1
  64. package/dist/charts/engine/three-d/shaders.d.cts +6 -1
  65. package/dist/charts/engine/three-d/shaders.d.ts +6 -1
  66. package/dist/charts/engine/three-d/shaders.js +40 -26
  67. package/dist/charts/engine/three-d/shaders.js.map +1 -1
  68. package/dist/charts/engine/three-d/webgl.cjs +1 -1
  69. package/dist/charts/engine/three-d/webgl.cjs.map +1 -1
  70. package/dist/charts/engine/three-d/webgl.js +167 -125
  71. package/dist/charts/engine/three-d/webgl.js.map +1 -1
  72. package/dist/charts/engine/three-d/webgpu.cjs +1 -1
  73. package/dist/charts/engine/three-d/webgpu.cjs.map +1 -1
  74. package/dist/charts/engine/three-d/webgpu.js +169 -140
  75. package/dist/charts/engine/three-d/webgpu.js.map +1 -1
  76. package/dist/charts/engine/trading/chart.cjs +1 -1
  77. package/dist/charts/engine/trading/chart.cjs.map +1 -1
  78. package/dist/charts/engine/trading/chart.js +1149 -1023
  79. package/dist/charts/engine/trading/chart.js.map +1 -1
  80. package/dist/charts/engine/trading/labels.cjs +1 -1
  81. package/dist/charts/engine/trading/labels.cjs.map +1 -1
  82. package/dist/charts/engine/trading/labels.js +12 -0
  83. package/dist/charts/engine/trading/labels.js.map +1 -1
  84. package/dist/charts/engine/trading/layout.cjs +2 -0
  85. package/dist/charts/engine/trading/layout.cjs.map +1 -0
  86. package/dist/charts/engine/trading/layout.d.cts +37 -0
  87. package/dist/charts/engine/trading/layout.d.ts +37 -0
  88. package/dist/charts/engine/trading/layout.js +63 -0
  89. package/dist/charts/engine/trading/layout.js.map +1 -0
  90. package/dist/charts/engine/trading/types.d.cts +24 -7
  91. package/dist/charts/engine/trading/types.d.ts +24 -7
  92. package/dist/charts/engine/types.d.cts +21 -8
  93. package/dist/charts/engine/types.d.ts +21 -8
  94. package/dist/core/contracts.cjs +1 -1
  95. package/dist/core/contracts.cjs.map +1 -1
  96. package/dist/core/contracts.js +1 -1
  97. package/dist/core/contracts.js.map +1 -1
  98. package/dist/native/charts/src/engine/data.cjs +1 -1
  99. package/dist/native/charts/src/engine/data.cjs.map +1 -1
  100. package/dist/native/charts/src/engine/data.js +6 -4
  101. package/dist/native/charts/src/engine/data.js.map +1 -1
  102. package/dist/native/charts/src/engine/model.cjs +1 -1
  103. package/dist/native/charts/src/engine/model.cjs.map +1 -1
  104. package/dist/native/charts/src/engine/model.js +104 -83
  105. package/dist/native/charts/src/engine/model.js.map +1 -1
  106. package/dist/native/charts/src/engine/presets.cjs +1 -1
  107. package/dist/native/charts/src/engine/presets.cjs.map +1 -1
  108. package/dist/native/charts/src/engine/presets.js +42 -32
  109. package/dist/native/charts/src/engine/presets.js.map +1 -1
  110. package/dist/native/charts/src/engine/scene.cjs +1 -1
  111. package/dist/native/charts/src/engine/scene.cjs.map +1 -1
  112. package/dist/native/charts/src/engine/scene.js +185 -107
  113. package/dist/native/charts/src/engine/scene.js.map +1 -1
  114. package/dist/taro/index.js +1263 -1152
  115. package/dist/vue/components/Chart/OrderBookHeatmap.vue.d.ts +11 -0
  116. package/dist/vue/components/Chart/orderbook.d.ts +7 -0
  117. package/dist/vue/components/Chart/orderbook.js +2 -0
  118. package/dist/vue/components/Chart/orderbook.js.map +1 -1
  119. package/dist/weapp/charts/canvas.js +234 -58
  120. package/package.json +1 -1
@@ -1,2 +1,2 @@
1
- const e=require("./render-types.cjs"),t=require("./oit.cjs"),n=require("./shaders.cjs");var r=16,i=32,a=8,o=2,s=16,c=4,l=`rgba16float`,u=async(u,d,f=!1)=>{let p=typeof navigator<`u`?navigator.gpu:void 0;if(!p)return null;let m=await p.requestAdapter();if(!m)return null;let h=m;if(f&&(h.info?.isFallbackAdapter||h.isFallbackAdapter))return null;let g=await m.requestDevice(),_=u.getContext(`webgpu`);if(!_)return g.destroy(),null;let v=p.getPreferredCanvasFormat();_.configure({device:g,format:v,alphaMode:`premultiplied`});let y=!1;g.lost.then(()=>{y||d()});let b=g.createBindGroupLayout({entries:[{binding:0,visibility:3,buffer:{type:`uniform`}}]}),x=g.createPipelineLayout({bindGroupLayouts:[b]}),S={color:{srcFactor:`one`,dstFactor:`one-minus-src-alpha`,operation:`add`},alpha:{srcFactor:`one`,dstFactor:`one-minus-src-alpha`,operation:`add`}},C={color:{srcFactor:`one`,dstFactor:`one`,operation:`add`},alpha:S.alpha},w={color:{srcFactor:`one`,dstFactor:`one`,operation:`add`},alpha:{srcFactor:`one`,dstFactor:`one`,operation:`add`}},T=(e,t,n,r,i=S,a=!1)=>{let o=g.createShaderModule({code:e});return g.createRenderPipeline({layout:x,vertex:{module:o,entryPoint:`vs`,buffers:t},fragment:{module:o,entryPoint:a?`fsOit`:`fs`,targets:a?[{format:l,blend:w},{format:l,blend:w}]:[{format:v,blend:i}]},primitive:{topology:n,cullMode:`none`},depthStencil:{format:`depth24plus`,depthWriteEnabled:r,depthCompare:`less-equal`},multisample:{count:c}})},E=[{arrayStride:20,stepMode:`instance`,attributes:[{shaderLocation:0,offset:0,format:`float32x3`},{shaderLocation:1,offset:12,format:`float32`},{shaderLocation:2,offset:16,format:`unorm8x4`}]}],D=[{arrayStride:28,stepMode:`vertex`,attributes:[{shaderLocation:0,offset:0,format:`float32x3`},{shaderLocation:1,offset:12,format:`float32x3`},{shaderLocation:2,offset:24,format:`unorm8x4`}]}],O=[{arrayStride:28,stepMode:`instance`,attributes:[{shaderLocation:0,offset:0,format:`float32x3`},{shaderLocation:1,offset:12,format:`float32x3`},{shaderLocation:2,offset:24,format:`unorm8x4`}]}],k={points:[T(n.WGSL_POINTS,E,`triangle-strip`,!1),T(n.WGSL_POINTS,E,`triangle-strip`,!0)],mesh:[T(n.WGSL_MESH,D,`triangle-list`,!1),T(n.WGSL_MESH,D,`triangle-list`,!0)],lines:[T(n.WGSL_LINES,O,`triangle-strip`,!1),T(n.WGSL_LINES,O,`triangle-strip`,!0)]},A=null,j=t=>{if(t.kind===`points`&&t.additive)return A??(A=T(n.WGSL_POINTS,E,`triangle-strip`,!1,C)),A;let r=k[t.kind];return r[e.writesDepth(t)?r.length-1:0]};g.pushErrorScope(`validation`);let M=g.createBindGroupLayout({entries:[0,1].map(e=>({binding:e,visibility:o,texture:{sampleType:`unfilterable-float`}}))}),N=g.createShaderModule({code:t.WGSL_COMPOSITE}),P={points:T(n.WGSL_POINTS,E,`triangle-strip`,!1,S,!0),mesh:T(n.WGSL_MESH,D,`triangle-list`,!1,S,!0),composite:g.createRenderPipeline({layout:g.createPipelineLayout({bindGroupLayouts:[M]}),vertex:{module:N,entryPoint:`vs`},fragment:{module:N,entryPoint:`fs`,targets:[{format:v,blend:S}]},primitive:{topology:`triangle-list`},depthStencil:{format:`depth24plus`,depthWriteEnabled:!1,depthCompare:`always`},multisample:{count:c}})},F=!await g.popErrorScope(),I=null,L=()=>{let e=I?.oit;e&&(e.accum.destroy(),e.extra.destroy(),e.accumResolved.destroy(),e.extraResolved.destroy())},R=()=>{let e=u.width,t=u.height;return I&&I.width===e&&I.height===t?I:(I?.color.destroy(),I?.depth.destroy(),L(),I={width:e,height:t,color:g.createTexture({size:[e,t],sampleCount:c,format:v,usage:s}),depth:g.createTexture({size:[e,t],sampleCount:c,format:`depth24plus`,usage:s}),oit:null},I)},z=e=>{if(e.oit)return e.oit;let t=t=>g.createTexture({size:[e.width,e.height],sampleCount:t,format:l,usage:t>1?s:20}),n=t(1),r=t(1);return e.oit={accum:t(c),extra:t(c),accumResolved:n,extraResolved:r,bindGroup:g.createBindGroup({layout:M,entries:[{binding:0,resource:n.createView()},{binding:1,resource:r.createView()}]})},e.oit},B=new Map,V=new Float32Array(40),H=(e,t)=>{let n=e.byteLength;if(n<=0)return null;let r=g.createBuffer({size:Math.max(16,Math.ceil(n/4)*4),usage:t|a});return e instanceof Uint32Array?g.queue.writeBuffer(r,0,e.buffer,e.byteOffset,n):g.queue.writeBuffer(r,0,e),r},U=e=>{e.vertex?.destroy(),e.index?.destroy()},W=e=>{let t=B.get(e.key);if(t&&t.version===e.version&&t.kind===e.kind){if(e.kind===`mesh`&&t.index&&(e.order??0)!==t.order){let{indices:n}=e;g.queue.writeBuffer(t.index,0,n.buffer,n.byteOffset,n.byteLength),t.order=e.order??0}return t}t&&U(t);let n=H(e.kind===`mesh`?e.vertices:e.data,i),a=e.kind===`mesh`?H(e.indices,r):null;if(t)t.version=e.version,t.kind=e.kind,t.vertex=n,t.index=a,t.order=e.kind===`mesh`?e.order??0:0;else{let r=g.createBuffer({size:160,usage:72});t={version:e.version,kind:e.kind,vertex:n,index:a,order:e.kind===`mesh`?e.order??0:0,uniform:r,bindGroup:g.createBindGroup({layout:b,entries:[{binding:0,resource:{buffer:r}}]})},B.set(e.key,t)}return t};return{kind:`webgpu`,canvas:u,orderIndependent:F,resize(e,t){u.width=Math.max(1,e),u.height=Math.max(1,t)},render(t,r){if(y)return;let i=R(),a=e.drawOrder(t),o=F&&a.some(t=>e.drawRank(t)===2),s=g.createCommandEncoder(),c=_.getCurrentTexture().createView(),l=new Set,u=(e,t,i)=>{let a=t.kind===`mesh`?t.indices.length:t.count;if(a<=0)return;let o=W(t);if(o.vertex){if(g.queue.writeBuffer(o.uniform,0,n.itemUniforms(t,r,V)),e.setPipeline(i),e.setBindGroup(0,o.bindGroup),e.setVertexBuffer(0,o.vertex),t.kind===`mesh`){if(!o.index)return;e.setIndexBuffer(o.index,`uint32`),e.drawIndexed(a)}else e.draw(4,a)}},d=s.beginRenderPass({colorAttachments:[{view:i.color.createView(),resolveTarget:o?void 0:c,clearValue:{r:0,g:0,b:0,a:0},loadOp:`clear`,storeOp:o?`store`:`discard`}],depthStencilAttachment:{view:i.depth.createView(),depthClearValue:1,depthLoadOp:`clear`,depthStoreOp:o?`store`:`discard`}});for(let t of a){if(o&&e.drawRank(t)>1)break;l.add(t.key),u(d,t,j(t))}if(d.end(),o){let t=z(i),n=s.beginRenderPass({colorAttachments:[{view:t.accum.createView(),resolveTarget:t.accumResolved.createView(),clearValue:{r:0,g:0,b:0,a:0},loadOp:`clear`,storeOp:`discard`},{view:t.extra.createView(),resolveTarget:t.extraResolved.createView(),clearValue:{r:0,g:0,b:0,a:0},loadOp:`clear`,storeOp:`discard`}],depthStencilAttachment:{view:i.depth.createView(),depthReadOnly:!0}});for(let t of a)e.drawRank(t)===2&&t.kind!==`lines`&&(l.add(t.key),u(n,t,P[t.kind]));n.end();let r=s.beginRenderPass({colorAttachments:[{view:i.color.createView(),resolveTarget:c,loadOp:`load`,storeOp:`discard`}],depthStencilAttachment:{view:i.depth.createView(),depthLoadOp:`load`,depthStoreOp:`discard`}});r.setPipeline(P.composite),r.setBindGroup(0,t.bindGroup),r.draw(3);for(let t of a)e.drawRank(t)<3||(l.add(t.key),u(r,t,j(t)));r.end()}g.queue.submit([s.finish()]);for(let[e,t]of B)l.has(e)||(U(t),t.uniform.destroy(),B.delete(e))},destroy(){y=!0;for(let e of B.values())U(e),e.uniform.destroy();B.clear(),I?.color.destroy(),I?.depth.destroy(),L(),I=null,_.unconfigure(),g.destroy()}}};exports.createWebGpu3D=u;
1
+ const e=require("./render-types.cjs"),t=require("./oit.cjs"),n=require("./shaders.cjs");var r=16,i=32,a=8,o=2,s=16,c=4,l=`rgba16float`,u=`r16float`,d=4,f=async(f,p,m=!1)=>{let h=typeof navigator<`u`?navigator.gpu:void 0;if(!h)return null;let g=await h.requestAdapter();if(!g)return null;let _=g;if(m&&(_.info?.isFallbackAdapter||_.isFallbackAdapter))return null;let v=await g.requestDevice(),y=f.getContext(`webgpu`);if(!y)return v.destroy(),null;let b=h.getPreferredCanvasFormat();y.configure({device:v,format:b,alphaMode:`premultiplied`});let x=!1;v.lost.then(()=>{x||p()});let S=v.createBindGroupLayout({entries:[{binding:0,visibility:3,buffer:{type:`uniform`}}]}),C=v.createPipelineLayout({bindGroupLayouts:[S]}),w={color:{srcFactor:`one`,dstFactor:`one-minus-src-alpha`,operation:`add`},alpha:{srcFactor:`one`,dstFactor:`one-minus-src-alpha`,operation:`add`}},T={color:{srcFactor:`one`,dstFactor:`one-minus-src`,operation:`add`},alpha:w.alpha},E={color:{srcFactor:`one`,dstFactor:`one`,operation:`add`},alpha:{srcFactor:`one`,dstFactor:`one`,operation:`add`}},D={color:{srcFactor:`one`,dstFactor:`one`,operation:`min`},alpha:{srcFactor:`one`,dstFactor:`one`,operation:`min`}},O=v.createBindGroupLayout({entries:[{binding:0,visibility:o,texture:{sampleType:`unfilterable-float`}}]}),k=v.createPipelineLayout({bindGroupLayouts:[S,O]}),A=(e,t,n,r,i=w,a=`plain`)=>{let o=v.createShaderModule({code:e});return v.createRenderPipeline({layout:a===`oit`?k:C,vertex:{module:o,entryPoint:`vs`,buffers:t},fragment:{module:o,entryPoint:a===`oit`?`fsOit`:a===`front`?`fsFront`:`fs`,targets:a===`oit`?Array.from({length:d},()=>({format:l,blend:E})):a===`front`?[{format:u,blend:D}]:[{format:b,blend:i}]},primitive:{topology:n,cullMode:`none`},depthStencil:a===`front`?void 0:{format:`depth24plus`,depthWriteEnabled:r,depthCompare:`less-equal`},multisample:{count:a===`front`?1:c}})},j=[{arrayStride:20,stepMode:`instance`,attributes:[{shaderLocation:0,offset:0,format:`float32x3`},{shaderLocation:1,offset:12,format:`float32`},{shaderLocation:2,offset:16,format:`unorm8x4`}]}],M=[{arrayStride:28,stepMode:`vertex`,attributes:[{shaderLocation:0,offset:0,format:`float32x3`},{shaderLocation:1,offset:12,format:`float32x3`},{shaderLocation:2,offset:24,format:`unorm8x4`}]}],N=[{arrayStride:28,stepMode:`instance`,attributes:[{shaderLocation:0,offset:0,format:`float32x3`},{shaderLocation:1,offset:12,format:`float32x3`},{shaderLocation:2,offset:24,format:`unorm8x4`}]}],P={points:[A(n.WGSL_POINTS,j,`triangle-strip`,!1),A(n.WGSL_POINTS,j,`triangle-strip`,!0)],mesh:[A(n.WGSL_MESH,M,`triangle-list`,!1),A(n.WGSL_MESH,M,`triangle-list`,!0)],lines:[A(n.WGSL_LINES,N,`triangle-strip`,!1),A(n.WGSL_LINES,N,`triangle-strip`,!0)]},F=null,I=t=>{if(t.kind===`points`&&t.additive)return F??(F=A(n.WGSL_POINTS,j,`triangle-strip`,!1,T)),F;let r=P[t.kind];return r[e.writesDepth(t)?r.length-1:0]};v.pushErrorScope(`validation`);let L=v.createBindGroupLayout({entries:Array.from({length:d},(e,t)=>({binding:t,visibility:o,texture:{sampleType:`unfilterable-float`}}))}),R=v.createShaderModule({code:t.WGSL_COMPOSITE}),z={points:A(n.WGSL_POINTS,j,`triangle-strip`,!1,w,`oit`),mesh:A(n.WGSL_MESH,M,`triangle-list`,!1,w,`oit`),front:{points:A(n.WGSL_POINTS,j,`triangle-strip`,!1,w,`front`),mesh:A(n.WGSL_MESH,M,`triangle-list`,!1,w,`front`)},composite:v.createRenderPipeline({layout:v.createPipelineLayout({bindGroupLayouts:[L]}),vertex:{module:R,entryPoint:`vs`},fragment:{module:R,entryPoint:`fs`,targets:[{format:b,blend:w}]},primitive:{topology:`triangle-list`},depthStencil:{format:`depth24plus`,depthWriteEnabled:!1,depthCompare:`always`},multisample:{count:c}})},B=!await v.popErrorScope(),V=null,H=()=>{let e=V?.oit;if(e)for(let t of[...e.samples,...e.resolved,e.front])t.destroy()},U=()=>{let e=f.width,t=f.height;return V&&V.width===e&&V.height===t?V:(V?.color.destroy(),V?.depth.destroy(),H(),V={width:e,height:t,color:v.createTexture({size:[e,t],sampleCount:c,format:b,usage:s}),depth:v.createTexture({size:[e,t],sampleCount:c,format:`depth24plus`,usage:s}),oit:null},V)},W=e=>{if(e.oit)return e.oit;let t=(t,n=l)=>v.createTexture({size:[e.width,e.height],sampleCount:t,format:n,usage:t>1?s:20}),n=Array.from({length:d},()=>t(1)),r=t(1,u);return e.oit={samples:Array.from({length:d},()=>t(c)),resolved:n,front:r,frontBindGroup:v.createBindGroup({layout:O,entries:[{binding:0,resource:r.createView()}]}),bindGroup:v.createBindGroup({layout:L,entries:n.map((e,t)=>({binding:t,resource:e.createView()}))})},e.oit},G=new Map,K=new Float32Array(40),q=(e,t)=>{let n=e.byteLength;if(n<=0)return null;let r=v.createBuffer({size:Math.max(16,Math.ceil(n/4)*4),usage:t|a});return e instanceof Uint32Array?v.queue.writeBuffer(r,0,e.buffer,e.byteOffset,n):v.queue.writeBuffer(r,0,e),r},J=e=>{e.vertex?.destroy(),e.index?.destroy()},Y=e=>{let t=G.get(e.key);if(t&&t.version===e.version&&t.kind===e.kind){let n=e.kind===`lines`?0:e.order??0;if(e.kind===`mesh`&&t.index&&n!==t.order){let{indices:r}=e;v.queue.writeBuffer(t.index,0,r.buffer,r.byteOffset,r.byteLength),t.order=n}else e.kind===`points`&&t.vertex&&n!==t.order&&(v.queue.writeBuffer(t.vertex,0,e.data),t.order=n);return t}t&&J(t);let n=q(e.kind===`mesh`?e.vertices:e.data,i),a=e.kind===`mesh`?q(e.indices,r):null;if(t)t.version=e.version,t.kind=e.kind,t.vertex=n,t.index=a,t.order=e.kind===`lines`?0:e.order??0;else{let r=v.createBuffer({size:160,usage:72});t={version:e.version,kind:e.kind,vertex:n,index:a,order:e.kind===`lines`?0:e.order??0,uniform:r,bindGroup:v.createBindGroup({layout:S,entries:[{binding:0,resource:{buffer:r}}]})},G.set(e.key,t)}return t};return{kind:`webgpu`,canvas:f,orderIndependent:B,resize(e,t){f.width=Math.max(1,e),f.height=Math.max(1,t)},render(t,r){if(x)return;let i=U(),a=e.drawOrder(t),o=B&&a.some(t=>e.drawRank(t)===2),s=v.createCommandEncoder(),c=y.getCurrentTexture().createView(),l=new Set,u=(e,t,i,a)=>{let o=t.kind===`mesh`?t.indices.length:t.count,s=t.kind===`lines`?void 0:t.range,c=s?Math.max(0,Math.min(o,s.first)):0,l=s?Math.max(0,Math.min(o-c,s.count)):o;if(l<=0)return;let u=Y(t);if(u.vertex){if(v.queue.writeBuffer(u.uniform,0,n.itemUniforms(t,r,K)),e.setPipeline(i),e.setBindGroup(0,u.bindGroup),a&&e.setBindGroup(1,a),e.setVertexBuffer(0,u.vertex),t.kind===`mesh`){if(!u.index)return;e.setIndexBuffer(u.index,`uint32`),e.drawIndexed(l,1,c)}else e.draw(4,l,0,c)}},d=s.beginRenderPass({colorAttachments:[{view:i.color.createView(),resolveTarget:o?void 0:c,clearValue:{r:0,g:0,b:0,a:0},loadOp:`clear`,storeOp:o?`store`:`discard`}],depthStencilAttachment:{view:i.depth.createView(),depthClearValue:1,depthLoadOp:`clear`,depthStoreOp:o?`store`:`discard`}});for(let t of a){if(o&&e.drawRank(t)>1)break;l.add(t.key),u(d,t,I(t))}if(d.end(),o){let t=W(i),n=s.beginRenderPass({colorAttachments:[{view:t.front.createView(),clearValue:{r:4,g:4,b:4,a:4},loadOp:`clear`,storeOp:`store`}]});for(let t of a)e.drawRank(t)===2&&t.kind!==`lines`&&(t.kind===`points`&&t.additive||(l.add(t.key),u(n,t,z.front[t.kind])));n.end();let r=s.beginRenderPass({colorAttachments:t.samples.map((e,n)=>({view:e.createView(),resolveTarget:t.resolved[n].createView(),clearValue:{r:0,g:0,b:0,a:0},loadOp:`clear`,storeOp:`discard`})),depthStencilAttachment:{view:i.depth.createView(),depthReadOnly:!0}});for(let n of a)e.drawRank(n)===2&&n.kind!==`lines`&&(l.add(n.key),u(r,n,z[n.kind],t.frontBindGroup));r.end();let o=s.beginRenderPass({colorAttachments:[{view:i.color.createView(),resolveTarget:c,loadOp:`load`,storeOp:`discard`}],depthStencilAttachment:{view:i.depth.createView(),depthLoadOp:`load`,depthStoreOp:`discard`}});o.setPipeline(z.composite),o.setBindGroup(0,t.bindGroup),o.draw(3);for(let t of a)e.drawRank(t)<3||(l.add(t.key),u(o,t,I(t)));o.end()}v.queue.submit([s.finish()]);for(let[e,t]of G)l.has(e)||(J(t),t.uniform.destroy(),G.delete(e))},destroy(){x=!0;for(let e of G.values())J(e),e.uniform.destroy();G.clear(),V?.color.destroy(),V?.depth.destroy(),H(),V=null,y.unconfigure(),v.destroy()}}};exports.createWebGpu3D=f;
2
2
  //# sourceMappingURL=webgpu.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"webgpu.cjs","names":["WGSL_POINTS","WGSL_MESH","WGSL_LINES","writesDepth","WGSL_COMPOSITE","drawOrder","drawRank","itemUniforms","require_render_types","require_oit","require_shaders","BUFFER_INDEX","BUFFER_VERTEX","BUFFER_COPY_DST","STAGE_FRAGMENT","TEXTURE_RENDER_ATTACHMENT","SAMPLES","OIT_FORMAT","createWebGpu3D","gpu","adapter","fallback","requireHardware","device","context","canvas","format","destroyed","onLost","bindGroupLayout","layout","blend","additive","sum","pipeline","module","oit","blending","depthWrite","pointBuffers","meshBuffers","lineBuffers","pipelines","additivePoints","pipelineOf","item","variants","compositeLayout","compositeModule","oitPipelines","orderIndependent","targets","destroyOit","renderTargets","width","height","oitTargets","t","texture","samples","accumResolved","extraResolved","resources","uniformData","buffer","bytes","data","gpuBuffer","usage","release","res","upload","indices","vertex","index","uniform","ordered","items","blended","encoder","screen","seen","draw","count","frame","pass","chosen","main","transparent","last","key"],"sources":["../../../../../charts/src/engine/three-d/webgpu.ts"],"sourcesContent":["// WebGPU backend of the 3D charts: 4× MSAA, a depth buffer, one draw per\n// item (instanced billboards / segments, indexed triangles). With blended\n// items (transparent meshes, blended or additive points), three passes:\n// the opaque items; the blended ones into the float targets of the\n// weighted blended order-independent transparency (`oit.ts`, multisampled,\n// testing the opaque depth, resolved); then their composite and the lines.\n\nimport type { RendererLostHandler } from \"../renderers/types\";\nimport { WGSL_COMPOSITE } from \"./oit\";\nimport {\n POINT_STRIDE,\n SEGMENT_STRIDE,\n VERTEX_STRIDE,\n drawOrder,\n drawRank,\n type Item3D,\n type Renderer3D,\n} from \"./render-types\";\nimport {\n UNIFORM_BYTES,\n WGSL_LINES,\n WGSL_MESH,\n WGSL_POINTS,\n itemUniforms,\n writesDepth,\n} from \"./shaders\";\n\n// lib.dom has the WebGPU interfaces but not these constant objects\nconst BUFFER_INDEX = 0x10;\nconst BUFFER_VERTEX = 0x20;\nconst BUFFER_UNIFORM = 0x40;\nconst BUFFER_COPY_DST = 0x08;\nconst STAGE_VERTEX = 0x1;\nconst STAGE_FRAGMENT = 0x2;\nconst TEXTURE_BINDING = 0x04;\nconst TEXTURE_RENDER_ATTACHMENT = 0x10;\n\nconst SAMPLES = 4;\n/** Format of the transparency targets (renderable, blendable, resolvable) */\nconst OIT_FORMAT: GPUTextureFormat = \"rgba16float\";\n\ninterface ItemResources {\n version: number;\n kind: Item3D[\"kind\"];\n vertex: GPUBuffer | null;\n index: GPUBuffer | null;\n /** `order` of the uploaded indices (meshes) */\n order: number;\n uniform: GPUBuffer;\n bindGroup: GPUBindGroup;\n}\n\ntype GpuNavigator = Navigator & { gpu?: GPU };\n\nexport const createWebGpu3D = async (\n canvas: HTMLCanvasElement,\n onLost: RendererLostHandler,\n /** Refuses fallback (software) adapters */\n requireHardware = false,\n): Promise<Renderer3D | null> => {\n const gpu =\n typeof navigator !== \"undefined\"\n ? (navigator as GpuNavigator).gpu\n : undefined;\n if (!gpu) return null;\n const adapter = await gpu.requestAdapter();\n if (!adapter) return null;\n const fallback = adapter as GPUAdapter & {\n isFallbackAdapter?: boolean;\n info?: { isFallbackAdapter?: boolean };\n };\n if (\n requireHardware &&\n (fallback.info?.isFallbackAdapter || fallback.isFallbackAdapter)\n ) {\n return null;\n }\n const device = await adapter.requestDevice();\n const context = canvas.getContext(\"webgpu\") as GPUCanvasContext | null;\n if (!context) {\n device.destroy();\n return null;\n }\n const format = gpu.getPreferredCanvasFormat();\n context.configure({ device, format, alphaMode: \"premultiplied\" });\n\n let destroyed = false;\n void device.lost.then(() => {\n if (!destroyed) onLost();\n });\n\n const bindGroupLayout = device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: STAGE_VERTEX | STAGE_FRAGMENT,\n buffer: { type: \"uniform\" },\n },\n ],\n });\n const layout = device.createPipelineLayout({\n bindGroupLayouts: [bindGroupLayout],\n });\n const blend: GPUBlendState = {\n color: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n alpha: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n };\n // additive points: the colors add up, the coverage composites as usual\n const additive: GPUBlendState = {\n color: { srcFactor: \"one\", dstFactor: \"one\", operation: \"add\" },\n alpha: blend.alpha,\n };\n // transparency targets: plain sums\n const sum: GPUBlendState = {\n color: { srcFactor: \"one\", dstFactor: \"one\", operation: \"add\" },\n alpha: { srcFactor: \"one\", dstFactor: \"one\", operation: \"add\" },\n };\n const pipeline = (\n code: string,\n buffers: GPUVertexBufferLayout[],\n topology: GPUPrimitiveTopology,\n depthWrite: boolean,\n blending: GPUBlendState = blend,\n oit = false,\n ) => {\n const module = device.createShaderModule({ code });\n return device.createRenderPipeline({\n layout,\n vertex: { module, entryPoint: \"vs\", buffers },\n fragment: {\n module,\n entryPoint: oit ? \"fsOit\" : \"fs\",\n targets: oit\n ? [\n { format: OIT_FORMAT, blend: sum },\n { format: OIT_FORMAT, blend: sum },\n ]\n : [{ format, blend: blending }],\n },\n primitive: { topology, cullMode: \"none\" },\n depthStencil: {\n format: \"depth24plus\",\n depthWriteEnabled: depthWrite,\n depthCompare: \"less-equal\",\n },\n multisample: { count: SAMPLES },\n });\n };\n const pointBuffers: GPUVertexBufferLayout[] = [\n {\n arrayStride: POINT_STRIDE,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x3\" },\n { shaderLocation: 1, offset: 12, format: \"float32\" },\n { shaderLocation: 2, offset: 16, format: \"unorm8x4\" },\n ],\n },\n ];\n const meshBuffers: GPUVertexBufferLayout[] = [\n {\n arrayStride: VERTEX_STRIDE,\n stepMode: \"vertex\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x3\" },\n { shaderLocation: 1, offset: 12, format: \"float32x3\" },\n { shaderLocation: 2, offset: 24, format: \"unorm8x4\" },\n ],\n },\n ];\n const lineBuffers: GPUVertexBufferLayout[] = [\n {\n arrayStride: SEGMENT_STRIDE,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x3\" },\n { shaderLocation: 1, offset: 12, format: \"float32x3\" },\n { shaderLocation: 2, offset: 24, format: \"unorm8x4\" },\n ],\n },\n ];\n const pipelines = {\n points: [\n pipeline(WGSL_POINTS, pointBuffers, \"triangle-strip\", false),\n pipeline(WGSL_POINTS, pointBuffers, \"triangle-strip\", true),\n ],\n mesh: [\n pipeline(WGSL_MESH, meshBuffers, \"triangle-list\", false),\n pipeline(WGSL_MESH, meshBuffers, \"triangle-list\", true),\n ],\n lines: [\n pipeline(WGSL_LINES, lineBuffers, \"triangle-strip\", false),\n pipeline(WGSL_LINES, lineBuffers, \"triangle-strip\", true),\n ],\n };\n let additivePoints: GPURenderPipeline | null = null;\n const pipelineOf = (item: Item3D) => {\n if (item.kind === \"points\" && item.additive) {\n additivePoints ??= pipeline(\n WGSL_POINTS,\n pointBuffers,\n \"triangle-strip\",\n false,\n additive,\n );\n return additivePoints;\n }\n const variants = pipelines[item.kind];\n return variants[writesDepth(item) ? variants.length - 1 : 0];\n };\n\n // order-independent transparency: validated once (rgba16float targets are\n // core, but a failing driver falls back to the sorted blending)\n device.pushErrorScope(\"validation\");\n const compositeLayout = device.createBindGroupLayout({\n entries: [0, 1].map((binding) => ({\n binding,\n visibility: STAGE_FRAGMENT,\n texture: { sampleType: \"unfilterable-float\" as const },\n })),\n });\n const compositeModule = device.createShaderModule({ code: WGSL_COMPOSITE });\n const oitPipelines = {\n points: pipeline(\n WGSL_POINTS,\n pointBuffers,\n \"triangle-strip\",\n false,\n blend,\n true,\n ),\n mesh: pipeline(WGSL_MESH, meshBuffers, \"triangle-list\", false, blend, true),\n composite: device.createRenderPipeline({\n layout: device.createPipelineLayout({\n bindGroupLayouts: [compositeLayout],\n }),\n vertex: { module: compositeModule, entryPoint: \"vs\" },\n fragment: {\n module: compositeModule,\n entryPoint: \"fs\",\n targets: [{ format, blend }],\n },\n primitive: { topology: \"triangle-list\" },\n depthStencil: {\n format: \"depth24plus\",\n depthWriteEnabled: false,\n depthCompare: \"always\",\n },\n multisample: { count: SAMPLES },\n }),\n };\n const orderIndependent = !(await device.popErrorScope());\n\n let targets: {\n width: number;\n height: number;\n color: GPUTexture;\n depth: GPUTexture;\n /** Transparency targets, created on first use */\n oit: {\n accum: GPUTexture;\n extra: GPUTexture;\n accumResolved: GPUTexture;\n extraResolved: GPUTexture;\n bindGroup: GPUBindGroup;\n } | null;\n } | null = null;\n const destroyOit = () => {\n const oit = targets?.oit;\n if (!oit) return;\n oit.accum.destroy();\n oit.extra.destroy();\n oit.accumResolved.destroy();\n oit.extraResolved.destroy();\n };\n const renderTargets = () => {\n const width = canvas.width;\n const height = canvas.height;\n if (targets && targets.width === width && targets.height === height)\n return targets;\n targets?.color.destroy();\n targets?.depth.destroy();\n destroyOit();\n targets = {\n width,\n height,\n color: device.createTexture({\n size: [width, height],\n sampleCount: SAMPLES,\n format,\n usage: TEXTURE_RENDER_ATTACHMENT,\n }),\n depth: device.createTexture({\n size: [width, height],\n sampleCount: SAMPLES,\n format: \"depth24plus\",\n usage: TEXTURE_RENDER_ATTACHMENT,\n }),\n oit: null,\n };\n return targets;\n };\n const oitTargets = (t: NonNullable<typeof targets>) => {\n if (t.oit) return t.oit;\n const texture = (samples: number) =>\n device.createTexture({\n size: [t.width, t.height],\n sampleCount: samples,\n format: OIT_FORMAT,\n usage:\n samples > 1\n ? TEXTURE_RENDER_ATTACHMENT\n : TEXTURE_RENDER_ATTACHMENT | TEXTURE_BINDING,\n });\n const accumResolved = texture(1);\n const extraResolved = texture(1);\n t.oit = {\n accum: texture(SAMPLES),\n extra: texture(SAMPLES),\n accumResolved,\n extraResolved,\n bindGroup: device.createBindGroup({\n layout: compositeLayout,\n entries: [\n { binding: 0, resource: accumResolved.createView() },\n { binding: 1, resource: extraResolved.createView() },\n ],\n }),\n };\n return t.oit;\n };\n\n const resources = new Map<string, ItemResources>();\n const uniformData = new Float32Array(UNIFORM_BYTES / 4);\n\n const buffer = (data: ArrayBuffer | Uint32Array, usage: number) => {\n const bytes = data.byteLength;\n if (bytes <= 0) return null;\n const gpuBuffer = device.createBuffer({\n size: Math.max(16, Math.ceil(bytes / 4) * 4),\n usage: usage | BUFFER_COPY_DST,\n });\n if (data instanceof Uint32Array) {\n device.queue.writeBuffer(\n gpuBuffer,\n 0,\n data.buffer,\n data.byteOffset,\n bytes,\n );\n } else {\n device.queue.writeBuffer(gpuBuffer, 0, data);\n }\n return gpuBuffer;\n };\n\n const release = (res: ItemResources) => {\n res.vertex?.destroy();\n res.index?.destroy();\n };\n\n const upload = (item: Item3D): ItemResources => {\n let res = resources.get(item.key);\n if (res && res.version === item.version && res.kind === item.kind) {\n // same mesh, triangles in a new order (transparent, sorted by depth)\n if (\n item.kind === \"mesh\" &&\n res.index &&\n (item.order ?? 0) !== res.order\n ) {\n const { indices } = item;\n device.queue.writeBuffer(\n res.index,\n 0,\n indices.buffer,\n indices.byteOffset,\n indices.byteLength,\n );\n res.order = item.order ?? 0;\n }\n return res;\n }\n if (res) release(res);\n const vertex = buffer(\n item.kind === \"mesh\" ? item.vertices : item.data,\n BUFFER_VERTEX,\n );\n const index =\n item.kind === \"mesh\" ? buffer(item.indices, BUFFER_INDEX) : null;\n if (!res) {\n const uniform = device.createBuffer({\n size: UNIFORM_BYTES,\n usage: BUFFER_UNIFORM | BUFFER_COPY_DST,\n });\n res = {\n version: item.version,\n kind: item.kind,\n vertex,\n index,\n order: item.kind === \"mesh\" ? (item.order ?? 0) : 0,\n uniform,\n bindGroup: device.createBindGroup({\n layout: bindGroupLayout,\n entries: [{ binding: 0, resource: { buffer: uniform } }],\n }),\n };\n resources.set(item.key, res);\n } else {\n res.version = item.version;\n res.kind = item.kind;\n res.vertex = vertex;\n res.index = index;\n res.order = item.kind === \"mesh\" ? (item.order ?? 0) : 0;\n }\n return res;\n };\n\n return {\n kind: \"webgpu\",\n canvas,\n orderIndependent,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n if (destroyed) return;\n const t = renderTargets();\n const ordered = drawOrder(items);\n const blended =\n orderIndependent && ordered.some((item) => drawRank(item) === 2);\n const encoder = device.createCommandEncoder();\n const screen = context.getCurrentTexture().createView();\n const seen = new Set<string>();\n /** Draws an item; false when it has nothing to draw */\n const draw = (\n pass: GPURenderPassEncoder,\n item: Item3D,\n chosen: GPURenderPipeline,\n ) => {\n const count = item.kind === \"mesh\" ? item.indices.length : item.count;\n if (count <= 0) return;\n const res = upload(item);\n if (!res.vertex) return;\n device.queue.writeBuffer(\n res.uniform,\n 0,\n itemUniforms(item, frame, uniformData),\n );\n pass.setPipeline(chosen);\n pass.setBindGroup(0, res.bindGroup);\n pass.setVertexBuffer(0, res.vertex);\n if (item.kind === \"mesh\") {\n if (!res.index) return;\n pass.setIndexBuffer(res.index, \"uint32\");\n pass.drawIndexed(count);\n } else {\n pass.draw(4, count);\n }\n };\n\n // opaque items (every item without blended ones)\n const main = encoder.beginRenderPass({\n colorAttachments: [\n {\n view: t.color.createView(),\n resolveTarget: blended ? undefined : screen,\n clearValue: { r: 0, g: 0, b: 0, a: 0 },\n loadOp: \"clear\",\n storeOp: blended ? \"store\" : \"discard\",\n },\n ],\n depthStencilAttachment: {\n view: t.depth.createView(),\n depthClearValue: 1,\n depthLoadOp: \"clear\",\n depthStoreOp: blended ? \"store\" : \"discard\",\n },\n });\n for (const item of ordered) {\n if (blended && drawRank(item) > 1) break;\n seen.add(item.key);\n draw(main, item, pipelineOf(item));\n }\n main.end();\n\n if (blended) {\n // blended items, in any order, into the transparency targets\n const oit = oitTargets(t);\n const transparent = encoder.beginRenderPass({\n colorAttachments: [\n {\n view: oit.accum.createView(),\n resolveTarget: oit.accumResolved.createView(),\n clearValue: { r: 0, g: 0, b: 0, a: 0 },\n loadOp: \"clear\",\n storeOp: \"discard\",\n },\n {\n view: oit.extra.createView(),\n resolveTarget: oit.extraResolved.createView(),\n clearValue: { r: 0, g: 0, b: 0, a: 0 },\n loadOp: \"clear\",\n storeOp: \"discard\",\n },\n ],\n depthStencilAttachment: {\n view: t.depth.createView(),\n depthReadOnly: true,\n },\n });\n for (const item of ordered) {\n if (drawRank(item) !== 2 || item.kind === \"lines\") continue;\n seen.add(item.key);\n draw(transparent, item, oitPipelines[item.kind]);\n }\n transparent.end();\n\n // their composite over the opaque items, then the lines\n const last = encoder.beginRenderPass({\n colorAttachments: [\n {\n view: t.color.createView(),\n resolveTarget: screen,\n loadOp: \"load\",\n storeOp: \"discard\",\n },\n ],\n depthStencilAttachment: {\n view: t.depth.createView(),\n depthLoadOp: \"load\",\n depthStoreOp: \"discard\",\n },\n });\n last.setPipeline(oitPipelines.composite);\n last.setBindGroup(0, oit.bindGroup);\n last.draw(3);\n for (const item of ordered) {\n if (drawRank(item) < 3) continue;\n seen.add(item.key);\n draw(last, item, pipelineOf(item));\n }\n last.end();\n }\n device.queue.submit([encoder.finish()]);\n for (const [key, res] of resources) {\n if (!seen.has(key)) {\n release(res);\n res.uniform.destroy();\n resources.delete(key);\n }\n }\n },\n destroy() {\n destroyed = true;\n for (const res of resources.values()) {\n release(res);\n res.uniform.destroy();\n }\n resources.clear();\n targets?.color.destroy();\n targets?.depth.destroy();\n destroyOit();\n targets = null;\n context.unconfigure();\n device.destroy();\n },\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"webgpu.cjs","names":["WGSL_POINTS","WGSL_MESH","WGSL_LINES","writesDepth","WGSL_COMPOSITE","drawOrder","drawRank","itemUniforms","require_render_types","require_oit","require_shaders","BUFFER_INDEX","BUFFER_VERTEX","BUFFER_COPY_DST","STAGE_FRAGMENT","TEXTURE_RENDER_ATTACHMENT","SAMPLES","OIT_FORMAT","FRONT_FORMAT","OIT_TARGETS","createWebGpu3D","gpu","adapter","fallback","requireHardware","device","context","canvas","format","destroyed","onLost","bindGroupLayout","layout","blend","additive","sum","nearest","frontLayout","oitLayout","pipeline","module","mode","blending","depthWrite","pointBuffers","meshBuffers","lineBuffers","pipelines","additivePoints","pipelineOf","item","variants","compositeLayout","compositeModule","oitPipelines","orderIndependent","targets","destroyOit","oit","texture","renderTargets","width","height","oitTargets","t","samples","kind","resolved","front","r","resources","uniformData","buffer","bytes","data","gpuBuffer","usage","release","res","upload","order","indices","vertex","index","uniform","ordered","items","blended","encoder","screen","seen","draw","total","range","first","count","frame","pass","chosen","main","frontPass","transparent","i","last","key"],"sources":["../../../../../charts/src/engine/three-d/webgpu.ts"],"sourcesContent":["// WebGPU backend of the 3D charts: 4× MSAA, a depth buffer, one draw per\n// item (instanced billboards / segments, indexed triangles). With blended\n// items (transparent meshes, blended or additive points), four passes: the\n// opaque items; the depth of the front transparent layer (r16float, `min`\n// blending); the blended items into the four float targets of the hybrid\n// order-independent transparency (`oit.ts`, multisampled, testing the\n// opaque depth, resolved); then their composite and the lines.\n\nimport type { RendererLostHandler } from \"../renderers/types\";\nimport { FRONT_CLEAR, WGSL_COMPOSITE } from \"./oit\";\nimport {\n POINT_STRIDE,\n SEGMENT_STRIDE,\n VERTEX_STRIDE,\n drawOrder,\n drawRank,\n type Item3D,\n type Renderer3D,\n} from \"./render-types\";\nimport {\n UNIFORM_BYTES,\n WGSL_LINES,\n WGSL_MESH,\n WGSL_POINTS,\n itemUniforms,\n writesDepth,\n} from \"./shaders\";\n\n// lib.dom has the WebGPU interfaces but not these constant objects\nconst BUFFER_INDEX = 0x10;\nconst BUFFER_VERTEX = 0x20;\nconst BUFFER_UNIFORM = 0x40;\nconst BUFFER_COPY_DST = 0x08;\nconst STAGE_VERTEX = 0x1;\nconst STAGE_FRAGMENT = 0x2;\nconst TEXTURE_BINDING = 0x04;\nconst TEXTURE_RENDER_ATTACHMENT = 0x10;\n\nconst SAMPLES = 4;\n/** Format of the transparency targets (renderable, blendable, resolvable) */\nconst OIT_FORMAT: GPUTextureFormat = \"rgba16float\";\n/** Format of the front depth of the transparent layers (blendable: `min`) */\nconst FRONT_FORMAT: GPUTextureFormat = \"r16float\";\n/** Targets of the transparency pass (`oit.ts`) */\nconst OIT_TARGETS = 4;\n\ninterface ItemResources {\n version: number;\n kind: Item3D[\"kind\"];\n vertex: GPUBuffer | null;\n index: GPUBuffer | null;\n /** `order` of the uploaded indices (meshes) */\n order: number;\n uniform: GPUBuffer;\n bindGroup: GPUBindGroup;\n}\n\ntype GpuNavigator = Navigator & { gpu?: GPU };\n\nexport const createWebGpu3D = async (\n canvas: HTMLCanvasElement,\n onLost: RendererLostHandler,\n /** Refuses fallback (software) adapters */\n requireHardware = false,\n): Promise<Renderer3D | null> => {\n const gpu =\n typeof navigator !== \"undefined\"\n ? (navigator as GpuNavigator).gpu\n : undefined;\n if (!gpu) return null;\n const adapter = await gpu.requestAdapter();\n if (!adapter) return null;\n const fallback = adapter as GPUAdapter & {\n isFallbackAdapter?: boolean;\n info?: { isFallbackAdapter?: boolean };\n };\n if (\n requireHardware &&\n (fallback.info?.isFallbackAdapter || fallback.isFallbackAdapter)\n ) {\n return null;\n }\n const device = await adapter.requestDevice();\n const context = canvas.getContext(\"webgpu\") as GPUCanvasContext | null;\n if (!context) {\n device.destroy();\n return null;\n }\n const format = gpu.getPreferredCanvasFormat();\n context.configure({ device, format, alphaMode: \"premultiplied\" });\n\n let destroyed = false;\n void device.lost.then(() => {\n if (!destroyed) onLost();\n });\n\n const bindGroupLayout = device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: STAGE_VERTEX | STAGE_FRAGMENT,\n buffer: { type: \"uniform\" },\n },\n ],\n });\n const layout = device.createPipelineLayout({\n bindGroupLayouts: [bindGroupLayout],\n });\n const blend: GPUBlendState = {\n color: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n alpha: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n };\n // additive points: their light screen blended (tone mapped as it adds\n // up, `screenTone`), the coverage composites as usual\n const additive: GPUBlendState = {\n color: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src\",\n operation: \"add\",\n },\n alpha: blend.alpha,\n };\n // transparency targets: plain sums\n const sum: GPUBlendState = {\n color: { srcFactor: \"one\", dstFactor: \"one\", operation: \"add\" },\n alpha: { srcFactor: \"one\", dstFactor: \"one\", operation: \"add\" },\n };\n // front depth: the nearest\n const nearest: GPUBlendState = {\n color: { srcFactor: \"one\", dstFactor: \"one\", operation: \"min\" },\n alpha: { srcFactor: \"one\", dstFactor: \"one\", operation: \"min\" },\n };\n // the front depth texture of the transparency pass (group 1)\n const frontLayout = device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: STAGE_FRAGMENT,\n texture: { sampleType: \"unfilterable-float\" },\n },\n ],\n });\n const oitLayout = device.createPipelineLayout({\n bindGroupLayouts: [bindGroupLayout, frontLayout],\n });\n const pipeline = (\n code: string,\n buffers: GPUVertexBufferLayout[],\n topology: GPUPrimitiveTopology,\n depthWrite: boolean,\n blending: GPUBlendState = blend,\n mode: \"plain\" | \"oit\" | \"front\" = \"plain\",\n ) => {\n const module = device.createShaderModule({ code });\n return device.createRenderPipeline({\n layout: mode === \"oit\" ? oitLayout : layout,\n vertex: { module, entryPoint: \"vs\", buffers },\n fragment: {\n module,\n entryPoint:\n mode === \"oit\" ? \"fsOit\" : mode === \"front\" ? \"fsFront\" : \"fs\",\n targets:\n mode === \"oit\"\n ? Array.from({ length: OIT_TARGETS }, () => ({\n format: OIT_FORMAT,\n blend: sum,\n }))\n : mode === \"front\"\n ? [{ format: FRONT_FORMAT, blend: nearest }]\n : [{ format, blend: blending }],\n },\n primitive: { topology, cullMode: \"none\" },\n // the front pass has no depth (`oit.ts`) and one sample\n depthStencil:\n mode === \"front\"\n ? undefined\n : {\n format: \"depth24plus\",\n depthWriteEnabled: depthWrite,\n depthCompare: \"less-equal\",\n },\n multisample: { count: mode === \"front\" ? 1 : SAMPLES },\n });\n };\n const pointBuffers: GPUVertexBufferLayout[] = [\n {\n arrayStride: POINT_STRIDE,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x3\" },\n { shaderLocation: 1, offset: 12, format: \"float32\" },\n { shaderLocation: 2, offset: 16, format: \"unorm8x4\" },\n ],\n },\n ];\n const meshBuffers: GPUVertexBufferLayout[] = [\n {\n arrayStride: VERTEX_STRIDE,\n stepMode: \"vertex\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x3\" },\n { shaderLocation: 1, offset: 12, format: \"float32x3\" },\n { shaderLocation: 2, offset: 24, format: \"unorm8x4\" },\n ],\n },\n ];\n const lineBuffers: GPUVertexBufferLayout[] = [\n {\n arrayStride: SEGMENT_STRIDE,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x3\" },\n { shaderLocation: 1, offset: 12, format: \"float32x3\" },\n { shaderLocation: 2, offset: 24, format: \"unorm8x4\" },\n ],\n },\n ];\n const pipelines = {\n points: [\n pipeline(WGSL_POINTS, pointBuffers, \"triangle-strip\", false),\n pipeline(WGSL_POINTS, pointBuffers, \"triangle-strip\", true),\n ],\n mesh: [\n pipeline(WGSL_MESH, meshBuffers, \"triangle-list\", false),\n pipeline(WGSL_MESH, meshBuffers, \"triangle-list\", true),\n ],\n lines: [\n pipeline(WGSL_LINES, lineBuffers, \"triangle-strip\", false),\n pipeline(WGSL_LINES, lineBuffers, \"triangle-strip\", true),\n ],\n };\n let additivePoints: GPURenderPipeline | null = null;\n const pipelineOf = (item: Item3D) => {\n if (item.kind === \"points\" && item.additive) {\n additivePoints ??= pipeline(\n WGSL_POINTS,\n pointBuffers,\n \"triangle-strip\",\n false,\n additive,\n );\n return additivePoints;\n }\n const variants = pipelines[item.kind];\n return variants[writesDepth(item) ? variants.length - 1 : 0];\n };\n\n // order-independent transparency: validated once (rgba16float and\n // r16float targets are core, but a failing driver falls back to the\n // sorted blending)\n device.pushErrorScope(\"validation\");\n const compositeLayout = device.createBindGroupLayout({\n entries: Array.from({ length: OIT_TARGETS }, (_, binding) => ({\n binding,\n visibility: STAGE_FRAGMENT,\n texture: { sampleType: \"unfilterable-float\" as const },\n })),\n });\n const compositeModule = device.createShaderModule({ code: WGSL_COMPOSITE });\n const oitPipelines = {\n points: pipeline(\n WGSL_POINTS,\n pointBuffers,\n \"triangle-strip\",\n false,\n blend,\n \"oit\",\n ),\n mesh: pipeline(\n WGSL_MESH,\n meshBuffers,\n \"triangle-list\",\n false,\n blend,\n \"oit\",\n ),\n front: {\n points: pipeline(\n WGSL_POINTS,\n pointBuffers,\n \"triangle-strip\",\n false,\n blend,\n \"front\",\n ),\n mesh: pipeline(\n WGSL_MESH,\n meshBuffers,\n \"triangle-list\",\n false,\n blend,\n \"front\",\n ),\n },\n composite: device.createRenderPipeline({\n layout: device.createPipelineLayout({\n bindGroupLayouts: [compositeLayout],\n }),\n vertex: { module: compositeModule, entryPoint: \"vs\" },\n fragment: {\n module: compositeModule,\n entryPoint: \"fs\",\n targets: [{ format, blend }],\n },\n primitive: { topology: \"triangle-list\" },\n depthStencil: {\n format: \"depth24plus\",\n depthWriteEnabled: false,\n depthCompare: \"always\",\n },\n multisample: { count: SAMPLES },\n }),\n };\n const orderIndependent = !(await device.popErrorScope());\n\n let targets: {\n width: number;\n height: number;\n color: GPUTexture;\n depth: GPUTexture;\n /** Transparency targets, created on first use */\n oit: {\n /** front color, accum, extra, behind (multisampled) */\n samples: GPUTexture[];\n /** Their resolved textures, read by the composite */\n resolved: GPUTexture[];\n /** Depth of the front transparent layer (single-sampled) */\n front: GPUTexture;\n frontBindGroup: GPUBindGroup;\n bindGroup: GPUBindGroup;\n } | null;\n } | null = null;\n const destroyOit = () => {\n const oit = targets?.oit;\n if (!oit) return;\n for (const texture of [...oit.samples, ...oit.resolved, oit.front])\n texture.destroy();\n };\n const renderTargets = () => {\n const width = canvas.width;\n const height = canvas.height;\n if (targets && targets.width === width && targets.height === height)\n return targets;\n targets?.color.destroy();\n targets?.depth.destroy();\n destroyOit();\n targets = {\n width,\n height,\n color: device.createTexture({\n size: [width, height],\n sampleCount: SAMPLES,\n format,\n usage: TEXTURE_RENDER_ATTACHMENT,\n }),\n depth: device.createTexture({\n size: [width, height],\n sampleCount: SAMPLES,\n format: \"depth24plus\",\n usage: TEXTURE_RENDER_ATTACHMENT,\n }),\n oit: null,\n };\n return targets;\n };\n const oitTargets = (t: NonNullable<typeof targets>) => {\n if (t.oit) return t.oit;\n const texture = (samples: number, kind: GPUTextureFormat = OIT_FORMAT) =>\n device.createTexture({\n size: [t.width, t.height],\n sampleCount: samples,\n format: kind,\n usage:\n samples > 1\n ? TEXTURE_RENDER_ATTACHMENT\n : TEXTURE_RENDER_ATTACHMENT | TEXTURE_BINDING,\n });\n const resolved = Array.from({ length: OIT_TARGETS }, () => texture(1));\n const front = texture(1, FRONT_FORMAT);\n t.oit = {\n samples: Array.from({ length: OIT_TARGETS }, () => texture(SAMPLES)),\n resolved,\n front,\n frontBindGroup: device.createBindGroup({\n layout: frontLayout,\n entries: [{ binding: 0, resource: front.createView() }],\n }),\n bindGroup: device.createBindGroup({\n layout: compositeLayout,\n entries: resolved.map((r, binding) => ({\n binding,\n resource: r.createView(),\n })),\n }),\n };\n return t.oit;\n };\n\n const resources = new Map<string, ItemResources>();\n const uniformData = new Float32Array(UNIFORM_BYTES / 4);\n\n const buffer = (data: ArrayBuffer | Uint32Array, usage: number) => {\n const bytes = data.byteLength;\n if (bytes <= 0) return null;\n const gpuBuffer = device.createBuffer({\n size: Math.max(16, Math.ceil(bytes / 4) * 4),\n usage: usage | BUFFER_COPY_DST,\n });\n if (data instanceof Uint32Array) {\n device.queue.writeBuffer(\n gpuBuffer,\n 0,\n data.buffer,\n data.byteOffset,\n bytes,\n );\n } else {\n device.queue.writeBuffer(gpuBuffer, 0, data);\n }\n return gpuBuffer;\n };\n\n const release = (res: ItemResources) => {\n res.vertex?.destroy();\n res.index?.destroy();\n };\n\n const upload = (item: Item3D): ItemResources => {\n let res = resources.get(item.key);\n if (res && res.version === item.version && res.kind === item.kind) {\n // same buffers in a new order (sorted back to front): rewritten\n const order = item.kind === \"lines\" ? 0 : (item.order ?? 0);\n if (item.kind === \"mesh\" && res.index && order !== res.order) {\n const { indices } = item;\n device.queue.writeBuffer(\n res.index,\n 0,\n indices.buffer,\n indices.byteOffset,\n indices.byteLength,\n );\n res.order = order;\n } else if (item.kind === \"points\" && res.vertex && order !== res.order) {\n device.queue.writeBuffer(res.vertex, 0, item.data);\n res.order = order;\n }\n return res;\n }\n if (res) release(res);\n const vertex = buffer(\n item.kind === \"mesh\" ? item.vertices : item.data,\n BUFFER_VERTEX,\n );\n const index =\n item.kind === \"mesh\" ? buffer(item.indices, BUFFER_INDEX) : null;\n if (!res) {\n const uniform = device.createBuffer({\n size: UNIFORM_BYTES,\n usage: BUFFER_UNIFORM | BUFFER_COPY_DST,\n });\n res = {\n version: item.version,\n kind: item.kind,\n vertex,\n index,\n order: item.kind === \"lines\" ? 0 : (item.order ?? 0),\n uniform,\n bindGroup: device.createBindGroup({\n layout: bindGroupLayout,\n entries: [{ binding: 0, resource: { buffer: uniform } }],\n }),\n };\n resources.set(item.key, res);\n } else {\n res.version = item.version;\n res.kind = item.kind;\n res.vertex = vertex;\n res.index = index;\n res.order = item.kind === \"lines\" ? 0 : (item.order ?? 0);\n }\n return res;\n };\n\n return {\n kind: \"webgpu\",\n canvas,\n orderIndependent,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n if (destroyed) return;\n const t = renderTargets();\n const ordered = drawOrder(items);\n const blended =\n orderIndependent && ordered.some((item) => drawRank(item) === 2);\n const encoder = device.createCommandEncoder();\n const screen = context.getCurrentTexture().createView();\n const seen = new Set<string>();\n /** Draws an item (or its `range`) */\n const draw = (\n pass: GPURenderPassEncoder,\n item: Item3D,\n chosen: GPURenderPipeline,\n front?: GPUBindGroup,\n ) => {\n const total = item.kind === \"mesh\" ? item.indices.length : item.count;\n const range = item.kind === \"lines\" ? undefined : item.range;\n const first = range ? Math.max(0, Math.min(total, range.first)) : 0;\n const count = range\n ? Math.max(0, Math.min(total - first, range.count))\n : total;\n if (count <= 0) return;\n const res = upload(item);\n if (!res.vertex) return;\n device.queue.writeBuffer(\n res.uniform,\n 0,\n itemUniforms(item, frame, uniformData),\n );\n pass.setPipeline(chosen);\n pass.setBindGroup(0, res.bindGroup);\n if (front) pass.setBindGroup(1, front);\n pass.setVertexBuffer(0, res.vertex);\n if (item.kind === \"mesh\") {\n if (!res.index) return;\n pass.setIndexBuffer(res.index, \"uint32\");\n pass.drawIndexed(count, 1, first);\n } else {\n pass.draw(4, count, 0, first);\n }\n };\n\n // opaque items (every item without blended ones)\n const main = encoder.beginRenderPass({\n colorAttachments: [\n {\n view: t.color.createView(),\n resolveTarget: blended ? undefined : screen,\n clearValue: { r: 0, g: 0, b: 0, a: 0 },\n loadOp: \"clear\",\n storeOp: blended ? \"store\" : \"discard\",\n },\n ],\n depthStencilAttachment: {\n view: t.depth.createView(),\n depthClearValue: 1,\n depthLoadOp: \"clear\",\n depthStoreOp: blended ? \"store\" : \"discard\",\n },\n });\n for (const item of ordered) {\n if (blended && drawRank(item) > 1) break;\n seen.add(item.key);\n draw(main, item, pipelineOf(item));\n }\n main.end();\n\n if (blended) {\n const oit = oitTargets(t);\n // the depth of the front transparent layer: the nearest visible\n // fragment of the non-additive blended items\n const frontPass = encoder.beginRenderPass({\n colorAttachments: [\n {\n view: oit.front.createView(),\n clearValue: {\n r: FRONT_CLEAR,\n g: FRONT_CLEAR,\n b: FRONT_CLEAR,\n a: FRONT_CLEAR,\n },\n loadOp: \"clear\",\n storeOp: \"store\",\n },\n ],\n });\n for (const item of ordered) {\n if (drawRank(item) !== 2 || item.kind === \"lines\") continue;\n if (item.kind === \"points\" && item.additive) continue;\n seen.add(item.key);\n draw(frontPass, item, oitPipelines.front[item.kind]);\n }\n frontPass.end();\n\n // blended items, in any order, into the transparency targets\n const transparent = encoder.beginRenderPass({\n colorAttachments: oit.samples.map((texture, i) => ({\n view: texture.createView(),\n resolveTarget: oit.resolved[i]!.createView(),\n clearValue: { r: 0, g: 0, b: 0, a: 0 },\n loadOp: \"clear\" as const,\n storeOp: \"discard\" as const,\n })),\n depthStencilAttachment: {\n view: t.depth.createView(),\n depthReadOnly: true,\n },\n });\n for (const item of ordered) {\n if (drawRank(item) !== 2 || item.kind === \"lines\") continue;\n seen.add(item.key);\n draw(transparent, item, oitPipelines[item.kind], oit.frontBindGroup);\n }\n transparent.end();\n\n // their composite over the opaque items, then the lines\n const last = encoder.beginRenderPass({\n colorAttachments: [\n {\n view: t.color.createView(),\n resolveTarget: screen,\n loadOp: \"load\",\n storeOp: \"discard\",\n },\n ],\n depthStencilAttachment: {\n view: t.depth.createView(),\n depthLoadOp: \"load\",\n depthStoreOp: \"discard\",\n },\n });\n last.setPipeline(oitPipelines.composite);\n last.setBindGroup(0, oit.bindGroup);\n last.draw(3);\n for (const item of ordered) {\n if (drawRank(item) < 3) continue;\n seen.add(item.key);\n draw(last, item, pipelineOf(item));\n }\n last.end();\n }\n device.queue.submit([encoder.finish()]);\n for (const [key, res] of resources) {\n if (!seen.has(key)) {\n release(res);\n res.uniform.destroy();\n resources.delete(key);\n }\n }\n },\n destroy() {\n destroyed = true;\n for (const res of resources.values()) {\n release(res);\n res.uniform.destroy();\n }\n resources.clear();\n targets?.color.destroy();\n targets?.depth.destroy();\n destroyOit();\n targets = null;\n context.unconfigure();\n device.destroy();\n },\n };\n};\n"],"mappings":"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"}