UNPKG

@openhps/core

Version:

Open Hybrid Positioning System - Core component

327 lines (323 loc) 14.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.WebGLMaterials = WebGLMaterials; var _constants = require("../../constants.js"); var _UniformsUtils = require("../shaders/UniformsUtils.js"); var _Euler = require("../../math/Euler.js"); var _Matrix = require("../../math/Matrix4.js"); const _e1 = /*@__PURE__*/new _Euler.Euler(); const _m1 = /*@__PURE__*/new _Matrix.Matrix4(); function WebGLMaterials(renderer, properties) { function refreshTransformUniform(map, uniform) { if (map.matrixAutoUpdate === true) { map.updateMatrix(); } uniform.value.copy(map.matrix); } function refreshFogUniforms(uniforms, fog) { fog.color.getRGB(uniforms.fogColor.value, (0, _UniformsUtils.getUnlitUniformColorSpace)(renderer)); 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); } 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); refreshUniformsStandard(uniforms, material); if (material.isMeshPhysicalMaterial) { refreshUniformsPhysical(uniforms, material, transmissionRenderTarget); } } else if (material.isMeshMatcapMaterial) { refreshUniformsCommon(uniforms, material); refreshUniformsMatcap(uniforms, material); } else if (material.isMeshDepthMaterial) { refreshUniformsCommon(uniforms, material); } else if (material.isMeshDistanceMaterial) { refreshUniformsCommon(uniforms, material); refreshUniformsDistance(uniforms, material); } else if (material.isMeshNormalMaterial) { refreshUniformsCommon(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; refreshTransformUniform(material.map, uniforms.mapTransform); } if (material.alphaMap) { uniforms.alphaMap.value = material.alphaMap; refreshTransformUniform(material.alphaMap, uniforms.alphaMapTransform); } if (material.bumpMap) { uniforms.bumpMap.value = material.bumpMap; refreshTransformUniform(material.bumpMap, uniforms.bumpMapTransform); uniforms.bumpScale.value = material.bumpScale; if (material.side === _constants.BackSide) { uniforms.bumpScale.value *= -1; } } if (material.normalMap) { uniforms.normalMap.value = material.normalMap; refreshTransformUniform(material.normalMap, uniforms.normalMapTransform); uniforms.normalScale.value.copy(material.normalScale); if (material.side === _constants.BackSide) { uniforms.normalScale.value.negate(); } } if (material.displacementMap) { uniforms.displacementMap.value = material.displacementMap; refreshTransformUniform(material.displacementMap, uniforms.displacementMapTransform); uniforms.displacementScale.value = material.displacementScale; uniforms.displacementBias.value = material.displacementBias; } if (material.emissiveMap) { uniforms.emissiveMap.value = material.emissiveMap; refreshTransformUniform(material.emissiveMap, uniforms.emissiveMapTransform); } if (material.specularMap) { uniforms.specularMap.value = material.specularMap; refreshTransformUniform(material.specularMap, uniforms.specularMapTransform); } if (material.alphaTest > 0) { uniforms.alphaTest.value = material.alphaTest; } const materialProperties = properties.get(material); const envMap = materialProperties.envMap; const envMapRotation = materialProperties.envMapRotation; if (envMap) { uniforms.envMap.value = envMap; _e1.copy(envMapRotation); // accommodate left-handed frame _e1.x *= -1; _e1.y *= -1; _e1.z *= -1; if (envMap.isCubeTexture && envMap.isRenderTargetTexture === false) { // environment maps which are not cube render targets or PMREMs follow a different convention _e1.y *= -1; _e1.z *= -1; } uniforms.envMapRotation.value.setFromMatrix4(_m1.makeRotationFromEuler(_e1)); 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; } if (material.lightMap) { uniforms.lightMap.value = material.lightMap; uniforms.lightMapIntensity.value = material.lightMapIntensity; refreshTransformUniform(material.lightMap, uniforms.lightMapTransform); } if (material.aoMap) { uniforms.aoMap.value = material.aoMap; uniforms.aoMapIntensity.value = material.aoMapIntensity; refreshTransformUniform(material.aoMap, uniforms.aoMapTransform); } } function refreshUniformsLine(uniforms, material) { uniforms.diffuse.value.copy(material.color); uniforms.opacity.value = material.opacity; if (material.map) { uniforms.map.value = material.map; refreshTransformUniform(material.map, uniforms.mapTransform); } } 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; refreshTransformUniform(material.map, uniforms.uvTransform); } if (material.alphaMap) { uniforms.alphaMap.value = material.alphaMap; refreshTransformUniform(material.alphaMap, uniforms.alphaMapTransform); } if (material.alphaTest > 0) { uniforms.alphaTest.value = material.alphaTest; } } 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; refreshTransformUniform(material.map, uniforms.mapTransform); } if (material.alphaMap) { uniforms.alphaMap.value = material.alphaMap; refreshTransformUniform(material.alphaMap, uniforms.alphaMapTransform); } if (material.alphaTest > 0) { uniforms.alphaTest.value = material.alphaTest; } } 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 ) } function refreshUniformsToon(uniforms, material) { if (material.gradientMap) { uniforms.gradientMap.value = material.gradientMap; } } function refreshUniformsStandard(uniforms, material) { uniforms.metalness.value = material.metalness; if (material.metalnessMap) { uniforms.metalnessMap.value = material.metalnessMap; refreshTransformUniform(material.metalnessMap, uniforms.metalnessMapTransform); } uniforms.roughness.value = material.roughness; if (material.roughnessMap) { uniforms.roughnessMap.value = material.roughnessMap; refreshTransformUniform(material.roughnessMap, uniforms.roughnessMapTransform); } if (material.envMap) { //uniforms.envMap.value = material.envMap; // part of uniforms common uniforms.envMapIntensity.value = material.envMapIntensity; } } function refreshUniformsPhysical(uniforms, material, transmissionRenderTarget) { uniforms.ior.value = material.ior; // also part of uniforms common if (material.sheen > 0) { uniforms.sheenColor.value.copy(material.sheenColor).multiplyScalar(material.sheen); uniforms.sheenRoughness.value = material.sheenRoughness; if (material.sheenColorMap) { uniforms.sheenColorMap.value = material.sheenColorMap; refreshTransformUniform(material.sheenColorMap, uniforms.sheenColorMapTransform); } if (material.sheenRoughnessMap) { uniforms.sheenRoughnessMap.value = material.sheenRoughnessMap; refreshTransformUniform(material.sheenRoughnessMap, uniforms.sheenRoughnessMapTransform); } } if (material.clearcoat > 0) { uniforms.clearcoat.value = material.clearcoat; uniforms.clearcoatRoughness.value = material.clearcoatRoughness; if (material.clearcoatMap) { uniforms.clearcoatMap.value = material.clearcoatMap; refreshTransformUniform(material.clearcoatMap, uniforms.clearcoatMapTransform); } if (material.clearcoatRoughnessMap) { uniforms.clearcoatRoughnessMap.value = material.clearcoatRoughnessMap; refreshTransformUniform(material.clearcoatRoughnessMap, uniforms.clearcoatRoughnessMapTransform); } if (material.clearcoatNormalMap) { uniforms.clearcoatNormalMap.value = material.clearcoatNormalMap; refreshTransformUniform(material.clearcoatNormalMap, uniforms.clearcoatNormalMapTransform); uniforms.clearcoatNormalScale.value.copy(material.clearcoatNormalScale); if (material.side === _constants.BackSide) { uniforms.clearcoatNormalScale.value.negate(); } } } if (material.dispersion > 0) { uniforms.dispersion.value = material.dispersion; } if (material.iridescence > 0) { uniforms.iridescence.value = material.iridescence; uniforms.iridescenceIOR.value = material.iridescenceIOR; uniforms.iridescenceThicknessMinimum.value = material.iridescenceThicknessRange[0]; uniforms.iridescenceThicknessMaximum.value = material.iridescenceThicknessRange[1]; if (material.iridescenceMap) { uniforms.iridescenceMap.value = material.iridescenceMap; refreshTransformUniform(material.iridescenceMap, uniforms.iridescenceMapTransform); } if (material.iridescenceThicknessMap) { uniforms.iridescenceThicknessMap.value = material.iridescenceThicknessMap; refreshTransformUniform(material.iridescenceThicknessMap, uniforms.iridescenceThicknessMapTransform); } } if (material.transmission > 0) { uniforms.transmission.value = material.transmission; uniforms.transmissionSamplerMap.value = transmissionRenderTarget.texture; uniforms.transmissionSamplerSize.value.set(transmissionRenderTarget.width, transmissionRenderTarget.height); if (material.transmissionMap) { uniforms.transmissionMap.value = material.transmissionMap; refreshTransformUniform(material.transmissionMap, uniforms.transmissionMapTransform); } uniforms.thickness.value = material.thickness; if (material.thicknessMap) { uniforms.thicknessMap.value = material.thicknessMap; refreshTransformUniform(material.thicknessMap, uniforms.thicknessMapTransform); } uniforms.attenuationDistance.value = material.attenuationDistance; uniforms.attenuationColor.value.copy(material.attenuationColor); } if (material.anisotropy > 0) { uniforms.anisotropyVector.value.set(material.anisotropy * Math.cos(material.anisotropyRotation), material.anisotropy * Math.sin(material.anisotropyRotation)); if (material.anisotropyMap) { uniforms.anisotropyMap.value = material.anisotropyMap; refreshTransformUniform(material.anisotropyMap, uniforms.anisotropyMapTransform); } } uniforms.specularIntensity.value = material.specularIntensity; uniforms.specularColor.value.copy(material.specularColor); if (material.specularColorMap) { uniforms.specularColorMap.value = material.specularColorMap; refreshTransformUniform(material.specularColorMap, uniforms.specularColorMapTransform); } if (material.specularIntensityMap) { uniforms.specularIntensityMap.value = material.specularIntensityMap; refreshTransformUniform(material.specularIntensityMap, uniforms.specularIntensityMapTransform); } } function refreshUniformsMatcap(uniforms, material) { if (material.matcap) { uniforms.matcap.value = material.matcap; } } function refreshUniformsDistance(uniforms, material) { const light = properties.get(material).light; uniforms.referencePosition.value.setFromMatrixPosition(light.matrixWorld); uniforms.nearDistance.value = light.shadow.camera.near; uniforms.farDistance.value = light.shadow.camera.far; } return { refreshFogUniforms: refreshFogUniforms, refreshMaterialUniforms: refreshMaterialUniforms }; }