UNPKG

@google/model-viewer

Version:

Easily display interactive 3D models on the web and in AR!

128 lines 4.76 kB
/* @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the 'License'); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an 'AS IS' BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import { Filter, Wrap } from '../../three-components/gltf-instance/gltf-2.0.js'; import { $correlatedObjects, $onUpdate, $sourceObject, ThreeDOMElement } from './three-dom-element.js'; const isMinFilter = (() => { const minFilterValues = [ Filter.Nearest, Filter.Linear, Filter.NearestMipmapNearest, Filter.LinearMipmapLinear, Filter.NearestMipmapLinear, Filter.LinearMipmapLinear ]; return (value) => minFilterValues.indexOf(value) > -1; })(); const isMagFilter = (() => { const magFilterValues = [Filter.Nearest, Filter.Linear]; return (value) => magFilterValues.indexOf(value) > -1; })(); const isWrapMode = (() => { const wrapModes = [Wrap.ClampToEdge, Wrap.MirroredRepeat, Wrap.Repeat]; return (value) => wrapModes.indexOf(value) > -1; })(); const isValidSamplerValue = (property, value) => { switch (property) { case 'minFilter': return isMinFilter(value); case 'magFilter': return isMagFilter(value); case 'wrapS': case 'wrapT': return isWrapMode(value); default: throw new Error(`Cannot configure property "${property}" on Sampler`); } }; const $threeTextures = Symbol('threeTextures'); const $setProperty = Symbol('setProperty'); const $sourceSampler = Symbol('sourceSampler'); /** * Sampler facade implementation for Three.js textures */ export class Sampler extends ThreeDOMElement { get [$threeTextures]() { console.assert(this[$correlatedObjects] != null && this[$correlatedObjects].size > 0, 'Sampler correlated object is undefined'); return this[$correlatedObjects]; } get [$sourceSampler]() { console.assert(this[$sourceObject] != null, 'Sampler source is undefined'); return this[$sourceObject]; } constructor(onUpdate, texture, gltfSampler) { gltfSampler = gltfSampler !== null && gltfSampler !== void 0 ? gltfSampler : {}; // These defaults represent a convergence of glTF defaults for wrap mode and // Three.js defaults for filters. Per glTF 2.0 spec, a renderer may choose // its own defaults for filters. // @see https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#reference-sampler // @see https://threejs.org/docs/#api/en/textures/Texture if (gltfSampler.minFilter == null) { gltfSampler.minFilter = texture ? texture.minFilter : Filter.LinearMipmapLinear; } if (gltfSampler.magFilter == null) { gltfSampler.magFilter = texture ? texture.magFilter : Filter.Linear; } if (gltfSampler.wrapS == null) { gltfSampler.wrapS = texture ? texture.wrapS : Wrap.Repeat; } if (gltfSampler.wrapT == null) { gltfSampler.wrapT = texture ? texture.wrapT : Wrap.Repeat; } super(onUpdate, gltfSampler, new Set(texture ? [texture] : [])); } get name() { return this[$sourceObject].name || ''; } get minFilter() { return this[$sourceSampler].minFilter; } get magFilter() { return this[$sourceSampler].magFilter; } get wrapS() { return this[$sourceSampler].wrapS; } get wrapT() { return this[$sourceSampler].wrapT; } setMinFilter(filter) { this[$setProperty]('minFilter', filter); } setMagFilter(filter) { this[$setProperty]('magFilter', filter); } setWrapS(mode) { this[$setProperty]('wrapS', mode); } setWrapT(mode) { this[$setProperty]('wrapT', mode); } [$setProperty](property, value) { const sampler = this[$sourceSampler]; if (sampler != null) { if (isValidSamplerValue(property, value)) { sampler[property] = value; for (const texture of this[$threeTextures]) { texture[property] = value; texture.needsUpdate = true; } } this[$onUpdate](); } } } //# sourceMappingURL=sampler.js.map