瀏覽代碼

Updated builds.

Mr.doob 5 年之前
父節點
當前提交
9ca100f2d8
共有 3 個文件被更改,包括 43 次插入31 次删除
  1. 17 11
      build/three.js
  2. 9 9
      build/three.min.js
  3. 17 11
      build/three.module.js

+ 17 - 11
build/three.js

@@ -8786,7 +8786,7 @@
 
 		isMaterial: true,
 
-		onBeforeCompile: function () {},
+		onBeforeCompile: function ( /* shaderobject, renderer */ ) {},
 
 		setValues: function ( values ) {
 
@@ -18692,7 +18692,7 @@
 
 		}
 
-		this.getParameters = function ( material, lights, shadows, scene, nClipPlanes, nClipIntersection, object ) {
+		function getParameters( material, lights, shadows, scene, nClipPlanes, nClipIntersection, object ) {
 
 			var fog = scene.fog;
 			var environment = material.isMeshStandardMaterial ? scene.environment : null;
@@ -18845,9 +18845,9 @@
 
 			return parameters;
 
-		};
+		}
 
-		this.getProgramCacheKey = function ( parameters ) {
+		function getProgramCacheKey( parameters ) {
 
 			var array = [];
 
@@ -18890,9 +18890,9 @@
 
 			return array.join();
 
-		};
+		}
 
-		this.acquireProgram = function ( parameters, cacheKey ) {
+		function acquireProgram( parameters, cacheKey ) {
 
 			var program;
 
@@ -18921,9 +18921,9 @@
 
 			return program;
 
-		};
+		}
 
-		this.releaseProgram = function ( program ) {
+		function releaseProgram( program ) {
 
 			if ( -- program.usedTimes === 0 ) {
 
@@ -18937,10 +18937,16 @@
 
 			}
 
-		};
+		}
 
-		// Exposed for resource monitoring & error feedback via renderer.info:
-		this.programs = programs;
+		return {
+			getParameters: getParameters,
+			getProgramCacheKey: getProgramCacheKey,
+			acquireProgram: acquireProgram,
+			releaseProgram: releaseProgram,
+			// Exposed for resource monitoring & error feedback via renderer.info:
+			programs: programs
+		};
 
 	}
 

+ 9 - 9
build/three.min.js

