提交 77341c86 编写于 作者: A alteredq

First attempt at shadow mapping (work-in-progress).

上级 f72cec85
因为 它太大了无法显示 source diff 。你可以改为 查看blob
......@@ -44,7 +44,7 @@ THREE.Matrix4.makeInvert3x3=function(a){var b=a.m33,c=b.m,d=a.n33*a.n22-a.n32*a.
THREE.Matrix4.makeFrustum=function(a,b,c,d,f,g){var e;e=new THREE.Matrix4;e.n11=2*f/(b-a);e.n12=0;e.n13=(b+a)/(b-a);e.n14=0;e.n21=0;e.n22=2*f/(d-c);e.n23=(d+c)/(d-c);e.n24=0;e.n31=0;e.n32=0;e.n33=-(g+f)/(g-f);e.n34=-2*g*f/(g-f);e.n41=0;e.n42=0;e.n43=-1;e.n44=0;return e};THREE.Matrix4.makePerspective=function(a,b,c,d){var f,a=c*Math.tan(a*Math.PI/360);f=-a;return THREE.Matrix4.makeFrustum(f*b,a*b,f,a,c,d)};
THREE.Matrix4.makeOrtho=function(a,b,c,d,f,g){var e,h,i,l;e=new THREE.Matrix4;h=b-a;i=c-d;l=g-f;e.n11=2/h;e.n12=0;e.n13=0;e.n14=-((b+a)/h);e.n21=0;e.n22=2/i;e.n23=0;e.n24=-((c+d)/i);e.n31=0;e.n32=0;e.n33=-2/l;e.n34=-((g+f)/l);e.n41=0;e.n42=0;e.n43=0;e.n44=1;return e};THREE.Matrix4.__v1=new THREE.Vector3;THREE.Matrix4.__v2=new THREE.Vector3;THREE.Matrix4.__v3=new THREE.Vector3;
THREE.Object3D=function(){this.parent=void 0;this.children=[];this.up=new THREE.Vector3(0,1,0);this.position=new THREE.Vector3;this.rotation=new THREE.Vector3;this.eulerOrder="XYZ";this.scale=new THREE.Vector3(1,1,1);this.flipSided=this.doubleSided=this.dynamic=!1;this.renderDepth=null;this.rotationAutoUpdate=!0;this.matrix=new THREE.Matrix4;this.matrixWorld=new THREE.Matrix4;this.matrixRotationWorld=new THREE.Matrix4;this.matrixWorldNeedsUpdate=this.matrixAutoUpdate=!0;this.quaternion=new THREE.Quaternion;
this.useQuaternion=!1;this.boundRadius=0;this.boundRadiusScale=1;this.visible=!0;this._vector=new THREE.Vector3;this.name=""};
this.useQuaternion=!1;this.boundRadius=0;this.boundRadiusScale=1;this.visible=!0;this.receiveShadow=this.castShadow=!1;this._vector=new THREE.Vector3;this.name=""};
THREE.Object3D.prototype={translate:function(a,b){this.matrix.rotateAxis(b);this.position.addSelf(b.multiplyScalar(a))},translateX:function(a){this.translate(a,this._vector.set(1,0,0))},translateY:function(a){this.translate(a,this._vector.set(0,1,0))},translateZ:function(a){this.translate(a,this._vector.set(0,0,1))},lookAt:function(a){this.matrix.lookAt(a,this.position,this.up);this.rotationAutoUpdate&&this.rotation.setRotationFromMatrix(this.matrix)},addChild:function(a){if(this.children.indexOf(a)===
-1){a.parent!==void 0&&a.parent.removeChild(a);a.parent=this;this.children.push(a);for(var b=this;b.parent!==void 0;)b=b.parent;b!==void 0&&b instanceof THREE.Scene&&b.addChildRecurse(a)}},removeChild:function(a){var b=this.children.indexOf(a);if(b!==-1)a.parent=void 0,this.children.splice(b,1)},getChildByName:function(a,b){var c,d,f;c=0;for(d=this.children.length;c<d;c++){f=this.children[c];if(f.name===a)return f;if(b&&(f=f.getChildByName(a,b),f!==void 0))return f}},updateMatrix:function(){this.matrix.setPosition(this.position);
this.useQuaternion?this.matrix.setRotationFromQuaternion(this.quaternion):this.matrix.setRotationFromEuler(this.rotation,this.eulerOrder);if(this.scale.x!==1||this.scale.y!==1||this.scale.z!==1)this.matrix.scale(this.scale),this.boundRadiusScale=Math.max(this.scale.x,Math.max(this.scale.y,this.scale.z));this.matrixWorldNeedsUpdate=!0},update:function(a,b,c){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||b)a?this.matrixWorld.multiply(a,this.matrix):this.matrixWorld.copy(this.matrix),
......
......@@ -44,7 +44,7 @@ THREE.Matrix4.makeInvert3x3=function(a){var b=a.m33,c=b.m,d=a.n33*a.n22-a.n32*a.
THREE.Matrix4.makeFrustum=function(a,b,c,d,e,g){var f;f=new THREE.Matrix4;f.n11=2*e/(b-a);f.n12=0;f.n13=(b+a)/(b-a);f.n14=0;f.n21=0;f.n22=2*e/(d-c);f.n23=(d+c)/(d-c);f.n24=0;f.n31=0;f.n32=0;f.n33=-(g+e)/(g-e);f.n34=-2*g*e/(g-e);f.n41=0;f.n42=0;f.n43=-1;f.n44=0;return f};THREE.Matrix4.makePerspective=function(a,b,c,d){var e,a=c*Math.tan(a*Math.PI/360);e=-a;return THREE.Matrix4.makeFrustum(e*b,a*b,e,a,c,d)};
THREE.Matrix4.makeOrtho=function(a,b,c,d,e,g){var f,h,j,i;f=new THREE.Matrix4;h=b-a;j=c-d;i=g-e;f.n11=2/h;f.n12=0;f.n13=0;f.n14=-((b+a)/h);f.n21=0;f.n22=2/j;f.n23=0;f.n24=-((c+d)/j);f.n31=0;f.n32=0;f.n33=-2/i;f.n34=-((g+e)/i);f.n41=0;f.n42=0;f.n43=0;f.n44=1;return f};THREE.Matrix4.__v1=new THREE.Vector3;THREE.Matrix4.__v2=new THREE.Vector3;THREE.Matrix4.__v3=new THREE.Vector3;
THREE.Object3D=function(){this.parent=void 0;this.children=[];this.up=new THREE.Vector3(0,1,0);this.position=new THREE.Vector3;this.rotation=new THREE.Vector3;this.eulerOrder="XYZ";this.scale=new THREE.Vector3(1,1,1);this.flipSided=this.doubleSided=this.dynamic=!1;this.renderDepth=null;this.rotationAutoUpdate=!0;this.matrix=new THREE.Matrix4;this.matrixWorld=new THREE.Matrix4;this.matrixRotationWorld=new THREE.Matrix4;this.matrixWorldNeedsUpdate=this.matrixAutoUpdate=!0;this.quaternion=new THREE.Quaternion;
this.useQuaternion=!1;this.boundRadius=0;this.boundRadiusScale=1;this.visible=!0;this._vector=new THREE.Vector3;this.name=""};
this.useQuaternion=!1;this.boundRadius=0;this.boundRadiusScale=1;this.visible=!0;this.receiveShadow=this.castShadow=!1;this._vector=new THREE.Vector3;this.name=""};
THREE.Object3D.prototype={translate:function(a,b){this.matrix.rotateAxis(b);this.position.addSelf(b.multiplyScalar(a))},translateX:function(a){this.translate(a,this._vector.set(1,0,0))},translateY:function(a){this.translate(a,this._vector.set(0,1,0))},translateZ:function(a){this.translate(a,this._vector.set(0,0,1))},lookAt:function(a){this.matrix.lookAt(a,this.position,this.up);this.rotationAutoUpdate&&this.rotation.setRotationFromMatrix(this.matrix)},addChild:function(a){if(this.children.indexOf(a)===
-1){a.parent!==void 0&&a.parent.removeChild(a);a.parent=this;this.children.push(a);for(var b=this;b.parent!==void 0;)b=b.parent;b!==void 0&&b instanceof THREE.Scene&&b.addChildRecurse(a)}},removeChild:function(a){var b=this.children.indexOf(a);if(b!==-1)a.parent=void 0,this.children.splice(b,1)},getChildByName:function(a,b){var c,d,e;c=0;for(d=this.children.length;c<d;c++){e=this.children[c];if(e.name===a)return e;if(b&&(e=e.getChildByName(a,b),e!==void 0))return e}},updateMatrix:function(){this.matrix.setPosition(this.position);
this.useQuaternion?this.matrix.setRotationFromQuaternion(this.quaternion):this.matrix.setRotationFromEuler(this.rotation,this.eulerOrder);if(this.scale.x!==1||this.scale.y!==1||this.scale.z!==1)this.matrix.scale(this.scale),this.boundRadiusScale=Math.max(this.scale.x,Math.max(this.scale.y,this.scale.z));this.matrixWorldNeedsUpdate=!0},update:function(a,b,c){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||b)a?this.matrixWorld.multiply(a,this.matrix):this.matrixWorld.copy(this.matrix),
......
......@@ -142,11 +142,11 @@ THREE.FontUtils={faces:{},face:"helvetiker",weight:"normal",style:"normal",size:
t,v,x;h=[];for(e=0;e<j.length;e++){k=j[e];f=k.shape;g=k.holes;for(l=0;l<g.length;l++){m=g[l];w=Number.POSITIVE_INFINITY;for(n=0;n<m.length;n++){v=m[n];for(b=0;b<f.length;b++)t=f[b],t=v.distanceTo(t),t<w&&(w=t,o=n,p=b)}b=p-1>=0?p-1:f.length-1;var n=o-1>=0?o-1:m.length-1,y=[];y.push(m[o]);y.push(f[p]);y.push(f[b]);w=this.Triangulate.area(y);var u=[];u.push(m[o]);u.push(m[n]);u.push(f[p]);v=this.Triangulate.area(u);t=p;x=o;p+=1;o+=-1;p<0&&(p+=f.length);p%=f.length;o<0&&(o+=m.length);o%=f.length;b=p-
1>=0?p-1:f.length-1;n=o-1>=0?o-1:m.length-1;y=[];y.push(m[o]);y.push(f[p]);y.push(f[b]);y=this.Triangulate.area(y);u=[];u.push(m[o]);u.push(m[n]);u.push(f[p]);u=this.Triangulate.area(u);w+v>y+u&&(p=t,o=x,p<0&&(p+=f.length),p%=f.length,o<0&&(o+=m.length),o%=f.length,b=p-1>=0?p-1:f.length-1,n=o-1>=0?o-1:m.length-1);w=f.slice(0,p);v=f.slice(p);t=m.slice(o);x=m.slice(0,o);h.push(m[o]);h.push(f[p]);h.push(f[b]);h.push(m[o]);h.push(m[n]);h.push(f[p]);f=w.concat(t).concat(x).concat(v)}k.shape=f}o=[];p=[];
for(e=l=0;e<j.length;e++){k=j[e];f=k.shape;o=o.concat(f);m=THREE.FontUtils.Triangulate(f,!0);for(g=0;g<m.length;g++)k=m[g],k[0]+=l,k[1]+=l,k[2]+=l;p=p.concat(m);l+=f.length}var z;for(g=0;g<h.length/3;g++){k=[];for(j=0;j<3;j++){e=!1;for(f=0;f<o.length&&!e;f++)z=g*3+j,o[f].equals(h[z])&&(k.push(f),e=!0);e||(o.push(h[z]),k.push(o.length-1),console.log("not found"))}p.push(k)}return{points:o,faces:p}},drawText:function(a){var c=[],b=[],g,f=this.getFace(),h=this.size/f.resolution,e=0;g=String(a).split("");
for(var j=g.length,k=new THREE.Path,a=0;a<j;a++){var l=this.extractGlyphPoints(g[a],f,h,e,k);e+=l.offset;c.push(l.points);b=b.concat(l.points)}console.log(k);a=e/2;for(g=0;g<b.length;g++)b[g].x-=a;c=this.extractPoints(b,c);c.contour=b;f=[];h=[];g=[];for(var e=[],j=new THREE.Vector2,m,a=b.length;--a>=0;){if(m){if(m.equals(b[a])){m=null;k=this.Triangulate.area(g)>0;e.push(k);h.push(j.divideScalar(g.length));g=[];j=new THREE.Vector2;continue}}else m=b[a];j.addSelf(b[a]);g.push(b[a])}a=b.length;for(g=
0;--a>=0;)k=b[a],j=h[g],k=k.clone().subSelf(j),l=this.bevelSize/k.length(),e[g]?l+=1:l=1-l,l=k.multiplyScalar(l).addSelf(j),f.unshift(l),m?m.equals(b[a])&&(m=null,g++):m=b[a];c.bevel=f;return c},b2p0:function(a,c){var b=1-a;return b*b*c},b2p1:function(a,c){return 2*(1-a)*a*c},b2p2:function(a,c){return a*a*c},b2:function(a,c,b,g){return this.b2p0(a,c)+this.b2p1(a,b)+this.b2p2(a,g)},b3p0:function(a,c){var b=1-a;return b*b*b*c},b3p1:function(a,c){var b=1-a;return 3*b*b*a*c},b3p2:function(a,c){return 3*
(1-a)*a*a*c},b3p3:function(a,c){return a*a*a*c},b3:function(a,c,b,g,f){return this.b3p0(a,c)+this.b3p1(a,b)+this.b3p2(a,g)+this.b3p3(a,f)},extractGlyphPoints:function(a,c,b,g,f){var h=[],e,j,k,l,m,n,o,p,w,t,v=c.glyphs[a]||c.glyphs[ctxt.options.fallbackCharacter];if(v){if(v.o){c=v._cachedOutline||(v._cachedOutline=v.o.split(" "));k=c.length;for(a=0;a<k;)switch(j=c[a++],j){case "m":j=c[a++]*b+g;l=c[a++]*b;h.push(new THREE.Vector2(j,l));f.moveTo(j,l);break;case "l":j=c[a++]*b+g;l=c[a++]*b;h.push(new THREE.Vector2(j,
l));f.lineTo(j,l);break;case "q":j=c[a++]*b+g;l=c[a++]*b;o=c[a++]*b+g;p=c[a++]*b;f.quadraticCurveTo(o,p,j,l);if(e=h[h.length-1]){m=e.x;n=e.y;e=1;for(divisions=this.divisions;e<=divisions;e++){var x=e/divisions,y=THREE.FontUtils.b2(x,m,o,j),x=THREE.FontUtils.b2(x,n,p,l);h.push(new THREE.Vector2(y,x))}}break;case "b":if(j=c[a++]*b+g,l=c[a++]*b,o=c[a++]*b+g,p=c[a++]*-b,w=c[a++]*b+g,t=c[a++]*-b,f.bezierCurveTo(j,l,o,p,w,t),e=h[h.length-1]){m=e.x;n=e.y;e=1;for(divisions=this.divisions;e<=divisions;e++)x=
e/divisions,y=THREE.FontUtils.b3(x,m,o,w,j),x=THREE.FontUtils.b3(x,n,p,t,l),h.push(new THREE.Vector2(y,x))}}}return{offset:v.ha*b,points:h,path:f}}}};
for(var j=g.length,k=new THREE.Path,a=0;a<j;a++){var l=this.extractGlyphPoints(g[a],f,h,e,k);e+=l.offset;c.push(l.points);b=b.concat(l.points)}a=e/2;for(g=0;g<b.length;g++)b[g].x-=a;c=this.extractPoints(b,c);c.contour=b;f=[];h=[];g=[];for(var e=[],j=new THREE.Vector2,m,a=b.length;--a>=0;){if(m){if(m.equals(b[a])){m=null;k=this.Triangulate.area(g)>0;e.push(k);h.push(j.divideScalar(g.length));g=[];j=new THREE.Vector2;continue}}else m=b[a];j.addSelf(b[a]);g.push(b[a])}a=b.length;for(g=0;--a>=0;)k=b[a],
j=h[g],k=k.clone().subSelf(j),l=this.bevelSize/k.length(),e[g]?l+=1:l=1-l,l=k.multiplyScalar(l).addSelf(j),f.unshift(l),m?m.equals(b[a])&&(m=null,g++):m=b[a];c.bevel=f;return c},b2p0:function(a,c){var b=1-a;return b*b*c},b2p1:function(a,c){return 2*(1-a)*a*c},b2p2:function(a,c){return a*a*c},b2:function(a,c,b,g){return this.b2p0(a,c)+this.b2p1(a,b)+this.b2p2(a,g)},b3p0:function(a,c){var b=1-a;return b*b*b*c},b3p1:function(a,c){var b=1-a;return 3*b*b*a*c},b3p2:function(a,c){return 3*(1-a)*a*a*c},b3p3:function(a,
c){return a*a*a*c},b3:function(a,c,b,g,f){return this.b3p0(a,c)+this.b3p1(a,b)+this.b3p2(a,g)+this.b3p3(a,f)},extractGlyphPoints:function(a,c,b,g,f){var h=[],e,j,k,l,m,n,o,p,w,t,v=c.glyphs[a]||c.glyphs[ctxt.options.fallbackCharacter];if(v){if(v.o){c=v._cachedOutline||(v._cachedOutline=v.o.split(" "));k=c.length;for(a=0;a<k;)switch(j=c[a++],j){case "m":j=c[a++]*b+g;l=c[a++]*b;h.push(new THREE.Vector2(j,l));f.moveTo(j,l);break;case "l":j=c[a++]*b+g;l=c[a++]*b;h.push(new THREE.Vector2(j,l));f.lineTo(j,
l);break;case "q":j=c[a++]*b+g;l=c[a++]*b;o=c[a++]*b+g;p=c[a++]*b;f.quadraticCurveTo(o,p,j,l);if(e=h[h.length-1]){m=e.x;n=e.y;e=1;for(divisions=this.divisions;e<=divisions;e++){var x=e/divisions,y=THREE.FontUtils.b2(x,m,o,j),x=THREE.FontUtils.b2(x,n,p,l);h.push(new THREE.Vector2(y,x))}}break;case "b":if(j=c[a++]*b+g,l=c[a++]*b,o=c[a++]*b+g,p=c[a++]*-b,w=c[a++]*b+g,t=c[a++]*-b,f.bezierCurveTo(j,l,o,p,w,t),e=h[h.length-1]){m=e.x;n=e.y;e=1;for(divisions=this.divisions;e<=divisions;e++)x=e/divisions,
y=THREE.FontUtils.b3(x,m,o,w,j),x=THREE.FontUtils.b3(x,n,p,t,l),h.push(new THREE.Vector2(y,x))}}}return{offset:v.ha*b,points:h,path:f}}}};
(function(a){var c=function(a){for(var c=a.length,f=0,h=c-1,e=0;e<c;h=e++)f+=a[h].x*a[e].y-a[e].x*a[h].y;return f*0.5};a.Triangulate=function(a,g){var f=a.length;if(f<3)return null;var h=[],e=[],j=[],k,l,m;if(c(a)>0)for(l=0;l<f;l++)e[l]=l;else for(l=0;l<f;l++)e[l]=f-1-l;var n=2*f;for(l=f-1;f>2;){if(n--<=0){console.log("Warning, unable to triangulate polygon!");if(g)return j;return h}k=l;f<=k&&(k=0);l=k+1;f<=l&&(l=0);m=l+1;f<=m&&(m=0);var o;a:{o=a;var p=k,w=l,t=m,v=f,x=e,y=void 0,u=void 0,z=void 0,
B=void 0,A=void 0,E=void 0,G=void 0,H=void 0,L=void 0,u=o[x[p]].x,z=o[x[p]].y,B=o[x[w]].x,A=o[x[w]].y,E=o[x[t]].x,G=o[x[t]].y;if(1.0E-10>(B-u)*(G-z)-(A-z)*(E-u))o=!1;else{for(y=0;y<v;y++)if(!(y==p||y==w||y==t)){var H=o[x[y]].x,L=o[x[y]].y,J=void 0,D=void 0,K=void 0,F=void 0,I=void 0,O=void 0,M=void 0,C=void 0,P=void 0,N=void 0,R=void 0,S=void 0,J=K=I=void 0,J=E-B,D=G-A,K=u-E,F=z-G,I=B-u,O=A-z,M=H-u,C=L-z,P=H-B,N=L-A,R=H-E,S=L-G,J=J*N-D*P,I=I*C-O*M,K=K*S-F*R;if(J>=0&&K>=0&&I>=0){o=!1;break a}}o=!0}}if(o){h.push([a[e[k]],
a[e[l]],a[e[m]]]);j.push([e[k],e[l],e[m]]);k=l;for(m=l+1;m<f;k++,m++)e[k]=e[m];f--;n=2*f}}if(g)return j;return h};a.Triangulate.area=c;return a})(THREE.FontUtils);window._typeface_js={faces:THREE.FontUtils.faces,loadFace:THREE.FontUtils.loadFace};
......
......@@ -44,7 +44,7 @@ THREE.Matrix4.makeInvert3x3=function(a){var b=a.m33,c=b.m,d=a.n33*a.n22-a.n32*a.
THREE.Matrix4.makeFrustum=function(a,b,c,d,e,g){var f;f=new THREE.Matrix4;f.n11=2*e/(b-a);f.n12=0;f.n13=(b+a)/(b-a);f.n14=0;f.n21=0;f.n22=2*e/(d-c);f.n23=(d+c)/(d-c);f.n24=0;f.n31=0;f.n32=0;f.n33=-(g+e)/(g-e);f.n34=-2*g*e/(g-e);f.n41=0;f.n42=0;f.n43=-1;f.n44=0;return f};THREE.Matrix4.makePerspective=function(a,b,c,d){var e,a=c*Math.tan(a*Math.PI/360);e=-a;return THREE.Matrix4.makeFrustum(e*b,a*b,e,a,c,d)};
THREE.Matrix4.makeOrtho=function(a,b,c,d,e,g){var f,h,k,l;f=new THREE.Matrix4;h=b-a;k=c-d;l=g-e;f.n11=2/h;f.n12=0;f.n13=0;f.n14=-((b+a)/h);f.n21=0;f.n22=2/k;f.n23=0;f.n24=-((c+d)/k);f.n31=0;f.n32=0;f.n33=-2/l;f.n34=-((g+e)/l);f.n41=0;f.n42=0;f.n43=0;f.n44=1;return f};THREE.Matrix4.__v1=new THREE.Vector3;THREE.Matrix4.__v2=new THREE.Vector3;THREE.Matrix4.__v3=new THREE.Vector3;
THREE.Object3D=function(){this.parent=void 0;this.children=[];this.up=new THREE.Vector3(0,1,0);this.position=new THREE.Vector3;this.rotation=new THREE.Vector3;this.eulerOrder="XYZ";this.scale=new THREE.Vector3(1,1,1);this.flipSided=this.doubleSided=this.dynamic=!1;this.renderDepth=null;this.rotationAutoUpdate=!0;this.matrix=new THREE.Matrix4;this.matrixWorld=new THREE.Matrix4;this.matrixRotationWorld=new THREE.Matrix4;this.matrixWorldNeedsUpdate=this.matrixAutoUpdate=!0;this.quaternion=new THREE.Quaternion;
this.useQuaternion=!1;this.boundRadius=0;this.boundRadiusScale=1;this.visible=!0;this._vector=new THREE.Vector3;this.name=""};
this.useQuaternion=!1;this.boundRadius=0;this.boundRadiusScale=1;this.visible=!0;this.receiveShadow=this.castShadow=!1;this._vector=new THREE.Vector3;this.name=""};
THREE.Object3D.prototype={translate:function(a,b){this.matrix.rotateAxis(b);this.position.addSelf(b.multiplyScalar(a))},translateX:function(a){this.translate(a,this._vector.set(1,0,0))},translateY:function(a){this.translate(a,this._vector.set(0,1,0))},translateZ:function(a){this.translate(a,this._vector.set(0,0,1))},lookAt:function(a){this.matrix.lookAt(a,this.position,this.up);this.rotationAutoUpdate&&this.rotation.setRotationFromMatrix(this.matrix)},addChild:function(a){if(this.children.indexOf(a)===
-1){a.parent!==void 0&&a.parent.removeChild(a);a.parent=this;this.children.push(a);for(var b=this;b.parent!==void 0;)b=b.parent;b!==void 0&&b instanceof THREE.Scene&&b.addChildRecurse(a)}},removeChild:function(a){var b=this.children.indexOf(a);if(b!==-1)a.parent=void 0,this.children.splice(b,1)},getChildByName:function(a,b){var c,d,e;c=0;for(d=this.children.length;c<d;c++){e=this.children[c];if(e.name===a)return e;if(b&&(e=e.getChildByName(a,b),e!==void 0))return e}},updateMatrix:function(){this.matrix.setPosition(this.position);
this.useQuaternion?this.matrix.setRotationFromQuaternion(this.quaternion):this.matrix.setRotationFromEuler(this.rotation,this.eulerOrder);if(this.scale.x!==1||this.scale.y!==1||this.scale.z!==1)this.matrix.scale(this.scale),this.boundRadiusScale=Math.max(this.scale.x,Math.max(this.scale.y,this.scale.z));this.matrixWorldNeedsUpdate=!0},update:function(a,b,c){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||b)a?this.matrixWorld.multiply(a,this.matrix):this.matrixWorld.copy(this.matrix),
......
因为 它太大了无法显示 source diff 。你可以改为 查看blob
......@@ -17,7 +17,7 @@ THREE.Object3D = function() {
this.scale = new THREE.Vector3( 1, 1, 1 );
this.dynamic = false; // when true it retains arrays so they can be updated with __dirty*
this.doubleSided = false;
this.flipSided = false;
......@@ -40,6 +40,9 @@ THREE.Object3D = function() {
this.visible = true;
this.castShadow = false;
this.receiveShadow = false;
this._vector = new THREE.Vector3();
this.name = "";
......
......@@ -678,7 +678,7 @@ THREE.FontUtils = {
}
//path.debug(document.getElementById("boo"));
console.log(path);
//console.log(path);
// get the width
......
......@@ -92,6 +92,39 @@ THREE.WebGLRenderer = function ( parameters ) {
this.autoClear = true;
this.sortObjects = true;
// shadow map
this.shadowMapBias = 0.0039;
this.shadowMapDarkness = 0.5;
this.shadowMapWidth = 512;
this.shadowMapHeight = 512;
this.shadowCameraNear = 1;
this.shadowCameraFar = 5000;
this.shadowCameraFov = 50;
this.shadowMap = null;
this.shadowMapEnabled = false;
var _cameraLight,
_shadowMatrix = new THREE.Matrix4();
var depthShader = THREE.ShaderLib[ "depthRGBA" ];
var depthUniforms = THREE.UniformsUtils.clone( depthShader.uniforms );
var _depthMaterial = new THREE.MeshShaderMaterial( { fragmentShader: depthShader.fragmentShader,
vertexShader: depthShader.vertexShader,
uniforms: depthUniforms } );
var _depthMaterialMorph = new THREE.MeshShaderMaterial( { fragmentShader: depthShader.fragmentShader,
vertexShader: depthShader.vertexShader,
uniforms: depthUniforms,
morphTargets: true
} );
_depthMaterial._shadowPass = true;
_depthMaterialMorph._shadowPass = true;
// Init GL
try {
......@@ -401,18 +434,19 @@ THREE.WebGLRenderer = function ( parameters ) {
this.setStencilShadowDarkness = function( value ) {
_stencilShadow.darkness = value;
};
this.getContext = function() {
return _gl;
}
};
function setupLights ( program, lights ) {
var l, ll, light, r = 0, g = 0, b = 0,
var l, ll, light, n,
r = 0, g = 0, b = 0,
color, position, intensity, distance,
zlights = _lights,
......@@ -449,25 +483,41 @@ THREE.WebGLRenderer = function ( parameters ) {
doffset = dlength * 3;
dcolors[ doffset ] = color.r * intensity;
dcolors[ doffset ] = color.r * intensity;
dcolors[ doffset + 1 ] = color.g * intensity;
dcolors[ doffset + 2 ] = color.b * intensity;
dpositions[ doffset ] = position.x;
dpositions[ doffset ] = position.x;
dpositions[ doffset + 1 ] = position.y;
dpositions[ doffset + 2 ] = position.z;
dlength += 1;
} else if ( light instanceof THREE.SpotLight ) { // hack, not a proper spotlight
doffset = dlength * 3;
dcolors[ doffset ] = color.r * intensity;
dcolors[ doffset + 1 ] = color.g * intensity;
dcolors[ doffset + 2 ] = color.b * intensity;
n = 1 / position.length();
dpositions[ doffset ] = position.x * n;
dpositions[ doffset + 1 ] = position.y * n;
dpositions[ doffset + 2 ] = position.z * n;
dlength += 1;
} else if( light instanceof THREE.PointLight ) {
poffset = plength * 3;
pcolors[ poffset ] = color.r * intensity;
pcolors[ poffset ] = color.r * intensity;
pcolors[ poffset + 1 ] = color.g * intensity;
pcolors[ poffset + 2 ] = color.b * intensity;
ppositions[ poffset ] = position.x;
ppositions[ poffset ] = position.x;
ppositions[ poffset + 1 ] = position.y;
ppositions[ poffset + 2 ] = position.z;
......@@ -923,6 +973,7 @@ THREE.WebGLRenderer = function ( parameters ) {
obj_skinVerticesB = geometry.skinVerticesB,
obj_skinIndices = geometry.skinIndices,
obj_skinWeights = geometry.skinWeights,
obj_edgeFaces = object instanceof THREE.ShadowVolume ? geometry.edgeFaces : undefined,
morphTargets = geometry.morphTargets;
......@@ -1944,6 +1995,7 @@ THREE.WebGLRenderer = function ( parameters ) {
_gl.bufferData( _gl.ARRAY_BUFFER, morphTargetsArrays[ vk ], hint );
}
}
if ( dirtyColors && offset_color > 0 ) {
......@@ -2511,6 +2563,20 @@ THREE.WebGLRenderer = function ( parameters ) {
};
function refreshUniformsShadow( uniforms, material ) {
if ( uniforms.shadowMatrix ) {
uniforms.shadowMatrix.value.copy( _shadowMatrix );
uniforms.shadowMap.texture = _this.shadowMap;
uniforms.shadowDarkness.value = _this.shadowMapDarkness;
uniforms.shadowBias.value = _this.shadowMapBias;
}
};
this.initMaterial = function ( material, lights, fog, object ) {
var u, a, identifiers, i, parameters, maxLightCount, maxBones, shaderID;
......@@ -2563,6 +2629,7 @@ THREE.WebGLRenderer = function ( parameters ) {
maxBones = allocateBones( object );
parameters = {
map: !!material.map, envMap: !!material.envMap, lightMap: !!material.lightMap,
vertexColors: material.vertexColors,
fog: fog, sizeAttenuation: material.sizeAttenuation,
......@@ -2570,7 +2637,9 @@ THREE.WebGLRenderer = function ( parameters ) {
morphTargets: material.morphTargets,
maxMorphTargets: this.maxMorphTargets,
maxDirLights: maxLightCount.directional, maxPointLights: maxLightCount.point,
maxBones: maxBones
maxBones: maxBones,
shadowMapEnabled: this.shadowMapEnabled && object.receiveShadow
};
material.program = buildProgram( shaderID, material.fragmentShader, material.vertexShader, material.uniforms, material.attributes, parameters );
......@@ -2607,7 +2676,6 @@ THREE.WebGLRenderer = function ( parameters ) {
material.numSupportedMorphTargets = 0;
if ( attributes.morphTarget0 >= 0 ) {
_gl.enableVertexAttribArray( attributes.morphTarget0 );
......@@ -2664,14 +2732,6 @@ THREE.WebGLRenderer = function ( parameters ) {
}
object.__webglMorphTargetInfluences = new Float32Array( this.maxMorphTargets );
for ( var i = 0, il = this.maxMorphTargets; i < il; i ++ ) {
object.__webglMorphTargetInfluences[ i ] = 0;
}
}
};
......@@ -2684,6 +2744,22 @@ THREE.WebGLRenderer = function ( parameters ) {
}
if ( material.morphTargets ) {
if ( ! object.__webglMorphTargetInfluences ) {
object.__webglMorphTargetInfluences = new Float32Array( _this.maxMorphTargets );
for ( var i = 0, il = this.maxMorphTargets; i < il; i ++ ) {
object.__webglMorphTargetInfluences[ i ] = 0;
}
}
}
var program = material.program,
p_uniforms = program.uniforms,
m_uniforms = material.uniforms;
......@@ -2752,6 +2828,13 @@ THREE.WebGLRenderer = function ( parameters ) {
} else if ( material instanceof THREE.MeshNormalMaterial ) {
m_uniforms.opacity.value = material.opacity;
}
if ( object.receiveShadow && ! material._shadowPass ) {
refreshUniformsShadow( m_uniforms, material );
}
// load common uniforms
......@@ -2776,7 +2859,8 @@ THREE.WebGLRenderer = function ( parameters ) {
if ( material instanceof THREE.MeshShaderMaterial ||
material.envMap ||
material.skinning ) {
material.skinning ||
object.receiveShadow ) {
if ( p_uniforms.objectMatrix !== null ) {
......@@ -3098,6 +3182,7 @@ THREE.WebGLRenderer = function ( parameters ) {
candidateInfluence = influences[ candidate ];
}
}
_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglMorphTargetsBuffers[ candidate ] );
......@@ -3108,7 +3193,9 @@ THREE.WebGLRenderer = function ( parameters ) {
used[ candidate ] = 1;
candidateInfluence = -1;
m ++;
}
}
// load updated influences uniform
......@@ -3384,6 +3471,166 @@ THREE.WebGLRenderer = function ( parameters ) {
};
function renderShadowMap( scene, camera ) {
var i, il, light,
oil,
material,
o, ol, webglObject, object,
lights = scene.lights,
fog = null;
if ( ! _cameraLight ) {
_cameraLight = new THREE.Camera( _this.shadowCameraFov, camera.aspect, _this.shadowCameraNear, _this.shadowCameraFar );
}
if ( ! _this.shadowMap ) {
var pars = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBAFormat };
//var pars = { minFilter: THREE.NearestFilter, magFilter: THREE.NearestFilter, format: THREE.RGBAFormat };
_this.shadowMap = new THREE.WebGLRenderTarget( _this.shadowMapWidth, _this.shadowMapHeight, pars );
}
for ( i = 0, il = lights.length; i < il; i ++ ) {
light = lights[ i ];
if ( light instanceof THREE.SpotLight && light.castShadow ) {
_cameraLight.position.copy( light.position );
_cameraLight.target.position.copy( light.target.position );
_cameraLight.update( undefined, true );
scene.update( undefined, false, _cameraLight );
// compute shadow matrix
_shadowMatrix.set( 0.5, 0.0, 0.0, 0.5,
0.0, 0.5, 0.0, 0.5,
0.0, 0.0, 0.5, 0.5,
0.0, 0.0, 0.0, 1.0 );
_shadowMatrix.multiplySelf( _cameraLight.projectionMatrix );
_shadowMatrix.multiplySelf( _cameraLight.matrixWorldInverse );
// render shadow map
_cameraLight.matrixWorldInverse.flattenToArray( _viewMatrixArray );
_cameraLight.projectionMatrix.flattenToArray( _projectionMatrixArray );
_projScreenMatrix.multiply( _cameraLight.projectionMatrix, _cameraLight.matrixWorldInverse );
computeFrustum( _projScreenMatrix );
_this.initWebGLObjects( scene );
setRenderTarget( _this.shadowMap );
// using arbitrary clear color in depth pass
// creates variance in shadows
_gl.clearColor( 1, 1, 1, 1 );
//_gl.clearColor( 0, 0, 0, 1 );
_this.clear();
_gl.clearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );
// set matrices & frustum culling
ol = scene.__webglObjects.length;
oil = scene.__webglObjectsImmediate.length;
for ( o = 0; o < ol; o ++ ) {
webglObject = scene.__webglObjects[ o ];
object = webglObject.object;
if ( object.visible && object.castShadow ) {
if ( ! ( object instanceof THREE.Mesh ) || isInFrustum( object ) ) {
object.matrixWorld.flattenToArray( object._objectMatrixArray );
setupMatrices( object, _cameraLight, false );
webglObject.render = true;
} else {
webglObject.render = false;
}
} else {
webglObject.render = false;
}
}
setDepthTest( true );
setBlending( THREE.NormalBlending ); // maybe blending should be just disabled?
//_gl.cullFace( _gl.FRONT );
for ( o = 0; o < ol; o ++ ) {
webglObject = scene.__webglObjects[ o ];
if ( webglObject.render ) {
object = webglObject.object;
buffer = webglObject.buffer;
setObjectFaces( object );
material = object.geometry.morphTargets.length ? _depthMaterialMorph : _depthMaterial;
renderBuffer( _cameraLight, lights, fog, material, buffer, object );
}
}
for ( o = 0; o < oil; o++ ) {
webglObject = scene.__webglObjectsImmediate[ o ];
object = webglObject.object;
if ( object.visible && object.castShadow ) {
if( object.matrixAutoUpdate ) {
object.matrixWorld.flattenToArray( object._objectMatrixArray );
}
setupMatrices( object, _cameraLight, false );
setObjectFaces( object );
program = setProgram( _cameraLight, lights, fog, _depthMaterial, object );
object.render( function( object ) { renderBufferImmediate( object, program, _depthMaterial.shading ); } );
}
}
//_gl.cullFace( _gl.BACK );
}
}
};
this.render = function( scene, camera, renderTarget, forceClear ) {
var i, program, opaque, transparent, material,
......@@ -3391,6 +3638,8 @@ THREE.WebGLRenderer = function ( parameters ) {
lights = scene.lights,
fog = scene.fog;
if ( this.shadowMapEnabled ) renderShadowMap( scene, camera );
_this.data.vertices = 0;
_this.data.faces = 0;
_this.data.drawCalls = 0;
......@@ -3430,7 +3679,7 @@ THREE.WebGLRenderer = function ( parameters ) {
object.matrixWorld.flattenToArray( object._objectMatrixArray );
setupMatrices( object, camera );
setupMatrices( object, camera, true );
unrollBufferMaterials( webglObject );
......@@ -3488,7 +3737,7 @@ THREE.WebGLRenderer = function ( parameters ) {
}
setupMatrices( object, camera );
setupMatrices( object, camera, true );
unrollImmediateBufferMaterials( webglObject );
......@@ -4183,10 +4432,15 @@ THREE.WebGLRenderer = function ( parameters ) {
};
function setupMatrices( object, camera ) {
function setupMatrices( object, camera, computeNormalMatrix ) {
object._modelViewMatrix.multiplyToArray( camera.matrixWorldInverse, object.matrixWorld, object._modelViewMatrixArray );
THREE.Matrix4.makeInvert3x3( object._modelViewMatrix ).transposeIntoArray( object._normalMatrixArray );
if ( computeNormalMatrix ) {
THREE.Matrix4.makeInvert3x3( object._modelViewMatrix ).transposeIntoArray( object._normalMatrixArray );
}
};
......@@ -4795,6 +5049,7 @@ THREE.WebGLRenderer = function ( parameters ) {
parameters.vertexColors ? "#define USE_COLOR" : "",
parameters.skinning ? "#define USE_SKINNING" : "",
parameters.morphTargets ? "#define USE_MORPHTARGETS" : "",
parameters.shadowMapEnabled ? "#define USE_SHADOWMAP" : "",
parameters.sizeAttenuation ? "#define USE_SIZEATTENUATION" : "",
......@@ -4860,6 +5115,7 @@ THREE.WebGLRenderer = function ( parameters ) {
parameters.envMap ? "#define USE_ENVMAP" : "",
parameters.lightMap ? "#define USE_LIGHTMAP" : "",
parameters.vertexColors ? "#define USE_COLOR" : "",
parameters.shadowMapEnabled ? "#define USE_SHADOWMAP" : "",
"uniform mat4 viewMatrix;",
"uniform vec3 cameraPosition;",
......@@ -4953,10 +5209,10 @@ THREE.WebGLRenderer = function ( parameters ) {
for( u in uniforms ) {
location = program.uniforms[u];
location = program.uniforms[ u ];
if ( !location ) continue;
uniform = uniforms[u];
uniform = uniforms[ u ];
type = uniform.type;
value = uniform.value;
......@@ -5608,6 +5864,7 @@ THREE.WebGLRenderer = function ( parameters ) {
light = lights[ l ];
if ( light instanceof THREE.SpotLight ) dirLights++; // hack, not a proper spotlight
if ( light instanceof THREE.DirectionalLight ) dirLights++;
if ( light instanceof THREE.PointLight ) pointLights++;
......
......@@ -6,7 +6,6 @@
THREE.ShaderChunk = {
// FOG
fog_pars_fragment: [
......@@ -16,10 +15,14 @@ THREE.ShaderChunk = {
"uniform vec3 fogColor;",
"#ifdef FOG_EXP2",
"uniform float fogDensity;",
"#else",
"uniform float fogNear;",
"uniform float fogFar;",
"#endif",
"#endif"
......@@ -33,11 +36,15 @@ THREE.ShaderChunk = {
"float depth = gl_FragCoord.z / gl_FragCoord.w;",
"#ifdef FOG_EXP2",
"const float LOG2 = 1.442695;",
"float fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );",
"fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );",
"#else",
"float fogFactor = smoothstep( fogNear, fogFar, depth );",
"#endif",
"gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );",
......@@ -53,6 +60,7 @@ THREE.ShaderChunk = {
"#ifdef USE_ENVMAP",
"varying vec3 vReflect;",
"uniform float reflectivity;",
"uniform samplerCube envMap;",
"uniform int combine;",
......@@ -69,7 +77,6 @@ THREE.ShaderChunk = {
"if ( combine == 1 ) {",
//"gl_FragColor = mix( gl_FragColor, cubeColor, reflectivity );",
"gl_FragColor = vec4( mix( gl_FragColor.xyz, cubeColor.xyz, reflectivity ), opacity );",
"} else {",
......@@ -87,6 +94,7 @@ THREE.ShaderChunk = {
"#ifdef USE_ENVMAP",
"varying vec3 vReflect;",
"uniform float refractionRatio;",
"uniform bool useRefract;",
......@@ -244,7 +252,9 @@ THREE.ShaderChunk = {
"uniform float pointLightDistance[ MAX_POINT_LIGHTS ];",
"#ifdef PHONG",
"varying vec4 vPointLight[ MAX_POINT_LIGHTS ];",
"#endif",
"#endif"
......@@ -384,11 +394,15 @@ THREE.ShaderChunk = {
"vec4 totalLight = vec4( ambient, opacity );",
"#if MAX_DIR_LIGHTS > 0",
"totalLight += dirDiffuse + dirSpecular;",
"#endif",
"#if MAX_POINT_LIGHTS > 0",
"totalLight += pointDiffuse + pointSpecular;",
"#endif",
"gl_FragColor = gl_FragColor * totalLight;"
......@@ -439,7 +453,7 @@ THREE.ShaderChunk = {
].join("\n"),
// skinning
// SKINNING
skinning_pars_vertex: [
......@@ -467,7 +481,7 @@ THREE.ShaderChunk = {
].join("\n"),
// morphing
// MORPHING
morphtarget_pars_vertex: [
......@@ -510,7 +524,78 @@ THREE.ShaderChunk = {
"#endif",
"#endif"
].join("\n")
].join("\n"),
// SHADOW MAP
// based on SpiderGL shadow map and Fabien Sanglard's GLSL shadow mapping examples
// http://spidergl.org/example.php?id=6
// http://fabiensanglard.net/shadowmapping
shadowmap_pars_fragment: [
"#ifdef USE_SHADOWMAP",
"uniform sampler2D shadowMap;",
"uniform float shadowDarkness;",
"uniform float shadowBias;",
"varying vec4 vShadowCoord;",
"float unpackDepth( const in vec4 rgba_depth ) {",
"const vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );",
"float depth = dot( rgba_depth, bit_shift );",
"return depth;",
"}",
"#endif"
].join("\n"),
shadowmap_fragment: [
"#ifdef USE_SHADOWMAP",
"vec3 shadowCoord = vShadowCoord.xyz / vShadowCoord.w;",
"vec4 rgbaDepth = texture2D( shadowMap, shadowCoord.xy );",
"float fDepth = unpackDepth( rgbaDepth );",
"if ( fDepth < ( shadowCoord.z + shadowBias ) && ( shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0 ) )",
"gl_FragColor = gl_FragColor * vec4( vec3( shadowDarkness ), 1.0 );",
// uncomment to see light frustum boundaries
//"if ( !( shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0 ) )",
// "gl_FragColor = gl_FragColor * vec4( 1.0, 0.0, 0.0, 1.0 );",
"#endif"
].join("\n"),
shadowmap_pars_vertex: [
"#ifdef USE_SHADOWMAP",
"varying vec4 vShadowCoord;",
"uniform mat4 shadowMatrix;",
"#endif"
].join("\n"),
shadowmap_vertex: [
"#ifdef USE_SHADOWMAP",
"vShadowCoord = shadowMatrix * objectMatrix * vec4( position, 1.0 );",
"#endif"
].join("\n"),
};
......@@ -633,6 +718,16 @@ THREE.UniformsLib = {
"fogFar" : { type: "f", value: 2000 },
"fogColor" : { type: "c", value: new THREE.Color( 0xffffff ) }
},
shadowmap: {
"shadowMap": { type: "t", value: 3, texture: null },
"shadowMatrix" : { type: "m4", value: new THREE.Matrix4() },
"shadowBias" : { type: "f", value: 0.0039 },
"shadowDarkness": { type: "f", value: 0.2 }
}
};
......@@ -1030,7 +1125,8 @@ THREE.ShaderLib = {
uniforms: THREE.UniformsUtils.merge( [
THREE.UniformsLib[ "common" ],
THREE.UniformsLib[ "fog" ]
THREE.UniformsLib[ "fog" ],
THREE.UniformsLib[ "shadowmap" ]
] ),
......@@ -1044,6 +1140,7 @@ THREE.ShaderLib = {
THREE.ShaderChunk[ "lightmap_pars_fragment" ],
THREE.ShaderChunk[ "envmap_pars_fragment" ],
THREE.ShaderChunk[ "fog_pars_fragment" ],
THREE.ShaderChunk[ "shadowmap_pars_fragment" ],
"void main() {",
......@@ -1053,6 +1150,7 @@ THREE.ShaderLib = {
THREE.ShaderChunk[ "lightmap_fragment" ],
THREE.ShaderChunk[ "color_fragment" ],
THREE.ShaderChunk[ "envmap_fragment" ],
THREE.ShaderChunk[ "shadowmap_fragment" ],
THREE.ShaderChunk[ "fog_fragment" ],
"}"
......@@ -1067,6 +1165,7 @@ THREE.ShaderLib = {
THREE.ShaderChunk[ "color_pars_vertex" ],
THREE.ShaderChunk[ "skinning_pars_vertex" ],
THREE.ShaderChunk[ "morphtarget_pars_vertex" ],
THREE.ShaderChunk[ "shadowmap_pars_vertex" ],
"void main() {",
......@@ -1079,6 +1178,7 @@ THREE.ShaderLib = {
THREE.ShaderChunk[ "skinning_vertex" ],
THREE.ShaderChunk[ "morphtarget_vertex" ],
THREE.ShaderChunk[ "default_vertex" ],
THREE.ShaderChunk[ "shadowmap_vertex" ],
"}"
......@@ -1092,7 +1192,8 @@ THREE.ShaderLib = {
THREE.UniformsLib[ "common" ],
THREE.UniformsLib[ "fog" ],
THREE.UniformsLib[ "lights" ]
THREE.UniformsLib[ "lights" ],
THREE.UniformsLib[ "shadowmap" ]
] ),
......@@ -1108,6 +1209,7 @@ THREE.ShaderLib = {
THREE.ShaderChunk[ "lightmap_pars_fragment" ],
THREE.ShaderChunk[ "envmap_pars_fragment" ],
THREE.ShaderChunk[ "fog_pars_fragment" ],
THREE.ShaderChunk[ "shadowmap_pars_fragment" ],
"void main() {",
......@@ -1118,6 +1220,7 @@ THREE.ShaderLib = {
THREE.ShaderChunk[ "lightmap_fragment" ],
THREE.ShaderChunk[ "color_fragment" ],
THREE.ShaderChunk[ "envmap_fragment" ],
THREE.ShaderChunk[ "shadowmap_fragment" ],
THREE.ShaderChunk[ "fog_fragment" ],
"}"
......@@ -1135,6 +1238,7 @@ THREE.ShaderLib = {
THREE.ShaderChunk[ "color_pars_vertex" ],
THREE.ShaderChunk[ "skinning_pars_vertex" ],
THREE.ShaderChunk[ "morphtarget_pars_vertex" ],
THREE.ShaderChunk[ "shadowmap_pars_vertex" ],
"void main() {",
......@@ -1151,6 +1255,8 @@ THREE.ShaderLib = {
THREE.ShaderChunk[ "skinning_vertex" ],
THREE.ShaderChunk[ "morphtarget_vertex" ],
THREE.ShaderChunk[ "default_vertex" ],
THREE.ShaderChunk[ "shadowmap_vertex" ],
"}"
......@@ -1165,6 +1271,7 @@ THREE.ShaderLib = {
THREE.UniformsLib[ "common" ],
THREE.UniformsLib[ "fog" ],
THREE.UniformsLib[ "lights" ],
THREE.UniformsLib[ "shadowmap" ],
{
"ambient" : { type: "c", value: new THREE.Color( 0x050505 ) },
......@@ -1191,6 +1298,7 @@ THREE.ShaderLib = {
THREE.ShaderChunk[ "envmap_pars_fragment" ],
THREE.ShaderChunk[ "fog_pars_fragment" ],
THREE.ShaderChunk[ "lights_pars_fragment" ],
THREE.ShaderChunk[ "shadowmap_pars_fragment" ],
"void main() {",
......@@ -1201,6 +1309,7 @@ THREE.ShaderLib = {
THREE.ShaderChunk[ "lightmap_fragment" ],
THREE.ShaderChunk[ "color_fragment" ],
THREE.ShaderChunk[ "envmap_fragment" ],
THREE.ShaderChunk[ "shadowmap_fragment" ],
THREE.ShaderChunk[ "fog_fragment" ],
"}"
......@@ -1222,6 +1331,7 @@ THREE.ShaderLib = {
THREE.ShaderChunk[ "color_pars_vertex" ],
THREE.ShaderChunk[ "skinning_pars_vertex" ],
THREE.ShaderChunk[ "morphtarget_pars_vertex" ],
THREE.ShaderChunk[ "shadowmap_pars_vertex" ],
"void main() {",
......@@ -1245,6 +1355,7 @@ THREE.ShaderLib = {
THREE.ShaderChunk[ "skinning_vertex" ],
THREE.ShaderChunk[ "morphtarget_vertex" ],
THREE.ShaderChunk[ "default_vertex" ],
THREE.ShaderChunk[ "shadowmap_vertex" ],
"}"
......@@ -1302,6 +1413,60 @@ THREE.ShaderLib = {
].join("\n")
},
// Depth encoding into RGBA texture
// based on SpiderGL shadow map example
// http://spidergl.org/example.php?id=6
// originally from
// http://www.gamedev.net/topic/442138-packing-a-float-into-a-a8r8g8b8-texture-shader/page__whichpage__1%25EF%25BF%25BD
// see also here:
// http://aras-p.info/blog/2009/07/30/encoding-floats-to-rgba-the-final/
'depthRGBA': {
uniforms: {},
fragmentShader: [
"vec4 pack_depth( const in float depth ) {",
"const vec4 bit_shift = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );",
"const vec4 bit_mask = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );",
"vec4 res = fract( depth * bit_shift );",
"res -= res.xxyz * bit_mask;",
"return res;",
"}",
"void main() {",
"gl_FragData[ 0 ] = pack_depth( gl_FragCoord.z );",
//"gl_FragData[ 0 ] = pack_depth( gl_FragCoord.z / gl_FragCoord.w );",
//"float z = ( ( gl_FragCoord.z / gl_FragCoord.w ) - 3.0 ) / ( 4000.0 - 3.0 );",
//"gl_FragData[ 0 ] = pack_depth( z );",
//"gl_FragData[ 0 ] = vec4( z, z, z, 1.0 );",
"}"
].join("\n"),
vertexShader: [
THREE.ShaderChunk[ "morphtarget_pars_vertex" ],
"void main() {",
"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );",
THREE.ShaderChunk[ "morphtarget_vertex" ],
THREE.ShaderChunk[ "default_vertex" ],
"}"
].join("\n")
}
};
......@@ -35,6 +35,7 @@ COMMON_FILES = [
'lights/AmbientLight.js',
'lights/DirectionalLight.js',
'lights/PointLight.js',
'lights/SpotLight.js',
'lights/LensFlare.js',
'materials/Material.js',
'materials/Mappings.js',
......@@ -263,6 +264,7 @@ WEBGL_FILES = [
'lights/AmbientLight.js',
'lights/DirectionalLight.js',
'lights/PointLight.js',
'lights/SpotLight.js',
'lights/LensFlare.js',
'materials/Material.js',
'materials/Mappings.js',
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册