cione-comp-lib
Version:
`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`
131 lines (130 loc) • 5.13 kB
JavaScript
import { Vector2, sRGBEncoding, LinearEncoding } from "../../../../../_three@0.150.1@three/build/three.module.mjs";
import { $threeTexture } from "./image.mjs";
import { Texture } from "./texture.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.
*/
var _a, _b, _c;
const $texture = Symbol("texture");
const $transform = Symbol("transform");
const $materials = Symbol("materials");
const $usage = Symbol("usage");
const $onUpdate = Symbol("onUpdate");
const $activeVideo = Symbol("activeVideo");
var TextureUsage;
(function(TextureUsage2) {
TextureUsage2[TextureUsage2["Base"] = 0] = "Base";
TextureUsage2[TextureUsage2["MetallicRoughness"] = 1] = "MetallicRoughness";
TextureUsage2[TextureUsage2["Normal"] = 2] = "Normal";
TextureUsage2[TextureUsage2["Occlusion"] = 3] = "Occlusion";
TextureUsage2[TextureUsage2["Emissive"] = 4] = "Emissive";
})(TextureUsage || (TextureUsage = {}));
class TextureInfo {
constructor(onUpdate, usage, threeTexture, material, gltf, gltfTextureInfo) {
this[_a] = null;
this[_b] = {
rotation: 0,
scale: new Vector2(1, 1),
offset: new Vector2(0, 0)
};
this[_c] = false;
if (gltfTextureInfo && threeTexture) {
const gltfTexture = gltf.textures ? gltf.textures[gltfTextureInfo.index] : null;
const sampler = gltfTexture ? gltf.samplers ? gltf.samplers[gltfTexture.sampler] : null : null;
const image = gltfTexture ? gltf.images ? gltf.images[gltfTexture.source] : null : null;
this[$transform].rotation = threeTexture.rotation;
this[$transform].scale.copy(threeTexture.repeat);
this[$transform].offset.copy(threeTexture.offset);
this[$texture] = new Texture(onUpdate, threeTexture, gltfTexture, sampler, image);
}
this[$onUpdate] = onUpdate;
this[$materials] = material;
this[$usage] = usage;
}
get texture() {
return this[$texture];
}
setTexture(texture) {
var _d, _e;
const threeTexture = texture != null ? texture.source[$threeTexture] : null;
const oldTexture = (_d = this[$texture]) === null || _d === void 0 ? void 0 : _d.source[$threeTexture];
if (oldTexture != null && oldTexture.isVideoTexture) {
this[$activeVideo] = false;
} else if ((_e = this[$texture]) === null || _e === void 0 ? void 0 : _e.source.animation) {
this[$texture].source.animation.removeEventListener("enterFrame", this[$onUpdate]);
}
this[$texture] = texture;
if (threeTexture != null && threeTexture.isVideoTexture) {
const element = threeTexture.image;
this[$activeVideo] = true;
if (element.requestVideoFrameCallback != null) {
const update = () => {
if (!this[$activeVideo]) {
return;
}
this[$onUpdate]();
element.requestVideoFrameCallback(update);
};
element.requestVideoFrameCallback(update);
} else {
const update = () => {
if (!this[$activeVideo]) {
return;
}
this[$onUpdate]();
requestAnimationFrame(update);
};
requestAnimationFrame(update);
}
} else if ((texture === null || texture === void 0 ? void 0 : texture.source.animation) != null) {
texture.source.animation.addEventListener("enterFrame", this[$onUpdate]);
}
let encoding = sRGBEncoding;
if (this[$materials]) {
for (const material of this[$materials]) {
switch (this[$usage]) {
case TextureUsage.Base:
material.map = threeTexture;
break;
case TextureUsage.MetallicRoughness:
encoding = LinearEncoding;
material.metalnessMap = threeTexture;
material.roughnessMap = threeTexture;
break;
case TextureUsage.Normal:
encoding = LinearEncoding;
material.normalMap = threeTexture;
break;
case TextureUsage.Occlusion:
encoding = LinearEncoding;
material.aoMap = threeTexture;
break;
case TextureUsage.Emissive:
material.emissiveMap = threeTexture;
break;
}
material.needsUpdate = true;
}
}
if (threeTexture) {
threeTexture.encoding = encoding;
threeTexture.rotation = this[$transform].rotation;
threeTexture.repeat = this[$transform].scale;
threeTexture.offset = this[$transform].offset;
}
this[$onUpdate]();
}
}
_a = $texture, _b = $transform, _c = $activeVideo;
export { $materials, $usage, TextureInfo, TextureUsage };