diff --git a/examples/js/renderers/Projector.js b/examples/js/renderers/Projector.js index 03eb19e6b3194a820c462bc63177b6fc2bda245f..21f44dd77fb9314b8b9c2c908b75f43c58a21a3f 100644 --- a/examples/js/renderers/Projector.js +++ b/examples/js/renderers/Projector.js @@ -486,8 +486,7 @@ THREE.Projector = function () { var material = object.material; - var isFaceMaterial = material instanceof THREE.MultiMaterial; - var objectMaterials = isFaceMaterial === true ? object.material : null; + var isMultiMaterial = Array.isArray( material ); for ( var v = 0, vl = vertices.length; v < vl; v ++ ) { @@ -525,8 +524,8 @@ THREE.Projector = function () { var face = faces[ f ]; - material = isFaceMaterial === true - ? objectMaterials.materials[ face.materialIndex ] + material = isMultiMaterial === true + ? object.material[ face.materialIndex ] : object.material; if ( material === undefined ) continue; diff --git a/src/Three.Legacy.js b/src/Three.Legacy.js index d0b9bca57f5582b5090d1617cb79d587dc315c3f..49331587ab9ff0db198b02e86c46eaf669e8232c 100644 --- a/src/Three.Legacy.js +++ b/src/Three.Legacy.js @@ -41,7 +41,6 @@ import { TextureLoader } from './loaders/TextureLoader.js'; import { Material } from './materials/Material.js'; import { LineBasicMaterial } from './materials/LineBasicMaterial.js'; import { MeshPhongMaterial } from './materials/MeshPhongMaterial.js'; -import { MultiMaterial } from './materials/MultiMaterial.js'; import { PointsMaterial } from './materials/PointsMaterial.js'; import { ShaderMaterial } from './materials/ShaderMaterial.js'; import { Box2 } from './math/Box2.js'; @@ -81,8 +80,24 @@ export var LinePieces = 1; export function MeshFaceMaterial( materials ) { - console.warn( 'THREE.MeshFaceMaterial has been renamed to THREE.MultiMaterial.' ); - return new MultiMaterial( materials ); + console.warn( 'THREE.MeshFaceMaterial has been removed. Use an Array instead.' ); + return materials; + +} + +export function MultiMaterial( materials ) { + + if ( materials === undefined ) materials = []; + + console.warn( 'THREE.MultiMaterial has been removed. Use an Array instead.' ); + materials.isMultiMaterial = true; + materials.materials = materials; + materials.clone = function () { + + return materials.slice(); + + }; + return materials; } diff --git a/src/materials/Materials.js b/src/materials/Materials.js index cc84dfe0ecb2e3566336ce623423ec63e6ff2d89..3282c2b9ae4bb0e18c1629b34474ca6a74717a03 100644 --- a/src/materials/Materials.js +++ b/src/materials/Materials.js @@ -3,7 +3,6 @@ export { SpriteMaterial } from './SpriteMaterial.js'; export { RawShaderMaterial } from './RawShaderMaterial.js'; export { ShaderMaterial } from './ShaderMaterial.js'; export { PointsMaterial } from './PointsMaterial.js'; -export { MultiMaterial } from './MultiMaterial.js'; export { MeshPhysicalMaterial } from './MeshPhysicalMaterial.js'; export { MeshStandardMaterial } from './MeshStandardMaterial.js'; export { MeshPhongMaterial } from './MeshPhongMaterial.js'; diff --git a/src/materials/MultiMaterial.js b/src/materials/MultiMaterial.js deleted file mode 100644 index 1a89b817200885c84664534d62eefb5eb46ee90c..0000000000000000000000000000000000000000 --- a/src/materials/MultiMaterial.js +++ /dev/null @@ -1,72 +0,0 @@ -import { _Math } from '../math/Math'; - -/** - * @author mrdoob / http://mrdoob.com/ - */ - -function MultiMaterial( materials ) { - - this.uuid = _Math.generateUUID(); - - this.type = 'MultiMaterial'; - - this.materials = Array.isArray( materials ) ? materials : []; - - this.visible = true; - -} - -Object.assign( MultiMaterial.prototype, { - - isMultiMaterial: true, - - toJSON: function ( meta ) { - - var output = { - metadata: { - version: 4.2, - type: 'material', - generator: 'MaterialExporter' - }, - uuid: this.uuid, - type: this.type, - materials: [] - }; - - var materials = this.materials; - - for ( var i = 0, l = materials.length; i < l; i ++ ) { - - var material = materials[ i ].toJSON( meta ); - delete material.metadata; - - output.materials.push( material ); - - } - - output.visible = this.visible; - - return output; - - }, - - clone: function () { - - var material = new this.constructor(); - - for ( var i = 0; i < this.materials.length; i ++ ) { - - material.materials.push( this.materials[ i ].clone() ); - - } - - material.visible = this.visible; - - return material; - - } - -} ); - - -export { MultiMaterial }; diff --git a/src/objects/Mesh.js b/src/objects/Mesh.js index 8e92534096f14d9c85de9e635289b1b7678ac387..ceee71b56eb573b86da43a6ec35be2bb59fa0396 100644 --- a/src/objects/Mesh.js +++ b/src/objects/Mesh.js @@ -259,8 +259,7 @@ Mesh.prototype = Object.assign( Object.create( Object3D.prototype ), { } else if ( geometry.isGeometry ) { var fvA, fvB, fvC; - var isFaceMaterial = ( material && material.isMultiMaterial ); - var materials = isFaceMaterial === true ? material.materials : null; + var isMultiMaterial = Array.isArray( material ); var vertices = geometry.vertices; var faces = geometry.faces; @@ -272,7 +271,7 @@ Mesh.prototype = Object.assign( Object.create( Object3D.prototype ), { for ( var f = 0, fl = faces.length; f < fl; f ++ ) { var face = faces[ f ]; - var faceMaterial = isFaceMaterial === true ? materials[ face.materialIndex ] : material; + var faceMaterial = isMultiMaterial ? material[ face.materialIndex ] : material; if ( faceMaterial === undefined ) continue; diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index 5508291c510e487041f9859869a8f56f54e88288..57722a6b1cb1064450dad363e46052a605f89043 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -1416,56 +1416,36 @@ function WebGLRenderer( parameters ) { if ( object.frustumCulled === false || isObjectViewable( object ) === true ) { - var material = object.material; - - if ( material.visible === true ) { - - if ( _this.sortObjects === true ) { - - _vector3.setFromMatrixPosition( object.matrixWorld ); - _vector3.applyMatrix4( _projScreenMatrix ); - - } - - var geometry = objects.update( object ); - - if ( material.isMultiMaterial ) { - - var groups = geometry.groups; - var materials = material.materials; + if ( _this.sortObjects === true ) { - if ( groups.length > 0 ) { + _vector3.setFromMatrixPosition( object.matrixWorld ); + _vector3.applyMatrix4( _projScreenMatrix ); - // push a render item for each group of the geometry - - for ( var i = 0, l = groups.length; i < l; i ++ ) { - - var group = groups[ i ]; - var groupMaterial = materials[ group.materialIndex ]; - - if ( groupMaterial === undefined ) { + } - console.warn( 'THREE.WebGLRenderer: MultiMaterial has insufficient amount of materials for geometry. %i material(s) expected but only %i provided.', groups.length, materials.length ); + var geometry = objects.update( object ); + var material = object.material; - } else if ( groupMaterial.visible === true ) { + if ( Array.isArray( material ) ) { - pushRenderItem( object, geometry, groupMaterial, _vector3.z, group ); + var groups = geometry.groups; - } + for ( var i = 0, l = groups.length; i < l; i ++ ) { - } + var group = groups[ i ]; + var groupMaterial = material[ group.materialIndex ]; - } else { + if ( groupMaterial && groupMaterial.visible === true ) { - console.warn( 'THREE.WebGLRenderer: MultiMaterial can not be used without groups.' ); + pushRenderItem( object, geometry, groupMaterial, _vector3.z, group ); } - } else { + } - pushRenderItem( object, geometry, material, _vector3.z, null ); + } else if ( material.visible === true ) { - } + pushRenderItem( object, geometry, material, _vector3.z, null ); } diff --git a/src/renderers/webgl/WebGLShadowMap.js b/src/renderers/webgl/WebGLShadowMap.js index a3014d70190938c4bd2fa60864ee4e3f81baa2f2..1e9fac2528f6383d3434dec6084f157bb6726a04 100644 --- a/src/renderers/webgl/WebGLShadowMap.js +++ b/src/renderers/webgl/WebGLShadowMap.js @@ -30,8 +30,6 @@ function WebGLShadowMap( _renderer, _lights, _objects, capabilities ) { _lookTarget = new Vector3(), _lightPositionWorld = new Vector3(), - _renderList = [], - _MorphingFlag = 1, _NumberOfMaterialVariants = ( _MorphingFlag ) + 1, @@ -258,46 +256,7 @@ function WebGLShadowMap( _renderer, _lights, _objects, capabilities ) { // set object matrices & frustum culling - _renderList.length = 0; - - projectObject( scene, camera, shadowCamera ); - - // render shadow map - // render regular objects - - for ( var j = 0, jl = _renderList.length; j < jl; j ++ ) { - - var object = _renderList[ j ]; - var geometry = _objects.update( object ); - var material = object.material; - - if ( material && material.isMultiMaterial ) { - - var groups = geometry.groups; - var materials = material.materials; - - for ( var k = 0, kl = groups.length; k < kl; k ++ ) { - - var group = groups[ k ]; - var groupMaterial = materials[ group.materialIndex ]; - - if ( groupMaterial.visible === true ) { - - var depthMaterial = getDepthMaterial( object, groupMaterial, isPointLight, _lightPositionWorld ); - _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group ); - - } - - } - - } else { - - var depthMaterial = getDepthMaterial( object, material, isPointLight, _lightPositionWorld ); - _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null ); - - } - - } + renderObject( scene, camera, shadowCamera, isPointLight ); } @@ -425,7 +384,7 @@ function WebGLShadowMap( _renderer, _lights, _objects, capabilities ) { } - function projectObject( object, camera, shadowCamera ) { + function renderObject( object, camera, shadowCamera, isPointLight ) { if ( object.visible === false ) return; @@ -435,12 +394,33 @@ function WebGLShadowMap( _renderer, _lights, _objects, capabilities ) { if ( object.castShadow && ( object.frustumCulled === false || _frustum.intersectsObject( object ) === true ) ) { + object.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld ); + + var geometry = _objects.update( object ); var material = object.material; - if ( material.visible === true ) { + if ( Array.isArray( material ) ) { + + var groups = geometry.groups; + + for ( var k = 0, kl = groups.length; k < kl; k ++ ) { + + var group = groups[ k ]; + var groupMaterial = material[ group.materialIndex ]; + + if ( groupMaterial && groupMaterial.visible === true ) { + + var depthMaterial = getDepthMaterial( object, groupMaterial, isPointLight, _lightPositionWorld ); + _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group ); + + } + + } + + } else if ( material.visible === true ) { - object.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld ); - _renderList.push( object ); + var depthMaterial = getDepthMaterial( object, material, isPointLight, _lightPositionWorld ); + _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null ); } @@ -452,7 +432,7 @@ function WebGLShadowMap( _renderer, _lights, _objects, capabilities ) { for ( var i = 0, l = children.length; i < l; i ++ ) { - projectObject( children[ i ], camera, shadowCamera ); + renderObject( children[ i ], camera, shadowCamera ); }