123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775 |
- import { BackSide } from '../../constants.js';
- function WebGLMaterials( properties ) {
- function refreshFogUniforms( uniforms, fog ) {
- uniforms.fogColor.value.copy( fog.color );
- if ( fog.isFog ) {
- uniforms.fogNear.value = fog.near;
- uniforms.fogFar.value = fog.far;
- } else if ( fog.isFogExp2 ) {
- uniforms.fogDensity.value = fog.density;
- }
- }
- function refreshMaterialUniforms( uniforms, material, pixelRatio, height, transmissionRenderTarget ) {
- if ( material.isMeshBasicMaterial ) {
- refreshUniformsCommon( uniforms, material );
- } else if ( material.isMeshLambertMaterial ) {
- refreshUniformsCommon( uniforms, material );
- refreshUniformsLambert( uniforms, material );
- } else if ( material.isMeshToonMaterial ) {
- refreshUniformsCommon( uniforms, material );
- refreshUniformsToon( uniforms, material );
- } else if ( material.isMeshPhongMaterial ) {
- refreshUniformsCommon( uniforms, material );
- refreshUniformsPhong( uniforms, material );
- } else if ( material.isMeshStandardMaterial ) {
- refreshUniformsCommon( uniforms, material );
- if ( material.isMeshPhysicalMaterial ) {
- refreshUniformsPhysical( uniforms, material, transmissionRenderTarget );
- } else {
- refreshUniformsStandard( uniforms, material );
- }
- } else if ( material.isMeshMatcapMaterial ) {
- refreshUniformsCommon( uniforms, material );
- refreshUniformsMatcap( uniforms, material );
- } else if ( material.isMeshDepthMaterial ) {
- refreshUniformsCommon( uniforms, material );
- refreshUniformsDepth( uniforms, material );
- } else if ( material.isMeshDistanceMaterial ) {
- refreshUniformsCommon( uniforms, material );
- refreshUniformsDistance( uniforms, material );
- } else if ( material.isMeshNormalMaterial ) {
- refreshUniformsCommon( uniforms, material );
- refreshUniformsNormal( uniforms, material );
- } else if ( material.isLineBasicMaterial ) {
- refreshUniformsLine( uniforms, material );
- if ( material.isLineDashedMaterial ) {
- refreshUniformsDash( uniforms, material );
- }
- } else if ( material.isPointsMaterial ) {
- refreshUniformsPoints( uniforms, material, pixelRatio, height );
- } else if ( material.isSpriteMaterial ) {
- refreshUniformsSprites( uniforms, material );
- } else if ( material.isShadowMaterial ) {
- uniforms.color.value.copy( material.color );
- uniforms.opacity.value = material.opacity;
- } else if ( material.isShaderMaterial ) {
- material.uniformsNeedUpdate = false; // #15581
- }
- }
- function refreshUniformsCommon( uniforms, material ) {
- uniforms.opacity.value = material.opacity;
- if ( material.color ) {
- uniforms.diffuse.value.copy( material.color );
- }
- if ( material.emissive ) {
- uniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );
- }
- if ( material.map ) {
- uniforms.map.value = material.map;
- }
- if ( material.alphaMap ) {
- uniforms.alphaMap.value = material.alphaMap;
- }
- if ( material.specularMap ) {
- uniforms.specularMap.value = material.specularMap;
- }
- if ( material.alphaTest > 0 ) {
- uniforms.alphaTest.value = material.alphaTest;
- }
- const envMap = properties.get( material ).envMap;
- if ( envMap ) {
- uniforms.envMap.value = envMap;
- uniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? - 1 : 1;
- uniforms.reflectivity.value = material.reflectivity;
- uniforms.ior.value = material.ior;
- uniforms.refractionRatio.value = material.refractionRatio;
- const maxMipLevel = properties.get( envMap ).__maxMipLevel;
- if ( maxMipLevel !== undefined ) {
- uniforms.maxMipLevel.value = maxMipLevel;
- }
- }
- if ( material.lightMap ) {
- uniforms.lightMap.value = material.lightMap;
- uniforms.lightMapIntensity.value = material.lightMapIntensity;
- }
- if ( material.aoMap ) {
- uniforms.aoMap.value = material.aoMap;
- uniforms.aoMapIntensity.value = material.aoMapIntensity;
- }
- // uv repeat and offset setting priorities
- // 1. color map
- // 2. specular map
- // 3. displacementMap map
- // 4. normal map
- // 5. bump map
- // 6. roughnessMap map
- // 7. metalnessMap map
- // 8. alphaMap map
- // 9. emissiveMap map
- // 10. clearcoat map
- // 11. clearcoat normal map
- // 12. clearcoat roughnessMap map
- // 13. specular intensity map
- // 14. specular tint map
- // 15. transmission map
- // 16. thickness map
- let uvScaleMap;
- if ( material.map ) {
- uvScaleMap = material.map;
- } else if ( material.specularMap ) {
- uvScaleMap = material.specularMap;
- } else if ( material.displacementMap ) {
- uvScaleMap = material.displacementMap;
- } else if ( material.normalMap ) {
- uvScaleMap = material.normalMap;
- } else if ( material.bumpMap ) {
- uvScaleMap = material.bumpMap;
- } else if ( material.roughnessMap ) {
- uvScaleMap = material.roughnessMap;
- } else if ( material.metalnessMap ) {
- uvScaleMap = material.metalnessMap;
- } else if ( material.alphaMap ) {
- uvScaleMap = material.alphaMap;
- } else if ( material.emissiveMap ) {
- uvScaleMap = material.emissiveMap;
- } else if ( material.clearcoatMap ) {
- uvScaleMap = material.clearcoatMap;
- } else if ( material.clearcoatNormalMap ) {
- uvScaleMap = material.clearcoatNormalMap;
- } else if ( material.clearcoatRoughnessMap ) {
- uvScaleMap = material.clearcoatRoughnessMap;
- } else if ( material.specularIntensityMap ) {
- uvScaleMap = material.specularIntensityMap;
- } else if ( material.specularTintMap ) {
- uvScaleMap = material.specularTintMap;
- } else if ( material.transmissionMap ) {
- uvScaleMap = material.transmissionMap;
- } else if ( material.thicknessMap ) {
- uvScaleMap = material.thicknessMap;
- }
- if ( uvScaleMap !== undefined ) {
- // backwards compatibility
- if ( uvScaleMap.isWebGLRenderTarget ) {
- uvScaleMap = uvScaleMap.texture;
- }
- if ( uvScaleMap.matrixAutoUpdate === true ) {
- uvScaleMap.updateMatrix();
- }
- uniforms.uvTransform.value.copy( uvScaleMap.matrix );
- }
- // uv repeat and offset setting priorities for uv2
- // 1. ao map
- // 2. light map
- let uv2ScaleMap;
- if ( material.aoMap ) {
- uv2ScaleMap = material.aoMap;
- } else if ( material.lightMap ) {
- uv2ScaleMap = material.lightMap;
- }
- if ( uv2ScaleMap !== undefined ) {
- // backwards compatibility
- if ( uv2ScaleMap.isWebGLRenderTarget ) {
- uv2ScaleMap = uv2ScaleMap.texture;
- }
- if ( uv2ScaleMap.matrixAutoUpdate === true ) {
- uv2ScaleMap.updateMatrix();
- }
- uniforms.uv2Transform.value.copy( uv2ScaleMap.matrix );
- }
- }
- function refreshUniformsLine( uniforms, material ) {
- uniforms.diffuse.value.copy( material.color );
- uniforms.opacity.value = material.opacity;
- }
- function refreshUniformsDash( uniforms, material ) {
- uniforms.dashSize.value = material.dashSize;
- uniforms.totalSize.value = material.dashSize + material.gapSize;
- uniforms.scale.value = material.scale;
- }
- function refreshUniformsPoints( uniforms, material, pixelRatio, height ) {
- uniforms.diffuse.value.copy( material.color );
- uniforms.opacity.value = material.opacity;
- uniforms.size.value = material.size * pixelRatio;
- uniforms.scale.value = height * 0.5;
- if ( material.map ) {
- uniforms.map.value = material.map;
- }
- if ( material.alphaMap ) {
- uniforms.alphaMap.value = material.alphaMap;
- }
- if ( material.alphaTest > 0 ) {
- uniforms.alphaTest.value = material.alphaTest;
- }
- // uv repeat and offset setting priorities
- // 1. color map
- // 2. alpha map
- let uvScaleMap;
- if ( material.map ) {
- uvScaleMap = material.map;
- } else if ( material.alphaMap ) {
- uvScaleMap = material.alphaMap;
- }
- if ( uvScaleMap !== undefined ) {
- if ( uvScaleMap.matrixAutoUpdate === true ) {
- uvScaleMap.updateMatrix();
- }
- uniforms.uvTransform.value.copy( uvScaleMap.matrix );
- }
- }
- function refreshUniformsSprites( uniforms, material ) {
- uniforms.diffuse.value.copy( material.color );
- uniforms.opacity.value = material.opacity;
- uniforms.rotation.value = material.rotation;
- if ( material.map ) {
- uniforms.map.value = material.map;
- }
- if ( material.alphaMap ) {
- uniforms.alphaMap.value = material.alphaMap;
- }
- if ( material.alphaTest > 0 ) {
- uniforms.alphaTest.value = material.alphaTest;
- }
- // uv repeat and offset setting priorities
- // 1. color map
- // 2. alpha map
- let uvScaleMap;
- if ( material.map ) {
- uvScaleMap = material.map;
- } else if ( material.alphaMap ) {
- uvScaleMap = material.alphaMap;
- }
- if ( uvScaleMap !== undefined ) {
- if ( uvScaleMap.matrixAutoUpdate === true ) {
- uvScaleMap.updateMatrix();
- }
- uniforms.uvTransform.value.copy( uvScaleMap.matrix );
- }
- }
- function refreshUniformsLambert( uniforms, material ) {
- if ( material.emissiveMap ) {
- uniforms.emissiveMap.value = material.emissiveMap;
- }
- }
- function refreshUniformsPhong( uniforms, material ) {
- uniforms.specular.value.copy( material.specular );
- uniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )
- if ( material.emissiveMap ) {
- uniforms.emissiveMap.value = material.emissiveMap;
- }
- if ( material.bumpMap ) {
- uniforms.bumpMap.value = material.bumpMap;
- uniforms.bumpScale.value = material.bumpScale;
- if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;
- }
- if ( material.normalMap ) {
- uniforms.normalMap.value = material.normalMap;
- uniforms.normalScale.value.copy( material.normalScale );
- if ( material.side === BackSide ) uniforms.normalScale.value.negate();
- }
- if ( material.displacementMap ) {
- uniforms.displacementMap.value = material.displacementMap;
- uniforms.displacementScale.value = material.displacementScale;
- uniforms.displacementBias.value = material.displacementBias;
- }
- }
- function refreshUniformsToon( uniforms, material ) {
- if ( material.gradientMap ) {
- uniforms.gradientMap.value = material.gradientMap;
- }
- if ( material.emissiveMap ) {
- uniforms.emissiveMap.value = material.emissiveMap;
- }
- if ( material.bumpMap ) {
- uniforms.bumpMap.value = material.bumpMap;
- uniforms.bumpScale.value = material.bumpScale;
- if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;
- }
- if ( material.normalMap ) {
- uniforms.normalMap.value = material.normalMap;
- uniforms.normalScale.value.copy( material.normalScale );
- if ( material.side === BackSide ) uniforms.normalScale.value.negate();
- }
- if ( material.displacementMap ) {
- uniforms.displacementMap.value = material.displacementMap;
- uniforms.displacementScale.value = material.displacementScale;
- uniforms.displacementBias.value = material.displacementBias;
- }
- }
- function refreshUniformsStandard( uniforms, material ) {
- uniforms.roughness.value = material.roughness;
- uniforms.metalness.value = material.metalness;
- if ( material.roughnessMap ) {
- uniforms.roughnessMap.value = material.roughnessMap;
- }
- if ( material.metalnessMap ) {
- uniforms.metalnessMap.value = material.metalnessMap;
- }
- if ( material.emissiveMap ) {
- uniforms.emissiveMap.value = material.emissiveMap;
- }
- if ( material.bumpMap ) {
- uniforms.bumpMap.value = material.bumpMap;
- uniforms.bumpScale.value = material.bumpScale;
- if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;
- }
- if ( material.normalMap ) {
- uniforms.normalMap.value = material.normalMap;
- uniforms.normalScale.value.copy( material.normalScale );
- if ( material.side === BackSide ) uniforms.normalScale.value.negate();
- }
- if ( material.displacementMap ) {
- uniforms.displacementMap.value = material.displacementMap;
- uniforms.displacementScale.value = material.displacementScale;
- uniforms.displacementBias.value = material.displacementBias;
- }
- const envMap = properties.get( material ).envMap;
- if ( envMap ) {
- //uniforms.envMap.value = material.envMap; // part of uniforms common
- uniforms.envMapIntensity.value = material.envMapIntensity;
- }
- }
- function refreshUniformsPhysical( uniforms, material, transmissionRenderTarget ) {
- refreshUniformsStandard( uniforms, material );
- uniforms.ior.value = material.ior; // also part of uniforms common
- if ( material.sheenTint ) uniforms.sheenTint.value.copy( material.sheenTint );
- if ( material.clearcoat > 0 ) {
- uniforms.clearcoat.value = material.clearcoat;
- uniforms.clearcoatRoughness.value = material.clearcoatRoughness;
- if ( material.clearcoatMap ) {
- uniforms.clearcoatMap.value = material.clearcoatMap;
- }
- if ( material.clearcoatRoughnessMap ) {
- uniforms.clearcoatRoughnessMap.value = material.clearcoatRoughnessMap;
- }
- if ( material.clearcoatNormalMap ) {
- uniforms.clearcoatNormalScale.value.copy( material.clearcoatNormalScale );
- uniforms.clearcoatNormalMap.value = material.clearcoatNormalMap;
- if ( material.side === BackSide ) {
- uniforms.clearcoatNormalScale.value.negate();
- }
- }
- }
- uniforms.transmission.value = material.transmission;
- if ( material.transmissionMap ) {
- uniforms.transmissionMap.value = material.transmissionMap;
- }
- if ( material.transmission > 0.0 ) {
- uniforms.transmissionSamplerMap.value = transmissionRenderTarget.texture;
- uniforms.transmissionSamplerSize.value.set( transmissionRenderTarget.width, transmissionRenderTarget.height );
- }
- uniforms.thickness.value = material.thickness;
- if ( material.thicknessMap ) {
- uniforms.thicknessMap.value = material.thicknessMap;
- }
- uniforms.attenuationDistance.value = material.attenuationDistance;
- uniforms.attenuationTint.value.copy( material.attenuationTint );
- uniforms.specularIntensity.value = material.specularIntensity;
- uniforms.specularTint.value.copy( material.specularTint );
- if ( material.specularIntensityMap ) {
- uniforms.specularIntensityMap.value = material.specularIntensityMap;
- }
- if ( material.specularTintMap ) {
- uniforms.specularTintMap.value = material.specularTintMap;
- }
- }
- function refreshUniformsMatcap( uniforms, material ) {
- if ( material.matcap ) {
- uniforms.matcap.value = material.matcap;
- }
- if ( material.bumpMap ) {
- uniforms.bumpMap.value = material.bumpMap;
- uniforms.bumpScale.value = material.bumpScale;
- if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;
- }
- if ( material.normalMap ) {
- uniforms.normalMap.value = material.normalMap;
- uniforms.normalScale.value.copy( material.normalScale );
- if ( material.side === BackSide ) uniforms.normalScale.value.negate();
- }
- if ( material.displacementMap ) {
- uniforms.displacementMap.value = material.displacementMap;
- uniforms.displacementScale.value = material.displacementScale;
- uniforms.displacementBias.value = material.displacementBias;
- }
- }
- function refreshUniformsDepth( uniforms, material ) {
- if ( material.displacementMap ) {
- uniforms.displacementMap.value = material.displacementMap;
- uniforms.displacementScale.value = material.displacementScale;
- uniforms.displacementBias.value = material.displacementBias;
- }
- }
- function refreshUniformsDistance( uniforms, material ) {
- if ( material.displacementMap ) {
- uniforms.displacementMap.value = material.displacementMap;
- uniforms.displacementScale.value = material.displacementScale;
- uniforms.displacementBias.value = material.displacementBias;
- }
- uniforms.referencePosition.value.copy( material.referencePosition );
- uniforms.nearDistance.value = material.nearDistance;
- uniforms.farDistance.value = material.farDistance;
- }
- function refreshUniformsNormal( uniforms, material ) {
- if ( material.bumpMap ) {
- uniforms.bumpMap.value = material.bumpMap;
- uniforms.bumpScale.value = material.bumpScale;
- if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;
- }
- if ( material.normalMap ) {
- uniforms.normalMap.value = material.normalMap;
- uniforms.normalScale.value.copy( material.normalScale );
- if ( material.side === BackSide ) uniforms.normalScale.value.negate();
- }
- if ( material.displacementMap ) {
- uniforms.displacementMap.value = material.displacementMap;
- uniforms.displacementScale.value = material.displacementScale;
- uniforms.displacementBias.value = material.displacementBias;
- }
- }
- return {
- refreshFogUniforms: refreshFogUniforms,
- refreshMaterialUniforms: refreshMaterialUniforms
- };
- }
- export { WebGLMaterials };
|