Files
pronature-platform/src/components/InteractiveObjects/ImageObject.js
T

54 lines
2.1 KiB
JavaScript

import { TextureLoader, MeshStandardMaterial, MeshBasicMaterial, PlaneGeometry, Mesh, DoubleSide, Vector3 } from "three";
class ImageObject {
constructor(engine, obj) {
return new Promise(async(resolve, reject)=>{
var t = await engine.loadTexture(obj.value, obj.path)
var mp = {
map: t,
alphaTest: 0.5,
side: DoubleSide
};
if (obj.nm) {
mp.normalMap = new TextureLoader().setPath(obj.path).load(obj.nm);
}
if (obj.em) {
mp.emissiveMap = new TextureLoader().setPath(obj.path).load(obj.em);
}
if (obj.am) {
mp.alphaMap = new TextureLoader().setPath(obj.path).load(obj.am);
}
obj.material && Object.assign(mp, obj.material);
let geo = new PlaneGeometry(obj.width || 1, obj.height || 1);
if (obj.uv) {
var uvAttribute = geo.attributes.uv;
for (var i = 0; i < uvAttribute.count; i++) {
uvAttribute.setXY(i, obj.uv[2 * i], obj.uv[2 * i + 1]);
}
}
this.object = new Mesh(geo, mp.metalness ? new MeshStandardMaterial(mp) : new MeshBasicMaterial(mp));
if (obj.distance) {
const o = this.object;
let dstm = obj.distance;
var oldBR = o.onBeforeRender;
o.material.opacity = 0.01;
o.onBeforeRender = function (renderer, scene, camera) {
oldBR && oldBR.apply(this, arguments);
var v = new Vector3();
o.getWorldPosition(v);
var dst = camera.position.distanceTo(v);
if (dst < dstm * 2 && dst > dstm * 1) {
o.material.opacity = dstm * 1 - (dst - dstm * 1);
}
if (dst < .5 * dstm) {
o.material.opacity = dstm * dst * 2;
}
};
}
resolve(this)
})
}
}
export {ImageObject}