DepthPassPlugin.js 5.5 KB
Newer Older
A
alteredq 已提交
1 2 3 4
/**
 * @author alteredq / http://alteredqualia.com/
 */

M
Mr.doob 已提交
5
THREE.DepthPassPlugin = function () {
A
alteredq 已提交
6 7 8 9 10 11

	this.enabled = false;
	this.renderTarget = null;

	var _gl,
	_renderer,
12
	_lights, _webglObjects, _webglObjectsImmediate,
13
	_depthMaterial, _depthMaterialMorph, _depthMaterialSkin, _depthMaterialMorphSkin,
A
alteredq 已提交
14 15

	_frustum = new THREE.Frustum(),
O
OpenShift guest 已提交
16 17
	_projScreenMatrix = new THREE.Matrix4(),
	_renderList = [];
A
alteredq 已提交
18

19
	this.init = function ( renderer, lights, webglObjects, webglObjectsImmediate ) {
A
alteredq 已提交
20 21 22

		_gl = renderer.context;
		_renderer = renderer;
M
Mr.doob 已提交
23
		_lights = lights;
A
alteredq 已提交
24

25 26 27
		_webglObjects = webglObjects;
		_webglObjectsImmediate = webglObjectsImmediate;

A
alteredq 已提交
28 29 30
		var depthShader = THREE.ShaderLib[ "depthRGBA" ];
		var depthUniforms = THREE.UniformsUtils.clone( depthShader.uniforms );

M
Mr.doob 已提交
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
		_depthMaterial = new THREE.ShaderMaterial( {
			fragmentShader: depthShader.fragmentShader,
			vertexShader: depthShader.vertexShader,
			uniforms: depthUniforms
		} );
		
		_depthMaterialMorph = new THREE.ShaderMaterial( {
			fragmentShader: depthShader.fragmentShader,
			vertexShader: depthShader.vertexShader,
			uniforms: depthUniforms,
			morphTargets: true
		} );
		
		_depthMaterialSkin = new THREE.ShaderMaterial( {
			fragmentShader: depthShader.fragmentShader,
			vertexShader: depthShader.vertexShader,
			uniforms: depthUniforms,
			skinning: true
		} );
		
		_depthMaterialMorphSkin = new THREE.ShaderMaterial( {
			fragmentShader: depthShader.fragmentShader,
			vertexShader: depthShader.vertexShader,
			uniforms: depthUniforms,
			morphTargets: true,
			skinning: true
		} );
A
alteredq 已提交
58 59 60

		_depthMaterial._shadowPass = true;
		_depthMaterialMorph._shadowPass = true;
61 62
		_depthMaterialSkin._shadowPass = true;
		_depthMaterialMorphSkin._shadowPass = true;
A
alteredq 已提交
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90

	};

	this.render = function ( scene, camera ) {

		if ( ! this.enabled ) return;

		this.update( scene, camera );

	};

	this.update = function ( scene, camera ) {

		var i, il, j, jl, n,

		program, buffer, material,
		webglObject, object, light,
		renderList,

		fog = null;

		// set GL state for depth map

		_gl.clearColor( 1, 1, 1, 1 );
		_gl.disable( _gl.BLEND );

		_renderer.setDepthTest( true );

A
alteredq 已提交
91
		// update scene
A
alteredq 已提交
92

93
		if ( scene.autoUpdate === true ) scene.updateMatrixWorld();
A
alteredq 已提交
94

A
alteredq 已提交
95
		// update camera matrices and frustum
A
alteredq 已提交
96

A
alteredq 已提交
97 98
		camera.matrixWorldInverse.getInverse( camera.matrixWorld );

99
		_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
A
alteredq 已提交
100 101
		_frustum.setFromMatrix( _projScreenMatrix );

A
alteredq 已提交
102 103
		// render depth map

A
alteredq 已提交
104 105 106
		_renderer.setRenderTarget( this.renderTarget );
		_renderer.clear();

A
alteredq 已提交
107
		// set object matrices & frustum culling
O
OpenShift guest 已提交
108 109
		
		_renderList.length = 0;
G
gero3 已提交
110
		projectObject(scene, scene, camera);
A
alteredq 已提交
111 112 113

		// render regular objects

114 115
		var objectMaterial, useMorphing, useSkinning;

116
		for ( j = 0, jl = _renderList.length; j < jl; j ++ ) {
A
alteredq 已提交
117

O
OpenShift guest 已提交
118
			webglObject = _renderList[ j ];
A
alteredq 已提交
119

O
OpenShift guest 已提交
120 121
			object = webglObject.object;
			buffer = webglObject.buffer;
122

O
OpenShift guest 已提交
123
			// todo: create proper depth material for particles
124

O
OpenShift guest 已提交
125
			if ( object instanceof THREE.PointCloud && ! object.customDepthMaterial ) continue;
126

O
OpenShift guest 已提交
127
			objectMaterial = getObjectMaterial( object );
128

O
OpenShift guest 已提交
129
			if ( objectMaterial ) _renderer.setMaterialFaces( object.material );
A
alteredq 已提交
130

O
OpenShift guest 已提交
131 132
			useMorphing = object.geometry.morphTargets !== undefined && object.geometry.morphTargets.length > 0 && objectMaterial.morphTargets;
			useSkinning = object instanceof THREE.SkinnedMesh && objectMaterial.skinning;
A
alteredq 已提交
133

O
OpenShift guest 已提交
134
			if ( object.customDepthMaterial ) {
A
alteredq 已提交
135

O
OpenShift guest 已提交
136
				material = object.customDepthMaterial;
137

O
OpenShift guest 已提交
138
			} else if ( useSkinning ) {
139

O
OpenShift guest 已提交
140
				material = useMorphing ? _depthMaterialMorphSkin : _depthMaterialSkin;
A
alteredq 已提交
141

O
OpenShift guest 已提交
142
			} else if ( useMorphing ) {
A
alteredq 已提交
143

O
OpenShift guest 已提交
144
				material = _depthMaterialMorph;
A
alteredq 已提交
145

O
OpenShift guest 已提交
146
			} else {
A
alteredq 已提交
147

O
OpenShift guest 已提交
148
				material = _depthMaterial;
A
alteredq 已提交
149

O
OpenShift guest 已提交
150
			}
A
alteredq 已提交
151

O
OpenShift guest 已提交
152
			if ( buffer instanceof THREE.BufferGeometry ) {
A
alteredq 已提交
153

M
Mr.doob 已提交
154
				_renderer.renderBufferDirect( camera, _lights, fog, material, buffer, object );
A
alteredq 已提交
155

O
OpenShift guest 已提交
156
			} else {
A
alteredq 已提交
157

M
Mr.doob 已提交
158
				_renderer.renderBuffer( camera, _lights, fog, material, buffer, object );
A
alteredq 已提交
159 160 161

			}

O
OpenShift guest 已提交
162

A
alteredq 已提交
163 164 165 166
		}

		// set matrices and render immediate objects

167
		for ( j = 0, jl = _webglObjectsImmediate.length; j < jl; j ++ ) {
A
alteredq 已提交
168

169
			webglObject = _webglObjectsImmediate[ j ];
A
alteredq 已提交
170 171
			object = webglObject.object;

172
			if ( object.visible ) {
A
alteredq 已提交
173

174
				object._modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );
A
alteredq 已提交
175

M
Mr.doob 已提交
176
				_renderer.renderImmediateObject( camera, _lights, fog, _depthMaterial, object );
A
alteredq 已提交
177 178 179 180 181 182 183 184 185 186 187 188 189 190

			}

		}

		// restore GL state

		var clearColor = _renderer.getClearColor(),
		clearAlpha = _renderer.getClearAlpha();

		_gl.clearColor( clearColor.r, clearColor.g, clearColor.b, clearAlpha );
		_gl.enable( _gl.BLEND );

	};
