Spaces:
Running
Running
/** | |
* @author erichlof / http://github.com/erichlof | |
* | |
* A shadow Mesh that follows a shadow-casting Mesh in the scene, but is confined to a single plane. | |
*/ | |
THREE.ShadowMesh = function ( mesh ) { | |
var shadowMaterial = new THREE.MeshBasicMaterial( { | |
color: 0x000000, | |
transparent: true, | |
opacity: 0.6, | |
depthWrite: false | |
} ); | |
THREE.Mesh.call( this, mesh.geometry, shadowMaterial ); | |
this.meshMatrix = mesh.matrixWorld; | |
this.frustumCulled = false; | |
this.matrixAutoUpdate = false; | |
}; | |
THREE.ShadowMesh.prototype = Object.create( THREE.Mesh.prototype ); | |
THREE.ShadowMesh.prototype.constructor = THREE.ShadowMesh; | |
THREE.ShadowMesh.prototype.update = function () { | |
var shadowMatrix = new THREE.Matrix4(); | |
return function ( plane, lightPosition4D ) { | |
// based on https://www.opengl.org/archives/resources/features/StencilTalk/tsld021.htm | |
var dot = plane.normal.x * lightPosition4D.x + | |
plane.normal.y * lightPosition4D.y + | |
plane.normal.z * lightPosition4D.z + | |
- plane.constant * lightPosition4D.w; | |
var sme = shadowMatrix.elements; | |
sme[ 0 ] = dot - lightPosition4D.x * plane.normal.x; | |
sme[ 4 ] = - lightPosition4D.x * plane.normal.y; | |
sme[ 8 ] = - lightPosition4D.x * plane.normal.z; | |
sme[ 12 ] = - lightPosition4D.x * - plane.constant; | |
sme[ 1 ] = - lightPosition4D.y * plane.normal.x; | |
sme[ 5 ] = dot - lightPosition4D.y * plane.normal.y; | |
sme[ 9 ] = - lightPosition4D.y * plane.normal.z; | |
sme[ 13 ] = - lightPosition4D.y * - plane.constant; | |
sme[ 2 ] = - lightPosition4D.z * plane.normal.x; | |
sme[ 6 ] = - lightPosition4D.z * plane.normal.y; | |
sme[ 10 ] = dot - lightPosition4D.z * plane.normal.z; | |
sme[ 14 ] = - lightPosition4D.z * - plane.constant; | |
sme[ 3 ] = - lightPosition4D.w * plane.normal.x; | |
sme[ 7 ] = - lightPosition4D.w * plane.normal.y; | |
sme[ 11 ] = - lightPosition4D.w * plane.normal.z; | |
sme[ 15 ] = dot - lightPosition4D.w * - plane.constant; | |
this.matrix.multiplyMatrices( shadowMatrix, this.meshMatrix ); | |
}; | |
}(); | |