Files
pronature-platform/src/components/InteractiveObjects/ImageObject/ImageObject.js
T
2026-04-10 11:06:59 +03:00

54 lines
2.0 KiB
JavaScript

import { EventManager } from "@/lib/EventManager";
import { MeshStandardMaterial, MeshBasicMaterial, PlaneGeometry, Mesh, DoubleSide, Vector3 } from "three";
class ImageObject extends EventManager{
emits = ['finish', 'interaction']
constructor(engine, obj) {
super();
return new Promise(async(resolve, reject)=>{
if (obj.$go){
obj.path = engine.assetPath;
obj.value = obj.$go.asset.name;
}
let t = await engine.loadTexture(obj.value, obj.path);
let k = t.image.width / t.image.height;
let mp = {
map: t,
alphaTest: 0.5,
side: DoubleSide
};
if (obj.nm) {
mp.normalMap = engine.loadTexture(obj.nm, obj.path);
}
if (obj.em) {
mp.emissiveMap = engine.loadTexture(obj.em, obj.path);
}
if (obj.am) {
mp.alphaMap = engine.loadTexture(obj.am, obj.path);
}
obj.material && Object.assign(mp, obj.material);
let geo = new PlaneGeometry(obj.width || k, 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.description) {
engine.clickable.add(this.object, ()=>{
this.dispatchEvent({type:'interaction'})
engine.dashboard.updateText(obj.description, {
hideOnFinish: true,
textScrolledCallback: ()=>{ this.dispatchEvent({type:'finish'}); }
})
})
}
resolve(this)
})
}
}
export {ImageObject}