O
OpenShift guest 已提交
191
	
G
gero3 已提交
192
	function projectObject(scene, object,camera) {
O
OpenShift guest 已提交
193 194 195
		
		if ( object.visible ) {
	
196
			var webglObjects = _webglObjects[object.id];
O
OpenShift guest 已提交
197 198 199 200
	
			if (webglObjects && (object.frustumCulled === false || _frustum.intersectsObject( object ) === true) ) {
		
		
G
gero3 已提交
201
				for (var i = 0, l = webglObjects.length; i < l; i ++) {
O
OpenShift guest 已提交
202 203 204 205 206 207 208 209 210
			
					var webglObject = webglObjects[i];
					
					object._modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );
					_renderList.push(webglObject);
					
				}
			}
	
G
gero3 已提交
211
			for (var i = 0, l = object.children.length; i < l; i ++) {
O
OpenShift guest 已提交
212 213 214 215 216 217
				
				projectObject(scene, object.children[i], camera);
			}
		
		}
	}
A
alteredq 已提交
218

219 220 221 222 223
	// For the moment just ignore objects that have multiple materials with different animation methods
	// Only the first material will be taken into account for deciding which depth material to use

	function getObjectMaterial( object ) {

224 225 226
		return object.material instanceof THREE.MeshFaceMaterial
			? object.material.materials[ 0 ]
			: object.material;
227 228

	};
229

A
alteredq 已提交
230 231
};