|
185 | 185 |
|
186 | 186 | } ); |
187 | 187 |
|
188 | | - var REVISION = '98dev'; |
| 188 | + var REVISION = '98'; |
189 | 189 | var MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 }; |
190 | 190 | var CullFaceNone = 0; |
191 | 191 | var CullFaceBack = 1; |
|
6166 | 6166 |
|
6167 | 6167 | var background_frag = "uniform sampler2D t2D;\nvarying vec2 vUv;\nvoid main() {\n\tgl_FragColor = texture2D( t2D, vUv );\n}\n"; |
6168 | 6168 |
|
6169 | | - var background_vert = "varying vec2 vUv;\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4( position, 1.0 );\n\tgl_Position.z = 1.0;\n}\n"; |
| 6169 | + var background_vert = "varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position, 1.0 );\n\tgl_Position.z = 1.0;\n}\n"; |
6170 | 6170 |
|
6171 | 6171 | var cube_frag = "uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldDirection;\nvoid main() {\n\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\n\tgl_FragColor.a *= opacity;\n}\n"; |
6172 | 6172 |
|
|
7400 | 7400 | background: { |
7401 | 7401 |
|
7402 | 7402 | uniforms: { |
| 7403 | + uvTransform: { value: new Matrix3() }, |
7403 | 7404 | t2D: { value: null }, |
7404 | 7405 | }, |
7405 | 7406 |
|
|
14624 | 14625 | boxMesh = new Mesh( |
14625 | 14626 | new BoxBufferGeometry( 1, 1, 1 ), |
14626 | 14627 | new ShaderMaterial( { |
| 14628 | + type: 'BackgroundCubeMaterial', |
14627 | 14629 | uniforms: UniformsUtils.clone( ShaderLib.cube.uniforms ), |
14628 | 14630 | vertexShader: ShaderLib.cube.vertexShader, |
14629 | 14631 | fragmentShader: ShaderLib.cube.fragmentShader, |
|
14660 | 14662 | planeMesh = new Mesh( |
14661 | 14663 | new PlaneBufferGeometry( 2, 2 ), |
14662 | 14664 | new ShaderMaterial( { |
| 14665 | + type: 'BackgroundMaterial', |
14663 | 14666 | uniforms: UniformsUtils.clone( ShaderLib.background.uniforms ), |
14664 | 14667 | vertexShader: ShaderLib.background.vertexShader, |
14665 | 14668 | fragmentShader: ShaderLib.background.fragmentShader, |
|
14678 | 14681 |
|
14679 | 14682 | planeMesh.material.uniforms.t2D.value = background; |
14680 | 14683 |
|
| 14684 | + if ( background.matrixAutoUpdate === true ) { |
| 14685 | + |
| 14686 | + background.updateMatrix(); |
| 14687 | + |
| 14688 | + } |
| 14689 | + |
| 14690 | + planeMesh.material.uniforms.uvTransform.value.copy( background.matrix ); |
| 14691 | + |
14681 | 14692 | // push to the pre-sorted opaque render list |
14682 | 14693 | renderList.push( planeMesh, planeMesh.geometry, planeMesh.material, 0, null ); |
14683 | 14694 |
|
|
38861 | 38872 |
|
38862 | 38873 | parseMaterials: function ( json, textures ) { |
38863 | 38874 |
|
| 38875 | + var cache = {}; // MultiMaterial |
38864 | 38876 | var materials = {}; |
38865 | 38877 |
|
38866 | 38878 | if ( json !== undefined ) { |
|
38880 | 38892 |
|
38881 | 38893 | for ( var j = 0; j < data.materials.length; j ++ ) { |
38882 | 38894 |
|
38883 | | - array.push( loader.parse( data.materials[ j ] ) ); |
| 38895 | + var material = data.materials[ j ]; |
| 38896 | + |
| 38897 | + if ( cache[ material.uuid ] === undefined ) { |
| 38898 | + |
| 38899 | + cache[ material.uuid ] = loader.parse( material ); |
| 38900 | + |
| 38901 | + } |
| 38902 | + |
| 38903 | + array.push( cache[ material.uuid ] ); |
38884 | 38904 |
|
38885 | 38905 | } |
38886 | 38906 |
|
|
38889 | 38909 | } else { |
38890 | 38910 |
|
38891 | 38911 | materials[ data.uuid ] = loader.parse( data ); |
| 38912 | + cache[ data.uuid ] = materials[ data.uuid ]; |
38892 | 38913 |
|
38893 | 38914 | } |
38894 | 38915 |
|
|
0 commit comments