@doegis/core
Version:
DOE GIS API
3 lines (1 loc) • 1.98 kB
JavaScript
import{unwrap as e}from"../../../../../core/maybe.js";import t from"../../../../../core/PooledArray.js";import{TransparencyPassType as r}from"../../lib/TransparencyPassType.js";import{DataType as i}from"../../../../webgl/enums.js";var s;!function(e){e[e.FrontToBack=0]="FrontToBack",e[e.BackToFront=1]="BackToFront"}(s||(s={}));class o{constructor(e,r,i=s.FrontToBack){this._rctx=e,this._techniqueRepository=r,this._sorting=i,this._draws=new t({initialSize:32,allocator:e=>e||{material:null,geometry:null,geometryRanges:null,bindDrawParams:null,depthSquaredHint:0,indexType:0}}),this._previouslyBoundDraw=new Map}submitDraw(t,r,i,s){const o=this._draws.pushNew();o.geometry=r,o.geometryRanges=i,o.material=t,o.depthSquaredHint=s,o.indexType=(r.indexed?e(r.vao.indexBuffer).indexType:null)??0}dispatch(e,t){const i=this._rctx;this._previouslyBoundDraw.clear();let s=null;const o=this._draws.map((r=>r.material.prepareTechnique(this._techniqueRepository,e,t,r.geometry.parameters))),n=this._draws.length;for(let l=0;l<n;l++){const n=o[l];n===s&&n.configuration.transparencyPassType===r.NONE||(i.bindTechnique(n,e,t),s=n);const p=this._draws.data[l],c=p.geometry;i.bindVAO(c.vao),this._previouslyBoundDraw.get(n)!==p.material&&(n.program.bindDraw(p.material,t,e),this._previouslyBoundDraw.set(n,p.material));const d=p.geometryRanges,m=d.length;if(0!==p.indexType){const e=a.get(p.indexType);for(let t=0;t<m;t+=2){const r=d[t],s=d[t+1];i.drawElements(c.primitiveType,s,p.indexType,r*e)}}else for(let e=0;e<m;e+=2){const t=d[e],r=d[e+1];i.drawArrays(c.primitiveType,t,r)}}}prepareSubmit(){this._draws.clear()}finishSubmit(){const e=this._sorting===s.FrontToBack?1:-1;this._draws.sort(((t,r)=>{const i=e*(t.depthSquaredHint-r.depthSquaredHint);return 0!==i?i:t.geometry.vao.size-r.geometry.vao.size}))}get count(){return this._draws.length}}const a=new Map;a.set(i.UNSIGNED_BYTE,1),a.set(i.UNSIGNED_SHORT,2),a.set(i.UNSIGNED_INT,4);export{o as RenderPass,s as RenderPassSorting};