cione-comp-lib
Version:
`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`
2 lines (1 loc) • 13.6 kB
JavaScript
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});var e=require("../core/Base.js"),t=require("../core/glenum.js"),a=require("../math/Vector3.js"),r=require("../math/BoundingBox.js"),i=require("../math/Frustum.js"),s=require("../math/Matrix4.js"),n=require("../Renderer.js"),o=require("../Shader.js"),h=require("../Material.js"),u=require("../FrameBuffer.js"),f=require("../Texture.js"),l=require("../Texture2D.js"),d=require("../TextureCube.js"),p=require("../camera/Perspective.js"),_=require("../camera/Orthographic.js"),m=require("../compositor/Pass.js"),g=require("../compositor/TexturePool.js"),c=require("../glmatrix/mat4.js"),w=require("../shader/source/shadowmap.glsl.js"),v=["px","nx","py","ny","pz","nz"];function S(e,t,a){return"alphaMap"===a?e.material.get("diffuseMap"):"alphaCutoff"===a?e.material.isDefined("fragment","ALPHA_TEST")&&e.material.get("diffuseMap")&&e.material.get("alphaCutoff")||0:"uvRepeat"===a?e.material.get("uvRepeat"):"uvOffset"===a?e.material.get("uvOffset"):t.get(a)}function T(e,t){var a=e.material,r=t.material;return a.get("diffuseMap")!==r.get("diffuseMap")||(a.get("alphaCutoff")||0)!==(r.get("alphaCutoff")||0)}o.default.import(w.default);var M,C,y,x,P,E,B,L=e.default.extend((function(){return{softShadow:L.PCF,shadowBlur:1,lightFrustumBias:"auto",kernelPCF:new Float32Array([1,0,1,1,-1,1,0,1,-1,0,-1,-1,1,-1,0,-1]),precision:"highp",_lastRenderNotCastShadow:!1,_frameBuffer:new u.default,_textures:{},_shadowMapNumber:{POINT_LIGHT:0,DIRECTIONAL_LIGHT:0,SPOT_LIGHT:0},_depthMaterials:{},_distanceMaterials:{},_receivers:[],_lightsCastShadow:[],_lightCameras:{},_lightMaterials:{},_texturePool:new g.default}}),(function(){this._gaussianPassH=new m.default({fragment:o.default.source("clay.compositor.gaussian_blur")}),this._gaussianPassV=new m.default({fragment:o.default.source("clay.compositor.gaussian_blur")}),this._gaussianPassH.setUniform("blurSize",this.shadowBlur),this._gaussianPassH.setUniform("blurDir",0),this._gaussianPassV.setUniform("blurSize",this.shadowBlur),this._gaussianPassV.setUniform("blurDir",1),this._outputDepthPass=new m.default({fragment:o.default.source("clay.sm.debug_depth")})}),{render:function(e,t,a,r){a||(a=t.getMainCamera()),this.trigger("beforerender",this,e,t,a),this._renderShadowPass(e,t,a,r),this.trigger("afterrender",this,e,t,a)},renderDebug:function(e,t){e.saveClear();var a=e.viewport,r=0,i=t||a.width/4,s=i;for(var n in this.softShadow===L.VSM?this._outputDepthPass.material.define("fragment","USE_VSM"):this._outputDepthPass.material.undefine("fragment","USE_VSM"),this._textures){var o=this._textures[n];e.setViewport(r,0,i*o.width/o.height,s),this._outputDepthPass.setUniform("depthMap",o),this._outputDepthPass.render(e),r+=i*o.width/o.height}e.setViewport(a),e.restoreClear()},_updateReceivers:function(e,t){if(t.receiveShadow?(this._receivers.push(t),t.material.set("shadowEnabled",1),t.material.set("pcfKernel",this.kernelPCF)):t.material.set("shadowEnabled",0),this.softShadow===L.VSM)t.material.define("fragment","USE_VSM"),t.material.undefine("fragment","PCF_KERNEL_SIZE");else{t.material.undefine("fragment","USE_VSM");var a=this.kernelPCF;a&&a.length?t.material.define("fragment","PCF_KERNEL_SIZE",a.length/2):t.material.undefine("fragment","PCF_KERNEL_SIZE")}},_update:function(e,t){var a=this;t.traverse((function(t){t.isRenderable()&&a._updateReceivers(e,t)}));for(var r=0;r<t.lights.length;r++){var i=t.lights[r];i.castShadow&&!i.invisible&&this._lightsCastShadow.push(i)}},_renderShadowPass:function(e,t,a,r){for(var i in this._shadowMapNumber)this._shadowMapNumber[i]=0;this._lightsCastShadow.length=0,this._receivers.length=0;var s=e.gl;if(r||t.update(),a&&a.update(),t.updateLights(),this._update(e,t),this._lightsCastShadow.length||!this._lastRenderNotCastShadow){this._lastRenderNotCastShadow=0===this._lightsCastShadow,s.enable(s.DEPTH_TEST),s.depthMask(!0),s.disable(s.BLEND),s.clearColor(1,1,1,1);for(var n,o=[],h=[],u=[],f=[],l=[],d=[],p=0;p<this._lightsCastShadow.length;p++){var _=this._lightsCastShadow[p];if("DIRECTIONAL_LIGHT"===_.type){if(n)continue;if(_.shadowCascade>4)continue;_.shadowCascade>1&&(n=_),this.renderDirectionalLightShadow(e,t,a,_,l,f,u)}else"SPOT_LIGHT"===_.type?this.renderSpotLightShadow(e,t,_,h,o):"POINT_LIGHT"===_.type&&this.renderPointLightShadow(e,t,_,d);this._shadowMapNumber[_.type]++}for(var m in this._shadowMapNumber){var g=this._shadowMapNumber[m],c=m+"_SHADOWMAP_COUNT";for(p=0;p<this._receivers.length;p++){(w=this._receivers[p].material).fragmentDefines[c]!==g&&(g>0?w.define("fragment",c,g):w.isDefined("fragment",c)&&w.undefine("fragment",c))}}for(p=0;p<this._receivers.length;p++){var w=this._receivers[p].material;n?w.define("fragment","SHADOW_CASCADE",n.shadowCascade):w.undefine("fragment","SHADOW_CASCADE")}var v=t.shadowUniforms;if(u.length>0){var S=u.map(y);if(v.directionalLightShadowMaps={value:u,type:"tv"},v.directionalLightMatrices={value:f,type:"m4v"},v.directionalLightShadowMapSizes={value:S,type:"1fv"},n){var T=l.slice(),M=l.slice();T.pop(),M.shift(),T.reverse(),M.reverse(),f.reverse(),v.shadowCascadeClipsNear={value:T,type:"1fv"},v.shadowCascadeClipsFar={value:M,type:"1fv"}}}if(o.length>0){var C=o.map(y);(v=t.shadowUniforms).spotLightShadowMaps={value:o,type:"tv"},v.spotLightMatrices={value:h,type:"m4v"},v.spotLightShadowMapSizes={value:C,type:"1fv"}}d.length>0&&(v.pointLightShadowMaps={value:d,type:"tv"})}function y(e){return e.height}},renderDirectionalLightShadow:(M=new i.default,C=new s.default,y=new r.default,x=new s.default,P=new s.default,E=new s.default,B=new s.default,function(e,t,a,r,i,o,h){var u=this._getDepthMaterial(r),f={getMaterial:function(e){return e.shadowDepthMaterial||u},isMaterialChanged:T,getUniform:S,ifRender:function(e){return e.castShadow},sortCompare:n.default.opaqueSortCompare};if(!t.viewBoundingBoxLastFrame.isFinite()){var l=t.getBoundingBox();t.viewBoundingBoxLastFrame.copy(l).applyTransform(a.viewMatrix)}var d=Math.min(-t.viewBoundingBoxLastFrame.min.z,a.far),_=Math.max(-t.viewBoundingBoxLastFrame.max.z,a.near),m=this._getDirectionalLightCamera(r,t,a),g=E.array;B.copy(m.projectionMatrix),c.default.invert(P.array,m.worldTransform.array),c.default.multiply(P.array,P.array,a.worldTransform.array),c.default.multiply(g,B.array,P.array);for(var w=[],v=a instanceof p.default,I=(a.near+a.far)/(a.near-a.far),b=2*a.near*a.far/(a.near-a.far),F=0;F<=r.shadowCascade;F++){var A=_*Math.pow(d/_,F/r.shadowCascade),N=_+(d-_)*F/r.shadowCascade,O=A*r.cascadeSplitLogFactor+N*(1-r.cascadeSplitLogFactor);w.push(O),i.push(-(-O*I+b)/-O)}var D=this._getTexture(r,r.shadowCascade);h.push(D);var V=e.viewport,R=e.gl;for(this._frameBuffer.attach(D),this._frameBuffer.bind(e),R.clear(R.COLOR_BUFFER_BIT|R.DEPTH_BUFFER_BIT),F=0;F<r.shadowCascade;F++){var U=w[F],H=w[F+1];v?c.default.perspective(C.array,a.fov/180*Math.PI,a.aspect,U,H):c.default.ortho(C.array,a.left,a.right,a.bottom,a.top,U,H),M.setFromProjection(C),M.getTransformedBoundingBox(y,P),y.applyProjection(B);var j=y.min.array,q=y.max.array;j[0]=Math.max(j[0],-1),j[1]=Math.max(j[1],-1),q[0]=Math.min(q[0],1),q[1]=Math.min(q[1],1),x.ortho(j[0],q[0],j[1],q[1],1,-1),m.projectionMatrix.multiplyLeft(x);var G=r.shadowResolution||512;e.setViewport((r.shadowCascade-F-1)*G,0,G,G,1);var z=t.updateRenderList(m);e.renderPass(z.opaque,m,f),this.softShadow===L.VSM&&this._gaussianFilter(e,D,D.width);var k=new s.default;k.copy(m.viewMatrix).multiplyLeft(m.projectionMatrix),o.push(k.array),m.projectionMatrix.copy(B)}this._frameBuffer.unbind(e),e.setViewport(V)}),renderSpotLightShadow:function(e,t,a,r,i){var o=this._getTexture(a),h=this._getSpotLightCamera(a),u=e.gl;this._frameBuffer.attach(o),this._frameBuffer.bind(e),u.clear(u.COLOR_BUFFER_BIT|u.DEPTH_BUFFER_BIT);var f=this._getDepthMaterial(a),l={getMaterial:function(e){return e.shadowDepthMaterial||f},isMaterialChanged:T,getUniform:S,ifRender:function(e){return e.castShadow},sortCompare:n.default.opaqueSortCompare},d=t.updateRenderList(h);e.renderPass(d.opaque,h,l),this._frameBuffer.unbind(e),this.softShadow===L.VSM&&this._gaussianFilter(e,o,o.width);var p=new s.default;p.copy(h.worldTransform).invert().multiplyLeft(h.projectionMatrix),i.push(o),r.push(p.array)},renderPointLightShadow:function(e,t,i,s){var o=this._getTexture(i),h=e.gl;s.push(o);var u=this._getDepthMaterial(i),f={getMaterial:function(e){return e.shadowDepthMaterial||u},getUniform:S,sortCompare:n.default.opaqueSortCompare},l={px:[],py:[],pz:[],nx:[],ny:[],nz:[]},d=new r.default,p=i.getWorldPosition().array,_=new r.default,m=i.range;_.min.setArray(p),_.max.setArray(p);var g=new a.default(m,m,m);_.max.add(g),_.min.sub(g);var c={px:!1,py:!1,pz:!1,nx:!1,ny:!1,nz:!1};t.traverse((function(e){if(e.isRenderable()&&e.castShadow){var t=e.geometry;if(!t.boundingBox){for(var a=0;a<v.length;a++)l[v[a]].push(e);return}if(d.transformFrom(t.boundingBox,e.worldTransform),!d.intersectBoundingBox(_))return;d.updateVertices();for(a=0;a<v.length;a++)c[v[a]]=!1;for(a=0;a<8;a++){var r=d.vertices[a],i=r[0]-p[0],s=r[1]-p[1],n=r[2]-p[2],o=Math.abs(i),h=Math.abs(s),u=Math.abs(n);o>h?o>u?c[i>0?"px":"nx"]=!0:c[n>0?"pz":"nz"]=!0:h>u?c[s>0?"py":"ny"]=!0:c[n>0?"pz":"nz"]=!0}for(a=0;a<v.length;a++)c[v[a]]&&l[v[a]].push(e)}}));for(var w=0;w<6;w++){var T=v[w],M=this._getPointLightCamera(i,T);this._frameBuffer.attach(o,h.COLOR_ATTACHMENT0,h.TEXTURE_CUBE_MAP_POSITIVE_X+w),this._frameBuffer.bind(e),h.clear(h.COLOR_BUFFER_BIT|h.DEPTH_BUFFER_BIT),e.renderPass(l[T],M,f)}this._frameBuffer.unbind(e)},_getDepthMaterial:function(e){var t=this._lightMaterials[e.__uid__],a="POINT_LIGHT"===e.type;if(!t){var r=a?"clay.sm.distance.":"clay.sm.depth.";t=new h.default({precision:this.precision,shader:new o.default(o.default.source(r+"vertex"),o.default.source(r+"fragment"))}),this._lightMaterials[e.__uid__]=t}return null!=e.shadowSlopeScale&&t.setUniform("slopeScale",e.shadowSlopeScale),null!=e.shadowBias&&t.setUniform("bias",e.shadowBias),this.softShadow===L.VSM?t.define("fragment","USE_VSM"):t.undefine("fragment","USE_VSM"),a&&(t.set("lightPosition",e.getWorldPosition().array),t.set("range",e.range)),t},_gaussianFilter:function(e,t,a){var r={width:a,height:a,type:f.default.FLOAT},i=this._texturePool.get(r);this._frameBuffer.attach(i),this._frameBuffer.bind(e),this._gaussianPassH.setUniform("texture",t),this._gaussianPassH.setUniform("textureWidth",a),this._gaussianPassH.render(e),this._frameBuffer.attach(t),this._gaussianPassV.setUniform("texture",i),this._gaussianPassV.setUniform("textureHeight",a),this._gaussianPassV.render(e),this._frameBuffer.unbind(e),this._texturePool.put(i)},_getTexture:function(e,a){var r=e.__uid__,i=this._textures[r],s=e.shadowResolution||512;return a=a||1,i||((i="POINT_LIGHT"===e.type?new d.default:new l.default).width=s*a,i.height=s,this.softShadow===L.VSM?(i.type=f.default.FLOAT,i.anisotropic=4):(i.minFilter=t.default.NEAREST,i.magFilter=t.default.NEAREST,i.useMipmap=!1),this._textures[r]=i),i},_getPointLightCamera:function(e,t){this._lightCameras.point||(this._lightCameras.point={px:new p.default,nx:new p.default,py:new p.default,ny:new p.default,pz:new p.default,nz:new p.default});var r=this._lightCameras.point[t];switch(r.far=e.range,r.fov=90,r.position.set(0,0,0),t){case"px":r.lookAt(a.default.POSITIVE_X,a.default.NEGATIVE_Y);break;case"nx":r.lookAt(a.default.NEGATIVE_X,a.default.NEGATIVE_Y);break;case"py":r.lookAt(a.default.POSITIVE_Y,a.default.POSITIVE_Z);break;case"ny":r.lookAt(a.default.NEGATIVE_Y,a.default.NEGATIVE_Z);break;case"pz":r.lookAt(a.default.POSITIVE_Z,a.default.NEGATIVE_Y);break;case"nz":r.lookAt(a.default.NEGATIVE_Z,a.default.NEGATIVE_Y)}return e.getWorldPosition(r.position),r.update(),r},_getDirectionalLightCamera:function(){var e=new s.default,t=new r.default,a=new r.default;return function(r,i,n){this._lightCameras.directional||(this._lightCameras.directional=new _.default);var o=this._lightCameras.directional;t.copy(i.viewBoundingBoxLastFrame),t.intersection(n.frustum.boundingBox),o.position.copy(t.min).add(t.max).scale(.5).transformMat4(n.worldTransform),o.rotation.copy(r.rotation),o.scale.copy(r.scale),o.updateWorldTransform(),s.default.invert(e,o.worldTransform),s.default.multiply(e,e,n.worldTransform),a.copy(t).applyTransform(e);var h=a.min.array,u=a.max.array;return o.position.set((h[0]+u[0])/2,(h[1]+u[1])/2,u[2]).transformMat4(o.worldTransform),o.near=0,o.far=-h[2]+u[2],isNaN(this.lightFrustumBias)?o.far*=4:o.far+=this.lightFrustumBias,o.left=h[0],o.right=u[0],o.top=u[1],o.bottom=h[1],o.update(!0),o}}(),_getSpotLightCamera:function(e){this._lightCameras.spot||(this._lightCameras.spot=new p.default);var t=this._lightCameras.spot;return t.fov=2*e.penumbraAngle,t.far=e.range,t.worldTransform.copy(e.worldTransform),t.updateProjectionMatrix(),c.default.invert(t.viewMatrix.array,t.worldTransform.array),t},dispose:function(e){var t=e.gl||e;for(var a in this._frameBuffer&&this._frameBuffer.dispose(t),this._textures)this._textures[a].dispose(t);this._texturePool.clear(e.gl),this._depthMaterials={},this._distanceMaterials={},this._textures={},this._lightCameras={},this._shadowMapNumber={POINT_LIGHT:0,DIRECTIONAL_LIGHT:0,SPOT_LIGHT:0},this._meshMaterials={};for(var r=0;r<this._receivers.length;r++){var i=this._receivers[r];if(i.material){var s=i.material;s.undefine("fragment","POINT_LIGHT_SHADOW_COUNT"),s.undefine("fragment","DIRECTIONAL_LIGHT_SHADOW_COUNT"),s.undefine("fragment","AMBIENT_LIGHT_SHADOW_COUNT"),s.set("shadowEnabled",0)}}this._receivers=[],this._lightsCastShadow=[]}});L.VSM=1,L.PCF=2;var I=L;exports.default=I;