@animech-public/playcanvas
Version:
PlayCanvas WebGL game engine
2 lines (1 loc) • 1.77 kB
JavaScript
import{FloatPacking as t}from"../core/math/float-packing.js";import{Texture as e}from"../platform/graphics/texture.js";import{DeviceCache as r}from"../platform/graphics/device-cache.js";import{ADDRESS_CLAMP_TO_EDGE as s,TEXTURETYPE_DEFAULT as o,FILTER_LINEAR as a,FILTER_NEAREST as n,PIXELFORMAT_RGBA32F as c,PIXELFORMAT_RGBA16F as l}from"../platform/graphics/constants.js";class i{constructor(t,e){this.texture0=t,this.texture1=e}destroy(){var t,e;null==(t=this.texture0)||t.destroy(),null==(e=this.texture1)||e.destroy()}}const u=new r;class p{static createTexture(t,r,c,l=""){return new e(t,{name:`AreaLightLUT${l}`,width:c,height:c,format:r,addressU:s,addressV:s,type:o,magFilter:a,minFilter:n,anisotropy:1,mipmaps:!1})}static applyTextures(t,e,r){u.remove(t),u.get(t,(()=>new i(e,e===r?null:r))),t.scope.resolve("areaLightsLutTex1").setValue(e),t.scope.resolve("areaLightsLutTex2").setValue(r)}static createPlaceholder(t){const e=p.createTexture(t,t.areaLightLutFormat,2,"placeholder");e.lock().fill(0),e.unlock(),p.applyTextures(t,e,e)}static set(e,r,s){function o(t,e,r){const s=p.createTexture(t,r,64);return s.lock().set(e),s.unlock(),s}function a(t,e,r){const s=t.length,o=new Float32Array(s);for(let a=0;a<s;a++){const s=a%4;o[a]=(t[a]+e[s])*r[s]}return o}function n(e){const r=e.length,s=new Uint16Array(r),o=t.float2Half;for(let t=0;t<r;t++)s[t]=o(e[t]);return s}function i(t){const e=t.length,r=new Uint8ClampedArray(e);for(let s=0;s<e;s++)r[s]=255*t[s];return r}const u=r,h=s;let m,f;const g=e.areaLightLutFormat;if(g===c)m=u,f=h;else if(g===l)m=n(u),f=n(h);else{const t=[-.306897,0,0,0],e=[1.442787,1,1,1];m=i(a(u,[0,.2976,.01381,0],[.999,3.08737,1.6546,.603249])),f=i(a(h,t,e))}const x=o(e,m,g),d=o(e,f,g);p.applyTextures(e,x,d)}}export{p as AreaLightLuts};