@@ -85,21 +85,21 @@ q);else if(""!==a)console.warn("THREE.WebGLProgram: gl.getProgramInfoLog()",a);e
 a}return n};this.destroy=function(){d.deleteProgram(r);this.program=void 0};this.name=c.shaderName;this.id=mk++;this.cacheKey=b;this.usedTimes=1;this.program=r;this.vertexShader=f;this.fragmentShader=g;return this}function nk(a,b,c){function d(a){if(a)a.isTexture?b=a.encoding:a.isWebGLRenderTarget&&(console.warn("THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead."),b=a.texture.encoding);else var b=3E3;return b}var e=[],f=c.isWebGL2,
 g=c.logarithmicDepthBuffer,h=c.floatVertexTextures,l=c.maxVertexUniforms,m=c.vertexTextures,t=c.precision,p={MeshDepthMaterial:"depth",MeshDistanceMaterial:"distanceRGBA",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshToonMaterial:"toon",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",MeshMatcapMaterial:"matcap",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points",ShadowMaterial:"shadow",SpriteMaterial:"sprite"},
 k="precision isWebGL2 supportsVertexTextures outputEncoding instancing map mapEncoding matcap matcapEncoding envMap envMapMode envMapEncoding envMapCubeUV lightMap lightMapEncoding aoMap emissiveMap emissiveMapEncoding bumpMap normalMap objectSpaceNormalMap tangentSpaceNormalMap clearcoatMap clearcoatRoughnessMap clearcoatNormalMap displacementMap specularMap roughnessMap metalnessMap gradientMap alphaMap combine vertexColors vertexTangents vertexUvs uvsVertexOnly fog useFog fogExp2 flatShading sizeAttenuation logarithmicDepthBuffer skinning maxBones useVertexTexture morphTargets morphNormals maxMorphTargets maxMorphNormals premultipliedAlpha numDirLights numPointLights numSpotLights numHemiLights numRectAreaLights numDirLightShadows numPointLightShadows numSpotLightShadows shadowMapEnabled shadowMapType toneMapping physicallyCorrectLights alphaTest doubleSided flipSided numClippingPlanes numClipIntersection depthPacking dithering sheen".split(" ");
-this.getParameters=function(e,k,v,n,z,x,Ba){var q=n.fog;n=e.isMeshStandardMaterial?n.environment:null;n=e.envMap||n;var r=p[e.type];if(Ba.isSkinnedMesh){var u=Ba.skeleton.bones;if(h)u=1024;else{var A=Math.min(Math.floor((l-20)/4),u.length);A<u.length?(console.warn("THREE.WebGLRenderer: Skeleton has "+u.length+" bones. This GPU supports "+A+"."),u=0):u=A}}else u=0;null!==e.precision&&(t=c.getMaxPrecision(e.precision),t!==e.precision&&console.warn("THREE.WebGLProgram.getParameters:",e.precision,"not supported, using",
+return{getParameters:function(e,k,v,n,z,x,Ba){var q=n.fog;n=e.isMeshStandardMaterial?n.environment:null;n=e.envMap||n;var r=p[e.type];if(Ba.isSkinnedMesh){var u=Ba.skeleton.bones;if(h)u=1024;else{var A=Math.min(Math.floor((l-20)/4),u.length);A<u.length?(console.warn("THREE.WebGLRenderer: Skeleton has "+u.length+" bones. This GPU supports "+A+"."),u=0):u=A}}else u=0;null!==e.precision&&(t=c.getMaxPrecision(e.precision),t!==e.precision&&console.warn("THREE.WebGLProgram.getParameters:",e.precision,"not supported, using",
 t,"instead."));r?(A=fb[r],A={name:e.type,uniforms:Qh.clone(A.uniforms),vertexShader:A.vertexShader,fragmentShader:A.fragmentShader}):A={name:e.type,uniforms:e.uniforms,vertexShader:e.vertexShader,fragmentShader:e.fragmentShader};e.onBeforeCompile(A,a);var w=a.getRenderTarget();return{isWebGL2:f,shaderID:r,shaderName:A.name,uniforms:A.uniforms,vertexShader:A.vertexShader,fragmentShader:A.fragmentShader,defines:e.defines,isRawShaderMaterial:e.isRawShaderMaterial,isShaderMaterial:e.isShaderMaterial,
 precision:t,instancing:!0===Ba.isInstancedMesh,supportsVertexTextures:m,outputEncoding:null!==w?d(w.texture):a.outputEncoding,map:!!e.map,mapEncoding:d(e.map),matcap:!!e.matcap,matcapEncoding:d(e.matcap),envMap:!!n,envMapMode:n&&n.mapping,envMapEncoding:d(n),envMapCubeUV:!!n&&(306===n.mapping||307===n.mapping),lightMap:!!e.lightMap,lightMapEncoding:d(e.lightMap),aoMap:!!e.aoMap,emissiveMap:!!e.emissiveMap,emissiveMapEncoding:d(e.emissiveMap),bumpMap:!!e.bumpMap,normalMap:!!e.normalMap,objectSpaceNormalMap:1===
 e.normalMapType,tangentSpaceNormalMap:0===e.normalMapType,clearcoatMap:!!e.clearcoatMap,clearcoatRoughnessMap:!!e.clearcoatRoughnessMap,clearcoatNormalMap:!!e.clearcoatNormalMap,displacementMap:!!e.displacementMap,roughnessMap:!!e.roughnessMap,metalnessMap:!!e.metalnessMap,specularMap:!!e.specularMap,alphaMap:!!e.alphaMap,gradientMap:!!e.gradientMap,sheen:!!e.sheen,combine:e.combine,vertexTangents:e.normalMap&&e.vertexTangents,vertexColors:e.vertexColors,vertexUvs:!!e.map||!!e.bumpMap||!!e.normalMap||
 !!e.specularMap||!!e.alphaMap||!!e.emissiveMap||!!e.roughnessMap||!!e.metalnessMap||!!e.clearcoatMap||!!e.clearcoatRoughnessMap||!!e.clearcoatNormalMap||!!e.displacementMap,uvsVertexOnly:!(e.map||e.bumpMap||e.normalMap||e.specularMap||e.alphaMap||e.emissiveMap||e.roughnessMap||e.metalnessMap||e.clearcoatNormalMap)&&!!e.displacementMap,fog:!!q,useFog:e.fog,fogExp2:q&&q.isFogExp2,flatShading:e.flatShading,sizeAttenuation:e.sizeAttenuation,logarithmicDepthBuffer:g,skinning:e.skinning&&0<u,maxBones:u,
 useVertexTexture:h,morphTargets:e.morphTargets,morphNormals:e.morphNormals,maxMorphTargets:a.maxMorphTargets,maxMorphNormals:a.maxMorphNormals,numDirLights:k.directional.length,numPointLights:k.point.length,numSpotLights:k.spot.length,numRectAreaLights:k.rectArea.length,numHemiLights:k.hemi.length,numDirLightShadows:k.directionalShadowMap.length,numPointLightShadows:k.pointShadowMap.length,numSpotLightShadows:k.spotShadowMap.length,numClippingPlanes:z,numClipIntersection:x,dithering:e.dithering,shadowMapEnabled:a.shadowMap.enabled&&
 0<v.length,shadowMapType:a.shadowMap.type,toneMapping:e.toneMapped?a.toneMapping:0,physicallyCorrectLights:a.physicallyCorrectLights,premultipliedAlpha:e.premultipliedAlpha,alphaTest:e.alphaTest,doubleSided:2===e.side,flipSided:1===e.side,depthPacking:void 0!==e.depthPacking?e.depthPacking:!1,index0AttributeName:e.index0AttributeName,extensionDerivatives:e.extensions&&e.extensions.derivatives,extensionFragDepth:e.extensions&&e.extensions.fragDepth,extensionDrawBuffers:e.extensions&&e.extensions.drawBuffers,
-extensionShaderTextureLOD:e.extensions&&e.extensions.shaderTextureLOD,rendererExtensionFragDepth:f||null!==b.get("EXT_frag_depth"),rendererExtensionDrawBuffers:f||null!==b.get("WEBGL_draw_buffers"),rendererExtensionShaderTextureLod:f||null!==b.get("EXT_shader_texture_lod"),onBeforeCompile:e.onBeforeCompile}};this.getProgramCacheKey=function(b){var c=[];b.shaderID?c.push(b.shaderID):(c.push(b.fragmentShader),c.push(b.vertexShader));if(void 0!==b.defines)for(var d in b.defines)c.push(d),c.push(b.defines[d]);
-if(void 0===b.isRawShaderMaterial){for(d=0;d<k.length;d++)c.push(b[k[d]]);c.push(a.outputEncoding);c.push(a.gammaFactor)}c.push(b.onBeforeCompile.toString());return c.join()};this.acquireProgram=function(b,c){for(var d,f=0,g=e.length;f<g;f++){var h=e[f];if(h.cacheKey===c){d=h;++d.usedTimes;break}}void 0===d&&(d=new lk(a,c,b),e.push(d));return d};this.releaseProgram=function(a){if(0===--a.usedTimes){var b=e.indexOf(a);e[b]=e[e.length-1];e.pop();a.destroy()}};this.programs=e}function ok(){var a=new WeakMap;
-return{get:function(b){var c=a.get(b);void 0===c&&(c={},a.set(b,c));return c},remove:function(b){a.delete(b)},update:function(b,c,d){a.get(b)[c]=d},dispose:function(){a=new WeakMap}}}function pk(a,b){return a.groupOrder!==b.groupOrder?a.groupOrder-b.groupOrder:a.renderOrder!==b.renderOrder?a.renderOrder-b.renderOrder:a.program!==b.program?a.program.id-b.program.id:a.material.id!==b.material.id?a.material.id-b.material.id:a.z!==b.z?a.z-b.z:a.id-b.id}function qk(a,b){return a.groupOrder!==b.groupOrder?
-a.groupOrder-b.groupOrder:a.renderOrder!==b.renderOrder?a.renderOrder-b.renderOrder:a.z!==b.z?b.z-a.z:a.id-b.id}function Rh(){function a(a,d,e,m,t,p){var g=b[c];void 0===g?(g={id:a.id,object:a,geometry:d,material:e,program:e.program||f,groupOrder:m,renderOrder:a.renderOrder,z:t,group:p},b[c]=g):(g.id=a.id,g.object=a,g.geometry=d,g.material=e,g.program=e.program||f,g.groupOrder=m,g.renderOrder=a.renderOrder,g.z=t,g.group=p);c++;return g}var b=[],c=0,d=[],e=[],f={id:-1};return{opaque:d,transparent:e,
-init:function(){c=0;d.length=0;e.length=0},push:function(b,c,f,m,t,p){b=a(b,c,f,m,t,p);(!0===f.transparent?e:d).push(b)},unshift:function(b,c,f,m,t,p){b=a(b,c,f,m,t,p);(!0===f.transparent?e:d).unshift(b)},finish:function(){for(var a=c,d=b.length;a<d;a++){var e=b[a];if(null===e.id)break;e.id=null;e.object=null;e.geometry=null;e.material=null;e.program=null;e.group=null}},sort:function(a,b){1<d.length&&d.sort(a||pk);1<e.length&&e.sort(b||qk)}}}function rk(){function a(c){c=c.target;c.removeEventListener("dispose",
-a);b.delete(c)}var b=new WeakMap;return{get:function(c,d){var e=b.get(c);if(void 0===e){var f=new Rh;b.set(c,new WeakMap);b.get(c).set(d,f);c.addEventListener("dispose",a)}else f=e.get(d),void 0===f&&(f=new Rh,e.set(d,f));return f},dispose:function(){b=new WeakMap}}}function sk(){var a={};return{get:function(b){if(void 0!==a[b.id])return a[b.id];switch(b.type){case "DirectionalLight":var c={direction:new n,color:new D};break;case "SpotLight":c={position:new n,direction:new n,color:new D,distance:0,
-coneCos:0,penumbraCos:0,decay:0};break;case "PointLight":c={position:new n,color:new D,distance:0,decay:0};break;case "HemisphereLight":c={direction:new n,skyColor:new D,groundColor:new D};break;case "RectAreaLight":c={color:new D,position:new n,halfWidth:new n,halfHeight:new n}}return a[b.id]=c}}}function tk(){var a={};return{get:function(b){if(void 0!==a[b.id])return a[b.id];switch(b.type){case "DirectionalLight":var c={shadowBias:0,shadowRadius:1,shadowMapSize:new w};break;case "SpotLight":c={shadowBias:0,
-shadowRadius:1,shadowMapSize:new w};break;case "PointLight":c={shadowBias:0,shadowRadius:1,shadowMapSize:new w,shadowCameraNear:1,shadowCameraFar:1E3}}return a[b.id]=c}}}function uk(a,b){return(b.castShadow?1:0)-(a.castShadow?1:0)}function vk(){for(var a=new sk,b=tk(),c={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],
+extensionShaderTextureLOD:e.extensions&&e.extensions.shaderTextureLOD,rendererExtensionFragDepth:f||null!==b.get("EXT_frag_depth"),rendererExtensionDrawBuffers:f||null!==b.get("WEBGL_draw_buffers"),rendererExtensionShaderTextureLod:f||null!==b.get("EXT_shader_texture_lod"),onBeforeCompile:e.onBeforeCompile}},getProgramCacheKey:function(b){var c=[];b.shaderID?c.push(b.shaderID):(c.push(b.fragmentShader),c.push(b.vertexShader));if(void 0!==b.defines)for(var d in b.defines)c.push(d),c.push(b.defines[d]);
+if(void 0===b.isRawShaderMaterial){for(d=0;d<k.length;d++)c.push(b[k[d]]);c.push(a.outputEncoding);c.push(a.gammaFactor)}c.push(b.onBeforeCompile.toString());return c.join()},acquireProgram:function(b,c){for(var d,f=0,g=e.length;f<g;f++){var h=e[f];if(h.cacheKey===c){d=h;++d.usedTimes;break}}void 0===d&&(d=new lk(a,c,b),e.push(d));return d},releaseProgram:function(a){if(0===--a.usedTimes){var b=e.indexOf(a);e[b]=e[e.length-1];e.pop();a.destroy()}},programs:e}}function ok(){var a=new WeakMap;return{get:function(b){var c=
+a.get(b);void 0===c&&(c={},a.set(b,c));return c},remove:function(b){a.delete(b)},update:function(b,c,d){a.get(b)[c]=d},dispose:function(){a=new WeakMap}}}function pk(a,b){return a.groupOrder!==b.groupOrder?a.groupOrder-b.groupOrder:a.renderOrder!==b.renderOrder?a.renderOrder-b.renderOrder:a.program!==b.program?a.program.id-b.program.id:a.material.id!==b.material.id?a.material.id-b.material.id:a.z!==b.z?a.z-b.z:a.id-b.id}function qk(a,b){return a.groupOrder!==b.groupOrder?a.groupOrder-b.groupOrder:
+a.renderOrder!==b.renderOrder?a.renderOrder-b.renderOrder:a.z!==b.z?b.z-a.z:a.id-b.id}function Rh(){function a(a,d,e,m,t,p){var g=b[c];void 0===g?(g={id:a.id,object:a,geometry:d,material:e,program:e.program||f,groupOrder:m,renderOrder:a.renderOrder,z:t,group:p},b[c]=g):(g.id=a.id,g.object=a,g.geometry=d,g.material=e,g.program=e.program||f,g.groupOrder=m,g.renderOrder=a.renderOrder,g.z=t,g.group=p);c++;return g}var b=[],c=0,d=[],e=[],f={id:-1};return{opaque:d,transparent:e,init:function(){c=0;d.length=
+0;e.length=0},push:function(b,c,f,m,t,p){b=a(b,c,f,m,t,p);(!0===f.transparent?e:d).push(b)},unshift:function(b,c,f,m,t,p){b=a(b,c,f,m,t,p);(!0===f.transparent?e:d).unshift(b)},finish:function(){for(var a=c,d=b.length;a<d;a++){var e=b[a];if(null===e.id)break;e.id=null;e.object=null;e.geometry=null;e.material=null;e.program=null;e.group=null}},sort:function(a,b){1<d.length&&d.sort(a||pk);1<e.length&&e.sort(b||qk)}}}function rk(){function a(c){c=c.target;c.removeEventListener("dispose",a);b.delete(c)}
+var b=new WeakMap;return{get:function(c,d){var e=b.get(c);if(void 0===e){var f=new Rh;b.set(c,new WeakMap);b.get(c).set(d,f);c.addEventListener("dispose",a)}else f=e.get(d),void 0===f&&(f=new Rh,e.set(d,f));return f},dispose:function(){b=new WeakMap}}}function sk(){var a={};return{get:function(b){if(void 0!==a[b.id])return a[b.id];switch(b.type){case "DirectionalLight":var c={direction:new n,color:new D};break;case "SpotLight":c={position:new n,direction:new n,color:new D,distance:0,coneCos:0,penumbraCos:0,
+decay:0};break;case "PointLight":c={position:new n,color:new D,distance:0,decay:0};break;case "HemisphereLight":c={direction:new n,skyColor:new D,groundColor:new D};break;case "RectAreaLight":c={color:new D,position:new n,halfWidth:new n,halfHeight:new n}}return a[b.id]=c}}}function tk(){var a={};return{get:function(b){if(void 0!==a[b.id])return a[b.id];switch(b.type){case "DirectionalLight":var c={shadowBias:0,shadowRadius:1,shadowMapSize:new w};break;case "SpotLight":c={shadowBias:0,shadowRadius:1,
+shadowMapSize:new w};break;case "PointLight":c={shadowBias:0,shadowRadius:1,shadowMapSize:new w,shadowCameraNear:1,shadowCameraFar:1E3}}return a[b.id]=c}}}function uk(a,b){return(b.castShadow?1:0)-(a.castShadow?1:0)}function vk(){for(var a=new sk,b=tk(),c={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],
 directionalShadowMatrix:[],spot:[],spotShadow:[],spotShadowMap:[],spotShadowMatrix:[],rectArea:[],point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[]},d=0;9>d;d++)c.probe.push(new n);var e=new n,f=new M,g=new M;return{setup:function(d,l,m){for(var h=l=0,p=0,k=0;9>k;k++)c.probe[k].set(0,0,0);var q=k=0,r=0,u=0,n=0,z=0,x=0,Ba=0;m=m.matrixWorldInverse;d.sort(uk);for(var ma=0,N=d.length;ma<N;ma++){var C=d[ma],P=C.color,w=C.intensity,O=C.distance,fa=C.shadow&&C.shadow.map?C.shadow.map.texture:
 null;if(C.isAmbientLight)l+=P.r*w,h+=P.g*w,p+=P.b*w;else if(C.isLightProbe)for(fa=0;9>fa;fa++)c.probe[fa].addScaledVector(C.sh.coefficients[fa],w);else if(C.isDirectionalLight){w=a.get(C);w.color.copy(C.color).multiplyScalar(C.intensity);w.direction.setFromMatrixPosition(C.matrixWorld);e.setFromMatrixPosition(C.target.matrixWorld);w.direction.sub(e);w.direction.transformDirection(m);if(C.castShadow){var ia=C.shadow;P=b.get(C);P.shadowBias=ia.bias;P.shadowRadius=ia.radius;P.shadowMapSize=ia.mapSize;
 c.directionalShadow[k]=P;c.directionalShadowMap[k]=fa;c.directionalShadowMatrix[k]=C.shadow.matrix;z++}c.directional[k]=w;k++}else C.isSpotLight?(ia=a.get(C),ia.position.setFromMatrixPosition(C.matrixWorld),ia.position.applyMatrix4(m),ia.color.copy(P).multiplyScalar(w),ia.distance=O,ia.direction.setFromMatrixPosition(C.matrixWorld),e.setFromMatrixPosition(C.target.matrixWorld),ia.direction.sub(e),ia.direction.transformDirection(m),ia.coneCos=Math.cos(C.angle),ia.penumbraCos=Math.cos(C.angle*(1-C.penumbra)),

+ 17 - 11
build/three.module.js

@@ -8780,7 +8780,7 @@ Material.prototype = Object.assign( Object.create( EventDispatcher.prototype ),
 
 	isMaterial: true,
 
-	onBeforeCompile: function () {},
+	onBeforeCompile: function ( /* shaderobject, renderer */ ) {},
 
 	setValues: function ( values ) {
 
@@ -18679,7 +18679,7 @@ function WebGLPrograms( renderer, extensions, capabilities ) {
 
 	}
 
-	this.getParameters = function ( material, lights, shadows, scene, nClipPlanes, nClipIntersection, object ) {
+	function getParameters( material, lights, shadows, scene, nClipPlanes, nClipIntersection, object ) {
 
 		const fog = scene.fog;
 		const environment = material.isMeshStandardMaterial ? scene.environment : null;
@@ -18832,9 +18832,9 @@ function WebGLPrograms( renderer, extensions, capabilities ) {
 
 		return parameters;
 
-	};
+	}
 
-	this.getProgramCacheKey = function ( parameters ) {
+	function getProgramCacheKey( parameters ) {
 
 		const array = [];
 
@@ -18877,9 +18877,9 @@ function WebGLPrograms( renderer, extensions, capabilities ) {
 
 		return array.join();
 
-	};
+	}
 
-	this.acquireProgram = function ( parameters, cacheKey ) {
+	function acquireProgram( parameters, cacheKey ) {
 
 		let program;
 
@@ -18908,9 +18908,9 @@ function WebGLPrograms( renderer, extensions, capabilities ) {
 
 		return program;
 
-	};
+	}
 
-	this.releaseProgram = function ( program ) {
+	function releaseProgram( program ) {
 
 		if ( -- program.usedTimes === 0 ) {
 
@@ -18924,10 +18924,16 @@ function WebGLPrograms( renderer, extensions, capabilities ) {
 
 		}
 
-	};
+	}
 
-	// Exposed for resource monitoring & error feedback via renderer.info:
-	this.programs = programs;
+	return {
+		getParameters: getParameters,
+		getProgramCacheKey: getProgramCacheKey,
+		acquireProgram: acquireProgram,
+		releaseProgram: releaseProgram,
+		// Exposed for resource monitoring & error feedback via renderer.info:
+		programs: programs
+	};
 
 }