source: other-projects/playing-in-the-street/summer-2013/trunk/Playing-in-the-Street-WPF/Content/Web/mrdoob-three.js-4862f5f/src/extras/renderers/plugins/DepthPassPlugin.js@ 28897

Last change on this file since 28897 was 28897, checked in by davidb, 10 years ago

GUI front-end to server base plus web page content

File size: 5.1 KB
Line 
1/**
2 * @author alteredq / http://alteredqualia.com/
3 */
4
5THREE.DepthPassPlugin = function () {
6
7 this.enabled = false;
8 this.renderTarget = null;
9
10 var _gl,
11 _renderer,
12 _depthMaterial, _depthMaterialMorph, _depthMaterialSkin, _depthMaterialMorphSkin,
13
14 _frustum = new THREE.Frustum(),
15 _projScreenMatrix = new THREE.Matrix4();
16
17 this.init = function ( renderer ) {
18
19 _gl = renderer.context;
20 _renderer = renderer;
21
22 var depthShader = THREE.ShaderLib[ "depthRGBA" ];
23 var depthUniforms = THREE.UniformsUtils.clone( depthShader.uniforms );
24
25 _depthMaterial = new THREE.ShaderMaterial( { fragmentShader: depthShader.fragmentShader, vertexShader: depthShader.vertexShader, uniforms: depthUniforms } );
26 _depthMaterialMorph = new THREE.ShaderMaterial( { fragmentShader: depthShader.fragmentShader, vertexShader: depthShader.vertexShader, uniforms: depthUniforms, morphTargets: true } );
27 _depthMaterialSkin = new THREE.ShaderMaterial( { fragmentShader: depthShader.fragmentShader, vertexShader: depthShader.vertexShader, uniforms: depthUniforms, skinning: true } );
28 _depthMaterialMorphSkin = new THREE.ShaderMaterial( { fragmentShader: depthShader.fragmentShader, vertexShader: depthShader.vertexShader, uniforms: depthUniforms, morphTargets: true, skinning: true } );
29
30 _depthMaterial._shadowPass = true;
31 _depthMaterialMorph._shadowPass = true;
32 _depthMaterialSkin._shadowPass = true;
33 _depthMaterialMorphSkin._shadowPass = true;
34
35 };
36
37 this.render = function ( scene, camera ) {
38
39 if ( ! this.enabled ) return;
40
41 this.update( scene, camera );
42
43 };
44
45 this.update = function ( scene, camera ) {
46
47 var i, il, j, jl, n,
48
49 program, buffer, material,
50 webglObject, object, light,
51 renderList,
52
53 fog = null;
54
55 // set GL state for depth map
56
57 _gl.clearColor( 1, 1, 1, 1 );
58 _gl.disable( _gl.BLEND );
59
60 _renderer.setDepthTest( true );
61
62 // update scene
63
64 if ( scene.autoUpdate === true ) scene.updateMatrixWorld();
65
66 // update camera matrices and frustum
67
68 camera.matrixWorldInverse.getInverse( camera.matrixWorld );
69
70 _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
71 _frustum.setFromMatrix( _projScreenMatrix );
72
73 // render depth map
74
75 _renderer.setRenderTarget( this.renderTarget );
76 _renderer.clear();
77
78 // set object matrices & frustum culling
79
80 renderList = scene.__webglObjects;
81
82 for ( j = 0, jl = renderList.length; j < jl; j ++ ) {
83
84 webglObject = renderList[ j ];
85 object = webglObject.object;
86
87 webglObject.render = false;
88
89 if ( object.visible ) {
90
91 if ( ! ( object instanceof THREE.Mesh || object instanceof THREE.ParticleSystem ) || ! ( object.frustumCulled ) || _frustum.intersectsObject( object ) ) {
92
93 object._modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );
94
95 webglObject.render = true;
96
97 }
98
99 }
100
101 }
102
103 // render regular objects
104
105 var objectMaterial, useMorphing, useSkinning;
106
107 for ( j = 0, jl = renderList.length; j < jl; j ++ ) {
108
109 webglObject = renderList[ j ];
110
111 if ( webglObject.render ) {
112
113 object = webglObject.object;
114 buffer = webglObject.buffer;
115
116 // todo: create proper depth material for particles
117
118 if ( object instanceof THREE.ParticleSystem && !object.customDepthMaterial ) continue;
119
120 objectMaterial = getObjectMaterial( object );
121
122 if ( objectMaterial ) _renderer.setMaterialFaces( object.material );
123
124 useMorphing = object.geometry.morphTargets.length > 0 && objectMaterial.morphTargets;
125 useSkinning = object instanceof THREE.SkinnedMesh && objectMaterial.skinning;
126
127 if ( object.customDepthMaterial ) {
128
129 material = object.customDepthMaterial;
130
131 } else if ( useSkinning ) {
132
133 material = useMorphing ? _depthMaterialMorphSkin : _depthMaterialSkin;
134
135 } else if ( useMorphing ) {
136
137 material = _depthMaterialMorph;
138
139 } else {
140
141 material = _depthMaterial;
142
143 }
144
145 if ( buffer instanceof THREE.BufferGeometry ) {
146
147 _renderer.renderBufferDirect( camera, scene.__lights, fog, material, buffer, object );
148
149 } else {
150
151 _renderer.renderBuffer( camera, scene.__lights, fog, material, buffer, object );
152
153 }
154
155 }
156
157 }
158
159 // set matrices and render immediate objects
160
161 renderList = scene.__webglObjectsImmediate;
162
163 for ( j = 0, jl = renderList.length; j < jl; j ++ ) {
164
165 webglObject = renderList[ j ];
166 object = webglObject.object;
167
168 if ( object.visible ) {
169
170 object._modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );
171
172 _renderer.renderImmediateObject( camera, scene.__lights, fog, _depthMaterial, object );
173
174 }
175
176 }
177
178 // restore GL state
179
180 var clearColor = _renderer.getClearColor(),
181 clearAlpha = _renderer.getClearAlpha();
182
183 _gl.clearColor( clearColor.r, clearColor.g, clearColor.b, clearAlpha );
184 _gl.enable( _gl.BLEND );
185
186 };
187
188 // For the moment just ignore objects that have multiple materials with different animation methods
189 // Only the first material will be taken into account for deciding which depth material to use
190
191 function getObjectMaterial( object ) {
192
193 return object.material instanceof THREE.MeshFaceMaterial
194 ? object.material.materials[ 0 ]
195 : object.material;
196
197 };
198
199};
200
Note: See TracBrowser for help on using the repository browser.