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: , * clearcoatMap: new THREE.Texture( ), * clearcoatRoughness: , * clearcoatRoughnessMap: new THREE.Texture( ), * clearcoatNormalScale: , * clearcoatNormalMap: new THREE.Texture( ), * * ior: , * reflectivity: , * * sheen: , * sheenColor: , * sheenColorMap: new THREE.Texture( ), * sheenRoughness: , * sheenRoughnessMap: new THREE.Texture( ), * * transmission: , * transmissionMap: new THREE.Texture( ), * * thickness: , * thicknessMap: new THREE.Texture( ), * attenuationDistance: , * attenuationColor: , * * specularIntensity: , * specularIntensityMap: new THREE.Texture( ), * specularColor: , * specularColorMap: new THREE.Texture( ) * } */ class MeshPhysicalMaterial extends MeshStandardMaterial { constructor(parameters) { super(); this.defines = { STANDARD: '', PHYSICAL: '', }; this.type = 'MeshPhysicalMaterial'; this.clearcoatMap = null; this.clearcoatRoughness = 0.0; this.clearcoatRoughnessMap = null; this.clearcoatNormalScale = new Vector2(1, 1); this.clearcoatNormalMap = null; this.ior = 1.5; Object.defineProperty(this, 'reflectivity', { get: function () { return MathUtils.clamp((2.5 * (this.ior - 1)) / (this.ior + 1), 0, 1); }, set: function (reflectivity) { this.ior = (1 + 0.4 * reflectivity) / (1 - 0.4 * reflectivity); }, }); this.sheenColor = new Color(0x000000); this.sheenColorMap = null; this.sheenRoughness = 1.0; this.sheenRoughnessMap = null; this.transmissionMap = null; this.thickness = 0; this.thicknessMap = null; this.attenuationDistance = 0.0; this.attenuationColor = new Color(1, 1, 1); this.specularIntensity = 1.0; this.specularIntensityMap = null; this.specularColor = new Color(1, 1, 1); this.specularColorMap = null; this._sheen = 0.0; this._clearcoat = 0; this._transmission = 0; this.setValues(parameters); } get sheen() { return this._sheen; } set sheen(value) { if (this._sheen > 0 !== value > 0) { this.version++; } this._sheen = value; } get clearcoat() { return this._clearcoat; } set clearcoat(value) { if (this._clearcoat > 0 !== value > 0) { this.version++; } this._clearcoat = value; } get transmission() { return this._transmission; } set transmission(value) { if (this._transmission > 0 !== value > 0) { this.version++; } this._transmission = value; } 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.ior = source.ior; this.sheen = source.sheen; this.sheenColor.copy(source.sheenColor); this.sheenColorMap = source.sheenColorMap; this.sheenRoughness = source.sheenRoughness; this.sheenRoughnessMap = source.sheenRoughnessMap; this.transmission = source.transmission; this.transmissionMap = source.transmissionMap; this.thickness = source.thickness; this.thicknessMap = source.thicknessMap; this.attenuationDistance = source.attenuationDistance; this.attenuationColor.copy(source.attenuationColor); this.specularIntensity = source.specularIntensity; this.specularIntensityMap = source.specularIntensityMap; this.specularColor.copy(source.specularColor); this.specularColorMap = source.specularColorMap; return this; } } MeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true; export { MeshPhysicalMaterial };