UNPKG

cione-comp-lib

Version:

`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`

119 lines (118 loc) 3.94 kB
import { Filter, Wrap } from "../../three-components/gltf-instance/gltf-2.0.mjs"; import { ThreeDOMElement, $correlatedObjects, $sourceObject, $onUpdate } from "./three-dom-element.mjs"; /* @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. */ 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"); 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 : {}; 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](); } } } export { Sampler };