UNPKG

three

Version:

JavaScript 3D library

143 lines (101 loc) 3.33 kB
import { Vector2 } from '../math/Vector2.js'; import { MeshStandardMaterial } from './MeshStandardMaterial.js'; import { Color } from '../math/Color.js'; import * as MathUtils from '../math/MathUtils.js'; /** * parameters = { * clearcoat: <float>, * clearcoatMap: new THREE.Texture( <Image> ), * clearcoatRoughness: <float>, * clearcoatRoughnessMap: new THREE.Texture( <Image> ), * clearcoatNormalScale: <Vector2>, * clearcoatNormalMap: new THREE.Texture( <Image> ), * * reflectivity: <float>, * ior: <float>, * * sheen: <Color>, * * transmission: <float>, * transmissionMap: new THREE.Texture( <Image> ), * * thickness: <float>, * thicknessMap: new THREE.Texture( <Image> ), * attenuationDistance: <float>, * attenuationTint: <Color>, * * specularIntensity: <float>, * specularIntensityhMap: new THREE.Texture( <Image> ), * specularTint: <Color>, * specularTintMap: new THREE.Texture( <Image> ) * } */ class MeshPhysicalMaterial extends MeshStandardMaterial { constructor( parameters ) { super(); this.defines = { 'STANDARD': '', 'PHYSICAL': '' }; this.type = 'MeshPhysicalMaterial'; this.clearcoat = 0.0; this.clearcoatMap = null; this.clearcoatRoughness = 0.0; this.clearcoatRoughnessMap = null; this.clearcoatNormalScale = new Vector2( 1, 1 ); this.clearcoatNormalMap = null; this.reflectivity = 0.5; // maps to F0 = 0.04 Object.defineProperty( this, 'ior', { get: function () { return ( 1 + 0.4 * this.reflectivity ) / ( 1 - 0.4 * this.reflectivity ); }, set: function ( ior ) { this.reflectivity = MathUtils.clamp( 2.5 * ( ior - 1 ) / ( ior + 1 ), 0, 1 ); } } ); this.sheen = null; // null will disable sheen bsdf this.transmission = 0.0; this.transmissionMap = null; this.thickness = 0.01; this.thicknessMap = null; this.attenuationDistance = 0.0; this.attenuationTint = new Color( 1, 1, 1 ); this.specularIntensity = 1.0; this.specularIntensityMap = null; this.specularTint = new Color( 1, 1, 1 ); this.specularTintMap = null; this.setValues( parameters ); } copy( source ) { super.copy( source ); this.defines = { 'STANDARD': '', 'PHYSICAL': '' }; this.clearcoat = source.clearcoat; this.clearcoatMap = source.clearcoatMap; this.clearcoatRoughness = source.clearcoatRoughness; this.clearcoatRoughnessMap = source.clearcoatRoughnessMap; this.clearcoatNormalMap = source.clearcoatNormalMap; this.clearcoatNormalScale.copy( source.clearcoatNormalScale ); this.reflectivity = source.reflectivity; if ( source.sheen ) { this.sheen = ( this.sheen || new Color() ).copy( source.sheen ); } else { this.sheen = null; } this.transmission = source.transmission; this.transmissionMap = source.transmissionMap; this.thickness = source.thickness; this.thicknessMap = source.thicknessMap; this.attenuationDistance = source.attenuationDistance; this.attenuationTint.copy( source.attenuationTint ); this.specularIntensity = source.specularIntensity; this.specularIntensityMap = source.specularIntensityMap; this.specularTint.copy( source.specularTint ); this.specularTintMap = source.specularTintMap; return this; } } MeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true; export { MeshPhysicalMaterial };